Page MenuHomePhabricator

D11246.id32913.diff
No OneTemporary

D11246.id32913.diff

This file is larger than 256 KB, so syntax highlighting was skipped.
diff --git a/web/cashtab-v2/.dockerignore b/web/cashtab-v2/.dockerignore
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/.dockerignore
@@ -0,0 +1 @@
+node_modules/
\ No newline at end of file
diff --git a/web/cashtab-v2/.env b/web/cashtab-v2/.env
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/.env
@@ -0,0 +1,3 @@
+REACT_APP_NETWORK=mainnet
+REACT_APP_BCHA_APIS=https://rest.kingbch.com/v4/,https://rest.bitcoinabc.org/v4/
+REACT_APP_BCHA_APIS_TEST=https://free-test.fullstack.cash/v3/
diff --git a/web/cashtab-v2/.eslintrc.js b/web/cashtab-v2/.eslintrc.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/.eslintrc.js
@@ -0,0 +1,22 @@
+module.exports = {
+ env: {
+ browser: true,
+ es2021: true,
+ node: true,
+ },
+ extends: [
+ 'eslint:recommended',
+ 'plugin:react/recommended',
+ 'plugin:jest/recommended',
+ ],
+ parserOptions: {
+ ecmaFeatures: {
+ jsx: true,
+ },
+ ecmaVersion: 12,
+ sourceType: 'module',
+ },
+ plugins: ['react', 'jest'],
+ rules: { 'jest/no-mocks-import': 'off' },
+ settings: { react: { version: 'detect' } },
+};
diff --git a/web/cashtab-v2/.gitignore b/web/cashtab-v2/.gitignore
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/.gitignore
@@ -0,0 +1,29 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# production
+/build
+
+# misc
+.DS_Store
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Chrome Extension testing
+*.crx
+*.zip
+*.pem
+dist/
diff --git a/web/cashtab-v2/.nvmrc b/web/cashtab-v2/.nvmrc
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/.nvmrc
@@ -0,0 +1 @@
+15
\ No newline at end of file
diff --git a/web/cashtab-v2/Dockerfile b/web/cashtab-v2/Dockerfile
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/Dockerfile
@@ -0,0 +1,34 @@
+# Multi-stage
+# 1) Node image for building frontend assets
+# 2) nginx stage to serve frontend assets
+
+# Stage 1
+FROM node:15-buster-slim AS builder
+
+# Install some dependencies before building
+RUN apt-get update && \
+ apt-get upgrade -y && \
+ apt-get install -y git && \
+ apt-get install -y python
+
+WORKDIR /app
+
+# Copy only the package files and install necessary dependencies.
+# This reduces cache busting when source files are changed.
+COPY package.json .
+COPY package-lock.json .
+RUN npm ci
+
+# Copy the rest of the project files and build
+COPY . .
+RUN npm run build
+
+# Stage 2
+FROM nginx
+COPY nginx.conf /etc/nginx/conf.d/default.conf
+# Set working directory to nginx asset directory
+# Copy static assets from builder stage
+COPY --from=builder /app/build /usr/share/nginx/html/
+EXPOSE 80
+# Containers run nginx with global directives and daemon off
+ENTRYPOINT ["nginx", "-g", "daemon off;"]
diff --git a/web/cashtab-v2/README.md b/web/cashtab-v2/README.md
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/README.md
@@ -0,0 +1,137 @@
+# Cashtab
+
+## eCash Web Wallet
+
+![CashAppHome](./screenshots/ss-readme.png)
+
+### Features
+
+- Send & Receive XEC
+- Import existing wallets
+
+## Development
+
+```
+npm install
+npm start
+```
+
+Runs the app in the development mode.<br>
+Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
+
+The page will reload if you make edits.<br>
+You will also see any lint errors in the console.
+
+## Testing
+
+### 1. Regression Tests
+
+Existing functions that are impacted by your diff must be regression tested to ensure no unintended behavior. For example, if you're adding a function to facilitate One To Many XEC transactions, you must test that the existing One to One XEC transactions work as intended.
+
+### 2. Unit Tests
+
+Where applicable, add unit tests for new functions created into the corresponding \*.test.js files and they will get picked up as part of the unit test suite.
+
+Run the tests in watch mode (interactive):
+
+```
+npm test
+```
+
+Run the tests and generate a coverage report (non-interactive):
+
+```
+npm run test:coverage
+```
+
+You can then browse the HTML coverage report by opening the
+`coverage/lcov-report/index.html` file in your web browser.
+
+### 3. System/Integration Tests
+
+Once your unit tests have passed successfully, execute the test plan outlined in your diff via manual testing of your new Cashtab feature.
+
+This includes:
+
+- testing across Chrome and Firefox browsers to pick up any browser specific issues
+- testing via the Extension plugin (see Browser Extension below) to pick up on any extension specific issues
+
+### 4. Mobile Tests
+
+Ensure the latest feature functions correctly in a mobile setting and dimension.
+Start by updating the build folder with your changes included.
+
+```
+npm run build
+```
+
+Then create a new site on [Netlify](https://www.netlify.com/) by choosing to "Deploy manually" and dragging in the /web/cashtab/build folder. Your diff will now be accessible via [projectname].netlify.app, which you can load up on your iOS or Android mobile devices for testing.
+
+### 5. Edge Tests
+
+If your diff is complex in nature, then consider potential edge cases which may not get picked up through the testing approaches above.
+
+This includes but is not limited to:
+
+- interactions with fresh new wallets with no transaction history
+- interactions with wallets which have old transactions relevant to the diff
+- interactions with applications outside of Cashtab such as ElectrumABC or outputs generated by custom nodejs scripts.
+
+## Production
+
+In the project directory, run:
+
+```
+npm run build
+```
+
+Builds the app for production to the `build` folder.<br>
+It correctly bundles React in production mode and optimizes the build for the best performance.
+
+The build is minified and the filenames include the hashes.<br>
+Your app is ready to be deployed!
+
+See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
+
+## Browser Extension
+
+1. `npm run extension`
+2. Open Chrome or Brave
+3. Navigate to `chrome://extensions/` (or `brave://extensions/`)
+4. Enable Developer Mode
+5. Click "Load unpacked"
+6. Select the `extension/dist` folder that was created with `npm run extension`
+
+## Docker deployment
+
+```
+npm install
+docker-compose build
+docker-compose up
+```
+
+## Redundant APIs
+
+Cashtab accepts multiple instances of `bch-api` as its backend. Input your desired API URLs separated commas into the `REACT_APP_BCHA_APIS` variable. For example, to run Cashtab with three redundant APIs, use:
+
+```
+REACT_APP_BCHA_APIS=https://rest.kingbch.com/v4/,https://wallet-service-prod.bitframe.org/v4/,https://free-main.fullstack.cash/v4/
+```
+
+You can also run Cashtab with a single API, e.g.
+
+```
+REACT_APP_BCHA_APIS=https://rest.kingbch.com/v4/
+```
+
+Cashtab will start with the first API in your list. If it receives an error from that API, it will try the next one.
+
+Navigate to `localhost:8080` to see the app.
+
+## Cashtab Roadmap
+
+The following features are under active development:
+
+- Transaction history
+- Simple Ledger Postage Protocol Support
+- Cashtab browser extension
diff --git a/web/cashtab-v2/docker-compose.yml b/web/cashtab-v2/docker-compose.yml
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/docker-compose.yml
@@ -0,0 +1,12 @@
+version: '2'
+
+services:
+ webserver:
+ container_name: cashtabwebserver
+ build:
+ context: .
+ dockerfile: Dockerfile
+ ports:
+ - 8080:80
+ environment:
+ - NODE_ENV=production
diff --git a/web/cashtab-v2/extension/README.md b/web/cashtab-v2/extension/README.md
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/extension/README.md
@@ -0,0 +1,9 @@
+# CashTab extension
+
+Some minor but important code changes are required to build CashTab as a browser extension.
+
+1. Add option to open extension in tab
+2. Unique format of manifest.json with sha256 hash of any external scripts
+3. CSS rules for extension pop-up sizing
+
+Source files unique to the browser extension are kept in the `extension/` directory.
diff --git a/web/cashtab-v2/extension/public/manifest.json b/web/cashtab-v2/extension/public/manifest.json
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/extension/public/manifest.json
@@ -0,0 +1,30 @@
+{
+ "manifest_version": 2,
+
+ "name": "Cashtab",
+ "description": "A browser-integrated eCash wallet from Bitcoin ABC",
+ "version": "1.0.6",
+ "content_scripts": [
+ {
+ "matches": ["file://*/*", "http://*/*", "https://*/*"],
+ "js": ["contentscript.js"],
+ "run_at": "document_idle",
+ "all_frames": true
+ }
+ ],
+ "background": {
+ "scripts": ["background.js"],
+ "persistent": false
+ },
+ "browser_action": {
+ "default_popup": "index.html",
+ "default_title": "Cashtab"
+ },
+ "icons": {
+ "16": "ecash16.png",
+ "48": "ecash48.png",
+ "128": "ecash128.png",
+ "192": "ecash192.png",
+ "512": "ecash512.png"
+ }
+}
diff --git a/web/cashtab-v2/extension/src/assets/popout.svg b/web/cashtab-v2/extension/src/assets/popout.svg
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/extension/src/assets/popout.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <!-- Generator: Sketch 48.2 (47327) - http://www.bohemiancoding.com/sketch -->
+ <title>popout</title>
+ <desc>Created with Sketch.</desc>
+ <defs>
+ <polygon id="path-1" points="-0.00035 0 10.9999 0 10.9999 10.9997 -0.00035 10.9997"></polygon>
+ </defs>
+ <g id="MetaMascara-Mobile---structured-TOKEN" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(-327.000000, -96.000000)">
+ <g id="popout" transform="translate(327.000000, 96.000000)">
+ <g id="Group-3" transform="translate(11.000000, 0.000000)">
+ <mask id="mask-2" fill="white">
+ <use xlink:href="#path-1"></use>
+ </mask>
+ <g id="Clip-2"></g>
+ <path d="M10.9229,0.6177 C10.8209,0.3737 10.6269,0.1787 10.3819,0.0767 C10.2599,0.0267 10.1309,-0.0003 9.9999,-0.0003 L3.9999,-0.0003 C3.4479,-0.0003 2.9999,0.4477 2.9999,0.9997 C2.9999,1.5527 3.4479,1.9997 3.9999,1.9997 L7.5859,1.9997 L0.2929,9.2927 C-0.0981,9.6837 -0.0981,10.3167 0.2929,10.7067 C0.4879,10.9027 0.7439,10.9997 0.9999,10.9997 C1.2559,10.9997 1.5119,10.9027 1.7069,10.7067 L8.9999,3.4137 L8.9999,6.9997 C8.9999,7.5527 9.4479,7.9997 9.9999,7.9997 C10.5519,7.9997 10.9999,7.5527 10.9999,6.9997 L10.9999,0.9997 C10.9999,0.8697 10.9739,0.7407 10.9229,0.6177" id="Fill-1" fill="#0074C2" mask="url(#mask-2)"></path>
+ </g>
+ <path d="M19,10 C18.448,10 18,10.448 18,11 L18,19 C18,19.551 17.551,20 17,20 L3,20 C2.449,20 2,19.551 2,19 L2,5 C2,4.449 2.449,4 3,4 L11,4 C11.552,4 12,3.552 12,3 C12,2.448 11.552,2 11,2 L3,2 C1.346,2 0,3.346 0,5 L0,19 C0,20.654 1.346,22 3,22 L17,22 C18.654,22 20,20.654 20,19 L20,11 C20,10.448 19.552,10 19,10" id="Fill-4" fill="#0074C2"></path>
+ </g>
+ </g>
+</svg>
\ No newline at end of file
diff --git a/web/cashtab-v2/extension/src/background.js b/web/cashtab-v2/extension/src/background.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/extension/src/background.js
@@ -0,0 +1,115 @@
+const extension = require('extensionizer');
+
+const NOTIFICATION_HEIGHT = 600;
+const NOTIFICATION_WIDTH = 400;
+
+let popupIsOpen = false;
+let notificationIsOpen = false;
+const openMetamaskTabsIDs = {};
+const requestAccountTabIds = {};
+
+// This starts listening to the port created with `extension.runtime.connect` in contentscript.js
+extension.runtime.onConnect.addListener(function (port) {
+ console.assert(port.name == 'cashtabPort');
+ port.onMessage.addListener(function (msg) {
+ console.log('msg received in background.js');
+ console.log(msg.text);
+ if (msg.text == `CashTab` && msg.txInfo) {
+ console.log(`Caught, opening popup`);
+ triggerUi(msg.txInfo);
+ }
+ });
+});
+
+/**
+ * Opens the browser popup for user confirmation
+ */
+/*
+Breaking this function down
+1) Get all active tabs in browser
+2) Determine if the extension UI is currently open
+3) If extension is not open AND no other UI triggered popups are open, then open one
+
+Eventually will need similar model. Note that it actually goes much deeper than this in MetaMask.
+
+To start, just open a popup
+*/
+async function triggerUi(txInfo) {
+ /*
+ const tabs = await extension.getActiveTabs();
+ const currentlyActiveCashtabTab = Boolean(tabs.find(tab => openMetamaskTabsIDs[tab.id]));
+ if (!popupIsOpen && !currentlyActiveCashtabTab) {
+ await notificationManager.showPopup();
+ }
+ */
+ // Open a pop-up
+ let left = 0;
+ let top = 0;
+ try {
+ const lastFocused = await getLastFocusedWindow();
+ // Position window in top right corner of lastFocused window.
+ top = lastFocused.top;
+ left = lastFocused.left + (lastFocused.width - NOTIFICATION_WIDTH);
+ } catch (_) {
+ // The following properties are more than likely 0, due to being
+ // opened from the background chrome process for the extension that
+ // has no physical dimensions
+ const { screenX, screenY, outerWidth } = window;
+ top = Math.max(screenY, 0);
+ left = Math.max(screenX + (outerWidth - NOTIFICATION_WIDTH), 0);
+ }
+
+ console.log(`txInfo`);
+ console.log(txInfo);
+
+ const queryString = Object.keys(txInfo)
+ .map(key => key + '=' + txInfo[key])
+ .join('&');
+
+ // create new notification popup
+ const popupWindow = await openWindow({
+ url: `index.html#/send?${queryString}`,
+ type: 'popup',
+ width: NOTIFICATION_WIDTH,
+ height: NOTIFICATION_HEIGHT,
+ left,
+ top,
+ });
+}
+
+async function openWindow(options) {
+ return new Promise((resolve, reject) => {
+ extension.windows.create(options, newWindow => {
+ const error = checkForError();
+ if (error) {
+ return reject(error);
+ }
+ return resolve(newWindow);
+ });
+ });
+}
+
+function checkForError() {
+ const { lastError } = extension.runtime;
+ if (!lastError) {
+ return undefined;
+ }
+ // if it quacks like an Error, its an Error
+ if (lastError.stack && lastError.message) {
+ return lastError;
+ }
+ // repair incomplete error object (eg chromium v77)
+ return new Error(lastError.message);
+}
+
+async function getLastFocusedWindow() {
+ return new Promise((resolve, reject) => {
+ extension.windows.getLastFocused(windowObject => {
+ const error = checkForError();
+ if (error) {
+ return reject(error);
+ }
+ return resolve(windowObject);
+ });
+ });
+}
diff --git a/web/cashtab-v2/extension/src/components/App.css b/web/cashtab-v2/extension/src/components/App.css
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/extension/src/components/App.css
@@ -0,0 +1,53 @@
+@import '~antd/dist/antd.less';
+@import '~@fortawesome/fontawesome-free/css/all.css';
+@import url('https://fonts.googleapis.com/css?family=Khula&display=swap&.css');
+
+/* Hide scrollbars but keep functionality*/
+/* Hide scrollbar for Chrome, Safari and Opera */
+body::-webkit-scrollbar {
+ display: none;
+}
+
+/* Hide scrollbar for IE, Edge and Firefox */
+body {
+ -ms-overflow-style: none; /* IE and Edge */
+ scrollbar-width: none; /* Firefox */
+}
+/* Hide up and down arros on input type="number" */
+/* Chrome, Safari, Edge, Opera */
+input::-webkit-outer-spin-button,
+input::-webkit-inner-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+}
+
+/* Hide up and down arros on input type="number" */
+/* Firefox */
+input[type='number'] {
+ -moz-appearance: textfield;
+}
+
+html,
+body {
+ min-width: 400px;
+ min-height: 600px;
+ max-width: 100%;
+ overflow-x: hidden;
+}
+
+/* Hide scroll bars on antd modals*/
+.ant-modal-wrap.ant-modal-centered::-webkit-scrollbar {
+ display: none;
+}
+
+/* ITEMS BELOW TO BE MOVED TO STYLED COMPONENTS*/
+
+/* useWallet.js, useBCH.js */
+@media (max-width: 768px) {
+ .ant-notification {
+ width: 100%;
+ top: 20px !important;
+ max-width: unset;
+ margin-right: 0;
+ }
+}
diff --git a/web/cashtab-v2/extension/src/components/App.js b/web/cashtab-v2/extension/src/components/App.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/extension/src/components/App.js
@@ -0,0 +1,358 @@
+import React, { useState } from 'react';
+import 'antd/dist/antd.less';
+import { Spin } from 'antd';
+import {
+ CashLoadingIcon,
+ HomeIcon,
+ SendIcon,
+ ReceiveIcon,
+ SettingsIcon,
+ AirdropIcon,
+} from '@components/Common/CustomIcons';
+import '../index.css';
+import styled, { ThemeProvider, createGlobalStyle } from 'styled-components';
+import { theme } from '@assets/styles/theme';
+import Home from '@components/Home/Home';
+import Receive from '@components/Receive/Receive';
+import Tokens from '@components/Tokens/Tokens';
+import Send from '@components/Send/Send';
+import SendToken from '@components/Send/SendToken';
+import Airdrop from '@components/Airdrop/Airdrop';
+import Configure from '@components/Configure/Configure';
+import NotFound from '@components/NotFound';
+import CashTab from '@assets/cashtab_xec.png';
+import './App.css';
+import { WalletContext } from '@utils/context';
+import { isValidStoredWallet } from '@utils/cashMethods';
+import {
+ Route,
+ Redirect,
+ Switch,
+ useLocation,
+ useHistory,
+} from 'react-router-dom';
+// Extension-only import used for open in new tab link
+import PopOut from '@assets/popout.svg';
+
+const GlobalStyle = createGlobalStyle`
+ *::placeholder {
+ color: ${props => props.theme.forms.placeholder} !important;
+ }
+ *::selection {
+ background: ${props => props.theme.eCashBlue} !important;
+ }
+ .ant-modal-content, .ant-modal-header, .ant-modal-title {
+ background-color: ${props => props.theme.modal.background} !important;
+ color: ${props => props.theme.modal.color} !important;
+ }
+ .ant-modal-content svg {
+ fill: ${props => props.theme.modal.color};
+ }
+ .ant-modal-footer button {
+ background-color: ${props =>
+ props.theme.modal.buttonBackground} !important;
+ color: ${props => props.theme.modal.color} !important;
+ border-color: ${props => props.theme.modal.border} !important;
+ :hover {
+ background-color: ${props => props.theme.eCashBlue} !important;
+ }
+ }
+ .ant-modal-wrap > div > div.ant-modal-content > div > div > div.ant-modal-confirm-btns > button, .ant-modal > button, .ant-modal-confirm-btns > button, .ant-modal-footer > button, #cropControlsConfirm{
+ border-radius: 3px;
+ border-radius: 3px;
+ background-color: ${props =>
+ props.theme.modal.buttonBackground} !important;
+ color: ${props => props.theme.modal.color} !important;
+ border-color: ${props => props.theme.modal.border} !important;
+ :hover {
+ background-color: ${props => props.theme.eCashBlue} !important;
+ }
+ text-shadow: none !important;
+ text-shadow: none !important;
+ }
+
+ .ant-modal-wrap > div > div.ant-modal-content > div > div > div.ant-modal-confirm-btns > button:hover,.ant-modal-confirm-btns > button:hover, .ant-modal-footer > button:hover, #cropControlsConfirm:hover {
+ color: ${props => props.theme.contrast};
+ transition: all 0.3s;
+ background-color: ${props => props.theme.eCashBlue};
+ border-color: ${props => props.theme.eCashBlue};
+ }
+ .selectedCurrencyOption, .ant-select-dropdown {
+ text-align: left;
+ color: ${props => props.theme.contrast} !important;
+ background-color: ${props =>
+ props.theme.collapses.expandedBackground} !important;
+ }
+ .cashLoadingIcon {
+ color: ${props => props.theme.eCashBlue} !important;
+ font-size: 48px !important;
+ }
+ .selectedCurrencyOption:hover {
+ color: ${props => props.theme.contrast} !important;
+ background-color: ${props => props.theme.eCashBlue} !important;
+ }
+ #addrSwitch, #cropSwitch {
+ .ant-switch-checked {
+ background-color: white !important;
+ }
+ }
+ #addrSwitch.ant-switch-checked, #cropSwitch.ant-switch-checked {
+ background-image: ${props =>
+ props.theme.buttons.primary.backgroundImage} !important;
+ }
+
+ .ant-slider-rail {
+ background-color: ${props => props.theme.forms.border} !important;
+ }
+ .ant-slider-track {
+ background-color: ${props => props.theme.eCashBlue} !important;
+ }
+ .ant-descriptions-bordered .ant-descriptions-row {
+ background: ${props => props.theme.contrast};
+ }
+ .ant-modal-confirm-content, .ant-modal-confirm-title {
+ color: ${props => props.theme.contrast} !important;
+ }
+`;
+
+const CustomApp = styled.div`
+ text-align: center;
+ font-family: 'Gilroy', sans-serif;
+ font-family: 'Poppins', sans-serif;
+ background-color: ${props => props.theme.backgroundColor};
+ background-size: 100px 171px;
+ background-image: ${props => props.theme.backgroundImage};
+ background-attachment: fixed;
+`;
+
+const Footer = styled.div`
+ z-index: 2;
+ height: 80px;
+ border-top: 1px solid rgba(255, 255, 255, 0.5);
+ background-color: ${props => props.theme.footerBackground};
+ position: fixed;
+ bottom: 0;
+ width: 500px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 0 50px;
+ @media (max-width: 768px) {
+ width: 100%;
+ padding: 0 20px;
+ }
+`;
+
+export const NavButton = styled.button`
+ :focus,
+ :active {
+ outline: none;
+ }
+ cursor: pointer;
+ padding: 0;
+ background: none;
+ border: none;
+ font-size: 10px;
+ svg {
+ fill: ${props => props.theme.contrast};
+ width: 26px;
+ height: auto;
+ }
+ ${({ active, ...props }) =>
+ active &&
+ `
+ color: ${props.theme.navActive};
+ svg {
+ fill: ${props.theme.navActive};
+ }
+ `}
+`;
+
+export const WalletBody = styled.div`
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ min-height: 100vh;
+`;
+
+export const WalletCtn = styled.div`
+ position: relative;
+ width: 500px;
+ min-height: 100vh;
+ padding: 0 0 100px;
+ background: ${props => props.theme.walletBackground};
+ -webkit-box-shadow: 0px 0px 24px 1px ${props => props.theme.shadow};
+ -moz-box-shadow: 0px 0px 24px 1px ${props => props.theme.shadow};
+ box-shadow: 0px 0px 24px 1px ${props => props.theme.shadow};
+ @media (max-width: 768px) {
+ width: 100%;
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+ }
+`;
+
+export const HeaderCtn = styled.div`
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ width: 100%;
+ padding: 15px;
+`;
+
+export const CashTabLogo = styled.img`
+ width: 120px;
+ @media (max-width: 768px) {
+ width: 110px;
+ }
+`;
+
+// Extension only styled components
+const OpenInTabBtn = styled.button`
+ background: none;
+ border: none;
+`;
+
+const ExtTabImg = styled.img`
+ max-width: 20px;
+`;
+
+const App = () => {
+ const ContextValue = React.useContext(WalletContext);
+ const { wallet, loading } = ContextValue;
+ const [loadingUtxosAfterSend, setLoadingUtxosAfterSend] = useState(false);
+ // If wallet is unmigrated, do not show page until it has migrated
+ // An invalid wallet will be validated/populated after the next API call, ETA 10s
+ const validWallet = isValidStoredWallet(wallet);
+ const location = useLocation();
+ const history = useHistory();
+ const selectedKey =
+ location && location.pathname ? location.pathname.substr(1) : '';
+ // openInTab is an extension-only method
+ const openInTab = () => {
+ window.open(`index.html#/${selectedKey}`);
+ };
+
+ return (
+ <ThemeProvider theme={theme}>
+ <GlobalStyle />
+ <Spin
+ spinning={
+ loading || loadingUtxosAfterSend || (wallet && !validWallet)
+ }
+ indicator={CashLoadingIcon}
+ >
+ <CustomApp>
+ <WalletBody>
+ <WalletCtn>
+ <HeaderCtn>
+ <CashTabLogo src={CashTab} alt="cashtab" />
+ {/*Begin extension-only components*/}
+ <OpenInTabBtn
+ data-tip="Open in tab"
+ onClick={() => openInTab()}
+ >
+ <ExtTabImg src={PopOut} alt="Open in tab" />
+ </OpenInTabBtn>
+ {/*End extension-only components*/}
+ </HeaderCtn>
+ {/*Note that the extension does not support biometric security*/}
+ {/*Hence <ProtectableComponentWrapper> is not pulled in*/}
+ <Switch>
+ <Route path="/wallet">
+ <Home />
+ </Route>
+ <Route path="/receive">
+ <Receive
+ passLoadingStatus={
+ setLoadingUtxosAfterSend
+ }
+ />
+ </Route>
+ <Route path="/tokens">
+ <Tokens
+ passLoadingStatus={
+ setLoadingUtxosAfterSend
+ }
+ />
+ </Route>
+ <Route path="/send">
+ <Send
+ passLoadingStatus={
+ setLoadingUtxosAfterSend
+ }
+ />
+ </Route>
+ <Route
+ path="/send-token/:tokenId"
+ render={props => (
+ <SendToken
+ tokenId={props.match.params.tokenId}
+ passLoadingStatus={
+ setLoadingUtxosAfterSend
+ }
+ />
+ )}
+ />
+ <Route path="/airdrop">
+ <Airdrop
+ passLoadingStatus={
+ setLoadingUtxosAfterSend
+ }
+ />
+ </Route>
+ <Route path="/configure">
+ <Configure />
+ </Route>
+ <Redirect exact from="/" to="/wallet" />
+ <Route component={NotFound} />
+ </Switch>
+ </WalletCtn>
+ {wallet ? (
+ <Footer>
+ <NavButton
+ active={selectedKey === 'wallet'}
+ onClick={() => history.push('/wallet')}
+ >
+ <HomeIcon />
+ </NavButton>
+
+ <NavButton
+ active={selectedKey === 'send'}
+ onClick={() => history.push('/send')}
+ >
+ <SendIcon
+ style={{
+ marginTop: '-9px',
+ }}
+ />
+ </NavButton>
+ <NavButton
+ active={selectedKey === 'receive'}
+ onClick={() => history.push('receive')}
+ >
+ <ReceiveIcon />
+ </NavButton>
+ <NavButton
+ active={selectedKey === 'airdrop'}
+ onClick={() => history.push('/airdrop')}
+ >
+ <AirdropIcon />
+ </NavButton>
+ <NavButton
+ active={selectedKey === 'configure'}
+ onClick={() => history.push('/configure')}
+ >
+ <SettingsIcon />
+ </NavButton>
+ </Footer>
+ ) : null}
+ </WalletBody>
+ </CustomApp>
+ </Spin>
+ </ThemeProvider>
+ );
+};
+
+export default App;
diff --git a/web/cashtab-v2/extension/src/contentscript.js b/web/cashtab-v2/extension/src/contentscript.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/extension/src/contentscript.js
@@ -0,0 +1,35 @@
+const extension = require('extensionizer');
+
+// Insert flag into window object to denote CashTab is available and active as a browser extension
+// Could use a div or other approach for now, but emulate MetaMask this way so it is extensible to other items
+// Try window object approach
+var cashTabInject = document.createElement('script');
+cashTabInject.innerHTML = `window.bitcoinAbc = 'cashtab'`;
+document.head.appendChild(cashTabInject);
+
+// Process page messages
+// Chrome extensions communicate with web pages through the DOM
+// Page sends a message to itself, chrome extension intercepts it
+var port = extension.runtime.connect({ name: 'cashtabPort' });
+//console.log(`port: ${JSON.stringify(port)}`);
+//console.log(port);
+
+window.addEventListener(
+ 'message',
+ function (event) {
+ if (typeof event.data.text !== 'undefined') {
+ console.log('Message received:');
+ console.log(event.data.text);
+ }
+
+ // We only accept messages from ourselves
+ if (event.source != window) return;
+
+ if (event.data.type && event.data.type == 'FROM_PAGE') {
+ console.log(event);
+ console.log('Content script received: ' + event.data.text);
+ port.postMessage(event.data);
+ }
+ },
+ false,
+);
diff --git a/web/cashtab-v2/manifest.json b/web/cashtab-v2/manifest.json
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/manifest.json
@@ -0,0 +1,41 @@
+{
+ "name": "App",
+ "icons": [
+ {
+ "src": "/android-icon-36x36.png",
+ "sizes": "36x36",
+ "type": "image/png",
+ "density": "0.75"
+ },
+ {
+ "src": "/android-icon-48x48.png",
+ "sizes": "48x48",
+ "type": "image/png",
+ "density": "1.0"
+ },
+ {
+ "src": "/android-icon-72x72.png",
+ "sizes": "72x72",
+ "type": "image/png",
+ "density": "1.5"
+ },
+ {
+ "src": "/android-icon-96x96.png",
+ "sizes": "96x96",
+ "type": "image/png",
+ "density": "2.0"
+ },
+ {
+ "src": "/android-icon-144x144.png",
+ "sizes": "144x144",
+ "type": "image/png",
+ "density": "3.0"
+ },
+ {
+ "src": "/android-icon-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png",
+ "density": "4.0"
+ }
+ ]
+}
diff --git a/web/cashtab-v2/nginx.conf b/web/cashtab-v2/nginx.conf
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/nginx.conf
@@ -0,0 +1,41 @@
+gzip on;
+
+gzip_vary on;
+gzip_proxied any;
+gzip_comp_level 9;
+gzip_buffers 16 8k;
+gzip_http_version 1.1;
+gzip_min_length 256;
+gzip_types
+ application/atom+xml
+ application/geo+json
+ application/javascript
+ application/x-javascript
+ application/json
+ application/ld+json
+ application/manifest+json
+ application/rdf+xml
+ application/rss+xml
+ application/xhtml+xml
+ application/xml
+ font/eot
+ font/otf
+ font/ttf
+ image/svg+xml
+ text/css
+ text/javascript
+ text/plain
+ text/xml;
+
+server {
+ listen 80;
+ location / {
+ root /usr/share/nginx/html;
+ index index.html index.htm;
+ try_files $uri $uri/ /index.html;
+ }
+ error_page 500 502 503 504 /50x.html;
+ location = /50x.html {
+ root /usr/share/nginx/html;
+ }
+}
\ No newline at end of file
diff --git a/web/cashtab-v2/public/browserconfig.xml b/web/cashtab-v2/public/browserconfig.xml
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/public/browserconfig.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8"?>
+<browserconfig><msapplication><tile><square16x16logo src="/bch16.png"/><square48x48logo src="/bch16.png"/><square128x128logo src="/bch128.png"/><square192x192logo src="/bch192.png"/><square512x512logo src="/bch512.png"/><TileColor>#ffffff</TileColor></tile></msapplication></browserconfig>
\ No newline at end of file
diff --git a/web/cashtab-v2/public/cashtab_bg.png b/web/cashtab-v2/public/cashtab_bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/public/cashtab_twitter.png b/web/cashtab-v2/public/cashtab_twitter.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/public/ecash128.png b/web/cashtab-v2/public/ecash128.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/public/ecash16.png b/web/cashtab-v2/public/ecash16.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/public/ecash192.png b/web/cashtab-v2/public/ecash192.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/public/ecash48.png b/web/cashtab-v2/public/ecash48.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/public/ecash512.png b/web/cashtab-v2/public/ecash512.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/public/favicon.ico b/web/cashtab-v2/public/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/public/index.html b/web/cashtab-v2/public/index.html
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/public/index.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8" />
+
+ <!-- icons -->
+ <link rel="icon" href="/favicon.ico" />
+
+ <link rel="manifest" href="/manifest.json" />
+
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
+ <meta name="theme-color" content="#000000" />
+ <meta name="Cashtab" content="Cashtab" />
+ <!--
+ manifest.json provides metadata used when your web app is installed on a
+ user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
+ -->
+ <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
+ <!--
+ Notice the use of %PUBLIC_URL% in the tags above.
+ It will be replaced with the URL of the `public` folder during the build.
+ Only files inside the `public` folder can be referenced from the HTML.
+
+ Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
+ work correctly both with client-side routing and a non-root public URL.
+ Learn how to configure a non-root public URL by running `npm run build`.
+ -->
+
+ <meta name="twitter:card" content="summary_large_image" />
+ <meta property="og:description" content="A web wallet for eCash" />
+ <meta property="og:title" content="Cashtab" />
+ <meta
+ property="og:image"
+ content="https://cashtab.com/cashtab_twitter.png"
+ />
+ <link rel="apple-touch-icon" href="/ecash192.png" />
+
+ <title>Cashtab</title>
+ </head>
+
+ <body>
+ <noscript>You need to enable JavaScript to run this app.</noscript>
+ <div id="root"></div>
+ <!--
+ This HTML file is a template.
+ If you open it directly in the browser, you will see an empty page.
+
+ You can add webfonts, meta tags, or analytics to this file.
+ The build step will place the bundled scripts into the <body> tag.
+
+ To begin the development, run `npm start` or `yarn start`.
+ To create a production bundle, use `npm run build` or `yarn build`.
+ --></body>
+</html>
diff --git a/web/cashtab-v2/public/manifest.json b/web/cashtab-v2/public/manifest.json
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/public/manifest.json
@@ -0,0 +1,36 @@
+{
+ "short_name": "Cashtab",
+ "name": "Cashtab",
+ "icons": [
+ {
+ "src": "favicon.ico",
+ "sizes": "64x64 32x32 24x24 16x16",
+ "type": "image/x-icon"
+ },
+ {
+ "src": "ecash48.png",
+ "type": "image/png",
+ "sizes": "48x48"
+ },
+ {
+ "src": "ecash128.png",
+ "type": "image/png",
+ "sizes": "128x128"
+ },
+ {
+ "src": "ecash192.png",
+ "type": "image/png",
+ "sizes": "192x192",
+ "purpose": "any maskable"
+ },
+ {
+ "src": "ecash512.png",
+ "type": "image/png",
+ "sizes": "512x512"
+ }
+ ],
+ "start_url": ".",
+ "display": "standalone",
+ "theme_color": "#273498",
+ "background_color": "#ffffff"
+}
diff --git a/web/cashtab-v2/public/robots.txt b/web/cashtab-v2/public/robots.txt
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/public/robots.txt
@@ -0,0 +1,2 @@
+# https://www.robotstxt.org/robotstxt.html
+User-agent: *
diff --git a/web/cashtab-v2/screenshots/ss-readme.png b/web/cashtab-v2/screenshots/ss-readme.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/screenshots/ss01.png b/web/cashtab-v2/screenshots/ss01.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/screenshots/ss02.png b/web/cashtab-v2/screenshots/ss02.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/screenshots/ss03.png b/web/cashtab-v2/screenshots/ss03.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/screenshots/ss04.png b/web/cashtab-v2/screenshots/ss04.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/scripts/addGenerated.sh b/web/cashtab-v2/scripts/addGenerated.sh
new file mode 100755
--- /dev/null
+++ b/web/cashtab-v2/scripts/addGenerated.sh
@@ -0,0 +1,28 @@
+#!/usr/bin/env bash
+
+export LC_ALL=C
+
+set -euo pipefail
+
+# Build the generated marker without having this script being marked as
+# generated itself.
+AT=@
+AT_GENERATED="${AT}generated"
+
+TOPLEVEL=$(git rev-parse --show-toplevel)
+
+# Note that this won't work if the with files containing a space in their name.
+# This can be solved by using a null char delimiter (-d '\0') for read in
+# combination with find's option -print0 to get a compatible output, but this is
+# not supported by all find variants so we'll do without it for now.
+find "${TOPLEVEL}/web/cashtab/src" -name "*.test.js.snap" | while read i; do
+ # It is possible to avoid the grep and have sed do it all, but:
+ # 1. This is a more complex sed usage
+ # 2. It will add the generated mark in files that have it already on another
+ # line.
+ if ! grep -q "${AT_GENERATED}" "${i}"; then
+ # The -i.bak option tells sed to do in-place replacement and create a backup
+ # file with a .bak suffix. This is mandatory for BSD/OSX compatibility.
+ sed -i.bak "1 s/$/ ${AT_GENERATED}/" "${i}" && rm -f "${i}.bak"
+ fi
+done
diff --git a/web/cashtab-v2/scripts/extension.sh b/web/cashtab-v2/scripts/extension.sh
new file mode 100755
--- /dev/null
+++ b/web/cashtab-v2/scripts/extension.sh
@@ -0,0 +1,64 @@
+#!/usr/bin/env bash
+
+export LC_ALL=C
+set -euo pipefail
+
+# Build Cashtab as a Chrome/Brave browser extension
+
+# Create a working directory for stashing non-extension files
+WORKDIR=$(mktemp -d)
+echo Using workdir ${WORKDIR}
+
+# Delete workdir on script finish
+function cleanup {
+ echo Deleting workdir ${WORKDIR}
+ rm -rf "${WORKDIR}"
+}
+trap cleanup EXIT
+
+# Stash web files that require extension changes in workdir
+mv public/manifest.json ${WORKDIR}
+mv src/components/App.js ${WORKDIR}
+mv src/components/App.css ${WORKDIR}
+
+# Move extension src files into place for npm build
+cp extension/src/assets/popout.svg src/assets/
+cp extension/public/manifest.json public/
+cp extension/src/components/App.js src/components/
+cp extension/src/components/App.css src/components/
+
+# Delete the last extension build
+if [ -d "extension/dist/" ]; then rm -Rf extension/dist/; fi
+
+# Build the extension
+mkdir extension/dist/
+echo 'Building Extension...'
+
+# Required for extension build rules
+export INLINE_RUNTIME_CHUNK=false
+export GENERATE_SOURCEMAP=false
+
+npm run build
+
+# Copy extension build files to extension/ folder
+cp -r build/* extension/dist
+
+# Browserify contentscript.js and background.js to pull in their imports
+browserify extension/src/contentscript.js -o extension/dist/contentscript.js
+browserify extension/src/background.js -o extension/dist/background.js
+
+# Delete extension build from build/ folder (reserved for web app builds)
+rm -Rf build
+
+# Replace original web files
+rm src/assets/popout.svg
+rm public/manifest.json
+rm src/components/App.js
+rm src/components/App.css
+
+# Note, src/assets/popout.svg does not need to be replaced, not used by web app
+mv ${WORKDIR}/manifest.json public/
+mv ${WORKDIR}/App.js src/components/
+mv ${WORKDIR}/App.css src/components/
+
+echo 'Extension built and web files replaced!'
\ No newline at end of file
diff --git a/web/cashtab-v2/src/assets/airdrop-icon.svg b/web/cashtab-v2/src/assets/airdrop-icon.svg
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/assets/airdrop-icon.svg
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="249.553px" height="309.122px" viewBox="0 0 249.553 309.122" enable-background="new 0 0 249.553 309.122"
+ xml:space="preserve">
+<g id="VM3YWc.tif">
+
+ <image overflow="visible" width="1024" height="1024" id="Layer_0_1_" xlink:href="BAE1798302874AFB.png" transform="matrix(0.4382 0 0 0.4382 -947.2231 -73.2114)">
+ </image>
+</g>
+<g id="YpnODz.tif">
+
+ <image overflow="visible" width="420" height="512" id="Layer_0_2_" xlink:href="BAE1798302874AF9.png" transform="matrix(1 0 0 1 -847.0186 -560.8555)">
+ </image>
+</g>
+<path d="M248.686,139.521c8.057-68.52-40.959-130.598-109.478-138.654C70.688-7.19,8.611,41.824,0.555,110.345
+ c-0.235,1.993-0.416,3.98-0.555,5.961l89.803,78.08l-27.413-3.224L49.979,296.71l105.548,12.412l12.41-105.549l-25.021-2.942
+ l105.354-57.929C248.421,141.646,248.56,140.586,248.686,139.521z M140.004,289.461l-70.366-8.273l8.274-70.365l70.366,8.273
+ L140.004,289.461z M136.603,17.93c21.269,2.501,17.834,92.839,17.834,92.839s-23.843-21.37-58.193-6.842
+ C96.244,103.927,115.334,15.43,136.603,17.93z M152.213,129.674l-35.235,55.153l-20.89-61.752
+ C96.089,123.075,123.072,104.985,152.213,129.674z M108.419,18.21c-17.002,18.204-29.308,83.702-29.308,83.702
+ c-27.629-19.72-57.724-8.285-57.724-8.285C42.808,26.068,108.419,18.21,108.419,18.21z M77.914,124.832l17.049,51.12L23.96,112.498
+ C23.96,112.498,53.394,96.493,77.914,124.832z M139.862,181.23l28.772-46.031c0,0,26.341-20.262,55.639,0.553L139.862,181.23z
+ M172.751,112.922c0,0,5.105-48.514-8.208-88.113c0,0,57.69,18.763,66.278,93.444C230.822,118.253,207.258,99.61,172.751,112.922z"
+ />
+<path d="M-169.542-694.849c-115.98,0-210,94.02-210,210c0,3.374,0.087,6.727,0.245,10.062l189.755,129.438l49-5L40.39-479.456
+ c0.045-1.792,0.068-3.59,0.068-5.393C40.458-600.829-53.562-694.849-169.542-694.849z M-170.542-665.849c36,0,48,151.5,48,151.5
+ s-44-31-98.5,0C-221.042-514.349-206.542-665.849-170.542-665.849z M-217.542-659.849c-24.813,33.73-32.5,145.5-32.5,145.5
+ c-50-27.5-98-2.5-98-2.5C-325.542-633.849-217.542-659.849-217.542-659.849z M-340.042-485.849c0,0,46-32.5,92.5,10l38.5,82
+ L-340.042-485.849z M-170.542-383.349l-47-99c0,0,41.5-35.5,95,0L-170.542-383.349z M-133.042-393.849l39-82.5c0,0,40-39,93-10
+ L-133.042-393.849z M-91.542-514.349c0,0-1-82-31-145.5c0,0,100,20,129,143C6.458-516.849-36.542-543.349-91.542-514.349z"/>
+<path d="M-260.556-361.878v179h179v-179H-260.556z M-111.556-212.878h-119v-120h119V-212.878z"/>
+</svg>
diff --git a/web/cashtab-v2/src/assets/alert-circle.svg b/web/cashtab-v2/src/assets/alert-circle.svg
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/assets/alert-circle.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" class="ionicon" viewBox="0 0 512 512"><title>Alert Circle</title><path d="M256 48C141.31 48 48 141.31 48 256s93.31 208 208 208 208-93.31 208-208S370.69 48 256 48zm0 319.91a20 20 0 1120-20 20 20 0 01-20 20zm21.72-201.15l-5.74 122a16 16 0 01-32 0l-5.74-121.94v-.05a21.74 21.74 0 1143.44 0z"/></svg>
\ No newline at end of file
diff --git a/web/cashtab-v2/src/assets/cashtab_xec.png b/web/cashtab-v2/src/assets/cashtab_xec.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/src/assets/cog.svg b/web/cashtab-v2/src/assets/cog.svg
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/assets/cog.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" class="ionicon" viewBox="0 0 512 512"><title>Cog</title><path d="M464 249.93a10.58 10.58 0 00-9.36-9.94L429 235.84a5.42 5.42 0 01-4.5-4.67c-.49-3.15-1-6.42-1.7-9.52a5.52 5.52 0 012.63-5.85l22.78-12.65a10.35 10.35 0 005-12.83l-3.95-10.9a10.32 10.32 0 00-12.13-6.51l-25.55 5a5.51 5.51 0 01-5.82-2.81c-1.49-2.79-3.11-5.63-4.8-8.42a5.6 5.6 0 01.44-6.5l17-19.64a10.42 10.42 0 00.39-13.76l-7.42-8.91a10.24 10.24 0 00-13.58-2l-22.37 13.43a5.39 5.39 0 01-6.39-.63c-2.47-2.17-5-4.26-7.37-6.19a5.45 5.45 0 01-1.72-6.21l9.26-24.4a10.35 10.35 0 00-4.31-13.07l-10.09-5.89a10.3 10.3 0 00-13.45 2.83L325 96.28a4.6 4.6 0 01-5.6 1.72c-.61-.25-5.77-2.36-9.78-3.7a5.42 5.42 0 01-3.74-5.23l.39-26.07a10.48 10.48 0 00-8.57-10.88l-11.45-2a10.45 10.45 0 00-11.75 7.17L266 82.1a5.46 5.46 0 01-5.36 3.65h-9.75a5.5 5.5 0 01-5.3-3.67l-8.46-24.67a10.46 10.46 0 00-11.77-7.25l-11.47 2a10.46 10.46 0 00-8.56 10.79l.4 26.16a5.45 5.45 0 01-3.86 5.25c-2.29.89-7.26 2.79-9.52 3.63-2 .72-4.18-.07-5.94-2.1l-16.26-20A10.3 10.3 0 00156.69 73l-10.06 5.83A10.36 10.36 0 00142.31 92l9.25 24.34a5.54 5.54 0 01-1.7 6.23c-2.43 2-4.92 4-7.4 6.22a5.38 5.38 0 01-6.35.64L114 115.74a10.4 10.4 0 00-13.61 2L93 126.63a10.31 10.31 0 00.37 13.75L110.45 160a5.42 5.42 0 01.45 6.45c-1.71 2.72-3.34 5.58-4.82 8.44a5.53 5.53 0 01-5.86 2.82l-25.51-4.93a10.34 10.34 0 00-12.14 6.51l-4 10.88a10.38 10.38 0 005 12.85l22.78 12.65a5.39 5.39 0 012.65 5.92l-.24 1.27c-.52 2.79-1 5.43-1.46 8.24a5.48 5.48 0 01-4.46 4.64l-25.69 4.15A10.42 10.42 0 0048 250.16v11.58A10.26 10.26 0 0057.16 272l25.68 4.14a5.41 5.41 0 014.5 4.67c.49 3.16 1 6.42 1.7 9.52a5.52 5.52 0 01-2.63 5.85l-22.77 12.67a10.35 10.35 0 00-5 12.83l4 10.9a10.33 10.33 0 0012.13 6.51l25.55-4.95a5.49 5.49 0 015.82 2.81c1.5 2.8 3.11 5.63 4.8 8.42a5.58 5.58 0 01-.44 6.5l-17 19.63a10.41 10.41 0 00-.5 13.77l7.41 8.91a10.23 10.23 0 0013.58 2l22.37-13.43a5.39 5.39 0 016.39.63c2.48 2.17 5 4.26 7.37 6.19a5.47 5.47 0 011.73 6.21l-9.27 24.4a10.35 10.35 0 004.31 13.07l10.11 5.84a10.3 10.3 0 0013.45-2.82L187 415.92c1.4-1.73 3.6-2.5 5.23-1.84 3.48 1.44 5.81 2.25 9.94 3.63a5.44 5.44 0 013.75 5.23l-.4 26.05a10.5 10.5 0 008.57 10.88l11.45 2a10.43 10.43 0 0011.75-7.17l8.5-24.77a5.45 5.45 0 015.36-3.65h9.75a5.49 5.49 0 015.3 3.67l8.47 24.67a10.48 10.48 0 0010 7.41 9.74 9.74 0 001.78-.16l11.47-2a10.46 10.46 0 008.56-10.79l-.4-26.16a5.43 5.43 0 013.75-5.2c3.84-1.29 6.54-2.33 8.91-3.25l.6-.23c3.1-1.07 4.6.23 5.47 1.31l16.75 20.63A10.3 10.3 0 00355 439l10.07-5.83a10.35 10.35 0 004.31-13.1l-9.24-24.34a5.52 5.52 0 011.69-6.23c2.43-2 4.92-4 7.4-6.22a5.39 5.39 0 016.38-.62l22.39 13.4a10.39 10.39 0 0013.61-2l7.4-8.9a10.31 10.31 0 00-.37-13.75l-17.06-19.67a5.42 5.42 0 01-.45-6.45c1.71-2.71 3.34-5.57 4.82-8.44a5.55 5.55 0 015.86-2.82l25.48 4.97a10.34 10.34 0 0012.14-6.51l3.95-10.88a10.37 10.37 0 00-5-12.84l-22.8-12.67a5.4 5.4 0 01-2.61-5.89l.24-1.27c.52-2.79 1-5.43 1.46-8.24a5.48 5.48 0 014.46-4.64l25.69-4.14a10.43 10.43 0 009.18-10.28v-11.71zm-282.45 94a15.8 15.8 0 01-25.47 2.66 135.06 135.06 0 01.42-181.65 15.81 15.81 0 0125.5 2.77l45.65 80.35a15.85 15.85 0 010 15.74zM256 391.11a134.75 134.75 0 01-28.31-3 15.81 15.81 0 01-10.23-23.36l46-80a15.79 15.79 0 0113.7-7.93h92.14a15.8 15.8 0 0115.1 20.53c-17.49 54.32-68.4 93.76-128.4 93.76zm7.51-163.9L218 147.07a15.81 15.81 0 0110.31-23.3 134 134 0 0127.69-2.88c60 0 110.91 39.44 128.37 93.79a15.8 15.8 0 01-15.1 20.53h-92a15.78 15.78 0 01-13.76-8z"/></svg>
\ No newline at end of file
diff --git a/web/cashtab-v2/src/assets/copy.svg b/web/cashtab-v2/src/assets/copy.svg
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/assets/copy.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!-- Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><path d="M320 448v40c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V120c0-13.255 10.745-24 24-24h72v296c0 30.879 25.121 56 56 56h168zm0-344V0H152c-13.255 0-24 10.745-24 24v368c0 13.255 10.745 24 24 24h272c13.255 0 24-10.745 24-24V128H344c-13.2 0-24-10.8-24-24zm120.971-31.029L375.029 7.029A24 24 0 0 0 358.059 0H352v96h96v-6.059a24 24 0 0 0-7.029-16.97z"/></svg>
\ No newline at end of file
diff --git a/web/cashtab-v2/src/assets/edit.svg b/web/cashtab-v2/src/assets/edit.svg
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/assets/edit.svg
@@ -0,0 +1 @@
+<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'><title>Rename</title><path d='M384 224v184a40 40 0 01-40 40H104a40 40 0 01-40-40V168a40 40 0 0140-40h167.48' fill='none' stroke-linecap='round' stroke-linejoin='round' stroke-width='32'/><path d='M459.94 53.25a16.06 16.06 0 00-23.22-.56L424.35 65a8 8 0 000 11.31l11.34 11.32a8 8 0 0011.34 0l12.06-12c6.1-6.09 6.67-16.01.85-22.38zM399.34 90L218.82 270.2a9 9 0 00-2.31 3.93L208.16 299a3.91 3.91 0 004.86 4.86l24.85-8.35a9 9 0 003.93-2.31L422 112.66a9 9 0 000-12.66l-9.95-10a9 9 0 00-12.71 0z'/></svg>
\ No newline at end of file
diff --git a/web/cashtab-v2/src/assets/external-link-square-alt.svg b/web/cashtab-v2/src/assets/external-link-square-alt.svg
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/assets/external-link-square-alt.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!-- Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><path d="M448 80v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h352c26.51 0 48 21.49 48 48zm-88 16H248.029c-21.313 0-32.08 25.861-16.971 40.971l31.984 31.987L67.515 364.485c-4.686 4.686-4.686 12.284 0 16.971l31.029 31.029c4.687 4.686 12.285 4.686 16.971 0l195.526-195.526 31.988 31.991C358.058 263.977 384 253.425 384 231.979V120c0-13.255-10.745-24-24-24z"/></svg>
\ No newline at end of file
diff --git a/web/cashtab-v2/src/assets/fingerprint-solid.svg b/web/cashtab-v2/src/assets/fingerprint-solid.svg
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/assets/fingerprint-solid.svg
@@ -0,0 +1 @@
+<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="fingerprint" class="svg-inline--fa fa-fingerprint fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256.12 245.96c-13.25 0-24 10.74-24 24 1.14 72.25-8.14 141.9-27.7 211.55-2.73 9.72 2.15 30.49 23.12 30.49 10.48 0 20.11-6.92 23.09-17.52 13.53-47.91 31.04-125.41 29.48-224.52.01-13.25-10.73-24-23.99-24zm-.86-81.73C194 164.16 151.25 211.3 152.1 265.32c.75 47.94-3.75 95.91-13.37 142.55-2.69 12.98 5.67 25.69 18.64 28.36 13.05 2.67 25.67-5.66 28.36-18.64 10.34-50.09 15.17-101.58 14.37-153.02-.41-25.95 19.92-52.49 54.45-52.34 31.31.47 57.15 25.34 57.62 55.47.77 48.05-2.81 96.33-10.61 143.55-2.17 13.06 6.69 25.42 19.76 27.58 19.97 3.33 26.81-15.1 27.58-19.77 8.28-50.03 12.06-101.21 11.27-152.11-.88-55.8-47.94-101.88-104.91-102.72zm-110.69-19.78c-10.3-8.34-25.37-6.8-33.76 3.48-25.62 31.5-39.39 71.28-38.75 112 .59 37.58-2.47 75.27-9.11 112.05-2.34 13.05 6.31 25.53 19.36 27.89 20.11 3.5 27.07-14.81 27.89-19.36 7.19-39.84 10.5-80.66 9.86-121.33-.47-29.88 9.2-57.88 28-80.97 8.35-10.28 6.79-25.39-3.49-33.76zm109.47-62.33c-15.41-.41-30.87 1.44-45.78 4.97-12.89 3.06-20.87 15.98-17.83 28.89 3.06 12.89 16 20.83 28.89 17.83 11.05-2.61 22.47-3.77 34-3.69 75.43 1.13 137.73 61.5 138.88 134.58.59 37.88-1.28 76.11-5.58 113.63-1.5 13.17 7.95 25.08 21.11 26.58 16.72 1.95 25.51-11.88 26.58-21.11a929.06 929.06 0 0 0 5.89-119.85c-1.56-98.75-85.07-180.33-186.16-181.83zm252.07 121.45c-2.86-12.92-15.51-21.2-28.61-18.27-12.94 2.86-21.12 15.66-18.26 28.61 4.71 21.41 4.91 37.41 4.7 61.6-.11 13.27 10.55 24.09 23.8 24.2h.2c13.17 0 23.89-10.61 24-23.8.18-22.18.4-44.11-5.83-72.34zm-40.12-90.72C417.29 43.46 337.6 1.29 252.81.02 183.02-.82 118.47 24.91 70.46 72.94 24.09 119.37-.9 181.04.14 246.65l-.12 21.47c-.39 13.25 10.03 24.31 23.28 24.69.23.02.48.02.72.02 12.92 0 23.59-10.3 23.97-23.3l.16-23.64c-.83-52.5 19.16-101.86 56.28-139 38.76-38.8 91.34-59.67 147.68-58.86 69.45 1.03 134.73 35.56 174.62 92.39 7.61 10.86 22.56 13.45 33.42 5.86 10.84-7.62 13.46-22.59 5.84-33.43z"></path></svg>
\ No newline at end of file
diff --git a/web/cashtab-v2/src/assets/flask.svg b/web/cashtab-v2/src/assets/flask.svg
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/assets/flask.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" class="ionicon" viewBox="0 0 512 512"><title>Flask</title><path d="M452.32 365L327.4 167.12a48.07 48.07 0 01-7.4-25.64V64h15.56c8.61 0 16-6.62 16.43-15.23A16 16 0 00336 32H176.45c-8.61 0-16 6.62-16.43 15.23A16 16 0 00176 64h16v77.48a47.92 47.92 0 01-7.41 25.63L59.68 365a74 74 0 00-2.5 75.84C70.44 465.19 96.36 480 124.13 480h263.74c27.77 0 53.69-14.81 66.95-39.21a74 74 0 00-2.5-75.79zM211.66 184.2A79.94 79.94 0 00224 141.48V68a4 4 0 014-4h56a4 4 0 014 4v73.48a79.94 79.94 0 0012.35 42.72l57.8 91.53a8 8 0 01-6.78 12.27H160.63a8 8 0 01-6.77-12.27z"/></svg>
\ No newline at end of file
diff --git a/web/cashtab-v2/src/assets/fonts/Poppins-Bold.ttf b/web/cashtab-v2/src/assets/fonts/Poppins-Bold.ttf
new file mode 100755
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/src/assets/fonts/Poppins-Regular.ttf b/web/cashtab-v2/src/assets/fonts/Poppins-Regular.ttf
new file mode 100755
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/src/assets/fonts/RobotoMono-Regular.ttf b/web/cashtab-v2/src/assets/fonts/RobotoMono-Regular.ttf
new file mode 100755
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/src/assets/hammer-solid.svg b/web/cashtab-v2/src/assets/hammer-solid.svg
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/assets/hammer-solid.svg
@@ -0,0 +1 @@
+<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="hammer" class="svg-inline--fa fa-hammer fa-w-18" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path fill="currentColor" d="M571.31 193.94l-22.63-22.63c-6.25-6.25-16.38-6.25-22.63 0l-11.31 11.31-28.9-28.9c5.63-21.31.36-44.9-16.35-61.61l-45.25-45.25c-62.48-62.48-163.79-62.48-226.28 0l90.51 45.25v18.75c0 16.97 6.74 33.25 18.75 45.25l49.14 49.14c16.71 16.71 40.3 21.98 61.61 16.35l28.9 28.9-11.31 11.31c-6.25 6.25-6.25 16.38 0 22.63l22.63 22.63c6.25 6.25 16.38 6.25 22.63 0l90.51-90.51c6.23-6.24 6.23-16.37-.02-22.62zm-286.72-15.2c-3.7-3.7-6.84-7.79-9.85-11.95L19.64 404.96c-25.57 23.88-26.26 64.19-1.53 88.93s65.05 24.05 88.93-1.53l238.13-255.07c-3.96-2.91-7.9-5.87-11.44-9.41l-49.14-49.14z"></path></svg>
\ No newline at end of file
diff --git a/web/cashtab-v2/src/assets/home.svg b/web/cashtab-v2/src/assets/home.svg
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/assets/home.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="511.618px" height="409.7px" viewBox="0 0 511.618 409.7" enable-background="new 0 0 511.618 409.7" xml:space="preserve">
+<path d="M507.743,197.922l-68.934-57.664V12.5c0-5.964-4.835-10.8-10.8-10.8h-59.4c-5.965,0-10.8,4.835-10.8,10.8v60.001
+ L282.856,9.802c-4.438-3.707-22.865-15.981-45.625-5.935c-0.751,0.253-1.479,0.595-2.175,1.021c0,0,0,0,0,0l0,0
+ c-0.445,0.273-0.88,0.569-1.293,0.913L3.876,197.922c-4.578,3.824-5.188,10.636-1.364,15.213l20.131,24.097
+ c3.824,4.579,10.635,5.188,15.212,1.365L255.615,56.613l218.147,181.984c4.578,3.823,11.389,3.214,15.213-1.365l20.131-24.097
+ C512.931,208.558,512.32,201.747,507.743,197.922z"/>
+<path d="M255.643,84.783L72.81,234.688V391.7c0,9.941,8.059,18,18,18h123v-122h83v122h123c9.941,0,18-8.059,18-18V235.318
+ L255.643,84.783z"/>
+</svg>
diff --git a/web/cashtab-v2/src/assets/ios-paperplane.svg b/web/cashtab-v2/src/assets/ios-paperplane.svg
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/assets/ios-paperplane.svg
@@ -0,0 +1,49 @@
+<svg
+ height="127"
+ width="135"
+ viewBox="0 0 691.2 650.24">
+ <defs
+ id="defs74">
+ <style
+ id="style72"
+ type="text/css" />
+ <clipPath
+ id="clipPath89"
+ clipPathUnits="userSpaceOnUse">
+ <rect
+ y="192"
+ x="177.60765"
+ height="638.46899"
+ width="654.39233"
+ id="rect91"
+ style="fill:#00ce8c;fill-opacity:1;stroke:#008000;stroke-width:5.11999989" />
+ </clipPath>
+ <clipPath
+ id="clipPath93"
+ clipPathUnits="userSpaceOnUse">
+ <rect
+ y="192"
+ x="177.60765"
+ height="638.46899"
+ width="654.39233"
+ id="rect95"
+ style="fill:#00ce8c;fill-opacity:1;stroke:#008000;stroke-width:5.11999989" />
+ </clipPath>
+ </defs>
+ <g
+ transform="translate(-176.38277,-186.3533)"
+ id="g99">
+ <path
+ style="fill:#3e3f42"
+ d="M 192,499.2 404,592.6 832,192 Z"
+ p-id="9782"
+ id="path76"
+ clip-path="url(#clipPath93)" />
+ <path
+ style="fill:#3e3f42"
+ d="M 832,192 435.8,623.4 539.6,832 Z"
+ p-id="9783"
+ id="path78"
+ clip-path="url(#clipPath89)" />
+ </g>
+</svg>
diff --git a/web/cashtab-v2/src/assets/logo_primary.png b/web/cashtab-v2/src/assets/logo_primary.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/src/assets/logo_secondary.png b/web/cashtab-v2/src/assets/logo_secondary.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/src/assets/logo_topright.png b/web/cashtab-v2/src/assets/logo_topright.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/src/assets/receive.svg b/web/cashtab-v2/src/assets/receive.svg
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/assets/receive.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="475px" height="446px" viewBox="0 0 475 446" enable-background="new 0 0 475 446" xml:space="preserve">
+<g id="ThhD88.tif" display="none">
+
+ <image display="inline" overflow="visible" width="512" height="428" id="Layer_0_1_" xlink:href="9DC35140A5A1A299.png" transform="matrix(1 0 0 1 -22 19)">
+ </image>
+</g>
+<path d="M291,10.8C291,4.835,286.165,0,280.2,0h-84.4C189.835,0,185,4.835,185,10.8v205.4c0,5.964,4.835,10.8,10.8,10.8h84.4
+ c5.965,0,10.8-4.835,10.8-10.8V10.8z"/>
+<path d="M362.338,168c16.366,0,20.56,9.899,9.319,21.795l-113.462,120.16c-11.239,11.896-29.633,11.938-40.873,0.042
+ L103.861,189.774C92.621,177.878,96.814,168,113.18,168H362.338z"/>
+<path d="M475,376c0-9.941-8.059-18-18-18H18c-9.941,0-18,8.059-18,18v52c0,9.941,8.059,18,18,18h439c9.941,0,18-8.059,18-18V376z"/>
+</svg>
diff --git a/web/cashtab-v2/src/assets/send.svg b/web/cashtab-v2/src/assets/send.svg
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/assets/send.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" class="ionicon" viewBox="0 0 512 512"><title>Send</title><path d="M476.59 227.05l-.16-.07L49.35 49.84A23.56 23.56 0 0027.14 52 24.65 24.65 0 0016 72.59v113.29a24 24 0 0019.52 23.57l232.93 43.07a4 4 0 010 7.86L35.53 303.45A24 24 0 0016 327v113.31A23.57 23.57 0 0026.59 460a23.94 23.94 0 0013.22 4 24.55 24.55 0 009.52-1.93L476.4 285.94l.19-.09a32 32 0 000-58.8z"/></svg>
\ No newline at end of file
diff --git a/web/cashtab-v2/src/assets/styles/theme.js b/web/cashtab-v2/src/assets/styles/theme.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/assets/styles/theme.js
@@ -0,0 +1,72 @@
+export const theme = {
+ eCashBlue: '#00ABE7',
+ eCashPurple: '#ff21d0',
+ darkBlue: '#273498',
+ contrast: '#fff',
+ backgroundImage: `url("/cashtab_bg.png")`,
+ backgroundColor: '#d5d5d7',
+ walletBackground: '#152b45',
+ walletInfoContainer: '#255173',
+ footerBackground: '#152b45',
+ navActive: '#00ABE7',
+ encryptionRed: '#DC143C',
+ genesisGreen: '#00e781',
+ receivedMessage: 'rgba(0,171,231,0.2)',
+ sentMessage: 'rgba(255, 255, 255, 0.1)',
+ lightWhite: 'rgba(255,255,255,0.4)',
+ dropdownText: '#000',
+ shadow: 'rgba(0, 0, 0, 0.4)',
+ switchButtonActiveText: '#fff',
+ advancedCollapse: {
+ background: '#255173',
+ color: '#fff',
+ icon: '#fff',
+ expandedBackground: 'rgba(0,0,0,0.2)',
+ },
+ forms: {
+ error: '#FF21D0',
+ border: '#17171f',
+ text: '#fff',
+ addonBackground: '#255173',
+ addonForeground: '#fff',
+ selectionBackground: '#255173',
+ placeholder: 'rgba(255,255,255,0.3)',
+ highlightBox: '#00ABE7',
+ },
+ icons: { outlined: '#fff' },
+ settings: {
+ delete: '#CD0BC3',
+ background: 'rgba(0,0,0,0.4)',
+ },
+ qr: {
+ background: '#fff',
+ },
+ buttons: {
+ primary: {
+ backgroundImage:
+ 'linear-gradient(270deg, #0074C2 0%, #273498 100%)',
+ color: '#fff',
+ hoverShadow: '0px 3px 10px -5px rgba(0, 0, 0, 0.75)',
+ disabledOverlay: 'rgba(255, 255, 255, 0.5)',
+ },
+ secondary: {
+ background: '#4b67e1',
+ color: '#fff',
+ hoverShadow: '0px 3px 10px -5px rgba(0, 0, 0, 0.75)',
+ disabledOverlay: 'rgba(255, 255, 255, 0.5)',
+ },
+ styledLink: '#ffffff',
+ },
+ collapses: {
+ background: '#255173',
+ expandedBackground: '#26415a',
+ border: '#17171f',
+ color: '#fff',
+ },
+ modal: {
+ background: '#255173',
+ border: '#17171f',
+ color: '#fff',
+ buttonBackground: '#26415a',
+ },
+};
diff --git a/web/cashtab-v2/src/assets/tabcash.png b/web/cashtab-v2/src/assets/tabcash.png
new file mode 100644
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
literal 0
Hc$@<O00001
diff --git a/web/cashtab-v2/src/assets/trashcan.svg b/web/cashtab-v2/src/assets/trashcan.svg
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/assets/trashcan.svg
@@ -0,0 +1 @@
+<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'><title>Delete</title><path d='M112 112l20 320c.95 18.49 14.4 32 32 32h184c17.67 0 30.87-13.51 32-32l20-320' fill='none' stroke-linecap='round' stroke-linejoin='round' stroke-width='32'/><path stroke-linecap='round' stroke-miterlimit='10' stroke-width='32' d='M80 112h352'/><path d='M192 112V72h0a23.93 23.93 0 0124-24h80a23.93 23.93 0 0124 24h0v40M256 176v224M184 176l8 224M328 176l-8 224' fill='none' stroke-linecap='round' stroke-linejoin='round' stroke-width='32'/></svg>
\ No newline at end of file
diff --git a/web/cashtab-v2/src/components/Airdrop/Airdrop.js b/web/cashtab-v2/src/components/Airdrop/Airdrop.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Airdrop/Airdrop.js
@@ -0,0 +1,468 @@
+import React, { useState, useEffect } from 'react';
+import { useLocation } from 'react-router-dom';
+import PropTypes from 'prop-types';
+import BigNumber from 'bignumber.js';
+import styled from 'styled-components';
+import { WalletContext } from '@utils/context';
+import { AntdFormWrapper } from '@components/Common/EnhancedInputs';
+import { AdvancedCollapse } from '@components/Common/StyledCollapse';
+import { Form, Alert, Collapse, Input, Modal, Spin, Progress } from 'antd';
+const { Panel } = Collapse;
+const { TextArea } = Input;
+import { Row, Col } from 'antd';
+import { SmartButton } from '@components/Common/PrimaryButton';
+import useBCH from '@hooks/useBCH';
+import {
+ errorNotification,
+ generalNotification,
+} from '@components/Common/Notifications';
+import { currency } from '@components/Common/Ticker.js';
+import BalanceHeader from '@components/Common/BalanceHeader';
+import BalanceHeaderFiat from '@components/Common/BalanceHeaderFiat';
+import {
+ getWalletState,
+ convertEtokenToEcashAddr,
+ fromSmallestDenomination,
+} from '@utils/cashMethods';
+import {
+ isValidTokenId,
+ isValidXecAirdrop,
+ isValidAirdropOutputsArray,
+} from '@utils/validation';
+import { CustomSpinner } from '@components/Common/CustomIcons';
+import * as etokenList from 'etoken-list';
+import {
+ ZeroBalanceHeader,
+ SidePaddingCtn,
+ WalletInfoCtn,
+} from '@components/Common/Atoms';
+import WalletLabel from '@components/Common/WalletLabel.js';
+import { Link } from 'react-router-dom';
+
+const AirdropActions = styled.div`
+ text-align: center;
+ width: 100%;
+ padding: 10px;
+ border-radius: 5px;
+ a {
+ color: ${props => props.theme.contrast};
+ margin: 0;
+ font-size: 11px;
+ border: 1px solid ${props => props.theme.contrast};
+ border-radius: 5px;
+ padding: 2px 10px;
+ opacity: 0.6;
+ }
+ a:hover {
+ opacity: 1;
+ border-color: ${props => props.theme.eCashBlue};
+ color: ${props => props.theme.contrast};
+ background: ${props => props.theme.eCashBlue};
+ }
+ ${({ received, ...props }) =>
+ received &&
+ `
+ text-align: left;
+ background: ${props.theme.receivedMessage};
+ `}
+`;
+
+// Note jestBCH is only used for unit tests; BCHJS must be mocked for jest
+const Airdrop = ({ jestBCH, passLoadingStatus }) => {
+ const ContextValue = React.useContext(WalletContext);
+ const { wallet, fiatPrice, cashtabSettings } = ContextValue;
+ const location = useLocation();
+ const walletState = getWalletState(wallet);
+ const { balances } = walletState;
+
+ const [bchObj, setBchObj] = useState(false);
+ const [isAirdropCalcModalVisible, setIsAirdropCalcModalVisible] =
+ useState(false);
+ const [airdropCalcModalProgress, setAirdropCalcModalProgress] = useState(0); // the dynamic % progress bar
+
+ useEffect(() => {
+ // jestBCH is only ever specified for unit tests, otherwise app will use getBCH();
+ const BCH = jestBCH ? jestBCH : getBCH();
+
+ // set the BCH instance to state, for other functions to reference
+ setBchObj(BCH);
+
+ if (location && location.state && location.state.airdropEtokenId) {
+ setFormData({
+ ...formData,
+ tokenId: location.state.airdropEtokenId,
+ });
+ handleTokenIdInput({
+ target: {
+ value: location.state.airdropEtokenId,
+ },
+ });
+ }
+ }, []);
+
+ const [formData, setFormData] = useState({
+ tokenId: '',
+ totalAirdrop: '',
+ });
+
+ const [tokenIdIsValid, setTokenIdIsValid] = useState(null);
+ const [totalAirdropIsValid, setTotalAirdropIsValid] = useState(null);
+ const [airdropRecipients, setAirdropRecipients] = useState('');
+ const [airdropOutputIsValid, setAirdropOutputIsValid] = useState(true);
+ const [etokenHolders, setEtokenHolders] = useState(new BigNumber(0));
+ const [showAirdropOutputs, setShowAirdropOutputs] = useState(false);
+
+ const { getBCH } = useBCH();
+
+ const handleTokenIdInput = e => {
+ const { name, value } = e.target;
+ setTokenIdIsValid(isValidTokenId(value));
+ setFormData(p => ({
+ ...p,
+ [name]: value,
+ }));
+ };
+
+ const handleTotalAirdropInput = e => {
+ const { name, value } = e.target;
+ setTotalAirdropIsValid(isValidXecAirdrop(value));
+ setFormData(p => ({
+ ...p,
+ [name]: value,
+ }));
+ };
+
+ const calculateXecAirdrop = async () => {
+ // display airdrop calculation message modal
+ setIsAirdropCalcModalVisible(true);
+ setShowAirdropOutputs(false); // hide any previous airdrop outputs
+ passLoadingStatus(true);
+ setAirdropCalcModalProgress(25); // updated progress bar to 25%
+
+ let latestBlock;
+ try {
+ latestBlock = await bchObj.Blockchain.getBlockCount();
+ } catch (err) {
+ errorNotification(
+ err,
+ 'Error retrieving latest block height',
+ 'bchObj.Blockchain.getBlockCount() error',
+ );
+ setIsAirdropCalcModalVisible(false);
+ passLoadingStatus(false);
+ return;
+ }
+
+ setAirdropCalcModalProgress(50);
+
+ etokenList.Config.SetUrl(currency.tokenDbUrl);
+
+ let airdropList;
+ try {
+ airdropList = await etokenList.List.GetAddressListFor(
+ formData.tokenId,
+ latestBlock,
+ true,
+ );
+ } catch (err) {
+ errorNotification(
+ err,
+ 'Error retrieving airdrop recipients',
+ 'etokenList.List.GetAddressListFor() error',
+ );
+ setIsAirdropCalcModalVisible(false);
+ passLoadingStatus(false);
+ return;
+ }
+
+ if (!airdropList) {
+ errorNotification(
+ null,
+ 'No recipients found for tokenId ' + formData.tokenId,
+ 'Airdrop Calculation Error',
+ );
+ setIsAirdropCalcModalVisible(false);
+ passLoadingStatus(false);
+ return;
+ }
+
+ setAirdropCalcModalProgress(75);
+
+ let totalTokenAmongstRecipients = new BigNumber(0);
+ let totalHolders = new BigNumber(airdropList.size); // amount of addresses that hold this eToken
+ setEtokenHolders(totalHolders);
+
+ // keep a cumulative total of each eToken holding in each address in airdropList
+ airdropList.forEach(
+ index =>
+ (totalTokenAmongstRecipients = totalTokenAmongstRecipients.plus(
+ new BigNumber(index),
+ )),
+ );
+
+ let circToAirdropRatio = new BigNumber(formData.totalAirdrop).div(
+ totalTokenAmongstRecipients,
+ );
+
+ let resultString = '';
+
+ airdropList.forEach(
+ (element, index) =>
+ (resultString +=
+ convertEtokenToEcashAddr(index) +
+ ',' +
+ new BigNumber(element)
+ .multipliedBy(circToAirdropRatio)
+ .decimalPlaces(currency.cashDecimals) +
+ '\n'),
+ );
+
+ resultString = resultString.substring(0, resultString.length - 1); // remove the final newline
+ setAirdropRecipients(resultString);
+
+ setAirdropCalcModalProgress(100);
+
+ if (!resultString) {
+ errorNotification(
+ null,
+ 'No holders found for eToken ID: ' + formData.tokenId,
+ 'Airdrop Calculation Error',
+ );
+ return;
+ }
+
+ // validate the airdrop values for each recipient
+ // Note: addresses are not validated as they are retrieved directly from onchain
+ setAirdropOutputIsValid(isValidAirdropOutputsArray(resultString));
+ setShowAirdropOutputs(true); // display the airdrop outputs TextArea
+ setIsAirdropCalcModalVisible(false);
+ passLoadingStatus(false);
+ };
+
+ const handleAirdropCalcModalCancel = () => {
+ setIsAirdropCalcModalVisible(false);
+ passLoadingStatus(false);
+ };
+
+ let airdropCalcInputIsValid = tokenIdIsValid && totalAirdropIsValid;
+
+ return (
+ <>
+ <WalletInfoCtn>
+ <WalletLabel name={wallet.name}></WalletLabel>
+ {!balances.totalBalance ? (
+ <ZeroBalanceHeader>
+ You currently have 0 {currency.ticker}
+ <br />
+ Deposit some funds to use this feature
+ </ZeroBalanceHeader>
+ ) : (
+ <>
+ <BalanceHeader
+ balance={balances.totalBalance}
+ ticker={currency.ticker}
+ />
+ {fiatPrice !== null && (
+ <BalanceHeaderFiat
+ balance={balances.totalBalance}
+ settings={cashtabSettings}
+ fiatPrice={fiatPrice}
+ />
+ )}
+ </>
+ )}
+ </WalletInfoCtn>
+ <Modal
+ title="Querying the eCash blockchain"
+ visible={isAirdropCalcModalVisible}
+ okButtonProps={{ style: { display: 'none' } }}
+ onCancel={handleAirdropCalcModalCancel}
+ >
+ <Spin indicator={CustomSpinner} />
+ <Progress percent={airdropCalcModalProgress} />
+ </Modal>
+ <br />
+ <SidePaddingCtn>
+ <Row type="flex">
+ <Col span={24}>
+ <AdvancedCollapse
+ style={{
+ marginBottom: '24px',
+ }}
+ defaultActiveKey={
+ location &&
+ location.state &&
+ location.state.airdropEtokenId
+ ? ['1']
+ : ['0']
+ }
+ >
+ <Panel header="XEC Airdrop Calculator" key="1">
+ <Alert
+ message={`Please ensure the qualifying eToken transactions to airdrop recipients have at least one confirmation. The airdrop calculator will not detect unconfirmed token balances.`}
+ type="warning"
+ />
+ <br />
+ <AntdFormWrapper>
+ <Form
+ style={{
+ width: 'auto',
+ }}
+ >
+ <Form.Item
+ validateStatus={
+ tokenIdIsValid === null ||
+ tokenIdIsValid
+ ? ''
+ : 'error'
+ }
+ help={
+ tokenIdIsValid === null ||
+ tokenIdIsValid
+ ? ''
+ : 'Invalid eToken ID'
+ }
+ >
+ <Input
+ addonBefore="eToken ID"
+ placeholder="Enter the eToken ID"
+ name="tokenId"
+ value={formData.tokenId}
+ onChange={e =>
+ handleTokenIdInput(e)
+ }
+ />
+ </Form.Item>
+ <Form.Item
+ validateStatus={
+ totalAirdropIsValid === null ||
+ totalAirdropIsValid
+ ? ''
+ : 'error'
+ }
+ help={
+ totalAirdropIsValid === null ||
+ totalAirdropIsValid
+ ? ''
+ : 'Invalid total XEC airdrop'
+ }
+ >
+ <Input
+ addonBefore="Total XEC airdrop"
+ placeholder="Enter the total XEC airdrop"
+ name="totalAirdrop"
+ type="number"
+ value={formData.totalAirdrop}
+ onChange={e =>
+ handleTotalAirdropInput(e)
+ }
+ />
+ </Form.Item>
+ <Form.Item>
+ <SmartButton
+ onClick={() =>
+ calculateXecAirdrop()
+ }
+ disabled={
+ !airdropCalcInputIsValid ||
+ !tokenIdIsValid
+ }
+ >
+ Calculate Airdrop
+ </SmartButton>
+ </Form.Item>
+ {showAirdropOutputs && (
+ <>
+ {!airdropOutputIsValid &&
+ etokenHolders > 0 && (
+ <>
+ <Alert
+ description={
+ 'At least one airdrop is below the minimum ' +
+ fromSmallestDenomination(
+ currency.dustSats,
+ ) +
+ ' XEC dust. Please increase the total XEC airdrop.'
+ }
+ type="error"
+ showIcon
+ />
+ <br />
+ </>
+ )}
+ <Form.Item>
+ One to Many Airdrop Payment
+ Outputs
+ <TextArea
+ name="airdropRecipients"
+ placeholder="Please input parameters above."
+ value={
+ airdropRecipients
+ }
+ rows="10"
+ readOnly
+ />
+ </Form.Item>
+ <Form.Item>
+ <AirdropActions>
+ <Link
+ type="text"
+ to={{
+ pathname: `/send`,
+ state: {
+ airdropRecipients:
+ airdropRecipients,
+ },
+ }}
+ disabled={
+ !airdropRecipients
+ }
+ >
+ Copy to Send screen
+ </Link>
+ &nbsp;&nbsp;
+ <Link
+ type="text"
+ disabled={
+ !airdropRecipients
+ }
+ to={'#'}
+ onClick={() => {
+ navigator.clipboard.writeText(
+ airdropRecipients,
+ );
+ generalNotification(
+ 'Airdrop recipients copied to clipboard',
+ 'Copied',
+ );
+ }}
+ >
+ Copy to Clipboard
+ </Link>
+ </AirdropActions>
+ </Form.Item>
+ </>
+ )}
+ </Form>
+ </AntdFormWrapper>
+ </Panel>
+ </AdvancedCollapse>
+ </Col>
+ </Row>
+ </SidePaddingCtn>
+ </>
+ );
+};
+
+Airdrop.defaultProps = {
+ passLoadingStatus: status => {
+ console.log(status);
+ },
+};
+
+Airdrop.propTypes = {
+ jestBCH: PropTypes.object,
+ passLoadingStatus: PropTypes.func,
+};
+
+export default Airdrop;
diff --git a/web/cashtab-v2/src/components/Airdrop/__tests__/Airdrop.test.js b/web/cashtab-v2/src/components/Airdrop/__tests__/Airdrop.test.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Airdrop/__tests__/Airdrop.test.js
@@ -0,0 +1,115 @@
+import React from 'react';
+import renderer from 'react-test-renderer';
+import { ThemeProvider } from 'styled-components';
+import { theme } from '@assets/styles/theme';
+import Airdrop from '@components/Airdrop/Airdrop';
+import BCHJS from '@psf/bch-js';
+import {
+ walletWithBalancesAndTokens,
+ walletWithBalancesMock,
+ walletWithoutBalancesMock,
+ walletWithBalancesAndTokensWithCorrectState,
+} from '../../Home/__mocks__/walletAndBalancesMock';
+import { BrowserRouter as Router } from 'react-router-dom';
+
+let realUseContext;
+let useContextMock;
+
+beforeEach(() => {
+ realUseContext = React.useContext;
+ useContextMock = React.useContext = jest.fn();
+
+ // Mock method not implemented in JSDOM
+ // See reference at https://jestjs.io/docs/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom
+ Object.defineProperty(window, 'matchMedia', {
+ writable: true,
+ value: jest.fn().mockImplementation(query => ({
+ matches: false,
+ media: query,
+ onchange: null,
+ addListener: jest.fn(), // Deprecated
+ removeListener: jest.fn(), // Deprecated
+ addEventListener: jest.fn(),
+ removeEventListener: jest.fn(),
+ dispatchEvent: jest.fn(),
+ })),
+ });
+});
+
+afterEach(() => {
+ React.useContext = realUseContext;
+});
+
+test('Wallet without BCH balance', () => {
+ useContextMock.mockReturnValue(walletWithoutBalancesMock);
+ const testBCH = new BCHJS();
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Airdrop jestBCH={testBCH} />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Wallet with BCH balances', () => {
+ useContextMock.mockReturnValue(walletWithBalancesMock);
+ const testBCH = new BCHJS();
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Airdrop jestBCH={testBCH} />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Wallet with BCH balances and tokens', () => {
+ useContextMock.mockReturnValue(walletWithBalancesAndTokens);
+ const testBCH = new BCHJS();
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Airdrop jestBCH={testBCH} />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Wallet with BCH balances and tokens and state field', () => {
+ useContextMock.mockReturnValue(walletWithBalancesAndTokensWithCorrectState);
+ const testBCH = new BCHJS();
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Airdrop jestBCH={testBCH} />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Without wallet defined', () => {
+ useContextMock.mockReturnValue({
+ wallet: {},
+ balances: { totalBalance: 0 },
+ loading: false,
+ });
+ const testBCH = new BCHJS();
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Airdrop jestBCH={testBCH} />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
diff --git a/web/cashtab-v2/src/components/Airdrop/__tests__/__snapshots__/Airdrop.test.js.snap b/web/cashtab-v2/src/components/Airdrop/__tests__/__snapshots__/Airdrop.test.js.snap
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Airdrop/__tests__/__snapshots__/Airdrop.test.js.snap
@@ -0,0 +1,400 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP @generated
+
+exports[`Wallet with BCH balances 1`] = `
+Array [
+ <div
+ className="sc-hMqMXs kpJXFt"
+ >
+ <h4
+ className="sc-cMljjf hTVzrw"
+ >
+ MigrationTestAlpha
+ </h4>
+ <div
+ className="sc-iAyFgw hxUtff"
+ >
+ You currently have 0
+ XEC
+ <br />
+ Deposit some funds to use this feature
+ </div>
+ </div>,
+ <br />,
+ <div
+ className="sc-jKJlTe iSWneW"
+ >
+ <div
+ className="ant-row"
+ style={Object {}}
+ type="flex"
+ >
+ <div
+ className="ant-col ant-col-24"
+ style={Object {}}
+ >
+ <div
+ className="ant-collapse ant-collapse-icon-position-left sc-kAzzGY itTQAx"
+ role={null}
+ style={
+ Object {
+ "marginBottom": "24px",
+ }
+ }
+ >
+ <div
+ className="ant-collapse-item"
+ >
+ <div
+ aria-expanded={false}
+ className="ant-collapse-header"
+ onClick={[Function]}
+ onKeyPress={[Function]}
+ role="button"
+ tabIndex={0}
+ >
+ <span
+ aria-label="right"
+ className="anticon anticon-right ant-collapse-arrow"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="right"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"
+ />
+ </svg>
+ </span>
+ XEC Airdrop Calculator
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>,
+]
+`;
+
+exports[`Wallet with BCH balances and tokens 1`] = `
+Array [
+ <div
+ className="sc-hMqMXs kpJXFt"
+ >
+ <h4
+ className="sc-cMljjf hTVzrw"
+ >
+ MigrationTestAlpha
+ </h4>
+ <div
+ className="sc-iAyFgw hxUtff"
+ >
+ You currently have 0
+ XEC
+ <br />
+ Deposit some funds to use this feature
+ </div>
+ </div>,
+ <br />,
+ <div
+ className="sc-jKJlTe iSWneW"
+ >
+ <div
+ className="ant-row"
+ style={Object {}}
+ type="flex"
+ >
+ <div
+ className="ant-col ant-col-24"
+ style={Object {}}
+ >
+ <div
+ className="ant-collapse ant-collapse-icon-position-left sc-kAzzGY itTQAx"
+ role={null}
+ style={
+ Object {
+ "marginBottom": "24px",
+ }
+ }
+ >
+ <div
+ className="ant-collapse-item"
+ >
+ <div
+ aria-expanded={false}
+ className="ant-collapse-header"
+ onClick={[Function]}
+ onKeyPress={[Function]}
+ role="button"
+ tabIndex={0}
+ >
+ <span
+ aria-label="right"
+ className="anticon anticon-right ant-collapse-arrow"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="right"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"
+ />
+ </svg>
+ </span>
+ XEC Airdrop Calculator
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>,
+]
+`;
+
+exports[`Wallet with BCH balances and tokens and state field 1`] = `
+Array [
+ <div
+ className="sc-hMqMXs kpJXFt"
+ >
+ <h4
+ className="sc-cMljjf hTVzrw"
+ >
+ MigrationTestAlpha
+ </h4>
+ <div
+ className="sc-kkGfuU fwBSar"
+ >
+ 0.06
+
+ XEC
+ </div>
+ </div>,
+ <br />,
+ <div
+ className="sc-jKJlTe iSWneW"
+ >
+ <div
+ className="ant-row"
+ style={Object {}}
+ type="flex"
+ >
+ <div
+ className="ant-col ant-col-24"
+ style={Object {}}
+ >
+ <div
+ className="ant-collapse ant-collapse-icon-position-left sc-kAzzGY itTQAx"
+ role={null}
+ style={
+ Object {
+ "marginBottom": "24px",
+ }
+ }
+ >
+ <div
+ className="ant-collapse-item"
+ >
+ <div
+ aria-expanded={false}
+ className="ant-collapse-header"
+ onClick={[Function]}
+ onKeyPress={[Function]}
+ role="button"
+ tabIndex={0}
+ >
+ <span
+ aria-label="right"
+ className="anticon anticon-right ant-collapse-arrow"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="right"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"
+ />
+ </svg>
+ </span>
+ XEC Airdrop Calculator
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>,
+]
+`;
+
+exports[`Wallet without BCH balance 1`] = `
+Array [
+ <div
+ className="sc-hMqMXs kpJXFt"
+ >
+ <h4
+ className="sc-cMljjf hTVzrw"
+ >
+ MigrationTestAlpha
+ </h4>
+ <div
+ className="sc-iAyFgw hxUtff"
+ >
+ You currently have 0
+ XEC
+ <br />
+ Deposit some funds to use this feature
+ </div>
+ </div>,
+ <br />,
+ <div
+ className="sc-jKJlTe iSWneW"
+ >
+ <div
+ className="ant-row"
+ style={Object {}}
+ type="flex"
+ >
+ <div
+ className="ant-col ant-col-24"
+ style={Object {}}
+ >
+ <div
+ className="ant-collapse ant-collapse-icon-position-left sc-kAzzGY itTQAx"
+ role={null}
+ style={
+ Object {
+ "marginBottom": "24px",
+ }
+ }
+ >
+ <div
+ className="ant-collapse-item"
+ >
+ <div
+ aria-expanded={false}
+ className="ant-collapse-header"
+ onClick={[Function]}
+ onKeyPress={[Function]}
+ role="button"
+ tabIndex={0}
+ >
+ <span
+ aria-label="right"
+ className="anticon anticon-right ant-collapse-arrow"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="right"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"
+ />
+ </svg>
+ </span>
+ XEC Airdrop Calculator
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>,
+]
+`;
+
+exports[`Without wallet defined 1`] = `
+Array [
+ <div
+ className="sc-hMqMXs kpJXFt"
+ >
+ <div
+ className="sc-iAyFgw hxUtff"
+ >
+ You currently have 0
+ XEC
+ <br />
+ Deposit some funds to use this feature
+ </div>
+ </div>,
+ <br />,
+ <div
+ className="sc-jKJlTe iSWneW"
+ >
+ <div
+ className="ant-row"
+ style={Object {}}
+ type="flex"
+ >
+ <div
+ className="ant-col ant-col-24"
+ style={Object {}}
+ >
+ <div
+ className="ant-collapse ant-collapse-icon-position-left sc-kAzzGY itTQAx"
+ role={null}
+ style={
+ Object {
+ "marginBottom": "24px",
+ }
+ }
+ >
+ <div
+ className="ant-collapse-item"
+ >
+ <div
+ aria-expanded={false}
+ className="ant-collapse-header"
+ onClick={[Function]}
+ onKeyPress={[Function]}
+ role="button"
+ tabIndex={0}
+ >
+ <span
+ aria-label="right"
+ className="anticon anticon-right ant-collapse-arrow"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="right"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"
+ />
+ </svg>
+ </span>
+ XEC Airdrop Calculator
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>,
+]
+`;
diff --git a/web/cashtab-v2/src/components/App.css b/web/cashtab-v2/src/components/App.css
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/App.css
@@ -0,0 +1,65 @@
+@import '~antd/dist/antd.less';
+@import '~@fortawesome/fontawesome-free/css/all.css';
+@import url('https://fonts.googleapis.com/css?family=Khula&display=swap&.css');
+
+@font-face {
+ font-family: 'Poppins';
+ src: local('Poppins'),
+ url(../assets/fonts/Poppins-Regular.ttf) format('truetype');
+ font-weight: normal;
+}
+
+@font-face {
+ font-family: 'Poppins';
+ src: local('Poppins'),
+ url(../assets/fonts/Poppins-Bold.ttf) format('truetype');
+ font-weight: 700;
+}
+
+/* Hide scrollbars but keep functionality*/
+/* Hide scrollbar for Chrome, Safari and Opera */
+body::-webkit-scrollbar {
+ display: none;
+}
+
+/* Hide scrollbar for IE, Edge and Firefox */
+body {
+ -ms-overflow-style: none; /* IE and Edge */
+ scrollbar-width: none; /* Firefox */
+}
+/* Hide up and down arros on input type="number" */
+/* Chrome, Safari, Edge, Opera */
+input::-webkit-outer-spin-button,
+input::-webkit-inner-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+}
+
+/* Hide up and down arros on input type="number" */
+/* Firefox */
+input[type='number'] {
+ -moz-appearance: textfield;
+}
+
+html,
+body {
+ max-width: 100%;
+ overflow-x: hidden;
+}
+
+/* Hide scroll bars on antd modals*/
+.ant-modal-wrap.ant-modal-centered::-webkit-scrollbar {
+ display: none;
+}
+
+/* ITEMS BELOW TO BE MOVED TO STYLED COMPONENTS*/
+
+/* useWallet.js, useBCH.js */
+@media (max-width: 768px) {
+ .ant-notification {
+ width: 100%;
+ top: 20px !important;
+ max-width: unset;
+ margin-right: 0;
+ }
+}
diff --git a/web/cashtab-v2/src/components/App.js b/web/cashtab-v2/src/components/App.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/App.js
@@ -0,0 +1,378 @@
+import React, { useState } from 'react';
+import 'antd/dist/antd.less';
+import { Spin } from 'antd';
+import {
+ CashLoadingIcon,
+ HomeIcon,
+ SendIcon,
+ ReceiveIcon,
+ SettingsIcon,
+ AirdropIcon,
+} from '@components/Common/CustomIcons';
+import '../index.css';
+import styled, { ThemeProvider, createGlobalStyle } from 'styled-components';
+import { theme } from '@assets/styles/theme';
+import Home from '@components/Home/Home';
+import Receive from '@components/Receive/Receive';
+import Tokens from '@components/Tokens/Tokens';
+import Send from '@components/Send/Send';
+import SendToken from '@components/Send/SendToken';
+import Airdrop from '@components/Airdrop/Airdrop';
+import Configure from '@components/Configure/Configure';
+import NotFound from '@components/NotFound';
+import CashTab from '@assets/cashtab_xec.png';
+import './App.css';
+import { WalletContext } from '@utils/context';
+import { isValidStoredWallet } from '@utils/cashMethods';
+import {
+ Route,
+ Redirect,
+ Switch,
+ useLocation,
+ useHistory,
+} from 'react-router-dom';
+// Easter egg imports not used in extension/src/components/App.js
+import TabCash from '@assets/tabcash.png';
+import { checkForTokenById } from '@utils/tokenMethods.js';
+// Biometric security import not used in extension/src/components/App.js
+import ProtectableComponentWrapper from './Authentication/ProtectableComponentWrapper';
+
+const GlobalStyle = createGlobalStyle`
+ *::placeholder {
+ color: ${props => props.theme.forms.placeholder} !important;
+ }
+ *::selection {
+ background: ${props => props.theme.eCashBlue} !important;
+ }
+ .ant-modal-content, .ant-modal-header, .ant-modal-title {
+ background-color: ${props => props.theme.modal.background} !important;
+ color: ${props => props.theme.modal.color} !important;
+ }
+ .ant-modal-content svg {
+ fill: ${props => props.theme.modal.color};
+ }
+ .ant-modal-footer button {
+ background-color: ${props =>
+ props.theme.modal.buttonBackground} !important;
+ color: ${props => props.theme.modal.color} !important;
+ border-color: ${props => props.theme.modal.border} !important;
+ :hover {
+ background-color: ${props => props.theme.eCashBlue} !important;
+ }
+ }
+ .ant-modal-wrap > div > div.ant-modal-content > div > div > div.ant-modal-confirm-btns > button, .ant-modal > button, .ant-modal-confirm-btns > button, .ant-modal-footer > button, #cropControlsConfirm {
+ border-radius: 3px;
+ background-color: ${props =>
+ props.theme.modal.buttonBackground} !important;
+ color: ${props => props.theme.modal.color} !important;
+ border-color: ${props => props.theme.modal.border} !important;
+ :hover {
+ background-color: ${props => props.theme.eCashBlue} !important;
+ }
+ text-shadow: none !important;
+ }
+
+ .ant-modal-wrap > div > div.ant-modal-content > div > div > div.ant-modal-confirm-btns > button:hover,.ant-modal-confirm-btns > button:hover, .ant-modal-footer > button:hover, #cropControlsConfirm:hover {
+ color: ${props => props.theme.contrast};
+ transition: all 0.3s;
+ background-color: ${props => props.theme.eCashBlue};
+ border-color: ${props => props.theme.eCashBlue};
+ }
+ .selectedCurrencyOption, .ant-select-dropdown {
+ text-align: left;
+ color: ${props => props.theme.contrast} !important;
+ background-color: ${props =>
+ props.theme.collapses.expandedBackground} !important;
+ }
+ .cashLoadingIcon {
+ color: ${props => props.theme.eCashBlue} !important;
+ font-size: 48px !important;
+ }
+ .selectedCurrencyOption:hover {
+ color: ${props => props.theme.contrast} !important;
+ background-color: ${props => props.theme.eCashBlue} !important;
+ }
+ #addrSwitch, #cropSwitch {
+ .ant-switch-checked {
+ background-color: white !important;
+ }
+ }
+ #addrSwitch.ant-switch-checked, #cropSwitch.ant-switch-checked {
+ background-image: ${props =>
+ props.theme.buttons.primary.backgroundImage} !important;
+ }
+
+ .ant-slider-rail {
+ background-color: ${props => props.theme.forms.border} !important;
+ }
+ .ant-slider-track {
+ background-color: ${props => props.theme.eCashBlue} !important;
+ }
+ .ant-descriptions-bordered .ant-descriptions-row {
+ background: ${props => props.theme.contrast};
+ }
+ .ant-modal-confirm-content, .ant-modal-confirm-title {
+ color: ${props => props.theme.contrast} !important;
+ }
+`;
+
+const CustomApp = styled.div`
+ text-align: center;
+ font-family: 'Poppins', sans-serif;
+ background-color: ${props => props.theme.backgroundColor};
+ background-size: 100px 171px;
+ background-image: ${props => props.theme.backgroundImage};
+ background-attachment: fixed;
+`;
+
+const Footer = styled.div`
+ z-index: 2;
+ height: 80px;
+ border-top: 1px solid rgba(255, 255, 255, 0.5);
+ background-color: ${props => props.theme.footerBackground};
+ position: fixed;
+ bottom: 0;
+ width: 500px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 0 50px;
+ @media (max-width: 768px) {
+ width: 100%;
+ padding: 0 20px;
+ }
+`;
+
+export const NavButton = styled.button`
+ :focus,
+ :active {
+ outline: none;
+ }
+ cursor: pointer;
+ padding: 0;
+ background: none;
+ border: none;
+ font-size: 10px;
+ svg {
+ fill: ${props => props.theme.contrast};
+ width: 26px;
+ height: auto;
+ }
+ ${({ active, ...props }) =>
+ active &&
+ `
+ color: ${props.theme.navActive};
+ svg {
+ fill: ${props.theme.navActive};
+ }
+ `}
+`;
+
+export const WalletBody = styled.div`
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ min-height: 100vh;
+`;
+
+export const WalletCtn = styled.div`
+ position: relative;
+ width: 500px;
+ min-height: 100vh;
+ padding: 0 0 100px;
+ background: ${props => props.theme.walletBackground};
+ -webkit-box-shadow: 0px 0px 24px 1px ${props => props.theme.shadow};
+ -moz-box-shadow: 0px 0px 24px 1px ${props => props.theme.shadow};
+ box-shadow: 0px 0px 24px 1px ${props => props.theme.shadow};
+ @media (max-width: 768px) {
+ width: 100%;
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+ }
+`;
+
+export const HeaderCtn = styled.div`
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ padding: 15px 0;
+`;
+
+export const CashTabLogo = styled.img`
+ width: 120px;
+ @media (max-width: 768px) {
+ width: 110px;
+ }
+`;
+
+// AbcLogo styled component not included in extension, replaced by open in new tab link
+export const AbcLogo = styled.img`
+ width: 150px;
+ @media (max-width: 768px) {
+ width: 120px;
+ }
+`;
+
+// Easter egg styled component not used in extension/src/components/App.js
+export const EasterEgg = styled.img`
+ position: fixed;
+ bottom: -195px;
+ margin: 0;
+ right: 10%;
+ transition-property: bottom;
+ transition-duration: 1.5s;
+ transition-timing-function: ease-out;
+
+ :hover {
+ bottom: 0;
+ }
+
+ @media screen and (max-width: 1250px) {
+ display: none;
+ }
+`;
+
+const App = () => {
+ const ContextValue = React.useContext(WalletContext);
+ const { wallet, loading } = ContextValue;
+ const [loadingUtxosAfterSend, setLoadingUtxosAfterSend] = useState(false);
+ // If wallet is unmigrated, do not show page until it has migrated
+ // An invalid wallet will be validated/populated after the next API call, ETA 10s
+ const validWallet = isValidStoredWallet(wallet);
+ const location = useLocation();
+ const history = useHistory();
+ const selectedKey =
+ location && location.pathname ? location.pathname.substr(1) : '';
+
+ // Easter egg boolean not used in extension/src/components/App.js
+ const hasTab = validWallet
+ ? checkForTokenById(
+ wallet.state.tokens,
+ '50d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e',
+ )
+ : false;
+
+ return (
+ <ThemeProvider theme={theme}>
+ <GlobalStyle />
+ <Spin
+ spinning={
+ loading || loadingUtxosAfterSend || (wallet && !validWallet)
+ }
+ indicator={CashLoadingIcon}
+ >
+ <CustomApp>
+ <WalletBody>
+ <WalletCtn>
+ <HeaderCtn>
+ <CashTabLogo src={CashTab} alt="cashtab" />
+ {/*Begin component not included in extension as desktop only*/}
+ {hasTab && (
+ <EasterEgg src={TabCash} alt="tabcash" />
+ )}
+ {/*End component not included in extension as desktop only*/}
+ </HeaderCtn>
+ <ProtectableComponentWrapper>
+ <Switch>
+ <Route path="/wallet">
+ <Home />
+ </Route>
+ <Route path="/receive">
+ <Receive
+ passLoadingStatus={
+ setLoadingUtxosAfterSend
+ }
+ />
+ </Route>
+ <Route path="/tokens">
+ <Tokens
+ passLoadingStatus={
+ setLoadingUtxosAfterSend
+ }
+ />
+ </Route>
+ <Route path="/send">
+ <Send
+ passLoadingStatus={
+ setLoadingUtxosAfterSend
+ }
+ />
+ </Route>
+ <Route
+ path="/send-token/:tokenId"
+ render={props => (
+ <SendToken
+ tokenId={
+ props.match.params.tokenId
+ }
+ passLoadingStatus={
+ setLoadingUtxosAfterSend
+ }
+ />
+ )}
+ />
+ <Route path="/airdrop">
+ <Airdrop
+ passLoadingStatus={
+ setLoadingUtxosAfterSend
+ }
+ />
+ </Route>
+ <Route path="/configure">
+ <Configure />
+ </Route>
+ <Redirect exact from="/" to="/wallet" />
+ <Route component={NotFound} />
+ </Switch>
+ </ProtectableComponentWrapper>
+ </WalletCtn>
+ {wallet ? (
+ <Footer>
+ <NavButton
+ active={selectedKey === 'wallet'}
+ onClick={() => history.push('/wallet')}
+ >
+ <HomeIcon />
+ </NavButton>
+
+ <NavButton
+ active={selectedKey === 'send'}
+ onClick={() => history.push('/send')}
+ >
+ <SendIcon
+ style={{
+ marginTop: '-9px',
+ }}
+ />
+ </NavButton>
+ <NavButton
+ active={selectedKey === 'receive'}
+ onClick={() => history.push('receive')}
+ >
+ <ReceiveIcon />
+ </NavButton>
+ <NavButton
+ active={selectedKey === 'airdrop'}
+ onClick={() => history.push('/airdrop')}
+ >
+ <AirdropIcon />
+ </NavButton>
+ <NavButton
+ active={selectedKey === 'configure'}
+ onClick={() => history.push('/configure')}
+ >
+ <SettingsIcon />
+ </NavButton>
+ </Footer>
+ ) : null}
+ </WalletBody>
+ </CustomApp>
+ </Spin>
+ </ThemeProvider>
+ );
+};
+
+export default App;
diff --git a/web/cashtab-v2/src/components/Authentication/ProtectableComponentWrapper.js b/web/cashtab-v2/src/components/Authentication/ProtectableComponentWrapper.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Authentication/ProtectableComponentWrapper.js
@@ -0,0 +1,32 @@
+import React, { useContext } from 'react';
+import { AuthenticationContext } from '@utils/context';
+import SignUp from './SignUp';
+import SignIn from './SignIn';
+
+const ProtectableComponentWrapper = ({ children }) => {
+ const authentication = useContext(AuthenticationContext);
+
+ if (authentication) {
+ const { loading, isAuthenticationRequired, isSignedIn } =
+ authentication;
+
+ if (loading) {
+ return <p>Loading authenticaion data...</p>;
+ }
+
+ // prompt if user would like to enable biometric lock when the app first run
+ if (isAuthenticationRequired === undefined) {
+ return <SignUp />;
+ }
+
+ // prompt user to sign in
+ if (isAuthenticationRequired && !isSignedIn) {
+ return <SignIn />;
+ }
+ }
+
+ // authentication = null => authentication is not supported
+ return <>{children}</>;
+};
+
+export default ProtectableComponentWrapper;
diff --git a/web/cashtab-v2/src/components/Authentication/SignIn.js b/web/cashtab-v2/src/components/Authentication/SignIn.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Authentication/SignIn.js
@@ -0,0 +1,155 @@
+import React, { useContext, useEffect, useState } from 'react';
+import { Modal, Spin } from 'antd';
+import styled from 'styled-components';
+import { AuthenticationContext } from '@utils/context';
+import { ThemedLockOutlined } from '@components/Common/CustomIcons';
+import PrimaryButton from '@components/Common/PrimaryButton';
+import { ReactComponent as FingerprintSVG } from '@assets/fingerprint-solid.svg';
+
+const StyledSignIn = styled.div`
+ h2 {
+ color: ${props => props.theme.contrast};
+ font-size: 25px;
+ }
+ p {
+ color: ${props => props.theme.darkBlue};
+ }
+`;
+
+const UnlockButton = styled(PrimaryButton)`
+ position: relative;
+ width: auto;
+ margin: 30px auto;
+ padding: 20px 30px;
+
+ svg {
+ fill: ${props => props.theme.buttons.primary.color};
+ }
+
+ @media (max-width: 768px) {
+ font-size: 16px;
+ padding: 15px 20px;
+ }
+
+ :disabled {
+ cursor: not-allowed;
+ box-shadow: none;
+ ::after {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: ${props => props.theme.buttons.primary.disabledOverlay};
+ z-index: 10;
+ }
+ }
+`;
+
+const StyledFingerprintIcon = styled.div`
+ width: 48px;
+ height: 48px;
+ margin: auto;
+`;
+
+const SignIn = () => {
+ const authentication = useContext(AuthenticationContext);
+ const [isVisible, setIsVisible] = useState(false);
+ const [isLoading, setIsLoading] = useState(false);
+
+ const handleDocVisibilityChange = () => {
+ document.visibilityState === 'visible'
+ ? setIsVisible(true)
+ : setIsVisible(false);
+ };
+
+ const handleSignIn = async () => {
+ try {
+ setIsLoading(true);
+ await authentication.signIn();
+ } catch (err) {
+ Modal.error({
+ title: 'Authentication Error',
+ content: 'Cannot get Credential from your device',
+ centered: true,
+ });
+ }
+ setIsLoading(false);
+ };
+
+ const handleSignInAndSuppressError = async () => {
+ try {
+ setIsLoading(true);
+ await authentication.signIn();
+ } catch (err) {
+ // fail silently
+ }
+ setIsLoading(false);
+ };
+
+ useEffect(() => {
+ if (document.visibilityState === 'visible') {
+ setIsVisible(true);
+ }
+ document.addEventListener(
+ 'visibilitychange',
+ handleDocVisibilityChange,
+ );
+
+ return () => {
+ document.removeEventListener(
+ 'visibilitychange',
+ handleDocVisibilityChange,
+ );
+ };
+ }, []);
+
+ useEffect(() => {
+ // This will trigger the plaform authenticator as soon as the component becomes visible
+ // (when switch back to this app), without any user gesture (such as clicking a button)
+ // In platforms that require user gesture in order to invoke the platform authenticator,
+ // this will fail. We want it to fail silently, and then show user a button to activate
+ // the platform authenticator
+ if (isVisible && authentication) {
+ handleSignInAndSuppressError();
+ }
+ }, [isVisible]);
+
+ let signInBody;
+ if (authentication) {
+ signInBody = (
+ <>
+ <p>
+ This wallet can be unlocked with your{' '}
+ <strong>fingerprint / device pin</strong>
+ </p>
+ <UnlockButton
+ onClick={handleSignIn}
+ disabled={isLoading ? true : false}
+ >
+ <StyledFingerprintIcon>
+ <FingerprintSVG />
+ </StyledFingerprintIcon>
+ Unlock
+ </UnlockButton>
+ <div>
+ {isLoading ? <Spin tip="loading authenticator" /> : ''}
+ </div>
+ </>
+ );
+ } else {
+ signInBody = <p>Authentication is not supported</p>;
+ }
+
+ return (
+ <StyledSignIn>
+ <h2>
+ <ThemedLockOutlined /> Wallet Unlock
+ </h2>
+ {signInBody}
+ </StyledSignIn>
+ );
+};
+
+export default SignIn;
diff --git a/web/cashtab-v2/src/components/Authentication/SignUp.js b/web/cashtab-v2/src/components/Authentication/SignUp.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Authentication/SignUp.js
@@ -0,0 +1,76 @@
+import React, { useContext } from 'react';
+import { Modal } from 'antd';
+import styled from 'styled-components';
+import { AuthenticationContext } from '@utils/context';
+import { ThemedLockOutlined } from '@components/Common/CustomIcons';
+import PrimaryButton, {
+ SecondaryButton,
+} from '@components/Common/PrimaryButton';
+
+const StyledSignUp = styled.div`
+ padding: 0px 30px;
+ margin-top: 20px;
+ h2 {
+ color: ${props => props.theme.contrast};
+ font-size: 25px;
+ }
+ p {
+ color: ${props => props.theme.contrast};
+ }
+`;
+
+const SignUp = () => {
+ const authentication = useContext(AuthenticationContext);
+
+ const handleSignUp = async () => {
+ try {
+ await authentication.signUp();
+ } catch (err) {
+ Modal.error({
+ title: 'Registration Error',
+ content: 'Cannot create Credential on your device',
+ centered: true,
+ });
+ }
+ };
+
+ let signUpBody;
+ if (authentication) {
+ signUpBody = (
+ <div>
+ <p>Enable wallet lock to protect your funds.</p>
+ <p>
+ You will need to unlock with your{' '}
+ <strong>fingerprint / device pin</strong> in order to access
+ the wallet.
+ </p>
+ <p>
+ This lock can also be enabled / disabled under
+ <br />
+ <strong>Settings / General Settings / App Lock</strong>
+ </p>
+ <PrimaryButton onClick={handleSignUp}>
+ Enable Lock
+ </PrimaryButton>
+ <SecondaryButton
+ onClick={() => authentication.turnOffAuthentication()}
+ >
+ Skip
+ </SecondaryButton>
+ </div>
+ );
+ } else {
+ signUpBody = <p>Authentication is not supported</p>;
+ }
+
+ return (
+ <StyledSignUp>
+ <h2>
+ <ThemedLockOutlined /> Wallet Lock
+ </h2>
+ {signUpBody}
+ </StyledSignUp>
+ );
+};
+
+export default SignUp;
diff --git a/web/cashtab-v2/src/components/Common/ApiError.js b/web/cashtab-v2/src/components/Common/ApiError.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Common/ApiError.js
@@ -0,0 +1,17 @@
+import * as React from 'react';
+import { CashLoader } from '@components/Common/CustomIcons';
+import { AlertMsg } from '@components/Common/Atoms';
+
+const ApiError = () => {
+ return (
+ <>
+ <AlertMsg>
+ <b>API connection lost.</b>
+ <br /> Re-establishing connection...
+ </AlertMsg>
+ <CashLoader />
+ </>
+ );
+};
+
+export default ApiError;
diff --git a/web/cashtab-v2/src/components/Common/Atoms.js b/web/cashtab-v2/src/components/Common/Atoms.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Common/Atoms.js
@@ -0,0 +1,98 @@
+import styled from 'styled-components';
+import { Link } from 'react-router-dom';
+
+export const WarningFont = styled.div`
+ color: ${props => props.theme.wallet.text.primary};
+`;
+
+export const LoadingCtn = styled.div`
+ width: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 400px;
+ flex-direction: column;
+
+ svg {
+ width: 50px;
+ height: 50px;
+ fill: ${props => props.theme.eCashBlue};
+ }
+`;
+
+export const SidePaddingCtn = styled.div`
+ padding: 0px 30px;
+ @media (max-width: 768px) {
+ padding: 0px 15px;
+ }
+`;
+
+export const FormLabel = styled.label`
+ font-size: 16px;
+ margin-bottom: 5px;
+ text-align: left;
+ width: 100%;
+ display: inline-block;
+ color: ${props => props.theme.contrast};
+`;
+
+export const WalletInfoCtn = styled.div`
+ background: ${props => props.theme.walletInfoContainer};
+ width: 100%;
+ padding: 40px 20px;
+`;
+
+export const BalanceHeaderFiatWrap = styled.div`
+ color: ${props => props.theme.contrast};
+ width: 100%;
+ font-size: 16px;
+ @media (max-width: 768px) {
+ font-size: 16px;
+ }
+`;
+
+export const BalanceHeaderWrap = styled.div`
+ color: ${props => props.theme.contrast};
+ width: 100%;
+ font-size: 28px;
+ margin-bottom: 0px;
+ font-weight: bold;
+ line-height: 1.4em;
+ @media (max-width: 768px) {
+ font-size: 24px;
+ }
+`;
+
+export const ZeroBalanceHeader = styled.div`
+ color: ${props => props.theme.contrast};
+ width: 100%;
+ font-size: 14px;
+ margin-bottom: 5px;
+`;
+
+export const TokenParamLabel = styled.span`
+ font-weight: bold;
+`;
+
+export const AlertMsg = styled.p`
+ color: ${props => props.theme.forms.error} !important;
+`;
+
+export const ConvertAmount = styled.div`
+ color: ${props => props.theme.contrast};
+ width: 100%;
+ font-size: 14px;
+ margin-bottom: 10px;
+ @media (max-width: 768px) {
+ font-size: 12px;
+ }
+`;
+
+export const StyledLink = styled(Link)`
+ color: ${props => props.theme.buttons.styledLink};
+ text-decoration: none;
+ padding: 8px;
+ position: relative;
+ border: solid 1px silver;
+ border-radius: 10px;
+`;
diff --git a/web/cashtab-v2/src/components/Common/BalanceHeader.js b/web/cashtab-v2/src/components/Common/BalanceHeader.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Common/BalanceHeader.js
@@ -0,0 +1,20 @@
+import * as React from 'react';
+import PropTypes from 'prop-types';
+import { formatBalance } from '@utils/formatting';
+import { BalanceHeaderWrap } from '@components/Common/Atoms';
+
+const BalanceHeader = ({ balance, ticker }) => {
+ return (
+ <BalanceHeaderWrap>
+ {formatBalance(balance)} {ticker}
+ </BalanceHeaderWrap>
+ );
+};
+
+// balance may be a number (XEC balance) or a BigNumber object (token balance)
+BalanceHeader.propTypes = {
+ balance: PropTypes.oneOfType([PropTypes.number, PropTypes.object]),
+ ticker: PropTypes.string,
+};
+
+export default BalanceHeader;
diff --git a/web/cashtab-v2/src/components/Common/BalanceHeaderFiat.js b/web/cashtab-v2/src/components/Common/BalanceHeaderFiat.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Common/BalanceHeaderFiat.js
@@ -0,0 +1,49 @@
+import * as React from 'react';
+import styled from 'styled-components';
+import PropTypes from 'prop-types';
+import { BalanceHeaderFiatWrap } from '@components/Common/Atoms';
+import { currency } from '@components/Common/Ticker.js';
+const FiatCurrencyToXEC = styled.p`
+ margin: 0 auto;
+ padding: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ color: ${props => props.theme.lightWhite};
+`;
+const BalanceHeaderFiat = ({ balance, settings, fiatPrice }) => {
+ return (
+ <>
+ {fiatPrice && (
+ <BalanceHeaderFiatWrap>
+ {settings
+ ? `${
+ currency.fiatCurrencies[settings.fiatCurrency]
+ .symbol
+ }`
+ : '$'}
+ {parseFloat(
+ (balance * fiatPrice).toFixed(2),
+ ).toLocaleString()}{' '}
+ {settings
+ ? `${currency.fiatCurrencies[
+ settings.fiatCurrency
+ ].slug.toUpperCase()} `
+ : 'USD'}
+ <FiatCurrencyToXEC>
+ 1 {currency.ticker} ={' '}
+ {fiatPrice.toFixed(9).toLocaleString()}{' '}
+ {settings.fiatCurrency.toUpperCase()}
+ </FiatCurrencyToXEC>
+ </BalanceHeaderFiatWrap>
+ )}
+ </>
+ );
+};
+
+BalanceHeaderFiat.propTypes = {
+ balance: PropTypes.number,
+ settings: PropTypes.oneOfType([PropTypes.object, PropTypes.bool]),
+ fiatPrice: PropTypes.number,
+};
+
+export default BalanceHeaderFiat;
diff --git a/web/cashtab-v2/src/components/Common/CropControlModal.js b/web/cashtab-v2/src/components/Common/CropControlModal.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Common/CropControlModal.js
@@ -0,0 +1,59 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import styled from 'styled-components';
+import { Card, Modal } from 'antd';
+
+const CropModal = styled(Modal)`
+ .ant-modal-close-x {
+ font-size: 2px;
+ }
+`;
+
+export const CropperContainer = styled.div`
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 175px;
+`;
+export const ControlsContainer = styled.div`
+ position: absolute;
+ padding: 12px;
+ bottom: 0;
+ left: 50%;
+ width: 50%;
+ transform: translateX(-50%);
+ height: 175px;
+ display: block;
+ align-items: center;
+`;
+
+export const CropControlModal = ({
+ expand,
+ renderExpanded = () => null,
+ onClose,
+ style,
+ ...otherProps
+}) => {
+ return (
+ <CropModal
+ width={'90vw'}
+ height={600}
+ visible={expand}
+ centered
+ footer={null}
+ onCancel={onClose}
+ {...otherProps}
+ >
+ <Card style={{ ...style, width: '100%', height: 600 }}>
+ {renderExpanded()}
+ </Card>
+ </CropModal>
+ );
+};
+CropControlModal.propTypes = {
+ expand: PropTypes.bool,
+ renderExpanded: PropTypes.func,
+ onClose: PropTypes.func,
+ style: PropTypes.object,
+};
diff --git a/web/cashtab-v2/src/components/Common/CustomIcons.js b/web/cashtab-v2/src/components/Common/CustomIcons.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Common/CustomIcons.js
@@ -0,0 +1,110 @@
+import * as React from 'react';
+import styled from 'styled-components';
+import {
+ CopyOutlined,
+ DollarOutlined,
+ LoadingOutlined,
+ WalletOutlined,
+ QrcodeOutlined,
+ SettingOutlined,
+ LockOutlined,
+} from '@ant-design/icons';
+import { Image } from 'antd';
+import { currency } from '@components/Common/Ticker';
+import { ReactComponent as Send } from '@assets/send.svg';
+import { ReactComponent as Receive } from '@assets/receive.svg';
+import { ReactComponent as Genesis } from '@assets/flask.svg';
+import { ReactComponent as Unparsed } from '@assets/alert-circle.svg';
+import { ReactComponent as Home } from '@assets/home.svg';
+import { ReactComponent as Settings } from '@assets/cog.svg';
+import { ReactComponent as CopySolid } from '@assets/copy.svg';
+import { ReactComponent as LinkSolid } from '@assets/external-link-square-alt.svg';
+import { ReactComponent as Airdrop } from '@assets/airdrop-icon.svg';
+
+export const CashLoadingIcon = <LoadingOutlined className="cashLoadingIcon" />;
+
+export const CashReceivedNotificationIcon = () => (
+ <Image height={'33px'} width={'30px'} src={currency.logo} preview={false} />
+);
+export const TokenReceivedNotificationIcon = () => (
+ <Image
+ src={currency.tokenLogo}
+ height={'33px'}
+ width={'30px'}
+ preview={false}
+ />
+);
+
+export const MessageSignedNotificationIcon = () => (
+ <Image
+ src={currency.tokenLogo}
+ height={'33px'}
+ width={'30px'}
+ preview={false}
+ />
+);
+export const ThemedCopyOutlined = styled(CopyOutlined)`
+ color: ${props => props.theme.icons.outlined} !important;
+`;
+export const ThemedDollarOutlined = styled(DollarOutlined)`
+ color: ${props => props.theme.icons.outlined} !important;
+`;
+export const ThemedWalletOutlined = styled(WalletOutlined)`
+ color: ${props => props.theme.icons.outlined} !important;
+`;
+export const ThemedQrcodeOutlined = styled(QrcodeOutlined)`
+ color: ${props => props.theme.walletBackground} !important;
+`;
+export const ThemedSettingOutlined = styled(SettingOutlined)`
+ color: ${props => props.theme.icons.outlined} !important;
+`;
+export const ThemedLockOutlined = styled(LockOutlined)`
+ color: ${props => props.theme.icons.outlined} !important;
+`;
+
+export const ThemedCopySolid = styled(CopySolid)`
+ fill: ${props => props.theme.contrast};
+ padding: 0rem 0rem 0.27rem 0rem;
+ height: 1.3em;
+ width: 1.3em;
+`;
+
+export const ThemedLinkSolid = styled(LinkSolid)`
+ fill: ${props => props.theme.contrast};
+ padding: 0.15rem 0rem 0.18rem 0rem;
+ height: 1.3em;
+ width: 1.3em;
+`;
+
+export const LoadingBlock = styled.div`
+ width: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 24px;
+ flex-direction: column;
+ svg {
+ width: 50px;
+ height: 50px;
+ fill: ${props => props.theme.eCashBlue};
+ }
+`;
+
+export const CashLoader = () => (
+ <LoadingBlock>
+ <LoadingOutlined />
+ </LoadingBlock>
+);
+
+export const ReceiveIcon = () => <Receive />;
+export const GenesisIcon = () => <Genesis />;
+export const UnparsedIcon = () => <Unparsed />;
+export const HomeIcon = () => <Home />;
+export const SettingsIcon = () => <Settings />;
+
+export const AirdropIcon = () => <Airdrop height={'33px'} width={'30px'} />;
+
+export const SendIcon = styled(Send)`
+ transform: rotate(-35deg);
+`;
+export const CustomSpinner = <LoadingOutlined style={{ fontSize: 24 }} spin />;
diff --git a/web/cashtab-v2/src/components/Common/EnhancedInputs.js b/web/cashtab-v2/src/components/Common/EnhancedInputs.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Common/EnhancedInputs.js
@@ -0,0 +1,375 @@
+import * as React from 'react';
+import PropTypes from 'prop-types';
+import { Form, Input, Select } from 'antd';
+const { TextArea } = Input;
+import {
+ ThemedDollarOutlined,
+ ThemedWalletOutlined,
+} from '@components/Common/CustomIcons';
+import styled, { css } from 'styled-components';
+import ScanQRCode from './ScanQRCode';
+import useBCH from '@hooks/useBCH';
+import { currency } from '@components/Common/Ticker.js';
+
+export const AntdFormCss = css`
+ .ant-input-group-addon {
+ background-color: ${props =>
+ props.theme.forms.addonBackground} !important;
+ border: 1px solid ${props => props.theme.forms.border};
+ color: ${props => props.theme.forms.addonForeground} !important;
+ }
+ input.ant-input,
+ .ant-select-selection {
+ background-color: ${props =>
+ props.theme.forms.selectionBackground} !important;
+ box-shadow: none !important;
+ border-radius: 4px;
+ font-weight: bold;
+ color: ${props => props.theme.forms.text};
+ opacity: 1;
+ height: 45px;
+ }
+ textarea.ant-input,
+ .ant-select-selection {
+ background-color: ${props =>
+ props.theme.forms.selectionBackground} !important;
+ box-shadow: none !important;
+ border-radius: 4px;
+ font-weight: bold;
+ color: ${props => props.theme.forms.text};
+ opacity: 1;
+ height: 50px;
+ min-height: 100px;
+ }
+ .ant-input-affix-wrapper {
+ background-color: ${props => props.theme.forms.selectionBackground};
+ border: 1px solid ${props => props.theme.forms.border} !important;
+ }
+ .ant-input-wrapper .anticon-qrcode {
+ color: ${props => props.theme.forms.addonForeground} !important;
+ }
+ input.ant-input::placeholder,
+ .ant-select-selection::placeholder {
+ color: ${props => props.theme.forms.placeholder} !important;
+ }
+ .ant-select-selector {
+ height: 55px !important;
+ border: 1px solid ${props => props.theme.forms.border} !important;
+ background-color: ${props =>
+ props.theme.forms.selectionBackground}!important;
+ }
+ .ant-form-item-has-error
+ > div
+ > div.ant-form-item-control-input
+ > div
+ > span
+ > span
+ > span.ant-input-affix-wrapper {
+ background-color: ${props => props.theme.forms.selectionBackground};
+ border-color: ${props => props.theme.forms.error} !important;
+ }
+
+ .ant-input:hover {
+ border-color: ${props => props.theme.forms.highlightBox};
+ }
+
+ .ant-form-item-has-error .ant-input,
+ .ant-form-item-has-error .ant-input-affix-wrapper,
+ .ant-form-item-has-error .ant-input:hover,
+ .ant-form-item-has-error .ant-input-affix-wrapper:hover {
+ background-color: ${props => props.theme.forms.selectionBackground};
+ border-color: ${props => props.theme.forms.error} !important;
+ }
+
+ .ant-form-item-has-error
+ .ant-select:not(.ant-select-disabled):not(.ant-select-customize-input)
+ .ant-select-selector {
+ background-color: ${props => props.theme.forms.selectionBackground};
+ border-color: ${props => props.theme.forms.error} !important;
+ }
+ .ant-select-single .ant-select-selector .ant-select-selection-item,
+ .ant-select-single .ant-select-selector .ant-select-selection-placeholder {
+ line-height: 55px;
+ text-align: left;
+ color: ${props => props.theme.forms.text};
+ font-weight: bold;
+ }
+ .ant-form-item-has-error .ant-input-group-addon {
+ color: ${props => props.theme.forms.error} !important;
+ border-color: ${props => props.theme.forms.error} !important;
+ }
+ .ant-form-item-explain.ant-form-item-explain-error {
+ color: ${props => props.theme.forms.error} !important;
+ }
+`;
+
+export const AntdFormWrapper = styled.div`
+ ${AntdFormCss}
+`;
+
+export const InputAddonText = styled.span`
+ width: 100%;
+ height: 100%;
+ display: block;
+
+ ${props =>
+ props.disabled
+ ? `
+ cursor: not-allowed;
+ `
+ : `cursor: pointer;`}
+`;
+
+export const InputNumberAddonText = styled.span`
+ background-color: ${props => props.theme.forms.addonBackground} !important;
+ border: 1px solid ${props => props.theme.forms.border};
+ color: ${props => props.theme.forms.addonForeground} !important;
+ height: 50px;
+ line-height: 47px;
+
+ * {
+ color: ${props => props.theme.forms.addonForeground} !important;
+ }
+ ${props =>
+ props.disabled
+ ? `
+ cursor: not-allowed;
+ `
+ : `cursor: pointer;`}
+`;
+
+export const SendBchInput = ({
+ onMax,
+ inputProps,
+ selectProps,
+ activeFiatCode,
+ ...otherProps
+}) => {
+ const { Option } = Select;
+ const currencies = [
+ {
+ value: currency.ticker,
+ label: currency.ticker,
+ },
+ {
+ value: activeFiatCode ? activeFiatCode : 'USD',
+ label: activeFiatCode ? activeFiatCode : 'USD',
+ },
+ ];
+ const currencyOptions = currencies.map(currency => {
+ return (
+ <Option
+ key={currency.value}
+ value={currency.value}
+ className="selectedCurrencyOption"
+ >
+ {currency.label}
+ </Option>
+ );
+ });
+
+ const CurrencySelect = (
+ <Select
+ defaultValue={currency.ticker}
+ className="select-after"
+ style={{ width: '30%' }}
+ {...selectProps}
+ >
+ {currencyOptions}
+ </Select>
+ );
+ return (
+ <AntdFormWrapper>
+ <Form.Item {...otherProps}>
+ <Input.Group compact>
+ <Input
+ style={{ width: '60%', textAlign: 'left' }}
+ type="number"
+ step={
+ inputProps.dollar === 1
+ ? 0.01
+ : 1 / 10 ** currency.cashDecimals
+ }
+ prefix={
+ inputProps.dollar === 1 ? (
+ <ThemedDollarOutlined />
+ ) : (
+ <img
+ src={currency.logo}
+ alt=""
+ width={16}
+ height={16}
+ />
+ )
+ }
+ {...inputProps}
+ />
+ {CurrencySelect}
+ <InputNumberAddonText
+ style={{
+ width: '10%',
+ height: '55px',
+ lineHeight: '55px',
+ }}
+ disabled={!!(inputProps || {}).disabled}
+ onClick={!(inputProps || {}).disabled && onMax}
+ >
+ max
+ </InputNumberAddonText>
+ </Input.Group>
+ </Form.Item>
+ </AntdFormWrapper>
+ );
+};
+
+SendBchInput.propTypes = {
+ onMax: PropTypes.func,
+ inputProps: PropTypes.object,
+ selectProps: PropTypes.object,
+ activeFiatCode: PropTypes.string,
+};
+
+export const DestinationAmount = ({ onMax, inputProps, ...otherProps }) => {
+ return (
+ <AntdFormWrapper>
+ <Form.Item {...otherProps}>
+ <Input
+ type="number"
+ prefix={
+ <img
+ src={currency.logo}
+ alt=""
+ width={16}
+ height={16}
+ />
+ }
+ addonAfter={
+ <InputAddonText
+ disabled={!!(inputProps || {}).disabled}
+ onClick={!(inputProps || {}).disabled && onMax}
+ >
+ max
+ </InputAddonText>
+ }
+ {...inputProps}
+ />
+ </Form.Item>
+ </AntdFormWrapper>
+ );
+};
+
+DestinationAmount.propTypes = {
+ onMax: PropTypes.func,
+ inputProps: PropTypes.object,
+};
+
+// loadWithCameraOpen prop: if true, load page with camera scanning open
+export const DestinationAddressSingle = ({
+ onScan,
+ loadWithCameraOpen,
+ inputProps,
+ ...otherProps
+}) => {
+ return (
+ <AntdFormWrapper>
+ <Form.Item {...otherProps}>
+ <Input
+ prefix={<ThemedWalletOutlined />}
+ autoComplete="off"
+ addonAfter={
+ <ScanQRCode
+ loadWithCameraOpen={loadWithCameraOpen}
+ onScan={onScan}
+ />
+ }
+ {...inputProps}
+ />
+ </Form.Item>
+ </AntdFormWrapper>
+ );
+};
+
+DestinationAddressSingle.propTypes = {
+ onScan: PropTypes.func,
+ loadWithCameraOpen: PropTypes.bool,
+ inputProps: PropTypes.object,
+};
+
+export const DestinationAddressMulti = ({ inputProps, ...otherProps }) => {
+ return (
+ <AntdFormWrapper>
+ <Form.Item {...otherProps}>
+ <TextArea
+ style={{ height: '189px' }}
+ prefix={<ThemedWalletOutlined />}
+ autoComplete="off"
+ {...inputProps}
+ />
+ </Form.Item>
+ </AntdFormWrapper>
+ );
+};
+
+DestinationAddressMulti.propTypes = {
+ inputProps: PropTypes.object,
+};
+
+export const CurrencySelectDropdown = selectProps => {
+ const { Option } = Select;
+
+ // Build select dropdown from currency.fiatCurrencies
+ const currencyMenuOptions = [];
+ const currencyKeys = Object.keys(currency.fiatCurrencies);
+ for (let i = 0; i < currencyKeys.length; i += 1) {
+ const currencyMenuOption = {};
+ currencyMenuOption.value =
+ currency.fiatCurrencies[currencyKeys[i]].slug;
+ currencyMenuOption.label = `${
+ currency.fiatCurrencies[currencyKeys[i]].name
+ } (${currency.fiatCurrencies[currencyKeys[i]].symbol})`;
+ currencyMenuOptions.push(currencyMenuOption);
+ }
+ const currencyOptions = currencyMenuOptions.map(currencyMenuOption => {
+ return (
+ <Option
+ key={currencyMenuOption.value}
+ value={currencyMenuOption.value}
+ className="selectedCurrencyOption"
+ >
+ {currencyMenuOption.label}
+ </Option>
+ );
+ });
+
+ return (
+ <Select
+ className="select-after"
+ style={{
+ width: '100%',
+ }}
+ {...selectProps}
+ >
+ {currencyOptions}
+ </Select>
+ );
+};
+
+export const AddressValidators = () => {
+ const { BCH } = useBCH();
+
+ return {
+ safelyDetectAddressFormat: value => {
+ try {
+ return BCH.Address.detectAddressFormat(value);
+ } catch (error) {
+ return null;
+ }
+ },
+ isSLPAddress: value =>
+ AddressValidators.safelyDetectAddressFormat(value) === 'slpaddr',
+ isBCHAddress: value =>
+ AddressValidators.safelyDetectAddressFormat(value) === 'cashaddr',
+ isLegacyAddress: value =>
+ AddressValidators.safelyDetectAddressFormat(value) === 'legacy',
+ }();
+};
diff --git a/web/cashtab-v2/src/components/Common/Notifications.js b/web/cashtab-v2/src/components/Common/Notifications.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Common/Notifications.js
@@ -0,0 +1,210 @@
+import * as React from 'react';
+import { notification } from 'antd';
+import {
+ CashReceivedNotificationIcon,
+ TokenReceivedNotificationIcon,
+} from '@components/Common/CustomIcons';
+import Paragraph from 'antd/lib/typography/Paragraph';
+import { currency } from '@components/Common/Ticker';
+import { MessageSignedNotificationIcon } from '@components/Common/CustomIcons';
+import { isMobile } from 'react-device-detect';
+
+const getDeviceNotificationStyle = () => {
+ if (isMobile) {
+ const notificationStyle = {
+ width: '100%',
+ marginTop: '10%',
+ };
+ return notificationStyle;
+ }
+ if (!isMobile) {
+ const notificationStyle = {
+ width: '100%',
+ };
+ return notificationStyle;
+ }
+};
+
+// Success Notifications:
+const sendXecNotification = link => {
+ const notificationStyle = getDeviceNotificationStyle();
+ notification.success({
+ message: 'Success',
+ description: (
+ <a href={link} target="_blank" rel="noopener noreferrer">
+ <Paragraph>
+ Transaction successful. Click to view in block explorer.
+ </Paragraph>
+ </a>
+ ),
+ duration: currency.notificationDurationShort,
+ icon: <CashReceivedNotificationIcon />,
+ style: notificationStyle,
+ });
+};
+
+const createTokenNotification = link => {
+ const notificationStyle = getDeviceNotificationStyle();
+ notification.success({
+ message: 'Success',
+ description: (
+ <a href={link} target="_blank" rel="noopener noreferrer">
+ <Paragraph>
+ Token created! Click to view in block explorer.
+ </Paragraph>
+ </a>
+ ),
+ icon: <TokenReceivedNotificationIcon />,
+ style: notificationStyle,
+ });
+};
+
+const tokenIconSubmitSuccess = () => {
+ const notificationStyle = getDeviceNotificationStyle();
+ notification.success({
+ message: 'Success',
+ description: (
+ <Paragraph>Your eToken icon was successfully submitted.</Paragraph>
+ ),
+ icon: <TokenReceivedNotificationIcon />,
+ style: notificationStyle,
+ });
+};
+
+const sendTokenNotification = link => {
+ const notificationStyle = getDeviceNotificationStyle();
+ notification.success({
+ message: 'Success',
+ description: (
+ <a href={link} target="_blank" rel="noopener noreferrer">
+ <Paragraph>
+ Transaction successful. Click to view in block explorer.
+ </Paragraph>
+ </a>
+ ),
+ duration: currency.notificationDurationShort,
+ icon: <TokenReceivedNotificationIcon />,
+ style: notificationStyle,
+ });
+};
+
+const burnTokenNotification = link => {
+ const notificationStyle = getDeviceNotificationStyle();
+ notification.success({
+ message: 'Success',
+ description: (
+ <a href={link} target="_blank" rel="noopener noreferrer">
+ <Paragraph>
+ eToken burn successful. Click to view in block explorer.
+ </Paragraph>
+ </a>
+ ),
+ duration: currency.notificationDurationLong,
+ icon: <TokenReceivedNotificationIcon />,
+ style: notificationStyle,
+ });
+};
+
+const xecReceivedNotification = (
+ balances,
+ previousBalances,
+ cashtabSettings,
+ fiatPrice,
+) => {
+ const notificationStyle = getDeviceNotificationStyle();
+ notification.success({
+ message: 'Transaction received',
+ description: (
+ <Paragraph>
+ +{' '}
+ {parseFloat(
+ Number(
+ balances.totalBalance - previousBalances.totalBalance,
+ ).toFixed(currency.cashDecimals),
+ ).toLocaleString()}{' '}
+ {currency.ticker}{' '}
+ {cashtabSettings &&
+ cashtabSettings.fiatCurrency &&
+ `(${
+ currency.fiatCurrencies[cashtabSettings.fiatCurrency]
+ .symbol
+ }${(
+ Number(
+ balances.totalBalance -
+ previousBalances.totalBalance,
+ ) * fiatPrice
+ ).toFixed(
+ currency.cashDecimals,
+ )} ${cashtabSettings.fiatCurrency.toUpperCase()})`}
+ </Paragraph>
+ ),
+ duration: currency.notificationDurationShort,
+ icon: <CashReceivedNotificationIcon />,
+ style: notificationStyle,
+ });
+};
+
+const eTokenReceivedNotification = (
+ currency,
+ receivedSlpTicker,
+ receivedSlpQty,
+ receivedSlpName,
+) => {
+ const notificationStyle = getDeviceNotificationStyle();
+ notification.success({
+ message: `${currency.tokenTicker} transaction received: ${receivedSlpTicker}`,
+ description: (
+ <Paragraph>
+ You received {receivedSlpQty.toString()} {receivedSlpName}
+ </Paragraph>
+ ),
+ duration: currency.notificationDurationShort,
+ icon: <TokenReceivedNotificationIcon />,
+ style: notificationStyle,
+ });
+};
+
+// Error Notification:
+
+const errorNotification = (error, message, stringDescribingCallEvent) => {
+ const notificationStyle = getDeviceNotificationStyle();
+ console.log(error, message, stringDescribingCallEvent);
+ notification.error({
+ message: 'Error',
+ description: message,
+ duration: currency.notificationDurationLong,
+ style: notificationStyle,
+ });
+};
+
+const messageSignedNotification = msgSignature => {
+ const notificationStyle = getDeviceNotificationStyle();
+ notification.success({
+ message: 'Message Signature Generated',
+ description: <Paragraph>{msgSignature}</Paragraph>,
+ icon: <MessageSignedNotificationIcon />,
+ style: notificationStyle,
+ });
+};
+
+const generalNotification = (data, msgStr) => {
+ const notificationStyle = getDeviceNotificationStyle();
+ notification.success({
+ message: msgStr,
+ description: data,
+ style: notificationStyle,
+ });
+};
+
+export {
+ sendXecNotification,
+ createTokenNotification,
+ tokenIconSubmitSuccess,
+ sendTokenNotification,
+ xecReceivedNotification,
+ eTokenReceivedNotification,
+ errorNotification,
+ messageSignedNotification,
+ generalNotification,
+ burnTokenNotification,
+};
diff --git a/web/cashtab-v2/src/components/Common/PrimaryButton.js b/web/cashtab-v2/src/components/Common/PrimaryButton.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Common/PrimaryButton.js
@@ -0,0 +1,98 @@
+import styled from 'styled-components';
+
+const PrimaryButton = styled.button`
+ border: 2px solid ${props => props.theme.eCashBlue};
+ color: ${props => props.theme.buttons.primary.color};
+ background: none;
+ font-weight: bold;
+ background-color: ${props => props.theme.eCashBlue};
+ transition: all 0.5s ease;
+ background-size: 200% auto;
+ font-size: 18px;
+ width: 100%;
+ padding: 20px 0;
+ border-radius: 0px;
+ margin-bottom: 20px;
+ cursor: pointer;
+ :hover {
+ background-position: right center;
+ -webkit-box-shadow: ${props => props.theme.buttons.primary.hoverShadow};
+ -moz-box-shadow: ${props => props.theme.buttons.primary.hoverShadow};
+ box-shadow: ${props => props.theme.buttons.primary.hoverShadow};
+ }
+ svg {
+ fill: ${props => props.theme.buttons.primary.color};
+ }
+ @media (max-width: 768px) {
+ font-size: 16px;
+ padding: 15px 0;
+ }
+`;
+
+const SecondaryButton = styled.button`
+ border: none;
+ color: ${props => props.theme.buttons.secondary.color};
+ background: ${props => props.theme.buttons.secondary.background};
+ transition: all 0.5s ease;
+ font-size: 18px;
+ width: 100%;
+ padding: 15px 0;
+ border-radius: 4px;
+ cursor: not-allowed;
+ outline: none;
+ margin-bottom: 20px;
+ :hover {
+ -webkit-box-shadow: ${props =>
+ props.theme.buttons.secondary.hoverShadow};
+ -moz-box-shadow: ${props => props.theme.buttons.secondary.hoverShadow};
+ box-shadow: ${props => props.theme.buttons.secondary.hoverShadow};
+ }
+ svg {
+ fill: ${props => props.theme.buttons.secondary.color};
+ }
+ @media (max-width: 768px) {
+ font-size: 16px;
+ padding: 12px 0;
+ }
+`;
+
+const SmartButton = styled.button`
+ ${({ disabled = false, ...props }) =>
+ disabled === true
+ ? `
+ background-image: 'none';
+ color: ${props.theme.buttons.secondary.color};
+ background: ${props.theme.buttons.secondary.background};
+ opacity: 0.3;
+ svg {
+ fill: ${props.theme.buttons.secondary.color};
+ }
+ `
+ : `
+ opacity: 1;
+ background-image: 'none';
+ color: ${props.theme.buttons.secondary.color};
+ background: ${props.theme.buttons.secondary.background};
+ svg {
+ fill: ${props.theme.buttons.secondary.color};
+ }
+ `}
+
+ border: none;
+ transition: all 0.5s ease;
+ font-size: 18px;
+ width: 100%;
+ padding: 15px 0;
+ border-radius: 4px;
+ cursor: pointer;
+ outline: none;
+ margin-bottom: 20px;
+
+ @media (max-width: 768px) {
+ font-size: 16px;
+ padding: 12px 0;
+ }
+`;
+
+export default PrimaryButton;
+export { SecondaryButton, SmartButton };
diff --git a/web/cashtab-v2/src/components/Common/QRCode.js b/web/cashtab-v2/src/components/Common/QRCode.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Common/QRCode.js
@@ -0,0 +1,244 @@
+import React, { useState } from 'react';
+import styled from 'styled-components';
+import RawQRCode from 'qrcode.react';
+import { currency } from '@components/Common/Ticker.js';
+import { CopyToClipboard } from 'react-copy-to-clipboard';
+import { Event } from '@utils/GoogleAnalytics';
+import { convertToEcashPrefix } from '@utils/cashMethods';
+
+export const StyledRawQRCode = styled(RawQRCode)`
+ cursor: pointer;
+ border-radius: 10px;
+ background: ${props => props.theme.qr.background};
+ margin-bottom: 10px;
+ path:first-child {
+ fill: ${props => props.theme.qr.background};
+ }
+ :hover {
+ border-color: ${({ xec = 0, ...props }) =>
+ xec === 1 ? props.theme.eCashBlue : props.theme.eCashPurple};
+ }
+ @media (max-width: 768px) {
+ border-radius: 18px;
+ width: 170px;
+ height: 170px;
+ }
+`;
+
+const Copied = styled.div`
+ font-size: 18px;
+ font-weight: bold;
+ width: 100%;
+ text-align: center;
+ background-color: ${({ xec = 0, ...props }) =>
+ xec === 1 ? props.theme.eCashBlue : props.theme.eCashPurple};
+ border: 1px solid;
+ border-color: ${({ xec = 0, ...props }) =>
+ xec === 1 ? props.theme.eCashBlue : props.theme.eCashPurple};
+ color: ${props => props.theme.contrast};
+ position: absolute;
+ top: 65px;
+ padding: 30px 0;
+ @media (max-width: 768px) {
+ top: 52px;
+ padding: 20px 0;
+ }
+`;
+const PrefixLabel = styled.span`
+ text-align: right;
+ font-weight: bold;
+ color: ${({ xec = 0, ...props }) =>
+ xec === 1 ? props.theme.eCashBlue : props.theme.eCashPurple};
+ @media (max-width: 768px) {
+ font-size: 12px;
+ }
+ @media (max-width: 400px) {
+ font-size: 10px;
+ }
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+`;
+const AddressHighlightTrim = styled.span`
+ font-weight: bold;
+ color: ${props => props.theme.contrast};
+ @media (max-width: 768px) {
+ font-size: 12px;
+ }
+ @media (max-width: 400px) {
+ font-size: 10px;
+ }
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+`;
+
+const CustomInput = styled.div`
+ font-size: 14px;
+ color: ${props => props.theme.lightWhite};
+ text-align: center;
+ cursor: pointer;
+ margin-bottom: 10px;
+ padding: 6px 0;
+ font-family: 'Roboto Mono', monospace;
+ border-radius: 5px;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+
+ input {
+ border: none;
+ width: 100%;
+ text-align: center;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ cursor: pointer;
+ color: ${props => props.theme.contrast};
+ padding: 10px 0;
+ background: transparent;
+ margin-bottom: 15px;
+ display: none;
+ }
+ input:focus {
+ outline: none;
+ }
+ input::selection {
+ background: transparent;
+ color: ${props => props.theme.contrast};
+ }
+ @media (max-width: 768px) {
+ font-size: 10px;
+ input {
+ font-size: 10px;
+ margin-bottom: 10px;
+ }
+ }
+ @media (max-width: 400px) {
+ font-size: 7px;
+ input {
+ font-size: 10px;
+ margin-bottom: 10px;
+ }
+ }
+`;
+
+export const QRCode = ({
+ address,
+ isCashAddress,
+ size = 210,
+ onClick = () => null,
+ ...otherProps
+}) => {
+ address = address ? convertToEcashPrefix(address) : '';
+
+ const [visible, setVisible] = useState(false);
+ const trimAmount = 8;
+ const address_trim = address ? address.length - trimAmount : '';
+ const addressSplit = address ? address.split(':') : [''];
+ const addressPrefix = addressSplit[0];
+ const prefixLength = addressPrefix.length + 1;
+
+ const txtRef = React.useRef(null);
+
+ const handleOnClick = evt => {
+ setVisible(true);
+ setTimeout(() => {
+ setVisible(false);
+ }, 1500);
+ onClick(evt);
+ };
+
+ const handleOnCopy = () => {
+ // Event.("Category", "Action", "Label")
+ // xec or etoken?
+ let eventLabel = currency.ticker;
+ if (address && !isCashAddress) {
+ eventLabel = currency.tokenTicker;
+ // Event('Category', 'Action', 'Label')
+ Event('Wallet', 'Copy Address', eventLabel);
+ }
+
+ setVisible(true);
+ setTimeout(() => {
+ txtRef.current.select();
+ }, 100);
+ };
+
+ return (
+ <CopyToClipboard
+ style={{
+ display: 'inline-block',
+ width: '100%',
+ position: 'relative',
+ }}
+ text={address}
+ onCopy={handleOnCopy}
+ >
+ <div style={{ position: 'relative' }} onClick={handleOnClick}>
+ <Copied
+ xec={address && isCashAddress ? 1 : 0}
+ style={{ display: visible ? null : 'none' }}
+ >
+ Copied <br />
+ <span style={{ fontSize: '12px' }}>{address}</span>
+ </Copied>
+
+ <StyledRawQRCode
+ id="borderedQRCode"
+ value={address || ''}
+ size={size}
+ xec={address && isCashAddress ? 1 : 0}
+ renderAs={'svg'}
+ includeMargin
+ imageSettings={{
+ src:
+ address && isCashAddress
+ ? currency.logo
+ : currency.tokenLogo,
+ x: null,
+ y: null,
+ height: 24,
+ width: 24,
+ excavate: true,
+ }}
+ />
+
+ {address && (
+ <CustomInput className="notranslate">
+ <input
+ ref={txtRef}
+ readOnly
+ value={address}
+ spellCheck="false"
+ type="text"
+ />
+ <PrefixLabel xec={address && isCashAddress ? 1 : 0}>
+ {address.slice(0, prefixLength)}
+ </PrefixLabel>
+ <AddressHighlightTrim>
+ {address.slice(
+ prefixLength,
+ prefixLength + trimAmount,
+ )}
+ </AddressHighlightTrim>
+ {address.slice(prefixLength + trimAmount, address_trim)}
+ <AddressHighlightTrim>
+ {address.slice(-trimAmount)}
+ </AddressHighlightTrim>
+ </CustomInput>
+ )}
+ </div>
+ </CopyToClipboard>
+ );
+};
diff --git a/web/cashtab-v2/src/components/Common/ScanQRCode.js b/web/cashtab-v2/src/components/Common/ScanQRCode.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Common/ScanQRCode.js
@@ -0,0 +1,187 @@
+import React, { useState } from 'react';
+import PropTypes from 'prop-types';
+import { Alert, Modal } from 'antd';
+import { ThemedQrcodeOutlined } from '@components/Common/CustomIcons';
+import { errorNotification } from './Notifications';
+import styled from 'styled-components';
+import { BrowserQRCodeReader } from '@zxing/library';
+import { currency, parseAddressForParams } from '@components/Common/Ticker.js';
+import { Event } from '@utils/GoogleAnalytics';
+import { isValidXecAddress, isValidEtokenAddress } from '@utils/validation';
+
+const StyledScanQRCode = styled.span`
+ display: block;
+`;
+
+const StyledModal = styled(Modal)`
+ width: 400px !important;
+ height: 400px !important;
+
+ .ant-modal-close {
+ top: 0 !important;
+ right: 0 !important;
+ }
+`;
+
+const QRPreview = styled.video`
+ width: 100%;
+`;
+
+const ScanQRCode = ({
+ loadWithCameraOpen,
+ onScan = () => null,
+ ...otherProps
+}) => {
+ const [visible, setVisible] = useState(loadWithCameraOpen);
+ const [error, setError] = useState(false);
+ // Use these states to debug video errors on mobile
+ // Note: iOS chrome/brave/firefox does not support accessing camera, will throw error
+ // iOS users can use safari
+ // todo only show scanner with safari
+ //const [mobileError, setMobileError] = useState(false);
+ //const [mobileErrorMsg, setMobileErrorMsg] = useState(false);
+ const [activeCodeReader, setActiveCodeReader] = useState(null);
+
+ const teardownCodeReader = codeReader => {
+ if (codeReader !== null) {
+ codeReader.reset();
+ codeReader.stop();
+ codeReader = null;
+ setActiveCodeReader(codeReader);
+ }
+ };
+
+ const parseContent = content => {
+ let type = 'unknown';
+ let values = {};
+ const addressInfo = parseAddressForParams(content);
+
+ // If what scanner reads from QR code is a valid eCash or eToken address
+ if (
+ isValidXecAddress(addressInfo.address) ||
+ isValidEtokenAddress(content)
+ ) {
+ type = 'address';
+ values = {
+ address: content,
+ };
+ // Event("Category", "Action", "Label")
+ // Track number of successful QR code scans
+ // BCH or slp?
+ let eventLabel = currency.ticker;
+ const isToken = content.split(currency.tokenPrefix).length > 1;
+ if (isToken) {
+ eventLabel = currency.tokenTicker;
+ }
+ Event('ScanQRCode.js', 'Address Scanned', eventLabel);
+ }
+ return { type, values };
+ };
+
+ const scanForQrCode = async () => {
+ const codeReader = new BrowserQRCodeReader();
+ setActiveCodeReader(codeReader);
+
+ try {
+ // Need to execute this before you can decode input
+ // eslint-disable-next-line no-unused-vars
+ const videoInputDevices = await codeReader.getVideoInputDevices();
+ //console.log(`videoInputDevices`, videoInputDevices);
+ //setMobileError(JSON.stringify(videoInputDevices));
+
+ // choose your media device (webcam, frontal camera, back camera, etc.)
+ // TODO implement if necessary
+ //const selectedDeviceId = videoInputDevices[0].deviceId;
+
+ //const previewElem = document.querySelector("#test-area-qr-code-webcam");
+
+ let result = { type: 'unknown', values: {} };
+
+ while (result.type !== 'address') {
+ const content = await codeReader.decodeFromInputVideoDevice(
+ undefined,
+ 'test-area-qr-code-webcam',
+ );
+ result = parseContent(content.text);
+ if (result.type !== 'address') {
+ errorNotification(
+ content.text,
+ `${content.text} is not a valid eCash address`,
+ `${content.text} is not a valid eCash address`,
+ );
+ }
+ }
+ // When you scan a valid address, stop scanning and fill form
+ // Hide the scanner
+ setVisible(false);
+ onScan(result.values.address);
+ return teardownCodeReader(codeReader);
+ } catch (err) {
+ console.log(`Error in QR scanner:`);
+ console.log(err);
+ console.log(JSON.stringify(err.message));
+ //setMobileErrorMsg(JSON.stringify(err.message));
+ setError(err);
+ return teardownCodeReader(codeReader);
+ }
+ };
+
+ React.useEffect(() => {
+ if (!visible) {
+ setError(false);
+ // Stop the camera if user closes modal
+ if (activeCodeReader !== null) {
+ teardownCodeReader(activeCodeReader);
+ }
+ } else {
+ scanForQrCode();
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [visible]);
+
+ return (
+ <>
+ <StyledScanQRCode
+ {...otherProps}
+ onClick={() => setVisible(!visible)}
+ >
+ <ThemedQrcodeOutlined />
+ </StyledScanQRCode>
+ <StyledModal
+ title="Scan QR code"
+ visible={visible}
+ onCancel={() => setVisible(false)}
+ footer={null}
+ >
+ {visible ? (
+ <div>
+ {error ? (
+ <>
+ <Alert
+ message="Error"
+ description="Error in QR scanner. Please ensure your camera is not in use. Due to Apple restrictions on third-party browsers, you must use Safari browser for QR code scanning on an iPhone."
+ type="error"
+ showIcon
+ style={{ textAlign: 'left' }}
+ />
+ {/*
+ <p>{mobileError}</p>
+ <p>{mobileErrorMsg}</p>
+ */}
+ </>
+ ) : (
+ <QRPreview id="test-area-qr-code-webcam"></QRPreview>
+ )}
+ </div>
+ ) : null}
+ </StyledModal>
+ </>
+ );
+};
+
+ScanQRCode.propTypes = {
+ loadWithCameraOpen: PropTypes.bool,
+ onScan: PropTypes.func,
+};
+
+export default ScanQRCode;
diff --git a/web/cashtab-v2/src/components/Common/StyledCollapse.js b/web/cashtab-v2/src/components/Common/StyledCollapse.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Common/StyledCollapse.js
@@ -0,0 +1,114 @@
+import styled from 'styled-components';
+import { Collapse } from 'antd';
+
+export const StyledCollapse = styled(Collapse)`
+ background: ${props => props.theme.collapses.background} !important;
+ border: 1px solid ${props => props.theme.collapses.border} !important;
+
+ .ant-collapse-content {
+ border-top: none;
+ background-color: ${props =>
+ props.theme.collapses.expandedBackground} !important;
+ }
+
+ .ant-collapse-item {
+ border-bottom: none !important;
+ }
+
+ *:not(button) {
+ color: ${props => props.theme.collapses.color} !important;
+ }
+`;
+
+export const TokenCollapse = styled(Collapse)`
+ ${({ disabled = false, ...props }) =>
+ disabled === true
+ ? `
+ background: ${props.theme.buttons.secondary.background} !important;
+ .ant-collapse-header {
+ font-size: 18px;
+ font-weight: bold;
+ color: ${props.theme.buttons.secondary.color} !important;
+ svg {
+ color: ${props.theme.buttons.secondary.color} !important;
+ }
+ }
+ .ant-collapse-arrow {
+ font-size: 18px;
+ }
+ `
+ : `
+ background: ${props.theme.eCashBlue} !important;
+ .ant-collapse-header {
+ font-size: 18px;
+ font-weight: bold;
+ color: ${props.theme.contrast} !important;
+ svg {
+ color: ${props.theme.contrast} !important;
+ }
+ }
+ .ant-collapse-arrow {
+ font-size: 18px;
+ }
+ `}
+`;
+
+export const AdvancedCollapse = styled(Collapse)`
+ .ant-collapse-content {
+ background-color: ${props =>
+ props.theme.advancedCollapse.expandedBackground} !important;
+ }
+ ${({ disabled = false, ...props }) =>
+ disabled === true
+ ? `
+ background: ${props.theme.buttons.secondary.background} !important;
+ .ant-collapse-header {
+ font-size: 18px;
+ font-weight: normal;
+ color: ${props.theme.buttons.secondary.color} !important;
+ svg {
+ color: ${props.theme.buttons.secondary.color} !important;
+ }
+ }
+ .ant-collapse-arrow {
+ font-size: 18px;
+ }
+ `
+ : `
+ background: ${props.theme.advancedCollapse.background} !important;
+ .ant-collapse-header {
+ font-size: 18px;
+ font-weight: bold;
+ color: ${props.theme.advancedCollapse.color} !important;
+ svg {
+ color: ${props.theme.advancedCollapse.icon} !important;
+ }
+ }
+ .ant-collapse-arrow {
+ font-size: 18px;
+ }
+
+ `}
+`;
+
+export const AntdContextCollapseWrapper = styled.div`
+ .ant-collapse {
+ border: none !important;
+ background-color: transparent !important;
+ }
+ .ant-collapse-item {
+ border: none !important;
+ }
+ .ant-collapse-header {
+ padding: 0 !important;
+ color: ${props => props.theme.forms.text} !important;
+ }
+ border-radius: 16px;
+ .ant-collapse-content-box {
+ padding-right: 0 !important;
+ }
+
+ @media screen and (max-width: 500px) {
+ grid-template-columns: 24px 30% 50%;
+ }
+`;
diff --git a/web/cashtab-v2/src/components/Common/Ticker.js b/web/cashtab-v2/src/components/Common/Ticker.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Common/Ticker.js
@@ -0,0 +1,140 @@
+import mainLogo from '@assets/logo_primary.png';
+import tokenLogo from '@assets/logo_secondary.png';
+import BigNumber from 'bignumber.js';
+
+export const currency = {
+ name: 'eCash',
+ ticker: 'XEC',
+ logo: mainLogo,
+ legacyPrefix: 'bitcoincash',
+ prefixes: ['ecash'],
+ coingeckoId: 'ecash',
+ defaultFee: 2.01,
+ dustSats: 550,
+ etokenSats: 546,
+ cashDecimals: 2,
+ blockExplorerUrl: 'https://explorer.bitcoinabc.org',
+ tokenExplorerUrl: 'https://explorer.be.cash',
+ blockExplorerUrlTestnet: 'https://texplorer.bitcoinabc.org',
+ tokenName: 'eToken',
+ tokenTicker: 'eToken',
+ tokenIconSubmitApi: 'https://icons.etokens.cash/new',
+ tokenLogo: tokenLogo,
+ tokenPrefixes: ['etoken'],
+ tokenIconsUrl: 'https://etoken-icons.s3.us-west-2.amazonaws.com',
+ tokenDbUrl: 'https://tokendb.kingbch.com',
+ txHistoryCount: 10,
+ xecApiBatchSize: 20,
+ defaultSettings: { fiatCurrency: 'usd', sendModal: false },
+ notificationDurationShort: 3,
+ notificationDurationLong: 5,
+ newTokenDefaultUrl: 'https://cashtab.com/',
+ opReturn: {
+ opReturnPrefixHex: '6a',
+ opReturnAppPrefixLengthHex: '04',
+ opPushDataOne: '4c',
+ appPrefixesHex: {
+ eToken: '534c5000',
+ cashtab: '00746162',
+ cashtabEncrypted: '65746162',
+ },
+ encryptedMsgCharLimit: 94,
+ unencryptedMsgCharLimit: 160,
+ },
+ settingsValidation: {
+ fiatCurrency: [
+ 'usd',
+ 'idr',
+ 'krw',
+ 'cny',
+ 'zar',
+ 'vnd',
+ 'cad',
+ 'nok',
+ 'eur',
+ 'gbp',
+ 'jpy',
+ 'try',
+ 'rub',
+ 'inr',
+ 'brl',
+ 'php',
+ 'ils',
+ 'clp',
+ 'twd',
+ 'hkd',
+ 'bhd',
+ 'sar',
+ 'aud',
+ 'nzd',
+ 'chf',
+ ],
+ sendModal: [true, false],
+ },
+ fiatCurrencies: {
+ usd: { name: 'US Dollar', symbol: '$', slug: 'usd' },
+ aud: { name: 'Australian Dollar', symbol: '$', slug: 'aud' },
+ bhd: { name: 'Bahraini Dinar', symbol: 'BD', slug: 'bhd' },
+ brl: { name: 'Brazilian Real', symbol: 'R$', slug: 'brl' },
+ gbp: { name: 'British Pound', symbol: '£', slug: 'gbp' },
+ cad: { name: 'Canadian Dollar', symbol: '$', slug: 'cad' },
+ clp: { name: 'Chilean Peso', symbol: '$', slug: 'clp' },
+ cny: { name: 'Chinese Yuan', symbol: '元', slug: 'cny' },
+ eur: { name: 'Euro', symbol: '€', slug: 'eur' },
+ hkd: { name: 'Hong Kong Dollar', symbol: 'HK$', slug: 'hkd' },
+ inr: { name: 'Indian Rupee', symbol: '₹', slug: 'inr' },
+ idr: { name: 'Indonesian Rupiah', symbol: 'Rp', slug: 'idr' },
+ ils: { name: 'Israeli Shekel', symbol: '₪', slug: 'ils' },
+ jpy: { name: 'Japanese Yen', symbol: '¥', slug: 'jpy' },
+ krw: { name: 'Korean Won', symbol: '₩', slug: 'krw' },
+ nzd: { name: 'New Zealand Dollar', symbol: '$', slug: 'nzd' },
+ nok: { name: 'Norwegian Krone', symbol: 'kr', slug: 'nok' },
+ php: { name: 'Philippine Peso', symbol: '₱', slug: 'php' },
+ rub: { name: 'Russian Ruble', symbol: 'р.', slug: 'rub' },
+ twd: { name: 'New Taiwan Dollar', symbol: 'NT$', slug: 'twd' },
+ sar: { name: 'Saudi Riyal', symbol: 'SAR', slug: 'sar' },
+ zar: { name: 'South African Rand', symbol: 'R', slug: 'zar' },
+ chf: { name: 'Swiss Franc', symbol: 'Fr.', slug: 'chf' },
+ try: { name: 'Turkish Lira', symbol: '₺', slug: 'try' },
+ vnd: { name: 'Vietnamese đồng', symbol: 'đ', slug: 'vnd' },
+ },
+};
+
+export function parseAddressForParams(addressString) {
+ // Build return obj
+ const addressInfo = {
+ address: '',
+ queryString: null,
+ amount: null,
+ };
+ // Parse address string for parameters
+ const paramCheck = addressString.split('?');
+
+ let cleanAddress = paramCheck[0];
+ addressInfo.address = cleanAddress;
+
+ // Check for parameters
+ // only the amount param is currently supported
+ let queryString = null;
+ let amount = null;
+ if (paramCheck.length > 1) {
+ queryString = paramCheck[1];
+ addressInfo.queryString = queryString;
+
+ const addrParams = new URLSearchParams(queryString);
+
+ if (addrParams.has('amount')) {
+ // Amount in satoshis
+ try {
+ amount = new BigNumber(parseInt(addrParams.get('amount')))
+ .div(10 ** currency.cashDecimals)
+ .toString();
+ } catch (err) {
+ amount = null;
+ }
+ }
+ }
+
+ addressInfo.amount = amount;
+ return addressInfo;
+}
diff --git a/web/cashtab-v2/src/components/Common/WalletLabel.js b/web/cashtab-v2/src/components/Common/WalletLabel.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Common/WalletLabel.js
@@ -0,0 +1,29 @@
+import * as React from 'react';
+import PropTypes from 'prop-types';
+import styled from 'styled-components';
+
+const WalletName = styled.h4`
+ font-size: 16px;
+ display: inline-block;
+ color: ${props => props.theme.lightWhite};
+ margin-bottom: 0px;
+ @media (max-width: 400px) {
+ font-size: 16px;
+ }
+`;
+
+const WalletLabel = ({ name }) => {
+ return (
+ <>
+ {name && typeof name === 'string' && (
+ <WalletName>{name}</WalletName>
+ )}
+ </>
+ );
+};
+
+WalletLabel.propTypes = {
+ name: PropTypes.string,
+};
+
+export default WalletLabel;
diff --git a/web/cashtab-v2/src/components/Common/__mocks__/copy-to-clipboard.js b/web/cashtab-v2/src/components/Common/__mocks__/copy-to-clipboard.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Common/__mocks__/copy-to-clipboard.js
@@ -0,0 +1,2 @@
+const copy = jest.fn();
+export default copy;
diff --git a/web/cashtab-v2/src/components/Common/__tests__/QRCode.test.js b/web/cashtab-v2/src/components/Common/__tests__/QRCode.test.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Common/__tests__/QRCode.test.js
@@ -0,0 +1,62 @@
+import React from 'react';
+import { render, fireEvent, act } from '@testing-library/react';
+import { QRCode } from '../QRCode';
+import { ThemeProvider } from 'styled-components';
+import { theme } from '@assets/styles/theme';
+
+describe('<QRCode />', () => {
+ jest.useFakeTimers();
+
+ it('QRCode copying ecash address', async () => {
+ const OnClick = jest.fn();
+ const { container } = render(
+ <ThemeProvider theme={theme}>
+ <QRCode
+ pixelRatio={25}
+ onClick={OnClick}
+ address="ecash:qqyumjtrftl5yfdwuglhq6l9af2ner39jqr0wexwyk"
+ legacy={true}
+ />
+ </ThemeProvider>,
+ );
+
+ const qrCodeElement = container.querySelector('#borderedQRCode');
+ fireEvent.click(qrCodeElement);
+
+ act(() => {
+ jest.runAllTimers();
+ });
+ expect(OnClick).toHaveBeenCalled();
+ expect(setTimeout).toHaveBeenCalled();
+ });
+
+ it('QRCode copying eToken address', () => {
+ const OnClick = jest.fn();
+ const { container } = render(
+ <ThemeProvider theme={theme}>
+ <QRCode
+ pixelRatio={25}
+ onClick={OnClick}
+ address="etoken:qqyumjtrftl5yfdwuglhq6l9af2ner39jqd38msfqp"
+ legacy={true}
+ />
+ </ThemeProvider>,
+ );
+ const qrCodeElement = container.querySelector('#borderedQRCode');
+ fireEvent.click(qrCodeElement);
+ expect(OnClick).toHaveBeenCalled();
+ });
+
+ it('QRCode without address', () => {
+ const { container } = render(
+ <ThemeProvider theme={theme}>
+ <QRCode pixelRatio={25} />
+ </ThemeProvider>,
+ );
+
+ const qrCodeElement = container.querySelector('#borderedQRCode');
+ fireEvent.click(qrCodeElement);
+ expect(setTimeout).toHaveBeenLastCalledWith(expect.any(Function), 1500);
+ expect(setTimeout).toHaveBeenCalled();
+ });
+});
diff --git a/web/cashtab-v2/src/components/Common/__tests__/StyledCollapse.test.js b/web/cashtab-v2/src/components/Common/__tests__/StyledCollapse.test.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Common/__tests__/StyledCollapse.test.js
@@ -0,0 +1,15 @@
+import React from 'react';
+import renderer from 'react-test-renderer';
+import { StyledCollapse } from '../StyledCollapse';
+import { ThemeProvider } from 'styled-components';
+import { theme } from '@assets/styles/theme';
+
+test('Render StyledCollapse component', () => {
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <StyledCollapse />
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
diff --git a/web/cashtab-v2/src/components/Common/__tests__/__snapshots__/StyledCollapse.test.js.snap b/web/cashtab-v2/src/components/Common/__tests__/__snapshots__/StyledCollapse.test.js.snap
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Common/__tests__/__snapshots__/StyledCollapse.test.js.snap
@@ -0,0 +1,8 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP @generated
+
+exports[`Render StyledCollapse component 1`] = `
+<div
+ className="ant-collapse ant-collapse-icon-position-left sc-bdVaJa cOUamb"
+ role={null}
+/>
+`;
diff --git a/web/cashtab-v2/src/components/Configure/Configure.js b/web/cashtab-v2/src/components/Configure/Configure.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Configure/Configure.js
@@ -0,0 +1,806 @@
+/* eslint-disable react-hooks/exhaustive-deps */
+import React, { useState, useEffect } from 'react';
+import styled from 'styled-components';
+import { Collapse, Form, Input, Modal, Alert, Switch, Tag } from 'antd';
+import {
+ PlusSquareOutlined,
+ WalletFilled,
+ ImportOutlined,
+ LockOutlined,
+ CheckOutlined,
+ CloseOutlined,
+ LockFilled,
+ ExclamationCircleFilled,
+} from '@ant-design/icons';
+import { WalletContext, AuthenticationContext } from '@utils/context';
+import { SidePaddingCtn } from '@components/Common/Atoms';
+import { StyledCollapse } from '@components/Common/StyledCollapse';
+import {
+ AntdFormWrapper,
+ CurrencySelectDropdown,
+} from '@components/Common/EnhancedInputs';
+import PrimaryButton, {
+ SecondaryButton,
+ SmartButton,
+} from '@components/Common/PrimaryButton';
+import {
+ ThemedCopyOutlined,
+ ThemedWalletOutlined,
+ ThemedDollarOutlined,
+ ThemedSettingOutlined,
+} from '@components/Common/CustomIcons';
+import { ReactComponent as Trashcan } from '@assets/trashcan.svg';
+import { ReactComponent as Edit } from '@assets/edit.svg';
+import { Event } from '@utils/GoogleAnalytics';
+import ApiError from '@components/Common/ApiError';
+import { formatSavedBalance } from '@utils/formatting';
+
+const { Panel } = Collapse;
+
+const SettingsLink = styled.a`
+ text-decoration: underline;
+ color: ${props => props.theme.eCashBlue};
+ :visited {
+ text-decoration: underline;
+ color: ${props => props.theme.eCashBlue};
+ }
+ :hover {
+ color: ${props => props.theme.eCashPurple};
+ }
+`;
+
+const SWRow = styled.div`
+ border-radius: 3px;
+ padding: 10px 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-bottom: 6px;
+ @media (max-width: 500px) {
+ flex-direction: column;
+ margin-bottom: 12px;
+ }
+`;
+
+const SWName = styled.div`
+ width: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ word-wrap: break-word;
+ hyphens: auto;
+
+ @media (max-width: 500px) {
+ width: 100%;
+ justify-content: center;
+ margin-bottom: 15px;
+ }
+
+ h3 {
+ font-size: 16px;
+ color: ${props => props.theme.darkBlue};
+ margin: 0;
+ text-align: center;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+ h3.overflow {
+ width: 100px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+ h3.overflow:hover {
+ background-color: ${props => props.theme.settings.background};
+ overflow: visible;
+ inline-size: 100px;
+ white-space: normal;
+ }
+`;
+
+const SWBalance = styled.div`
+ width: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ word-wrap: break-word;
+ hyphens: auto;
+ @media (max-width: 500px) {
+ width: 100%;
+ justify-content: center;
+ margin-bottom: 15px;
+ }
+ div {
+ font-size: 13px;
+ color: ${props => props.theme.darkBlue};
+ margin: 0;
+ text-align: center;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+ div.overflow {
+ width: 150px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+ div.overflow:hover {
+ background-color: ${props => props.theme.settings.background};
+ overflow: visible;
+ inline-size: 150px;
+ white-space: normal;
+ }
+`;
+
+const SWButtonCtn = styled.div`
+ width: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: flex-end;
+ @media (max-width: 500px) {
+ width: 100%;
+ justify-content: center;
+ }
+
+ button {
+ cursor: pointer;
+ background: transparent;
+ border: 1px solid #fff;
+ box-shadow: none;
+ color: #fff;
+ border-radius: 3px;
+ opacity: 0.6;
+ transition: all 200ms ease-in-out;
+
+ :hover {
+ opacity: 1;
+ background: ${props => props.theme.eCashBlue};
+ border-color: ${props => props.theme.eCashBlue};
+ }
+
+ @media (max-width: 768px) {
+ font-size: 14px;
+ }
+ }
+
+ svg {
+ stroke: ${props => props.theme.eCashBlue};
+ fill: ${props => props.theme.eCashBlue};
+ width: 25px;
+ height: 25px;
+ margin-right: 20px;
+ cursor: pointer;
+
+ :first-child:hover {
+ stroke: ${props => props.theme.eCashBlue};
+ fill: ${props => props.theme.eCashBlue};
+ }
+ :hover {
+ stroke: ${props => props.theme.settings.delete};
+ fill: ${props => props.theme.settings.delete};
+ }
+ }
+`;
+
+const AWRow = styled.div`
+ padding: 10px 0;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 6px;
+ h3 {
+ font-size: 16px;
+ display: inline-block;
+ color: ${props => props.theme.darkBlue};
+ margin: 0;
+ text-align: left;
+ font-weight: bold;
+ @media (max-width: 500px) {
+ font-size: 14px;
+ }
+ }
+ h4 {
+ font-size: 16px;
+ display: inline-block;
+ color: ${props => props.theme.eCashBlue} !important;
+ margin: 0;
+ text-align: right;
+ }
+ @media (max-width: 500px) {
+ flex-direction: column;
+ margin-bottom: 12px;
+ }
+`;
+
+const StyledConfigure = styled.div`
+ h2 {
+ color: ${props => props.theme.contrast};
+ font-size: 25px;
+ }
+ svg {
+ fill: ${props => props.theme.eCashBlue};
+ }
+ p {
+ color: ${props => props.theme.darkBlue};
+ }
+`;
+
+const StyledSpacer = styled.div`
+ height: 1px;
+ width: 100%;
+ background-color: ${props => props.theme.lightWhite};
+ margin: 60px 0 50px;
+`;
+
+const GeneralSettingsItem = styled.div`
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ .ant-switch svg {
+ fill: #717171;
+ }
+ .title {
+ color: ${props => props.theme.contrast};
+ }
+ .anticon {
+ color: ${props => props.theme.contrast};
+ }
+ .ant-switch {
+ background-color: #bdbdbd;
+ }
+ .ant-switch-checked {
+ background-color: ${props => props.theme.eCashBlue};
+ svg {
+ fill: ${props => props.theme.contrast};
+ }
+ }
+`;
+
+const Configure = () => {
+ const ContextValue = React.useContext(WalletContext);
+ const authentication = React.useContext(AuthenticationContext);
+ const { wallet, apiError } = ContextValue;
+
+ const {
+ addNewSavedWallet,
+ activateWallet,
+ renameWallet,
+ deleteWallet,
+ validateMnemonic,
+ getSavedWallets,
+ cashtabSettings,
+ changeCashtabSettings,
+ } = ContextValue;
+ const [savedWallets, setSavedWallets] = useState([]);
+ const [formData, setFormData] = useState({
+ dirty: true,
+ mnemonic: '',
+ });
+ const [showRenameWalletModal, setShowRenameWalletModal] = useState(false);
+ const [showDeleteWalletModal, setShowDeleteWalletModal] = useState(false);
+ const [walletToBeRenamed, setWalletToBeRenamed] = useState(null);
+ const [walletToBeDeleted, setWalletToBeDeleted] = useState(null);
+ const [newWalletName, setNewWalletName] = useState('');
+ const [
+ confirmationOfWalletToBeDeleted,
+ setConfirmationOfWalletToBeDeleted,
+ ] = useState('');
+ const [newWalletNameIsValid, setNewWalletNameIsValid] = useState(null);
+ const [walletDeleteValid, setWalletDeleteValid] = useState(null);
+ const [seedInput, openSeedInput] = useState(false);
+ const [showTranslationWarning, setShowTranslationWarning] = useState(false);
+
+ const showPopulatedDeleteWalletModal = walletInfo => {
+ setWalletToBeDeleted(walletInfo);
+ setShowDeleteWalletModal(true);
+ };
+
+ const showPopulatedRenameWalletModal = walletInfo => {
+ setWalletToBeRenamed(walletInfo);
+ setShowRenameWalletModal(true);
+ };
+ const cancelRenameWallet = () => {
+ // Delete form value
+ setNewWalletName('');
+ setShowRenameWalletModal(false);
+ };
+ const cancelDeleteWallet = () => {
+ setWalletToBeDeleted(null);
+ setConfirmationOfWalletToBeDeleted('');
+ setShowDeleteWalletModal(false);
+ };
+ const updateSavedWallets = async activeWallet => {
+ if (activeWallet) {
+ let savedWallets;
+ try {
+ savedWallets = await getSavedWallets(activeWallet);
+ setSavedWallets(savedWallets);
+ } catch (err) {
+ console.log(`Error in getSavedWallets()`);
+ console.log(err);
+ }
+ }
+ };
+
+ const [isValidMnemonic, setIsValidMnemonic] = useState(null);
+
+ useEffect(() => {
+ // Update savedWallets every time the active wallet changes
+ updateSavedWallets(wallet);
+ }, [wallet]);
+
+ useEffect(() => {
+ const detectedBrowserLang = navigator.language;
+ if (!detectedBrowserLang.includes('en-')) {
+ setShowTranslationWarning(true);
+ }
+ }, []);
+
+ // Need this function to ensure that savedWallets are updated on new wallet creation
+ const updateSavedWalletsOnCreate = async importMnemonic => {
+ // Event("Category", "Action", "Label")
+ // Track number of times a different wallet is activated
+ Event('Configure.js', 'Create Wallet', 'New');
+ const walletAdded = await addNewSavedWallet(importMnemonic);
+ if (!walletAdded) {
+ Modal.error({
+ title: 'This wallet already exists!',
+ content: 'Wallet not added',
+ });
+ } else {
+ Modal.success({
+ content: 'Wallet added to your saved wallets',
+ });
+ }
+ await updateSavedWallets(wallet);
+ };
+ // Same here
+ // TODO you need to lock UI here until this is complete
+ // Otherwise user may try to load an already-loading wallet, wreak havoc with indexedDB
+ const updateSavedWalletsOnLoad = async walletToActivate => {
+ // Event("Category", "Action", "Label")
+ // Track number of times a different wallet is activated
+ Event('Configure.js', 'Activate', '');
+ await activateWallet(walletToActivate);
+ };
+
+ async function submit() {
+ setFormData({
+ ...formData,
+ dirty: false,
+ });
+
+ // Exit if no user input
+ if (!formData.mnemonic) {
+ return;
+ }
+
+ // Exit if mnemonic is invalid
+ if (!isValidMnemonic) {
+ return;
+ }
+ // Event("Category", "Action", "Label")
+ // Track number of times a different wallet is activated
+ Event('Configure.js', 'Create Wallet', 'Imported');
+ updateSavedWalletsOnCreate(formData.mnemonic);
+ }
+
+ const handleChange = e => {
+ const { value, name } = e.target;
+
+ // Validate mnemonic on change
+ // Import button should be disabled unless mnemonic is valid
+ setIsValidMnemonic(validateMnemonic(value));
+
+ setFormData(p => ({ ...p, [name]: value }));
+ };
+
+ const changeWalletName = async () => {
+ if (newWalletName === '' || newWalletName.length > 24) {
+ setNewWalletNameIsValid(false);
+ return;
+ }
+ // Hide modal
+ setShowRenameWalletModal(false);
+ // Change wallet name
+ console.log(
+ `Changing wallet ${walletToBeRenamed.name} name to ${newWalletName}`,
+ );
+ const renameSuccess = await renameWallet(
+ walletToBeRenamed.name,
+ newWalletName,
+ );
+
+ if (renameSuccess) {
+ Modal.success({
+ content: `Wallet "${walletToBeRenamed.name}" renamed to "${newWalletName}"`,
+ });
+ } else {
+ Modal.error({
+ content: `Rename failed. All wallets must have a unique name.`,
+ });
+ }
+ await updateSavedWallets(wallet);
+ // Clear wallet name for form
+ setNewWalletName('');
+ };
+
+ const deleteSelectedWallet = async () => {
+ if (!walletDeleteValid && walletDeleteValid !== null) {
+ return;
+ }
+ if (
+ confirmationOfWalletToBeDeleted !==
+ `delete ${walletToBeDeleted.name}`
+ ) {
+ setWalletDeleteValid(false);
+ return;
+ }
+
+ // Hide modal
+ setShowDeleteWalletModal(false);
+ // Change wallet name
+ console.log(`Deleting wallet "${walletToBeDeleted.name}"`);
+ const walletDeletedSuccess = await deleteWallet(walletToBeDeleted);
+
+ if (walletDeletedSuccess) {
+ Modal.success({
+ content: `Wallet "${walletToBeDeleted.name}" successfully deleted`,
+ });
+ } else {
+ Modal.error({
+ content: `Error deleting ${walletToBeDeleted.name}.`,
+ });
+ }
+ await updateSavedWallets(wallet);
+ // Clear wallet delete confirmation from form
+ setConfirmationOfWalletToBeDeleted('');
+ };
+
+ const handleWalletNameInput = e => {
+ const { value } = e.target;
+ // validation
+ if (value && value.length && value.length < 24) {
+ setNewWalletNameIsValid(true);
+ } else {
+ setNewWalletNameIsValid(false);
+ }
+
+ setNewWalletName(value);
+ };
+
+ const handleWalletToDeleteInput = e => {
+ const { value } = e.target;
+
+ if (value && value === `delete ${walletToBeDeleted.name}`) {
+ setWalletDeleteValid(true);
+ } else {
+ setWalletDeleteValid(false);
+ }
+ setConfirmationOfWalletToBeDeleted(value);
+ };
+
+ const handleAppLockToggle = (checked, e) => {
+ if (checked) {
+ // if there is an existing credential, that means user has registered
+ // simply turn on the Authentication Required flag
+ if (authentication.credentialId) {
+ authentication.turnOnAuthentication();
+ } else {
+ // there is no existing credential, that means user has not registered
+ // user need to register
+ authentication.signUp();
+ }
+ } else {
+ authentication.turnOffAuthentication();
+ }
+ };
+
+ const handleSendModalToggle = checkedState => {
+ changeCashtabSettings('sendModal', checkedState);
+ };
+
+ return (
+ <SidePaddingCtn>
+ <StyledConfigure>
+ {walletToBeRenamed !== null && (
+ <Modal
+ title={`Rename Wallet ${walletToBeRenamed.name}`}
+ visible={showRenameWalletModal}
+ onOk={changeWalletName}
+ onCancel={() => cancelRenameWallet()}
+ >
+ <AntdFormWrapper>
+ <Form style={{ width: 'auto' }}>
+ <Form.Item
+ validateStatus={
+ newWalletNameIsValid === null ||
+ newWalletNameIsValid
+ ? ''
+ : 'error'
+ }
+ help={
+ newWalletNameIsValid === null ||
+ newWalletNameIsValid
+ ? ''
+ : 'Wallet name must be a string between 1 and 24 characters long'
+ }
+ >
+ <Input
+ prefix={<WalletFilled />}
+ placeholder="Enter new wallet name"
+ name="newName"
+ value={newWalletName}
+ onChange={e => handleWalletNameInput(e)}
+ />
+ </Form.Item>
+ </Form>
+ </AntdFormWrapper>
+ </Modal>
+ )}
+ {walletToBeDeleted !== null && (
+ <Modal
+ title={`Are you sure you want to delete wallet "${walletToBeDeleted.name}"?`}
+ visible={showDeleteWalletModal}
+ onOk={deleteSelectedWallet}
+ onCancel={() => cancelDeleteWallet()}
+ >
+ <AntdFormWrapper>
+ <Form style={{ width: 'auto' }}>
+ <Form.Item
+ validateStatus={
+ walletDeleteValid === null ||
+ walletDeleteValid
+ ? ''
+ : 'error'
+ }
+ help={
+ walletDeleteValid === null ||
+ walletDeleteValid
+ ? ''
+ : 'Your confirmation phrase must match exactly'
+ }
+ >
+ <Input
+ prefix={<WalletFilled />}
+ placeholder={`Type "delete ${walletToBeDeleted.name}" to confirm`}
+ name="walletToBeDeletedInput"
+ value={confirmationOfWalletToBeDeleted}
+ onChange={e =>
+ handleWalletToDeleteInput(e)
+ }
+ />
+ </Form.Item>
+ </Form>
+ </AntdFormWrapper>
+ </Modal>
+ )}
+ <h2>
+ <ThemedCopyOutlined /> Backup your wallet
+ </h2>
+ <Alert
+ style={{ marginBottom: '12px' }}
+ description="Your seed phrase is the only way to restore your wallet. Write it down. Keep it safe."
+ type="warning"
+ showIcon
+ />
+ {showTranslationWarning && (
+ <Alert
+ style={{ marginBottom: '12px' }}
+ description="Please do not translate your seed phrase. Store your seed phrase in English. You must re-enter these exact English words to restore your wallet from seed."
+ type="warning"
+ showIcon
+ />
+ )}
+ {wallet && wallet.mnemonic && (
+ <StyledCollapse>
+ <Panel header="Click to reveal seed phrase" key="1">
+ <p
+ className="notranslate"
+ style={{ userSelect: 'text' }}
+ >
+ {wallet && wallet.mnemonic
+ ? wallet.mnemonic
+ : ''}
+ </p>
+ </Panel>
+ </StyledCollapse>
+ )}
+ <StyledSpacer />
+ <h2>
+ <ThemedWalletOutlined /> Manage Wallets
+ </h2>
+ {apiError ? (
+ <ApiError />
+ ) : (
+ <>
+ <PrimaryButton
+ onClick={() => updateSavedWalletsOnCreate()}
+ >
+ <PlusSquareOutlined /> New Wallet
+ </PrimaryButton>
+ <SecondaryButton
+ onClick={() => openSeedInput(!seedInput)}
+ >
+ <ImportOutlined /> Import Wallet
+ </SecondaryButton>
+ {seedInput && (
+ <>
+ <p style={{ color: '#fff' }}>
+ Copy and paste your mnemonic seed phrase
+ below to import an existing wallet
+ </p>
+ <AntdFormWrapper>
+ <Form style={{ width: 'auto' }}>
+ <Form.Item
+ validateStatus={
+ isValidMnemonic === null ||
+ isValidMnemonic
+ ? ''
+ : 'error'
+ }
+ help={
+ isValidMnemonic === null ||
+ isValidMnemonic
+ ? ''
+ : 'Valid mnemonic seed phrase required'
+ }
+ >
+ <Input
+ prefix={<LockOutlined />}
+ type="email"
+ placeholder="mnemonic (seed phrase)"
+ name="mnemonic"
+ autoComplete="off"
+ onChange={e => handleChange(e)}
+ required
+ />
+ </Form.Item>
+ <SmartButton
+ disabled={!isValidMnemonic}
+ onClick={() => submit()}
+ >
+ Import
+ </SmartButton>
+ </Form>
+ </AntdFormWrapper>
+ </>
+ )}
+ </>
+ )}
+ {savedWallets && savedWallets.length > 0 && (
+ <>
+ <StyledCollapse>
+ <Panel header="Saved wallets" key="2">
+ <AWRow>
+ <h3 className="notranslate">
+ {wallet.name}
+ </h3>
+ <h4>Currently active</h4>
+ </AWRow>
+ <div>
+ {savedWallets.map(sw => (
+ <SWRow key={sw.name}>
+ <SWName>
+ <h3 className="overflow notranslate">
+ {sw.name}
+ </h3>
+ </SWName>
+ <SWBalance>
+ <div className="overflow">
+ [
+ {sw && sw.state
+ ? formatSavedBalance(
+ sw.state.balances
+ .totalBalance,
+ )
+ : 'N/A'}{' '}
+ XEC]
+ </div>
+ </SWBalance>
+ <SWButtonCtn>
+ <Edit
+ onClick={() =>
+ showPopulatedRenameWalletModal(
+ sw,
+ )
+ }
+ />
+ <Trashcan
+ onClick={() =>
+ showPopulatedDeleteWalletModal(
+ sw,
+ )
+ }
+ />
+ <button
+ onClick={() =>
+ updateSavedWalletsOnLoad(
+ sw,
+ )
+ }
+ >
+ Activate
+ </button>
+ </SWButtonCtn>
+ </SWRow>
+ ))}
+ </div>
+ </Panel>
+ </StyledCollapse>
+ </>
+ )}
+ <StyledSpacer />
+ <h2>
+ <ThemedDollarOutlined /> Fiat Currency
+ </h2>
+ <AntdFormWrapper>
+ <CurrencySelectDropdown
+ defaultValue={
+ cashtabSettings && cashtabSettings.fiatCurrency
+ ? cashtabSettings.fiatCurrency
+ : 'usd'
+ }
+ onChange={fiatCode =>
+ changeCashtabSettings('fiatCurrency', fiatCode)
+ }
+ />
+ </AntdFormWrapper>
+ <StyledSpacer />
+ <h2>
+ <ThemedSettingOutlined /> General Settings
+ </h2>
+ <GeneralSettingsItem>
+ <div className="title">
+ <LockFilled /> Lock App
+ </div>
+ {authentication ? (
+ <Switch
+ size="small"
+ checkedChildren={<CheckOutlined />}
+ unCheckedChildren={<CloseOutlined />}
+ checked={
+ authentication.isAuthenticationRequired &&
+ authentication.credentialId
+ ? true
+ : false
+ }
+ // checked={false}
+ onChange={handleAppLockToggle}
+ />
+ ) : (
+ <Tag color="warning" icon={<ExclamationCircleFilled />}>
+ Not Supported
+ </Tag>
+ )}
+ </GeneralSettingsItem>
+ <GeneralSettingsItem>
+ <div className="SendConfirm">
+ <LockFilled /> Send Confirmations
+ </div>
+ <Switch
+ size="small"
+ checkedChildren={<CheckOutlined />}
+ unCheckedChildren={<CloseOutlined />}
+ checked={
+ cashtabSettings ? cashtabSettings.sendModal : false
+ }
+ onChange={handleSendModalToggle}
+ />
+ </GeneralSettingsItem>
+ <StyledSpacer />[
+ <SettingsLink
+ type="link"
+ href="https://docs.cashtab.com/docs/"
+ target="_blank"
+ rel="noreferrer"
+ >
+ Documentation
+ </SettingsLink>
+ ]
+ </StyledConfigure>
+ </SidePaddingCtn>
+ );
+};
+
+export default Configure;
diff --git a/web/cashtab-v2/src/components/Configure/__tests__/Configure.test.js b/web/cashtab-v2/src/components/Configure/__tests__/Configure.test.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Configure/__tests__/Configure.test.js
@@ -0,0 +1,36 @@
+import React from 'react';
+import renderer from 'react-test-renderer';
+import Configure from '../Configure';
+import { ThemeProvider } from 'styled-components';
+import { theme } from '@assets/styles/theme';
+let realUseContext;
+let useContextMock;
+beforeEach(() => {
+ realUseContext = React.useContext;
+ useContextMock = React.useContext = jest.fn();
+});
+afterEach(() => {
+ React.useContext = realUseContext;
+});
+
+test('Configure without a wallet', () => {
+ useContextMock.mockReturnValue({ wallet: undefined });
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Configure />
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Configure with a wallet', () => {
+ useContextMock.mockReturnValue({ wallet: { mnemonic: 'test mnemonic' } });
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Configure />
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
diff --git a/web/cashtab-v2/src/components/Configure/__tests__/__snapshots__/Configure.test.js.snap b/web/cashtab-v2/src/components/Configure/__tests__/__snapshots__/Configure.test.js.snap
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Configure/__tests__/__snapshots__/Configure.test.js.snap
@@ -0,0 +1,915 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP @generated
+
+exports[`Configure with a wallet 1`] = `
+<div
+ className="sc-gqjmRU dYraLr"
+>
+ <div
+ className="sc-jlyJG dGBbfI"
+ >
+ <h2>
+ <span
+ aria-label="copy"
+ className="anticon anticon-copy sc-bdVaJa jyutTw"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="copy"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M832 64H296c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h496v688c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V96c0-17.7-14.3-32-32-32zM704 192H192c-17.7 0-32 14.3-32 32v530.7c0 8.5 3.4 16.6 9.4 22.6l173.3 173.3c2.2 2.2 4.7 4 7.4 5.5v1.9h4.2c3.5 1.3 7.2 2 11 2H704c17.7 0 32-14.3 32-32V224c0-17.7-14.3-32-32-32zM350 856.2L263.9 770H350v86.2zM664 888H414V746c0-22.1-17.9-40-40-40H232V264h432v624z"
+ />
+ </svg>
+ </span>
+ Backup your wallet
+ </h2>
+ <div
+ className="ant-alert ant-alert-warning ant-alert-with-description"
+ data-show={true}
+ role="alert"
+ style={
+ Object {
+ "marginBottom": "12px",
+ }
+ }
+ >
+ <span
+ aria-label="exclamation-circle"
+ className="anticon anticon-exclamation-circle ant-alert-icon"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="exclamation-circle"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"
+ />
+ <path
+ d="M464 688a48 48 0 1096 0 48 48 0 10-96 0zm24-112h48c4.4 0 8-3.6 8-8V296c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8z"
+ />
+ </svg>
+ </span>
+ <div
+ className="ant-alert-content"
+ >
+ <div
+ className="ant-alert-message"
+ />
+ <div
+ className="ant-alert-description"
+ >
+ Your seed phrase is the only way to restore your wallet. Write it down. Keep it safe.
+ </div>
+ </div>
+ </div>
+ <div
+ className="ant-collapse ant-collapse-icon-position-left sc-kpOJdX ksHMRx"
+ role={null}
+ >
+ <div
+ className="ant-collapse-item"
+ >
+ <div
+ aria-expanded={false}
+ className="ant-collapse-header"
+ onClick={[Function]}
+ onKeyPress={[Function]}
+ role="button"
+ tabIndex={0}
+ >
+ <span
+ aria-label="right"
+ className="anticon anticon-right ant-collapse-arrow"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="right"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"
+ />
+ </svg>
+ </span>
+ Click to reveal seed phrase
+ </div>
+ </div>
+ </div>
+ <div
+ className="sc-gipzik oErko"
+ />
+ <h2>
+ <span
+ aria-label="wallet"
+ className="anticon anticon-wallet sc-htpNat lgbLiL"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="wallet"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 464H528V448h312v128zm0 264H184V184h656v200H496c-17.7 0-32 14.3-32 32v192c0 17.7 14.3 32 32 32h344v200zM580 512a40 40 0 1080 0 40 40 0 10-80 0z"
+ />
+ </svg>
+ </span>
+ Manage Wallets
+ </h2>
+ <button
+ className="sc-eHgmQL bqOmSo"
+ onClick={[Function]}
+ >
+ <span
+ aria-label="plus-square"
+ className="anticon anticon-plus-square"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="plus-square"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M328 544h152v152c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V544h152c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H544V328c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v152H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z"
+ />
+ <path
+ d="M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"
+ />
+ </svg>
+ </span>
+ New Wallet
+ </button>
+ <button
+ className="sc-cvbbAY dvozVe"
+ onClick={[Function]}
+ >
+ <span
+ aria-label="import"
+ className="anticon anticon-import"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="import"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M888.3 757.4h-53.8c-4.2 0-7.7 3.5-7.7 7.7v61.8H197.1V197.1h629.8v61.8c0 4.2 3.5 7.7 7.7 7.7h53.8c4.2 0 7.7-3.4 7.7-7.7V158.7c0-17-13.7-30.7-30.7-30.7H158.7c-17 0-30.7 13.7-30.7 30.7v706.6c0 17 13.7 30.7 30.7 30.7h706.6c17 0 30.7-13.7 30.7-30.7V765.1c0-4.3-3.5-7.7-7.7-7.7zM902 476H588v-76c0-6.7-7.8-10.5-13-6.3l-141.9 112a8 8 0 000 12.6l141.9 112c5.3 4.2 13 .4 13-6.3v-76h314c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z"
+ />
+ </svg>
+ </span>
+ Import Wallet
+ </button>
+ <div
+ className="sc-gipzik oErko"
+ />
+ <h2>
+ <span
+ aria-label="dollar"
+ className="anticon anticon-dollar sc-bwzfXH gJwWNq"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="dollar"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372zm47.7-395.2l-25.4-5.9V348.6c38 5.2 61.5 29 65.5 58.2.5 4 3.9 6.9 7.9 6.9h44.9c4.7 0 8.4-4.1 8-8.8-6.1-62.3-57.4-102.3-125.9-109.2V263c0-4.4-3.6-8-8-8h-28.1c-4.4 0-8 3.6-8 8v33c-70.8 6.9-126.2 46-126.2 119 0 67.6 49.8 100.2 102.1 112.7l24.7 6.3v142.7c-44.2-5.9-69-29.5-74.1-61.3-.6-3.8-4-6.6-7.9-6.6H363c-4.7 0-8.4 4-8 8.7 4.5 55 46.2 105.6 135.2 112.1V761c0 4.4 3.6 8 8 8h28.4c4.4 0 8-3.6 8-8.1l-.2-31.7c78.3-6.9 134.3-48.8 134.3-124-.1-69.4-44.2-100.4-109-116.4zm-68.6-16.2c-5.6-1.6-10.3-3.1-15-5-33.8-12.2-49.5-31.9-49.5-57.3 0-36.3 27.5-57 64.5-61.7v124zM534.3 677V543.3c3.1.9 5.9 1.6 8.8 2.2 47.3 14.4 63.2 34.4 63.2 65.1 0 39.1-29.4 62.6-72 66.4z"
+ />
+ </svg>
+ </span>
+ Fiat Currency
+ </h2>
+ <div
+ className="sc-kkGfuU eZVPPF"
+ >
+ <div
+ className="ant-select select-after ant-select-single ant-select-show-arrow"
+ onBlur={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ onKeyUp={[Function]}
+ onMouseDown={[Function]}
+ style={
+ Object {
+ "width": "100%",
+ }
+ }
+ >
+ <div
+ className="ant-select-selector"
+ onClick={[Function]}
+ onMouseDown={[Function]}
+ >
+ <span
+ className="ant-select-selection-search"
+ >
+ <input
+ aria-activedescendant="rc_select_TEST_OR_SSR_list_0"
+ aria-autocomplete="list"
+ aria-controls="rc_select_TEST_OR_SSR_list"
+ aria-haspopup="listbox"
+ aria-owns="rc_select_TEST_OR_SSR_list"
+ autoComplete="off"
+ className="ant-select-selection-search-input"
+ id="rc_select_TEST_OR_SSR"
+ onChange={[Function]}
+ onCompositionEnd={[Function]}
+ onCompositionStart={[Function]}
+ onKeyDown={[Function]}
+ onMouseDown={[Function]}
+ onPaste={[Function]}
+ readOnly={true}
+ role="combobox"
+ style={
+ Object {
+ "opacity": 0,
+ }
+ }
+ type="search"
+ unselectable="on"
+ value=""
+ />
+ </span>
+ <span
+ className="ant-select-selection-item"
+ title="US Dollar ($)"
+ >
+ US Dollar ($)
+ </span>
+ </div>
+ <span
+ aria-hidden={true}
+ className="ant-select-arrow"
+ onMouseDown={[Function]}
+ style={
+ Object {
+ "WebkitUserSelect": "none",
+ "userSelect": "none",
+ }
+ }
+ unselectable="on"
+ >
+ <span
+ aria-label="down"
+ className="anticon anticon-down ant-select-suffix"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="down"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"
+ />
+ </svg>
+ </span>
+ </span>
+ </div>
+ </div>
+ <div
+ className="sc-gipzik oErko"
+ />
+ <h2>
+ <span
+ aria-label="setting"
+ className="anticon anticon-setting sc-ifAKCX gjwsUR"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="setting"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M924.8 625.7l-65.5-56c3.1-19 4.7-38.4 4.7-57.8s-1.6-38.8-4.7-57.8l65.5-56a32.03 32.03 0 009.3-35.2l-.9-2.6a443.74 443.74 0 00-79.7-137.9l-1.8-2.1a32.12 32.12 0 00-35.1-9.5l-81.3 28.9c-30-24.6-63.5-44-99.7-57.6l-15.7-85a32.05 32.05 0 00-25.8-25.7l-2.7-.5c-52.1-9.4-106.9-9.4-159 0l-2.7.5a32.05 32.05 0 00-25.8 25.7l-15.8 85.4a351.86 351.86 0 00-99 57.4l-81.9-29.1a32 32 0 00-35.1 9.5l-1.8 2.1a446.02 446.02 0 00-79.7 137.9l-.9 2.6c-4.5 12.5-.8 26.5 9.3 35.2l66.3 56.6c-3.1 18.8-4.6 38-4.6 57.1 0 19.2 1.5 38.4 4.6 57.1L99 625.5a32.03 32.03 0 00-9.3 35.2l.9 2.6c18.1 50.4 44.9 96.9 79.7 137.9l1.8 2.1a32.12 32.12 0 0035.1 9.5l81.9-29.1c29.8 24.5 63.1 43.9 99 57.4l15.8 85.4a32.05 32.05 0 0025.8 25.7l2.7.5a449.4 449.4 0 00159 0l2.7-.5a32.05 32.05 0 0025.8-25.7l15.7-85a350 350 0 0099.7-57.6l81.3 28.9a32 32 0 0035.1-9.5l1.8-2.1c34.8-41.1 61.6-87.5 79.7-137.9l.9-2.6c4.5-12.3.8-26.3-9.3-35zM788.3 465.9c2.5 15.1 3.8 30.6 3.8 46.1s-1.3 31-3.8 46.1l-6.6 40.1 74.7 63.9a370.03 370.03 0 01-42.6 73.6L721 702.8l-31.4 25.8c-23.9 19.6-50.5 35-79.3 45.8l-38.1 14.3-17.9 97a377.5 377.5 0 01-85 0l-17.9-97.2-37.8-14.5c-28.5-10.8-55-26.2-78.7-45.7l-31.4-25.9-93.4 33.2c-17-22.9-31.2-47.6-42.6-73.6l75.5-64.5-6.5-40c-2.4-14.9-3.7-30.3-3.7-45.5 0-15.3 1.2-30.6 3.7-45.5l6.5-40-75.5-64.5c11.3-26.1 25.6-50.7 42.6-73.6l93.4 33.2 31.4-25.9c23.7-19.5 50.2-34.9 78.7-45.7l37.9-14.3 17.9-97.2c28.1-3.2 56.8-3.2 85 0l17.9 97 38.1 14.3c28.7 10.8 55.4 26.2 79.3 45.8l31.4 25.8 92.8-32.9c17 22.9 31.2 47.6 42.6 73.6L781.8 426l6.5 39.9zM512 326c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm79.2 255.2A111.6 111.6 0 01512 614c-29.9 0-58-11.7-79.2-32.8A111.6 111.6 0 01400 502c0-29.9 11.7-58 32.8-79.2C454 401.6 482.1 390 512 390c29.9 0 58 11.6 79.2 32.8A111.6 111.6 0 01624 502c0 29.9-11.7 58-32.8 79.2z"
+ />
+ </svg>
+ </span>
+ General Settings
+ </h2>
+ <div
+ className="sc-csuQGl bYiikN"
+ >
+ <div
+ className="title"
+ >
+ <span
+ aria-label="lock"
+ className="anticon anticon-lock"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="lock"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M832 464h-68V240c0-70.7-57.3-128-128-128H388c-70.7 0-128 57.3-128 128v224h-68c-17.7 0-32 14.3-32 32v384c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V496c0-17.7-14.3-32-32-32zM540 701v53c0 4.4-3.6 8-8 8h-40c-4.4 0-8-3.6-8-8v-53a48.01 48.01 0 1156 0zm152-237H332V240c0-30.9 25.1-56 56-56h248c30.9 0 56 25.1 56 56v224z"
+ />
+ </svg>
+ </span>
+ Lock App
+ </div>
+ <button
+ aria-checked={false}
+ className="ant-switch ant-switch-small"
+ onClick={[Function]}
+ onKeyDown={[Function]}
+ role="switch"
+ type="button"
+ >
+ <div
+ className="ant-switch-handle"
+ />
+ <span
+ className="ant-switch-inner"
+ >
+ <span
+ aria-label="close"
+ className="anticon anticon-close"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="close"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z"
+ />
+ </svg>
+ </span>
+ </span>
+ </button>
+ </div>
+ <div
+ className="sc-csuQGl bYiikN"
+ >
+ <div
+ className="SendConfirm"
+ >
+ <span
+ aria-label="lock"
+ className="anticon anticon-lock"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="lock"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M832 464h-68V240c0-70.7-57.3-128-128-128H388c-70.7 0-128 57.3-128 128v224h-68c-17.7 0-32 14.3-32 32v384c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V496c0-17.7-14.3-32-32-32zM540 701v53c0 4.4-3.6 8-8 8h-40c-4.4 0-8-3.6-8-8v-53a48.01 48.01 0 1156 0zm152-237H332V240c0-30.9 25.1-56 56-56h248c30.9 0 56 25.1 56 56v224z"
+ />
+ </svg>
+ </span>
+ Send Confirmations
+ </div>
+ <button
+ aria-checked={false}
+ className="ant-switch ant-switch-small"
+ onClick={[Function]}
+ onKeyDown={[Function]}
+ role="switch"
+ type="button"
+ >
+ <div
+ className="ant-switch-handle"
+ />
+ <span
+ className="ant-switch-inner"
+ >
+ <span
+ aria-label="close"
+ className="anticon anticon-close"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="close"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z"
+ />
+ </svg>
+ </span>
+ </span>
+ </button>
+ </div>
+ <div
+ className="sc-gipzik oErko"
+ />
+ [
+ <a
+ className="sc-brqgnP dPRIWg"
+ href="https://docs.cashtab.com/docs/"
+ rel="noreferrer"
+ target="_blank"
+ type="link"
+ >
+ Documentation
+ </a>
+ ]
+ </div>
+</div>
+`;
+
+exports[`Configure without a wallet 1`] = `
+<div
+ className="sc-gqjmRU dYraLr"
+>
+ <div
+ className="sc-jlyJG dGBbfI"
+ >
+ <h2>
+ <span
+ aria-label="copy"
+ className="anticon anticon-copy sc-bdVaJa jyutTw"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="copy"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M832 64H296c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h496v688c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V96c0-17.7-14.3-32-32-32zM704 192H192c-17.7 0-32 14.3-32 32v530.7c0 8.5 3.4 16.6 9.4 22.6l173.3 173.3c2.2 2.2 4.7 4 7.4 5.5v1.9h4.2c3.5 1.3 7.2 2 11 2H704c17.7 0 32-14.3 32-32V224c0-17.7-14.3-32-32-32zM350 856.2L263.9 770H350v86.2zM664 888H414V746c0-22.1-17.9-40-40-40H232V264h432v624z"
+ />
+ </svg>
+ </span>
+ Backup your wallet
+ </h2>
+ <div
+ className="ant-alert ant-alert-warning ant-alert-with-description"
+ data-show={true}
+ role="alert"
+ style={
+ Object {
+ "marginBottom": "12px",
+ }
+ }
+ >
+ <span
+ aria-label="exclamation-circle"
+ className="anticon anticon-exclamation-circle ant-alert-icon"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="exclamation-circle"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"
+ />
+ <path
+ d="M464 688a48 48 0 1096 0 48 48 0 10-96 0zm24-112h48c4.4 0 8-3.6 8-8V296c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8z"
+ />
+ </svg>
+ </span>
+ <div
+ className="ant-alert-content"
+ >
+ <div
+ className="ant-alert-message"
+ />
+ <div
+ className="ant-alert-description"
+ >
+ Your seed phrase is the only way to restore your wallet. Write it down. Keep it safe.
+ </div>
+ </div>
+ </div>
+ <div
+ className="sc-gipzik oErko"
+ />
+ <h2>
+ <span
+ aria-label="wallet"
+ className="anticon anticon-wallet sc-htpNat lgbLiL"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="wallet"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 464H528V448h312v128zm0 264H184V184h656v200H496c-17.7 0-32 14.3-32 32v192c0 17.7 14.3 32 32 32h344v200zM580 512a40 40 0 1080 0 40 40 0 10-80 0z"
+ />
+ </svg>
+ </span>
+ Manage Wallets
+ </h2>
+ <button
+ className="sc-eHgmQL bqOmSo"
+ onClick={[Function]}
+ >
+ <span
+ aria-label="plus-square"
+ className="anticon anticon-plus-square"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="plus-square"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M328 544h152v152c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V544h152c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H544V328c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v152H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z"
+ />
+ <path
+ d="M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"
+ />
+ </svg>
+ </span>
+ New Wallet
+ </button>
+ <button
+ className="sc-cvbbAY dvozVe"
+ onClick={[Function]}
+ >
+ <span
+ aria-label="import"
+ className="anticon anticon-import"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="import"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M888.3 757.4h-53.8c-4.2 0-7.7 3.5-7.7 7.7v61.8H197.1V197.1h629.8v61.8c0 4.2 3.5 7.7 7.7 7.7h53.8c4.2 0 7.7-3.4 7.7-7.7V158.7c0-17-13.7-30.7-30.7-30.7H158.7c-17 0-30.7 13.7-30.7 30.7v706.6c0 17 13.7 30.7 30.7 30.7h706.6c17 0 30.7-13.7 30.7-30.7V765.1c0-4.3-3.5-7.7-7.7-7.7zM902 476H588v-76c0-6.7-7.8-10.5-13-6.3l-141.9 112a8 8 0 000 12.6l141.9 112c5.3 4.2 13 .4 13-6.3v-76h314c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z"
+ />
+ </svg>
+ </span>
+ Import Wallet
+ </button>
+ <div
+ className="sc-gipzik oErko"
+ />
+ <h2>
+ <span
+ aria-label="dollar"
+ className="anticon anticon-dollar sc-bwzfXH gJwWNq"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="dollar"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372zm47.7-395.2l-25.4-5.9V348.6c38 5.2 61.5 29 65.5 58.2.5 4 3.9 6.9 7.9 6.9h44.9c4.7 0 8.4-4.1 8-8.8-6.1-62.3-57.4-102.3-125.9-109.2V263c0-4.4-3.6-8-8-8h-28.1c-4.4 0-8 3.6-8 8v33c-70.8 6.9-126.2 46-126.2 119 0 67.6 49.8 100.2 102.1 112.7l24.7 6.3v142.7c-44.2-5.9-69-29.5-74.1-61.3-.6-3.8-4-6.6-7.9-6.6H363c-4.7 0-8.4 4-8 8.7 4.5 55 46.2 105.6 135.2 112.1V761c0 4.4 3.6 8 8 8h28.4c4.4 0 8-3.6 8-8.1l-.2-31.7c78.3-6.9 134.3-48.8 134.3-124-.1-69.4-44.2-100.4-109-116.4zm-68.6-16.2c-5.6-1.6-10.3-3.1-15-5-33.8-12.2-49.5-31.9-49.5-57.3 0-36.3 27.5-57 64.5-61.7v124zM534.3 677V543.3c3.1.9 5.9 1.6 8.8 2.2 47.3 14.4 63.2 34.4 63.2 65.1 0 39.1-29.4 62.6-72 66.4z"
+ />
+ </svg>
+ </span>
+ Fiat Currency
+ </h2>
+ <div
+ className="sc-kkGfuU eZVPPF"
+ >
+ <div
+ className="ant-select select-after ant-select-single ant-select-show-arrow"
+ onBlur={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ onKeyUp={[Function]}
+ onMouseDown={[Function]}
+ style={
+ Object {
+ "width": "100%",
+ }
+ }
+ >
+ <div
+ className="ant-select-selector"
+ onClick={[Function]}
+ onMouseDown={[Function]}
+ >
+ <span
+ className="ant-select-selection-search"
+ >
+ <input
+ aria-activedescendant="rc_select_TEST_OR_SSR_list_0"
+ aria-autocomplete="list"
+ aria-controls="rc_select_TEST_OR_SSR_list"
+ aria-haspopup="listbox"
+ aria-owns="rc_select_TEST_OR_SSR_list"
+ autoComplete="off"
+ className="ant-select-selection-search-input"
+ id="rc_select_TEST_OR_SSR"
+ onChange={[Function]}
+ onCompositionEnd={[Function]}
+ onCompositionStart={[Function]}
+ onKeyDown={[Function]}
+ onMouseDown={[Function]}
+ onPaste={[Function]}
+ readOnly={true}
+ role="combobox"
+ style={
+ Object {
+ "opacity": 0,
+ }
+ }
+ type="search"
+ unselectable="on"
+ value=""
+ />
+ </span>
+ <span
+ className="ant-select-selection-item"
+ title="US Dollar ($)"
+ >
+ US Dollar ($)
+ </span>
+ </div>
+ <span
+ aria-hidden={true}
+ className="ant-select-arrow"
+ onMouseDown={[Function]}
+ style={
+ Object {
+ "WebkitUserSelect": "none",
+ "userSelect": "none",
+ }
+ }
+ unselectable="on"
+ >
+ <span
+ aria-label="down"
+ className="anticon anticon-down ant-select-suffix"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="down"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"
+ />
+ </svg>
+ </span>
+ </span>
+ </div>
+ </div>
+ <div
+ className="sc-gipzik oErko"
+ />
+ <h2>
+ <span
+ aria-label="setting"
+ className="anticon anticon-setting sc-ifAKCX gjwsUR"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="setting"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M924.8 625.7l-65.5-56c3.1-19 4.7-38.4 4.7-57.8s-1.6-38.8-4.7-57.8l65.5-56a32.03 32.03 0 009.3-35.2l-.9-2.6a443.74 443.74 0 00-79.7-137.9l-1.8-2.1a32.12 32.12 0 00-35.1-9.5l-81.3 28.9c-30-24.6-63.5-44-99.7-57.6l-15.7-85a32.05 32.05 0 00-25.8-25.7l-2.7-.5c-52.1-9.4-106.9-9.4-159 0l-2.7.5a32.05 32.05 0 00-25.8 25.7l-15.8 85.4a351.86 351.86 0 00-99 57.4l-81.9-29.1a32 32 0 00-35.1 9.5l-1.8 2.1a446.02 446.02 0 00-79.7 137.9l-.9 2.6c-4.5 12.5-.8 26.5 9.3 35.2l66.3 56.6c-3.1 18.8-4.6 38-4.6 57.1 0 19.2 1.5 38.4 4.6 57.1L99 625.5a32.03 32.03 0 00-9.3 35.2l.9 2.6c18.1 50.4 44.9 96.9 79.7 137.9l1.8 2.1a32.12 32.12 0 0035.1 9.5l81.9-29.1c29.8 24.5 63.1 43.9 99 57.4l15.8 85.4a32.05 32.05 0 0025.8 25.7l2.7.5a449.4 449.4 0 00159 0l2.7-.5a32.05 32.05 0 0025.8-25.7l15.7-85a350 350 0 0099.7-57.6l81.3 28.9a32 32 0 0035.1-9.5l1.8-2.1c34.8-41.1 61.6-87.5 79.7-137.9l.9-2.6c4.5-12.3.8-26.3-9.3-35zM788.3 465.9c2.5 15.1 3.8 30.6 3.8 46.1s-1.3 31-3.8 46.1l-6.6 40.1 74.7 63.9a370.03 370.03 0 01-42.6 73.6L721 702.8l-31.4 25.8c-23.9 19.6-50.5 35-79.3 45.8l-38.1 14.3-17.9 97a377.5 377.5 0 01-85 0l-17.9-97.2-37.8-14.5c-28.5-10.8-55-26.2-78.7-45.7l-31.4-25.9-93.4 33.2c-17-22.9-31.2-47.6-42.6-73.6l75.5-64.5-6.5-40c-2.4-14.9-3.7-30.3-3.7-45.5 0-15.3 1.2-30.6 3.7-45.5l6.5-40-75.5-64.5c11.3-26.1 25.6-50.7 42.6-73.6l93.4 33.2 31.4-25.9c23.7-19.5 50.2-34.9 78.7-45.7l37.9-14.3 17.9-97.2c28.1-3.2 56.8-3.2 85 0l17.9 97 38.1 14.3c28.7 10.8 55.4 26.2 79.3 45.8l31.4 25.8 92.8-32.9c17 22.9 31.2 47.6 42.6 73.6L781.8 426l6.5 39.9zM512 326c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm79.2 255.2A111.6 111.6 0 01512 614c-29.9 0-58-11.7-79.2-32.8A111.6 111.6 0 01400 502c0-29.9 11.7-58 32.8-79.2C454 401.6 482.1 390 512 390c29.9 0 58 11.6 79.2 32.8A111.6 111.6 0 01624 502c0 29.9-11.7 58-32.8 79.2z"
+ />
+ </svg>
+ </span>
+ General Settings
+ </h2>
+ <div
+ className="sc-csuQGl bYiikN"
+ >
+ <div
+ className="title"
+ >
+ <span
+ aria-label="lock"
+ className="anticon anticon-lock"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="lock"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M832 464h-68V240c0-70.7-57.3-128-128-128H388c-70.7 0-128 57.3-128 128v224h-68c-17.7 0-32 14.3-32 32v384c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V496c0-17.7-14.3-32-32-32zM540 701v53c0 4.4-3.6 8-8 8h-40c-4.4 0-8-3.6-8-8v-53a48.01 48.01 0 1156 0zm152-237H332V240c0-30.9 25.1-56 56-56h248c30.9 0 56 25.1 56 56v224z"
+ />
+ </svg>
+ </span>
+ Lock App
+ </div>
+ <button
+ aria-checked={false}
+ className="ant-switch ant-switch-small"
+ onClick={[Function]}
+ onKeyDown={[Function]}
+ role="switch"
+ type="button"
+ >
+ <div
+ className="ant-switch-handle"
+ />
+ <span
+ className="ant-switch-inner"
+ >
+ <span
+ aria-label="close"
+ className="anticon anticon-close"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="close"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z"
+ />
+ </svg>
+ </span>
+ </span>
+ </button>
+ </div>
+ <div
+ className="sc-csuQGl bYiikN"
+ >
+ <div
+ className="SendConfirm"
+ >
+ <span
+ aria-label="lock"
+ className="anticon anticon-lock"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="lock"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M832 464h-68V240c0-70.7-57.3-128-128-128H388c-70.7 0-128 57.3-128 128v224h-68c-17.7 0-32 14.3-32 32v384c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V496c0-17.7-14.3-32-32-32zM540 701v53c0 4.4-3.6 8-8 8h-40c-4.4 0-8-3.6-8-8v-53a48.01 48.01 0 1156 0zm152-237H332V240c0-30.9 25.1-56 56-56h248c30.9 0 56 25.1 56 56v224z"
+ />
+ </svg>
+ </span>
+ Send Confirmations
+ </div>
+ <button
+ aria-checked={false}
+ className="ant-switch ant-switch-small"
+ onClick={[Function]}
+ onKeyDown={[Function]}
+ role="switch"
+ type="button"
+ >
+ <div
+ className="ant-switch-handle"
+ />
+ <span
+ className="ant-switch-inner"
+ >
+ <span
+ aria-label="close"
+ className="anticon anticon-close"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="close"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z"
+ />
+ </svg>
+ </span>
+ </span>
+ </button>
+ </div>
+ <div
+ className="sc-gipzik oErko"
+ />
+ [
+ <a
+ className="sc-brqgnP dPRIWg"
+ href="https://docs.cashtab.com/docs/"
+ rel="noreferrer"
+ target="_blank"
+ type="link"
+ >
+ Documentation
+ </a>
+ ]
+ </div>
+</div>
+`;
diff --git a/web/cashtab-v2/src/components/Home/Home.js b/web/cashtab-v2/src/components/Home/Home.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Home/Home.js
@@ -0,0 +1,257 @@
+import React from 'react';
+import styled from 'styled-components';
+import { WalletContext } from '@utils/context';
+import OnBoarding from '@components/OnBoarding/OnBoarding';
+import { currency } from '@components/Common/Ticker.js';
+import { Link } from 'react-router-dom';
+import TokenList from './TokenList';
+import TxHistory from './TxHistory';
+import ApiError from '@components/Common/ApiError';
+import BalanceHeader from '@components/Common/BalanceHeader';
+import BalanceHeaderFiat from '@components/Common/BalanceHeaderFiat';
+import {
+ LoadingCtn,
+ WalletInfoCtn,
+ SidePaddingCtn,
+} from '@components/Common/Atoms';
+import { getWalletState } from '@utils/cashMethods';
+import WalletLabel from '@components/Common/WalletLabel.js';
+
+export const Tabs = styled.div`
+ margin: auto;
+ display: inline-block;
+ text-align: center;
+ width: 100%;
+ margin: 20px 0;
+`;
+
+export const TabLabel = styled.button`
+ :focus,
+ :active {
+ outline: none;
+ }
+ color: ${props => props.theme.lightWhite};
+ border: none;
+ background: none;
+ font-size: 18px;
+ cursor: pointer;
+ margin: 0 20px;
+ padding: 0;
+
+ @media (max-width: 400px) {
+ font-size: 16px;
+ }
+
+ ${({ active, ...props }) =>
+ active &&
+ `
+ color: ${props.theme.contrast};
+ border-bottom: 2px solid ${props.theme.eCashBlue}
+
+ `}
+ ${({ token, ...props }) =>
+ token &&
+ `
+ border-color:${props.theme.eCashPurple}
+ `}
+`;
+
+export const TabPane = styled.div`
+ color: ${props => props.theme.contrast};
+ ${({ active }) =>
+ !active &&
+ `
+ display: none;
+ `}
+`;
+
+export const Links = styled(Link)`
+ color: ${props => props.theme.darkBlue};
+ width: 100%;
+ font-size: 16px;
+ margin: 10px 0 20px 0;
+ border: 1px solid ${props => props.theme.darkBlue};
+ padding: 14px 0;
+ display: inline-block;
+ border-radius: 3px;
+ transition: all 200ms ease-in-out;
+ svg {
+ fill: ${props => props.theme.darkBlue};
+ }
+ :hover {
+ color: ${props => props.theme.eCashBlue};
+ border-color: ${props => props.theme.eCashBlue};
+ svg {
+ fill: ${props => props.theme.eCashBlue};
+ }
+ }
+ @media (max-width: 768px) {
+ padding: 10px 0;
+ font-size: 14px;
+ }
+`;
+
+export const ExternalLink = styled.a`
+ color: ${props => props.theme.darkBlue};
+ width: 100%;
+ font-size: 16px;
+ margin: 0 0 20px 0;
+ border: 1px solid ${props => props.theme.darkBlue};
+ padding: 14px 0;
+ display: inline-block;
+ border-radius: 3px;
+ transition: all 200ms ease-in-out;
+ svg {
+ fill: ${props => props.theme.darkBlue};
+ transition: all 200ms ease-in-out;
+ }
+ :hover {
+ color: ${props => props.theme.eCashBlue};
+ border-color: ${props => props.theme.eCashBlue};
+ svg {
+ fill: ${props => props.theme.eCashBlue};
+ }
+ }
+ @media (max-width: 768px) {
+ padding: 10px 0;
+ font-size: 14px;
+ }
+`;
+
+export const AddrSwitchContainer = styled.div`
+ text-align: center;
+ padding: 6px 0 12px 0;
+`;
+
+const CreateToken = styled(Link)`
+ color: ${props => props.theme.contrast};
+ border: 1px solid ${props => props.theme.contrast};
+ padding: 8px 15px;
+ border-radius: 5px;
+ margin-top: 10px;
+ margin-bottom: 20px;
+ display: inline-block;
+ width: 100%;
+ :hover {
+ background: ${props => props.theme.eCashPurple};
+ border-color: ${props => props.theme.eCashPurple};
+ color: ${props => props.theme.contrast};
+ }
+`;
+
+const WalletInfo = () => {
+ const ContextValue = React.useContext(WalletContext);
+ const { wallet, fiatPrice, apiError, cashtabSettings } = ContextValue;
+ const walletState = getWalletState(wallet);
+ const { balances, parsedTxHistory, tokens } = walletState;
+ const [activeTab, setActiveTab] = React.useState('txHistory');
+
+ const hasHistory = parsedTxHistory && parsedTxHistory.length > 0;
+
+ return (
+ <>
+ <WalletInfoCtn>
+ <WalletLabel name={wallet.name}></WalletLabel>
+ <BalanceHeader
+ balance={balances.totalBalance}
+ ticker={currency.ticker}
+ />
+ <BalanceHeaderFiat
+ balance={balances.totalBalance}
+ settings={cashtabSettings}
+ fiatPrice={fiatPrice}
+ />
+ </WalletInfoCtn>
+ {apiError && <ApiError />}
+
+ <SidePaddingCtn>
+ <Tabs>
+ <TabLabel
+ active={activeTab === 'txHistory'}
+ onClick={() => setActiveTab('txHistory')}
+ >
+ Transactions
+ </TabLabel>
+ <TabLabel
+ active={activeTab === 'tokens'}
+ token={activeTab === 'tokens'}
+ onClick={() => setActiveTab('tokens')}
+ >
+ eTokens
+ </TabLabel>
+ </Tabs>
+
+ <TabPane active={activeTab === 'txHistory'}>
+ <TxHistory
+ txs={parsedTxHistory}
+ fiatPrice={fiatPrice}
+ fiatCurrency={
+ cashtabSettings && cashtabSettings.fiatCurrency
+ ? cashtabSettings.fiatCurrency
+ : 'usd'
+ }
+ />
+ {!hasHistory && (
+ <>
+ <span role="img" aria-label="party emoji">
+ 🎉
+ </span>
+ Congratulations on your new wallet!{' '}
+ <span role="img" aria-label="party emoji">
+ 🎉
+ </span>
+ <br /> Start using the wallet immediately to receive{' '}
+ {currency.ticker} payments, or load it up with{' '}
+ {currency.ticker} to send to others
+ </>
+ )}
+ </TabPane>
+ <TabPane active={activeTab === 'tokens'}>
+ <CreateToken
+ to={{
+ pathname: `/tokens`,
+ }}
+ >
+ Create eToken
+ </CreateToken>
+ {tokens && tokens.length > 0 ? (
+ <TokenList
+ wallet={wallet}
+ tokens={tokens}
+ jestBCH={false}
+ />
+ ) : (
+ <p>
+ Tokens sent to your {currency.tokenTicker} address
+ will appear here
+ </p>
+ )}
+ </TabPane>
+ </SidePaddingCtn>
+ </>
+ );
+};
+
+const Home = () => {
+ const ContextValue = React.useContext(WalletContext);
+ const { wallet, previousWallet, loading } = ContextValue;
+
+ return (
+ <>
+ {loading ? (
+ <LoadingCtn />
+ ) : (
+ <>
+ {(wallet && wallet.Path1899) ||
+ (previousWallet && previousWallet.path1899) ? (
+ <WalletInfo />
+ ) : (
+ <OnBoarding />
+ )}
+ </>
+ )}
+ </>
+ );
+};
+
+export default Home;
diff --git a/web/cashtab-v2/src/components/Home/TokenList.js b/web/cashtab-v2/src/components/Home/TokenList.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Home/TokenList.js
@@ -0,0 +1,27 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import TokenListItem from './TokenListItem';
+import { Link } from 'react-router-dom';
+import { formatBalance } from '@utils/formatting';
+
+const TokenList = ({ tokens }) => {
+ return (
+ <div>
+ {tokens.map(token => (
+ <Link key={token.tokenId} to={`/send-token/${token.tokenId}`}>
+ <TokenListItem
+ ticker={token.info.tokenTicker}
+ tokenId={token.tokenId}
+ balance={formatBalance(token.balance)}
+ />
+ </Link>
+ ))}
+ </div>
+ );
+};
+
+TokenList.propTypes = {
+ tokens: PropTypes.array,
+};
+
+export default TokenList;
diff --git a/web/cashtab-v2/src/components/Home/TokenListItem.js b/web/cashtab-v2/src/components/Home/TokenListItem.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Home/TokenListItem.js
@@ -0,0 +1,56 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import styled from 'styled-components';
+import TokenIcon from '@components/Tokens/TokenIcon';
+
+const TokenIconWrapper = styled.div`
+ margin-right: 10px;
+`;
+
+const TokenNameCtn = styled.div`
+ display: flex;
+ align-items: center;
+`;
+
+const Wrapper = styled.div`
+ display: flex;
+ align-items: center;
+ border-top: 1px solid rgba(255, 255, 255, 0.12);
+ color: ${props => props.theme.contrast};
+ padding: 10px 0;
+ justify-content: space-between;
+ h4 {
+ font-size: 16px;
+ color: ${props => props.theme.contrast};
+ margin: 0;
+ font-weight: bold;
+ }
+ :hover {
+ h4 {
+ color: ${props => props.theme.eCashPurple};
+ }
+ }
+`;
+
+const TokenListItem = ({ ticker, balance, tokenId }) => {
+ return (
+ <Wrapper>
+ <TokenNameCtn>
+ <TokenIconWrapper>
+ <TokenIcon size={32} tokenId={tokenId} />
+ </TokenIconWrapper>
+ <h4>{ticker}</h4>
+ </TokenNameCtn>
+
+ <h4>{balance}</h4>
+ </Wrapper>
+ );
+};
+
+TokenListItem.propTypes = {
+ ticker: PropTypes.string,
+ balance: PropTypes.string,
+ tokenId: PropTypes.string,
+};
+
+export default TokenListItem;
diff --git a/web/cashtab-v2/src/components/Home/Tx.js b/web/cashtab-v2/src/components/Home/Tx.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Home/Tx.js
@@ -0,0 +1,707 @@
+import React from 'react';
+import { Link } from 'react-router-dom';
+import PropTypes from 'prop-types';
+import styled, { css } from 'styled-components';
+import {
+ SendIcon,
+ ReceiveIcon,
+ GenesisIcon,
+ UnparsedIcon,
+} from '@components/Common/CustomIcons';
+import { currency } from '@components/Common/Ticker';
+import { fromLegacyDecimals } from '@utils/cashMethods';
+import { formatBalance, formatDate } from '@utils/formatting';
+import TokenIcon from '@components/Tokens/TokenIcon';
+import { Collapse } from 'antd';
+import { AntdContextCollapseWrapper } from '@components/Common/StyledCollapse';
+import { generalNotification } from '@components/Common/Notifications';
+import { CopyToClipboard } from 'react-copy-to-clipboard';
+import {
+ ThemedCopySolid,
+ ThemedLinkSolid,
+} from '@components/Common/CustomIcons';
+const TxIcon = styled.div`
+ svg {
+ width: 20px;
+ height: 20px;
+ }
+ height: 40px;
+ width: 40px;
+ border: 1px solid #fff;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 100px;
+`;
+
+const SentTx = styled(TxIcon)`
+ svg {
+ margin-right: -3px;
+ }
+ fill: ${props => props.theme.contrast};
+`;
+const ReceivedTx = styled(TxIcon)`
+ svg {
+ fill: ${props => props.theme.eCashBlue};
+ }
+ border-color: ${props => props.theme.eCashBlue};
+`;
+const GenesisTx = styled(TxIcon)`
+ border-color: ${props => props.theme.genesisGreen};
+ svg {
+ fill: ${props => props.theme.genesisGreen};
+ }
+`;
+const UnparsedTx = styled(TxIcon)`
+ color: ${props => props.theme.eCashBlue} !important;
+`;
+const DateType = styled.div`
+ text-align: left;
+ padding: 12px;
+ @media screen and (max-width: 500px) {
+ font-size: 0.8rem;
+ }
+`;
+
+const LeftTextCtn = styled.div`
+ text-align: left;
+ display: flex;
+ align-items: left;
+ flex-direction: column;
+ margin-left: 10px;
+ h3 {
+ color: ${props => props.theme.contrast};
+ font-size: 14px;
+ font-weight: 700;
+ margin: 0;
+ }
+ .genesis {
+ color: ${props => props.theme.genesisGreen};
+ }
+ .received {
+ color: ${props => props.theme.eCashBlue};
+ }
+ h4 {
+ font-size: 12px;
+ color: ${props => props.theme.lightWhite};
+ margin: 0;
+ }
+`;
+
+const RightTextCtn = styled.div`
+ text-align: right;
+ display: flex;
+ align-items: left;
+ flex-direction: column;
+ margin-left: 10px;
+ h3 {
+ color: ${props => props.theme.contrast};
+ font-size: 14px;
+ font-weight: 700;
+ margin: 0;
+ }
+ .genesis {
+ color: ${props => props.theme.genesisGreen};
+ }
+ .received {
+ color: ${props => props.theme.eCashBlue};
+ }
+ h4 {
+ font-size: 12px;
+ color: ${props => props.theme.lightWhite};
+ margin: 0;
+ }
+`;
+const OpReturnType = styled.div`
+ text-align: right;
+ width: 100%;
+ padding: 10px;
+ border-radius: 5px;
+ background: ${props => props.theme.sentMessage};
+ margin-top: 15px;
+ h4 {
+ color: ${props => props.theme.lightWhite};
+ margin: 0;
+ font-size: 12px;
+ display: inline-block;
+ }
+ p {
+ color: ${props => props.theme.contrast};
+ margin: 0;
+ font-size: 14px;
+ margin-bottom: 10px;
+ overflow-wrap: break-word;
+ }
+ a {
+ color: ${props => props.theme.contrast};
+ margin: 0;
+ font-size: 10px;
+ border: 1px solid ${props => props.theme.contrast};
+ border-radius: 5px;
+ padding: 2px 10px;
+ opacity: 0.6;
+ }
+ a:hover {
+ opacity: 1;
+ border-color: ${props => props.theme.eCashBlue};
+ color: ${props => props.theme.contrast};
+ background: ${props => props.theme.eCashBlue};
+ }
+ ${({ received, ...props }) =>
+ received &&
+ `
+ text-align: left;
+ background: ${props.theme.receivedMessage};
+ `}
+`;
+const SentLabel = styled.span`
+ font-weight: bold;
+ color: ${props => props.theme.secondary} !important;
+`;
+const ReceivedLabel = styled.span`
+ font-weight: bold;
+ color: ${props => props.theme.eCashBlue} !important;
+`;
+const GenesisLabel = styled.span`
+ font-weight: bold;
+ color: ${props => props.theme.genesisGreen} !important;
+`;
+const CashtabMessageLabel = styled.span`
+ text-align: left;
+ font-weight: bold;
+ color: ${props => props.theme.eCashBlue} !important;
+ white-space: nowrap;
+`;
+const EncryptionMessageLabel = styled.span`
+ font-weight: bold;
+ font-size: 12px;
+ color: ${props => props.theme.encryptionRed};
+ white-space: nowrap;
+`;
+const UnauthorizedDecryptionMessage = styled.span`
+ text-align: left;
+ color: ${props => props.theme.encryptionRed};
+ white-space: nowrap;
+ font-style: italic;
+`;
+const MessageLabel = styled.span`
+ text-align: left;
+ font-weight: bold;
+ color: ${props => props.theme.secondary} !important;
+ white-space: nowrap;
+`;
+const ReplyMessageLabel = styled.span`
+ color: ${props => props.theme.eCashBlue} !important;
+`;
+
+const TxInfo = styled.div`
+ text-align: right;
+ display: flex;
+ align-items: left;
+ flex-direction: column;
+ margin-left: 10px;
+ flex-grow: 2;
+ h3 {
+ color: ${props => props.theme.contrast};
+ font-size: 14px;
+ font-weight: 700;
+ margin: 0;
+ }
+ .genesis {
+ color: ${props => props.theme.genesisGreen};
+ }
+ .received {
+ color: ${props => props.theme.eCashBlue};
+ }
+ h4 {
+ font-size: 12px;
+ color: ${props => props.theme.lightWhite};
+ margin: 0;
+ }
+
+ @media screen and (max-width: 500px) {
+ font-size: 0.8rem;
+ }
+`;
+
+const TokenInfo = styled.div`
+ display: flex;
+ flex-grow: 1;
+ justify-content: flex-end;
+
+ color: ${props =>
+ props.outgoing ? props.theme.secondary : props.theme.eCashBlue};
+
+ @media screen and (max-width: 500px) {
+ font-size: 0.8rem;
+ grid-template-columns: 16px auto;
+ }
+`;
+const TxTokenIcon = styled.div`
+ img {
+ height: 24px;
+ width: 24px;
+ }
+ @media screen and (max-width: 500px) {
+ img {
+ height: 16px;
+ width: 16px;
+ }
+ }
+ grid-column-start: 1;
+ grid-column-end: span 1;
+ grid-row-start: 1;
+ grid-row-end: span 2;
+ align-self: center;
+`;
+const TokenTxAmt = styled.h3`
+ text-align: right;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+`;
+const TokenName = styled.h4`
+ text-align: right;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+`;
+
+const TxWrapper = styled.div`
+ display: flex;
+ align-items: center;
+ border-top: 1px solid rgba(255, 255, 255, 0.12);
+ color: ${props => props.theme.contrast};
+ padding: 10px 0;
+ flex-wrap: wrap;
+`;
+
+const Panel = Collapse.Panel;
+
+const DropdownIconWrapper = styled.div`
+ display: flex;
+ align-items: center;
+ gap: 4px;
+`;
+
+const TextLayer = styled.div`
+ font-size: 12px;
+ color: ${props => props.theme.contrast};
+`;
+
+const DropdownButton = styled.button`
+ display: flex;
+ justify-content: flex-end;
+ background-color: ${props => props.theme.walletBackground};
+ border: none;
+ cursor: pointer;
+ padding: 0;
+ &:hover {
+ div {
+ color: ${props => props.theme.eCashBlue}!important;
+ }
+ svg {
+ fill: ${props => props.theme.eCashBlue}!important;
+ }
+ }
+`;
+const PanelCtn = styled.div`
+ display: flex;
+ justify-content: flex-end;
+ right: 0;
+ gap: 8px;
+`;
+
+export const TxLink = styled.a`
+ color: ${props => props.theme.primary};
+`;
+
+const Tx = ({ data, fiatPrice, fiatCurrency }) => {
+ const txDate =
+ typeof data.blocktime === 'undefined'
+ ? formatDate()
+ : formatDate(data.blocktime, navigator.language);
+ // if data only includes height and txid, then the tx could not be parsed by cashtab
+ // render as such but keep link to block explorer
+ let unparsedTx = false;
+ if (!Object.keys(data).includes('outgoingTx')) {
+ unparsedTx = true;
+ }
+ return (
+ <>
+ {unparsedTx ? (
+ <TxWrapper>
+ <UnparsedTx>
+ <UnparsedIcon />
+ </UnparsedTx>
+
+ <DateType>
+ <ReceivedLabel>Unparsed</ReceivedLabel>
+ <br />
+ {txDate}
+ </DateType>
+ <TxInfo>Open in Explorer</TxInfo>
+ </TxWrapper>
+ ) : (
+ <AntdContextCollapseWrapper className="antd-collapse">
+ <Collapse bordered={false}>
+ <Panel
+ showArrow={false}
+ header={
+ <>
+ <TxWrapper>
+ {data.outgoingTx ? (
+ <>
+ {data.tokenTx &&
+ data.tokenInfo
+ .transactionType ===
+ 'GENESIS' ? (
+ <GenesisTx>
+ <GenesisIcon />
+ </GenesisTx>
+ ) : (
+ <SentTx>
+ <SendIcon />
+ </SentTx>
+ )}
+ </>
+ ) : (
+ <ReceivedTx>
+ <ReceiveIcon />
+ </ReceivedTx>
+ )}
+
+ <LeftTextCtn>
+ {data.outgoingTx ? (
+ <>
+ {data.tokenTx &&
+ data.tokenInfo
+ .transactionType ===
+ 'GENESIS' ? (
+ <h3 className="genesis">
+ Genesis
+ </h3>
+ ) : (
+ <h3 className="sent">
+ Sent
+ </h3>
+ )}
+ </>
+ ) : (
+ <h3 className="received">
+ Received
+ </h3>
+ )}
+ <h4>{txDate}</h4>
+ </LeftTextCtn>
+ {data.tokenTx ? (
+ <TokenInfo
+ outgoing={data.outgoingTx}
+ >
+ {data.tokenTx &&
+ data.tokenInfo ? (
+ <>
+ <TxTokenIcon>
+ <TokenIcon
+ size={32}
+ tokenId={
+ data
+ .tokenInfo
+ .tokenId
+ }
+ />
+ </TxTokenIcon>
+ {data.outgoingTx ? (
+ <RightTextCtn>
+ {data.tokenInfo
+ .transactionType ===
+ 'GENESIS' ? (
+ <>
+ <TokenTxAmt className="genesis">
+ +{' '}
+ {data.tokenInfo.qtyReceived.toString()}
+ &nbsp;
+ {
+ data
+ .tokenInfo
+ .tokenTicker
+ }
+ </TokenTxAmt>
+ <TokenName>
+ {
+ data
+ .tokenInfo
+ .tokenName
+ }
+ </TokenName>
+ </>
+ ) : (
+ <>
+ <TokenTxAmt>
+ -{' '}
+ {data.tokenInfo.qtySent.toString()}
+ &nbsp;
+ {
+ data
+ .tokenInfo
+ .tokenTicker
+ }
+ </TokenTxAmt>
+ <TokenName>
+ {
+ data
+ .tokenInfo
+ .tokenName
+ }
+ </TokenName>
+ </>
+ )}
+ </RightTextCtn>
+ ) : (
+ <RightTextCtn>
+ <TokenTxAmt className="received">
+ +{' '}
+ {data.tokenInfo.qtyReceived.toString()}
+ &nbsp;
+ {
+ data
+ .tokenInfo
+ .tokenTicker
+ }
+ </TokenTxAmt>
+ <TokenName>
+ {
+ data
+ .tokenInfo
+ .tokenName
+ }
+ </TokenName>
+ </RightTextCtn>
+ )}
+ </>
+ ) : (
+ <span>Token Tx</span>
+ )}
+ </TokenInfo>
+ ) : (
+ <>
+ <TxInfo
+ outgoing={data.outgoingTx}
+ >
+ {data.outgoingTx ? (
+ <>
+ <h3>
+ -
+ {formatBalance(
+ fromLegacyDecimals(
+ data.amountSent,
+ ),
+ )}{' '}
+ {
+ currency.ticker
+ }
+ </h3>
+ {fiatPrice !==
+ null &&
+ !isNaN(
+ data.amountSent,
+ ) && (
+ <h4>
+ -
+ {
+ currency
+ .fiatCurrencies[
+ fiatCurrency
+ ]
+ .symbol
+ }
+ {(
+ fromLegacyDecimals(
+ data.amountSent,
+ ) *
+ fiatPrice
+ ).toFixed(
+ 2,
+ )}{' '}
+ {
+ currency
+ .fiatCurrencies
+ .fiatCurrency
+ }
+ </h4>
+ )}
+ </>
+ ) : (
+ <>
+ <h3 className="received">
+ +
+ {formatBalance(
+ fromLegacyDecimals(
+ data.amountReceived,
+ ),
+ )}{' '}
+ {
+ currency.ticker
+ }
+ </h3>
+ {fiatPrice !==
+ null &&
+ !isNaN(
+ data.amountReceived,
+ ) && (
+ <h4>
+ +
+ {
+ currency
+ .fiatCurrencies[
+ fiatCurrency
+ ]
+ .symbol
+ }
+ {(
+ fromLegacyDecimals(
+ data.amountReceived,
+ ) *
+ fiatPrice
+ ).toFixed(
+ 2,
+ )}{' '}
+ {
+ currency
+ .fiatCurrencies
+ .fiatCurrency
+ }
+ </h4>
+ )}
+ </>
+ )}
+ </TxInfo>
+ </>
+ )}
+ {data.opReturnMessage && (
+ <>
+ <OpReturnType
+ received={!data.outgoingTx}
+ >
+ {data.isCashtabMessage ? (
+ <h4>Cashtab Message</h4>
+ ) : (
+ <h4>
+ External Message
+ </h4>
+ )}
+ {data.isEncryptedMessage ? (
+ <EncryptionMessageLabel>
+ &nbsp;-&nbsp;Encrypted
+ </EncryptionMessageLabel>
+ ) : (
+ ''
+ )}
+ <br />
+ {/*unencrypted OP_RETURN Message*/}
+ {data.opReturnMessage &&
+ !data.isEncryptedMessage ? (
+ <p>
+ {
+ data.opReturnMessage
+ }
+ </p>
+ ) : (
+ ''
+ )}
+ {/*encrypted and wallet is authorized to view OP_RETURN Message*/}
+ {data.opReturnMessage &&
+ data.isEncryptedMessage &&
+ data.decryptionSuccess ? (
+ <p>
+ {
+ data.opReturnMessage
+ }
+ </p>
+ ) : (
+ ''
+ )}
+ {/*encrypted but wallet is not authorized to view OP_RETURN Message*/}
+ {data.opReturnMessage &&
+ data.isEncryptedMessage &&
+ !data.decryptionSuccess ? (
+ <UnauthorizedDecryptionMessage>
+ {
+ data.opReturnMessage
+ }
+ </UnauthorizedDecryptionMessage>
+ ) : (
+ ''
+ )}
+ {!data.outgoingTx &&
+ data.replyAddress ? (
+ <Link
+ to={{
+ pathname: `/send`,
+ state: {
+ replyAddress:
+ data.replyAddress,
+ },
+ }}
+ >
+ Reply To Message
+ </Link>
+ ) : (
+ ''
+ )}
+ </OpReturnType>
+ </>
+ )}
+ </TxWrapper>
+ </>
+ }
+ >
+ <PanelCtn>
+ <CopyToClipboard text={data.txid}>
+ <DropdownButton
+ onClick={() => {
+ generalNotification(
+ data.txid,
+ 'Tx ID copied to clipboard',
+ );
+ }}
+ >
+ <DropdownIconWrapper>
+ <TextLayer>Copy Tx ID</TextLayer>
+
+ <ThemedCopySolid />
+ </DropdownIconWrapper>
+ </DropdownButton>
+ </CopyToClipboard>
+ <TxLink
+ key={data.txid}
+ href={`${currency.tokenExplorerUrl}/tx/${data.txid}`}
+ target="_blank"
+ rel="noreferrer"
+ >
+ <DropdownButton>
+ <DropdownIconWrapper>
+ <TextLayer>
+ View on be.cash
+ </TextLayer>
+
+ <ThemedLinkSolid />
+ </DropdownIconWrapper>
+ </DropdownButton>
+ </TxLink>
+ </PanelCtn>
+ </Panel>
+ </Collapse>
+ </AntdContextCollapseWrapper>
+ )}
+ </>
+ );
+};
+
+Tx.propTypes = {
+ data: PropTypes.object,
+ fiatPrice: PropTypes.number,
+ fiatCurrency: PropTypes.string,
+};
+
+export default Tx;
diff --git a/web/cashtab-v2/src/components/Home/TxHistory.js b/web/cashtab-v2/src/components/Home/TxHistory.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Home/TxHistory.js
@@ -0,0 +1,27 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import styled from 'styled-components';
+import Tx from './Tx';
+
+const TxHistory = ({ txs, fiatPrice, fiatCurrency }) => {
+ return (
+ <div>
+ {txs.map(tx => (
+ <Tx
+ key={tx.txid}
+ data={tx}
+ fiatPrice={fiatPrice}
+ fiatCurrency={fiatCurrency}
+ />
+ ))}
+ </div>
+ );
+};
+
+TxHistory.propTypes = {
+ txs: PropTypes.array,
+ fiatPrice: PropTypes.number,
+ fiatCurrency: PropTypes.string,
+};
+
+export default TxHistory;
diff --git a/web/cashtab-v2/src/components/Home/__mocks__/walletAndBalancesMock.js b/web/cashtab-v2/src/components/Home/__mocks__/walletAndBalancesMock.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Home/__mocks__/walletAndBalancesMock.js
@@ -0,0 +1,268 @@
+// @generated
+
+export const walletWithBalancesMock = {
+ wallet: {
+ name: 'MigrationTestAlpha',
+ Path245: {
+ cashAddress:
+ 'bitcoincash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy54hkry298',
+ slpAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ fundingWif: 'KwgNkyijAaxFr5XQdnaYyNMXVSZobgHzSoKKfWiC3Q7Xr4n7iYMG',
+ fundingAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ legacyAddress: '1EgPUfBgU7ekho3EjtGze87dRADnUE8ojP',
+ },
+ Path145: {
+ cashAddress:
+ 'bitcoincash:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9v0lgx569z',
+ slpAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ fundingWif: 'L2xvTe6CdNxroR6pbdpGWNjAa55AZX5Wm59W5TXMuH31ihNJdDjt',
+ fundingAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ legacyAddress: '1511T3ynXKgCwXhFijCUWKuTfqbPxFV1AF',
+ },
+ Path1899: {
+ cashAddress:
+ 'bitcoincash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cptzgcqy6',
+ slpAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ fundingWif: 'Kx4FiBMvKK1iXjFk5QTaAK6E4mDGPjmwDZ2HDKGUZpE4gCXMaPe9',
+ fundingAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ legacyAddress: '1J1Aq5tAAYxZgSDRo8soKM2Rb41z3xrYpm',
+ },
+ },
+ balances: {
+ totalBalanceInSatoshis: 6047469,
+ totalBalance: 0.06047469,
+ },
+ loading: false,
+};
+
+export const walletWithoutBalancesMock = {
+ wallet: {
+ name: 'MigrationTestAlpha',
+ Path245: {
+ cashAddress:
+ 'bitcoincash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy54hkry298',
+ slpAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ fundingWif: 'KwgNkyijAaxFr5XQdnaYyNMXVSZobgHzSoKKfWiC3Q7Xr4n7iYMG',
+ fundingAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ legacyAddress: '1EgPUfBgU7ekho3EjtGze87dRADnUE8ojP',
+ },
+ Path145: {
+ cashAddress:
+ 'bitcoincash:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9v0lgx569z',
+ slpAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ fundingWif: 'L2xvTe6CdNxroR6pbdpGWNjAa55AZX5Wm59W5TXMuH31ihNJdDjt',
+ fundingAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ legacyAddress: '1511T3ynXKgCwXhFijCUWKuTfqbPxFV1AF',
+ },
+ Path1899: {
+ cashAddress:
+ 'bitcoincash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cptzgcqy6',
+ slpAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ fundingWif: 'Kx4FiBMvKK1iXjFk5QTaAK6E4mDGPjmwDZ2HDKGUZpE4gCXMaPe9',
+ fundingAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ legacyAddress: '1J1Aq5tAAYxZgSDRo8soKM2Rb41z3xrYpm',
+ },
+ },
+ tokens: [],
+ balances: {
+ totalBalance: 0,
+ },
+ loading: false,
+};
+
+export const walletWithBalancesAndTokens = {
+ wallet: {
+ name: 'MigrationTestAlpha',
+ Path245: {
+ cashAddress:
+ 'bitcoincash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy54hkry298',
+ slpAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ fundingWif: 'KwgNkyijAaxFr5XQdnaYyNMXVSZobgHzSoKKfWiC3Q7Xr4n7iYMG',
+ fundingAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ legacyAddress: '1EgPUfBgU7ekho3EjtGze87dRADnUE8ojP',
+ },
+ Path145: {
+ cashAddress:
+ 'bitcoincash:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9v0lgx569z',
+ slpAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ fundingWif: 'L2xvTe6CdNxroR6pbdpGWNjAa55AZX5Wm59W5TXMuH31ihNJdDjt',
+ fundingAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ legacyAddress: '1511T3ynXKgCwXhFijCUWKuTfqbPxFV1AF',
+ },
+ Path1899: {
+ cashAddress:
+ 'bitcoincash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cptzgcqy6',
+ slpAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ fundingWif: 'Kx4FiBMvKK1iXjFk5QTaAK6E4mDGPjmwDZ2HDKGUZpE4gCXMaPe9',
+ fundingAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ legacyAddress: '1J1Aq5tAAYxZgSDRo8soKM2Rb41z3xrYpm',
+ },
+ },
+ balances: {
+ totalBalanceInSatoshis: 6047469,
+ totalBalance: 0.06047469,
+ },
+ tokens: [
+ {
+ info: {
+ height: 666987,
+ tx_hash:
+ 'e7d554c317db71fd5b50fcf0b2cb4cbdce54a09f1732cfaade0820659318e30a',
+ tx_pos: 2,
+ value: 546,
+ satoshis: 546,
+ txid: 'e7d554c317db71fd5b50fcf0b2cb4cbdce54a09f1732cfaade0820659318e30a',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '6.001',
+ isValid: true,
+ address:
+ 'bitcoincash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy54hkry298',
+ },
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ balance: '6.001',
+ hasBaton: false,
+ },
+ ],
+ loading: false,
+};
+
+export const walletWithBalancesAndTokensWithCorrectState = {
+ wallet: {
+ name: 'MigrationTestAlpha',
+ Path245: {
+ cashAddress:
+ 'bitcoincash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy54hkry298',
+ slpAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ fundingWif: 'KwgNkyijAaxFr5XQdnaYyNMXVSZobgHzSoKKfWiC3Q7Xr4n7iYMG',
+ fundingAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ legacyAddress: '1EgPUfBgU7ekho3EjtGze87dRADnUE8ojP',
+ },
+ Path145: {
+ cashAddress:
+ 'bitcoincash:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9v0lgx569z',
+ slpAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ fundingWif: 'L2xvTe6CdNxroR6pbdpGWNjAa55AZX5Wm59W5TXMuH31ihNJdDjt',
+ fundingAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ legacyAddress: '1511T3ynXKgCwXhFijCUWKuTfqbPxFV1AF',
+ },
+ Path1899: {
+ cashAddress:
+ 'bitcoincash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cptzgcqy6',
+ slpAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ fundingWif: 'Kx4FiBMvKK1iXjFk5QTaAK6E4mDGPjmwDZ2HDKGUZpE4gCXMaPe9',
+ fundingAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ legacyAddress: '1J1Aq5tAAYxZgSDRo8soKM2Rb41z3xrYpm',
+ },
+ state: {
+ balances: {
+ totalBalanceInSatoshis: 6047469,
+ totalBalance: 0.06047469,
+ },
+ tokens: [
+ {
+ info: {
+ height: 666987,
+ tx_hash:
+ 'e7d554c317db71fd5b50fcf0b2cb4cbdce54a09f1732cfaade0820659318e30a',
+ tx_pos: 2,
+ value: 546,
+ satoshis: 546,
+ txid: 'e7d554c317db71fd5b50fcf0b2cb4cbdce54a09f1732cfaade0820659318e30a',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '6.001',
+ isValid: true,
+ address:
+ 'bitcoincash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy54hkry298',
+ },
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ balance: '6.001',
+ hasBaton: false,
+ },
+ ],
+ parsedTxHistory: [],
+ },
+ },
+ balances: {
+ totalBalanceInSatoshis: 6047469,
+ totalBalance: 0.06047469,
+ },
+ tokens: [
+ {
+ info: {
+ height: 666987,
+ tx_hash:
+ 'e7d554c317db71fd5b50fcf0b2cb4cbdce54a09f1732cfaade0820659318e30a',
+ tx_pos: 2,
+ value: 546,
+ satoshis: 546,
+ txid: 'e7d554c317db71fd5b50fcf0b2cb4cbdce54a09f1732cfaade0820659318e30a',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '6.001',
+ isValid: true,
+ address:
+ 'bitcoincash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy54hkry298',
+ },
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ balance: '6.001',
+ hasBaton: false,
+ },
+ ],
+ loading: false,
+};
diff --git a/web/cashtab-v2/src/components/Home/__tests__/Home.test.js b/web/cashtab-v2/src/components/Home/__tests__/Home.test.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Home/__tests__/Home.test.js
@@ -0,0 +1,92 @@
+import React from 'react';
+import renderer from 'react-test-renderer';
+import { ThemeProvider } from 'styled-components';
+import { theme } from '@assets/styles/theme';
+import Home from '../Home';
+import {
+ walletWithBalancesAndTokens,
+ walletWithBalancesMock,
+ walletWithoutBalancesMock,
+ walletWithBalancesAndTokensWithCorrectState,
+} from '../__mocks__/walletAndBalancesMock';
+import { BrowserRouter as Router } from 'react-router-dom';
+
+let realUseContext;
+let useContextMock;
+
+beforeEach(() => {
+ realUseContext = React.useContext;
+ useContextMock = React.useContext = jest.fn();
+});
+
+afterEach(() => {
+ React.useContext = realUseContext;
+});
+
+test('Wallet without BCH balance', () => {
+ useContextMock.mockReturnValue(walletWithoutBalancesMock);
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Home />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Wallet with BCH balances', () => {
+ useContextMock.mockReturnValue(walletWithBalancesMock);
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Home />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Wallet with BCH balances and tokens', () => {
+ useContextMock.mockReturnValue(walletWithBalancesAndTokens);
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Home />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Wallet with BCH balances and tokens and state field', () => {
+ useContextMock.mockReturnValue(walletWithBalancesAndTokensWithCorrectState);
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Home />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Without wallet defined', () => {
+ useContextMock.mockReturnValue({
+ wallet: {},
+ balances: { totalBalance: 0 },
+ });
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Home />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
diff --git a/web/cashtab-v2/src/components/Home/__tests__/__snapshots__/Home.test.js.snap b/web/cashtab-v2/src/components/Home/__tests__/__snapshots__/Home.test.js.snap
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Home/__tests__/__snapshots__/Home.test.js.snap
@@ -0,0 +1,449 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP @generated
+
+exports[`Wallet with BCH balances 1`] = `
+Array [
+ <div
+ className="sc-hmzhuo cYAKWr"
+ >
+ <h4
+ className="sc-gGBfsJ ZgQrz"
+ >
+ MigrationTestAlpha
+ </h4>
+ <div
+ className="sc-kvZOFW cxOlCC"
+ >
+ 0
+
+ XEC
+ </div>
+ </div>,
+ <div
+ className="sc-cJSrbW hStxoF"
+ >
+ <div
+ className="sc-jnlKLf loFZIX"
+ >
+ <button
+ className="sc-fYxtnH gnEKHM"
+ onClick={[Function]}
+ >
+ Transactions
+ </button>
+ <button
+ className="sc-fYxtnH bYcRiT"
+ onClick={[Function]}
+ >
+ eTokens
+ </button>
+ </div>
+ <div
+ className="sc-tilXH gcpRYy"
+ >
+ <div />
+ <span
+ aria-label="party emoji"
+ role="img"
+ >
+ 🎉
+ </span>
+ Congratulations on your new wallet!
+
+ <span
+ aria-label="party emoji"
+ role="img"
+ >
+ 🎉
+ </span>
+ <br />
+ Start using the wallet immediately to receive
+
+ XEC
+ payments, or load it up with
+
+ XEC
+ to send to others
+ </div>
+ <div
+ className="sc-tilXH boVOvg"
+ >
+ <a
+ className="sc-kafWEX ekuTxS"
+ href="/tokens"
+ onClick={[Function]}
+ >
+ Create eToken
+ </a>
+ <p>
+ Tokens sent to your
+ eToken
+ address will appear here
+ </p>
+ </div>
+ </div>,
+]
+`;
+
+exports[`Wallet with BCH balances and tokens 1`] = `
+Array [
+ <div
+ className="sc-hmzhuo cYAKWr"
+ >
+ <h4
+ className="sc-gGBfsJ ZgQrz"
+ >
+ MigrationTestAlpha
+ </h4>
+ <div
+ className="sc-kvZOFW cxOlCC"
+ >
+ 0
+
+ XEC
+ </div>
+ </div>,
+ <div
+ className="sc-cJSrbW hStxoF"
+ >
+ <div
+ className="sc-jnlKLf loFZIX"
+ >
+ <button
+ className="sc-fYxtnH gnEKHM"
+ onClick={[Function]}
+ >
+ Transactions
+ </button>
+ <button
+ className="sc-fYxtnH bYcRiT"
+ onClick={[Function]}
+ >
+ eTokens
+ </button>
+ </div>
+ <div
+ className="sc-tilXH gcpRYy"
+ >
+ <div />
+ <span
+ aria-label="party emoji"
+ role="img"
+ >
+ 🎉
+ </span>
+ Congratulations on your new wallet!
+
+ <span
+ aria-label="party emoji"
+ role="img"
+ >
+ 🎉
+ </span>
+ <br />
+ Start using the wallet immediately to receive
+
+ XEC
+ payments, or load it up with
+
+ XEC
+ to send to others
+ </div>
+ <div
+ className="sc-tilXH boVOvg"
+ >
+ <a
+ className="sc-kafWEX ekuTxS"
+ href="/tokens"
+ onClick={[Function]}
+ >
+ Create eToken
+ </a>
+ <p>
+ Tokens sent to your
+ eToken
+ address will appear here
+ </p>
+ </div>
+ </div>,
+]
+`;
+
+exports[`Wallet with BCH balances and tokens and state field 1`] = `
+Array [
+ <div
+ className="sc-hmzhuo cYAKWr"
+ >
+ <h4
+ className="sc-gGBfsJ ZgQrz"
+ >
+ MigrationTestAlpha
+ </h4>
+ <div
+ className="sc-kvZOFW cxOlCC"
+ >
+ 0.06
+
+ XEC
+ </div>
+ </div>,
+ <div
+ className="sc-cJSrbW hStxoF"
+ >
+ <div
+ className="sc-jnlKLf loFZIX"
+ >
+ <button
+ className="sc-fYxtnH gnEKHM"
+ onClick={[Function]}
+ >
+ Transactions
+ </button>
+ <button
+ className="sc-fYxtnH bYcRiT"
+ onClick={[Function]}
+ >
+ eTokens
+ </button>
+ </div>
+ <div
+ className="sc-tilXH gcpRYy"
+ >
+ <div />
+ <span
+ aria-label="party emoji"
+ role="img"
+ >
+ 🎉
+ </span>
+ Congratulations on your new wallet!
+
+ <span
+ aria-label="party emoji"
+ role="img"
+ >
+ 🎉
+ </span>
+ <br />
+ Start using the wallet immediately to receive
+
+ XEC
+ payments, or load it up with
+
+ XEC
+ to send to others
+ </div>
+ <div
+ className="sc-tilXH boVOvg"
+ >
+ <a
+ className="sc-kafWEX ekuTxS"
+ href="/tokens"
+ onClick={[Function]}
+ >
+ Create eToken
+ </a>
+ <div>
+ <a
+ href="/send-token/bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba"
+ onClick={[Function]}
+ >
+ <div
+ className="sc-ckVGcZ fPvBhX"
+ >
+ <div
+ className="sc-dxgOiQ CHiNn"
+ >
+ <div
+ className="sc-kpOJdX kKjisQ"
+ />
+ <h4>
+ TBS
+ </h4>
+ </div>
+ <h4>
+ 6.001
+ </h4>
+ </div>
+ </a>
+ </div>
+ </div>
+ </div>,
+]
+`;
+
+exports[`Wallet without BCH balance 1`] = `
+Array [
+ <div
+ className="sc-hmzhuo cYAKWr"
+ >
+ <h4
+ className="sc-gGBfsJ ZgQrz"
+ >
+ MigrationTestAlpha
+ </h4>
+ <div
+ className="sc-kvZOFW cxOlCC"
+ >
+ 0
+
+ XEC
+ </div>
+ </div>,
+ <div
+ className="sc-cJSrbW hStxoF"
+ >
+ <div
+ className="sc-jnlKLf loFZIX"
+ >
+ <button
+ className="sc-fYxtnH gnEKHM"
+ onClick={[Function]}
+ >
+ Transactions
+ </button>
+ <button
+ className="sc-fYxtnH bYcRiT"
+ onClick={[Function]}
+ >
+ eTokens
+ </button>
+ </div>
+ <div
+ className="sc-tilXH gcpRYy"
+ >
+ <div />
+ <span
+ aria-label="party emoji"
+ role="img"
+ >
+ 🎉
+ </span>
+ Congratulations on your new wallet!
+
+ <span
+ aria-label="party emoji"
+ role="img"
+ >
+ 🎉
+ </span>
+ <br />
+ Start using the wallet immediately to receive
+
+ XEC
+ payments, or load it up with
+
+ XEC
+ to send to others
+ </div>
+ <div
+ className="sc-tilXH boVOvg"
+ >
+ <a
+ className="sc-kafWEX ekuTxS"
+ href="/tokens"
+ onClick={[Function]}
+ >
+ Create eToken
+ </a>
+ <p>
+ Tokens sent to your
+ eToken
+ address will appear here
+ </p>
+ </div>
+ </div>,
+]
+`;
+
+exports[`Without wallet defined 1`] = `
+<div
+ className="sc-chPdSV cOYtDU"
+>
+ <h2>
+ Welcome to Cashtab!
+ </h2>
+ <p
+ className="sc-kgoBCf iXiIML"
+ >
+ Cashtab is an
+
+ <a
+ className="sc-kGXeez dlhNKT"
+ href="https://github.com/bitcoin-abc/bitcoin-abc"
+ rel="noreferrer"
+ target="_blank"
+ >
+ open source,
+ </a>
+
+ non-custodial web wallet for
+ eCash
+ .
+ <br />
+ <br />
+ Want to learn more?
+
+ <a
+ className="sc-kGXeez dlhNKT"
+ href="https://docs.cashtabapp.com/docs/"
+ rel="noreferrer"
+ target="_blank"
+ >
+ Check out the Cashtab documentation.
+ </a>
+ </p>
+ <button
+ className="sc-jzJRlG lltaza"
+ onClick={[Function]}
+ >
+ <span
+ aria-label="plus-square"
+ className="anticon anticon-plus-square"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="plus-square"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M328 544h152v152c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V544h152c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H544V328c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v152H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z"
+ />
+ <path
+ d="M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"
+ />
+ </svg>
+ </span>
+ New Wallet
+ </button>
+ <button
+ className="sc-cSHVUG fQByuZ"
+ onClick={[Function]}
+ >
+ <span
+ aria-label="import"
+ className="anticon anticon-import"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="import"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M888.3 757.4h-53.8c-4.2 0-7.7 3.5-7.7 7.7v61.8H197.1V197.1h629.8v61.8c0 4.2 3.5 7.7 7.7 7.7h53.8c4.2 0 7.7-3.4 7.7-7.7V158.7c0-17-13.7-30.7-30.7-30.7H158.7c-17 0-30.7 13.7-30.7 30.7v706.6c0 17 13.7 30.7 30.7 30.7h706.6c17 0 30.7-13.7 30.7-30.7V765.1c0-4.3-3.5-7.7-7.7-7.7zM902 476H588v-76c0-6.7-7.8-10.5-13-6.3l-141.9 112a8 8 0 000 12.6l141.9 112c5.3 4.2 13 .4 13-6.3v-76h314c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z"
+ />
+ </svg>
+ </span>
+ Import Wallet
+ </button>
+</div>
+`;
diff --git a/web/cashtab-v2/src/components/NotFound.js b/web/cashtab-v2/src/components/NotFound.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/NotFound.js
@@ -0,0 +1,12 @@
+import React from 'react';
+import { Row, Col } from 'antd';
+
+const NotFound = () => (
+ <Row justify="center" type="flex">
+ <Col span={8}>
+ <h1>Page not found</h1>
+ </Col>
+ </Row>
+);
+
+export default NotFound;
diff --git a/web/cashtab-v2/src/components/OnBoarding/OnBoarding.js b/web/cashtab-v2/src/components/OnBoarding/OnBoarding.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/OnBoarding/OnBoarding.js
@@ -0,0 +1,168 @@
+import React, { useState } from 'react';
+import styled from 'styled-components';
+import { WalletContext } from '@utils/context';
+import { Input, Form, Modal } from 'antd';
+import { AntdFormWrapper } from '@components/Common/EnhancedInputs';
+import {
+ ExclamationCircleOutlined,
+ PlusSquareOutlined,
+ ImportOutlined,
+ LockOutlined,
+} from '@ant-design/icons';
+import PrimaryButton, {
+ SecondaryButton,
+ SmartButton,
+} from '@components/Common/PrimaryButton';
+import { currency } from '@components/Common/Ticker.js';
+import { Event } from '@utils/GoogleAnalytics';
+
+export const WelcomeCtn = styled.div`
+ margin-top: 20px;
+ padding: 0px 30px;
+ color: ${props => props.theme.contrast};
+ h2 {
+ color: ${props => props.theme.contrast};
+ }
+`;
+
+export const WelcomeText = styled.p`
+ width: 100%;
+ font-size: 16px;
+ margin-bottom: 60px;
+ text-align: left;
+`;
+
+export const WelcomeLink = styled.a`
+ text-decoration: underline;
+ color: ${props => props.theme.eCashBlue};
+ :hover {
+ color: ${props => props.theme.eCashPurple} !important;
+ text-decoration: underline !important;
+ }
+`;
+
+const OnBoarding = () => {
+ const ContextValue = React.useContext(WalletContext);
+ const { createWallet, validateMnemonic } = ContextValue;
+ const [formData, setFormData] = useState({
+ dirty: true,
+ mnemonic: '',
+ });
+
+ const [seedInput, openSeedInput] = useState(false);
+ const [isValidMnemonic, setIsValidMnemonic] = useState(false);
+ const { confirm } = Modal;
+
+ async function submit() {
+ setFormData({
+ ...formData,
+ dirty: false,
+ });
+
+ if (!formData.mnemonic) {
+ return;
+ }
+ // Event("Category", "Action", "Label")
+ // Track number of created wallets from onboarding
+ Event('Onboarding.js', 'Create Wallet', 'Imported');
+ createWallet(formData.mnemonic);
+ }
+
+ const handleChange = e => {
+ const { value, name } = e.target;
+
+ // Validate mnemonic on change
+ // Import button should be disabled unless mnemonic is valid
+ setIsValidMnemonic(validateMnemonic(value));
+
+ setFormData(p => ({ ...p, [name]: value }));
+ };
+
+ function showBackupConfirmModal() {
+ confirm({
+ title: "Don't forget to back up your wallet",
+ icon: <ExclamationCircleOutlined />,
+ cancelButtonProps: { style: { display: 'none' } },
+ content: `Once your wallet is created you can back it up by writing down your 12-word seed. You can find your seed on the Settings page. If you are browsing in Incognito mode or if you clear your browser history, you will lose any funds that are not backed up!`,
+ okText: 'Okay, make me a wallet!',
+ onOk() {
+ // Event("Category", "Action", "Label")
+ // Track number of created wallets from onboarding
+ Event('Onboarding.js', 'Create Wallet', 'New');
+ createWallet();
+ },
+ });
+ }
+
+ return (
+ <WelcomeCtn>
+ <h2>Welcome to Cashtab!</h2>
+ <WelcomeText>
+ Cashtab is an{' '}
+ <WelcomeLink
+ href="https://github.com/bitcoin-abc/bitcoin-abc"
+ target="_blank"
+ rel="noreferrer"
+ >
+ open source,
+ </WelcomeLink>{' '}
+ non-custodial web wallet for {currency.name}.
+ <br />
+ <br />
+ Want to learn more?{' '}
+ <WelcomeLink
+ href="https://docs.cashtabapp.com/docs/"
+ target="_blank"
+ rel="noreferrer"
+ >
+ Check out the Cashtab documentation.
+ </WelcomeLink>
+ </WelcomeText>
+
+ <PrimaryButton onClick={() => showBackupConfirmModal()}>
+ <PlusSquareOutlined /> New Wallet
+ </PrimaryButton>
+
+ <SecondaryButton onClick={() => openSeedInput(!seedInput)}>
+ <ImportOutlined /> Import Wallet
+ </SecondaryButton>
+ {seedInput && (
+ <AntdFormWrapper>
+ <Form style={{ width: 'auto' }}>
+ <Form.Item
+ validateStatus={
+ !formData.dirty && !formData.mnemonic
+ ? 'error'
+ : ''
+ }
+ help={
+ !formData.mnemonic || !isValidMnemonic
+ ? 'Valid mnemonic seed phrase required'
+ : ''
+ }
+ >
+ <Input
+ prefix={<LockOutlined />}
+ type="email"
+ placeholder="mnemonic (seed phrase)"
+ name="mnemonic"
+ autoComplete="off"
+ onChange={e => handleChange(e)}
+ required
+ />
+ </Form.Item>
+
+ <SmartButton
+ disabled={!isValidMnemonic}
+ onClick={() => submit()}
+ >
+ Import
+ </SmartButton>
+ </Form>
+ </AntdFormWrapper>
+ )}
+ </WelcomeCtn>
+ );
+};
+
+export default OnBoarding;
diff --git a/web/cashtab-v2/src/components/Receive/Receive.js b/web/cashtab-v2/src/components/Receive/Receive.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Receive/Receive.js
@@ -0,0 +1,137 @@
+import React from 'react';
+import styled from 'styled-components';
+import { WalletContext } from '@utils/context';
+import OnBoarding from '@components/OnBoarding/OnBoarding';
+import { QRCode } from '@components/Common/QRCode';
+import { currency } from '@components/Common/Ticker.js';
+import { LoadingCtn } from '@components/Common/Atoms';
+
+export const ReceiveCtn = styled.div`
+ width: 100%;
+ margin-top: 100px;
+ h2 {
+ color: ${props => props.theme.contrast};
+ margin: 0 0 20px;
+ }
+`;
+
+export const SwitchBtnCtn = styled.div`
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ align-content: space-between;
+ margin-bottom: 15px;
+ .nonactiveBtn {
+ color: ${props => props.theme.walletBackground};
+ background: ${props => props.theme.contrast} !important;
+ opacity: 0.7;
+ box-shadow: none !important;
+ }
+ .slpActive {
+ background: ${props => props.theme.eCashPurple} !important;
+ }
+`;
+
+export const SwitchBtn = styled.div`
+ font-weight: bold;
+ display: inline-block;
+ cursor: pointer;
+ color: ${props => props.theme.switchButtonActiveText};
+ font-size: 14px;
+ padding: 6px 0;
+ width: 100px;
+ margin: 0 1px;
+ text-decoration: none;
+ background: ${props => props.theme.eCashBlue};
+ user-select: none;
+ :first-child {
+ border-radius: 100px 0 0 100px;
+ }
+ :nth-child(2) {
+ border-radius: 0 100px 100px 0;
+ }
+`;
+
+const WalletInfo = () => {
+ const ContextValue = React.useContext(WalletContext);
+ const { wallet } = ContextValue;
+ const [isCashAddress, setIsCashAddress] = React.useState(true);
+
+ const handleChangeAddress = () => {
+ setIsCashAddress(!isCashAddress);
+ };
+
+ return (
+ <ReceiveCtn>
+ <h2>Receive {isCashAddress ? 'XEC' : 'eToken'}</h2>
+ {wallet && ((wallet.Path245 && wallet.Path145) || wallet.Path1899) && (
+ <>
+ {wallet.Path1899 ? (
+ <>
+ <QRCode
+ id="borderedQRCode"
+ address={
+ isCashAddress
+ ? wallet.Path1899.cashAddress
+ : wallet.Path1899.slpAddress
+ }
+ isCashAddress={isCashAddress}
+ />
+ </>
+ ) : (
+ <>
+ <QRCode
+ id="borderedQRCode"
+ address={
+ isCashAddress
+ ? wallet.Path245.cashAddress
+ : wallet.Path245.slpAddress
+ }
+ isCashAddress={isCashAddress}
+ />
+ </>
+ )}
+ </>
+ )}
+
+ <SwitchBtnCtn>
+ <SwitchBtn
+ onClick={() => handleChangeAddress()}
+ className={isCashAddress ? null : 'nonactiveBtn'}
+ >
+ {currency.ticker}
+ </SwitchBtn>
+ <SwitchBtn
+ onClick={() => handleChangeAddress()}
+ className={isCashAddress ? 'nonactiveBtn' : 'slpActive'}
+ >
+ {currency.tokenTicker}
+ </SwitchBtn>
+ </SwitchBtnCtn>
+ </ReceiveCtn>
+ );
+};
+
+const Receive = () => {
+ const ContextValue = React.useContext(WalletContext);
+ const { wallet, previousWallet, loading } = ContextValue;
+
+ return (
+ <>
+ {loading ? (
+ <LoadingCtn />
+ ) : (
+ <>
+ {(wallet && wallet.Path1899) ||
+ (previousWallet && previousWallet.path1899) ? (
+ <WalletInfo />
+ ) : (
+ <OnBoarding />
+ )}
+ </>
+ )}
+ </>
+ );
+};
+
+export default Receive;
diff --git a/web/cashtab-v2/src/components/Receive/__tests__/Receive.test.js b/web/cashtab-v2/src/components/Receive/__tests__/Receive.test.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Receive/__tests__/Receive.test.js
@@ -0,0 +1,109 @@
+import React from 'react';
+import renderer from 'react-test-renderer';
+import { ThemeProvider } from 'styled-components';
+import { theme } from '@assets/styles/theme';
+import Receive from '@components/Receive/Receive';
+import {
+ walletWithBalancesAndTokens,
+ walletWithBalancesMock,
+ walletWithoutBalancesMock,
+ walletWithBalancesAndTokensWithCorrectState,
+} from '../../Home/__mocks__/walletAndBalancesMock';
+import { BrowserRouter as Router } from 'react-router-dom';
+
+let realUseContext;
+let useContextMock;
+
+beforeEach(() => {
+ realUseContext = React.useContext;
+ useContextMock = React.useContext = jest.fn();
+
+ // Mock method not implemented in JSDOM
+ // See reference at https://jestjs.io/docs/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom
+ Object.defineProperty(window, 'matchMedia', {
+ writable: true,
+ value: jest.fn().mockImplementation(query => ({
+ matches: false,
+ media: query,
+ onchange: null,
+ addListener: jest.fn(), // Deprecated
+ removeListener: jest.fn(), // Deprecated
+ addEventListener: jest.fn(),
+ removeEventListener: jest.fn(),
+ dispatchEvent: jest.fn(),
+ })),
+ });
+});
+
+afterEach(() => {
+ React.useContext = realUseContext;
+});
+
+test('Wallet without BCH balance', () => {
+ useContextMock.mockReturnValue(walletWithoutBalancesMock);
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Receive />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Wallet with BCH balances', () => {
+ useContextMock.mockReturnValue(walletWithBalancesMock);
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Receive />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Wallet with BCH balances and tokens', () => {
+ useContextMock.mockReturnValue(walletWithBalancesAndTokens);
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Receive />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Wallet with BCH balances and tokens and state field', () => {
+ useContextMock.mockReturnValue(walletWithBalancesAndTokensWithCorrectState);
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Receive />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Without wallet defined', () => {
+ useContextMock.mockReturnValue({
+ wallet: {},
+ balances: { totalBalance: 0 },
+ loading: false,
+ });
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Receive />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
diff --git a/web/cashtab-v2/src/components/Receive/__tests__/__snapshots__/Receive.test.js.snap b/web/cashtab-v2/src/components/Receive/__tests__/__snapshots__/Receive.test.js.snap
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Receive/__tests__/__snapshots__/Receive.test.js.snap
@@ -0,0 +1,534 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP @generated
+
+exports[`Wallet with BCH balances 1`] = `
+<div
+ className="sc-gPEVay bbSJoW"
+>
+ <h2>
+ Receive
+ XEC
+ </h2>
+ <div
+ onClick={[Function]}
+ style={
+ Object {
+ "display": "inline-block",
+ "position": "relative",
+ "width": "100%",
+ }
+ }
+ >
+ <div
+ className="sc-dxgOiQ fKbQGD"
+ style={
+ Object {
+ "display": "none",
+ }
+ }
+ >
+ Copied
+ <br />
+ <span
+ style={
+ Object {
+ "fontSize": "12px",
+ }
+ }
+ >
+ ecash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7ccxkrr6zd
+ </span>
+ </div>
+ <svg
+ className="sc-kpOJdX hDqPid"
+ height={210}
+ id="borderedQRCode"
+ shapeRendering="crispEdges"
+ viewBox="0 0 37 37"
+ width={210}
+ xec={1}
+ >
+ <path
+ d="M0,0 h37v37H0z"
+ fill="#FFFFFF"
+ />
+ <path
+ d="M4 4h7v1H4zM12 4h1v1H12zM14 4h1v1H14zM16 4h1v1H16zM18 4h1v1H18zM21 4h4v1H21zM26,4 h7v1H26zM4 5h1v1H4zM10 5h1v1H10zM13 5h5v1H13zM20 5h1v1H20zM22 5h1v1H22zM26 5h1v1H26zM32,5 h1v1H32zM4 6h1v1H4zM6 6h3v1H6zM10 6h1v1H10zM12 6h3v1H12zM17 6h1v1H17zM19 6h2v1H19zM26 6h1v1H26zM28 6h3v1H28zM32,6 h1v1H32zM4 7h1v1H4zM6 7h3v1H6zM10 7h1v1H10zM12 7h3v1H12zM16 7h4v1H16zM21 7h2v1H21zM26 7h1v1H26zM28 7h3v1H28zM32,7 h1v1H32zM4 8h1v1H4zM6 8h3v1H6zM10 8h1v1H10zM12 8h1v1H12zM15 8h3v1H15zM19 8h5v1H19zM26 8h1v1H26zM28 8h3v1H28zM32,8 h1v1H32zM4 9h1v1H4zM10 9h1v1H10zM14 9h2v1H14zM17 9h1v1H17zM21 9h1v1H21zM23 9h1v1H23zM26 9h1v1H26zM32,9 h1v1H32zM4 10h7v1H4zM12 10h1v1H12zM14 10h1v1H14zM16 10h1v1H16zM18 10h1v1H18zM20 10h1v1H20zM22 10h1v1H22zM24 10h1v1H24zM26,10 h7v1H26zM14 11h1v1H14zM16 11h1v1H16zM19 11h1v1H19zM21 11h3v1H21zM4 12h4v1H4zM10 12h1v1H10zM12 12h1v1H12zM14 12h2v1H14zM19 12h7v1H19zM28 12h3v1H28zM32,12 h1v1H32zM5 13h1v1H5zM7 13h2v1H7zM12 13h1v1H12zM14 13h1v1H14zM16 13h1v1H16zM18 13h1v1H18zM20 13h1v1H20zM22 13h3v1H22zM26 13h1v1H26zM28 13h1v1H28zM32,13 h1v1H32zM4 14h2v1H4zM7 14h4v1H7zM12 14h4v1H12zM17 14h1v1H17zM21 14h1v1H21zM25 14h1v1H25zM27 14h1v1H27zM29 14h1v1H29zM31 14h1v1H31zM4 15h2v1H4zM8 15h2v1H8zM12 15h3v1H12zM16 15h3v1H16zM20 15h1v1H20zM22 15h1v1H22zM25 15h1v1H25zM27 15h1v1H27zM31,15 h2v1H31zM5 16h4v1H5zM10 16h2v1H10zM13 16h2v1H13zM21 16h1v1H21zM23 16h1v1H23zM27 16h1v1H27zM30 16h2v1H30zM5 17h1v1H5zM7 17h1v1H7zM9 17h1v1H9zM11 17h1v1H11zM13 17h1v1H13zM21 17h1v1H21zM23 17h1v1H23zM26 17h2v1H26zM32,17 h1v1H32zM5 18h1v1H5zM9 18h2v1H9zM12 18h1v1H12zM14 18h1v1H14zM21 18h1v1H21zM23 18h1v1H23zM25 18h1v1H25zM27 18h1v1H27zM29 18h1v1H29zM31,18 h2v1H31zM5 19h5v1H5zM12 19h1v1H12zM15 19h1v1H15zM32,19 h1v1H32zM8 20h4v1H8zM14 20h1v1H14zM22 20h2v1H22zM25 20h1v1H25zM28 20h2v1H28zM6 21h1v1H6zM12 21h1v1H12zM15 21h3v1H15zM19 21h1v1H19zM21 21h1v1H21zM24 21h2v1H24zM27 21h1v1H27zM29 21h2v1H29zM4 22h1v1H4zM7 22h1v1H7zM9 22h3v1H9zM13 22h2v1H13zM16 22h2v1H16zM19 22h1v1H19zM21 22h2v1H21zM24 22h1v1H24zM27 22h1v1H27zM30 22h1v1H30zM8 23h2v1H8zM13 23h2v1H13zM16 23h1v1H16zM19 23h1v1H19zM21 23h1v1H21zM24 23h1v1H24zM26 23h1v1H26zM29 23h3v1H29zM5 24h2v1H5zM8 24h1v1H8zM10 24h1v1H10zM16 24h1v1H16zM18 24h1v1H18zM21 24h8v1H21zM30,24 h3v1H30zM12 25h1v1H12zM15 25h4v1H15zM20 25h5v1H20zM28 25h1v1H28zM31,25 h2v1H31zM4 26h7v1H4zM13 26h1v1H13zM15 26h1v1H15zM18 26h1v1H18zM20 26h1v1H20zM22 26h3v1H22zM26 26h1v1H26zM28 26h4v1H28zM4 27h1v1H4zM10 27h1v1H10zM14 27h2v1H14zM17 27h1v1H17zM19 27h2v1H19zM24 27h1v1H24zM28 27h1v1H28zM32,27 h1v1H32zM4 28h1v1H4zM6 28h3v1H6zM10 28h1v1H10zM13 28h2v1H13zM17 28h5v1H17zM24 28h8v1H24zM4 29h1v1H4zM6 29h3v1H6zM10 29h1v1H10zM12 29h3v1H12zM16 29h4v1H16zM22 29h1v1H22zM25 29h1v1H25zM27 29h2v1H27zM31,29 h2v1H31zM4 30h1v1H4zM6 30h3v1H6zM10 30h1v1H10zM12 30h1v1H12zM14 30h1v1H14zM21 30h1v1H21zM27 30h1v1H27zM29 30h2v1H29zM32,30 h1v1H32zM4 31h1v1H4zM10 31h1v1H10zM12 31h2v1H12zM15 31h2v1H15zM18 31h1v1H18zM20 31h1v1H20zM22 31h8v1H22zM31 31h1v1H31zM4 32h7v1H4zM12 32h1v1H12zM14 32h4v1H14zM20 32h1v1H20zM24 32h1v1H24zM27 32h1v1H27zM31 32h1v1H31z"
+ fill="#000000"
+ />
+ <image
+ height={4.228571428571429}
+ preserveAspectRatio="none"
+ width={4.228571428571429}
+ x={16.385714285714286}
+ xlinkHref="logo_primary.png"
+ y={16.385714285714286}
+ />
+ </svg>
+ <div
+ className="sc-eNQAEJ gjYjhd notranslate"
+ >
+ <input
+ readOnly={true}
+ spellCheck="false"
+ type="text"
+ value="ecash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7ccxkrr6zd"
+ />
+ <span
+ className="sc-ckVGcZ jazPqU"
+ >
+ ecash:
+ </span>
+ <span
+ className="sc-jKJlTe kbljfd"
+ >
+ qzagy47m
+ </span>
+ vh6qxkvcn3acjnz73rkhkc6y7c
+ <span
+ className="sc-jKJlTe kbljfd"
+ >
+ cxkrr6zd
+ </span>
+ </div>
+ </div>
+ <div
+ className="sc-iRbamj foQCcl"
+ >
+ <div
+ className="sc-jlyJG gkrAXP"
+ onClick={[Function]}
+ >
+ XEC
+ </div>
+ <div
+ className="sc-jlyJG gkrAXP nonactiveBtn"
+ onClick={[Function]}
+ >
+ eToken
+ </div>
+ </div>
+</div>
+`;
+
+exports[`Wallet with BCH balances and tokens 1`] = `
+<div
+ className="sc-gPEVay bbSJoW"
+>
+ <h2>
+ Receive
+ XEC
+ </h2>
+ <div
+ onClick={[Function]}
+ style={
+ Object {
+ "display": "inline-block",
+ "position": "relative",
+ "width": "100%",
+ }
+ }
+ >
+ <div
+ className="sc-dxgOiQ fKbQGD"
+ style={
+ Object {
+ "display": "none",
+ }
+ }
+ >
+ Copied
+ <br />
+ <span
+ style={
+ Object {
+ "fontSize": "12px",
+ }
+ }
+ >
+ ecash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7ccxkrr6zd
+ </span>
+ </div>
+ <svg
+ className="sc-kpOJdX hDqPid"
+ height={210}
+ id="borderedQRCode"
+ shapeRendering="crispEdges"
+ viewBox="0 0 37 37"
+ width={210}
+ xec={1}
+ >
+ <path
+ d="M0,0 h37v37H0z"
+ fill="#FFFFFF"
+ />
+ <path
+ d="M4 4h7v1H4zM12 4h1v1H12zM14 4h1v1H14zM16 4h1v1H16zM18 4h1v1H18zM21 4h4v1H21zM26,4 h7v1H26zM4 5h1v1H4zM10 5h1v1H10zM13 5h5v1H13zM20 5h1v1H20zM22 5h1v1H22zM26 5h1v1H26zM32,5 h1v1H32zM4 6h1v1H4zM6 6h3v1H6zM10 6h1v1H10zM12 6h3v1H12zM17 6h1v1H17zM19 6h2v1H19zM26 6h1v1H26zM28 6h3v1H28zM32,6 h1v1H32zM4 7h1v1H4zM6 7h3v1H6zM10 7h1v1H10zM12 7h3v1H12zM16 7h4v1H16zM21 7h2v1H21zM26 7h1v1H26zM28 7h3v1H28zM32,7 h1v1H32zM4 8h1v1H4zM6 8h3v1H6zM10 8h1v1H10zM12 8h1v1H12zM15 8h3v1H15zM19 8h5v1H19zM26 8h1v1H26zM28 8h3v1H28zM32,8 h1v1H32zM4 9h1v1H4zM10 9h1v1H10zM14 9h2v1H14zM17 9h1v1H17zM21 9h1v1H21zM23 9h1v1H23zM26 9h1v1H26zM32,9 h1v1H32zM4 10h7v1H4zM12 10h1v1H12zM14 10h1v1H14zM16 10h1v1H16zM18 10h1v1H18zM20 10h1v1H20zM22 10h1v1H22zM24 10h1v1H24zM26,10 h7v1H26zM14 11h1v1H14zM16 11h1v1H16zM19 11h1v1H19zM21 11h3v1H21zM4 12h4v1H4zM10 12h1v1H10zM12 12h1v1H12zM14 12h2v1H14zM19 12h7v1H19zM28 12h3v1H28zM32,12 h1v1H32zM5 13h1v1H5zM7 13h2v1H7zM12 13h1v1H12zM14 13h1v1H14zM16 13h1v1H16zM18 13h1v1H18zM20 13h1v1H20zM22 13h3v1H22zM26 13h1v1H26zM28 13h1v1H28zM32,13 h1v1H32zM4 14h2v1H4zM7 14h4v1H7zM12 14h4v1H12zM17 14h1v1H17zM21 14h1v1H21zM25 14h1v1H25zM27 14h1v1H27zM29 14h1v1H29zM31 14h1v1H31zM4 15h2v1H4zM8 15h2v1H8zM12 15h3v1H12zM16 15h3v1H16zM20 15h1v1H20zM22 15h1v1H22zM25 15h1v1H25zM27 15h1v1H27zM31,15 h2v1H31zM5 16h4v1H5zM10 16h2v1H10zM13 16h2v1H13zM21 16h1v1H21zM23 16h1v1H23zM27 16h1v1H27zM30 16h2v1H30zM5 17h1v1H5zM7 17h1v1H7zM9 17h1v1H9zM11 17h1v1H11zM13 17h1v1H13zM21 17h1v1H21zM23 17h1v1H23zM26 17h2v1H26zM32,17 h1v1H32zM5 18h1v1H5zM9 18h2v1H9zM12 18h1v1H12zM14 18h1v1H14zM21 18h1v1H21zM23 18h1v1H23zM25 18h1v1H25zM27 18h1v1H27zM29 18h1v1H29zM31,18 h2v1H31zM5 19h5v1H5zM12 19h1v1H12zM15 19h1v1H15zM32,19 h1v1H32zM8 20h4v1H8zM14 20h1v1H14zM22 20h2v1H22zM25 20h1v1H25zM28 20h2v1H28zM6 21h1v1H6zM12 21h1v1H12zM15 21h3v1H15zM19 21h1v1H19zM21 21h1v1H21zM24 21h2v1H24zM27 21h1v1H27zM29 21h2v1H29zM4 22h1v1H4zM7 22h1v1H7zM9 22h3v1H9zM13 22h2v1H13zM16 22h2v1H16zM19 22h1v1H19zM21 22h2v1H21zM24 22h1v1H24zM27 22h1v1H27zM30 22h1v1H30zM8 23h2v1H8zM13 23h2v1H13zM16 23h1v1H16zM19 23h1v1H19zM21 23h1v1H21zM24 23h1v1H24zM26 23h1v1H26zM29 23h3v1H29zM5 24h2v1H5zM8 24h1v1H8zM10 24h1v1H10zM16 24h1v1H16zM18 24h1v1H18zM21 24h8v1H21zM30,24 h3v1H30zM12 25h1v1H12zM15 25h4v1H15zM20 25h5v1H20zM28 25h1v1H28zM31,25 h2v1H31zM4 26h7v1H4zM13 26h1v1H13zM15 26h1v1H15zM18 26h1v1H18zM20 26h1v1H20zM22 26h3v1H22zM26 26h1v1H26zM28 26h4v1H28zM4 27h1v1H4zM10 27h1v1H10zM14 27h2v1H14zM17 27h1v1H17zM19 27h2v1H19zM24 27h1v1H24zM28 27h1v1H28zM32,27 h1v1H32zM4 28h1v1H4zM6 28h3v1H6zM10 28h1v1H10zM13 28h2v1H13zM17 28h5v1H17zM24 28h8v1H24zM4 29h1v1H4zM6 29h3v1H6zM10 29h1v1H10zM12 29h3v1H12zM16 29h4v1H16zM22 29h1v1H22zM25 29h1v1H25zM27 29h2v1H27zM31,29 h2v1H31zM4 30h1v1H4zM6 30h3v1H6zM10 30h1v1H10zM12 30h1v1H12zM14 30h1v1H14zM21 30h1v1H21zM27 30h1v1H27zM29 30h2v1H29zM32,30 h1v1H32zM4 31h1v1H4zM10 31h1v1H10zM12 31h2v1H12zM15 31h2v1H15zM18 31h1v1H18zM20 31h1v1H20zM22 31h8v1H22zM31 31h1v1H31zM4 32h7v1H4zM12 32h1v1H12zM14 32h4v1H14zM20 32h1v1H20zM24 32h1v1H24zM27 32h1v1H27zM31 32h1v1H31z"
+ fill="#000000"
+ />
+ <image
+ height={4.228571428571429}
+ preserveAspectRatio="none"
+ width={4.228571428571429}
+ x={16.385714285714286}
+ xlinkHref="logo_primary.png"
+ y={16.385714285714286}
+ />
+ </svg>
+ <div
+ className="sc-eNQAEJ gjYjhd notranslate"
+ >
+ <input
+ readOnly={true}
+ spellCheck="false"
+ type="text"
+ value="ecash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7ccxkrr6zd"
+ />
+ <span
+ className="sc-ckVGcZ jazPqU"
+ >
+ ecash:
+ </span>
+ <span
+ className="sc-jKJlTe kbljfd"
+ >
+ qzagy47m
+ </span>
+ vh6qxkvcn3acjnz73rkhkc6y7c
+ <span
+ className="sc-jKJlTe kbljfd"
+ >
+ cxkrr6zd
+ </span>
+ </div>
+ </div>
+ <div
+ className="sc-iRbamj foQCcl"
+ >
+ <div
+ className="sc-jlyJG gkrAXP"
+ onClick={[Function]}
+ >
+ XEC
+ </div>
+ <div
+ className="sc-jlyJG gkrAXP nonactiveBtn"
+ onClick={[Function]}
+ >
+ eToken
+ </div>
+ </div>
+</div>
+`;
+
+exports[`Wallet with BCH balances and tokens and state field 1`] = `
+<div
+ className="sc-gPEVay bbSJoW"
+>
+ <h2>
+ Receive
+ XEC
+ </h2>
+ <div
+ onClick={[Function]}
+ style={
+ Object {
+ "display": "inline-block",
+ "position": "relative",
+ "width": "100%",
+ }
+ }
+ >
+ <div
+ className="sc-dxgOiQ fKbQGD"
+ style={
+ Object {
+ "display": "none",
+ }
+ }
+ >
+ Copied
+ <br />
+ <span
+ style={
+ Object {
+ "fontSize": "12px",
+ }
+ }
+ >
+ ecash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7ccxkrr6zd
+ </span>
+ </div>
+ <svg
+ className="sc-kpOJdX hDqPid"
+ height={210}
+ id="borderedQRCode"
+ shapeRendering="crispEdges"
+ viewBox="0 0 37 37"
+ width={210}
+ xec={1}
+ >
+ <path
+ d="M0,0 h37v37H0z"
+ fill="#FFFFFF"
+ />
+ <path
+ d="M4 4h7v1H4zM12 4h1v1H12zM14 4h1v1H14zM16 4h1v1H16zM18 4h1v1H18zM21 4h4v1H21zM26,4 h7v1H26zM4 5h1v1H4zM10 5h1v1H10zM13 5h5v1H13zM20 5h1v1H20zM22 5h1v1H22zM26 5h1v1H26zM32,5 h1v1H32zM4 6h1v1H4zM6 6h3v1H6zM10 6h1v1H10zM12 6h3v1H12zM17 6h1v1H17zM19 6h2v1H19zM26 6h1v1H26zM28 6h3v1H28zM32,6 h1v1H32zM4 7h1v1H4zM6 7h3v1H6zM10 7h1v1H10zM12 7h3v1H12zM16 7h4v1H16zM21 7h2v1H21zM26 7h1v1H26zM28 7h3v1H28zM32,7 h1v1H32zM4 8h1v1H4zM6 8h3v1H6zM10 8h1v1H10zM12 8h1v1H12zM15 8h3v1H15zM19 8h5v1H19zM26 8h1v1H26zM28 8h3v1H28zM32,8 h1v1H32zM4 9h1v1H4zM10 9h1v1H10zM14 9h2v1H14zM17 9h1v1H17zM21 9h1v1H21zM23 9h1v1H23zM26 9h1v1H26zM32,9 h1v1H32zM4 10h7v1H4zM12 10h1v1H12zM14 10h1v1H14zM16 10h1v1H16zM18 10h1v1H18zM20 10h1v1H20zM22 10h1v1H22zM24 10h1v1H24zM26,10 h7v1H26zM14 11h1v1H14zM16 11h1v1H16zM19 11h1v1H19zM21 11h3v1H21zM4 12h4v1H4zM10 12h1v1H10zM12 12h1v1H12zM14 12h2v1H14zM19 12h7v1H19zM28 12h3v1H28zM32,12 h1v1H32zM5 13h1v1H5zM7 13h2v1H7zM12 13h1v1H12zM14 13h1v1H14zM16 13h1v1H16zM18 13h1v1H18zM20 13h1v1H20zM22 13h3v1H22zM26 13h1v1H26zM28 13h1v1H28zM32,13 h1v1H32zM4 14h2v1H4zM7 14h4v1H7zM12 14h4v1H12zM17 14h1v1H17zM21 14h1v1H21zM25 14h1v1H25zM27 14h1v1H27zM29 14h1v1H29zM31 14h1v1H31zM4 15h2v1H4zM8 15h2v1H8zM12 15h3v1H12zM16 15h3v1H16zM20 15h1v1H20zM22 15h1v1H22zM25 15h1v1H25zM27 15h1v1H27zM31,15 h2v1H31zM5 16h4v1H5zM10 16h2v1H10zM13 16h2v1H13zM21 16h1v1H21zM23 16h1v1H23zM27 16h1v1H27zM30 16h2v1H30zM5 17h1v1H5zM7 17h1v1H7zM9 17h1v1H9zM11 17h1v1H11zM13 17h1v1H13zM21 17h1v1H21zM23 17h1v1H23zM26 17h2v1H26zM32,17 h1v1H32zM5 18h1v1H5zM9 18h2v1H9zM12 18h1v1H12zM14 18h1v1H14zM21 18h1v1H21zM23 18h1v1H23zM25 18h1v1H25zM27 18h1v1H27zM29 18h1v1H29zM31,18 h2v1H31zM5 19h5v1H5zM12 19h1v1H12zM15 19h1v1H15zM32,19 h1v1H32zM8 20h4v1H8zM14 20h1v1H14zM22 20h2v1H22zM25 20h1v1H25zM28 20h2v1H28zM6 21h1v1H6zM12 21h1v1H12zM15 21h3v1H15zM19 21h1v1H19zM21 21h1v1H21zM24 21h2v1H24zM27 21h1v1H27zM29 21h2v1H29zM4 22h1v1H4zM7 22h1v1H7zM9 22h3v1H9zM13 22h2v1H13zM16 22h2v1H16zM19 22h1v1H19zM21 22h2v1H21zM24 22h1v1H24zM27 22h1v1H27zM30 22h1v1H30zM8 23h2v1H8zM13 23h2v1H13zM16 23h1v1H16zM19 23h1v1H19zM21 23h1v1H21zM24 23h1v1H24zM26 23h1v1H26zM29 23h3v1H29zM5 24h2v1H5zM8 24h1v1H8zM10 24h1v1H10zM16 24h1v1H16zM18 24h1v1H18zM21 24h8v1H21zM30,24 h3v1H30zM12 25h1v1H12zM15 25h4v1H15zM20 25h5v1H20zM28 25h1v1H28zM31,25 h2v1H31zM4 26h7v1H4zM13 26h1v1H13zM15 26h1v1H15zM18 26h1v1H18zM20 26h1v1H20zM22 26h3v1H22zM26 26h1v1H26zM28 26h4v1H28zM4 27h1v1H4zM10 27h1v1H10zM14 27h2v1H14zM17 27h1v1H17zM19 27h2v1H19zM24 27h1v1H24zM28 27h1v1H28zM32,27 h1v1H32zM4 28h1v1H4zM6 28h3v1H6zM10 28h1v1H10zM13 28h2v1H13zM17 28h5v1H17zM24 28h8v1H24zM4 29h1v1H4zM6 29h3v1H6zM10 29h1v1H10zM12 29h3v1H12zM16 29h4v1H16zM22 29h1v1H22zM25 29h1v1H25zM27 29h2v1H27zM31,29 h2v1H31zM4 30h1v1H4zM6 30h3v1H6zM10 30h1v1H10zM12 30h1v1H12zM14 30h1v1H14zM21 30h1v1H21zM27 30h1v1H27zM29 30h2v1H29zM32,30 h1v1H32zM4 31h1v1H4zM10 31h1v1H10zM12 31h2v1H12zM15 31h2v1H15zM18 31h1v1H18zM20 31h1v1H20zM22 31h8v1H22zM31 31h1v1H31zM4 32h7v1H4zM12 32h1v1H12zM14 32h4v1H14zM20 32h1v1H20zM24 32h1v1H24zM27 32h1v1H27zM31 32h1v1H31z"
+ fill="#000000"
+ />
+ <image
+ height={4.228571428571429}
+ preserveAspectRatio="none"
+ width={4.228571428571429}
+ x={16.385714285714286}
+ xlinkHref="logo_primary.png"
+ y={16.385714285714286}
+ />
+ </svg>
+ <div
+ className="sc-eNQAEJ gjYjhd notranslate"
+ >
+ <input
+ readOnly={true}
+ spellCheck="false"
+ type="text"
+ value="ecash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7ccxkrr6zd"
+ />
+ <span
+ className="sc-ckVGcZ jazPqU"
+ >
+ ecash:
+ </span>
+ <span
+ className="sc-jKJlTe kbljfd"
+ >
+ qzagy47m
+ </span>
+ vh6qxkvcn3acjnz73rkhkc6y7c
+ <span
+ className="sc-jKJlTe kbljfd"
+ >
+ cxkrr6zd
+ </span>
+ </div>
+ </div>
+ <div
+ className="sc-iRbamj foQCcl"
+ >
+ <div
+ className="sc-jlyJG gkrAXP"
+ onClick={[Function]}
+ >
+ XEC
+ </div>
+ <div
+ className="sc-jlyJG gkrAXP nonactiveBtn"
+ onClick={[Function]}
+ >
+ eToken
+ </div>
+ </div>
+</div>
+`;
+
+exports[`Wallet without BCH balance 1`] = `
+<div
+ className="sc-gPEVay bbSJoW"
+>
+ <h2>
+ Receive
+ XEC
+ </h2>
+ <div
+ onClick={[Function]}
+ style={
+ Object {
+ "display": "inline-block",
+ "position": "relative",
+ "width": "100%",
+ }
+ }
+ >
+ <div
+ className="sc-dxgOiQ fKbQGD"
+ style={
+ Object {
+ "display": "none",
+ }
+ }
+ >
+ Copied
+ <br />
+ <span
+ style={
+ Object {
+ "fontSize": "12px",
+ }
+ }
+ >
+ ecash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7ccxkrr6zd
+ </span>
+ </div>
+ <svg
+ className="sc-kpOJdX hDqPid"
+ height={210}
+ id="borderedQRCode"
+ shapeRendering="crispEdges"
+ viewBox="0 0 37 37"
+ width={210}
+ xec={1}
+ >
+ <path
+ d="M0,0 h37v37H0z"
+ fill="#FFFFFF"
+ />
+ <path
+ d="M4 4h7v1H4zM12 4h1v1H12zM14 4h1v1H14zM16 4h1v1H16zM18 4h1v1H18zM21 4h4v1H21zM26,4 h7v1H26zM4 5h1v1H4zM10 5h1v1H10zM13 5h5v1H13zM20 5h1v1H20zM22 5h1v1H22zM26 5h1v1H26zM32,5 h1v1H32zM4 6h1v1H4zM6 6h3v1H6zM10 6h1v1H10zM12 6h3v1H12zM17 6h1v1H17zM19 6h2v1H19zM26 6h1v1H26zM28 6h3v1H28zM32,6 h1v1H32zM4 7h1v1H4zM6 7h3v1H6zM10 7h1v1H10zM12 7h3v1H12zM16 7h4v1H16zM21 7h2v1H21zM26 7h1v1H26zM28 7h3v1H28zM32,7 h1v1H32zM4 8h1v1H4zM6 8h3v1H6zM10 8h1v1H10zM12 8h1v1H12zM15 8h3v1H15zM19 8h5v1H19zM26 8h1v1H26zM28 8h3v1H28zM32,8 h1v1H32zM4 9h1v1H4zM10 9h1v1H10zM14 9h2v1H14zM17 9h1v1H17zM21 9h1v1H21zM23 9h1v1H23zM26 9h1v1H26zM32,9 h1v1H32zM4 10h7v1H4zM12 10h1v1H12zM14 10h1v1H14zM16 10h1v1H16zM18 10h1v1H18zM20 10h1v1H20zM22 10h1v1H22zM24 10h1v1H24zM26,10 h7v1H26zM14 11h1v1H14zM16 11h1v1H16zM19 11h1v1H19zM21 11h3v1H21zM4 12h4v1H4zM10 12h1v1H10zM12 12h1v1H12zM14 12h2v1H14zM19 12h7v1H19zM28 12h3v1H28zM32,12 h1v1H32zM5 13h1v1H5zM7 13h2v1H7zM12 13h1v1H12zM14 13h1v1H14zM16 13h1v1H16zM18 13h1v1H18zM20 13h1v1H20zM22 13h3v1H22zM26 13h1v1H26zM28 13h1v1H28zM32,13 h1v1H32zM4 14h2v1H4zM7 14h4v1H7zM12 14h4v1H12zM17 14h1v1H17zM21 14h1v1H21zM25 14h1v1H25zM27 14h1v1H27zM29 14h1v1H29zM31 14h1v1H31zM4 15h2v1H4zM8 15h2v1H8zM12 15h3v1H12zM16 15h3v1H16zM20 15h1v1H20zM22 15h1v1H22zM25 15h1v1H25zM27 15h1v1H27zM31,15 h2v1H31zM5 16h4v1H5zM10 16h2v1H10zM13 16h2v1H13zM21 16h1v1H21zM23 16h1v1H23zM27 16h1v1H27zM30 16h2v1H30zM5 17h1v1H5zM7 17h1v1H7zM9 17h1v1H9zM11 17h1v1H11zM13 17h1v1H13zM21 17h1v1H21zM23 17h1v1H23zM26 17h2v1H26zM32,17 h1v1H32zM5 18h1v1H5zM9 18h2v1H9zM12 18h1v1H12zM14 18h1v1H14zM21 18h1v1H21zM23 18h1v1H23zM25 18h1v1H25zM27 18h1v1H27zM29 18h1v1H29zM31,18 h2v1H31zM5 19h5v1H5zM12 19h1v1H12zM15 19h1v1H15zM32,19 h1v1H32zM8 20h4v1H8zM14 20h1v1H14zM22 20h2v1H22zM25 20h1v1H25zM28 20h2v1H28zM6 21h1v1H6zM12 21h1v1H12zM15 21h3v1H15zM19 21h1v1H19zM21 21h1v1H21zM24 21h2v1H24zM27 21h1v1H27zM29 21h2v1H29zM4 22h1v1H4zM7 22h1v1H7zM9 22h3v1H9zM13 22h2v1H13zM16 22h2v1H16zM19 22h1v1H19zM21 22h2v1H21zM24 22h1v1H24zM27 22h1v1H27zM30 22h1v1H30zM8 23h2v1H8zM13 23h2v1H13zM16 23h1v1H16zM19 23h1v1H19zM21 23h1v1H21zM24 23h1v1H24zM26 23h1v1H26zM29 23h3v1H29zM5 24h2v1H5zM8 24h1v1H8zM10 24h1v1H10zM16 24h1v1H16zM18 24h1v1H18zM21 24h8v1H21zM30,24 h3v1H30zM12 25h1v1H12zM15 25h4v1H15zM20 25h5v1H20zM28 25h1v1H28zM31,25 h2v1H31zM4 26h7v1H4zM13 26h1v1H13zM15 26h1v1H15zM18 26h1v1H18zM20 26h1v1H20zM22 26h3v1H22zM26 26h1v1H26zM28 26h4v1H28zM4 27h1v1H4zM10 27h1v1H10zM14 27h2v1H14zM17 27h1v1H17zM19 27h2v1H19zM24 27h1v1H24zM28 27h1v1H28zM32,27 h1v1H32zM4 28h1v1H4zM6 28h3v1H6zM10 28h1v1H10zM13 28h2v1H13zM17 28h5v1H17zM24 28h8v1H24zM4 29h1v1H4zM6 29h3v1H6zM10 29h1v1H10zM12 29h3v1H12zM16 29h4v1H16zM22 29h1v1H22zM25 29h1v1H25zM27 29h2v1H27zM31,29 h2v1H31zM4 30h1v1H4zM6 30h3v1H6zM10 30h1v1H10zM12 30h1v1H12zM14 30h1v1H14zM21 30h1v1H21zM27 30h1v1H27zM29 30h2v1H29zM32,30 h1v1H32zM4 31h1v1H4zM10 31h1v1H10zM12 31h2v1H12zM15 31h2v1H15zM18 31h1v1H18zM20 31h1v1H20zM22 31h8v1H22zM31 31h1v1H31zM4 32h7v1H4zM12 32h1v1H12zM14 32h4v1H14zM20 32h1v1H20zM24 32h1v1H24zM27 32h1v1H27zM31 32h1v1H31z"
+ fill="#000000"
+ />
+ <image
+ height={4.228571428571429}
+ preserveAspectRatio="none"
+ width={4.228571428571429}
+ x={16.385714285714286}
+ xlinkHref="logo_primary.png"
+ y={16.385714285714286}
+ />
+ </svg>
+ <div
+ className="sc-eNQAEJ gjYjhd notranslate"
+ >
+ <input
+ readOnly={true}
+ spellCheck="false"
+ type="text"
+ value="ecash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7ccxkrr6zd"
+ />
+ <span
+ className="sc-ckVGcZ jazPqU"
+ >
+ ecash:
+ </span>
+ <span
+ className="sc-jKJlTe kbljfd"
+ >
+ qzagy47m
+ </span>
+ vh6qxkvcn3acjnz73rkhkc6y7c
+ <span
+ className="sc-jKJlTe kbljfd"
+ >
+ cxkrr6zd
+ </span>
+ </div>
+ </div>
+ <div
+ className="sc-iRbamj foQCcl"
+ >
+ <div
+ className="sc-jlyJG gkrAXP"
+ onClick={[Function]}
+ >
+ XEC
+ </div>
+ <div
+ className="sc-jlyJG gkrAXP nonactiveBtn"
+ onClick={[Function]}
+ >
+ eToken
+ </div>
+ </div>
+</div>
+`;
+
+exports[`Without wallet defined 1`] = `
+<div
+ className="sc-chPdSV cOYtDU"
+>
+ <h2>
+ Welcome to Cashtab!
+ </h2>
+ <p
+ className="sc-kgoBCf iXiIML"
+ >
+ Cashtab is an
+
+ <a
+ className="sc-kGXeez dlhNKT"
+ href="https://github.com/bitcoin-abc/bitcoin-abc"
+ rel="noreferrer"
+ target="_blank"
+ >
+ open source,
+ </a>
+
+ non-custodial web wallet for
+ eCash
+ .
+ <br />
+ <br />
+ Want to learn more?
+
+ <a
+ className="sc-kGXeez dlhNKT"
+ href="https://docs.cashtabapp.com/docs/"
+ rel="noreferrer"
+ target="_blank"
+ >
+ Check out the Cashtab documentation.
+ </a>
+ </p>
+ <button
+ className="sc-jzJRlG lltaza"
+ onClick={[Function]}
+ >
+ <span
+ aria-label="plus-square"
+ className="anticon anticon-plus-square"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="plus-square"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M328 544h152v152c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V544h152c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H544V328c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v152H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z"
+ />
+ <path
+ d="M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"
+ />
+ </svg>
+ </span>
+ New Wallet
+ </button>
+ <button
+ className="sc-cSHVUG fQByuZ"
+ onClick={[Function]}
+ >
+ <span
+ aria-label="import"
+ className="anticon anticon-import"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="import"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M888.3 757.4h-53.8c-4.2 0-7.7 3.5-7.7 7.7v61.8H197.1V197.1h629.8v61.8c0 4.2 3.5 7.7 7.7 7.7h53.8c4.2 0 7.7-3.4 7.7-7.7V158.7c0-17-13.7-30.7-30.7-30.7H158.7c-17 0-30.7 13.7-30.7 30.7v706.6c0 17 13.7 30.7 30.7 30.7h706.6c17 0 30.7-13.7 30.7-30.7V765.1c0-4.3-3.5-7.7-7.7-7.7zM902 476H588v-76c0-6.7-7.8-10.5-13-6.3l-141.9 112a8 8 0 000 12.6l141.9 112c5.3 4.2 13 .4 13-6.3v-76h314c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z"
+ />
+ </svg>
+ </span>
+ Import Wallet
+ </button>
+</div>
+`;
diff --git a/web/cashtab-v2/src/components/Send/Send.js b/web/cashtab-v2/src/components/Send/Send.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Send/Send.js
@@ -0,0 +1,1092 @@
+import React, { useState, useEffect } from 'react';
+import { useLocation } from 'react-router-dom';
+import PropTypes from 'prop-types';
+import { WalletContext } from '@utils/context';
+import {
+ AntdFormWrapper,
+ SendBchInput,
+ DestinationAddressSingle,
+ DestinationAddressMulti,
+} from '@components/Common/EnhancedInputs';
+import { AdvancedCollapse } from '@components/Common/StyledCollapse';
+import { Form, message, Modal, Alert, Collapse, Input, Button } from 'antd';
+const { Panel } = Collapse;
+const { TextArea } = Input;
+import { Row, Col, Switch } from 'antd';
+import PrimaryButton, {
+ SecondaryButton,
+ SmartButton,
+} from '@components/Common/PrimaryButton';
+import useBCH from '@hooks/useBCH';
+import useWindowDimensions from '@hooks/useWindowDimensions';
+import {
+ sendXecNotification,
+ errorNotification,
+ messageSignedNotification,
+} from '@components/Common/Notifications';
+import { isMobile, isIOS, isSafari } from 'react-device-detect';
+import { currency, parseAddressForParams } from '@components/Common/Ticker.js';
+import { Event } from '@utils/GoogleAnalytics';
+import {
+ fiatToCrypto,
+ shouldRejectAmountInput,
+ isValidXecAddress,
+ isValidEtokenAddress,
+ isValidXecSendAmount,
+} from '@utils/validation';
+import BalanceHeader from '@components/Common/BalanceHeader';
+import BalanceHeaderFiat from '@components/Common/BalanceHeaderFiat';
+import {
+ ZeroBalanceHeader,
+ ConvertAmount,
+ AlertMsg,
+ WalletInfoCtn,
+ SidePaddingCtn,
+ FormLabel,
+} from '@components/Common/Atoms';
+import {
+ getWalletState,
+ convertToEcashPrefix,
+ toLegacyCash,
+ toLegacyCashArray,
+ fromSmallestDenomination,
+} from '@utils/cashMethods';
+import ApiError from '@components/Common/ApiError';
+import { formatFiatBalance, formatBalance } from '@utils/formatting';
+import { TokenParamLabel } from '@components/Common/Atoms';
+import { PlusSquareOutlined } from '@ant-design/icons';
+import styled from 'styled-components';
+import { CopyToClipboard } from 'react-copy-to-clipboard';
+import WalletLabel from '@components/Common/WalletLabel.js';
+
+const SignMessageLabel = styled.div`
+ text-align: left;
+ color: ${props => props.theme.forms.text};
+`;
+
+const TextAreaLabel = styled.div`
+ text-align: left;
+ color: ${props => props.theme.forms.text};
+ padding-left: 1px;
+`;
+
+const AmountPreviewCtn = styled.div`
+ margin-top: -30px;
+`;
+
+const SendInputCtn = styled.div`
+ .ant-form-item-with-help {
+ margin-bottom: 32px;
+ }
+`;
+
+const LocaleFormattedValue = styled.h3`
+ color: ${props => props.theme.contrast};
+ font-weight: bold;
+ margin-bottom: 0;
+`;
+// Note jestBCH is only used for unit tests; BCHJS must be mocked for jest
+const SendBCH = ({ jestBCH, passLoadingStatus }) => {
+ // use balance parameters from wallet.state object and not legacy balances parameter from walletState, if user has migrated wallet
+ // this handles edge case of user with old wallet who has not opened latest Cashtab version yet
+
+ // If the wallet object from ContextValue has a `state key`, then check which keys are in the wallet object
+ // Else set it as blank
+ const ContextValue = React.useContext(WalletContext);
+ const location = useLocation();
+ const { wallet, fiatPrice, apiError, cashtabSettings } = ContextValue;
+ const walletState = getWalletState(wallet);
+ const { balances, slpBalancesAndUtxos } = walletState;
+ // Modal settings
+ const [showConfirmMsgToSign, setShowConfirmMsgToSign] = useState(false);
+ const [msgToSign, setMsgToSign] = useState('');
+ const [signMessageIsValid, setSignMessageIsValid] = useState(null);
+ const [isOneToManyXECSend, setIsOneToManyXECSend] = useState(false);
+ const [opReturnMsg, setOpReturnMsg] = useState(false);
+ const [isEncryptedOptionalOpReturnMsg, setIsEncryptedOptionalOpReturnMsg] =
+ useState(false);
+ const [bchObj, setBchObj] = useState(false);
+
+ // Get device window width
+ // If this is less than 769, the page will open with QR scanner open
+ const { width } = useWindowDimensions();
+ // Load with QR code open if device is mobile and NOT iOS + anything but safari
+ const scannerSupported = width < 769 && isMobile && !(isIOS && !isSafari);
+
+ const [formData, setFormData] = useState({
+ value: '',
+ address: '',
+ });
+ const [queryStringText, setQueryStringText] = useState(null);
+ const [sendBchAddressError, setSendBchAddressError] = useState(false);
+ const [sendBchAmountError, setSendBchAmountError] = useState(false);
+ const [selectedCurrency, setSelectedCurrency] = useState(currency.ticker);
+
+ // Support cashtab button from web pages
+ const [txInfoFromUrl, setTxInfoFromUrl] = useState(false);
+
+ // Show a confirmation modal on transactions created by populating form from web page button
+ const [isModalVisible, setIsModalVisible] = useState(false);
+
+ const [messageSignature, setMessageSignature] = useState('');
+ const [sigCopySuccess, setSigCopySuccess] = useState('');
+ const userLocale = navigator.language;
+ const clearInputForms = () => {
+ setFormData({
+ value: '',
+ address: '',
+ });
+ setOpReturnMsg(''); // OP_RETURN message has its own state field
+ };
+
+ const checkForConfirmationBeforeSendXec = () => {
+ if (txInfoFromUrl) {
+ setIsModalVisible(true);
+ } else if (cashtabSettings.sendModal) {
+ setIsModalVisible(cashtabSettings.sendModal);
+ } else {
+ // if the user does not have the send confirmation enabled in settings then send directly
+ send();
+ }
+ };
+
+ const handleOk = () => {
+ setIsModalVisible(false);
+ send();
+ };
+
+ const handleCancel = () => {
+ setIsModalVisible(false);
+ };
+
+ const { getBCH, getRestUrl, sendXec, calcFee, signPkMessage } = useBCH();
+
+ // If the balance has changed, unlock the UI
+ // This is redundant, if backend has refreshed in 1.75s timeout below, UI will already be unlocked
+ useEffect(() => {
+ passLoadingStatus(false);
+ }, [balances.totalBalance]);
+
+ useEffect(() => {
+ // jestBCH is only ever specified for unit tests, otherwise app will use getBCH();
+ const BCH = jestBCH ? jestBCH : getBCH();
+
+ // set the BCH instance to state, for other functions to reference
+ setBchObj(BCH);
+
+ // Manually parse for txInfo object on page load when Send.js is loaded with a query string
+
+ // if this was routed from Wallet screen's Reply to message link then prepopulate the address and value field
+ if (location && location.state && location.state.replyAddress) {
+ setFormData({
+ address: location.state.replyAddress,
+ value: `${fromSmallestDenomination(currency.dustSats)}`,
+ });
+ }
+
+ // if this was routed from the Airdrop screen's Airdrop Calculator then
+ // switch to multiple recipient mode and prepopulate the recipients field
+ if (location && location.state && location.state.airdropRecipients) {
+ setIsOneToManyXECSend(true);
+ setFormData({
+ address: location.state.airdropRecipients,
+ });
+
+ // validate the airdrop outputs from the calculator
+ handleMultiAddressChange({
+ target: {
+ value: location.state.airdropRecipients,
+ },
+ });
+ }
+
+ // Do not set txInfo in state if query strings are not present
+ if (
+ !window.location ||
+ !window.location.hash ||
+ window.location.hash === '#/send'
+ ) {
+ return;
+ }
+
+ const txInfoArr = window.location.hash.split('?')[1].split('&');
+
+ // Iterate over this to create object
+ const txInfo = {};
+ for (let i = 0; i < txInfoArr.length; i += 1) {
+ let txInfoKeyValue = txInfoArr[i].split('=');
+ let key = txInfoKeyValue[0];
+ let value = txInfoKeyValue[1];
+ txInfo[key] = value;
+ }
+ console.log(`txInfo from page params`, txInfo);
+ setTxInfoFromUrl(txInfo);
+ populateFormsFromUrl(txInfo);
+ }, []);
+
+ function populateFormsFromUrl(txInfo) {
+ if (txInfo && txInfo.address && txInfo.value) {
+ setFormData({
+ address: txInfo.address,
+ value: txInfo.value,
+ });
+ }
+ }
+
+ function handleSendXecError(errorObj, oneToManyFlag) {
+ // Set loading to false here as well, as balance may not change depending on where error occured in try loop
+ passLoadingStatus(false);
+ let message;
+
+ if (!errorObj.error && !errorObj.message) {
+ message = `Transaction failed: no response from ${getRestUrl()}.`;
+ } else if (
+ /Could not communicate with full node or other external service/.test(
+ errorObj.error,
+ )
+ ) {
+ message = 'Could not communicate with API. Please try again.';
+ } else if (
+ errorObj.error &&
+ errorObj.error.includes(
+ 'too-long-mempool-chain, too many unconfirmed ancestors [limit: 50] (code 64)',
+ )
+ ) {
+ message = `The ${currency.ticker} you are trying to send has too many unconfirmed ancestors to send (limit 50). Sending will be possible after a block confirmation. Try again in about 10 minutes.`;
+ } else {
+ message =
+ errorObj.message || errorObj.error || JSON.stringify(errorObj);
+ }
+
+ if (oneToManyFlag) {
+ errorNotification(errorObj, message, 'Sending XEC one to many');
+ } else {
+ errorNotification(errorObj, message, 'Sending XEC');
+ }
+ }
+
+ async function send() {
+ setFormData({
+ ...formData,
+ });
+
+ if (isOneToManyXECSend) {
+ // this is a one to many XEC send transactions
+
+ // ensure multi-recipient input is not blank
+ if (!formData.address) {
+ return;
+ }
+
+ // Event("Category", "Action", "Label")
+ // Track number of XEC send-to-many transactions
+ Event('Send.js', 'SendToMany', selectedCurrency);
+
+ passLoadingStatus(true);
+ const { address } = formData;
+
+ //convert each line from TextArea input
+ let addressAndValueArray = address.split('\n');
+
+ try {
+ // construct array of XEC->BCH addresses due to bch-api constraint
+ let cleanAddressAndValueArray =
+ toLegacyCashArray(addressAndValueArray);
+
+ const link = await sendXec(
+ bchObj,
+ wallet,
+ slpBalancesAndUtxos.nonSlpUtxos,
+ currency.defaultFee,
+ opReturnMsg,
+ true, // indicate send mode is one to many
+ cleanAddressAndValueArray,
+ );
+ sendXecNotification(link);
+ clearInputForms();
+ } catch (e) {
+ handleSendXecError(e, isOneToManyXECSend);
+ }
+ } else {
+ // standard one to one XEC send transaction
+
+ if (
+ !formData.address ||
+ !formData.value ||
+ Number(formData.value) <= 0
+ ) {
+ return;
+ }
+
+ // Event("Category", "Action", "Label")
+ // Track number of BCHA send transactions and whether users
+ // are sending BCHA or USD
+ Event('Send.js', 'Send', selectedCurrency);
+
+ passLoadingStatus(true);
+ const { address, value } = formData;
+
+ // Get the param-free address
+ let cleanAddress = address.split('?')[0];
+
+ // Ensure address has bitcoincash: prefix and checksum
+ cleanAddress = toLegacyCash(cleanAddress);
+
+ // Calculate the amount in BCH
+ let bchValue = value;
+
+ if (selectedCurrency !== 'XEC') {
+ bchValue = fiatToCrypto(value, fiatPrice);
+ }
+
+ // encrypted message limit truncation
+ let optionalOpReturnMsg;
+ if (isEncryptedOptionalOpReturnMsg) {
+ optionalOpReturnMsg = opReturnMsg.substring(
+ 0,
+ currency.opReturn.encryptedMsgCharLimit,
+ );
+ } else {
+ optionalOpReturnMsg = opReturnMsg;
+ }
+
+ try {
+ const link = await sendXec(
+ bchObj,
+ wallet,
+ slpBalancesAndUtxos.nonSlpUtxos,
+ currency.defaultFee,
+ optionalOpReturnMsg,
+ false, // sendToMany boolean flag
+ null, // address array not applicable for one to many tx
+ cleanAddress,
+ bchValue,
+ isEncryptedOptionalOpReturnMsg,
+ );
+ sendXecNotification(link);
+ clearInputForms();
+ } catch (e) {
+ handleSendXecError(e, isOneToManyXECSend);
+ }
+ }
+ }
+
+ const handleAddressChange = e => {
+ const { value, name } = e.target;
+ let error = false;
+ let addressString = value;
+ // parse address for parameters
+ const addressInfo = parseAddressForParams(addressString);
+ // validate address
+ const isValid = isValidXecAddress(addressInfo.address);
+
+ /*
+ Model
+
+ addressInfo =
+ {
+ address: '',
+ queryString: '',
+ amount: null,
+ };
+ */
+
+ const { address, queryString, amount } = addressInfo;
+
+ // If query string,
+ // Show an alert that only amount and currency.ticker are supported
+ setQueryStringText(queryString);
+
+ // Is this valid address?
+ if (!isValid) {
+ error = `Invalid ${currency.ticker} address`;
+ // If valid address but token format
+ if (isValidEtokenAddress(address)) {
+ error = `eToken addresses are not supported for ${currency.ticker} sends`;
+ }
+ }
+ setSendBchAddressError(error);
+
+ // Set amount if it's in the query string
+ if (amount !== null) {
+ // Set currency to BCHA
+ setSelectedCurrency(currency.ticker);
+
+ // Use this object to mimic user input and get validation for the value
+ let amountObj = {
+ target: {
+ name: 'value',
+ value: amount,
+ },
+ };
+ handleBchAmountChange(amountObj);
+ setFormData({
+ ...formData,
+ value: amount,
+ });
+ }
+
+ // Set address field to user input
+ setFormData(p => ({
+ ...p,
+ [name]: value,
+ }));
+ };
+
+ const handleMultiAddressChange = e => {
+ const { value, name } = e.target;
+ let error;
+
+ if (!value) {
+ error = 'Input must not be blank';
+ setSendBchAddressError(error);
+ return setFormData(p => ({
+ ...p,
+ [name]: value,
+ }));
+ }
+
+ //convert each line from the <TextArea> input into array
+ let addressStringArray = value.split('\n');
+ const arrayLength = addressStringArray.length;
+
+ // loop through each row in the <TextArea> input
+ for (let i = 0; i < arrayLength; i++) {
+ if (addressStringArray[i].trim() === '') {
+ // if this line is a line break or bunch of spaces
+ error = 'Empty spaces and rows must be removed';
+ setSendBchAddressError(error);
+ return setFormData(p => ({
+ ...p,
+ [name]: value,
+ }));
+ }
+
+ let addressString = addressStringArray[i].split(',')[0];
+ let valueString = addressStringArray[i].split(',')[1];
+
+ const validAddress = isValidXecAddress(addressString);
+ const validValueString = isValidXecSendAmount(valueString);
+
+ if (!validAddress) {
+ error = `Invalid XEC address: ${addressString}, ${valueString}`;
+ setSendBchAddressError(error);
+ return setFormData(p => ({
+ ...p,
+ [name]: value,
+ }));
+ }
+ if (!validValueString) {
+ error = `Amount must be at least ${fromSmallestDenomination(
+ currency.dustSats,
+ )} XEC: ${addressString}, ${valueString}`;
+ setSendBchAddressError(error);
+ return setFormData(p => ({
+ ...p,
+ [name]: value,
+ }));
+ }
+ }
+
+ // If iterate to end of array with no errors, then there is no error msg
+ setSendBchAddressError(false);
+
+ // Set address field to user input
+ setFormData(p => ({
+ ...p,
+ [name]: value,
+ }));
+ };
+
+ const handleSelectedCurrencyChange = e => {
+ setSelectedCurrency(e);
+ // Clear input field to prevent accidentally sending 1 BCH instead of 1 USD
+ setFormData(p => ({
+ ...p,
+ value: '',
+ }));
+ };
+
+ // true: renders the multi recipient <TextArea>
+ // false: renders the single recipient <Input>
+ const handleOneToManyXECSend = sendXecMode => {
+ setIsOneToManyXECSend(sendXecMode);
+ };
+
+ const handleBchAmountChange = e => {
+ const { value, name } = e.target;
+ let bchValue = value;
+ const error = shouldRejectAmountInput(
+ bchValue,
+ selectedCurrency,
+ fiatPrice,
+ balances.totalBalance,
+ );
+ setSendBchAmountError(error);
+
+ setFormData(p => ({
+ ...p,
+ [name]: value,
+ }));
+ };
+
+ const handleSignMsgChange = e => {
+ const { value } = e.target;
+ // validation
+ if (value && value.length && value.length < 150) {
+ setMsgToSign(value);
+ setSignMessageIsValid(true);
+ } else {
+ setSignMessageIsValid(false);
+ }
+ };
+
+ const signMessageByPk = async () => {
+ try {
+ const messageSignature = await signPkMessage(
+ bchObj,
+ wallet.Path1899.fundingWif,
+ msgToSign,
+ );
+ setMessageSignature(messageSignature);
+ messageSignedNotification(messageSignature);
+ } catch (err) {
+ let message;
+ if (!err.error && !err.message) {
+ message = err.message || err.error || JSON.stringify(err);
+ }
+ errorNotification(err, message, 'Message Signing Error');
+ throw err;
+ }
+ // Hide the modal
+ setShowConfirmMsgToSign(false);
+ setSigCopySuccess('');
+ };
+
+ const handleOnSigCopy = () => {
+ if (messageSignature != '') {
+ setSigCopySuccess('Signature copied to clipboard');
+ }
+ };
+
+ const onMax = async () => {
+ // Clear amt error
+ setSendBchAmountError(false);
+ // Set currency to BCH
+ setSelectedCurrency(currency.ticker);
+ try {
+ const txFeeSats = calcFee(bchObj, slpBalancesAndUtxos.nonSlpUtxos);
+
+ const txFeeBch = txFeeSats / 10 ** currency.cashDecimals;
+ let value =
+ balances.totalBalance - txFeeBch >= 0
+ ? (balances.totalBalance - txFeeBch).toFixed(
+ currency.cashDecimals,
+ )
+ : 0;
+
+ setFormData({
+ ...formData,
+ value,
+ });
+ } catch (err) {
+ console.log(`Error in onMax:`);
+ console.log(err);
+ message.error(
+ 'Unable to calculate the max value due to network errors',
+ );
+ }
+ };
+ // Display price in USD below input field for send amount, if it can be calculated
+ let fiatPriceString = '';
+ if (fiatPrice !== null && !isNaN(formData.value)) {
+ if (selectedCurrency === currency.ticker) {
+ // calculate conversion to fiatPrice
+ fiatPriceString = `${(fiatPrice * Number(formData.value)).toFixed(
+ 2,
+ )}`;
+
+ // formats to fiat locale style
+ fiatPriceString = formatFiatBalance(
+ Number(fiatPriceString),
+ userLocale,
+ );
+
+ // insert symbol and currency before/after the locale formatted fiat balance
+ fiatPriceString = `${
+ cashtabSettings
+ ? `${
+ currency.fiatCurrencies[cashtabSettings.fiatCurrency]
+ .symbol
+ } `
+ : '$ '
+ } ${fiatPriceString} ${
+ cashtabSettings && cashtabSettings.fiatCurrency
+ ? cashtabSettings.fiatCurrency.toUpperCase()
+ : 'USD'
+ }`;
+ } else {
+ fiatPriceString = `${
+ formData.value
+ ? formatFiatBalance(
+ Number(fiatToCrypto(formData.value, fiatPrice)),
+ userLocale,
+ )
+ : formatFiatBalance(0, userLocale)
+ } ${currency.ticker}`;
+ }
+ }
+
+ const priceApiError = fiatPrice === null && selectedCurrency !== 'XEC';
+
+ return (
+ <>
+ <Modal
+ title="Confirm Send"
+ visible={isModalVisible}
+ onOk={handleOk}
+ onCancel={handleCancel}
+ >
+ <p>
+ {isOneToManyXECSend
+ ? `are you sure you want to send the following One to Many transaction?
+ ${formData.address}`
+ : `Are you sure you want to send ${formData.value}${' '}
+ ${currency.ticker} to ${formData.address}?`}
+ </p>
+ </Modal>
+ <WalletInfoCtn>
+ <WalletLabel name={wallet.name}></WalletLabel>
+ {!balances.totalBalance ? (
+ <ZeroBalanceHeader>
+ You currently have 0 {currency.ticker}
+ <br />
+ Deposit some funds to use this feature
+ </ZeroBalanceHeader>
+ ) : (
+ <>
+ <BalanceHeader
+ balance={balances.totalBalance}
+ ticker={currency.ticker}
+ />
+
+ <BalanceHeaderFiat
+ balance={balances.totalBalance}
+ settings={cashtabSettings}
+ fiatPrice={fiatPrice}
+ />
+ </>
+ )}
+ </WalletInfoCtn>
+ <SidePaddingCtn>
+ <Row type="flex">
+ <Col span={24}>
+ <Form
+ style={{
+ width: 'auto',
+ marginTop: '40px',
+ }}
+ >
+ {!isOneToManyXECSend ? (
+ <SendInputCtn>
+ <FormLabel>Send to</FormLabel>
+ <DestinationAddressSingle
+ style={{ marginBottom: '0px' }}
+ loadWithCameraOpen={
+ location &&
+ location.state &&
+ location.state.replyAddress
+ ? false
+ : scannerSupported
+ }
+ validateStatus={
+ sendBchAddressError ? 'error' : ''
+ }
+ help={
+ sendBchAddressError
+ ? sendBchAddressError
+ : ''
+ }
+ onScan={result =>
+ handleAddressChange({
+ target: {
+ name: 'address',
+ value: result,
+ },
+ })
+ }
+ inputProps={{
+ placeholder: `${currency.ticker} Address`,
+ name: 'address',
+ onChange: e =>
+ handleAddressChange(e),
+ required: true,
+ value: formData.address,
+ }}
+ ></DestinationAddressSingle>
+ <FormLabel>Amount</FormLabel>
+ <SendBchInput
+ activeFiatCode={
+ cashtabSettings &&
+ cashtabSettings.fiatCurrency
+ ? cashtabSettings.fiatCurrency.toUpperCase()
+ : 'USD'
+ }
+ validateStatus={
+ sendBchAmountError ? 'error' : ''
+ }
+ help={
+ sendBchAmountError
+ ? sendBchAmountError
+ : ''
+ }
+ onMax={onMax}
+ inputProps={{
+ name: 'value',
+ dollar:
+ selectedCurrency === 'USD'
+ ? 1
+ : 0,
+ placeholder: 'Amount',
+ onChange: e =>
+ handleBchAmountChange(e),
+ required: true,
+ value: formData.value,
+ disabled: priceApiError,
+ }}
+ selectProps={{
+ value: selectedCurrency,
+ disabled: queryStringText !== null,
+ onChange: e =>
+ handleSelectedCurrencyChange(e),
+ }}
+ ></SendBchInput>
+ {priceApiError && (
+ <AlertMsg>
+ Error fetching fiat price. Setting
+ send by{' '}
+ {currency.fiatCurrencies[
+ cashtabSettings.fiatCurrency
+ ].slug.toUpperCase()}{' '}
+ disabled
+ </AlertMsg>
+ )}
+ </SendInputCtn>
+ ) : (
+ <>
+ <FormLabel>Send to</FormLabel>
+ <DestinationAddressMulti
+ validateStatus={
+ sendBchAddressError ? 'error' : ''
+ }
+ help={
+ sendBchAddressError
+ ? sendBchAddressError
+ : ''
+ }
+ inputProps={{
+ placeholder: `One XEC address & value per line, separated by comma \ne.g. \necash:qpatql05s9jfavnu0tv6lkjjk25n6tmj9gkpyrlwu8,500 \necash:qzvydd4n3lm3xv62cx078nu9rg0e3srmqq0knykfed,700`,
+ name: 'address',
+ onChange: e =>
+ handleMultiAddressChange(e),
+ required: true,
+ value: formData.address,
+ }}
+ ></DestinationAddressMulti>
+ </>
+ )}
+ {!priceApiError && !isOneToManyXECSend && (
+ <AmountPreviewCtn>
+ <LocaleFormattedValue>
+ {formatBalance(
+ formData.value,
+ userLocale,
+ )}{' '}
+ {selectedCurrency}
+ </LocaleFormattedValue>
+ <ConvertAmount>
+ {fiatPriceString !== '' && '='}{' '}
+ {fiatPriceString}
+ </ConvertAmount>
+ </AmountPreviewCtn>
+ )}
+
+ {queryStringText && (
+ <Alert
+ message={`You are sending a transaction to an address including query parameters "${queryStringText}." Only the "amount" parameter, in units of ${currency.ticker} satoshis, is currently supported.`}
+ type="warning"
+ />
+ )}
+ <div
+ style={{
+ paddingTop: '12px',
+ }}
+ >
+ {!balances.totalBalance ||
+ apiError ||
+ sendBchAmountError ||
+ sendBchAddressError ||
+ priceApiError ? (
+ <SecondaryButton>Send</SecondaryButton>
+ ) : (
+ <>
+ {txInfoFromUrl ? (
+ <PrimaryButton
+ onClick={() =>
+ checkForConfirmationBeforeSendXec()
+ }
+ >
+ Send
+ </PrimaryButton>
+ ) : (
+ <PrimaryButton
+ onClick={() => {
+ checkForConfirmationBeforeSendXec();
+ }}
+ >
+ Send
+ </PrimaryButton>
+ )}
+ </>
+ )}
+ </div>
+ <div>
+ <AdvancedCollapse
+ style={{
+ marginBottom: '12px',
+ }}
+ defaultActiveKey={
+ location &&
+ location.state &&
+ location.state.replyAddress
+ ? ['1']
+ : ['0']
+ }
+ >
+ <Panel header="Advanced" key="1">
+ <AntdFormWrapper
+ style={{
+ marginBottom: '20px',
+ }}
+ >
+ <TextAreaLabel>
+ Multiple Recipients:&nbsp;&nbsp;
+ <Switch
+ defaultunchecked="true"
+ checked={isOneToManyXECSend}
+ onChange={() => {
+ setIsOneToManyXECSend(
+ !isOneToManyXECSend,
+ );
+ setIsEncryptedOptionalOpReturnMsg(
+ false,
+ );
+ }}
+ style={{
+ marginBottom: '7px',
+ }}
+ />
+ </TextAreaLabel>
+ <TextAreaLabel>
+ Message:&nbsp;&nbsp;
+ <Switch
+ disabled={
+ isOneToManyXECSend
+ }
+ style={{
+ marginBottom: '7px',
+ }}
+ checkedChildren="Private"
+ unCheckedChildren="Public"
+ defaultunchecked="true"
+ checked={
+ isEncryptedOptionalOpReturnMsg
+ }
+ onChange={() => {
+ setIsEncryptedOptionalOpReturnMsg(
+ prev => !prev,
+ );
+ setIsOneToManyXECSend(
+ false,
+ );
+ }}
+ />
+ </TextAreaLabel>
+ {isEncryptedOptionalOpReturnMsg ? (
+ <Alert
+ style={{
+ marginBottom: '10px',
+ }}
+ description="Please note encrypted messages can only be sent to wallets with at least 1 outgoing transaction."
+ type="warning"
+ showIcon
+ />
+ ) : (
+ <Alert
+ style={{
+ marginBottom: '10px',
+ }}
+ description="Please note this message will be public."
+ type="warning"
+ showIcon
+ />
+ )}
+ <TextArea
+ name="opReturnMsg"
+ placeholder={
+ isEncryptedOptionalOpReturnMsg
+ ? `(max ${currency.opReturn.encryptedMsgCharLimit} characters)`
+ : `(max ${currency.opReturn.unencryptedMsgCharLimit} characters)`
+ }
+ value={
+ opReturnMsg
+ ? isEncryptedOptionalOpReturnMsg
+ ? opReturnMsg.substring(
+ 0,
+ currency
+ .opReturn
+ .encryptedMsgCharLimit +
+ 1,
+ )
+ : opReturnMsg
+ : ''
+ }
+ onChange={e =>
+ setOpReturnMsg(
+ e.target.value,
+ )
+ }
+ showCount
+ maxLength={
+ isEncryptedOptionalOpReturnMsg
+ ? currency.opReturn
+ .encryptedMsgCharLimit
+ : currency.opReturn
+ .unencryptedMsgCharLimit
+ }
+ onKeyDown={e =>
+ e.keyCode == 13
+ ? e.preventDefault()
+ : ''
+ }
+ />
+ </AntdFormWrapper>
+ </Panel>
+ </AdvancedCollapse>
+ </div>
+ {apiError && <ApiError />}
+ </Form>
+ </Col>
+ </Row>
+
+ <Modal
+ title={`Please review and confirm your message to be signed using this wallet.`}
+ visible={showConfirmMsgToSign}
+ onOk={signMessageByPk}
+ onCancel={() => setShowConfirmMsgToSign(false)}
+ >
+ <TokenParamLabel>Message:</TokenParamLabel> {msgToSign}
+ <br />
+ </Modal>
+ <AdvancedCollapse
+ style={{
+ marginBottom: '24px',
+ }}
+ >
+ <Panel header="Sign Message" key="1">
+ <AntdFormWrapper>
+ <Form
+ size="small"
+ style={{
+ width: 'auto',
+ }}
+ >
+ <Form.Item>
+ <SignMessageLabel>
+ Message:
+ </SignMessageLabel>
+ <TextArea
+ name="signMessage"
+ onChange={e => handleSignMsgChange(e)}
+ showCount
+ maxLength={150}
+ />
+ </Form.Item>
+ <Form.Item>
+ <SignMessageLabel>
+ Address:
+ </SignMessageLabel>
+ <Input
+ name="signMessageAddress"
+ disabled={true}
+ value={
+ wallet &&
+ wallet.Path1899 &&
+ wallet.Path1899.cashAddress
+ ? convertToEcashPrefix(
+ wallet.Path1899
+ .cashAddress,
+ )
+ : ''
+ }
+ />
+ </Form.Item>
+ <SmartButton
+ onClick={() =>
+ setShowConfirmMsgToSign(true)
+ }
+ disabled={!signMessageIsValid}
+ >
+ <PlusSquareOutlined />
+ &nbsp;Sign Message
+ </SmartButton>
+ <CopyToClipboard
+ style={{
+ display: 'inline-block',
+ width: '100%',
+ position: 'relative',
+ }}
+ text={messageSignature}
+ >
+ <Form.Item>
+ <SignMessageLabel>
+ Signature:
+ </SignMessageLabel>
+ <TextArea
+ name="signMessageSignature"
+ placeholder="The signature will be generated upon signing of the message"
+ readOnly={true}
+ value={messageSignature}
+ onClick={() => handleOnSigCopy()}
+ />
+ </Form.Item>
+ </CopyToClipboard>
+ {sigCopySuccess}
+ </Form>
+ </AntdFormWrapper>
+ </Panel>
+ </AdvancedCollapse>
+ </SidePaddingCtn>
+ </>
+ );
+};
+
+/*
+passLoadingStatus must receive a default prop that is a function
+in order to pass the rendering unit test in Send.test.js
+
+status => {console.log(status)} is an arbitrary stub function
+*/
+
+SendBCH.defaultProps = {
+ passLoadingStatus: status => {
+ console.log(status);
+ },
+};
+
+SendBCH.propTypes = {
+ jestBCH: PropTypes.object,
+ passLoadingStatus: PropTypes.func,
+};
+
+export default SendBCH;
diff --git a/web/cashtab-v2/src/components/Send/SendToken.js b/web/cashtab-v2/src/components/Send/SendToken.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Send/SendToken.js
@@ -0,0 +1,729 @@
+import React, { useState, useEffect } from 'react';
+import { Link } from 'react-router-dom';
+import PropTypes from 'prop-types';
+import { WalletContext } from '@utils/context';
+import {
+ Form,
+ message,
+ Row,
+ Col,
+ Alert,
+ Descriptions,
+ Modal,
+ Button,
+ Input,
+} from 'antd';
+import PrimaryButton, {
+ SecondaryButton,
+} from '@components/Common/PrimaryButton';
+import { FireTwoTone } from '@ant-design/icons';
+import {
+ DestinationAmount,
+ DestinationAddressSingle,
+ AntdFormWrapper,
+} from '@components/Common/EnhancedInputs';
+import useBCH from '@hooks/useBCH';
+import { SidePaddingCtn } from '@components/Common/Atoms';
+import BalanceHeader from '@components/Common/BalanceHeader';
+import { Redirect } from 'react-router-dom';
+import useWindowDimensions from '@hooks/useWindowDimensions';
+import { isMobile, isIOS, isSafari } from 'react-device-detect';
+import { Img } from 'react-image';
+import makeBlockie from 'ethereum-blockies-base64';
+import BigNumber from 'bignumber.js';
+import { currency, parseAddressForParams } from '@components/Common/Ticker.js';
+import { Event } from '@utils/GoogleAnalytics';
+import { getWalletState, toLegacyToken } from '@utils/cashMethods';
+import ApiError from '@components/Common/ApiError';
+import {
+ sendTokenNotification,
+ errorNotification,
+ burnTokenNotification,
+} from '@components/Common/Notifications';
+import {
+ isValidXecAddress,
+ isValidEtokenAddress,
+ isValidEtokenBurnAmount,
+} from '@utils/validation';
+import { formatDate } from '@utils/formatting';
+import styled, { css } from 'styled-components';
+import TokenIcon from '@components/Tokens/TokenIcon';
+const AntdDescriptionsCss = css`
+ .ant-descriptions-item-label,
+ .ant-input-number,
+ .ant-descriptions-item-content {
+ background-color: ${props => props.theme.contrast} !important;
+ color: ${props => props.theme.dropdownText};
+ }
+`;
+const AntdDescriptionsWrapper = styled.div`
+ ${AntdDescriptionsCss}
+`;
+const AirdropButton = styled.div`
+ text-align: center;
+ width: 100%;
+ padding: 10px;
+ border-radius: 5px;
+ background: ${props => props.theme.sentMessage};
+ a {
+ color: ${props => props.theme.darkBlue};
+ margin: 0;
+ font-size: 11px;
+ border: 1px solid ${props => props.theme.darkBlue};
+ border-radius: 5px;
+ padding: 2px 10px;
+ opacity: 0.6;
+ }
+ a:hover {
+ opacity: 1;
+ border-color: ${props => props.theme.eCashBlue};
+ color: ${props => props.theme.contrast};
+ background: ${props => props.theme.eCashBlue};
+ }
+ ${({ received, ...props }) =>
+ received &&
+ `
+ text-align: left;
+ background: ${props.theme.receivedMessage};
+ `}
+`;
+
+const SendToken = ({ tokenId, jestBCH, passLoadingStatus }) => {
+ const { wallet, apiError, cashtabSettings } =
+ React.useContext(WalletContext);
+ const walletState = getWalletState(wallet);
+ const { tokens, slpBalancesAndUtxos } = walletState;
+ const token = tokens.find(token => token.tokenId === tokenId);
+
+ const [tokenStats, setTokenStats] = useState(null);
+ const [queryStringText, setQueryStringText] = useState(null);
+ const [sendTokenAddressError, setSendTokenAddressError] = useState(false);
+ const [sendTokenAmountError, setSendTokenAmountError] = useState(false);
+ const [eTokenBurnAmount, setETokenBurnAmount] = useState(new BigNumber(1));
+ const [showConfirmBurnEtoken, setShowConfirmBurnEtoken] = useState(false);
+ const [burnTokenAmountError, setBurnTokenAmountError] = useState(false);
+ const [burnConfirmationValid, setBurnConfirmationValid] = useState(null);
+ const [confirmationOfEtokenToBeBurnt, setConfirmationOfEtokenToBeBurnt] =
+ useState('');
+
+ // Get device window width
+ // If this is less than 769, the page will open with QR scanner open
+ const { width } = useWindowDimensions();
+ // Load with QR code open if device is mobile and NOT iOS + anything but safari
+ const scannerSupported = width < 769 && isMobile && !(isIOS && !isSafari);
+ const [isModalVisible, setIsModalVisible] = useState(false);
+
+ const [formData, setFormData] = useState({
+ value: '',
+ address: '',
+ });
+
+ const { getBCH, getRestUrl, sendToken, getTokenStats, burnEtoken } =
+ useBCH();
+
+ // jestBCH is only ever specified for unit tests, otherwise app will use getBCH();
+ const BCH = jestBCH ? jestBCH : getBCH();
+
+ // Fetch token stats if you do not have them and API did not return an error
+ if (tokenStats === null) {
+ getTokenStats(BCH, tokenId).then(
+ result => {
+ setTokenStats(result);
+ },
+ err => {
+ console.log(`Error getting token stats: ${err}`);
+ },
+ );
+ }
+ // Clears address and amount fields following sendTokenNotification
+ const clearInputForms = () => {
+ setFormData({
+ value: '',
+ address: '',
+ });
+ };
+
+ async function submit() {
+ setFormData({
+ ...formData,
+ });
+
+ if (
+ !formData.address ||
+ !formData.value ||
+ Number(formData.value <= 0) ||
+ sendTokenAmountError
+ ) {
+ return;
+ }
+
+ // Event("Category", "Action", "Label")
+ // Track number of SLPA send transactions and
+ // SLPA token IDs
+ Event('SendToken.js', 'Send', tokenId);
+
+ passLoadingStatus(true);
+ const { address, value } = formData;
+
+ // Clear params from address
+ let cleanAddress = address.split('?')[0];
+
+ // Convert to simpleledger prefix if etoken
+ cleanAddress = toLegacyToken(cleanAddress);
+
+ try {
+ const link = await sendToken(BCH, wallet, slpBalancesAndUtxos, {
+ tokenId: tokenId,
+ tokenReceiverAddress: cleanAddress,
+ amount: value,
+ });
+ sendTokenNotification(link);
+ clearInputForms();
+ } catch (e) {
+ passLoadingStatus(false);
+ let message;
+
+ if (!e.error && !e.message) {
+ message = `Transaction failed: no response from ${getRestUrl()}.`;
+ } else if (
+ /Could not communicate with full node or other external service/.test(
+ e.error,
+ )
+ ) {
+ message = 'Could not communicate with API. Please try again.';
+ } else {
+ message = e.message || e.error || JSON.stringify(e);
+ }
+ errorNotification(e, message, 'Sending eToken');
+ }
+ }
+
+ const handleSlpAmountChange = e => {
+ let error = false;
+ const { value, name } = e.target;
+
+ // test if exceeds balance using BigNumber
+ let isGreaterThanBalance = false;
+ if (!isNaN(value)) {
+ const bigValue = new BigNumber(value);
+ // Returns 1 if greater, -1 if less, 0 if the same, null if n/a
+ isGreaterThanBalance = bigValue.comparedTo(token.balance);
+ }
+
+ // Validate value for > 0
+ if (isNaN(value)) {
+ error = 'Amount must be a number';
+ } else if (value <= 0) {
+ error = 'Amount must be greater than 0';
+ } else if (token && token.balance && isGreaterThanBalance === 1) {
+ error = `Amount cannot exceed your ${token.info.tokenTicker} balance of ${token.balance}`;
+ } else if (!isNaN(value) && value.toString().includes('.')) {
+ if (value.toString().split('.')[1].length > token.info.decimals) {
+ error = `This token only supports ${token.info.decimals} decimal places`;
+ }
+ }
+ setSendTokenAmountError(error);
+ setFormData(p => ({
+ ...p,
+ [name]: value,
+ }));
+ };
+
+ const handleTokenAddressChange = e => {
+ const { value, name } = e.target;
+ // validate for token address
+ // validate for parameters
+ // show warning that query strings are not supported
+
+ let error = false;
+ let addressString = value;
+
+ const isValid = isValidEtokenAddress(addressString);
+
+ const addressInfo = parseAddressForParams(addressString);
+ /*
+ Model
+ addressInfo =
+ {
+ address: '',
+ queryString: '',
+ amount: null,
+ };
+ */
+
+ const { address, queryString } = addressInfo;
+
+ // If query string,
+ // Show an alert that only amount and currency.ticker are supported
+ setQueryStringText(queryString);
+
+ // Is this valid address?
+ if (!isValid) {
+ error = 'Address is not a valid etoken: address';
+ // If valid address but xec format
+ if (isValidXecAddress(address)) {
+ error = `Cashtab does not support sending eTokens to XEC addresses. Please convert to an eToken address.`;
+ }
+ }
+ setSendTokenAddressError(error);
+
+ setFormData(p => ({
+ ...p,
+ [name]: value,
+ }));
+ };
+
+ const onMax = async () => {
+ // Clear this error before updating field
+ setSendTokenAmountError(false);
+ try {
+ let value = token.balance;
+
+ setFormData({
+ ...formData,
+ value,
+ });
+ } catch (err) {
+ console.log(`Error in onMax:`);
+ console.log(err);
+ message.error(
+ 'Unable to calculate the max value due to network errors',
+ );
+ }
+ };
+
+ const checkForConfirmationBeforeSendEtoken = () => {
+ if (cashtabSettings.sendModal) {
+ setIsModalVisible(cashtabSettings.sendModal);
+ } else {
+ // if the user does not have the send confirmation enabled in settings then send directly
+ submit();
+ }
+ };
+
+ const handleOk = () => {
+ setIsModalVisible(false);
+ submit();
+ };
+
+ const handleCancel = () => {
+ setIsModalVisible(false);
+ };
+
+ const handleEtokenBurnAmountChange = e => {
+ const { value } = e.target;
+ const burnAmount = new BigNumber(value);
+ setETokenBurnAmount(burnAmount);
+
+ let error = false;
+ if (!isValidEtokenBurnAmount(burnAmount, token.balance)) {
+ error = 'Burn amount must be between 1 and ' + token.balance;
+ }
+
+ setBurnTokenAmountError(error);
+ };
+
+ const onMaxBurn = () => {
+ setETokenBurnAmount(token.balance);
+
+ // trigger validation on the inserted max value
+ handleEtokenBurnAmountChange({
+ target: {
+ value: token.balance,
+ },
+ });
+ };
+
+ async function burn() {
+ if (
+ !burnConfirmationValid ||
+ burnConfirmationValid === null ||
+ !eTokenBurnAmount
+ ) {
+ return;
+ }
+
+ // Event("Category", "Action", "Label")
+ Event('SendToken.js', 'Burn eToken', tokenId);
+
+ passLoadingStatus(true);
+
+ try {
+ const link = await burnEtoken(BCH, wallet, slpBalancesAndUtxos, {
+ tokenId: tokenId,
+ amount: eTokenBurnAmount,
+ });
+ burnTokenNotification(link);
+ clearInputForms();
+ setShowConfirmBurnEtoken(false);
+ passLoadingStatus(false);
+ setConfirmationOfEtokenToBeBurnt('');
+ } catch (e) {
+ setShowConfirmBurnEtoken(false);
+ passLoadingStatus(false);
+ setConfirmationOfEtokenToBeBurnt('');
+ let message;
+
+ if (!e.error && !e.message) {
+ message = `Transaction failed: no response from ${getRestUrl()}.`;
+ } else if (/dust/.test(e.error)) {
+ message = 'Unable to burn due to insufficient eToken utxos.';
+ } else if (
+ /Could not communicate with full node or other external service/.test(
+ e.error,
+ )
+ ) {
+ message = 'Could not communicate with API. Please try again.';
+ } else {
+ message = e.message || e.error || JSON.stringify(e);
+ }
+ errorNotification(e, message, 'Burning eToken');
+ }
+ }
+
+ const handleBurnConfirmationInput = e => {
+ const { value } = e.target;
+
+ if (value && value === `burn ${token.info.tokenTicker}`) {
+ setBurnConfirmationValid(true);
+ } else {
+ setBurnConfirmationValid(false);
+ }
+ setConfirmationOfEtokenToBeBurnt(value);
+ };
+
+ const handleBurnAmountInput = () => {
+ if (!burnTokenAmountError) {
+ setShowConfirmBurnEtoken(true);
+ }
+ };
+
+ useEffect(() => {
+ // If the balance has changed, unlock the UI
+ // This is redundant, if backend has refreshed in 1.75s timeout below, UI will already be unlocked
+
+ passLoadingStatus(false);
+ }, [token]);
+
+ return (
+ <>
+ <Modal
+ title="Confirm Send"
+ visible={isModalVisible}
+ onOk={handleOk}
+ onCancel={handleCancel}
+ >
+ <p>
+ {token && token.info && formData
+ ? `Are you sure you want to send ${formData.value}${' '}
+ ${token.info.tokenTicker} to ${formData.address}?`
+ : ''}
+ </p>
+ </Modal>
+ {!token && <Redirect to="/" />}
+ {token && (
+ <SidePaddingCtn>
+ {/* eToken burn modal */}
+ <Modal
+ title={`Are you sure you want to burn ${eTokenBurnAmount.toString()} x ${
+ token.info.tokenTicker
+ } eTokens?`}
+ visible={showConfirmBurnEtoken}
+ onOk={burn}
+ okText={'Confirm'}
+ onCancel={() => setShowConfirmBurnEtoken(false)}
+ >
+ <AntdFormWrapper>
+ <Form style={{ width: 'auto' }}>
+ <Form.Item
+ validateStatus={
+ burnConfirmationValid === null ||
+ burnConfirmationValid
+ ? ''
+ : 'error'
+ }
+ help={
+ burnConfirmationValid === null ||
+ burnConfirmationValid
+ ? ''
+ : 'Your confirmation phrase must match exactly'
+ }
+ >
+ <Input
+ prefix={<FireTwoTone />}
+ placeholder={`Type "burn ${token.info.tokenTicker}" to confirm`}
+ name="etokenToBeBurnt"
+ value={confirmationOfEtokenToBeBurnt}
+ onChange={e =>
+ handleBurnConfirmationInput(e)
+ }
+ />
+ </Form.Item>
+ </Form>
+ </AntdFormWrapper>
+ </Modal>
+ <BalanceHeader
+ balance={token.balance}
+ ticker={token.info.tokenTicker}
+ />
+ <Row type="flex">
+ <Col span={24}>
+ <Form
+ style={{
+ width: 'auto',
+ }}
+ >
+ <DestinationAddressSingle
+ loadWithCameraOpen={scannerSupported}
+ validateStatus={
+ sendTokenAddressError ? 'error' : ''
+ }
+ help={
+ sendTokenAddressError
+ ? sendTokenAddressError
+ : ''
+ }
+ onScan={result =>
+ handleTokenAddressChange({
+ target: {
+ name: 'address',
+ value: result,
+ },
+ })
+ }
+ inputProps={{
+ placeholder: `${currency.tokenTicker} Address`,
+ name: 'address',
+ onChange: e =>
+ handleTokenAddressChange(e),
+ required: true,
+ value: formData.address,
+ }}
+ />
+ <DestinationAmount
+ validateStatus={
+ sendTokenAmountError ? 'error' : ''
+ }
+ help={
+ sendTokenAmountError
+ ? sendTokenAmountError
+ : ''
+ }
+ onMax={onMax}
+ inputProps={{
+ name: 'value',
+ step: 1 / 10 ** token.info.decimals,
+ placeholder: 'Amount',
+ prefix:
+ currency.tokenIconsUrl !== '' ? (
+ <Img
+ src={`${currency.tokenIconsUrl}/32/${tokenId}.png`}
+ width={16}
+ height={16}
+ unloader={
+ <img
+ alt={`identicon of tokenId ${tokenId} `}
+ heigh="16"
+ width="16"
+ style={{
+ borderRadius:
+ '50%',
+ }}
+ key={`identicon-${tokenId}`}
+ src={makeBlockie(
+ tokenId,
+ )}
+ />
+ }
+ />
+ ) : (
+ <img
+ alt={`identicon of tokenId ${tokenId} `}
+ heigh="16"
+ width="16"
+ style={{
+ borderRadius: '50%',
+ }}
+ key={`identicon-${tokenId}`}
+ src={makeBlockie(tokenId)}
+ />
+ ),
+ suffix: token.info.tokenTicker,
+ onChange: e => handleSlpAmountChange(e),
+ required: true,
+ value: formData.value,
+ }}
+ />
+ <div
+ style={{
+ paddingTop: '12px',
+ }}
+ >
+ {apiError ||
+ sendTokenAmountError ||
+ sendTokenAddressError ? (
+ <>
+ <SecondaryButton>
+ Send {token.info.tokenName}
+ </SecondaryButton>
+ </>
+ ) : (
+ <PrimaryButton
+ onClick={() =>
+ checkForConfirmationBeforeSendEtoken()
+ }
+ >
+ Send {token.info.tokenName}
+ </PrimaryButton>
+ )}
+ </div>
+
+ {queryStringText && (
+ <Alert
+ message={`You are sending a transaction to an address including query parameters "${queryStringText}." Token transactions do not support query parameters and they will be ignored.`}
+ type="warning"
+ />
+ )}
+ {apiError && <ApiError />}
+ </Form>
+ {tokenStats !== null && (
+ <AntdDescriptionsWrapper>
+ <Descriptions
+ column={1}
+ bordered
+ title={`Token info for "${token.info.tokenName}"`}
+ >
+ <Descriptions.Item label="Icon">
+ <TokenIcon
+ size={64}
+ tokenId={tokenId}
+ />
+ </Descriptions.Item>
+ <Descriptions.Item label="Decimals">
+ {token.info.decimals}
+ </Descriptions.Item>
+ <Descriptions.Item label="Token ID">
+ {token.tokenId}
+ <br />
+ <AirdropButton>
+ <Link
+ to={{
+ pathname: `/airdrop`,
+ state: {
+ airdropEtokenId:
+ token.tokenId,
+ },
+ }}
+ >
+ Airdrop XEC to holders
+ </Link>
+ </AirdropButton>
+ </Descriptions.Item>
+ {tokenStats && (
+ <>
+ <Descriptions.Item label="Document URI">
+ {tokenStats.documentUri}
+ </Descriptions.Item>
+ <Descriptions.Item label="Genesis Date">
+ {tokenStats.timestampUnix !==
+ null
+ ? formatDate(
+ tokenStats.timestampUnix,
+ navigator.language,
+ )
+ : 'Just now (Genesis tx confirming)'}
+ </Descriptions.Item>
+ <Descriptions.Item label="Fixed Supply?">
+ {tokenStats.containsBaton
+ ? 'No'
+ : 'Yes'}
+ </Descriptions.Item>
+ <Descriptions.Item label="Initial Quantity">
+ {tokenStats.initialTokenQty.toLocaleString()}
+ </Descriptions.Item>
+ <Descriptions.Item label="Total Burned">
+ {tokenStats.totalBurned.toLocaleString()}
+ </Descriptions.Item>
+ <Descriptions.Item label="Total Minted">
+ {tokenStats.totalMinted.toLocaleString()}
+ </Descriptions.Item>
+ <Descriptions.Item label="Circulating Supply">
+ {tokenStats.circulatingSupply.toLocaleString()}
+ </Descriptions.Item>
+ <Descriptions.Item label="Burn eToken">
+ <DestinationAmount
+ validateStatus={
+ burnTokenAmountError
+ ? 'error'
+ : ''
+ }
+ help={
+ burnTokenAmountError
+ ? burnTokenAmountError
+ : ''
+ }
+ onMax={onMaxBurn}
+ inputProps={{
+ placeholder:
+ 'Amount',
+ suffix: token.info
+ .tokenTicker,
+ onChange: e =>
+ handleEtokenBurnAmountChange(
+ e,
+ ),
+ initialvalue: 1,
+ value: eTokenBurnAmount,
+ prefix: (
+ <TokenIcon
+ size={32}
+ tokenId={
+ tokenId
+ }
+ />
+ ),
+ }}
+ />
+ <Button
+ type="primary"
+ onClick={
+ handleBurnAmountInput
+ }
+ danger
+ >
+ Burn&nbsp;
+ {token.info.tokenTicker}
+ </Button>
+ </Descriptions.Item>
+ </>
+ )}
+ </Descriptions>
+ </AntdDescriptionsWrapper>
+ )}
+ </Col>
+ </Row>
+ </SidePaddingCtn>
+ )}
+ </>
+ );
+};
+
+/*
+passLoadingStatus must receive a default prop that is a function
+in order to pass the rendering unit test in SendToken.test.js
+status => {console.log(status)} is an arbitrary stub function
+*/
+
+SendToken.defaultProps = {
+ passLoadingStatus: status => {
+ console.log(status);
+ },
+};
+
+SendToken.propTypes = {
+ tokenId: PropTypes.string,
+ jestBCH: PropTypes.object,
+ passLoadingStatus: PropTypes.func,
+};
+
+export default SendToken;
diff --git a/web/cashtab-v2/src/components/Send/__tests__/Send.test.js b/web/cashtab-v2/src/components/Send/__tests__/Send.test.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Send/__tests__/Send.test.js
@@ -0,0 +1,115 @@
+import React from 'react';
+import renderer from 'react-test-renderer';
+import { ThemeProvider } from 'styled-components';
+import { theme } from '@assets/styles/theme';
+import Send from '@components/Send/Send';
+import BCHJS from '@psf/bch-js';
+import {
+ walletWithBalancesAndTokens,
+ walletWithBalancesMock,
+ walletWithoutBalancesMock,
+ walletWithBalancesAndTokensWithCorrectState,
+} from '../../Home/__mocks__/walletAndBalancesMock';
+import { BrowserRouter as Router } from 'react-router-dom';
+
+let realUseContext;
+let useContextMock;
+
+beforeEach(() => {
+ realUseContext = React.useContext;
+ useContextMock = React.useContext = jest.fn();
+
+ // Mock method not implemented in JSDOM
+ // See reference at https://jestjs.io/docs/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom
+ Object.defineProperty(window, 'matchMedia', {
+ writable: true,
+ value: jest.fn().mockImplementation(query => ({
+ matches: false,
+ media: query,
+ onchange: null,
+ addListener: jest.fn(), // Deprecated
+ removeListener: jest.fn(), // Deprecated
+ addEventListener: jest.fn(),
+ removeEventListener: jest.fn(),
+ dispatchEvent: jest.fn(),
+ })),
+ });
+});
+
+afterEach(() => {
+ React.useContext = realUseContext;
+});
+
+test('Wallet without BCH balance', () => {
+ useContextMock.mockReturnValue(walletWithoutBalancesMock);
+ const testBCH = new BCHJS();
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Send jestBCH={testBCH} />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Wallet with BCH balances', () => {
+ useContextMock.mockReturnValue(walletWithBalancesMock);
+ const testBCH = new BCHJS();
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Send jestBCH={testBCH} />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Wallet with BCH balances and tokens', () => {
+ useContextMock.mockReturnValue(walletWithBalancesAndTokens);
+ const testBCH = new BCHJS();
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Send jestBCH={testBCH} />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Wallet with BCH balances and tokens and state field', () => {
+ useContextMock.mockReturnValue(walletWithBalancesAndTokensWithCorrectState);
+ const testBCH = new BCHJS();
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Send jestBCH={testBCH} />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Without wallet defined', () => {
+ useContextMock.mockReturnValue({
+ wallet: {},
+ balances: { totalBalance: 0 },
+ loading: false,
+ });
+ const testBCH = new BCHJS();
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Send jestBCH={testBCH} />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
diff --git a/web/cashtab-v2/src/components/Send/__tests__/SendToken.test.js b/web/cashtab-v2/src/components/Send/__tests__/SendToken.test.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Send/__tests__/SendToken.test.js
@@ -0,0 +1,100 @@
+import React from 'react';
+import renderer from 'react-test-renderer';
+import { ThemeProvider } from 'styled-components';
+import { theme } from '@assets/styles/theme';
+import SendToken from '@components/Send/SendToken';
+import BCHJS from '@psf/bch-js';
+import {
+ walletWithBalancesAndTokens,
+ walletWithBalancesAndTokensWithCorrectState,
+} from '../../Home/__mocks__/walletAndBalancesMock';
+import { BrowserRouter as Router } from 'react-router-dom';
+
+let realUseContext;
+let useContextMock;
+
+beforeEach(() => {
+ realUseContext = React.useContext;
+ useContextMock = React.useContext = jest.fn();
+
+ // Mock method not implemented in JSDOM
+ // See reference at https://jestjs.io/docs/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom
+ Object.defineProperty(window, 'matchMedia', {
+ writable: true,
+ value: jest.fn().mockImplementation(query => ({
+ matches: false,
+ media: query,
+ onchange: null,
+ addListener: jest.fn(), // Deprecated
+ removeListener: jest.fn(), // Deprecated
+ addEventListener: jest.fn(),
+ removeEventListener: jest.fn(),
+ dispatchEvent: jest.fn(),
+ })),
+ });
+});
+
+afterEach(() => {
+ React.useContext = realUseContext;
+});
+
+test('Wallet with BCH balances and tokens', () => {
+ const testBCH = new BCHJS();
+ useContextMock.mockReturnValue(walletWithBalancesAndTokens);
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <SendToken
+ tokenId={
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba'
+ }
+ jestBCH={testBCH}
+ />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Wallet with BCH balances and tokens and state field', () => {
+ const testBCH = new BCHJS();
+ useContextMock.mockReturnValue(walletWithBalancesAndTokensWithCorrectState);
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <SendToken
+ tokenId={
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba'
+ }
+ jestBCH={testBCH}
+ />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Without wallet defined', () => {
+ const testBCH = new BCHJS();
+ useContextMock.mockReturnValue({
+ wallet: {},
+ balances: { totalBalance: 0 },
+ loading: false,
+ });
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <SendToken
+ tokenId={
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba'
+ }
+ jestBCH={testBCH}
+ />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
diff --git a/web/cashtab-v2/src/components/Send/__tests__/__snapshots__/Send.test.js.snap b/web/cashtab-v2/src/components/Send/__tests__/__snapshots__/Send.test.js.snap
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Send/__tests__/__snapshots__/Send.test.js.snap
@@ -0,0 +1,2351 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP @generated
+
+exports[`Wallet with BCH balances 1`] = `
+Array [
+ <div
+ className="sc-hMqMXs kpJXFt"
+ >
+ <h4
+ className="sc-cMljjf hTVzrw"
+ >
+ MigrationTestAlpha
+ </h4>
+ <div
+ className="sc-iAyFgw hxUtff"
+ >
+ You currently have 0
+ XEC
+ <br />
+ Deposit some funds to use this feature
+ </div>
+ </div>,
+ <div
+ className="sc-jKJlTe iSWneW"
+ >
+ <div
+ className="ant-row"
+ style={Object {}}
+ type="flex"
+ >
+ <div
+ className="ant-col ant-col-24"
+ style={Object {}}
+ >
+ <form
+ className="ant-form ant-form-horizontal"
+ onReset={[Function]}
+ onSubmit={[Function]}
+ style={
+ Object {
+ "marginTop": "40px",
+ "width": "auto",
+ }
+ }
+ >
+ <div
+ className="sc-iRbamj jTdbqp"
+ >
+ <label
+ className="sc-eNQAEJ kESMRD"
+ >
+ Send to
+ </label>
+ <div
+ className="sc-VigVT bZouWf"
+ >
+ <div
+ className="ant-row ant-form-item"
+ style={
+ Object {
+ "marginBottom": "0px",
+ }
+ }
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <span
+ className="ant-input-group-wrapper"
+ >
+ <span
+ className="ant-input-wrapper ant-input-group"
+ >
+ <span
+ className="ant-input-affix-wrapper"
+ onMouseUp={[Function]}
+ style={null}
+ >
+ <span
+ className="ant-input-prefix"
+ >
+ <span
+ aria-label="wallet"
+ className="anticon anticon-wallet sc-htpNat lgbLiL"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="wallet"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 464H528V448h312v128zm0 264H184V184h656v200H496c-17.7 0-32 14.3-32 32v192c0 17.7 14.3 32 32 32h344v200zM580 512a40 40 0 1080 0 40 40 0 10-80 0z"
+ />
+ </svg>
+ </span>
+ </span>
+ <input
+ autoComplete="off"
+ className="ant-input"
+ name="address"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="XEC Address"
+ required={true}
+ style={null}
+ type="text"
+ value=""
+ />
+ </span>
+ <span
+ className="ant-input-group-addon"
+ >
+ <span
+ className="sc-iwsKbI cVxKUE"
+ onClick={[Function]}
+ >
+ <span
+ aria-label="qrcode"
+ className="anticon anticon-qrcode sc-bxivhb dlJbAr"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="qrcode"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M468 128H160c-17.7 0-32 14.3-32 32v308c0 4.4 3.6 8 8 8h332c4.4 0 8-3.6 8-8V136c0-4.4-3.6-8-8-8zm-56 284H192V192h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm194 210H136c-4.4 0-8 3.6-8 8v308c0 17.7 14.3 32 32 32h308c4.4 0 8-3.6 8-8V556c0-4.4-3.6-8-8-8zm-56 284H192V612h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm590-630H556c-4.4 0-8 3.6-8 8v332c0 4.4 3.6 8 8 8h332c4.4 0 8-3.6 8-8V160c0-17.7-14.3-32-32-32zm-32 284H612V192h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm194 210h-48c-4.4 0-8 3.6-8 8v134h-78V556c0-4.4-3.6-8-8-8H556c-4.4 0-8 3.6-8 8v332c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V644h78v102c0 4.4 3.6 8 8 8h190c4.4 0 8-3.6 8-8V556c0-4.4-3.6-8-8-8zM746 832h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm142 0h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z"
+ />
+ </svg>
+ </span>
+ </span>
+ </span>
+ </span>
+ </span>
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <label
+ className="sc-eNQAEJ kESMRD"
+ >
+ Amount
+ </label>
+ <div
+ className="sc-VigVT bZouWf"
+ >
+ <div
+ className="ant-row ant-form-item"
+ style={Object {}}
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <span
+ className="ant-input-group ant-input-group-compact"
+ >
+ <span
+ className="ant-input-affix-wrapper"
+ onMouseUp={[Function]}
+ style={
+ Object {
+ "textAlign": "left",
+ "width": "60%",
+ }
+ }
+ >
+ <span
+ className="ant-input-prefix"
+ >
+ <img
+ alt=""
+ height={16}
+ src="logo_primary.png"
+ width={16}
+ />
+ </span>
+ <input
+ className="ant-input"
+ disabled={false}
+ dollar={0}
+ name="value"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Amount"
+ required={true}
+ step={0.01}
+ style={null}
+ type="number"
+ value=""
+ />
+ </span>
+ <div
+ className="ant-select select-after ant-select-single ant-select-show-arrow"
+ onBlur={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ onKeyUp={[Function]}
+ onMouseDown={[Function]}
+ style={
+ Object {
+ "width": "30%",
+ }
+ }
+ >
+ <div
+ className="ant-select-selector"
+ onClick={[Function]}
+ onMouseDown={[Function]}
+ >
+ <span
+ className="ant-select-selection-search"
+ >
+ <input
+ aria-activedescendant="rc_select_TEST_OR_SSR_list_0"
+ aria-autocomplete="list"
+ aria-controls="rc_select_TEST_OR_SSR_list"
+ aria-haspopup="listbox"
+ aria-owns="rc_select_TEST_OR_SSR_list"
+ autoComplete="off"
+ className="ant-select-selection-search-input"
+ disabled={false}
+ id="rc_select_TEST_OR_SSR"
+ onChange={[Function]}
+ onCompositionEnd={[Function]}
+ onCompositionStart={[Function]}
+ onKeyDown={[Function]}
+ onMouseDown={[Function]}
+ onPaste={[Function]}
+ readOnly={true}
+ role="combobox"
+ style={
+ Object {
+ "opacity": 0,
+ }
+ }
+ type="search"
+ unselectable="on"
+ value=""
+ />
+ </span>
+ <span
+ className="ant-select-selection-item"
+ title="XEC"
+ >
+ XEC
+ </span>
+ </div>
+ <span
+ aria-hidden={true}
+ className="ant-select-arrow"
+ onMouseDown={[Function]}
+ style={
+ Object {
+ "WebkitUserSelect": "none",
+ "userSelect": "none",
+ }
+ }
+ unselectable="on"
+ >
+ <span
+ aria-label="down"
+ className="anticon anticon-down ant-select-suffix"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="down"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"
+ />
+ </svg>
+ </span>
+ </span>
+ </div>
+ <span
+ className="sc-fjdhpX iLNQZG"
+ disabled={false}
+ onClick={[Function]}
+ style={
+ Object {
+ "height": "55px",
+ "lineHeight": "55px",
+ "width": "10%",
+ }
+ }
+ >
+ max
+ </span>
+ </span>
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div
+ className="sc-gPEVay iyFUUj"
+ >
+ <h3
+ className="sc-jlyJG gdOWPz"
+ >
+ 0
+
+ XEC
+ </h3>
+ <div
+ className="sc-cvbbAY cLZxXS"
+ >
+ =
+
+ $ NaN USD
+ </div>
+ </div>
+ <div
+ style={
+ Object {
+ "paddingTop": "12px",
+ }
+ }
+ >
+ <button
+ className="sc-kGXeez cXnCgq"
+ >
+ Send
+ </button>
+ </div>
+ <div>
+ <div
+ className="ant-collapse ant-collapse-icon-position-left sc-kAzzGY itTQAx"
+ role={null}
+ style={
+ Object {
+ "marginBottom": "12px",
+ }
+ }
+ >
+ <div
+ className="ant-collapse-item"
+ >
+ <div
+ aria-expanded={false}
+ className="ant-collapse-header"
+ onClick={[Function]}
+ onKeyPress={[Function]}
+ role="button"
+ tabIndex={0}
+ >
+ <span
+ aria-label="right"
+ className="anticon anticon-right ant-collapse-arrow"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="right"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"
+ />
+ </svg>
+ </span>
+ Advanced
+ </div>
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+ </div>
+ <div
+ className="ant-collapse ant-collapse-icon-position-left sc-kAzzGY itTQAx"
+ role={null}
+ style={
+ Object {
+ "marginBottom": "24px",
+ }
+ }
+ >
+ <div
+ className="ant-collapse-item"
+ >
+ <div
+ aria-expanded={false}
+ className="ant-collapse-header"
+ onClick={[Function]}
+ onKeyPress={[Function]}
+ role="button"
+ tabIndex={0}
+ >
+ <span
+ aria-label="right"
+ className="anticon anticon-right ant-collapse-arrow"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="right"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"
+ />
+ </svg>
+ </span>
+ Sign Message
+ </div>
+ </div>
+ </div>
+ </div>,
+]
+`;
+
+exports[`Wallet with BCH balances and tokens 1`] = `
+Array [
+ <div
+ className="sc-hMqMXs kpJXFt"
+ >
+ <h4
+ className="sc-cMljjf hTVzrw"
+ >
+ MigrationTestAlpha
+ </h4>
+ <div
+ className="sc-iAyFgw hxUtff"
+ >
+ You currently have 0
+ XEC
+ <br />
+ Deposit some funds to use this feature
+ </div>
+ </div>,
+ <div
+ className="sc-jKJlTe iSWneW"
+ >
+ <div
+ className="ant-row"
+ style={Object {}}
+ type="flex"
+ >
+ <div
+ className="ant-col ant-col-24"
+ style={Object {}}
+ >
+ <form
+ className="ant-form ant-form-horizontal"
+ onReset={[Function]}
+ onSubmit={[Function]}
+ style={
+ Object {
+ "marginTop": "40px",
+ "width": "auto",
+ }
+ }
+ >
+ <div
+ className="sc-iRbamj jTdbqp"
+ >
+ <label
+ className="sc-eNQAEJ kESMRD"
+ >
+ Send to
+ </label>
+ <div
+ className="sc-VigVT bZouWf"
+ >
+ <div
+ className="ant-row ant-form-item"
+ style={
+ Object {
+ "marginBottom": "0px",
+ }
+ }
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <span
+ className="ant-input-group-wrapper"
+ >
+ <span
+ className="ant-input-wrapper ant-input-group"
+ >
+ <span
+ className="ant-input-affix-wrapper"
+ onMouseUp={[Function]}
+ style={null}
+ >
+ <span
+ className="ant-input-prefix"
+ >
+ <span
+ aria-label="wallet"
+ className="anticon anticon-wallet sc-htpNat lgbLiL"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="wallet"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 464H528V448h312v128zm0 264H184V184h656v200H496c-17.7 0-32 14.3-32 32v192c0 17.7 14.3 32 32 32h344v200zM580 512a40 40 0 1080 0 40 40 0 10-80 0z"
+ />
+ </svg>
+ </span>
+ </span>
+ <input
+ autoComplete="off"
+ className="ant-input"
+ name="address"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="XEC Address"
+ required={true}
+ style={null}
+ type="text"
+ value=""
+ />
+ </span>
+ <span
+ className="ant-input-group-addon"
+ >
+ <span
+ className="sc-iwsKbI cVxKUE"
+ onClick={[Function]}
+ >
+ <span
+ aria-label="qrcode"
+ className="anticon anticon-qrcode sc-bxivhb dlJbAr"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="qrcode"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M468 128H160c-17.7 0-32 14.3-32 32v308c0 4.4 3.6 8 8 8h332c4.4 0 8-3.6 8-8V136c0-4.4-3.6-8-8-8zm-56 284H192V192h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm194 210H136c-4.4 0-8 3.6-8 8v308c0 17.7 14.3 32 32 32h308c4.4 0 8-3.6 8-8V556c0-4.4-3.6-8-8-8zm-56 284H192V612h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm590-630H556c-4.4 0-8 3.6-8 8v332c0 4.4 3.6 8 8 8h332c4.4 0 8-3.6 8-8V160c0-17.7-14.3-32-32-32zm-32 284H612V192h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm194 210h-48c-4.4 0-8 3.6-8 8v134h-78V556c0-4.4-3.6-8-8-8H556c-4.4 0-8 3.6-8 8v332c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V644h78v102c0 4.4 3.6 8 8 8h190c4.4 0 8-3.6 8-8V556c0-4.4-3.6-8-8-8zM746 832h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm142 0h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z"
+ />
+ </svg>
+ </span>
+ </span>
+ </span>
+ </span>
+ </span>
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <label
+ className="sc-eNQAEJ kESMRD"
+ >
+ Amount
+ </label>
+ <div
+ className="sc-VigVT bZouWf"
+ >
+ <div
+ className="ant-row ant-form-item"
+ style={Object {}}
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <span
+ className="ant-input-group ant-input-group-compact"
+ >
+ <span
+ className="ant-input-affix-wrapper"
+ onMouseUp={[Function]}
+ style={
+ Object {
+ "textAlign": "left",
+ "width": "60%",
+ }
+ }
+ >
+ <span
+ className="ant-input-prefix"
+ >
+ <img
+ alt=""
+ height={16}
+ src="logo_primary.png"
+ width={16}
+ />
+ </span>
+ <input
+ className="ant-input"
+ disabled={false}
+ dollar={0}
+ name="value"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Amount"
+ required={true}
+ step={0.01}
+ style={null}
+ type="number"
+ value=""
+ />
+ </span>
+ <div
+ className="ant-select select-after ant-select-single ant-select-show-arrow"
+ onBlur={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ onKeyUp={[Function]}
+ onMouseDown={[Function]}
+ style={
+ Object {
+ "width": "30%",
+ }
+ }
+ >
+ <div
+ className="ant-select-selector"
+ onClick={[Function]}
+ onMouseDown={[Function]}
+ >
+ <span
+ className="ant-select-selection-search"
+ >
+ <input
+ aria-activedescendant="rc_select_TEST_OR_SSR_list_0"
+ aria-autocomplete="list"
+ aria-controls="rc_select_TEST_OR_SSR_list"
+ aria-haspopup="listbox"
+ aria-owns="rc_select_TEST_OR_SSR_list"
+ autoComplete="off"
+ className="ant-select-selection-search-input"
+ disabled={false}
+ id="rc_select_TEST_OR_SSR"
+ onChange={[Function]}
+ onCompositionEnd={[Function]}
+ onCompositionStart={[Function]}
+ onKeyDown={[Function]}
+ onMouseDown={[Function]}
+ onPaste={[Function]}
+ readOnly={true}
+ role="combobox"
+ style={
+ Object {
+ "opacity": 0,
+ }
+ }
+ type="search"
+ unselectable="on"
+ value=""
+ />
+ </span>
+ <span
+ className="ant-select-selection-item"
+ title="XEC"
+ >
+ XEC
+ </span>
+ </div>
+ <span
+ aria-hidden={true}
+ className="ant-select-arrow"
+ onMouseDown={[Function]}
+ style={
+ Object {
+ "WebkitUserSelect": "none",
+ "userSelect": "none",
+ }
+ }
+ unselectable="on"
+ >
+ <span
+ aria-label="down"
+ className="anticon anticon-down ant-select-suffix"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="down"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"
+ />
+ </svg>
+ </span>
+ </span>
+ </div>
+ <span
+ className="sc-fjdhpX iLNQZG"
+ disabled={false}
+ onClick={[Function]}
+ style={
+ Object {
+ "height": "55px",
+ "lineHeight": "55px",
+ "width": "10%",
+ }
+ }
+ >
+ max
+ </span>
+ </span>
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div
+ className="sc-gPEVay iyFUUj"
+ >
+ <h3
+ className="sc-jlyJG gdOWPz"
+ >
+ 0
+
+ XEC
+ </h3>
+ <div
+ className="sc-cvbbAY cLZxXS"
+ >
+ =
+
+ $ NaN USD
+ </div>
+ </div>
+ <div
+ style={
+ Object {
+ "paddingTop": "12px",
+ }
+ }
+ >
+ <button
+ className="sc-kGXeez cXnCgq"
+ >
+ Send
+ </button>
+ </div>
+ <div>
+ <div
+ className="ant-collapse ant-collapse-icon-position-left sc-kAzzGY itTQAx"
+ role={null}
+ style={
+ Object {
+ "marginBottom": "12px",
+ }
+ }
+ >
+ <div
+ className="ant-collapse-item"
+ >
+ <div
+ aria-expanded={false}
+ className="ant-collapse-header"
+ onClick={[Function]}
+ onKeyPress={[Function]}
+ role="button"
+ tabIndex={0}
+ >
+ <span
+ aria-label="right"
+ className="anticon anticon-right ant-collapse-arrow"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="right"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"
+ />
+ </svg>
+ </span>
+ Advanced
+ </div>
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+ </div>
+ <div
+ className="ant-collapse ant-collapse-icon-position-left sc-kAzzGY itTQAx"
+ role={null}
+ style={
+ Object {
+ "marginBottom": "24px",
+ }
+ }
+ >
+ <div
+ className="ant-collapse-item"
+ >
+ <div
+ aria-expanded={false}
+ className="ant-collapse-header"
+ onClick={[Function]}
+ onKeyPress={[Function]}
+ role="button"
+ tabIndex={0}
+ >
+ <span
+ aria-label="right"
+ className="anticon anticon-right ant-collapse-arrow"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="right"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"
+ />
+ </svg>
+ </span>
+ Sign Message
+ </div>
+ </div>
+ </div>
+ </div>,
+]
+`;
+
+exports[`Wallet with BCH balances and tokens and state field 1`] = `
+Array [
+ <div
+ className="sc-hMqMXs kpJXFt"
+ >
+ <h4
+ className="sc-cMljjf hTVzrw"
+ >
+ MigrationTestAlpha
+ </h4>
+ <div
+ className="sc-kkGfuU fwBSar"
+ >
+ 0.06
+
+ XEC
+ </div>
+ </div>,
+ <div
+ className="sc-jKJlTe iSWneW"
+ >
+ <div
+ className="ant-row"
+ style={Object {}}
+ type="flex"
+ >
+ <div
+ className="ant-col ant-col-24"
+ style={Object {}}
+ >
+ <form
+ className="ant-form ant-form-horizontal"
+ onReset={[Function]}
+ onSubmit={[Function]}
+ style={
+ Object {
+ "marginTop": "40px",
+ "width": "auto",
+ }
+ }
+ >
+ <div
+ className="sc-iRbamj jTdbqp"
+ >
+ <label
+ className="sc-eNQAEJ kESMRD"
+ >
+ Send to
+ </label>
+ <div
+ className="sc-VigVT bZouWf"
+ >
+ <div
+ className="ant-row ant-form-item"
+ style={
+ Object {
+ "marginBottom": "0px",
+ }
+ }
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <span
+ className="ant-input-group-wrapper"
+ >
+ <span
+ className="ant-input-wrapper ant-input-group"
+ >
+ <span
+ className="ant-input-affix-wrapper"
+ onMouseUp={[Function]}
+ style={null}
+ >
+ <span
+ className="ant-input-prefix"
+ >
+ <span
+ aria-label="wallet"
+ className="anticon anticon-wallet sc-htpNat lgbLiL"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="wallet"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 464H528V448h312v128zm0 264H184V184h656v200H496c-17.7 0-32 14.3-32 32v192c0 17.7 14.3 32 32 32h344v200zM580 512a40 40 0 1080 0 40 40 0 10-80 0z"
+ />
+ </svg>
+ </span>
+ </span>
+ <input
+ autoComplete="off"
+ className="ant-input"
+ name="address"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="XEC Address"
+ required={true}
+ style={null}
+ type="text"
+ value=""
+ />
+ </span>
+ <span
+ className="ant-input-group-addon"
+ >
+ <span
+ className="sc-iwsKbI cVxKUE"
+ onClick={[Function]}
+ >
+ <span
+ aria-label="qrcode"
+ className="anticon anticon-qrcode sc-bxivhb dlJbAr"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="qrcode"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M468 128H160c-17.7 0-32 14.3-32 32v308c0 4.4 3.6 8 8 8h332c4.4 0 8-3.6 8-8V136c0-4.4-3.6-8-8-8zm-56 284H192V192h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm194 210H136c-4.4 0-8 3.6-8 8v308c0 17.7 14.3 32 32 32h308c4.4 0 8-3.6 8-8V556c0-4.4-3.6-8-8-8zm-56 284H192V612h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm590-630H556c-4.4 0-8 3.6-8 8v332c0 4.4 3.6 8 8 8h332c4.4 0 8-3.6 8-8V160c0-17.7-14.3-32-32-32zm-32 284H612V192h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm194 210h-48c-4.4 0-8 3.6-8 8v134h-78V556c0-4.4-3.6-8-8-8H556c-4.4 0-8 3.6-8 8v332c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V644h78v102c0 4.4 3.6 8 8 8h190c4.4 0 8-3.6 8-8V556c0-4.4-3.6-8-8-8zM746 832h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm142 0h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z"
+ />
+ </svg>
+ </span>
+ </span>
+ </span>
+ </span>
+ </span>
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <label
+ className="sc-eNQAEJ kESMRD"
+ >
+ Amount
+ </label>
+ <div
+ className="sc-VigVT bZouWf"
+ >
+ <div
+ className="ant-row ant-form-item"
+ style={Object {}}
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <span
+ className="ant-input-group ant-input-group-compact"
+ >
+ <span
+ className="ant-input-affix-wrapper"
+ onMouseUp={[Function]}
+ style={
+ Object {
+ "textAlign": "left",
+ "width": "60%",
+ }
+ }
+ >
+ <span
+ className="ant-input-prefix"
+ >
+ <img
+ alt=""
+ height={16}
+ src="logo_primary.png"
+ width={16}
+ />
+ </span>
+ <input
+ className="ant-input"
+ disabled={false}
+ dollar={0}
+ name="value"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Amount"
+ required={true}
+ step={0.01}
+ style={null}
+ type="number"
+ value=""
+ />
+ </span>
+ <div
+ className="ant-select select-after ant-select-single ant-select-show-arrow"
+ onBlur={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ onKeyUp={[Function]}
+ onMouseDown={[Function]}
+ style={
+ Object {
+ "width": "30%",
+ }
+ }
+ >
+ <div
+ className="ant-select-selector"
+ onClick={[Function]}
+ onMouseDown={[Function]}
+ >
+ <span
+ className="ant-select-selection-search"
+ >
+ <input
+ aria-activedescendant="rc_select_TEST_OR_SSR_list_0"
+ aria-autocomplete="list"
+ aria-controls="rc_select_TEST_OR_SSR_list"
+ aria-haspopup="listbox"
+ aria-owns="rc_select_TEST_OR_SSR_list"
+ autoComplete="off"
+ className="ant-select-selection-search-input"
+ disabled={false}
+ id="rc_select_TEST_OR_SSR"
+ onChange={[Function]}
+ onCompositionEnd={[Function]}
+ onCompositionStart={[Function]}
+ onKeyDown={[Function]}
+ onMouseDown={[Function]}
+ onPaste={[Function]}
+ readOnly={true}
+ role="combobox"
+ style={
+ Object {
+ "opacity": 0,
+ }
+ }
+ type="search"
+ unselectable="on"
+ value=""
+ />
+ </span>
+ <span
+ className="ant-select-selection-item"
+ title="XEC"
+ >
+ XEC
+ </span>
+ </div>
+ <span
+ aria-hidden={true}
+ className="ant-select-arrow"
+ onMouseDown={[Function]}
+ style={
+ Object {
+ "WebkitUserSelect": "none",
+ "userSelect": "none",
+ }
+ }
+ unselectable="on"
+ >
+ <span
+ aria-label="down"
+ className="anticon anticon-down ant-select-suffix"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="down"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"
+ />
+ </svg>
+ </span>
+ </span>
+ </div>
+ <span
+ className="sc-fjdhpX iLNQZG"
+ disabled={false}
+ onClick={[Function]}
+ style={
+ Object {
+ "height": "55px",
+ "lineHeight": "55px",
+ "width": "10%",
+ }
+ }
+ >
+ max
+ </span>
+ </span>
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div
+ className="sc-gPEVay iyFUUj"
+ >
+ <h3
+ className="sc-jlyJG gdOWPz"
+ >
+ 0
+
+ XEC
+ </h3>
+ <div
+ className="sc-cvbbAY cLZxXS"
+ >
+ =
+
+ $ NaN USD
+ </div>
+ </div>
+ <div
+ style={
+ Object {
+ "paddingTop": "12px",
+ }
+ }
+ >
+ <button
+ className="sc-kgoBCf dKKqLy"
+ onClick={[Function]}
+ >
+ Send
+ </button>
+ </div>
+ <div>
+ <div
+ className="ant-collapse ant-collapse-icon-position-left sc-kAzzGY itTQAx"
+ role={null}
+ style={
+ Object {
+ "marginBottom": "12px",
+ }
+ }
+ >
+ <div
+ className="ant-collapse-item"
+ >
+ <div
+ aria-expanded={false}
+ className="ant-collapse-header"
+ onClick={[Function]}
+ onKeyPress={[Function]}
+ role="button"
+ tabIndex={0}
+ >
+ <span
+ aria-label="right"
+ className="anticon anticon-right ant-collapse-arrow"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="right"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"
+ />
+ </svg>
+ </span>
+ Advanced
+ </div>
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+ </div>
+ <div
+ className="ant-collapse ant-collapse-icon-position-left sc-kAzzGY itTQAx"
+ role={null}
+ style={
+ Object {
+ "marginBottom": "24px",
+ }
+ }
+ >
+ <div
+ className="ant-collapse-item"
+ >
+ <div
+ aria-expanded={false}
+ className="ant-collapse-header"
+ onClick={[Function]}
+ onKeyPress={[Function]}
+ role="button"
+ tabIndex={0}
+ >
+ <span
+ aria-label="right"
+ className="anticon anticon-right ant-collapse-arrow"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="right"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"
+ />
+ </svg>
+ </span>
+ Sign Message
+ </div>
+ </div>
+ </div>
+ </div>,
+]
+`;
+
+exports[`Wallet without BCH balance 1`] = `
+Array [
+ <div
+ className="sc-hMqMXs kpJXFt"
+ >
+ <h4
+ className="sc-cMljjf hTVzrw"
+ >
+ MigrationTestAlpha
+ </h4>
+ <div
+ className="sc-iAyFgw hxUtff"
+ >
+ You currently have 0
+ XEC
+ <br />
+ Deposit some funds to use this feature
+ </div>
+ </div>,
+ <div
+ className="sc-jKJlTe iSWneW"
+ >
+ <div
+ className="ant-row"
+ style={Object {}}
+ type="flex"
+ >
+ <div
+ className="ant-col ant-col-24"
+ style={Object {}}
+ >
+ <form
+ className="ant-form ant-form-horizontal"
+ onReset={[Function]}
+ onSubmit={[Function]}
+ style={
+ Object {
+ "marginTop": "40px",
+ "width": "auto",
+ }
+ }
+ >
+ <div
+ className="sc-iRbamj jTdbqp"
+ >
+ <label
+ className="sc-eNQAEJ kESMRD"
+ >
+ Send to
+ </label>
+ <div
+ className="sc-VigVT bZouWf"
+ >
+ <div
+ className="ant-row ant-form-item"
+ style={
+ Object {
+ "marginBottom": "0px",
+ }
+ }
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <span
+ className="ant-input-group-wrapper"
+ >
+ <span
+ className="ant-input-wrapper ant-input-group"
+ >
+ <span
+ className="ant-input-affix-wrapper"
+ onMouseUp={[Function]}
+ style={null}
+ >
+ <span
+ className="ant-input-prefix"
+ >
+ <span
+ aria-label="wallet"
+ className="anticon anticon-wallet sc-htpNat lgbLiL"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="wallet"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 464H528V448h312v128zm0 264H184V184h656v200H496c-17.7 0-32 14.3-32 32v192c0 17.7 14.3 32 32 32h344v200zM580 512a40 40 0 1080 0 40 40 0 10-80 0z"
+ />
+ </svg>
+ </span>
+ </span>
+ <input
+ autoComplete="off"
+ className="ant-input"
+ name="address"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="XEC Address"
+ required={true}
+ style={null}
+ type="text"
+ value=""
+ />
+ </span>
+ <span
+ className="ant-input-group-addon"
+ >
+ <span
+ className="sc-iwsKbI cVxKUE"
+ onClick={[Function]}
+ >
+ <span
+ aria-label="qrcode"
+ className="anticon anticon-qrcode sc-bxivhb dlJbAr"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="qrcode"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M468 128H160c-17.7 0-32 14.3-32 32v308c0 4.4 3.6 8 8 8h332c4.4 0 8-3.6 8-8V136c0-4.4-3.6-8-8-8zm-56 284H192V192h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm194 210H136c-4.4 0-8 3.6-8 8v308c0 17.7 14.3 32 32 32h308c4.4 0 8-3.6 8-8V556c0-4.4-3.6-8-8-8zm-56 284H192V612h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm590-630H556c-4.4 0-8 3.6-8 8v332c0 4.4 3.6 8 8 8h332c4.4 0 8-3.6 8-8V160c0-17.7-14.3-32-32-32zm-32 284H612V192h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm194 210h-48c-4.4 0-8 3.6-8 8v134h-78V556c0-4.4-3.6-8-8-8H556c-4.4 0-8 3.6-8 8v332c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V644h78v102c0 4.4 3.6 8 8 8h190c4.4 0 8-3.6 8-8V556c0-4.4-3.6-8-8-8zM746 832h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm142 0h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z"
+ />
+ </svg>
+ </span>
+ </span>
+ </span>
+ </span>
+ </span>
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <label
+ className="sc-eNQAEJ kESMRD"
+ >
+ Amount
+ </label>
+ <div
+ className="sc-VigVT bZouWf"
+ >
+ <div
+ className="ant-row ant-form-item"
+ style={Object {}}
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <span
+ className="ant-input-group ant-input-group-compact"
+ >
+ <span
+ className="ant-input-affix-wrapper"
+ onMouseUp={[Function]}
+ style={
+ Object {
+ "textAlign": "left",
+ "width": "60%",
+ }
+ }
+ >
+ <span
+ className="ant-input-prefix"
+ >
+ <img
+ alt=""
+ height={16}
+ src="logo_primary.png"
+ width={16}
+ />
+ </span>
+ <input
+ className="ant-input"
+ disabled={false}
+ dollar={0}
+ name="value"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Amount"
+ required={true}
+ step={0.01}
+ style={null}
+ type="number"
+ value=""
+ />
+ </span>
+ <div
+ className="ant-select select-after ant-select-single ant-select-show-arrow"
+ onBlur={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ onKeyUp={[Function]}
+ onMouseDown={[Function]}
+ style={
+ Object {
+ "width": "30%",
+ }
+ }
+ >
+ <div
+ className="ant-select-selector"
+ onClick={[Function]}
+ onMouseDown={[Function]}
+ >
+ <span
+ className="ant-select-selection-search"
+ >
+ <input
+ aria-activedescendant="rc_select_TEST_OR_SSR_list_0"
+ aria-autocomplete="list"
+ aria-controls="rc_select_TEST_OR_SSR_list"
+ aria-haspopup="listbox"
+ aria-owns="rc_select_TEST_OR_SSR_list"
+ autoComplete="off"
+ className="ant-select-selection-search-input"
+ disabled={false}
+ id="rc_select_TEST_OR_SSR"
+ onChange={[Function]}
+ onCompositionEnd={[Function]}
+ onCompositionStart={[Function]}
+ onKeyDown={[Function]}
+ onMouseDown={[Function]}
+ onPaste={[Function]}
+ readOnly={true}
+ role="combobox"
+ style={
+ Object {
+ "opacity": 0,
+ }
+ }
+ type="search"
+ unselectable="on"
+ value=""
+ />
+ </span>
+ <span
+ className="ant-select-selection-item"
+ title="XEC"
+ >
+ XEC
+ </span>
+ </div>
+ <span
+ aria-hidden={true}
+ className="ant-select-arrow"
+ onMouseDown={[Function]}
+ style={
+ Object {
+ "WebkitUserSelect": "none",
+ "userSelect": "none",
+ }
+ }
+ unselectable="on"
+ >
+ <span
+ aria-label="down"
+ className="anticon anticon-down ant-select-suffix"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="down"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"
+ />
+ </svg>
+ </span>
+ </span>
+ </div>
+ <span
+ className="sc-fjdhpX iLNQZG"
+ disabled={false}
+ onClick={[Function]}
+ style={
+ Object {
+ "height": "55px",
+ "lineHeight": "55px",
+ "width": "10%",
+ }
+ }
+ >
+ max
+ </span>
+ </span>
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div
+ className="sc-gPEVay iyFUUj"
+ >
+ <h3
+ className="sc-jlyJG gdOWPz"
+ >
+ 0
+
+ XEC
+ </h3>
+ <div
+ className="sc-cvbbAY cLZxXS"
+ >
+ =
+
+ $ NaN USD
+ </div>
+ </div>
+ <div
+ style={
+ Object {
+ "paddingTop": "12px",
+ }
+ }
+ >
+ <button
+ className="sc-kGXeez cXnCgq"
+ >
+ Send
+ </button>
+ </div>
+ <div>
+ <div
+ className="ant-collapse ant-collapse-icon-position-left sc-kAzzGY itTQAx"
+ role={null}
+ style={
+ Object {
+ "marginBottom": "12px",
+ }
+ }
+ >
+ <div
+ className="ant-collapse-item"
+ >
+ <div
+ aria-expanded={false}
+ className="ant-collapse-header"
+ onClick={[Function]}
+ onKeyPress={[Function]}
+ role="button"
+ tabIndex={0}
+ >
+ <span
+ aria-label="right"
+ className="anticon anticon-right ant-collapse-arrow"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="right"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"
+ />
+ </svg>
+ </span>
+ Advanced
+ </div>
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+ </div>
+ <div
+ className="ant-collapse ant-collapse-icon-position-left sc-kAzzGY itTQAx"
+ role={null}
+ style={
+ Object {
+ "marginBottom": "24px",
+ }
+ }
+ >
+ <div
+ className="ant-collapse-item"
+ >
+ <div
+ aria-expanded={false}
+ className="ant-collapse-header"
+ onClick={[Function]}
+ onKeyPress={[Function]}
+ role="button"
+ tabIndex={0}
+ >
+ <span
+ aria-label="right"
+ className="anticon anticon-right ant-collapse-arrow"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="right"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"
+ />
+ </svg>
+ </span>
+ Sign Message
+ </div>
+ </div>
+ </div>
+ </div>,
+]
+`;
+
+exports[`Without wallet defined 1`] = `
+Array [
+ <div
+ className="sc-hMqMXs kpJXFt"
+ >
+ <div
+ className="sc-iAyFgw hxUtff"
+ >
+ You currently have 0
+ XEC
+ <br />
+ Deposit some funds to use this feature
+ </div>
+ </div>,
+ <div
+ className="sc-jKJlTe iSWneW"
+ >
+ <div
+ className="ant-row"
+ style={Object {}}
+ type="flex"
+ >
+ <div
+ className="ant-col ant-col-24"
+ style={Object {}}
+ >
+ <form
+ className="ant-form ant-form-horizontal"
+ onReset={[Function]}
+ onSubmit={[Function]}
+ style={
+ Object {
+ "marginTop": "40px",
+ "width": "auto",
+ }
+ }
+ >
+ <div
+ className="sc-iRbamj jTdbqp"
+ >
+ <label
+ className="sc-eNQAEJ kESMRD"
+ >
+ Send to
+ </label>
+ <div
+ className="sc-VigVT bZouWf"
+ >
+ <div
+ className="ant-row ant-form-item"
+ style={
+ Object {
+ "marginBottom": "0px",
+ }
+ }
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <span
+ className="ant-input-group-wrapper"
+ >
+ <span
+ className="ant-input-wrapper ant-input-group"
+ >
+ <span
+ className="ant-input-affix-wrapper"
+ onMouseUp={[Function]}
+ style={null}
+ >
+ <span
+ className="ant-input-prefix"
+ >
+ <span
+ aria-label="wallet"
+ className="anticon anticon-wallet sc-htpNat lgbLiL"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="wallet"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 464H528V448h312v128zm0 264H184V184h656v200H496c-17.7 0-32 14.3-32 32v192c0 17.7 14.3 32 32 32h344v200zM580 512a40 40 0 1080 0 40 40 0 10-80 0z"
+ />
+ </svg>
+ </span>
+ </span>
+ <input
+ autoComplete="off"
+ className="ant-input"
+ name="address"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="XEC Address"
+ required={true}
+ style={null}
+ type="text"
+ value=""
+ />
+ </span>
+ <span
+ className="ant-input-group-addon"
+ >
+ <span
+ className="sc-iwsKbI cVxKUE"
+ onClick={[Function]}
+ >
+ <span
+ aria-label="qrcode"
+ className="anticon anticon-qrcode sc-bxivhb dlJbAr"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="qrcode"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M468 128H160c-17.7 0-32 14.3-32 32v308c0 4.4 3.6 8 8 8h332c4.4 0 8-3.6 8-8V136c0-4.4-3.6-8-8-8zm-56 284H192V192h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm194 210H136c-4.4 0-8 3.6-8 8v308c0 17.7 14.3 32 32 32h308c4.4 0 8-3.6 8-8V556c0-4.4-3.6-8-8-8zm-56 284H192V612h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm590-630H556c-4.4 0-8 3.6-8 8v332c0 4.4 3.6 8 8 8h332c4.4 0 8-3.6 8-8V160c0-17.7-14.3-32-32-32zm-32 284H612V192h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm194 210h-48c-4.4 0-8 3.6-8 8v134h-78V556c0-4.4-3.6-8-8-8H556c-4.4 0-8 3.6-8 8v332c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V644h78v102c0 4.4 3.6 8 8 8h190c4.4 0 8-3.6 8-8V556c0-4.4-3.6-8-8-8zM746 832h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm142 0h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z"
+ />
+ </svg>
+ </span>
+ </span>
+ </span>
+ </span>
+ </span>
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <label
+ className="sc-eNQAEJ kESMRD"
+ >
+ Amount
+ </label>
+ <div
+ className="sc-VigVT bZouWf"
+ >
+ <div
+ className="ant-row ant-form-item"
+ style={Object {}}
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <span
+ className="ant-input-group ant-input-group-compact"
+ >
+ <span
+ className="ant-input-affix-wrapper"
+ onMouseUp={[Function]}
+ style={
+ Object {
+ "textAlign": "left",
+ "width": "60%",
+ }
+ }
+ >
+ <span
+ className="ant-input-prefix"
+ >
+ <img
+ alt=""
+ height={16}
+ src="logo_primary.png"
+ width={16}
+ />
+ </span>
+ <input
+ className="ant-input"
+ disabled={false}
+ dollar={0}
+ name="value"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Amount"
+ required={true}
+ step={0.01}
+ style={null}
+ type="number"
+ value=""
+ />
+ </span>
+ <div
+ className="ant-select select-after ant-select-single ant-select-show-arrow"
+ onBlur={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ onKeyUp={[Function]}
+ onMouseDown={[Function]}
+ style={
+ Object {
+ "width": "30%",
+ }
+ }
+ >
+ <div
+ className="ant-select-selector"
+ onClick={[Function]}
+ onMouseDown={[Function]}
+ >
+ <span
+ className="ant-select-selection-search"
+ >
+ <input
+ aria-activedescendant="rc_select_TEST_OR_SSR_list_0"
+ aria-autocomplete="list"
+ aria-controls="rc_select_TEST_OR_SSR_list"
+ aria-haspopup="listbox"
+ aria-owns="rc_select_TEST_OR_SSR_list"
+ autoComplete="off"
+ className="ant-select-selection-search-input"
+ disabled={false}
+ id="rc_select_TEST_OR_SSR"
+ onChange={[Function]}
+ onCompositionEnd={[Function]}
+ onCompositionStart={[Function]}
+ onKeyDown={[Function]}
+ onMouseDown={[Function]}
+ onPaste={[Function]}
+ readOnly={true}
+ role="combobox"
+ style={
+ Object {
+ "opacity": 0,
+ }
+ }
+ type="search"
+ unselectable="on"
+ value=""
+ />
+ </span>
+ <span
+ className="ant-select-selection-item"
+ title="XEC"
+ >
+ XEC
+ </span>
+ </div>
+ <span
+ aria-hidden={true}
+ className="ant-select-arrow"
+ onMouseDown={[Function]}
+ style={
+ Object {
+ "WebkitUserSelect": "none",
+ "userSelect": "none",
+ }
+ }
+ unselectable="on"
+ >
+ <span
+ aria-label="down"
+ className="anticon anticon-down ant-select-suffix"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="down"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"
+ />
+ </svg>
+ </span>
+ </span>
+ </div>
+ <span
+ className="sc-fjdhpX iLNQZG"
+ disabled={false}
+ onClick={[Function]}
+ style={
+ Object {
+ "height": "55px",
+ "lineHeight": "55px",
+ "width": "10%",
+ }
+ }
+ >
+ max
+ </span>
+ </span>
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div
+ className="sc-gPEVay iyFUUj"
+ >
+ <h3
+ className="sc-jlyJG gdOWPz"
+ >
+ 0
+
+ XEC
+ </h3>
+ <div
+ className="sc-cvbbAY cLZxXS"
+ >
+ =
+
+ $ NaN USD
+ </div>
+ </div>
+ <div
+ style={
+ Object {
+ "paddingTop": "12px",
+ }
+ }
+ >
+ <button
+ className="sc-kGXeez cXnCgq"
+ >
+ Send
+ </button>
+ </div>
+ <div>
+ <div
+ className="ant-collapse ant-collapse-icon-position-left sc-kAzzGY itTQAx"
+ role={null}
+ style={
+ Object {
+ "marginBottom": "12px",
+ }
+ }
+ >
+ <div
+ className="ant-collapse-item"
+ >
+ <div
+ aria-expanded={false}
+ className="ant-collapse-header"
+ onClick={[Function]}
+ onKeyPress={[Function]}
+ role="button"
+ tabIndex={0}
+ >
+ <span
+ aria-label="right"
+ className="anticon anticon-right ant-collapse-arrow"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="right"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"
+ />
+ </svg>
+ </span>
+ Advanced
+ </div>
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+ </div>
+ <div
+ className="ant-collapse ant-collapse-icon-position-left sc-kAzzGY itTQAx"
+ role={null}
+ style={
+ Object {
+ "marginBottom": "24px",
+ }
+ }
+ >
+ <div
+ className="ant-collapse-item"
+ >
+ <div
+ aria-expanded={false}
+ className="ant-collapse-header"
+ onClick={[Function]}
+ onKeyPress={[Function]}
+ role="button"
+ tabIndex={0}
+ >
+ <span
+ aria-label="right"
+ className="anticon anticon-right ant-collapse-arrow"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="right"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M765.7 486.8L314.9 134.7A7.97 7.97 0 00302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 000-50.4z"
+ />
+ </svg>
+ </span>
+ Sign Message
+ </div>
+ </div>
+ </div>
+ </div>,
+]
+`;
diff --git a/web/cashtab-v2/src/components/Send/__tests__/__snapshots__/SendToken.test.js.snap b/web/cashtab-v2/src/components/Send/__tests__/__snapshots__/SendToken.test.js.snap
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Send/__tests__/__snapshots__/SendToken.test.js.snap
@@ -0,0 +1,244 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP @generated
+
+exports[`Wallet with BCH balances and tokens 1`] = `null`;
+
+exports[`Wallet with BCH balances and tokens and state field 1`] = `
+<div
+ className="sc-kGXeez djtubK"
+>
+ <div
+ className="sc-jKJlTe hrFzvR"
+ >
+ 6.001
+
+ TBS
+ </div>
+ <div
+ className="ant-row"
+ style={Object {}}
+ type="flex"
+ >
+ <div
+ className="ant-col ant-col-24"
+ style={Object {}}
+ >
+ <form
+ className="ant-form ant-form-horizontal"
+ onReset={[Function]}
+ onSubmit={[Function]}
+ style={
+ Object {
+ "width": "auto",
+ }
+ }
+ >
+ <div
+ className="sc-jzJRlG kWGBmG"
+ >
+ <div
+ className="ant-row ant-form-item"
+ style={Object {}}
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <span
+ className="ant-input-group-wrapper"
+ >
+ <span
+ className="ant-input-wrapper ant-input-group"
+ >
+ <span
+ className="ant-input-affix-wrapper"
+ onMouseUp={[Function]}
+ style={null}
+ >
+ <span
+ className="ant-input-prefix"
+ >
+ <span
+ aria-label="wallet"
+ className="anticon anticon-wallet sc-htpNat lgbLiL"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="wallet"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 464H528V448h312v128zm0 264H184V184h656v200H496c-17.7 0-32 14.3-32 32v192c0 17.7 14.3 32 32 32h344v200zM580 512a40 40 0 1080 0 40 40 0 10-80 0z"
+ />
+ </svg>
+ </span>
+ </span>
+ <input
+ autoComplete="off"
+ className="ant-input"
+ name="address"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="eToken Address"
+ required={true}
+ style={null}
+ type="text"
+ value=""
+ />
+ </span>
+ <span
+ className="ant-input-group-addon"
+ >
+ <span
+ className="sc-VigVT jPrdqZ"
+ onClick={[Function]}
+ >
+ <span
+ aria-label="qrcode"
+ className="anticon anticon-qrcode sc-bxivhb dlJbAr"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="qrcode"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M468 128H160c-17.7 0-32 14.3-32 32v308c0 4.4 3.6 8 8 8h332c4.4 0 8-3.6 8-8V136c0-4.4-3.6-8-8-8zm-56 284H192V192h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm194 210H136c-4.4 0-8 3.6-8 8v308c0 17.7 14.3 32 32 32h308c4.4 0 8-3.6 8-8V556c0-4.4-3.6-8-8-8zm-56 284H192V612h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm590-630H556c-4.4 0-8 3.6-8 8v332c0 4.4 3.6 8 8 8h332c4.4 0 8-3.6 8-8V160c0-17.7-14.3-32-32-32zm-32 284H612V192h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm194 210h-48c-4.4 0-8 3.6-8 8v134h-78V556c0-4.4-3.6-8-8-8H556c-4.4 0-8 3.6-8 8v332c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V644h78v102c0 4.4 3.6 8 8 8h190c4.4 0 8-3.6 8-8V556c0-4.4-3.6-8-8-8zM746 832h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm142 0h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z"
+ />
+ </svg>
+ </span>
+ </span>
+ </span>
+ </span>
+ </span>
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div
+ className="sc-jzJRlG kWGBmG"
+ >
+ <div
+ className="ant-row ant-form-item"
+ style={Object {}}
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <span
+ className="ant-input-group-wrapper"
+ >
+ <span
+ className="ant-input-wrapper ant-input-group"
+ >
+ <span
+ className="ant-input-affix-wrapper"
+ onMouseUp={[Function]}
+ style={null}
+ >
+ <span
+ className="ant-input-prefix"
+ />
+ <input
+ className="ant-input"
+ name="value"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Amount"
+ required={true}
+ step={1e-9}
+ style={null}
+ type="number"
+ value=""
+ />
+ <span
+ className="ant-input-suffix"
+ >
+ TBS
+ </span>
+ </span>
+ <span
+ className="ant-input-group-addon"
+ >
+ <span
+ className="sc-cSHVUG goJbBD"
+ disabled={false}
+ onClick={[Function]}
+ >
+ max
+ </span>
+ </span>
+ </span>
+ </span>
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div
+ style={
+ Object {
+ "paddingTop": "12px",
+ }
+ }
+ >
+ <button
+ className="sc-iwsKbI eqLYNi"
+ onClick={[Function]}
+ >
+ Send
+ TestBits
+ </button>
+ </div>
+ </form>
+ </div>
+ </div>
+</div>
+`;
+
+exports[`Without wallet defined 1`] = `null`;
diff --git a/web/cashtab-v2/src/components/Tokens/CreateTokenForm.js b/web/cashtab-v2/src/components/Tokens/CreateTokenForm.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Tokens/CreateTokenForm.js
@@ -0,0 +1,813 @@
+import React, { useState, useCallback } from 'react';
+import styled from 'styled-components';
+import PropTypes from 'prop-types';
+import { AntdFormWrapper } from '@components/Common/EnhancedInputs';
+import { TokenCollapse } from '@components/Common/StyledCollapse';
+import { currency } from '@components/Common/Ticker.js';
+import {
+ CropControlModal,
+ CropperContainer,
+ ControlsContainer,
+} from '../Common/CropControlModal';
+import { WalletContext } from '@utils/context';
+import {
+ isValidTokenName,
+ isValidTokenTicker,
+ isValidTokenDecimals,
+ isValidTokenInitialQty,
+ isValidTokenDocumentUrl,
+} from '@utils/validation';
+import {
+ PlusSquareOutlined,
+ UploadOutlined,
+ PaperClipOutlined,
+} from '@ant-design/icons';
+import { SmartButton } from '@components/Common/PrimaryButton';
+import {
+ notification,
+ Collapse,
+ Form,
+ Input,
+ Modal,
+ Button,
+ Slider,
+ Tooltip,
+ Upload,
+ Typography,
+ Switch,
+} from 'antd';
+const { Panel } = Collapse;
+import { TokenParamLabel, FormLabel } from '@components/Common/Atoms';
+import {
+ createTokenNotification,
+ tokenIconSubmitSuccess,
+ errorNotification,
+} from '@components/Common/Notifications';
+import Cropper from 'react-easy-crop';
+import getCroppedImg from '@utils/icons/cropImage';
+import getRoundImg from '@utils/icons/roundImage';
+import getResizedImage from '@utils/icons/resizeImage';
+const { Dragger } = Upload;
+
+export const CreateTokenCtn = styled.div`
+ margin-top: 20px;
+ h3 {
+ color: ${props => props.theme.contrast};
+ }
+ .ant-form-item {
+ margin-bottom: 0px;
+ }
+`;
+
+const CreateTokenForm = ({
+ BCH,
+ getRestUrl,
+ createToken,
+ disabled,
+ passLoadingStatus,
+}) => {
+ const { wallet } = React.useContext(WalletContext);
+
+ // eToken icon adds
+ const [tokenIcon, setTokenIcon] = useState('');
+ const [loading, setLoading] = useState(false);
+ const [fileName, setFileName] = useState('');
+ const [tokenIconFileList, setTokenIconFileList] = useState();
+ const [rawImageUrl, setRawImageUrl] = useState('');
+ const [imageUrl, setImageUrl] = useState('');
+ const [showCropModal, setShowCropModal] = useState(false);
+ const [roundSelection, setRoundSelection] = useState(true);
+
+ const [crop, setCrop] = useState({ x: 0, y: 0 });
+ const [rotation, setRotation] = useState(0);
+ const [zoom, setZoom] = useState(1);
+ const [croppedAreaPixels, setCroppedAreaPixels] = useState(null);
+
+ const onCropComplete = useCallback((croppedArea, croppedAreaPixels) => {
+ setCroppedAreaPixels(croppedAreaPixels);
+ }, []);
+
+ const showCroppedImage = useCallback(async () => {
+ setLoading(true);
+
+ try {
+ let imageToResize;
+
+ const croppedResult = await getCroppedImg(
+ rawImageUrl,
+ croppedAreaPixels,
+ rotation,
+ fileName,
+ );
+
+ if (roundSelection) {
+ imageToResize = await getRoundImg(croppedResult.url, fileName);
+ } else {
+ imageToResize = croppedResult;
+ }
+
+ await getResizedImage(
+ imageToResize.url,
+ resizedResult => {
+ setTokenIcon(resizedResult.file);
+ setImageUrl(resizedResult.url);
+ },
+ fileName,
+ );
+ } catch (e) {
+ console.error(e);
+ } finally {
+ setLoading(false);
+ }
+ }, [croppedAreaPixels, fileName, rawImageUrl, rotation, roundSelection]);
+
+ const onClose = useCallback(() => {
+ setShowCropModal(false);
+ }, []);
+
+ const handleTokenIconImage = (imgFile, callback) =>
+ new Promise((resolve, reject) => {
+ setLoading(true);
+ try {
+ const reader = new FileReader();
+
+ const width = 128;
+ const height = 128;
+ reader.readAsDataURL(imgFile);
+
+ reader.addEventListener('load', () =>
+ setRawImageUrl(reader.result),
+ );
+
+ reader.onload = event => {
+ const img = new Image();
+ img.src = event.target.result;
+ img.onload = () => {
+ const elem = document.createElement('canvas');
+ //console.log(`Canvas created`);
+ elem.width = width;
+ elem.height = height;
+ const ctx = elem.getContext('2d');
+ // img.width and img.height will contain the original dimensions
+ ctx.drawImage(img, 0, 0, width, height);
+ if (!HTMLCanvasElement.prototype.toBlob) {
+ Object.defineProperty(
+ HTMLCanvasElement.prototype,
+ 'toBlob',
+ {
+ value: function (callback, type, quality) {
+ var dataURL = this.toDataURL(
+ type,
+ quality,
+ ).split(',')[1];
+ setTimeout(function () {
+ var binStr = atob(dataURL),
+ len = binStr.length,
+ arr = new Uint8Array(len);
+ for (var i = 0; i < len; i++) {
+ arr[i] = binStr.charCodeAt(i);
+ }
+ callback(
+ new Blob([arr], {
+ type: type || 'image/png',
+ }),
+ );
+ });
+ },
+ },
+ );
+ }
+
+ ctx.canvas.toBlob(
+ blob => {
+ console.log(imgFile.name);
+
+ let fileNameParts = imgFile.name.split('.');
+ fileNameParts.pop();
+ let fileNamePng =
+ fileNameParts.join('.') + '.png';
+
+ const file = new File([blob], fileNamePng, {
+ type: 'image/png',
+ });
+ setFileName(fileNamePng);
+ const resultReader = new FileReader();
+
+ resultReader.readAsDataURL(file);
+ setTokenIcon(file);
+ resultReader.addEventListener('load', () =>
+ callback(resultReader.result),
+ );
+ setLoading(false);
+ setShowCropModal(true);
+ resolve();
+ },
+ 'image/png',
+ 1,
+ );
+ };
+ };
+ } catch (err) {
+ console.log(`Error in handleTokenIconImage()`);
+ console.log(err);
+ reject(err);
+ }
+ });
+
+ const transformTokenIconFile = file => {
+ return new Promise((resolve, reject) => {
+ reject();
+ // setLoading(false);
+ });
+ };
+
+ const beforeTokenIconUpload = file => {
+ const approvedFileTypes = ['image/png', 'image/jpg', 'image/jpeg'];
+ try {
+ if (!approvedFileTypes.includes(file.type)) {
+ throw new Error('Only jpg or png image files are accepted');
+ } else {
+ setLoading(true);
+ handleTokenIconImage(file, imageUrl => setImageUrl(imageUrl));
+ }
+ } catch (e) {
+ console.error('error', e);
+
+ Modal.error({
+ title: 'Icon Upload Error',
+ content: e.message || e.error || JSON.stringify(e),
+ });
+ setTokenIconFileList(undefined);
+ setTokenIcon(undefined);
+ setImageUrl('');
+ return false;
+ }
+ };
+
+ const handleChangeTokenIconUpload = info => {
+ let list = [...info.fileList];
+
+ if (info.file.type.split('/')[0] !== 'image') {
+ setTokenIconFileList(undefined);
+ setImageUrl('');
+ } else {
+ setTokenIconFileList(list.slice(-1));
+ }
+ };
+
+ //end eToken icon adds
+
+ // New Token Name
+ const [newTokenName, setNewTokenName] = useState('');
+ const [newTokenNameIsValid, setNewTokenNameIsValid] = useState(null);
+ const handleNewTokenNameInput = e => {
+ const { value } = e.target;
+ // validation
+ setNewTokenNameIsValid(isValidTokenName(value));
+ setNewTokenName(value);
+ };
+
+ // New Token Ticker
+ const [newTokenTicker, setNewTokenTicker] = useState('');
+ const [newTokenTickerIsValid, setNewTokenTickerIsValid] = useState(null);
+ const handleNewTokenTickerInput = e => {
+ const { value } = e.target;
+ // validation
+ setNewTokenTickerIsValid(isValidTokenTicker(value));
+ setNewTokenTicker(value);
+ };
+
+ // New Token Decimals
+ const [newTokenDecimals, setNewTokenDecimals] = useState(0);
+ const [newTokenDecimalsIsValid, setNewTokenDecimalsIsValid] =
+ useState(true);
+ const handleNewTokenDecimalsInput = e => {
+ const { value } = e.target;
+ // validation
+ setNewTokenDecimalsIsValid(isValidTokenDecimals(value));
+ // Also validate the supply here if it has not yet been set
+ if (newTokenInitialQtyIsValid !== null) {
+ setNewTokenInitialQtyIsValid(
+ isValidTokenInitialQty(value, newTokenDecimals),
+ );
+ }
+
+ setNewTokenDecimals(value);
+ };
+
+ // New Token Initial Quantity
+ const [newTokenInitialQty, setNewTokenInitialQty] = useState('');
+ const [newTokenInitialQtyIsValid, setNewTokenInitialQtyIsValid] =
+ useState(null);
+ const handleNewTokenInitialQtyInput = e => {
+ const { value } = e.target;
+ // validation
+ setNewTokenInitialQtyIsValid(
+ isValidTokenInitialQty(value, newTokenDecimals),
+ );
+ setNewTokenInitialQty(value);
+ };
+ // New Token document URL
+ const [newTokenDocumentUrl, setNewTokenDocumentUrl] = useState('');
+ // Start with this as true, field is not required
+ const [newTokenDocumentUrlIsValid, setNewTokenDocumentUrlIsValid] =
+ useState(true);
+
+ const handleNewTokenDocumentUrlInput = e => {
+ const { value } = e.target;
+ // validation
+ setNewTokenDocumentUrlIsValid(isValidTokenDocumentUrl(value));
+ setNewTokenDocumentUrl(value);
+ };
+
+ // New Token fixed supply
+ // Only allow creation of fixed supply tokens until Minting support is added
+
+ // New Token document hash
+ // Do not include this; questionable value to casual users and requires significant complication
+
+ // Only enable CreateToken button if all form entries are valid
+ let tokenGenesisDataIsValid =
+ newTokenNameIsValid &&
+ newTokenTickerIsValid &&
+ newTokenDecimalsIsValid &&
+ newTokenInitialQtyIsValid &&
+ newTokenDocumentUrlIsValid;
+
+ // Modal settings
+ const [showConfirmCreateToken, setShowConfirmCreateToken] = useState(false);
+
+ const submitTokenIcon = async link => {
+ // Get the tokenId from link
+ const newlyMintedTokenId = link.substr(link.length - 64);
+
+ let formData = new FormData();
+
+ const data = {
+ newTokenName,
+ newTokenTicker,
+ newTokenDecimals,
+ newTokenDocumentUrl,
+ newTokenInitialQty,
+ tokenIcon,
+ };
+ for (let key in data) {
+ formData.append(key, data[key]);
+ }
+ // Would get tokenId here
+ //formData.append('tokenId', link.substr(link.length - 64));
+ // for now, hard code it
+ formData.append('tokenId', newlyMintedTokenId);
+
+ console.log(formData);
+
+ try {
+ const tokenIconApprovalResponse = await fetch(
+ currency.tokenIconSubmitApi,
+ {
+ method: 'POST',
+ //Note: fetch automatically assigns correct header for multipart form based on formData obj
+ headers: {
+ Accept: 'application/json',
+ },
+ body: formData,
+ },
+ );
+
+ const tokenIconApprovalResponseJson =
+ await tokenIconApprovalResponse.json();
+
+ if (!tokenIconApprovalResponseJson.approvalRequested) {
+ // If the backend returns a specific error msg along with "approvalRequested = false", throw that error
+ // You may want to customize how the app reacts to different cases
+ if (tokenIconApprovalResponseJson.msg) {
+ throw new Error(tokenIconApprovalResponseJson.msg);
+ } else {
+ throw new Error('Error in uploading token icon');
+ }
+ }
+
+ tokenIconSubmitSuccess();
+ } catch (err) {
+ console.error(err.message);
+ errorNotification(
+ err,
+ err.message,
+ 'Submitting icon for approval while creating a new eToken',
+ );
+ }
+ };
+ const createPreviewedToken = async () => {
+ passLoadingStatus(true);
+ // If data is for some reason not valid here, bail out
+ if (!tokenGenesisDataIsValid) {
+ return;
+ }
+
+ // data must be valid and user reviewed to get here
+ const configObj = {
+ name: newTokenName,
+ ticker: newTokenTicker,
+ documentUrl:
+ newTokenDocumentUrl === ''
+ ? currency.newTokenDefaultUrl
+ : newTokenDocumentUrl,
+ decimals: newTokenDecimals,
+ initialQty: newTokenInitialQty,
+ documentHash: '',
+ };
+
+ // create token with data in state fields
+ try {
+ const link = await createToken(
+ BCH,
+ wallet,
+ currency.defaultFee,
+ configObj,
+ );
+ createTokenNotification(link);
+
+ // If this eToken has an icon, upload to server
+ if (tokenIcon !== '') {
+ submitTokenIcon(link);
+ }
+ } catch (e) {
+ // Set loading to false here as well, as balance may not change depending on where error occured in try loop
+ passLoadingStatus(false);
+ let message;
+
+ if (!e.error && !e.message) {
+ message = `Transaction failed: no response from ${getRestUrl()}.`;
+ } else if (
+ /Could not communicate with full node or other external service/.test(
+ e.error,
+ )
+ ) {
+ message = 'Could not communicate with API. Please try again.';
+ } else if (
+ e.error &&
+ e.error.includes(
+ 'too-long-mempool-chain, too many unconfirmed ancestors [limit: 50] (code 64)',
+ )
+ ) {
+ message = `The ${currency.ticker} you are trying to send has too many unconfirmed ancestors to send (limit 50). Sending will be possible after a block confirmation. Try again in about 10 minutes.`;
+ } else {
+ message = e.message || e.error || JSON.stringify(e);
+ }
+ errorNotification(e, message, 'Creating eToken');
+ }
+ // Hide the modal
+ setShowConfirmCreateToken(false);
+ // Stop spinner
+ passLoadingStatus(false);
+ };
+ return (
+ <>
+ <Modal
+ title={`Please review and confirm your token settings.`}
+ visible={showConfirmCreateToken}
+ onOk={createPreviewedToken}
+ onCancel={() => setShowConfirmCreateToken(false)}
+ >
+ <TokenParamLabel>Name:</TokenParamLabel> {newTokenName}
+ <br />
+ <TokenParamLabel>Ticker:</TokenParamLabel> {newTokenTicker}
+ <br />
+ <TokenParamLabel>Decimals:</TokenParamLabel> {newTokenDecimals}
+ <br />
+ <TokenParamLabel>Supply:</TokenParamLabel> {newTokenInitialQty}
+ <br />
+ <TokenParamLabel>Document URL:</TokenParamLabel>{' '}
+ {newTokenDocumentUrl === ''
+ ? currency.newTokenDefaultUrl
+ : newTokenDocumentUrl}
+ <br />
+ </Modal>
+ <CreateTokenCtn>
+ <h3>Create a Token</h3>
+ {!disabled && (
+ <>
+ <AntdFormWrapper>
+ <Form
+ size="small"
+ style={{
+ width: 'auto',
+ }}
+ >
+ <FormLabel>Token Name</FormLabel>
+ <Form.Item
+ validateStatus={
+ newTokenNameIsValid === null ||
+ newTokenNameIsValid
+ ? ''
+ : 'error'
+ }
+ help={
+ newTokenNameIsValid === null ||
+ newTokenNameIsValid
+ ? ''
+ : 'Token name must be a string between 1 and 68 characters long'
+ }
+ >
+ <Input
+ placeholder="Enter a name for your token"
+ name="newTokenName"
+ value={newTokenName}
+ onChange={e =>
+ handleNewTokenNameInput(e)
+ }
+ />
+ </Form.Item>
+ <FormLabel>Ticker</FormLabel>
+ <Form.Item
+ validateStatus={
+ newTokenTickerIsValid === null ||
+ newTokenTickerIsValid
+ ? ''
+ : 'error'
+ }
+ help={
+ newTokenTickerIsValid === null ||
+ newTokenTickerIsValid
+ ? ''
+ : 'Ticker must be a string between 1 and 12 characters long'
+ }
+ >
+ <Input
+ placeholder="Enter a ticker for your token"
+ name="newTokenTicker"
+ value={newTokenTicker}
+ onChange={e =>
+ handleNewTokenTickerInput(e)
+ }
+ />
+ </Form.Item>
+ <FormLabel>Decimals</FormLabel>
+ <Form.Item
+ validateStatus={
+ newTokenDecimalsIsValid === null ||
+ newTokenDecimalsIsValid
+ ? ''
+ : 'error'
+ }
+ help={
+ newTokenDecimalsIsValid === null ||
+ newTokenDecimalsIsValid
+ ? ''
+ : 'Token decimals must be an integer between 0 and 9'
+ }
+ >
+ <Input
+ placeholder="Enter number of decimal places"
+ name="newTokenDecimals"
+ type="number"
+ value={newTokenDecimals}
+ onChange={e =>
+ handleNewTokenDecimalsInput(e)
+ }
+ />
+ </Form.Item>
+ <FormLabel>Supply</FormLabel>
+ <Form.Item
+ validateStatus={
+ newTokenInitialQtyIsValid === null ||
+ newTokenInitialQtyIsValid
+ ? ''
+ : 'error'
+ }
+ help={
+ newTokenInitialQtyIsValid === null ||
+ newTokenInitialQtyIsValid
+ ? ''
+ : 'Token supply must be greater than 0 and less than 100,000,000,000. Token supply decimal places cannot exceed token decimal places.'
+ }
+ >
+ <Input
+ placeholder="Enter the fixed supply of your token"
+ name="newTokenInitialQty"
+ type="number"
+ value={newTokenInitialQty}
+ onChange={e =>
+ handleNewTokenInitialQtyInput(e)
+ }
+ />
+ </Form.Item>
+ <FormLabel>Document URL</FormLabel>
+ <Form.Item
+ validateStatus={
+ newTokenDocumentUrlIsValid === null ||
+ newTokenDocumentUrlIsValid
+ ? ''
+ : 'error'
+ }
+ help={
+ newTokenDocumentUrlIsValid === null ||
+ newTokenDocumentUrlIsValid
+ ? ''
+ : 'Must be valid URL. Cannot exceed 68 characters.'
+ }
+ >
+ <Input
+ placeholder="Enter a website for your token"
+ name="newTokenDocumentUrl"
+ value={newTokenDocumentUrl}
+ onChange={e =>
+ handleNewTokenDocumentUrlInput(e)
+ }
+ />
+ </Form.Item>
+ <FormLabel>Add Image</FormLabel>
+ <Form.Item>
+ <Dragger
+ multiple={false}
+ transformFile={transformTokenIconFile}
+ beforeUpload={beforeTokenIconUpload}
+ onChange={handleChangeTokenIconUpload}
+ onRemove={() => false}
+ fileList={tokenIconFileList}
+ name="tokenIcon"
+ style={{
+ backgroundColor: '#f4f4f4',
+ }}
+ >
+ {imageUrl ? (
+ <img
+ src={imageUrl}
+ alt="avatar"
+ style={{ width: '128px' }}
+ />
+ ) : (
+ <>
+ {' '}
+ <UploadOutlined />
+ <p>
+ Click, or drag file to this
+ area to upload
+ </p>
+ <p style={{ fontSize: '12px' }}>
+ Only jpg or png accepted
+ </p>
+ </>
+ )}
+ </Dragger>
+
+ {!loading && tokenIcon && (
+ <>
+ <Tooltip title={tokenIcon.name}>
+ <Typography.Paragraph
+ ellipsis
+ style={{
+ lineHeight: 'normal',
+ textAlign: 'center',
+ cursor: 'pointer',
+ }}
+ onClick={() =>
+ setShowCropModal(true)
+ }
+ >
+ <PaperClipOutlined />
+ {tokenIcon.name}
+ </Typography.Paragraph>
+ <Typography.Paragraph
+ ellipsis
+ style={{
+ lineHeight: 'normal',
+ textAlign: 'center',
+ marginBottom: '10px',
+ cursor: 'pointer',
+ }}
+ onClick={() =>
+ setShowCropModal(true)
+ }
+ >
+ Click here to crop or zoom
+ your icon
+ </Typography.Paragraph>
+ </Tooltip>{' '}
+ </>
+ )}
+
+ <CropControlModal
+ style={{
+ textAlign: 'left',
+ }}
+ expand={showCropModal}
+ onClick={() => null}
+ renderExpanded={() => (
+ <>
+ {' '}
+ <CropperContainer>
+ <Cropper
+ showGrid={false}
+ zoomWithScroll={false}
+ image={rawImageUrl}
+ crop={crop}
+ zoom={zoom}
+ rotation={rotation}
+ cropShape={
+ roundSelection
+ ? 'round'
+ : 'rect'
+ }
+ aspect={1 / 1}
+ onCropChange={setCrop}
+ onCropComplete={
+ onCropComplete
+ }
+ onZoomChange={setZoom}
+ onRotationChange={
+ setRotation
+ }
+ style={{ top: '80px' }}
+ />
+ </CropperContainer>
+ <ControlsContainer>
+ <Switch
+ id="cropSwitch"
+ checkedChildren="Square"
+ unCheckedChildren="Round"
+ name="cropShape"
+ onChange={checked =>
+ setRoundSelection(
+ !checked,
+ )
+ }
+ />{' '}
+ <br />
+ {'Zoom:'}
+ <Slider
+ defaultValue={1}
+ onChange={zoom =>
+ setZoom(zoom)
+ }
+ min={1}
+ max={10}
+ step={0.1}
+ />
+ {'Rotation:'}
+ <Slider
+ defaultValue={0}
+ onChange={rotation =>
+ setRotation(
+ rotation,
+ )
+ }
+ min={0}
+ max={360}
+ step={1}
+ />
+ <Button
+ id="cropControlsConfirm"
+ onClick={() =>
+ showCroppedImage() &&
+ onClose()
+ }
+ >
+ OK
+ </Button>
+ </ControlsContainer>
+ </>
+ )}
+ onClose={onClose}
+ />
+ </Form.Item>
+ </Form>
+ </AntdFormWrapper>
+
+ <SmartButton
+ onClick={() => setShowConfirmCreateToken(true)}
+ disabled={!tokenGenesisDataIsValid}
+ style={{ marginTop: '30px' }}
+ >
+ <PlusSquareOutlined />
+ &nbsp;Create eToken
+ </SmartButton>
+ </>
+ )}
+ </CreateTokenCtn>
+ </>
+ );
+};
+
+/*
+passLoadingStatus must receive a default prop that is a function
+in order to pass the rendering unit test in CreateTokenForm.test.js
+
+status => {console.log(status)} is an arbitrary stub function
+*/
+
+CreateTokenForm.defaultProps = {
+ passLoadingStatus: status => {
+ console.log(status);
+ },
+};
+
+CreateTokenForm.propTypes = {
+ BCH: PropTypes.object,
+ getRestUrl: PropTypes.func,
+ createToken: PropTypes.func,
+ disabled: PropTypes.bool,
+ passLoadingStatus: PropTypes.func,
+};
+
+export default CreateTokenForm;
diff --git a/web/cashtab-v2/src/components/Tokens/TokenIcon.js b/web/cashtab-v2/src/components/Tokens/TokenIcon.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Tokens/TokenIcon.js
@@ -0,0 +1,35 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import makeBlockie from 'ethereum-blockies-base64';
+import { Img } from 'react-image';
+import { currency } from '@components/Common/Ticker';
+
+const TokenIcon = ({ size, tokenId }) => {
+ return (
+ <>
+ <Img
+ src={`${currency.tokenIconsUrl}/${size}/${tokenId}.png`}
+ width={size}
+ height={size}
+ unloader={
+ <img
+ alt={`identicon of tokenId ${tokenId} `}
+ height="32"
+ width="32"
+ style={{
+ borderRadius: '50%',
+ }}
+ key={`identicon-${tokenId}`}
+ src={makeBlockie(tokenId)}
+ />
+ }
+ />
+ </>
+ );
+};
+TokenIcon.propTypes = {
+ size: PropTypes.oneOf([32, 64, 128, 256, 512]),
+ tokenId: PropTypes.string,
+};
+
+export default TokenIcon;
diff --git a/web/cashtab-v2/src/components/Tokens/Tokens.js b/web/cashtab-v2/src/components/Tokens/Tokens.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Tokens/Tokens.js
@@ -0,0 +1,101 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { WalletContext } from '@utils/context';
+import { fromSmallestDenomination, getWalletState } from '@utils/cashMethods';
+import CreateTokenForm from '@components/Tokens/CreateTokenForm';
+import { currency } from '@components/Common/Ticker.js';
+import useBCH from '@hooks/useBCH';
+import BalanceHeader from '@components/Common/BalanceHeader';
+import BalanceHeaderFiat from '@components/Common/BalanceHeaderFiat';
+import {
+ AlertMsg,
+ WalletInfoCtn,
+ SidePaddingCtn,
+} from '@components/Common/Atoms';
+import ApiError from '@components/Common/ApiError';
+import WalletLabel from '@components/Common/WalletLabel.js';
+
+const Tokens = ({ jestBCH, passLoadingStatus }) => {
+ const { wallet, apiError, fiatPrice, cashtabSettings } =
+ React.useContext(WalletContext);
+ const walletState = getWalletState(wallet);
+ const { balances } = walletState;
+
+ const { getBCH, getRestUrl, createToken } = useBCH();
+
+ // Support using locally installed bchjs for unit tests
+ const BCH = jestBCH ? jestBCH : getBCH();
+ return (
+ <>
+ <WalletInfoCtn>
+ <WalletLabel name={wallet.name}></WalletLabel>
+ <BalanceHeader
+ balance={balances.totalBalance}
+ ticker={currency.ticker}
+ />
+ <BalanceHeaderFiat
+ balance={balances.totalBalance}
+ settings={cashtabSettings}
+ fiatPrice={fiatPrice}
+ />
+ </WalletInfoCtn>
+ <SidePaddingCtn>
+ {apiError && <ApiError />}
+ <CreateTokenForm
+ BCH={BCH}
+ getRestUrl={getRestUrl}
+ createToken={createToken}
+ disabled={
+ balances.totalBalanceInSatoshis < currency.dustSats
+ }
+ passLoadingStatus={passLoadingStatus}
+ />
+ {balances.totalBalanceInSatoshis < currency.dustSats && (
+ <AlertMsg>
+ You need at least{' '}
+ {fromSmallestDenomination(currency.dustSats).toString()}{' '}
+ {currency.ticker} (
+ {cashtabSettings
+ ? `${
+ currency.fiatCurrencies[
+ cashtabSettings.fiatCurrency
+ ].symbol
+ }`
+ : '$'}
+ {(
+ fromSmallestDenomination(
+ currency.dustSats,
+ ).toString() * fiatPrice
+ ).toFixed(4)}{' '}
+ {cashtabSettings
+ ? `${currency.fiatCurrencies[
+ cashtabSettings.fiatCurrency
+ ].slug.toUpperCase()}`
+ : 'USD'}
+ ) to create a token
+ </AlertMsg>
+ )}
+ </SidePaddingCtn>
+ </>
+ );
+};
+
+/*
+passLoadingStatus must receive a default prop that is a function
+in order to pass the rendering unit test in Tokens.test.js
+
+status => {console.log(status)} is an arbitrary stub function
+*/
+
+Tokens.defaultProps = {
+ passLoadingStatus: status => {
+ console.log(status);
+ },
+};
+
+Tokens.propTypes = {
+ jestBCH: PropTypes.object,
+ passLoadingStatus: PropTypes.func,
+};
+
+export default Tokens;
diff --git a/web/cashtab-v2/src/components/Tokens/__tests__/CreateTokenForm.test.js b/web/cashtab-v2/src/components/Tokens/__tests__/CreateTokenForm.test.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Tokens/__tests__/CreateTokenForm.test.js
@@ -0,0 +1,58 @@
+import React from 'react';
+import renderer from 'react-test-renderer';
+import { ThemeProvider } from 'styled-components';
+import { theme } from '@assets/styles/theme';
+import CreateTokenForm from '@components/Tokens/CreateTokenForm';
+import BCHJS from '@psf/bch-js';
+import useBCH from '@hooks/useBCH';
+import { walletWithBalancesAndTokensWithCorrectState } from '../../Home/__mocks__/walletAndBalancesMock';
+
+let useContextMock;
+let realUseContext;
+
+beforeEach(() => {
+ realUseContext = React.useContext;
+ useContextMock = React.useContext = jest.fn();
+
+ // Mock method not implemented in JSDOM
+ // See reference at https://jestjs.io/docs/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom
+ Object.defineProperty(window, 'matchMedia', {
+ writable: true,
+ value: jest.fn().mockImplementation(query => ({
+ matches: false,
+ media: query,
+ onchange: null,
+ addListener: jest.fn(), // Deprecated
+ removeListener: jest.fn(), // Deprecated
+ addEventListener: jest.fn(),
+ removeEventListener: jest.fn(),
+ dispatchEvent: jest.fn(),
+ })),
+ });
+});
+
+afterEach(() => {
+ React.useContext = realUseContext;
+});
+
+test('Wallet with BCH balances and tokens and state field', () => {
+ useContextMock.mockReturnValue(walletWithBalancesAndTokensWithCorrectState);
+
+ const testBCH = new BCHJS();
+ const { getRestUrl, createToken } = useBCH();
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <CreateTokenForm
+ BCH={testBCH}
+ getRestUrl={getRestUrl}
+ createToken={createToken}
+ disabled={
+ walletWithBalancesAndTokensWithCorrectState.wallet.state
+ .balances.totalBalanceInSatoshis < 546
+ }
+ />
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
diff --git a/web/cashtab-v2/src/components/Tokens/__tests__/Tokens.test.js b/web/cashtab-v2/src/components/Tokens/__tests__/Tokens.test.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Tokens/__tests__/Tokens.test.js
@@ -0,0 +1,115 @@
+import React from 'react';
+import renderer from 'react-test-renderer';
+import { ThemeProvider } from 'styled-components';
+import { theme } from '@assets/styles/theme';
+import Tokens from '@components/Tokens/Tokens';
+import BCHJS from '@psf/bch-js';
+import {
+ walletWithBalancesAndTokens,
+ walletWithBalancesMock,
+ walletWithoutBalancesMock,
+ walletWithBalancesAndTokensWithCorrectState,
+} from '../../Home/__mocks__/walletAndBalancesMock';
+import { BrowserRouter as Router } from 'react-router-dom';
+
+let realUseContext;
+let useContextMock;
+
+beforeEach(() => {
+ realUseContext = React.useContext;
+ useContextMock = React.useContext = jest.fn();
+
+ // Mock method not implemented in JSDOM
+ // See reference at https://jestjs.io/docs/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom
+ Object.defineProperty(window, 'matchMedia', {
+ writable: true,
+ value: jest.fn().mockImplementation(query => ({
+ matches: false,
+ media: query,
+ onchange: null,
+ addListener: jest.fn(), // Deprecated
+ removeListener: jest.fn(), // Deprecated
+ addEventListener: jest.fn(),
+ removeEventListener: jest.fn(),
+ dispatchEvent: jest.fn(),
+ })),
+ });
+});
+
+afterEach(() => {
+ React.useContext = realUseContext;
+});
+
+test('Wallet without BCH balance', () => {
+ useContextMock.mockReturnValue(walletWithoutBalancesMock);
+ const testBCH = new BCHJS();
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Tokens jestBCH={testBCH} />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Wallet with BCH balances', () => {
+ useContextMock.mockReturnValue(walletWithBalancesMock);
+ const testBCH = new BCHJS();
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Tokens jestBCH={testBCH} />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Wallet with BCH balances and tokens', () => {
+ useContextMock.mockReturnValue(walletWithBalancesAndTokens);
+ const testBCH = new BCHJS();
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Tokens jestBCH={testBCH} />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Wallet with BCH balances and tokens and state field', () => {
+ useContextMock.mockReturnValue(walletWithBalancesAndTokensWithCorrectState);
+ const testBCH = new BCHJS();
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Tokens jestBCH={testBCH} />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
+
+test('Without wallet defined', () => {
+ useContextMock.mockReturnValue({
+ wallet: {},
+ balances: { totalBalance: 0 },
+ loading: false,
+ });
+ const testBCH = new BCHJS();
+ const component = renderer.create(
+ <ThemeProvider theme={theme}>
+ <Router>
+ <Tokens jestBCH={testBCH} />
+ </Router>
+ </ThemeProvider>,
+ );
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
diff --git a/web/cashtab-v2/src/components/Tokens/__tests__/__snapshots__/CreateTokenForm.test.js.snap b/web/cashtab-v2/src/components/Tokens/__tests__/__snapshots__/CreateTokenForm.test.js.snap
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Tokens/__tests__/__snapshots__/CreateTokenForm.test.js.snap
@@ -0,0 +1,375 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP @generated
+
+exports[`Wallet with BCH balances and tokens and state field 1`] = `
+<div
+ className="sc-jDwBTQ yQqNZ"
+>
+ <h3>
+ Create a Token
+ </h3>
+ <div
+ className="sc-VigVT bZouWf"
+ >
+ <form
+ className="ant-form ant-form-horizontal ant-form-small"
+ onReset={[Function]}
+ onSubmit={[Function]}
+ style={
+ Object {
+ "width": "auto",
+ }
+ }
+ >
+ <label
+ className="sc-kkGfuU ekDVdV"
+ >
+ Token Name
+ </label>
+ <div
+ className="ant-row ant-form-item"
+ style={Object {}}
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <input
+ className="ant-input ant-input-sm"
+ name="newTokenName"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Enter a name for your token"
+ type="text"
+ value=""
+ />
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ <label
+ className="sc-kkGfuU ekDVdV"
+ >
+ Ticker
+ </label>
+ <div
+ className="ant-row ant-form-item"
+ style={Object {}}
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <input
+ className="ant-input ant-input-sm"
+ name="newTokenTicker"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Enter a ticker for your token"
+ type="text"
+ value=""
+ />
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ <label
+ className="sc-kkGfuU ekDVdV"
+ >
+ Decimals
+ </label>
+ <div
+ className="ant-row ant-form-item"
+ style={Object {}}
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <input
+ className="ant-input ant-input-sm"
+ name="newTokenDecimals"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Enter number of decimal places"
+ type="number"
+ value={0}
+ />
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ <label
+ className="sc-kkGfuU ekDVdV"
+ >
+ Supply
+ </label>
+ <div
+ className="ant-row ant-form-item"
+ style={Object {}}
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <input
+ className="ant-input ant-input-sm"
+ name="newTokenInitialQty"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Enter the fixed supply of your token"
+ type="number"
+ value=""
+ />
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ <label
+ className="sc-kkGfuU ekDVdV"
+ >
+ Document URL
+ </label>
+ <div
+ className="ant-row ant-form-item"
+ style={Object {}}
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <input
+ className="ant-input ant-input-sm"
+ name="newTokenDocumentUrl"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Enter a website for your token"
+ type="text"
+ value=""
+ />
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ <label
+ className="sc-kkGfuU ekDVdV"
+ >
+ Add Image
+ </label>
+ <div
+ className="ant-row ant-form-item"
+ style={Object {}}
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <span>
+ <div
+ className="ant-upload ant-upload-drag"
+ onDragLeave={[Function]}
+ onDragOver={[Function]}
+ onDrop={[Function]}
+ style={
+ Object {
+ "backgroundColor": "#f4f4f4",
+ "height": undefined,
+ }
+ }
+ >
+ <span
+ className="ant-upload ant-upload-btn"
+ onClick={[Function]}
+ onDragOver={[Function]}
+ onDrop={[Function]}
+ onKeyDown={[Function]}
+ role="button"
+ tabIndex="0"
+ >
+ <input
+ accept=""
+ multiple={false}
+ onChange={[Function]}
+ onClick={[Function]}
+ style={
+ Object {
+ "display": "none",
+ }
+ }
+ type="file"
+ />
+ <div
+ className="ant-upload-drag-container"
+ >
+
+ <span
+ aria-label="upload"
+ className="anticon anticon-upload"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="upload"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M400 317.7h73.9V656c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V317.7H624c6.7 0 10.4-7.7 6.3-12.9L518.3 163a8 8 0 00-12.6 0l-112 141.7c-4.1 5.3-.4 13 6.3 13zM878 626h-60c-4.4 0-8 3.6-8 8v154H214V634c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v198c0 17.7 14.3 32 32 32h684c17.7 0 32-14.3 32-32V634c0-4.4-3.6-8-8-8z"
+ />
+ </svg>
+ </span>
+ <p>
+ Click, or drag file to this area to upload
+ </p>
+ <p
+ style={
+ Object {
+ "fontSize": "12px",
+ }
+ }
+ >
+ Only jpg or png accepted
+ </p>
+ </div>
+ </span>
+ </div>
+ <div
+ className="ant-upload-list ant-upload-list-text"
+ />
+ </span>
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+ <button
+ className="sc-jKJlTe cxrKVk"
+ disabled={true}
+ onClick={[Function]}
+ style={
+ Object {
+ "marginTop": "30px",
+ }
+ }
+ >
+ <span
+ aria-label="plus-square"
+ className="anticon anticon-plus-square"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="plus-square"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M328 544h152v152c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V544h152c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H544V328c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v152H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z"
+ />
+ <path
+ d="M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"
+ />
+ </svg>
+ </span>
+  Create eToken
+ </button>
+</div>
+`;
diff --git a/web/cashtab-v2/src/components/Tokens/__tests__/__snapshots__/Tokens.test.js.snap b/web/cashtab-v2/src/components/Tokens/__tests__/__snapshots__/Tokens.test.js.snap
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/Tokens/__tests__/__snapshots__/Tokens.test.js.snap
@@ -0,0 +1,580 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP @generated
+
+exports[`Wallet with BCH balances 1`] = `
+Array [
+ <div
+ className="sc-iAyFgw chWhWK"
+ >
+ <h4
+ className="sc-iRbamj gCEMNU"
+ >
+ MigrationTestAlpha
+ </h4>
+ <div
+ className="sc-eHgmQL znFwg"
+ >
+ 0
+
+ XEC
+ </div>
+ </div>,
+ <div
+ className="sc-kEYyzF gZfJyA"
+ >
+ <div
+ className="sc-jDwBTQ yQqNZ"
+ >
+ <h3>
+ Create a Token
+ </h3>
+ </div>
+ <p
+ className="sc-brqgnP kPbEse"
+ >
+ You need at least
+
+ 5.5
+
+ XEC
+ (
+ $
+ NaN
+
+ USD
+ ) to create a token
+ </p>
+ </div>,
+]
+`;
+
+exports[`Wallet with BCH balances and tokens 1`] = `
+Array [
+ <div
+ className="sc-iAyFgw chWhWK"
+ >
+ <h4
+ className="sc-iRbamj gCEMNU"
+ >
+ MigrationTestAlpha
+ </h4>
+ <div
+ className="sc-eHgmQL znFwg"
+ >
+ 0
+
+ XEC
+ </div>
+ </div>,
+ <div
+ className="sc-kEYyzF gZfJyA"
+ >
+ <div
+ className="sc-jDwBTQ yQqNZ"
+ >
+ <h3>
+ Create a Token
+ </h3>
+ </div>
+ <p
+ className="sc-brqgnP kPbEse"
+ >
+ You need at least
+
+ 5.5
+
+ XEC
+ (
+ $
+ NaN
+
+ USD
+ ) to create a token
+ </p>
+ </div>,
+]
+`;
+
+exports[`Wallet with BCH balances and tokens and state field 1`] = `
+Array [
+ <div
+ className="sc-iAyFgw chWhWK"
+ >
+ <h4
+ className="sc-iRbamj gCEMNU"
+ >
+ MigrationTestAlpha
+ </h4>
+ <div
+ className="sc-eHgmQL znFwg"
+ >
+ 0.06
+
+ XEC
+ </div>
+ </div>,
+ <div
+ className="sc-kEYyzF gZfJyA"
+ >
+ <div
+ className="sc-jDwBTQ yQqNZ"
+ >
+ <h3>
+ Create a Token
+ </h3>
+ <div
+ className="sc-VigVT bZouWf"
+ >
+ <form
+ className="ant-form ant-form-horizontal ant-form-small"
+ onReset={[Function]}
+ onSubmit={[Function]}
+ style={
+ Object {
+ "width": "auto",
+ }
+ }
+ >
+ <label
+ className="sc-kkGfuU ekDVdV"
+ >
+ Token Name
+ </label>
+ <div
+ className="ant-row ant-form-item"
+ style={Object {}}
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <input
+ className="ant-input ant-input-sm"
+ name="newTokenName"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Enter a name for your token"
+ type="text"
+ value=""
+ />
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ <label
+ className="sc-kkGfuU ekDVdV"
+ >
+ Ticker
+ </label>
+ <div
+ className="ant-row ant-form-item"
+ style={Object {}}
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <input
+ className="ant-input ant-input-sm"
+ name="newTokenTicker"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Enter a ticker for your token"
+ type="text"
+ value=""
+ />
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ <label
+ className="sc-kkGfuU ekDVdV"
+ >
+ Decimals
+ </label>
+ <div
+ className="ant-row ant-form-item"
+ style={Object {}}
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <input
+ className="ant-input ant-input-sm"
+ name="newTokenDecimals"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Enter number of decimal places"
+ type="number"
+ value={0}
+ />
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ <label
+ className="sc-kkGfuU ekDVdV"
+ >
+ Supply
+ </label>
+ <div
+ className="ant-row ant-form-item"
+ style={Object {}}
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <input
+ className="ant-input ant-input-sm"
+ name="newTokenInitialQty"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Enter the fixed supply of your token"
+ type="number"
+ value=""
+ />
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ <label
+ className="sc-kkGfuU ekDVdV"
+ >
+ Document URL
+ </label>
+ <div
+ className="ant-row ant-form-item"
+ style={Object {}}
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <input
+ className="ant-input ant-input-sm"
+ name="newTokenDocumentUrl"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Enter a website for your token"
+ type="text"
+ value=""
+ />
+ </div>
+ </div>
+ <div
+ className="ant-form-item-explain"
+ >
+ <div
+ role="alert"
+ >
+
+ </div>
+ </div>
+ </div>
+ </div>
+ <label
+ className="sc-kkGfuU ekDVdV"
+ >
+ Add Image
+ </label>
+ <div
+ className="ant-row ant-form-item"
+ style={Object {}}
+ >
+ <div
+ className="ant-col ant-form-item-control"
+ style={Object {}}
+ >
+ <div
+ className="ant-form-item-control-input"
+ >
+ <div
+ className="ant-form-item-control-input-content"
+ >
+ <span>
+ <div
+ className="ant-upload ant-upload-drag"
+ onDragLeave={[Function]}
+ onDragOver={[Function]}
+ onDrop={[Function]}
+ style={
+ Object {
+ "backgroundColor": "#f4f4f4",
+ "height": undefined,
+ }
+ }
+ >
+ <span
+ className="ant-upload ant-upload-btn"
+ onClick={[Function]}
+ onDragOver={[Function]}
+ onDrop={[Function]}
+ onKeyDown={[Function]}
+ role="button"
+ tabIndex="0"
+ >
+ <input
+ accept=""
+ multiple={false}
+ onChange={[Function]}
+ onClick={[Function]}
+ style={
+ Object {
+ "display": "none",
+ }
+ }
+ type="file"
+ />
+ <div
+ className="ant-upload-drag-container"
+ >
+
+ <span
+ aria-label="upload"
+ className="anticon anticon-upload"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="upload"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M400 317.7h73.9V656c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V317.7H624c6.7 0 10.4-7.7 6.3-12.9L518.3 163a8 8 0 00-12.6 0l-112 141.7c-4.1 5.3-.4 13 6.3 13zM878 626h-60c-4.4 0-8 3.6-8 8v154H214V634c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v198c0 17.7 14.3 32 32 32h684c17.7 0 32-14.3 32-32V634c0-4.4-3.6-8-8-8z"
+ />
+ </svg>
+ </span>
+ <p>
+ Click, or drag file to this area to upload
+ </p>
+ <p
+ style={
+ Object {
+ "fontSize": "12px",
+ }
+ }
+ >
+ Only jpg or png accepted
+ </p>
+ </div>
+ </span>
+ </div>
+ <div
+ className="ant-upload-list ant-upload-list-text"
+ />
+ </span>
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+ <button
+ className="sc-jKJlTe cxrKVk"
+ disabled={true}
+ onClick={[Function]}
+ style={
+ Object {
+ "marginTop": "30px",
+ }
+ }
+ >
+ <span
+ aria-label="plus-square"
+ className="anticon anticon-plus-square"
+ role="img"
+ >
+ <svg
+ aria-hidden="true"
+ data-icon="plus-square"
+ fill="currentColor"
+ focusable="false"
+ height="1em"
+ viewBox="64 64 896 896"
+ width="1em"
+ >
+ <path
+ d="M328 544h152v152c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V544h152c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H544V328c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v152H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z"
+ />
+ <path
+ d="M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"
+ />
+ </svg>
+ </span>
+  Create eToken
+ </button>
+ </div>
+ </div>,
+]
+`;
+
+exports[`Wallet without BCH balance 1`] = `
+Array [
+ <div
+ className="sc-iAyFgw chWhWK"
+ >
+ <h4
+ className="sc-iRbamj gCEMNU"
+ >
+ MigrationTestAlpha
+ </h4>
+ <div
+ className="sc-eHgmQL znFwg"
+ >
+ 0
+
+ XEC
+ </div>
+ </div>,
+ <div
+ className="sc-kEYyzF gZfJyA"
+ >
+ <div
+ className="sc-jDwBTQ yQqNZ"
+ >
+ <h3>
+ Create a Token
+ </h3>
+ </div>
+ <p
+ className="sc-brqgnP kPbEse"
+ >
+ You need at least
+
+ 5.5
+
+ XEC
+ (
+ $
+ NaN
+
+ USD
+ ) to create a token
+ </p>
+ </div>,
+]
+`;
+
+exports[`Without wallet defined 1`] = `
+Array [
+ <div
+ className="sc-iAyFgw chWhWK"
+ >
+ <div
+ className="sc-eHgmQL znFwg"
+ >
+ 0
+
+ XEC
+ </div>
+ </div>,
+ <div
+ className="sc-kEYyzF gZfJyA"
+ >
+ <div
+ className="sc-jDwBTQ yQqNZ"
+ >
+ <h3>
+ Create a Token
+ </h3>
+ </div>
+ <p
+ className="sc-brqgnP kPbEse"
+ >
+ You need at least
+
+ 5.5
+
+ XEC
+ (
+ $
+ NaN
+
+ USD
+ ) to create a token
+ </p>
+ </div>,
+]
+`;
diff --git a/web/cashtab-v2/src/components/__tests__/NotFound.test.js b/web/cashtab-v2/src/components/__tests__/NotFound.test.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/__tests__/NotFound.test.js
@@ -0,0 +1,9 @@
+import React from 'react';
+import renderer from 'react-test-renderer';
+import NotFound from '@components/NotFound';
+
+test('Render NotFound component', () => {
+ const component = renderer.create(<NotFound />);
+ let tree = component.toJSON();
+ expect(tree).toMatchSnapshot();
+});
diff --git a/web/cashtab-v2/src/components/__tests__/__snapshots__/NotFound.test.js.snap b/web/cashtab-v2/src/components/__tests__/__snapshots__/NotFound.test.js.snap
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/components/__tests__/__snapshots__/NotFound.test.js.snap
@@ -0,0 +1,18 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP @generated
+
+exports[`Render NotFound component 1`] = `
+<div
+ className="ant-row ant-row-center"
+ style={Object {}}
+ type="flex"
+>
+ <div
+ className="ant-col ant-col-8"
+ style={Object {}}
+ >
+ <h1>
+ Page not found
+ </h1>
+ </div>
+</div>
+`;
diff --git a/web/cashtab-v2/src/hooks/__mocks__/createToken.js b/web/cashtab-v2/src/hooks/__mocks__/createToken.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/__mocks__/createToken.js
@@ -0,0 +1,54 @@
+// @generated
+export default {
+ invalidWallet: {},
+ wallet: {
+ Path1899: {
+ cashAddress:
+ 'bitcoincash:qpuvjl7l3crt3apc62gmtf49pfsluu7s9gsex3qnhn',
+ slpAddress:
+ 'simpleledger:qpuvjl7l3crt3apc62gmtf49pfsluu7s9guzd24nfd',
+ fundingWif: 'L2gH81AegmBdnvEZuUpnd3robG8NjBaVjPddWrVD4169wS6Mqyxn',
+ fundingAddress:
+ 'simpleledger:qpuvjl7l3crt3apc62gmtf49pfsluu7s9guzd24nfd',
+ legacyAddress: '1C1fUT99KT4SjbKjCE2fSCdhc6Bvj5gQjG',
+ },
+ tokens: [],
+ state: {
+ balances: [],
+ utxos: [],
+ hydratedUtxoDetails: [],
+ tokens: [],
+ slpBalancesAndUtxos: {
+ nonSlpUtxos: [
+ {
+ height: 0,
+ tx_hash:
+ 'e0d6d7d46d5fc6aaa4512a7aca9223c6d7ca30b8253dee1b40b8978fe7dc501e',
+ tx_pos: 0,
+ value: 1000000,
+ txid: 'e0d6d7d46d5fc6aaa4512a7aca9223c6d7ca30b8253dee1b40b8978fe7dc501e',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qpuvjl7l3crt3apc62gmtf49pfsluu7s9gsex3qnhn',
+ wif: 'L2gH81AegmBdnvEZuUpnd3robG8NjBaVjPddWrVD4169wS6Mqyxn',
+ },
+ ],
+ },
+ },
+ },
+ configObj: {
+ name: 'Cashtab Unit Test Token',
+ ticker: 'CUTT',
+ documentUrl: 'https://cashtabapp.com/',
+ decimals: '2',
+ initialQty: '100',
+ documentHash: '',
+ mintBatonVout: null,
+ },
+ expectedTxId:
+ '5d3450458ada611c4171afbcd3acfa6d3b3885c30edd75a8812c147e6d410765',
+ expectedHex: [
+ '02000000011e50dce78f97b8401bee3d25b830cad7c62392ca7a2a51a4aac65f6dd4d7d6e0000000006a4730440220776cbcaaf918e1924f60ee650143de82d6ae02cd3def3897bf763f00ec7dacff02204b918ca0bce2c3c601bc3ebff7175889f28934405f06728451e48ad0d908a8e1412102322fe90c5255fe37ab321c386f9446a86e80c3940701d430f22325094fdcec60ffffffff030000000000000000546a04534c500001010747454e455349530443555454174361736874616220556e6974205465737420546f6b656e1768747470733a2f2f636173687461626170702e636f6d2f4c0001024c0008000000000000271022020000000000001976a91478c97fdf8e06b8f438d291b5a6a50a61fe73d02a88ac073b0f00000000001976a91478c97fdf8e06b8f438d291b5a6a50a61fe73d02a88ac00000000',
+ ],
+};
diff --git a/web/cashtab-v2/src/hooks/__mocks__/mockFlatTxHistory.js b/web/cashtab-v2/src/hooks/__mocks__/mockFlatTxHistory.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/__mocks__/mockFlatTxHistory.js
@@ -0,0 +1,52 @@
+export default [
+ {
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ height: 678992,
+ txid: '5072cf021e0301284cf1cc1eb67dcb73fe8eb1f2a4fc3f8f3944d232e3946551',
+ },
+ {
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ height: 678992,
+ txid: '82845d3c814d715b2c36aea0b076cc03815469a9c172c5bab7fc6a9f71b1906d',
+ },
+ {
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ height: 678616,
+ txid: '7abd604770d183ad33d3431c93b29b324b82cd11a6cf0671b4edb7d44d9b2a40',
+ },
+ {
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ height: 678000,
+ txid: '9897f172154bb8f27bbf4e0385926a535267f044cd11232a7efca91bece7dba6',
+ },
+ {
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ height: 677989,
+ txid: 'dee2ec72b0a22ceb99e67731de086a2545aaa9dc3fb4a8bdf9dddbae215d8f6c',
+ },
+ {
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ height: 677989,
+ txid: 'b854a48079e42612bed3b68cf62a90a021f20ae28e694dbe5dbfeb29ee8fea98',
+ },
+ {
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ height: 677989,
+ txid: '9520af2513b54b1c47a8a520251d26f057ccbe986cb569682aa963bab626ba52',
+ },
+ {
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ height: 677989,
+ txid: '72acfdb2cd6ab8cb44f07a6fd78ae4aa31c304ea3ff0206b50bef60ff953d94d',
+ },
+ {
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ height: 677752,
+ txid: '8d47af8e46afc3cd908ddedf7f330ee849004d2464d65bd3b225518e924c9477',
+ },
+ {
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ height: 674993,
+ txid: '089f2188d5771a7de0589def2b8d6c1a1f33f45b6de26d9a0ef32782f019ecf1',
+ },
+];
diff --git a/web/cashtab-v2/src/hooks/__mocks__/mockHydrateUtxosBatched.js b/web/cashtab-v2/src/hooks/__mocks__/mockHydrateUtxosBatched.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/__mocks__/mockHydrateUtxosBatched.js
@@ -0,0 +1,1612 @@
+// @generated
+
+export const flattenedHydrateUtxosResponse = {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 681187,
+ tx_hash:
+ '0d391574918bf5ecbb00fa0c48d2a88be80c4b86a421992309f28871186b40fe',
+ tx_pos: 0,
+ value: 1000,
+ txid: '0d391574918bf5ecbb00fa0c48d2a88be80c4b86a421992309f28871186b40fe',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '09eb70948f37e22eda0e425daed577cbb665794fea8b69da558700aabf95d9ab',
+ tx_pos: 0,
+ value: 2000,
+ txid: '09eb70948f37e22eda0e425daed577cbb665794fea8b69da558700aabf95d9ab',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '0bdfe5a8eae0b00ad18d4fe2dba0ec20e661a8739348163bef484a90e049fa17',
+ tx_pos: 0,
+ value: 9000,
+ txid: '0bdfe5a8eae0b00ad18d4fe2dba0ec20e661a8739348163bef484a90e049fa17',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '12db7f983196388991f901bb76da6f00cbb7ce8261d5a3194ea34bc4ee03b218',
+ tx_pos: 0,
+ value: 11000,
+ txid: '12db7f983196388991f901bb76da6f00cbb7ce8261d5a3194ea34bc4ee03b218',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '31ad22a45f2510044407df031f97816006295d0a4f1e424a38835865010a107b',
+ tx_pos: 0,
+ value: 7000,
+ txid: '31ad22a45f2510044407df031f97816006295d0a4f1e424a38835865010a107b',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '5b74e05ced6b7d862fe9cab94071b2ccfa475c0cef94b90c7edb8a06f90e5ad6',
+ tx_pos: 1,
+ value: 546,
+ txid: '5b74e05ced6b7d862fe9cab94071b2ccfa475c0cef94b90c7edb8a06f90e5ad6',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '1e-7',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '76c473666913b517a34c25a00a06e8da128267b832a8be900db59cbe3de36b77',
+ tx_pos: 0,
+ value: 12000,
+ txid: '76c473666913b517a34c25a00a06e8da128267b832a8be900db59cbe3de36b77',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '9d5399046bf89de7d1d1f725066d1c9a9eb26877d622f0236b5bd0b59dbc55c9',
+ tx_pos: 0,
+ value: 8000,
+ txid: '9d5399046bf89de7d1d1f725066d1c9a9eb26877d622f0236b5bd0b59dbc55c9',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'a6347e8b522835ef1592996b668a87290f44cc26eec7f41a20f7b3a2f1e7ae31',
+ tx_pos: 0,
+ value: 10000,
+ txid: 'a6347e8b522835ef1592996b668a87290f44cc26eec7f41a20f7b3a2f1e7ae31',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'cc3f8684f9fbeffa8e9142c3c29c411d267a20bc758e0230f3ac60082b1409c4',
+ tx_pos: 0,
+ value: 3000,
+ txid: 'cc3f8684f9fbeffa8e9142c3c29c411d267a20bc758e0230f3ac60082b1409c4',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ utxos: [
+ {
+ height: 681188,
+ tx_hash:
+ 'd491dc4ae9959bd6e95ad733eec1f97977b7d7fe400e83a47277a337d4e2ea43',
+ tx_pos: 0,
+ value: 6000,
+ txid: 'd491dc4ae9959bd6e95ad733eec1f97977b7d7fe400e83a47277a337d4e2ea43',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'd736a55663aa176581b6484e0d3b499cbf7ad1a57e6fc9ac547cec67b41fd0ba',
+ tx_pos: 0,
+ value: 4000,
+ txid: 'd736a55663aa176581b6484e0d3b499cbf7ad1a57e6fc9ac547cec67b41fd0ba',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'e7a70afaf07ca689066ed36facc7c86b0e24da2d4c5fa6f5e1fd1806f5a39ec2',
+ tx_pos: 0,
+ value: 5000,
+ txid: 'e7a70afaf07ca689066ed36facc7c86b0e24da2d4c5fa6f5e1fd1806f5a39ec2',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '0aacdb7d85c466a7d6d4edf127883da40b05617d9c4ff7493bde3c973f22231d',
+ tx_pos: 1,
+ value: 546,
+ txid: '0aacdb7d85c466a7d6d4edf127883da40b05617d9c4ff7493bde3c973f22231d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '10',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '2cc8f480e9adfb74aff7351bdbbf12ed8972e35fb8bd0f43b9ea5e4aeaec5693',
+ tx_pos: 1,
+ value: 546,
+ txid: '2cc8f480e9adfb74aff7351bdbbf12ed8972e35fb8bd0f43b9ea5e4aeaec5693',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '6',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '36bdf8461dbc19ff46681e9bcb6d5312c8d276ef17779ff8016d647594c39991',
+ tx_pos: 1,
+ value: 546,
+ txid: '36bdf8461dbc19ff46681e9bcb6d5312c8d276ef17779ff8016d647594c39991',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '4',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '6b1476b65d3e29248c3809e18add16cddfee9e1d9a7060df97b35e517e8b7131',
+ tx_pos: 1,
+ value: 546,
+ txid: '6b1476b65d3e29248c3809e18add16cddfee9e1d9a7060df97b35e517e8b7131',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '7',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '986dc9f9cc91e9976f2a8470805ab3b6bccfd4eaf224cdfa35bb62294bd8aac3',
+ tx_pos: 1,
+ value: 546,
+ txid: '986dc9f9cc91e9976f2a8470805ab3b6bccfd4eaf224cdfa35bb62294bd8aac3',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'c4ef58f111ae86c7e1a9be4d5b553de6f6061b4bdca130d360c4e18476679ad7',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c4ef58f111ae86c7e1a9be4d5b553de6f6061b4bdca130d360c4e18476679ad7',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'c551e9ea96ce844bb1aaee65c99a312bb5fa66f8f822ab45dec63c7c3b77bbe5',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c551e9ea96ce844bb1aaee65c99a312bb5fa66f8f822ab45dec63c7c3b77bbe5',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '5',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ utxos: [
+ {
+ height: 681189,
+ tx_hash:
+ 'da2af7958ab41e892c63d6a68be0cb4a0fd3315f2d5d5d7c51f92891187b9f1f',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da2af7958ab41e892c63d6a68be0cb4a0fd3315f2d5d5d7c51f92891187b9f1f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '3',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'e69c1b507f7ca3dfac790e26fbd132085cf1796648563a5facfe3c82a6401e6c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e69c1b507f7ca3dfac790e26fbd132085cf1796648563a5facfe3c82a6401e6c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '8',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '11',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'f3a106c523a1af4c3d68d3c82a015f3d7c890f590b410bde535b5ad392c447a4',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f3a106c523a1af4c3d68d3c82a015f3d7c890f590b410bde535b5ad392c447a4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ '52fe0ccf7b5936095bbdadebc0de9f844a99457096ca4f7b45543a2badefdf35',
+ tx_pos: 1,
+ value: 546,
+ txid: '52fe0ccf7b5936095bbdadebc0de9f844a99457096ca4f7b45543a2badefdf35',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '4',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'aa50baef76708fee1f19bd098c0d7407b64b280afd76a450067a89ab2bddd3e8',
+ tx_pos: 1,
+ value: 546,
+ txid: 'aa50baef76708fee1f19bd098c0d7407b64b280afd76a450067a89ab2bddd3e8',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'bfc175d1933aed136d7bd887481144ec42112c34e7889cf3f21013409e233e3d',
+ tx_pos: 1,
+ value: 546,
+ txid: 'bfc175d1933aed136d7bd887481144ec42112c34e7889cf3f21013409e233e3d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '3',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'c2d2e57203f5d66c3bddd3f4fd5ccb053006588bfa0fec76bdbbfd2169984e9c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c2d2e57203f5d66c3bddd3f4fd5ccb053006588bfa0fec76bdbbfd2169984e9c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ tx_pos: 1,
+ value: 546,
+ txid: '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '5',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ utxos: [
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 1,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '1e-8',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'f6ef57f697219aaa576bf43d69a7f8b8753dcbcbb502f602259a7d14fafd52c5',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f6ef57f697219aaa576bf43d69a7f8b8753dcbcbb502f602259a7d14fafd52c5',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681192,
+ tx_hash:
+ '43a925c679debac91183b0ccd08780cc94dc58d79cdb506df92ed5963c6bbb34',
+ tx_pos: 1,
+ value: 546,
+ txid: '43a925c679debac91183b0ccd08780cc94dc58d79cdb506df92ed5963c6bbb34',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '2e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681192,
+ tx_hash:
+ '880baf5691c2b4c5a22ae4032e2004c0c54bfabf003468044a2e341846137136',
+ tx_pos: 1,
+ value: 546,
+ txid: '880baf5691c2b4c5a22ae4032e2004c0c54bfabf003468044a2e341846137136',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '3e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681192,
+ tx_hash:
+ 'b7f8b23f5ce12842eb655239919b6142052a2fa2b2ce974a4baac36b0137f332',
+ tx_pos: 1,
+ value: 546,
+ txid: 'b7f8b23f5ce12842eb655239919b6142052a2fa2b2ce974a4baac36b0137f332',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '4e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681192,
+ tx_hash:
+ 'f27ff24c15b01c30d44218c6dc8706fd33cc7bc9b4b38399075f0f41d8e412af',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f27ff24c15b01c30d44218c6dc8706fd33cc7bc9b4b38399075f0f41d8e412af',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '5e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+};
+
+export const legacyHydrateUtxosResponse = {
+ slpUtxos: [
+ {
+ utxos: [],
+ address: 'bitcoincash:qzqpcnas8wpxzgvg52lcs34fxrfnv4xwwvc8vkd3v4',
+ },
+ {
+ utxos: [],
+ address: 'bitcoincash:qpg4sucvkh0gy3fv3yd8fqj7grg6gxwyus753nq8c7',
+ },
+ {
+ utxos: [
+ {
+ height: 681187,
+ tx_hash:
+ '0d391574918bf5ecbb00fa0c48d2a88be80c4b86a421992309f28871186b40fe',
+ tx_pos: 0,
+ value: 1000,
+ txid: '0d391574918bf5ecbb00fa0c48d2a88be80c4b86a421992309f28871186b40fe',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '09eb70948f37e22eda0e425daed577cbb665794fea8b69da558700aabf95d9ab',
+ tx_pos: 0,
+ value: 2000,
+ txid: '09eb70948f37e22eda0e425daed577cbb665794fea8b69da558700aabf95d9ab',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '0bdfe5a8eae0b00ad18d4fe2dba0ec20e661a8739348163bef484a90e049fa17',
+ tx_pos: 0,
+ value: 9000,
+ txid: '0bdfe5a8eae0b00ad18d4fe2dba0ec20e661a8739348163bef484a90e049fa17',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '12db7f983196388991f901bb76da6f00cbb7ce8261d5a3194ea34bc4ee03b218',
+ tx_pos: 0,
+ value: 11000,
+ txid: '12db7f983196388991f901bb76da6f00cbb7ce8261d5a3194ea34bc4ee03b218',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '31ad22a45f2510044407df031f97816006295d0a4f1e424a38835865010a107b',
+ tx_pos: 0,
+ value: 7000,
+ txid: '31ad22a45f2510044407df031f97816006295d0a4f1e424a38835865010a107b',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '5b74e05ced6b7d862fe9cab94071b2ccfa475c0cef94b90c7edb8a06f90e5ad6',
+ tx_pos: 1,
+ value: 546,
+ txid: '5b74e05ced6b7d862fe9cab94071b2ccfa475c0cef94b90c7edb8a06f90e5ad6',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '1e-7',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '76c473666913b517a34c25a00a06e8da128267b832a8be900db59cbe3de36b77',
+ tx_pos: 0,
+ value: 12000,
+ txid: '76c473666913b517a34c25a00a06e8da128267b832a8be900db59cbe3de36b77',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '9d5399046bf89de7d1d1f725066d1c9a9eb26877d622f0236b5bd0b59dbc55c9',
+ tx_pos: 0,
+ value: 8000,
+ txid: '9d5399046bf89de7d1d1f725066d1c9a9eb26877d622f0236b5bd0b59dbc55c9',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'a6347e8b522835ef1592996b668a87290f44cc26eec7f41a20f7b3a2f1e7ae31',
+ tx_pos: 0,
+ value: 10000,
+ txid: 'a6347e8b522835ef1592996b668a87290f44cc26eec7f41a20f7b3a2f1e7ae31',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'cc3f8684f9fbeffa8e9142c3c29c411d267a20bc758e0230f3ac60082b1409c4',
+ tx_pos: 0,
+ value: 3000,
+ txid: 'cc3f8684f9fbeffa8e9142c3c29c411d267a20bc758e0230f3ac60082b1409c4',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'd491dc4ae9959bd6e95ad733eec1f97977b7d7fe400e83a47277a337d4e2ea43',
+ tx_pos: 0,
+ value: 6000,
+ txid: 'd491dc4ae9959bd6e95ad733eec1f97977b7d7fe400e83a47277a337d4e2ea43',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'd736a55663aa176581b6484e0d3b499cbf7ad1a57e6fc9ac547cec67b41fd0ba',
+ tx_pos: 0,
+ value: 4000,
+ txid: 'd736a55663aa176581b6484e0d3b499cbf7ad1a57e6fc9ac547cec67b41fd0ba',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'e7a70afaf07ca689066ed36facc7c86b0e24da2d4c5fa6f5e1fd1806f5a39ec2',
+ tx_pos: 0,
+ value: 5000,
+ txid: 'e7a70afaf07ca689066ed36facc7c86b0e24da2d4c5fa6f5e1fd1806f5a39ec2',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '0aacdb7d85c466a7d6d4edf127883da40b05617d9c4ff7493bde3c973f22231d',
+ tx_pos: 1,
+ value: 546,
+ txid: '0aacdb7d85c466a7d6d4edf127883da40b05617d9c4ff7493bde3c973f22231d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '10',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '2cc8f480e9adfb74aff7351bdbbf12ed8972e35fb8bd0f43b9ea5e4aeaec5693',
+ tx_pos: 1,
+ value: 546,
+ txid: '2cc8f480e9adfb74aff7351bdbbf12ed8972e35fb8bd0f43b9ea5e4aeaec5693',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '6',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '36bdf8461dbc19ff46681e9bcb6d5312c8d276ef17779ff8016d647594c39991',
+ tx_pos: 1,
+ value: 546,
+ txid: '36bdf8461dbc19ff46681e9bcb6d5312c8d276ef17779ff8016d647594c39991',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '4',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '6b1476b65d3e29248c3809e18add16cddfee9e1d9a7060df97b35e517e8b7131',
+ tx_pos: 1,
+ value: 546,
+ txid: '6b1476b65d3e29248c3809e18add16cddfee9e1d9a7060df97b35e517e8b7131',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '7',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '986dc9f9cc91e9976f2a8470805ab3b6bccfd4eaf224cdfa35bb62294bd8aac3',
+ tx_pos: 1,
+ value: 546,
+ txid: '986dc9f9cc91e9976f2a8470805ab3b6bccfd4eaf224cdfa35bb62294bd8aac3',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'c4ef58f111ae86c7e1a9be4d5b553de6f6061b4bdca130d360c4e18476679ad7',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c4ef58f111ae86c7e1a9be4d5b553de6f6061b4bdca130d360c4e18476679ad7',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'c551e9ea96ce844bb1aaee65c99a312bb5fa66f8f822ab45dec63c7c3b77bbe5',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c551e9ea96ce844bb1aaee65c99a312bb5fa66f8f822ab45dec63c7c3b77bbe5',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '5',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'da2af7958ab41e892c63d6a68be0cb4a0fd3315f2d5d5d7c51f92891187b9f1f',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da2af7958ab41e892c63d6a68be0cb4a0fd3315f2d5d5d7c51f92891187b9f1f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '3',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'e69c1b507f7ca3dfac790e26fbd132085cf1796648563a5facfe3c82a6401e6c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e69c1b507f7ca3dfac790e26fbd132085cf1796648563a5facfe3c82a6401e6c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '8',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '11',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'f3a106c523a1af4c3d68d3c82a015f3d7c890f590b410bde535b5ad392c447a4',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f3a106c523a1af4c3d68d3c82a015f3d7c890f590b410bde535b5ad392c447a4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ '52fe0ccf7b5936095bbdadebc0de9f844a99457096ca4f7b45543a2badefdf35',
+ tx_pos: 1,
+ value: 546,
+ txid: '52fe0ccf7b5936095bbdadebc0de9f844a99457096ca4f7b45543a2badefdf35',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '4',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'aa50baef76708fee1f19bd098c0d7407b64b280afd76a450067a89ab2bddd3e8',
+ tx_pos: 1,
+ value: 546,
+ txid: 'aa50baef76708fee1f19bd098c0d7407b64b280afd76a450067a89ab2bddd3e8',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'bfc175d1933aed136d7bd887481144ec42112c34e7889cf3f21013409e233e3d',
+ tx_pos: 1,
+ value: 546,
+ txid: 'bfc175d1933aed136d7bd887481144ec42112c34e7889cf3f21013409e233e3d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '3',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'c2d2e57203f5d66c3bddd3f4fd5ccb053006588bfa0fec76bdbbfd2169984e9c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c2d2e57203f5d66c3bddd3f4fd5ccb053006588bfa0fec76bdbbfd2169984e9c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ tx_pos: 1,
+ value: 546,
+ txid: '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '5',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 1,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '1e-8',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'f6ef57f697219aaa576bf43d69a7f8b8753dcbcbb502f602259a7d14fafd52c5',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f6ef57f697219aaa576bf43d69a7f8b8753dcbcbb502f602259a7d14fafd52c5',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681192,
+ tx_hash:
+ '43a925c679debac91183b0ccd08780cc94dc58d79cdb506df92ed5963c6bbb34',
+ tx_pos: 1,
+ value: 546,
+ txid: '43a925c679debac91183b0ccd08780cc94dc58d79cdb506df92ed5963c6bbb34',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '2e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681192,
+ tx_hash:
+ '880baf5691c2b4c5a22ae4032e2004c0c54bfabf003468044a2e341846137136',
+ tx_pos: 1,
+ value: 546,
+ txid: '880baf5691c2b4c5a22ae4032e2004c0c54bfabf003468044a2e341846137136',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '3e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681192,
+ tx_hash:
+ 'b7f8b23f5ce12842eb655239919b6142052a2fa2b2ce974a4baac36b0137f332',
+ tx_pos: 1,
+ value: 546,
+ txid: 'b7f8b23f5ce12842eb655239919b6142052a2fa2b2ce974a4baac36b0137f332',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '4e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681192,
+ tx_hash:
+ 'f27ff24c15b01c30d44218c6dc8706fd33cc7bc9b4b38399075f0f41d8e412af',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f27ff24c15b01c30d44218c6dc8706fd33cc7bc9b4b38399075f0f41d8e412af',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '5e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+};
diff --git a/web/cashtab-v2/src/hooks/__mocks__/mockLegacyWallets.js b/web/cashtab-v2/src/hooks/__mocks__/mockLegacyWallets.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/__mocks__/mockLegacyWallets.js
@@ -0,0 +1,127 @@
+export default {
+ legacyAlphaMainnet: {
+ mnemonic:
+ 'apart vacuum color cream drama kind foil history hurt alone ask census',
+ name: 'MigrationTestAlpha on Mainnet',
+ Path245: {
+ cashAddress:
+ 'bitcoincash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy54hkry298',
+ slpAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ fundingWif: 'KwgNkyijAaxFr5XQdnaYyNMXVSZobgHzSoKKfWiC3Q7Xr4n7iYMG',
+ fundingAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ legacyAddress: '1EgPUfBgU7ekho3EjtGze87dRADnUE8ojP',
+ },
+ Path145: {
+ cashAddress:
+ 'bitcoincash:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9v0lgx569z',
+ slpAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ fundingWif: 'L2xvTe6CdNxroR6pbdpGWNjAa55AZX5Wm59W5TXMuH31ihNJdDjt',
+ fundingAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ legacyAddress: '1511T3ynXKgCwXhFijCUWKuTfqbPxFV1AF',
+ },
+ },
+
+ migratedLegacyAlphaMainnet: {
+ mnemonic:
+ 'apart vacuum color cream drama kind foil history hurt alone ask census',
+ name: 'MigrationTestAlpha on Mainnet',
+ Path245: {
+ cashAddress:
+ 'bitcoincash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy54hkry298',
+ slpAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ fundingWif: 'KwgNkyijAaxFr5XQdnaYyNMXVSZobgHzSoKKfWiC3Q7Xr4n7iYMG',
+ fundingAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ legacyAddress: '1EgPUfBgU7ekho3EjtGze87dRADnUE8ojP',
+ publicKey:
+ '03c4a69fd90c8b196683216cffd2943a7b13b0db0812e44a4ff156ac7e03fc4ed7',
+ },
+ Path145: {
+ cashAddress:
+ 'bitcoincash:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9v0lgx569z',
+ slpAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ fundingWif: 'L2xvTe6CdNxroR6pbdpGWNjAa55AZX5Wm59W5TXMuH31ihNJdDjt',
+ fundingAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ legacyAddress: '1511T3ynXKgCwXhFijCUWKuTfqbPxFV1AF',
+ publicKey:
+ '02fe5308d77bcce825068a9e46adc6f032dbbe39167a7b6d05ac563ac71d8b186e',
+ },
+ Path1899: {
+ cashAddress:
+ 'bitcoincash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cptzgcqy6',
+ slpAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ fundingWif: 'Kx4FiBMvKK1iXjFk5QTaAK6E4mDGPjmwDZ2HDKGUZpE4gCXMaPe9',
+ fundingAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ legacyAddress: '1J1Aq5tAAYxZgSDRo8soKM2Rb41z3xrYpm',
+ publicKey:
+ '02a06bb380cf180d703f6f80796a13555aefff817d1f6f842f1e5c555b15f0fa70',
+ },
+ },
+
+ legacyAlphaTestnet: {
+ mnemonic:
+ 'apart vacuum color cream drama kind foil history hurt alone ask census',
+ name: 'MigrationTestAlpha on Testnet',
+ Path245: {
+ cashAddress: 'bchtest:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy539jyxazm',
+ fundingAddress:
+ 'slptest:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5234lu2sx',
+ fundingWif: 'cN3NDtiabeeX1Wzg2CPgLgrb7fsDG8PgWqTnmwAhYWmY6osSta7Q',
+ legacyAddress: 'muCLmiGfH961UuWrTTFNU3KxH9pVQJJx6Z',
+ slpAddress: 'slptest:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5234lu2sx',
+ },
+ Path145: {
+ cashAddress: 'bchtest:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vtdvpkdz7',
+ fundingAddress:
+ 'slptest:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vset6v6sr',
+ fundingWif: 'cTKuvZ644Sf7xra5z3dPshEECJNaDyBCq7HyBsysQPh1ySSpxtQ1',
+ legacyAddress: 'mjWxk74mLM7TieAsSJArLF7nXqC6oc2mof',
+ slpAddress: 'slptest:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vset6v6sr',
+ },
+ },
+
+ migratedLegacyAlphaTestnet: {
+ mnemonic:
+ 'apart vacuum color cream drama kind foil history hurt alone ask census',
+ name: 'MigrationTestAlpha on Testnet',
+ Path245: {
+ cashAddress: 'bchtest:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy539jyxazm',
+ fundingAddress:
+ 'slptest:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5234lu2sx',
+ fundingWif: 'cN3NDtiabeeX1Wzg2CPgLgrb7fsDG8PgWqTnmwAhYWmY6osSta7Q',
+ legacyAddress: 'muCLmiGfH961UuWrTTFNU3KxH9pVQJJx6Z',
+ slpAddress: 'slptest:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5234lu2sx',
+ publicKey:
+ '03c4a69fd90c8b196683216cffd2943a7b13b0db0812e44a4ff156ac7e03fc4ed7',
+ },
+ Path145: {
+ cashAddress: 'bchtest:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vtdvpkdz7',
+ fundingAddress:
+ 'slptest:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vset6v6sr',
+ fundingWif: 'cTKuvZ644Sf7xra5z3dPshEECJNaDyBCq7HyBsysQPh1ySSpxtQ1',
+ legacyAddress: 'mjWxk74mLM7TieAsSJArLF7nXqC6oc2mof',
+ slpAddress: 'slptest:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vset6v6sr',
+ publicKey:
+ '02fe5308d77bcce825068a9e46adc6f032dbbe39167a7b6d05ac563ac71d8b186e',
+ },
+ Path1899: {
+ cashAddress: 'bchtest:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7c9ex06hrx',
+ fundingAddress:
+ 'slptest:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7c7dp5qq3m',
+ fundingWif: 'cNRFB6MmkNhyhAj1TpGhXdbHgzWg4BsdHbAkKjiz4vt4vwgpC44F',
+ legacyAddress: 'mxX888y8yaPpTYh3WhrB9GEkT3cgumYwPw',
+ slpAddress: 'slptest:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7c7dp5qq3m',
+ publicKey:
+ '02a06bb380cf180d703f6f80796a13555aefff817d1f6f842f1e5c555b15f0fa70',
+ },
+ },
+};
diff --git a/web/cashtab-v2/src/hooks/__mocks__/mockParseTokenInfoForTxHistory.js b/web/cashtab-v2/src/hooks/__mocks__/mockParseTokenInfoForTxHistory.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/__mocks__/mockParseTokenInfoForTxHistory.js
@@ -0,0 +1,253 @@
+// @generated
+
+export const tokenSendWdt = {
+ txid: 'b923fba5b011df438c96f7f8f715fcf2b9ac2f96ea73139885e00aee4361f98f',
+ parsedTx: {
+ txid: 'b923fba5b011df438c96f7f8f715fcf2b9ac2f96ea73139885e00aee4361f98f',
+ confirmations: 15,
+ height: 679246,
+ blocktime: 1616790444,
+ amountSent: 4.94409725,
+ amountReceived: 0,
+ tokenTx: true,
+ outgoingTx: true,
+ destinationAddress:
+ 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+ tokenInfo: {
+ versionType: 1,
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenTicker: 'WDT',
+ transactionType: 'SEND',
+ tokenIdHex:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ sendOutputs: ['0', '22200000000', '47658742120385570'],
+ sendInputsFull: [
+ {
+ address:
+ 'simpleledger:qpmytrdsakt0axrrlswvaj069nat3p9s7c8w5tu8gm',
+ },
+ {
+ address:
+ 'simpleledger:qpv9fx6mjdpgltygudnpw3tvmxdyzx7savm6ushssz',
+ },
+ {
+ address:
+ 'simpleledger:qpmytrdsakt0axrrlswvaj069nat3p9s7c8w5tu8gm',
+ },
+ {
+ address:
+ 'simpleledger:qpmytrdsakt0axrrlswvaj069nat3p9s7c8w5tu8gm',
+ },
+ {
+ address:
+ 'simpleledger:qpmytrdsakt0axrrlswvaj069nat3p9s7c8w5tu8gm',
+ },
+ {
+ address:
+ 'simpleledger:qpmytrdsakt0axrrlswvaj069nat3p9s7c8w5tu8gm',
+ },
+ ],
+ sendOutputsFull: [
+ {
+ address:
+ 'simpleledger:qq7h7thq7seggqawtnlus5f2k62m7l07vucv9ux0ss',
+ amount: '222',
+ },
+ {
+ address:
+ 'simpleledger:qpmytrdsakt0axrrlswvaj069nat3p9s7c8w5tu8gm',
+ amount: '476587421.2038557',
+ },
+ ],
+ },
+ cashtabTokenInfo: {
+ qtyReceived: '0',
+ qtySent: '222',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenTicker: 'WDT',
+ transactionType: 'SEND',
+ },
+};
+
+export const tokenReceiveGarmonbozia = {
+ txid: '9f2413e5e290015ef573596187115205579d583f4a1b2f0eb5db5383875b9ede',
+ parsedTx: {
+ txid: '9f2413e5e290015ef573596187115205579d583f4a1b2f0eb5db5383875b9ede',
+ confirmations: 22,
+ height: 701191,
+ blocktime: 1629743058,
+ amountSent: 0,
+ amountReceived: 0.00000546,
+ tokenTx: true,
+ outgoingTx: false,
+ destinationAddress:
+ 'bitcoincash:qr204yfphngxthvnukyrz45u7500tf60vyea48xwmd',
+ },
+ tokenInfo: {
+ versionType: 1,
+ tokenName: 'Garmonbozia',
+ tokenTicker: 'XGB',
+ transactionType: 'SEND',
+ tokenIdHex:
+ 'ccf5fe5a387559c8ab9efdeb0c0ef1b444e677298cfddf07671245ce3cb3c79f',
+ sendOutputs: ['0', '500000000', '4500000000'],
+ sendInputsFull: [
+ {
+ address:
+ 'simpleledger:qq6fht0gmsk9wemyx26juzn3hjyd35e2kyrk85vaj5',
+ },
+ {
+ address:
+ 'simpleledger:qq6fht0gmsk9wemyx26juzn3hjyd35e2kyrk85vaj5',
+ },
+ ],
+ sendOutputsFull: [
+ {
+ address:
+ 'simpleledger:qr204yfphngxthvnukyrz45u7500tf60vy4x7unw9n',
+ amount: '5',
+ },
+ {
+ address:
+ 'simpleledger:qrpweesyra08ks4k08af0ak7y8d2a4uvzcewgwgfqg',
+ amount: '45',
+ },
+ ],
+ },
+ cashtabTokenInfo: {
+ qtyReceived: '5',
+ qtySent: '0',
+ tokenId:
+ 'ccf5fe5a387559c8ab9efdeb0c0ef1b444e677298cfddf07671245ce3cb3c79f',
+ tokenName: 'Garmonbozia',
+ tokenTicker: 'XGB',
+ transactionType: 'SEND',
+ },
+};
+
+export const tokenSendHonk = {
+ txid: '82845d3c814d715b2c36aea0b076cc03815469a9c172c5bab7fc6a9f71b1906d',
+ parsedTx: '',
+ tokenInfo: {},
+ cashtabTokenInfo: '',
+};
+export const tokenReceiveTBS = {
+ txid: '82845d3c814d715b2c36aea0b076cc03815469a9c172c5bab7fc6a9f71b1906d',
+ parsedTx: {
+ txid: '82845d3c814d715b2c36aea0b076cc03815469a9c172c5bab7fc6a9f71b1906d',
+ confirmations: 269,
+ height: 678992,
+ blocktime: 1616610925,
+ amountSent: 0,
+ amountReceived: 0.00000546,
+ tokenTx: true,
+ outgoingTx: false,
+ destinationAddress:
+ 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+ tokenInfo: {
+ versionType: 1,
+ tokenName: 'Cash Tab Points',
+ tokenTicker: 'CTP',
+ transactionType: 'SEND',
+ tokenIdHex:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ sendOutputs: ['0', '112345678.9', '30887654321.100002'],
+ sendInputsFull: [
+ {
+ address:
+ 'simpleledger:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavs27peqxp',
+ },
+ {
+ address:
+ 'simpleledger:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavs27peqxp',
+ },
+ {
+ address:
+ 'simpleledger:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavs27peqxp',
+ },
+ ],
+ sendOutputsFull: [
+ {
+ address:
+ 'simpleledger:qpmytrdsakt0axrrlswvaj069nat3p9s7c8w5tu8gm',
+ amount: '1.123456789',
+ },
+ {
+ address:
+ 'simpleledger:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavs27peqxp',
+ amount: '308.876543211',
+ },
+ ],
+ },
+ cashtabTokenInfo: {
+ qtySent: '0',
+ qtyReceived: '1.123456789',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenName: 'Cash Tab Points',
+ tokenTicker: 'CTP',
+ transactionType: 'SEND',
+ },
+};
+
+export const tokenGenesisCashtabMintAlpha = {
+ txid: '45f0ff5cae7e89da6b96c26c8c48a959214c5f0e983e78d0925f8956ca8848c6',
+ parsedTx: {
+ txid: '45f0ff5cae7e89da6b96c26c8c48a959214c5f0e983e78d0925f8956ca8848c6',
+ confirmations: 11,
+ height: 685170,
+ blocktime: 1620250206,
+ amountSent: 0,
+ amountReceived: 0,
+ tokenTx: true,
+ outgoingTx: true,
+ destinationAddress:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ tokenInfo: {
+ qtySent: '0',
+ qtyReceived: '55.55555',
+ tokenId:
+ '45f0ff5cae7e89da6b96c26c8c48a959214c5f0e983e78d0925f8956ca8848c6',
+ tokenName: 'CashtabMintAlpha',
+ tokenTicker: 'CMA',
+ transactionType: 'GENESIS',
+ },
+ },
+ tokenInfo: {
+ versionType: 1,
+ tokenName: 'CashtabMintAlpha',
+ tokenTicker: 'CMA',
+ transactionType: 'GENESIS',
+ tokenIdHex:
+ '45f0ff5cae7e89da6b96c26c8c48a959214c5f0e983e78d0925f8956ca8848c6',
+ sendOutputs: ['0', '5555555000'],
+ sendInputsFull: [
+ {
+ address:
+ 'simpleledger:qz2708636snqhsxu8wnlka78h6fdp77ar5syue64fa',
+ },
+ ],
+ sendOutputsFull: [
+ {
+ address:
+ 'simpleledger:qz2708636snqhsxu8wnlka78h6fdp77ar5syue64fa',
+ amount: '55.55555',
+ },
+ ],
+ },
+ cashtabTokenInfo: {
+ qtyReceived: '55.55555',
+ qtySent: '0',
+ tokenId:
+ '45f0ff5cae7e89da6b96c26c8c48a959214c5f0e983e78d0925f8956ca8848c6',
+ tokenName: 'CashtabMintAlpha',
+ tokenTicker: 'CMA',
+ transactionType: 'GENESIS',
+ },
+};
diff --git a/web/cashtab-v2/src/hooks/__mocks__/mockParsedTxs.js b/web/cashtab-v2/src/hooks/__mocks__/mockParsedTxs.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/__mocks__/mockParsedTxs.js
@@ -0,0 +1,133 @@
+// Expected result of applying parseTxData to mockTxDataWityhPassthrough[0]
+export const mockSentCashTx = [
+ {
+ amountReceived: 0,
+ amountSent: 0.000042,
+ blocktime: 1614380741,
+ confirmations: 2721,
+ destinationAddress:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ height: 674993,
+ outgoingTx: true,
+ isCashtabMessage: false,
+ isEncryptedMessage: false,
+ opReturnMessage: '',
+ replyAddress: null,
+ tokenTx: false,
+ decryptionSuccess: false,
+ txid: '089f2188d5771a7de0589def2b8d6c1a1f33f45b6de26d9a0ef32782f019ecf1',
+ },
+];
+
+export const mockReceivedCashTx = [
+ {
+ amountReceived: 3,
+ amountSent: 0,
+ blocktime: 1612567121,
+ confirmations: 5637,
+ destinationAddress:
+ 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ height: 672077,
+ outgoingTx: false,
+ isCashtabMessage: false,
+ isEncryptedMessage: false,
+ opReturnMessage: '',
+ replyAddress: null,
+ tokenTx: false,
+ decryptionSuccess: false,
+ txid: '42d39fbe068a40fe691f987b22fdf04b80f94d71d2fec20a58125e7b1a06d2a9',
+ },
+];
+
+export const mockSentTokenTx = [
+ {
+ amountReceived: 0,
+ amountSent: 0.00000546,
+ blocktime: 1614027278,
+ confirmations: 3270,
+ destinationAddress:
+ 'bitcoincash:qzj5zu6fgg8v2we82gh76xnrk9njcregluzgaztm45',
+ height: 674444,
+ outgoingTx: true,
+ isCashtabMessage: false,
+ isEncryptedMessage: false,
+ opReturnMessage: '',
+ replyAddress: null,
+ tokenTx: true,
+ decryptionSuccess: false,
+ txid: 'ffe3a7500dbcc98021ad581c98d9947054d1950a7f3416664715066d3d20ad72',
+ },
+];
+export const mockReceivedTokenTx = [
+ {
+ amountReceived: 0.00000546,
+ amountSent: 0,
+ blocktime: 1613859311,
+ confirmations: 3571,
+ destinationAddress:
+ 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ height: 674143,
+ outgoingTx: false,
+ isCashtabMessage: false,
+ isEncryptedMessage: false,
+ opReturnMessage: '',
+ replyAddress: null,
+ tokenTx: true,
+ decryptionSuccess: false,
+ txid: '618d0dd8c0c5fa5a34c6515c865dd72bb76f8311cd6ee9aef153bab20dabc0e6',
+ },
+];
+export const mockSentOpReturnMessageTx = [
+ {
+ amountReceived: 0,
+ amountSent: 0,
+ blocktime: 1635507345,
+ confirmations: 59,
+ destinationAddress: undefined,
+ height: undefined,
+ opReturnMessage: 'bingoelectrum',
+ replyAddress: null,
+ outgoingTx: false,
+ tokenTx: false,
+ isCashtabMessage: false,
+ isEncryptedMessage: false,
+ decryptionSuccess: false,
+ txid: 'dd35690b0cefd24dcc08acba8694ecd49293f365a81372cb66c8f1c1291d97c5',
+ },
+];
+export const mockReceivedOpReturnMessageTx = [
+ {
+ amountReceived: 0,
+ amountSent: 0,
+ blocktime: 1635511136,
+ confirmations: 70,
+ destinationAddress: undefined,
+ height: undefined,
+ opReturnMessage: 'cashtabular',
+ replyAddress: 'ecash:qrxkkzsmrxcjmz8x90fx2uztt83cuu0u254w09pq5p',
+ outgoingTx: false,
+ tokenTx: false,
+ isCashtabMessage: true,
+ isEncryptedMessage: false,
+ decryptionSuccess: false,
+ txid: '5adc33b5c0509b31c6da359177b19467c443bdc4dd37c283c0f87244c0ad63af',
+ },
+];
+export const mockBurnEtokenTx = [
+ {
+ amountReceived: 0,
+ amountSent: 0,
+ blocktime: 1643286535,
+ confirmations: 3,
+ destinationAddress: undefined,
+ decryptionSuccess: false,
+ height: undefined,
+ isCashtabMessage: false,
+ isEncryptedMessage: false,
+ opReturnMessage: '',
+ outgoingTx: false,
+ replyAddress: null,
+ tokenTx: true,
+ txid: '8b569d64a7e51d1d3cf1cf2b99d8b34451bbebc7df6b67232e5b770418b0428c',
+ },
+];
diff --git a/web/cashtab-v2/src/hooks/__mocks__/mockPublicKeys.js b/web/cashtab-v2/src/hooks/__mocks__/mockPublicKeys.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/__mocks__/mockPublicKeys.js
@@ -0,0 +1,3 @@
+export default [
+ '02c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+];
diff --git a/web/cashtab-v2/src/hooks/__mocks__/mockReturnGetHydratedUtxoDetails.js b/web/cashtab-v2/src/hooks/__mocks__/mockReturnGetHydratedUtxoDetails.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/__mocks__/mockReturnGetHydratedUtxoDetails.js
@@ -0,0 +1,728 @@
+export default {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 660869,
+ tx_hash:
+ '16b624b60de4a1d8a06baa129e3a88a4becd499e1d5d0d40b9f2ff4d28e3f660',
+ tx_pos: 1,
+ value: 546,
+ txid: '16b624b60de4a1d8a06baa129e3a88a4becd499e1d5d0d40b9f2ff4d28e3f660',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'c7da9ae6a0ce9d4f2f3345f9f0e5da5371228c8aee72b6eeac1b42871b216e6b',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c7da9ae6a0ce9d4f2f3345f9f0e5da5371228c8aee72b6eeac1b42871b216e6b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'dac23f10dd65caa51359c1643ffc93b94d14c05b739590ade85557d338a21040',
+ tx_pos: 1,
+ value: 546,
+ txid: 'dac23f10dd65caa51359c1643ffc93b94d14c05b739590ade85557d338a21040',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'efa6f67078810875513a116b389886610d81ecf6daf97d55dd96d3fdd201dfac',
+ tx_pos: 1,
+ value: 546,
+ txid: 'efa6f67078810875513a116b389886610d81ecf6daf97d55dd96d3fdd201dfac',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 660978,
+ tx_hash:
+ 'b622b770f74f056e07e5d2ea4d7f8da1c4d865e21e11c31a263602a38d4a2474',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b622b770f74f056e07e5d2ea4d7f8da1c4d865e21e11c31a263602a38d4a2474',
+ vout: 2,
+ utxoType: 'minting-baton',
+ transactionType: 'mint',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenType: 1,
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ mintBatonVout: 2,
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 660982,
+ tx_hash:
+ '67605f3d18135b52d95a4877a427d100c14f2610c63ee84eaf4856f883a0b70e',
+ tx_pos: 2,
+ value: 546,
+ txid: '67605f3d18135b52d95a4877a427d100c14f2610c63ee84eaf4856f883a0b70e',
+ vout: 2,
+ utxoType: 'minting-baton',
+ transactionType: 'mint',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenType: 1,
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ mintBatonVout: 2,
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 662159,
+ tx_hash:
+ '05e90e9f35bc041a2939e0e28cf9c436c9adb0f247a7fb0d1f4abb26d418f096',
+ tx_pos: 1,
+ value: 546,
+ txid: '05e90e9f35bc041a2939e0e28cf9c436c9adb0f247a7fb0d1f4abb26d418f096',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '150',
+ isValid: false,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 662799,
+ tx_hash:
+ 'b399a5ae69e4ac4c96b27c680a541e6b8142006bdc2484a959821858fc0b4ca3',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b399a5ae69e4ac4c96b27c680a541e6b8142006bdc2484a959821858fc0b4ca3',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '310',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 662935,
+ tx_hash:
+ 'ec423d0089f5cd85973ff6d875e9507f6b396b3b82bf6e9f5cfb24b7c70273bd',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ec423d0089f5cd85973ff6d875e9507f6b396b3b82bf6e9f5cfb24b7c70273bd',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'acba1d7f354c6d4d001eb99d31de174e5cea8a31d692afd6e7eb8474ad541f55',
+ tokenTicker: 'CTB',
+ tokenName: 'CashTabBits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: false,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 662987,
+ tx_hash:
+ '9b4361b24c756ff7a74ea5261be565acade0b246fb85422086ac273c1e4ee7d5',
+ tx_pos: 1,
+ value: 546,
+ txid: '9b4361b24c756ff7a74ea5261be565acade0b246fb85422086ac273c1e4ee7d5',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6a4c8bfa2e3ca345795dc3bde84d647390e9e1f2ff96e535cd2754d8ea5a3539',
+ tokenTicker: 'CTB2',
+ tokenName: 'CashTabBitsReborn',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '10000000000',
+ isValid: false,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 667561,
+ tx_hash:
+ '4ca7f70996c699b0f988597a2dd2700f1f24f305318ddc8fe137d96d5fa96bf5',
+ tx_pos: 1,
+ value: 546,
+ txid: '4ca7f70996c699b0f988597a2dd2700f1f24f305318ddc8fe137d96d5fa96bf5',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'de912bc7a6a1b14abe04960cd9a0ef88a4f59eb04db765f7bc2c0d2c2f997054',
+ tx_pos: 1,
+ value: 546,
+ txid: 'de912bc7a6a1b14abe04960cd9a0ef88a4f59eb04db765f7bc2c0d2c2f997054',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '100.0000001',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'e25cebd4cccbbdd91b36f672d51f5ce978e0817839be9854c3550704aec4359d',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e25cebd4cccbbdd91b36f672d51f5ce978e0817839be9854c3550704aec4359d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'e9a94cc174839e3659d2fe4d33490528d18ad91404b65eb8cc35d8fa2d3f5096',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9a94cc174839e3659d2fe4d33490528d18ad91404b65eb8cc35d8fa2d3f5096',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '5.854300861',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 667751,
+ tx_hash:
+ '05e87142de1bb8c2a43d22a2e4b97855eb84c3c76f4ea956a654efda8d0557ca',
+ tx_pos: 1,
+ value: 546,
+ txid: '05e87142de1bb8c2a43d22a2e4b97855eb84c3c76f4ea956a654efda8d0557ca',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1.14669914',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ ],
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ utxos: [
+ {
+ height: 660971,
+ tx_hash:
+ 'aefc3f3c65760d0f0fa716a84d12c4dc76ca7552953d6c7a4358abb6e24c5d7c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'aefc3f3c65760d0f0fa716a84d12c4dc76ca7552953d6c7a4358abb6e24c5d7c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: false,
+ address:
+ 'bitcoincash:qrcl220pxeec78vnchwyh6fsdyf60uv9tcynw3u2ev',
+ },
+ ],
+ address: 'bitcoincash:qrcl220pxeec78vnchwyh6fsdyf60uv9tcynw3u2ev',
+ },
+ {
+ utxos: [
+ {
+ height: 666954,
+ tx_hash:
+ '1b19314963be975c57eb37df12b6a8e0598bcb743226cdc684895520f51c4dfe',
+ tx_pos: 2,
+ value: 546,
+ txid: '1b19314963be975c57eb37df12b6a8e0598bcb743226cdc684895520f51c4dfe',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '4.97',
+ isValid: false,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 666969,
+ tx_hash:
+ '99583b593a3bec993328b076f4988fd77b8423d788183bf2968ed43cec11c454',
+ tx_pos: 2,
+ value: 546,
+ txid: '99583b593a3bec993328b076f4988fd77b8423d788183bf2968ed43cec11c454',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '9897999873.21001107',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 667560,
+ tx_hash:
+ '34002080b2e1b42ff9f33d36dbbd0d8f1aaddc5a00b916054a40c45feebaf548',
+ tx_pos: 2,
+ value: 546,
+ txid: '34002080b2e1b42ff9f33d36dbbd0d8f1aaddc5a00b916054a40c45feebaf548',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '3.999999998',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 667560,
+ tx_hash:
+ '8edccfafe4b002da8f1aa71daae31846c51848968e7d92dcba5f0ff97beb734d',
+ tx_pos: 2,
+ value: 546,
+ txid: '8edccfafe4b002da8f1aa71daae31846c51848968e7d92dcba5f0ff97beb734d',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '523512244.796145',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 667793,
+ tx_hash:
+ '9c295332b7bc16758b2e328f21189fa0ea79f71908b47529749b3ba54e523817',
+ tx_pos: 1,
+ value: 546,
+ txid: '9c295332b7bc16758b2e328f21189fa0ea79f71908b47529749b3ba54e523817',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bfddfcfc9fb9a8d61ed74fa94b5e32ccc03305797eea461658303df5805578ef',
+ tokenTicker: 'Sending Token',
+ tokenName: 'Sending Token',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 667909,
+ tx_hash:
+ '5bb8f9831d616b3a859ffec4507f66bd5f2f3c057d7f5d5fa5c026216d6c2646',
+ tx_pos: 1,
+ value: 546,
+ txid: '5bb8f9831d616b3a859ffec4507f66bd5f2f3c057d7f5d5fa5c026216d6c2646',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 667909,
+ tx_hash:
+ 'd3183b663a8d67b2b558654896b95102bbe68d164de219da96273ae52de93813',
+ tx_pos: 1,
+ value: 546,
+ txid: 'd3183b663a8d67b2b558654896b95102bbe68d164de219da96273ae52de93813',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 668550,
+ tx_hash:
+ '38a692e3fa974ee186eedc3a03bf3410dd03a5f35bc44f1a07f287b669dce44b',
+ tx_pos: 2,
+ value: 546,
+ txid: '38a692e3fa974ee186eedc3a03bf3410dd03a5f35bc44f1a07f287b669dce44b',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bfddfcfc9fb9a8d61ed74fa94b5e32ccc03305797eea461658303df5805578ef',
+ tokenTicker: 'Sending Token',
+ tokenName: 'Sending Token',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 668779,
+ tx_hash:
+ '24604835e5c68aedad2dbf4200ecc1af8c3fa92738445323af86def84d48d572',
+ tx_pos: 1,
+ value: 546,
+ txid: '24604835e5c68aedad2dbf4200ecc1af8c3fa92738445323af86def84d48d572',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bfddfcfc9fb9a8d61ed74fa94b5e32ccc03305797eea461658303df5805578ef',
+ tokenTicker: 'Sending Token',
+ tokenName: 'Sending Token',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 669057,
+ tx_hash:
+ 'dd560d87bd632e40c6548021006653a150197ede13fadb5eadfa29abe4400d0e',
+ tx_pos: 1,
+ value: 546,
+ txid: 'dd560d87bd632e40c6548021006653a150197ede13fadb5eadfa29abe4400d0e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 669510,
+ tx_hash:
+ 'acbb66f826211f40b89e84d9bd2143dfb541d67e1e3c664b17ccd3ba66327a9e',
+ tx_pos: 1,
+ value: 546,
+ txid: 'acbb66f826211f40b89e84d9bd2143dfb541d67e1e3c664b17ccd3ba66327a9e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bfddfcfc9fb9a8d61ed74fa94b5e32ccc03305797eea461658303df5805578ef',
+ tokenTicker: 'Sending Token',
+ tokenName: 'Sending Token',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ '0da6d49cf95d4603958e53360ad1e90bfccef41bfb327d6b2e8a77e242fa2d58',
+ tx_pos: 0,
+ value: 1000,
+ txid: '0da6d49cf95d4603958e53360ad1e90bfccef41bfb327d6b2e8a77e242fa2d58',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ '39521b38cd1b6126a57a68b8adfd836020cd53b195f3b4675c58095c5c300ef8',
+ tx_pos: 0,
+ value: 700000,
+ txid: '39521b38cd1b6126a57a68b8adfd836020cd53b195f3b4675c58095c5c300ef8',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ '93949923f02cb5271bd6d0b5a5b937ce5ae22df5bf6117161078f175f0c29d56',
+ tx_pos: 0,
+ value: 700000,
+ txid: '93949923f02cb5271bd6d0b5a5b937ce5ae22df5bf6117161078f175f0c29d56',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ 'ddace66ea968e16e55ebf218814401acc38e0a39150529fa3d1108af04e81373',
+ tx_pos: 0,
+ value: 300000,
+ txid: 'ddace66ea968e16e55ebf218814401acc38e0a39150529fa3d1108af04e81373',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ 'f1147285ac384159b5dfae513bda47a0459f876d046b48f13c8a7ec4f0d20d96',
+ tx_pos: 0,
+ value: 700000,
+ txid: 'f1147285ac384159b5dfae513bda47a0459f876d046b48f13c8a7ec4f0d20d96',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ 'f4ca891d090f2682c7086b27a4d3bc2ed1543fb96123b6649e8f26b644a45b51',
+ tx_pos: 0,
+ value: 30000,
+ txid: 'f4ca891d090f2682c7086b27a4d3bc2ed1543fb96123b6649e8f26b644a45b51',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ ],
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ ],
+};
diff --git a/web/cashtab-v2/src/hooks/__mocks__/mockReturnGetHydratedUtxoDetailsWithZeroBalance.js b/web/cashtab-v2/src/hooks/__mocks__/mockReturnGetHydratedUtxoDetailsWithZeroBalance.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/__mocks__/mockReturnGetHydratedUtxoDetailsWithZeroBalance.js
@@ -0,0 +1,728 @@
+export default {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 660869,
+ tx_hash:
+ '16b624b60de4a1d8a06baa129e3a88a4becd499e1d5d0d40b9f2ff4d28e3f660',
+ tx_pos: 1,
+ value: 546,
+ txid: '16b624b60de4a1d8a06baa129e3a88a4becd499e1d5d0d40b9f2ff4d28e3f660',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'c7da9ae6a0ce9d4f2f3345f9f0e5da5371228c8aee72b6eeac1b42871b216e6b',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c7da9ae6a0ce9d4f2f3345f9f0e5da5371228c8aee72b6eeac1b42871b216e6b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'dac23f10dd65caa51359c1643ffc93b94d14c05b739590ade85557d338a21040',
+ tx_pos: 1,
+ value: 546,
+ txid: 'dac23f10dd65caa51359c1643ffc93b94d14c05b739590ade85557d338a21040',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'efa6f67078810875513a116b389886610d81ecf6daf97d55dd96d3fdd201dfac',
+ tx_pos: 1,
+ value: 546,
+ txid: 'efa6f67078810875513a116b389886610d81ecf6daf97d55dd96d3fdd201dfac',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 660978,
+ tx_hash:
+ 'b622b770f74f056e07e5d2ea4d7f8da1c4d865e21e11c31a263602a38d4a2474',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b622b770f74f056e07e5d2ea4d7f8da1c4d865e21e11c31a263602a38d4a2474',
+ vout: 2,
+ utxoType: 'minting-baton',
+ transactionType: 'mint',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenType: 1,
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ mintBatonVout: 2,
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 660982,
+ tx_hash:
+ '67605f3d18135b52d95a4877a427d100c14f2610c63ee84eaf4856f883a0b70e',
+ tx_pos: 2,
+ value: 546,
+ txid: '67605f3d18135b52d95a4877a427d100c14f2610c63ee84eaf4856f883a0b70e',
+ vout: 2,
+ utxoType: 'minting-baton',
+ transactionType: 'mint',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenType: 1,
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ mintBatonVout: 2,
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 662159,
+ tx_hash:
+ '05e90e9f35bc041a2939e0e28cf9c436c9adb0f247a7fb0d1f4abb26d418f096',
+ tx_pos: 1,
+ value: 546,
+ txid: '05e90e9f35bc041a2939e0e28cf9c436c9adb0f247a7fb0d1f4abb26d418f096',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '150',
+ isValid: false,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 662799,
+ tx_hash:
+ 'b399a5ae69e4ac4c96b27c680a541e6b8142006bdc2484a959821858fc0b4ca3',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b399a5ae69e4ac4c96b27c680a541e6b8142006bdc2484a959821858fc0b4ca3',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '310',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 662935,
+ tx_hash:
+ 'ec423d0089f5cd85973ff6d875e9507f6b396b3b82bf6e9f5cfb24b7c70273bd',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ec423d0089f5cd85973ff6d875e9507f6b396b3b82bf6e9f5cfb24b7c70273bd',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'acba1d7f354c6d4d001eb99d31de174e5cea8a31d692afd6e7eb8474ad541f55',
+ tokenTicker: 'CTB',
+ tokenName: 'CashTabBits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '0',
+ isValid: false,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 662987,
+ tx_hash:
+ '9b4361b24c756ff7a74ea5261be565acade0b246fb85422086ac273c1e4ee7d5',
+ tx_pos: 1,
+ value: 546,
+ txid: '9b4361b24c756ff7a74ea5261be565acade0b246fb85422086ac273c1e4ee7d5',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6a4c8bfa2e3ca345795dc3bde84d647390e9e1f2ff96e535cd2754d8ea5a3539',
+ tokenTicker: 'CTB2',
+ tokenName: 'CashTabBitsReborn',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '10000000000',
+ isValid: false,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 667561,
+ tx_hash:
+ '4ca7f70996c699b0f988597a2dd2700f1f24f305318ddc8fe137d96d5fa96bf5',
+ tx_pos: 1,
+ value: 546,
+ txid: '4ca7f70996c699b0f988597a2dd2700f1f24f305318ddc8fe137d96d5fa96bf5',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'de912bc7a6a1b14abe04960cd9a0ef88a4f59eb04db765f7bc2c0d2c2f997054',
+ tx_pos: 1,
+ value: 546,
+ txid: 'de912bc7a6a1b14abe04960cd9a0ef88a4f59eb04db765f7bc2c0d2c2f997054',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '100.0000001',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'e25cebd4cccbbdd91b36f672d51f5ce978e0817839be9854c3550704aec4359d',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e25cebd4cccbbdd91b36f672d51f5ce978e0817839be9854c3550704aec4359d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'e9a94cc174839e3659d2fe4d33490528d18ad91404b65eb8cc35d8fa2d3f5096',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9a94cc174839e3659d2fe4d33490528d18ad91404b65eb8cc35d8fa2d3f5096',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '5.854300861',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 667751,
+ tx_hash:
+ '05e87142de1bb8c2a43d22a2e4b97855eb84c3c76f4ea956a654efda8d0557ca',
+ tx_pos: 1,
+ value: 546,
+ txid: '05e87142de1bb8c2a43d22a2e4b97855eb84c3c76f4ea956a654efda8d0557ca',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1.14669914',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ ],
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ utxos: [
+ {
+ height: 660971,
+ tx_hash:
+ 'aefc3f3c65760d0f0fa716a84d12c4dc76ca7552953d6c7a4358abb6e24c5d7c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'aefc3f3c65760d0f0fa716a84d12c4dc76ca7552953d6c7a4358abb6e24c5d7c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '0',
+ isValid: false,
+ address:
+ 'bitcoincash:qrcl220pxeec78vnchwyh6fsdyf60uv9tcynw3u2ev',
+ },
+ ],
+ address: 'bitcoincash:qrcl220pxeec78vnchwyh6fsdyf60uv9tcynw3u2ev',
+ },
+ {
+ utxos: [
+ {
+ height: 666954,
+ tx_hash:
+ '1b19314963be975c57eb37df12b6a8e0598bcb743226cdc684895520f51c4dfe',
+ tx_pos: 2,
+ value: 546,
+ txid: '1b19314963be975c57eb37df12b6a8e0598bcb743226cdc684895520f51c4dfe',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '4.97',
+ isValid: false,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 666969,
+ tx_hash:
+ '99583b593a3bec993328b076f4988fd77b8423d788183bf2968ed43cec11c454',
+ tx_pos: 2,
+ value: 546,
+ txid: '99583b593a3bec993328b076f4988fd77b8423d788183bf2968ed43cec11c454',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '9897999873.21001107',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 667560,
+ tx_hash:
+ '34002080b2e1b42ff9f33d36dbbd0d8f1aaddc5a00b916054a40c45feebaf548',
+ tx_pos: 2,
+ value: 546,
+ txid: '34002080b2e1b42ff9f33d36dbbd0d8f1aaddc5a00b916054a40c45feebaf548',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '3.999999998',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 667560,
+ tx_hash:
+ '8edccfafe4b002da8f1aa71daae31846c51848968e7d92dcba5f0ff97beb734d',
+ tx_pos: 2,
+ value: 546,
+ txid: '8edccfafe4b002da8f1aa71daae31846c51848968e7d92dcba5f0ff97beb734d',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '523512244.796145',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 667793,
+ tx_hash:
+ '9c295332b7bc16758b2e328f21189fa0ea79f71908b47529749b3ba54e523817',
+ tx_pos: 1,
+ value: 546,
+ txid: '9c295332b7bc16758b2e328f21189fa0ea79f71908b47529749b3ba54e523817',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bfddfcfc9fb9a8d61ed74fa94b5e32ccc03305797eea461658303df5805578ef',
+ tokenTicker: 'Sending Token',
+ tokenName: 'Sending Token',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '0',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 667909,
+ tx_hash:
+ '5bb8f9831d616b3a859ffec4507f66bd5f2f3c057d7f5d5fa5c026216d6c2646',
+ tx_pos: 1,
+ value: 546,
+ txid: '5bb8f9831d616b3a859ffec4507f66bd5f2f3c057d7f5d5fa5c026216d6c2646',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '0',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 667909,
+ tx_hash:
+ 'd3183b663a8d67b2b558654896b95102bbe68d164de219da96273ae52de93813',
+ tx_pos: 1,
+ value: 546,
+ txid: 'd3183b663a8d67b2b558654896b95102bbe68d164de219da96273ae52de93813',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 668550,
+ tx_hash:
+ '38a692e3fa974ee186eedc3a03bf3410dd03a5f35bc44f1a07f287b669dce44b',
+ tx_pos: 2,
+ value: 546,
+ txid: '38a692e3fa974ee186eedc3a03bf3410dd03a5f35bc44f1a07f287b669dce44b',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bfddfcfc9fb9a8d61ed74fa94b5e32ccc03305797eea461658303df5805578ef',
+ tokenTicker: 'Sending Token',
+ tokenName: 'Sending Token',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '0',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 668779,
+ tx_hash:
+ '24604835e5c68aedad2dbf4200ecc1af8c3fa92738445323af86def84d48d572',
+ tx_pos: 1,
+ value: 546,
+ txid: '24604835e5c68aedad2dbf4200ecc1af8c3fa92738445323af86def84d48d572',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bfddfcfc9fb9a8d61ed74fa94b5e32ccc03305797eea461658303df5805578ef',
+ tokenTicker: 'Sending Token',
+ tokenName: 'Sending Token',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '0',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 669057,
+ tx_hash:
+ 'dd560d87bd632e40c6548021006653a150197ede13fadb5eadfa29abe4400d0e',
+ tx_pos: 1,
+ value: 546,
+ txid: 'dd560d87bd632e40c6548021006653a150197ede13fadb5eadfa29abe4400d0e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 669510,
+ tx_hash:
+ 'acbb66f826211f40b89e84d9bd2143dfb541d67e1e3c664b17ccd3ba66327a9e',
+ tx_pos: 1,
+ value: 546,
+ txid: 'acbb66f826211f40b89e84d9bd2143dfb541d67e1e3c664b17ccd3ba66327a9e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bfddfcfc9fb9a8d61ed74fa94b5e32ccc03305797eea461658303df5805578ef',
+ tokenTicker: 'Sending Token',
+ tokenName: 'Sending Token',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '0',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ '0da6d49cf95d4603958e53360ad1e90bfccef41bfb327d6b2e8a77e242fa2d58',
+ tx_pos: 0,
+ value: 1000,
+ txid: '0da6d49cf95d4603958e53360ad1e90bfccef41bfb327d6b2e8a77e242fa2d58',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ '39521b38cd1b6126a57a68b8adfd836020cd53b195f3b4675c58095c5c300ef8',
+ tx_pos: 0,
+ value: 700000,
+ txid: '39521b38cd1b6126a57a68b8adfd836020cd53b195f3b4675c58095c5c300ef8',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ '93949923f02cb5271bd6d0b5a5b937ce5ae22df5bf6117161078f175f0c29d56',
+ tx_pos: 0,
+ value: 700000,
+ txid: '93949923f02cb5271bd6d0b5a5b937ce5ae22df5bf6117161078f175f0c29d56',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ 'ddace66ea968e16e55ebf218814401acc38e0a39150529fa3d1108af04e81373',
+ tx_pos: 0,
+ value: 300000,
+ txid: 'ddace66ea968e16e55ebf218814401acc38e0a39150529fa3d1108af04e81373',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ 'f1147285ac384159b5dfae513bda47a0459f876d046b48f13c8a7ec4f0d20d96',
+ tx_pos: 0,
+ value: 700000,
+ txid: 'f1147285ac384159b5dfae513bda47a0459f876d046b48f13c8a7ec4f0d20d96',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ 'f4ca891d090f2682c7086b27a4d3bc2ed1543fb96123b6649e8f26b644a45b51',
+ tx_pos: 0,
+ value: 30000,
+ txid: 'f4ca891d090f2682c7086b27a4d3bc2ed1543fb96123b6649e8f26b644a45b51',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ ],
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ ],
+};
diff --git a/web/cashtab-v2/src/hooks/__mocks__/mockReturnGetSlpBalancesAndUtxos.js b/web/cashtab-v2/src/hooks/__mocks__/mockReturnGetSlpBalancesAndUtxos.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/__mocks__/mockReturnGetSlpBalancesAndUtxos.js
@@ -0,0 +1,841 @@
+import BigNumber from 'bignumber.js';
+
+export default {
+ tokens: [
+ {
+ info: {
+ height: 660869,
+ tx_hash:
+ '16b624b60de4a1d8a06baa129e3a88a4becd499e1d5d0d40b9f2ff4d28e3f660',
+ tx_pos: 1,
+ value: 546,
+ txid: '16b624b60de4a1d8a06baa129e3a88a4becd499e1d5d0d40b9f2ff4d28e3f660',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ balance: new BigNumber('1'),
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 660869,
+ tx_hash:
+ 'c7da9ae6a0ce9d4f2f3345f9f0e5da5371228c8aee72b6eeac1b42871b216e6b',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c7da9ae6a0ce9d4f2f3345f9f0e5da5371228c8aee72b6eeac1b42871b216e6b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ balance: new BigNumber('2'),
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 660869,
+ tx_hash:
+ 'dac23f10dd65caa51359c1643ffc93b94d14c05b739590ade85557d338a21040',
+ tx_pos: 1,
+ value: 546,
+ txid: 'dac23f10dd65caa51359c1643ffc93b94d14c05b739590ade85557d338a21040',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ balance: new BigNumber('3'),
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 660869,
+ tx_hash:
+ 'efa6f67078810875513a116b389886610d81ecf6daf97d55dd96d3fdd201dfac',
+ tx_pos: 1,
+ value: 546,
+ txid: 'efa6f67078810875513a116b389886610d81ecf6daf97d55dd96d3fdd201dfac',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ balance: new BigNumber('2'),
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 660978,
+ tx_hash:
+ 'b622b770f74f056e07e5d2ea4d7f8da1c4d865e21e11c31a263602a38d4a2474',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b622b770f74f056e07e5d2ea4d7f8da1c4d865e21e11c31a263602a38d4a2474',
+ vout: 2,
+ utxoType: 'minting-baton',
+ transactionType: 'mint',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenType: 1,
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ mintBatonVout: 2,
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ balance: new BigNumber('310.000000001'),
+ hasBaton: true,
+ },
+ {
+ info: {
+ height: 660982,
+ tx_hash:
+ '67605f3d18135b52d95a4877a427d100c14f2610c63ee84eaf4856f883a0b70e',
+ tx_pos: 2,
+ value: 546,
+ txid: '67605f3d18135b52d95a4877a427d100c14f2610c63ee84eaf4856f883a0b70e',
+ vout: 2,
+ utxoType: 'minting-baton',
+ transactionType: 'mint',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenType: 1,
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ mintBatonVout: 2,
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ balance: new BigNumber('523512344.7961451'),
+ hasBaton: true,
+ },
+ {
+ info: {
+ height: 667750,
+ tx_hash:
+ 'e9a94cc174839e3659d2fe4d33490528d18ad91404b65eb8cc35d8fa2d3f5096',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9a94cc174839e3659d2fe4d33490528d18ad91404b65eb8cc35d8fa2d3f5096',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '5.854300861',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ balance: new BigNumber('9897999885.211011069'),
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 667793,
+ tx_hash:
+ '9c295332b7bc16758b2e328f21189fa0ea79f71908b47529749b3ba54e523817',
+ tx_pos: 1,
+ value: 546,
+ txid: '9c295332b7bc16758b2e328f21189fa0ea79f71908b47529749b3ba54e523817',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bfddfcfc9fb9a8d61ed74fa94b5e32ccc03305797eea461658303df5805578ef',
+ tokenTicker: 'Sending Token',
+ tokenName: 'Sending Token',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ tokenId:
+ 'bfddfcfc9fb9a8d61ed74fa94b5e32ccc03305797eea461658303df5805578ef',
+ balance: new BigNumber('4e-9'),
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 669057,
+ tx_hash:
+ 'dd560d87bd632e40c6548021006653a150197ede13fadb5eadfa29abe4400d0e',
+ tx_pos: 1,
+ value: 546,
+ txid: 'dd560d87bd632e40c6548021006653a150197ede13fadb5eadfa29abe4400d0e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ balance: new BigNumber('1'),
+ hasBaton: false,
+ },
+ ],
+ nonSlpUtxos: [
+ {
+ height: 669639,
+ tx_hash:
+ '0da6d49cf95d4603958e53360ad1e90bfccef41bfb327d6b2e8a77e242fa2d58',
+ tx_pos: 0,
+ value: 1000,
+ txid: '0da6d49cf95d4603958e53360ad1e90bfccef41bfb327d6b2e8a77e242fa2d58',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ '39521b38cd1b6126a57a68b8adfd836020cd53b195f3b4675c58095c5c300ef8',
+ tx_pos: 0,
+ value: 700000,
+ txid: '39521b38cd1b6126a57a68b8adfd836020cd53b195f3b4675c58095c5c300ef8',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ '93949923f02cb5271bd6d0b5a5b937ce5ae22df5bf6117161078f175f0c29d56',
+ tx_pos: 0,
+ value: 700000,
+ txid: '93949923f02cb5271bd6d0b5a5b937ce5ae22df5bf6117161078f175f0c29d56',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ 'ddace66ea968e16e55ebf218814401acc38e0a39150529fa3d1108af04e81373',
+ tx_pos: 0,
+ value: 300000,
+ txid: 'ddace66ea968e16e55ebf218814401acc38e0a39150529fa3d1108af04e81373',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ 'f1147285ac384159b5dfae513bda47a0459f876d046b48f13c8a7ec4f0d20d96',
+ tx_pos: 0,
+ value: 700000,
+ txid: 'f1147285ac384159b5dfae513bda47a0459f876d046b48f13c8a7ec4f0d20d96',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ 'f4ca891d090f2682c7086b27a4d3bc2ed1543fb96123b6649e8f26b644a45b51',
+ tx_pos: 0,
+ value: 30000,
+ txid: 'f4ca891d090f2682c7086b27a4d3bc2ed1543fb96123b6649e8f26b644a45b51',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ ],
+ slpUtxos: [
+ {
+ height: 660869,
+ tx_hash:
+ '16b624b60de4a1d8a06baa129e3a88a4becd499e1d5d0d40b9f2ff4d28e3f660',
+ tx_pos: 1,
+ value: 546,
+ txid: '16b624b60de4a1d8a06baa129e3a88a4becd499e1d5d0d40b9f2ff4d28e3f660',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'c7da9ae6a0ce9d4f2f3345f9f0e5da5371228c8aee72b6eeac1b42871b216e6b',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c7da9ae6a0ce9d4f2f3345f9f0e5da5371228c8aee72b6eeac1b42871b216e6b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'dac23f10dd65caa51359c1643ffc93b94d14c05b739590ade85557d338a21040',
+ tx_pos: 1,
+ value: 546,
+ txid: 'dac23f10dd65caa51359c1643ffc93b94d14c05b739590ade85557d338a21040',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'efa6f67078810875513a116b389886610d81ecf6daf97d55dd96d3fdd201dfac',
+ tx_pos: 1,
+ value: 546,
+ txid: 'efa6f67078810875513a116b389886610d81ecf6daf97d55dd96d3fdd201dfac',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 660978,
+ tx_hash:
+ 'b622b770f74f056e07e5d2ea4d7f8da1c4d865e21e11c31a263602a38d4a2474',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b622b770f74f056e07e5d2ea4d7f8da1c4d865e21e11c31a263602a38d4a2474',
+ vout: 2,
+ utxoType: 'minting-baton',
+ transactionType: 'mint',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenType: 1,
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ mintBatonVout: 2,
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 660982,
+ tx_hash:
+ '67605f3d18135b52d95a4877a427d100c14f2610c63ee84eaf4856f883a0b70e',
+ tx_pos: 2,
+ value: 546,
+ txid: '67605f3d18135b52d95a4877a427d100c14f2610c63ee84eaf4856f883a0b70e',
+ vout: 2,
+ utxoType: 'minting-baton',
+ transactionType: 'mint',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenType: 1,
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ mintBatonVout: 2,
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 662799,
+ tx_hash:
+ 'b399a5ae69e4ac4c96b27c680a541e6b8142006bdc2484a959821858fc0b4ca3',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b399a5ae69e4ac4c96b27c680a541e6b8142006bdc2484a959821858fc0b4ca3',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '310',
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 667561,
+ tx_hash:
+ '4ca7f70996c699b0f988597a2dd2700f1f24f305318ddc8fe137d96d5fa96bf5',
+ tx_pos: 1,
+ value: 546,
+ txid: '4ca7f70996c699b0f988597a2dd2700f1f24f305318ddc8fe137d96d5fa96bf5',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'de912bc7a6a1b14abe04960cd9a0ef88a4f59eb04db765f7bc2c0d2c2f997054',
+ tx_pos: 1,
+ value: 546,
+ txid: 'de912bc7a6a1b14abe04960cd9a0ef88a4f59eb04db765f7bc2c0d2c2f997054',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '100.0000001',
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'e25cebd4cccbbdd91b36f672d51f5ce978e0817839be9854c3550704aec4359d',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e25cebd4cccbbdd91b36f672d51f5ce978e0817839be9854c3550704aec4359d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'e9a94cc174839e3659d2fe4d33490528d18ad91404b65eb8cc35d8fa2d3f5096',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9a94cc174839e3659d2fe4d33490528d18ad91404b65eb8cc35d8fa2d3f5096',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '5.854300861',
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 667751,
+ tx_hash:
+ '05e87142de1bb8c2a43d22a2e4b97855eb84c3c76f4ea956a654efda8d0557ca',
+ tx_pos: 1,
+ value: 546,
+ txid: '05e87142de1bb8c2a43d22a2e4b97855eb84c3c76f4ea956a654efda8d0557ca',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1.14669914',
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 666969,
+ tx_hash:
+ '99583b593a3bec993328b076f4988fd77b8423d788183bf2968ed43cec11c454',
+ tx_pos: 2,
+ value: 546,
+ txid: '99583b593a3bec993328b076f4988fd77b8423d788183bf2968ed43cec11c454',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '9897999873.21001107',
+ isValid: true,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 667560,
+ tx_hash:
+ '34002080b2e1b42ff9f33d36dbbd0d8f1aaddc5a00b916054a40c45feebaf548',
+ tx_pos: 2,
+ value: 546,
+ txid: '34002080b2e1b42ff9f33d36dbbd0d8f1aaddc5a00b916054a40c45feebaf548',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '3.999999998',
+ isValid: true,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 667560,
+ tx_hash:
+ '8edccfafe4b002da8f1aa71daae31846c51848968e7d92dcba5f0ff97beb734d',
+ tx_pos: 2,
+ value: 546,
+ txid: '8edccfafe4b002da8f1aa71daae31846c51848968e7d92dcba5f0ff97beb734d',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '523512244.796145',
+ isValid: true,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 667793,
+ tx_hash:
+ '9c295332b7bc16758b2e328f21189fa0ea79f71908b47529749b3ba54e523817',
+ tx_pos: 1,
+ value: 546,
+ txid: '9c295332b7bc16758b2e328f21189fa0ea79f71908b47529749b3ba54e523817',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bfddfcfc9fb9a8d61ed74fa94b5e32ccc03305797eea461658303df5805578ef',
+ tokenTicker: 'Sending Token',
+ tokenName: 'Sending Token',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 667909,
+ tx_hash:
+ '5bb8f9831d616b3a859ffec4507f66bd5f2f3c057d7f5d5fa5c026216d6c2646',
+ tx_pos: 1,
+ value: 546,
+ txid: '5bb8f9831d616b3a859ffec4507f66bd5f2f3c057d7f5d5fa5c026216d6c2646',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 667909,
+ tx_hash:
+ 'd3183b663a8d67b2b558654896b95102bbe68d164de219da96273ae52de93813',
+ tx_pos: 1,
+ value: 546,
+ txid: 'd3183b663a8d67b2b558654896b95102bbe68d164de219da96273ae52de93813',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 668550,
+ tx_hash:
+ '38a692e3fa974ee186eedc3a03bf3410dd03a5f35bc44f1a07f287b669dce44b',
+ tx_pos: 2,
+ value: 546,
+ txid: '38a692e3fa974ee186eedc3a03bf3410dd03a5f35bc44f1a07f287b669dce44b',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bfddfcfc9fb9a8d61ed74fa94b5e32ccc03305797eea461658303df5805578ef',
+ tokenTicker: 'Sending Token',
+ tokenName: 'Sending Token',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 668779,
+ tx_hash:
+ '24604835e5c68aedad2dbf4200ecc1af8c3fa92738445323af86def84d48d572',
+ tx_pos: 1,
+ value: 546,
+ txid: '24604835e5c68aedad2dbf4200ecc1af8c3fa92738445323af86def84d48d572',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bfddfcfc9fb9a8d61ed74fa94b5e32ccc03305797eea461658303df5805578ef',
+ tokenTicker: 'Sending Token',
+ tokenName: 'Sending Token',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 669057,
+ tx_hash:
+ 'dd560d87bd632e40c6548021006653a150197ede13fadb5eadfa29abe4400d0e',
+ tx_pos: 1,
+ value: 546,
+ txid: 'dd560d87bd632e40c6548021006653a150197ede13fadb5eadfa29abe4400d0e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 669510,
+ tx_hash:
+ 'acbb66f826211f40b89e84d9bd2143dfb541d67e1e3c664b17ccd3ba66327a9e',
+ tx_pos: 1,
+ value: 546,
+ txid: 'acbb66f826211f40b89e84d9bd2143dfb541d67e1e3c664b17ccd3ba66327a9e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bfddfcfc9fb9a8d61ed74fa94b5e32ccc03305797eea461658303df5805578ef',
+ tokenTicker: 'Sending Token',
+ tokenName: 'Sending Token',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ ],
+};
diff --git a/web/cashtab-v2/src/hooks/__mocks__/mockReturnGetSlpBalancesAndUtxosNoZeroBalance.js b/web/cashtab-v2/src/hooks/__mocks__/mockReturnGetSlpBalancesAndUtxosNoZeroBalance.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/__mocks__/mockReturnGetSlpBalancesAndUtxosNoZeroBalance.js
@@ -0,0 +1,702 @@
+import BigNumber from 'bignumber.js';
+
+export default {
+ tokens: [
+ {
+ info: {
+ height: 660869,
+ tx_hash:
+ '16b624b60de4a1d8a06baa129e3a88a4becd499e1d5d0d40b9f2ff4d28e3f660',
+ tx_pos: 1,
+ value: 546,
+ txid: '16b624b60de4a1d8a06baa129e3a88a4becd499e1d5d0d40b9f2ff4d28e3f660',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ balance: new BigNumber('1'),
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 660869,
+ tx_hash:
+ 'c7da9ae6a0ce9d4f2f3345f9f0e5da5371228c8aee72b6eeac1b42871b216e6b',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c7da9ae6a0ce9d4f2f3345f9f0e5da5371228c8aee72b6eeac1b42871b216e6b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ balance: new BigNumber('2'),
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 660869,
+ tx_hash:
+ 'dac23f10dd65caa51359c1643ffc93b94d14c05b739590ade85557d338a21040',
+ tx_pos: 1,
+ value: 546,
+ txid: 'dac23f10dd65caa51359c1643ffc93b94d14c05b739590ade85557d338a21040',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ balance: new BigNumber('3'),
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 660869,
+ tx_hash:
+ 'efa6f67078810875513a116b389886610d81ecf6daf97d55dd96d3fdd201dfac',
+ tx_pos: 1,
+ value: 546,
+ txid: 'efa6f67078810875513a116b389886610d81ecf6daf97d55dd96d3fdd201dfac',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ balance: new BigNumber('2'),
+ hasBaton: false,
+ },
+ {
+ balance: new BigNumber('310'),
+ hasBaton: true,
+ info: {
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ decimals: 9,
+ height: 660978,
+ isValid: true,
+ mintBatonVout: 2,
+ tokenDocumentHash: '',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenName: 'Cash Tab Points',
+ tokenTicker: 'CTP',
+ tokenType: 1,
+ transactionType: 'mint',
+ tx_hash:
+ 'b622b770f74f056e07e5d2ea4d7f8da1c4d865e21e11c31a263602a38d4a2474',
+ tx_pos: 2,
+ txid: 'b622b770f74f056e07e5d2ea4d7f8da1c4d865e21e11c31a263602a38d4a2474',
+ utxoType: 'minting-baton',
+ value: 546,
+ vout: 2,
+ },
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ },
+ {
+ balance: new BigNumber('523512344.7961451'),
+ hasBaton: true,
+ info: {
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ decimals: 7,
+ height: 660982,
+ isValid: true,
+ mintBatonVout: 2,
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenTicker: 'WDT',
+ tokenType: 1,
+ transactionType: 'mint',
+ tx_hash:
+ '67605f3d18135b52d95a4877a427d100c14f2610c63ee84eaf4856f883a0b70e',
+ tx_pos: 2,
+ txid: '67605f3d18135b52d95a4877a427d100c14f2610c63ee84eaf4856f883a0b70e',
+ utxoType: 'minting-baton',
+ value: 546,
+ vout: 2,
+ },
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ },
+ {
+ info: {
+ height: 667750,
+ tx_hash:
+ 'e9a94cc174839e3659d2fe4d33490528d18ad91404b65eb8cc35d8fa2d3f5096',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9a94cc174839e3659d2fe4d33490528d18ad91404b65eb8cc35d8fa2d3f5096',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '5.854300861',
+ isValid: true,
+ address:
+ 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ balance: new BigNumber('9897999885.211011069'),
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 669057,
+ tx_hash:
+ 'dd560d87bd632e40c6548021006653a150197ede13fadb5eadfa29abe4400d0e',
+ tx_pos: 1,
+ value: 546,
+ txid: 'dd560d87bd632e40c6548021006653a150197ede13fadb5eadfa29abe4400d0e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ balance: new BigNumber('1'),
+ hasBaton: false,
+ },
+ ],
+ nonSlpUtxos: [
+ {
+ height: 669639,
+ tx_hash:
+ '0da6d49cf95d4603958e53360ad1e90bfccef41bfb327d6b2e8a77e242fa2d58',
+ tx_pos: 0,
+ value: 1000,
+ txid: '0da6d49cf95d4603958e53360ad1e90bfccef41bfb327d6b2e8a77e242fa2d58',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ '39521b38cd1b6126a57a68b8adfd836020cd53b195f3b4675c58095c5c300ef8',
+ tx_pos: 0,
+ value: 700000,
+ txid: '39521b38cd1b6126a57a68b8adfd836020cd53b195f3b4675c58095c5c300ef8',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ '93949923f02cb5271bd6d0b5a5b937ce5ae22df5bf6117161078f175f0c29d56',
+ tx_pos: 0,
+ value: 700000,
+ txid: '93949923f02cb5271bd6d0b5a5b937ce5ae22df5bf6117161078f175f0c29d56',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ 'ddace66ea968e16e55ebf218814401acc38e0a39150529fa3d1108af04e81373',
+ tx_pos: 0,
+ value: 300000,
+ txid: 'ddace66ea968e16e55ebf218814401acc38e0a39150529fa3d1108af04e81373',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ 'f1147285ac384159b5dfae513bda47a0459f876d046b48f13c8a7ec4f0d20d96',
+ tx_pos: 0,
+ value: 700000,
+ txid: 'f1147285ac384159b5dfae513bda47a0459f876d046b48f13c8a7ec4f0d20d96',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ 'f4ca891d090f2682c7086b27a4d3bc2ed1543fb96123b6649e8f26b644a45b51',
+ tx_pos: 0,
+ value: 30000,
+ txid: 'f4ca891d090f2682c7086b27a4d3bc2ed1543fb96123b6649e8f26b644a45b51',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ wif: 'L58jqHoi5ynSdsskPVBJuGuVqTP8ZML1MwHQsBJY32Pv7cqDSCeH',
+ },
+ ],
+ slpUtxos: [
+ {
+ height: 660869,
+ tx_hash:
+ '16b624b60de4a1d8a06baa129e3a88a4becd499e1d5d0d40b9f2ff4d28e3f660',
+ tx_pos: 1,
+ value: 546,
+ txid: '16b624b60de4a1d8a06baa129e3a88a4becd499e1d5d0d40b9f2ff4d28e3f660',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'c7da9ae6a0ce9d4f2f3345f9f0e5da5371228c8aee72b6eeac1b42871b216e6b',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c7da9ae6a0ce9d4f2f3345f9f0e5da5371228c8aee72b6eeac1b42871b216e6b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'dac23f10dd65caa51359c1643ffc93b94d14c05b739590ade85557d338a21040',
+ tx_pos: 1,
+ value: 546,
+ txid: 'dac23f10dd65caa51359c1643ffc93b94d14c05b739590ade85557d338a21040',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'efa6f67078810875513a116b389886610d81ecf6daf97d55dd96d3fdd201dfac',
+ tx_pos: 1,
+ value: 546,
+ txid: 'efa6f67078810875513a116b389886610d81ecf6daf97d55dd96d3fdd201dfac',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 660978,
+ tx_hash:
+ 'b622b770f74f056e07e5d2ea4d7f8da1c4d865e21e11c31a263602a38d4a2474',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b622b770f74f056e07e5d2ea4d7f8da1c4d865e21e11c31a263602a38d4a2474',
+ vout: 2,
+ utxoType: 'minting-baton',
+ transactionType: 'mint',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenType: 1,
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ mintBatonVout: 2,
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 660982,
+ tx_hash:
+ '67605f3d18135b52d95a4877a427d100c14f2610c63ee84eaf4856f883a0b70e',
+ tx_pos: 2,
+ value: 546,
+ txid: '67605f3d18135b52d95a4877a427d100c14f2610c63ee84eaf4856f883a0b70e',
+ vout: 2,
+ utxoType: 'minting-baton',
+ transactionType: 'mint',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenType: 1,
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ mintBatonVout: 2,
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 662799,
+ tx_hash:
+ 'b399a5ae69e4ac4c96b27c680a541e6b8142006bdc2484a959821858fc0b4ca3',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b399a5ae69e4ac4c96b27c680a541e6b8142006bdc2484a959821858fc0b4ca3',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '310',
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 667561,
+ tx_hash:
+ '4ca7f70996c699b0f988597a2dd2700f1f24f305318ddc8fe137d96d5fa96bf5',
+ tx_pos: 1,
+ value: 546,
+ txid: '4ca7f70996c699b0f988597a2dd2700f1f24f305318ddc8fe137d96d5fa96bf5',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'de912bc7a6a1b14abe04960cd9a0ef88a4f59eb04db765f7bc2c0d2c2f997054',
+ tx_pos: 1,
+ value: 546,
+ txid: 'de912bc7a6a1b14abe04960cd9a0ef88a4f59eb04db765f7bc2c0d2c2f997054',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '100.0000001',
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'e25cebd4cccbbdd91b36f672d51f5ce978e0817839be9854c3550704aec4359d',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e25cebd4cccbbdd91b36f672d51f5ce978e0817839be9854c3550704aec4359d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'e9a94cc174839e3659d2fe4d33490528d18ad91404b65eb8cc35d8fa2d3f5096',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9a94cc174839e3659d2fe4d33490528d18ad91404b65eb8cc35d8fa2d3f5096',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '5.854300861',
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 667751,
+ tx_hash:
+ '05e87142de1bb8c2a43d22a2e4b97855eb84c3c76f4ea956a654efda8d0557ca',
+ tx_pos: 1,
+ value: 546,
+ txid: '05e87142de1bb8c2a43d22a2e4b97855eb84c3c76f4ea956a654efda8d0557ca',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1.14669914',
+ isValid: true,
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ height: 666969,
+ tx_hash:
+ '99583b593a3bec993328b076f4988fd77b8423d788183bf2968ed43cec11c454',
+ tx_pos: 2,
+ value: 546,
+ txid: '99583b593a3bec993328b076f4988fd77b8423d788183bf2968ed43cec11c454',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '9897999873.21001107',
+ isValid: true,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 667560,
+ tx_hash:
+ '34002080b2e1b42ff9f33d36dbbd0d8f1aaddc5a00b916054a40c45feebaf548',
+ tx_pos: 2,
+ value: 546,
+ txid: '34002080b2e1b42ff9f33d36dbbd0d8f1aaddc5a00b916054a40c45feebaf548',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '3.999999998',
+ isValid: true,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 667560,
+ tx_hash:
+ '8edccfafe4b002da8f1aa71daae31846c51848968e7d92dcba5f0ff97beb734d',
+ tx_pos: 2,
+ value: 546,
+ txid: '8edccfafe4b002da8f1aa71daae31846c51848968e7d92dcba5f0ff97beb734d',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '523512244.796145',
+ isValid: true,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 667909,
+ tx_hash:
+ 'd3183b663a8d67b2b558654896b95102bbe68d164de219da96273ae52de93813',
+ tx_pos: 1,
+ value: 546,
+ txid: 'd3183b663a8d67b2b558654896b95102bbe68d164de219da96273ae52de93813',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ {
+ height: 669057,
+ tx_hash:
+ 'dd560d87bd632e40c6548021006653a150197ede13fadb5eadfa29abe4400d0e',
+ tx_pos: 1,
+ value: 546,
+ txid: 'dd560d87bd632e40c6548021006653a150197ede13fadb5eadfa29abe4400d0e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+ ],
+};
diff --git a/web/cashtab-v2/src/hooks/__mocks__/mockReturnGetUtxos.js b/web/cashtab-v2/src/hooks/__mocks__/mockReturnGetUtxos.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/__mocks__/mockReturnGetUtxos.js
@@ -0,0 +1,248 @@
+export default [
+ {
+ utxos: [
+ {
+ height: 660869,
+ tx_hash:
+ '16b624b60de4a1d8a06baa129e3a88a4becd499e1d5d0d40b9f2ff4d28e3f660',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'c7da9ae6a0ce9d4f2f3345f9f0e5da5371228c8aee72b6eeac1b42871b216e6b',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'dac23f10dd65caa51359c1643ffc93b94d14c05b739590ade85557d338a21040',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'efa6f67078810875513a116b389886610d81ecf6daf97d55dd96d3fdd201dfac',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 660978,
+ tx_hash:
+ 'b622b770f74f056e07e5d2ea4d7f8da1c4d865e21e11c31a263602a38d4a2474',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 660982,
+ tx_hash:
+ '67605f3d18135b52d95a4877a427d100c14f2610c63ee84eaf4856f883a0b70e',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 662159,
+ tx_hash:
+ '05e90e9f35bc041a2939e0e28cf9c436c9adb0f247a7fb0d1f4abb26d418f096',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 662799,
+ tx_hash:
+ 'b399a5ae69e4ac4c96b27c680a541e6b8142006bdc2484a959821858fc0b4ca3',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 662935,
+ tx_hash:
+ 'ec423d0089f5cd85973ff6d875e9507f6b396b3b82bf6e9f5cfb24b7c70273bd',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 662987,
+ tx_hash:
+ '9b4361b24c756ff7a74ea5261be565acade0b246fb85422086ac273c1e4ee7d5',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 667561,
+ tx_hash:
+ '4ca7f70996c699b0f988597a2dd2700f1f24f305318ddc8fe137d96d5fa96bf5',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'de912bc7a6a1b14abe04960cd9a0ef88a4f59eb04db765f7bc2c0d2c2f997054',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'e25cebd4cccbbdd91b36f672d51f5ce978e0817839be9854c3550704aec4359d',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'e9a94cc174839e3659d2fe4d33490528d18ad91404b65eb8cc35d8fa2d3f5096',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 667751,
+ tx_hash:
+ '05e87142de1bb8c2a43d22a2e4b97855eb84c3c76f4ea956a654efda8d0557ca',
+ tx_pos: 1,
+ value: 546,
+ },
+ ],
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ utxos: [
+ {
+ height: 660971,
+ tx_hash:
+ 'aefc3f3c65760d0f0fa716a84d12c4dc76ca7552953d6c7a4358abb6e24c5d7c',
+ tx_pos: 1,
+ value: 546,
+ },
+ ],
+ address: 'bitcoincash:qrcl220pxeec78vnchwyh6fsdyf60uv9tcynw3u2ev',
+ },
+ {
+ utxos: [
+ {
+ height: 666954,
+ tx_hash:
+ '1b19314963be975c57eb37df12b6a8e0598bcb743226cdc684895520f51c4dfe',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 666969,
+ tx_hash:
+ '99583b593a3bec993328b076f4988fd77b8423d788183bf2968ed43cec11c454',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 667560,
+ tx_hash:
+ '34002080b2e1b42ff9f33d36dbbd0d8f1aaddc5a00b916054a40c45feebaf548',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 667560,
+ tx_hash:
+ '8edccfafe4b002da8f1aa71daae31846c51848968e7d92dcba5f0ff97beb734d',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 667793,
+ tx_hash:
+ '9c295332b7bc16758b2e328f21189fa0ea79f71908b47529749b3ba54e523817',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 667909,
+ tx_hash:
+ '5bb8f9831d616b3a859ffec4507f66bd5f2f3c057d7f5d5fa5c026216d6c2646',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 667909,
+ tx_hash:
+ 'd3183b663a8d67b2b558654896b95102bbe68d164de219da96273ae52de93813',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 668550,
+ tx_hash:
+ '38a692e3fa974ee186eedc3a03bf3410dd03a5f35bc44f1a07f287b669dce44b',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 668779,
+ tx_hash:
+ '24604835e5c68aedad2dbf4200ecc1af8c3fa92738445323af86def84d48d572',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 669057,
+ tx_hash:
+ 'dd560d87bd632e40c6548021006653a150197ede13fadb5eadfa29abe4400d0e',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 669510,
+ tx_hash:
+ 'acbb66f826211f40b89e84d9bd2143dfb541d67e1e3c664b17ccd3ba66327a9e',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 669639,
+ tx_hash:
+ '0da6d49cf95d4603958e53360ad1e90bfccef41bfb327d6b2e8a77e242fa2d58',
+ tx_pos: 0,
+ value: 1000,
+ },
+ {
+ height: 669639,
+ tx_hash:
+ '39521b38cd1b6126a57a68b8adfd836020cd53b195f3b4675c58095c5c300ef8',
+ tx_pos: 0,
+ value: 700000,
+ },
+ {
+ height: 669639,
+ tx_hash:
+ '93949923f02cb5271bd6d0b5a5b937ce5ae22df5bf6117161078f175f0c29d56',
+ tx_pos: 0,
+ value: 700000,
+ },
+ {
+ height: 669639,
+ tx_hash:
+ 'ddace66ea968e16e55ebf218814401acc38e0a39150529fa3d1108af04e81373',
+ tx_pos: 0,
+ value: 300000,
+ },
+ {
+ height: 669639,
+ tx_hash:
+ 'f1147285ac384159b5dfae513bda47a0459f876d046b48f13c8a7ec4f0d20d96',
+ tx_pos: 0,
+ value: 700000,
+ },
+ {
+ height: 669639,
+ tx_hash:
+ 'f4ca891d090f2682c7086b27a4d3bc2ed1543fb96123b6649e8f26b644a45b51',
+ tx_pos: 0,
+ value: 30000,
+ },
+ ],
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+];
diff --git a/web/cashtab-v2/src/hooks/__mocks__/mockTxDataWithPassthrough.js b/web/cashtab-v2/src/hooks/__mocks__/mockTxDataWithPassthrough.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/__mocks__/mockTxDataWithPassthrough.js
@@ -0,0 +1,942 @@
+export default [
+ {
+ txid: '089f2188d5771a7de0589def2b8d6c1a1f33f45b6de26d9a0ef32782f019ecf1',
+ hash: '089f2188d5771a7de0589def2b8d6c1a1f33f45b6de26d9a0ef32782f019ecf1',
+ version: 2,
+ size: 225,
+ locktime: 0,
+ vin: [
+ {
+ txid: 'b96da810b15deb312ad4508a165033ca8ffa282f88e5b7b0e79be09a0b0424f9',
+ vout: 1,
+ scriptSig: {
+ asm: '3044022064084d72b1bb7ca148d1950cf07494ffb397cb3df53b72afa8bd844b80369ecd02203ae21f14ba5019f38bc0b80b99e7c8cc1d5d3360ca7bab56be28ef583fe5c6a6[ALL|FORKID] 02c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+ hex: '473044022064084d72b1bb7ca148d1950cf07494ffb397cb3df53b72afa8bd844b80369ecd02203ae21f14ba5019f38bc0b80b99e7c8cc1d5d3360ca7bab56be28ef583fe5c6a6412102c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+ },
+ sequence: 4294967295,
+ },
+ ],
+ vout: [
+ {
+ value: 0.000042,
+ n: 0,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 6e1da64f04fc29dbe0b8d33a341e05e3afc586eb OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a9146e1da64f04fc29dbe0b8d33a341e05e3afc586eb88ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ ],
+ },
+ },
+ {
+ value: 0.6244967,
+ n: 1,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 76458db0ed96fe9863fc1ccec9fa2cfab884b0f6 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ ],
+ },
+ },
+ ],
+ hex: '0200000001f924040b9ae09be7b0b7e5882f28fa8fca3350168a50d42a31eb5db110a86db9010000006a473044022064084d72b1bb7ca148d1950cf07494ffb397cb3df53b72afa8bd844b80369ecd02203ae21f14ba5019f38bc0b80b99e7c8cc1d5d3360ca7bab56be28ef583fe5c6a6412102c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795ffffffff0268100000000000001976a9146e1da64f04fc29dbe0b8d33a341e05e3afc586eb88ac06e8b803000000001976a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac00000000',
+ blockhash:
+ '000000000000000087dd4ca6308e835edfba871fee36d3e53ad3c9545c4b1719',
+ confirmations: 2721,
+ time: 1614380741,
+ blocktime: 1614380741,
+ height: 674993,
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+ {
+ txid: 'ffe3a7500dbcc98021ad581c98d9947054d1950a7f3416664715066d3d20ad72',
+ hash: 'ffe3a7500dbcc98021ad581c98d9947054d1950a7f3416664715066d3d20ad72',
+ version: 2,
+ size: 480,
+ locktime: 0,
+ vin: [
+ {
+ txid: 'b980b35b794ad73d8aae312385e82d9be8086e7b743e1c6a468db8db8ac74bd8',
+ vout: 3,
+ scriptSig: {
+ asm: '30440220538de8f61d716c899e6a2cd78ca46162edaaa5f0d000ebbbc875608e5639170a02206a7fc8f7c16cef1c56667a8da6d5e480f440ecf43238879ad9f8785a0473a72b[ALL|FORKID] 02c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+ hex: '4730440220538de8f61d716c899e6a2cd78ca46162edaaa5f0d000ebbbc875608e5639170a02206a7fc8f7c16cef1c56667a8da6d5e480f440ecf43238879ad9f8785a0473a72b412102c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+ },
+ sequence: 4294967295,
+ },
+ {
+ txid: 'b980b35b794ad73d8aae312385e82d9be8086e7b743e1c6a468db8db8ac74bd8',
+ vout: 2,
+ scriptSig: {
+ asm: '3045022100ce03e19bd181b903adc6f192d4ad0900e6816f6e62282cefff05c22cf36a647602202b296a2ed1805f0b0a9aa5f99158685298e7a0aff406fedb8abb8e0afaf48ca4[ALL|FORKID] 02c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+ hex: '483045022100ce03e19bd181b903adc6f192d4ad0900e6816f6e62282cefff05c22cf36a647602202b296a2ed1805f0b0a9aa5f99158685298e7a0aff406fedb8abb8e0afaf48ca4412102c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+ },
+ sequence: 4294967295,
+ },
+ ],
+ vout: [
+ {
+ value: 0,
+ n: 0,
+ scriptPubKey: {
+ asm: 'OP_RETURN 5262419 1 1145980243 50d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e 0000000000000003 000000000000005e',
+ hex: '6a04534c500001010453454e442050d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e08000000000000000308000000000000005e',
+ type: 'nulldata',
+ },
+ },
+ {
+ value: 0.00000546,
+ n: 1,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 a5417349420ec53b27522fed1a63b1672c0f28ff OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a914a5417349420ec53b27522fed1a63b1672c0f28ff88ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qzj5zu6fgg8v2we82gh76xnrk9njcregluzgaztm45',
+ ],
+ },
+ },
+ {
+ value: 0.00000546,
+ n: 2,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 76458db0ed96fe9863fc1ccec9fa2cfab884b0f6 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ ],
+ },
+ },
+ {
+ value: 4.99996074,
+ n: 3,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 76458db0ed96fe9863fc1ccec9fa2cfab884b0f6 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ ],
+ },
+ },
+ ],
+ hex: '0200000002d84bc78adbb88d466a1c3e747b6e08e89b2de8852331ae8a3dd74a795bb380b9030000006a4730440220538de8f61d716c899e6a2cd78ca46162edaaa5f0d000ebbbc875608e5639170a02206a7fc8f7c16cef1c56667a8da6d5e480f440ecf43238879ad9f8785a0473a72b412102c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795ffffffffd84bc78adbb88d466a1c3e747b6e08e89b2de8852331ae8a3dd74a795bb380b9020000006b483045022100ce03e19bd181b903adc6f192d4ad0900e6816f6e62282cefff05c22cf36a647602202b296a2ed1805f0b0a9aa5f99158685298e7a0aff406fedb8abb8e0afaf48ca4412102c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795ffffffff040000000000000000406a04534c500001010453454e442050d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e08000000000000000308000000000000005e22020000000000001976a914a5417349420ec53b27522fed1a63b1672c0f28ff88ac22020000000000001976a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688acaa55cd1d000000001976a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac00000000',
+ blockhash:
+ '00000000000000007053867de29516374a23d7adfb08ccb47cfbea0e98a49e5b',
+ confirmations: 3270,
+ time: 1614027278,
+ blocktime: 1614027278,
+ height: 674444,
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+ {
+ txid: 'b980b35b794ad73d8aae312385e82d9be8086e7b743e1c6a468db8db8ac74bd8',
+ hash: 'b980b35b794ad73d8aae312385e82d9be8086e7b743e1c6a468db8db8ac74bd8',
+ version: 2,
+ size: 479,
+ locktime: 0,
+ vin: [
+ {
+ txid: 'ec9c20c2c5cd5aa4c9261a9f97e68734b175962c4b3d9edc996dd415dd03c2e7',
+ vout: 0,
+ scriptSig: {
+ asm: '3044022075cb93e60ffb792b2715d96f3d31033e8f385bb9bfeadf99f7b1055d749a33cc022028292ee8ffaed64cbc6f9b680db36e031250672a6b0c5cfd23f9a61977d52ed7[ALL|FORKID] 02c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+ hex: '473044022075cb93e60ffb792b2715d96f3d31033e8f385bb9bfeadf99f7b1055d749a33cc022028292ee8ffaed64cbc6f9b680db36e031250672a6b0c5cfd23f9a61977d52ed7412102c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+ },
+ sequence: 4294967295,
+ address:
+ 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+ {
+ txid: '618d0dd8c0c5fa5a34c6515c865dd72bb76f8311cd6ee9aef153bab20dabc0e6',
+ vout: 1,
+ scriptSig: {
+ asm: '304402203ea0558cd917eb8f6c286e79ffcc5dd1f5accb66c2e5836628d6be6f9d03ca260220120a6da92b6f44bdfcd3ef7b08263d3f73d99ff4b1f83b8f998ff1355f3f0d2e[ALL|FORKID] 02c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+ hex: '47304402203ea0558cd917eb8f6c286e79ffcc5dd1f5accb66c2e5836628d6be6f9d03ca260220120a6da92b6f44bdfcd3ef7b08263d3f73d99ff4b1f83b8f998ff1355f3f0d2e412102c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+ },
+ sequence: 4294967295,
+ },
+ ],
+ vout: [
+ {
+ value: 0,
+ n: 0,
+ scriptPubKey: {
+ asm: 'OP_RETURN 5262419 1 1145980243 50d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e 0000000000000003 0000000000000061',
+ hex: '6a04534c500001010453454e442050d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e080000000000000003080000000000000061',
+ type: 'nulldata',
+ },
+ },
+ {
+ value: 0.00000546,
+ n: 1,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 d4fa9121bcd065dd93e58831569cf51ef5a74f61 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a914d4fa9121bcd065dd93e58831569cf51ef5a74f6188ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qr204yfphngxthvnukyrz45u7500tf60vyea48xwmd',
+ ],
+ },
+ },
+ {
+ value: 0.00000546,
+ n: 2,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 76458db0ed96fe9863fc1ccec9fa2cfab884b0f6 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ ],
+ },
+ },
+ {
+ value: 4.99998974,
+ n: 3,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 76458db0ed96fe9863fc1ccec9fa2cfab884b0f6 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ ],
+ },
+ },
+ ],
+ hex: '0200000002e7c203dd15d46d99dc9e3d4b2c9675b13487e6979f1a26c9a45acdc5c2209cec000000006a473044022075cb93e60ffb792b2715d96f3d31033e8f385bb9bfeadf99f7b1055d749a33cc022028292ee8ffaed64cbc6f9b680db36e031250672a6b0c5cfd23f9a61977d52ed7412102c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795ffffffffe6c0ab0db2ba53f1aee96ecd11836fb72bd75d865c51c6345afac5c0d80d8d61010000006a47304402203ea0558cd917eb8f6c286e79ffcc5dd1f5accb66c2e5836628d6be6f9d03ca260220120a6da92b6f44bdfcd3ef7b08263d3f73d99ff4b1f83b8f998ff1355f3f0d2e412102c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795ffffffff040000000000000000406a04534c500001010453454e442050d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e08000000000000000308000000000000006122020000000000001976a914d4fa9121bcd065dd93e58831569cf51ef5a74f6188ac22020000000000001976a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688acfe60cd1d000000001976a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac00000000',
+ blockhash:
+ '0000000000000000a9f812d56e2249b7c462ce499a0852bdfe20bb46c1bb9f92',
+ confirmations: 3278,
+ time: 1614021424,
+ blocktime: 1614021424,
+ height: 674436,
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+ {
+ txid: '618d0dd8c0c5fa5a34c6515c865dd72bb76f8311cd6ee9aef153bab20dabc0e6',
+ hash: '618d0dd8c0c5fa5a34c6515c865dd72bb76f8311cd6ee9aef153bab20dabc0e6',
+ version: 2,
+ size: 436,
+ locktime: 0,
+ vin: [
+ {
+ txid: '50d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e',
+ vout: 3,
+ scriptSig: {
+ asm: '30440220664f988b86035ddcdff6e9c3b8e140712eca297750d056e41577a0bf0059e7ff022030982b3fcab1cab5d6086bc935e941e7d22efbb0ad5ccca0268515c5c8306089[ALL|FORKID] 034509251caa5f01e2787c436949eb94d71dcc451bcde5791ae5b7109255f5f0a3',
+ hex: '4730440220664f988b86035ddcdff6e9c3b8e140712eca297750d056e41577a0bf0059e7ff022030982b3fcab1cab5d6086bc935e941e7d22efbb0ad5ccca0268515c5c83060894121034509251caa5f01e2787c436949eb94d71dcc451bcde5791ae5b7109255f5f0a3',
+ },
+ sequence: 4294967295,
+ },
+ {
+ txid: '50d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e',
+ vout: 1,
+ scriptSig: {
+ asm: '304402203ce88e0a95d5581ad567c0468c87a08027aa5ecdecd614a168d833d7ecc02c1c022013ddd81147b44ad5488107d5c4d535f7f59e9fa46840451d39422aace284b2b7[ALL|FORKID] 034509251caa5f01e2787c436949eb94d71dcc451bcde5791ae5b7109255f5f0a3',
+ hex: '47304402203ce88e0a95d5581ad567c0468c87a08027aa5ecdecd614a168d833d7ecc02c1c022013ddd81147b44ad5488107d5c4d535f7f59e9fa46840451d39422aace284b2b74121034509251caa5f01e2787c436949eb94d71dcc451bcde5791ae5b7109255f5f0a3',
+ },
+ sequence: 4294967295,
+ },
+ ],
+ vout: [
+ {
+ value: 0,
+ n: 0,
+ scriptPubKey: {
+ asm: 'OP_RETURN 5262419 1 1145980243 50d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e 0000000000000064',
+ hex: '6a04534c500001010453454e442050d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e080000000000000064',
+ type: 'nulldata',
+ },
+ },
+ {
+ value: 0.00000546,
+ n: 1,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 76458db0ed96fe9863fc1ccec9fa2cfab884b0f6 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ ],
+ },
+ },
+ {
+ value: 0.00088064,
+ n: 2,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 b8d9512d2adf8b4e70c45c26b6b00d75c28eaa96 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a914b8d9512d2adf8b4e70c45c26b6b00d75c28eaa9688ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qzudj5fd9t0cknnsc3wzdd4sp46u9r42jcnqnwfss0',
+ ],
+ },
+ },
+ ],
+ hex: '02000000020e41711243954c8ffe409761e994272af43ced6f56c8c6afa7cd55622c29d850030000006a4730440220664f988b86035ddcdff6e9c3b8e140712eca297750d056e41577a0bf0059e7ff022030982b3fcab1cab5d6086bc935e941e7d22efbb0ad5ccca0268515c5c83060894121034509251caa5f01e2787c436949eb94d71dcc451bcde5791ae5b7109255f5f0a3ffffffff0e41711243954c8ffe409761e994272af43ced6f56c8c6afa7cd55622c29d850010000006a47304402203ce88e0a95d5581ad567c0468c87a08027aa5ecdecd614a168d833d7ecc02c1c022013ddd81147b44ad5488107d5c4d535f7f59e9fa46840451d39422aace284b2b74121034509251caa5f01e2787c436949eb94d71dcc451bcde5791ae5b7109255f5f0a3ffffffff030000000000000000376a04534c500001010453454e442050d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e08000000000000006422020000000000001976a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac00580100000000001976a914b8d9512d2adf8b4e70c45c26b6b00d75c28eaa9688ac00000000',
+ blockhash:
+ '000000000000000034c77993a35c74fe2dddace27198681ca1e89e928d0c2fff',
+ confirmations: 3571,
+ time: 1613859311,
+ blocktime: 1613859311,
+ height: 674143,
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+ {
+ txid: 'f90631b48521a4147dd9dd7091ce936eddc0c3e6221ec87fa4fabacc453a0b95',
+ hash: 'f90631b48521a4147dd9dd7091ce936eddc0c3e6221ec87fa4fabacc453a0b95',
+ version: 2,
+ size: 437,
+ locktime: 0,
+ vin: [
+ {
+ txid: 'db464f77ac97deabc28df07a7e4a2e261c854a8ec4dc959b89b10531966f6cbf',
+ vout: 0,
+ scriptSig: {
+ asm: '3044022065622a7aa065f56abe84f3589c983a768e3ef5d72c9352991d6b584a2a16dcb802200c1c0065106207715a024624ed951e851d4f742c55a704e9531bebd2ef84fc14[ALL|FORKID] 0352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ hex: '473044022065622a7aa065f56abe84f3589c983a768e3ef5d72c9352991d6b584a2a16dcb802200c1c0065106207715a024624ed951e851d4f742c55a704e9531bebd2ef84fc1441210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ },
+ sequence: 4294967295,
+ },
+ {
+ txid: 'acbb66f826211f40b89e84d9bd2143dfb541d67e1e3c664b17ccd3ba66327a9e',
+ vout: 1,
+ scriptSig: {
+ asm: '3045022100b475cf7d1eaf37641d2107f13be0ef9acbd17b252ed3f9ae349edfdcd6a97cf402202bf2852dfa905e6d50c96a622d2838408ceb979245a4342d5096acc938135804[ALL|FORKID] 0352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ hex: '483045022100b475cf7d1eaf37641d2107f13be0ef9acbd17b252ed3f9ae349edfdcd6a97cf402202bf2852dfa905e6d50c96a622d2838408ceb979245a4342d5096acc93813580441210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ },
+ sequence: 4294967295,
+ },
+ ],
+ vout: [
+ {
+ value: 0,
+ n: 0,
+ scriptPubKey: {
+ asm: 'OP_RETURN 5262419 1 1145980243 bfddfcfc9fb9a8d61ed74fa94b5e32ccc03305797eea461658303df5805578ef 0000000000000001',
+ hex: '6a04534c500001010453454e4420bfddfcfc9fb9a8d61ed74fa94b5e32ccc03305797eea461658303df5805578ef080000000000000001',
+ type: 'nulldata',
+ },
+ },
+ {
+ value: 0.00000546,
+ n: 1,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 76458db0ed96fe9863fc1ccec9fa2cfab884b0f6 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ ],
+ },
+ },
+ {
+ value: 9.99997101,
+ n: 2,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 6e1da64f04fc29dbe0b8d33a341e05e3afc586eb OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a9146e1da64f04fc29dbe0b8d33a341e05e3afc586eb88ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ ],
+ },
+ },
+ ],
+ hex: '0200000002bf6c6f963105b1899b95dcc48e4a851c262e4a7e7af08dc2abde97ac774f46db000000006a473044022065622a7aa065f56abe84f3589c983a768e3ef5d72c9352991d6b584a2a16dcb802200c1c0065106207715a024624ed951e851d4f742c55a704e9531bebd2ef84fc1441210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22dffffffff9e7a3266bad3cc174b663c1e7ed641b5df4321bdd9849eb8401f2126f866bbac010000006b483045022100b475cf7d1eaf37641d2107f13be0ef9acbd17b252ed3f9ae349edfdcd6a97cf402202bf2852dfa905e6d50c96a622d2838408ceb979245a4342d5096acc93813580441210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22dffffffff030000000000000000376a04534c500001010453454e4420bfddfcfc9fb9a8d61ed74fa94b5e32ccc03305797eea461658303df5805578ef08000000000000000122020000000000001976a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688acadbe9a3b000000001976a9146e1da64f04fc29dbe0b8d33a341e05e3afc586eb88ac00000000',
+ blockhash:
+ '0000000000000000132378b84a7477b7d601faedec302264bde1e89b1480e364',
+ confirmations: 5013,
+ time: 1612966022,
+ blocktime: 1612966022,
+ height: 672701,
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+ {
+ txid: '42d39fbe068a40fe691f987b22fdf04b80f94d71d2fec20a58125e7b1a06d2a9',
+ hash: '42d39fbe068a40fe691f987b22fdf04b80f94d71d2fec20a58125e7b1a06d2a9',
+ version: 2,
+ size: 226,
+ locktime: 0,
+ vin: [
+ {
+ txid: '5e0436c6741e226d05c5b7e7e23de8213d3583e2669e50a80b908bf4cb471317',
+ vout: 1,
+ scriptSig: {
+ asm: '3045022100f8a8eca8f5d6149511c518d41015512f8164a5be6f01e9efd609db9a429f4872022059121e122043b43eae77b5e132b8f798a290e6eed8a2026a0656540cd1bd752b[ALL|FORKID] 0352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ hex: '483045022100f8a8eca8f5d6149511c518d41015512f8164a5be6f01e9efd609db9a429f4872022059121e122043b43eae77b5e132b8f798a290e6eed8a2026a0656540cd1bd752b41210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ },
+ sequence: 4294967295,
+ },
+ ],
+ vout: [
+ {
+ value: 3,
+ n: 0,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 76458db0ed96fe9863fc1ccec9fa2cfab884b0f6 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ ],
+ },
+ },
+ {
+ value: 6.9999586,
+ n: 1,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 6e1da64f04fc29dbe0b8d33a341e05e3afc586eb OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a9146e1da64f04fc29dbe0b8d33a341e05e3afc586eb88ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ ],
+ },
+ },
+ ],
+ hex: '0200000001171347cbf48b900ba8509e66e283353d21e83de2e7b7c5056d221e74c636045e010000006b483045022100f8a8eca8f5d6149511c518d41015512f8164a5be6f01e9efd609db9a429f4872022059121e122043b43eae77b5e132b8f798a290e6eed8a2026a0656540cd1bd752b41210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22dffffffff0200a3e111000000001976a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688acd416b929000000001976a9146e1da64f04fc29dbe0b8d33a341e05e3afc586eb88ac00000000',
+ blockhash:
+ '00000000000000008f563edf8604e537fe0d1e80f1c7c2d97dd094824f804ba3',
+ confirmations: 5637,
+ time: 1612567121,
+ blocktime: 1612567121,
+ height: 672077,
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+ {
+ txid: 'b96da810b15deb312ad4508a165033ca8ffa282f88e5b7b0e79be09a0b0424f9',
+ hash: 'b96da810b15deb312ad4508a165033ca8ffa282f88e5b7b0e79be09a0b0424f9',
+ version: 2,
+ size: 226,
+ locktime: 0,
+ vin: [
+ {
+ txid: '9ad75af97f0617a3729c2bd31bf7c4b380230e661cc921a3c6be0febc75a3e49',
+ vout: 1,
+ scriptSig: {
+ asm: '3045022100d59e6fad4d1d57796f229a7d4aa3b01fc3241132dae9bc406c66fa33d7aef21c022036a5f432d6d99f65848ac12c00bde2b5ba7e63a9f9a74349d9ab8ec39db26f8e[ALL|FORKID] 02c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+ hex: '483045022100d59e6fad4d1d57796f229a7d4aa3b01fc3241132dae9bc406c66fa33d7aef21c022036a5f432d6d99f65848ac12c00bde2b5ba7e63a9f9a74349d9ab8ec39db26f8e412102c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+ },
+ sequence: 4294967295,
+ },
+ ],
+ vout: [
+ {
+ value: 0.12345,
+ n: 0,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 6e1da64f04fc29dbe0b8d33a341e05e3afc586eb OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a9146e1da64f04fc29dbe0b8d33a341e05e3afc586eb88ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ ],
+ },
+ },
+ {
+ value: 0.62455003,
+ n: 1,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 76458db0ed96fe9863fc1ccec9fa2cfab884b0f6 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ ],
+ },
+ },
+ ],
+ hex: '0200000001493e5ac7eb0fbec6a321c91c660e2380b3c4f71bd32b9c72a317067ff95ad79a010000006b483045022100d59e6fad4d1d57796f229a7d4aa3b01fc3241132dae9bc406c66fa33d7aef21c022036a5f432d6d99f65848ac12c00bde2b5ba7e63a9f9a74349d9ab8ec39db26f8e412102c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795ffffffff02a85ebc00000000001976a9146e1da64f04fc29dbe0b8d33a341e05e3afc586eb88acdbfcb803000000001976a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac00000000',
+ blockhash:
+ '00000000000000008f563edf8604e537fe0d1e80f1c7c2d97dd094824f804ba3',
+ confirmations: 5637,
+ time: 1612567121,
+ blocktime: 1612567121,
+ height: 672077,
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+ {
+ txid: 'db464f77ac97deabc28df07a7e4a2e261c854a8ec4dc959b89b10531966f6cbf',
+ hash: 'db464f77ac97deabc28df07a7e4a2e261c854a8ec4dc959b89b10531966f6cbf',
+ version: 2,
+ size: 225,
+ locktime: 0,
+ vin: [
+ {
+ txid: '1452267e57429edcfdcb1184b24becea6ddf8f8a4f8e130dad6248545d9f8e75',
+ vout: 1,
+ scriptSig: {
+ asm: '30440220184921bfce634a57b5220f06b11b64c0cb7e67ecd9c634335e3e933e35a7a969022038b2074e1d75aa4f6945d150bae5b8a1d426f4284da2b96336fa0fc741eb6de7[ALL|FORKID] 02c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+ hex: '4730440220184921bfce634a57b5220f06b11b64c0cb7e67ecd9c634335e3e933e35a7a969022038b2074e1d75aa4f6945d150bae5b8a1d426f4284da2b96336fa0fc741eb6de7412102c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+ },
+ sequence: 4294967295,
+ },
+ ],
+ vout: [
+ {
+ value: 10.00000001,
+ n: 0,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 6e1da64f04fc29dbe0b8d33a341e05e3afc586eb OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a9146e1da64f04fc29dbe0b8d33a341e05e3afc586eb88ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ ],
+ },
+ },
+ {
+ value: 2.8830607,
+ n: 1,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 76458db0ed96fe9863fc1ccec9fa2cfab884b0f6 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ ],
+ },
+ },
+ ],
+ hex: '0200000001758e9f5d544862ad0d138e4f8a8fdf6deaec4bb28411cbfddc9e42577e265214010000006a4730440220184921bfce634a57b5220f06b11b64c0cb7e67ecd9c634335e3e933e35a7a969022038b2074e1d75aa4f6945d150bae5b8a1d426f4284da2b96336fa0fc741eb6de7412102c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795ffffffff0201ca9a3b000000001976a9146e1da64f04fc29dbe0b8d33a341e05e3afc586eb88ac96332f11000000001976a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac00000000',
+ blockhash:
+ '00000000000000008f563edf8604e537fe0d1e80f1c7c2d97dd094824f804ba3',
+ confirmations: 5637,
+ time: 1612567121,
+ blocktime: 1612567121,
+ height: 672077,
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+ {
+ txid: 'e32c20137e590f253b8d198608f7fffd428fc0bd7a9a0675bb6af091d1cb2ea4',
+ hash: 'e32c20137e590f253b8d198608f7fffd428fc0bd7a9a0675bb6af091d1cb2ea4',
+ version: 2,
+ size: 373,
+ locktime: 0,
+ vin: [
+ {
+ txid: 'f63e890423b3bffa6e01be2dcb4942940c2e8a1985926411558a22d1b5dd0e29',
+ vout: 1,
+ scriptSig: {
+ asm: '3045022100c7f51ff0888c182a1a60c08904d8116c9d2e31cb7d2fd5b63c2bf9fd7b246fc102202ee786d2052448621c4a04d18d13c83ac5ee27008dd079e8ba954f8197ff3c6c[ALL|FORKID] 02c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+ hex: '483045022100c7f51ff0888c182a1a60c08904d8116c9d2e31cb7d2fd5b63c2bf9fd7b246fc102202ee786d2052448621c4a04d18d13c83ac5ee27008dd079e8ba954f8197ff3c6c412102c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+ },
+ sequence: 4294967295,
+ },
+ {
+ txid: '42d39fbe068a40fe691f987b22fdf04b80f94d71d2fec20a58125e7b1a06d2a9',
+ vout: 0,
+ scriptSig: {
+ asm: '304402201bbfcd0c120ace9b8c7a6f5e77b61236bb1128e2a757f85ba80101885e9c1212022046fed4006dcd6a236034dede77c566acf74824d14b3ee3da884e9bd93884ff93[ALL|FORKID] 02c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+ hex: '47304402201bbfcd0c120ace9b8c7a6f5e77b61236bb1128e2a757f85ba80101885e9c1212022046fed4006dcd6a236034dede77c566acf74824d14b3ee3da884e9bd93884ff93412102c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+ },
+ sequence: 4294967295,
+ },
+ ],
+ vout: [
+ {
+ value: 1.8725994,
+ n: 0,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 6e1da64f04fc29dbe0b8d33a341e05e3afc586eb OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a9146e1da64f04fc29dbe0b8d33a341e05e3afc586eb88ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ ],
+ },
+ },
+ {
+ value: 1.49237053,
+ n: 1,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 76458db0ed96fe9863fc1ccec9fa2cfab884b0f6 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ ],
+ },
+ },
+ ],
+ hex: '0200000002290eddb5d1228a5511649285198a2e0c944249cb2dbe016efabfb32304893ef6010000006b483045022100c7f51ff0888c182a1a60c08904d8116c9d2e31cb7d2fd5b63c2bf9fd7b246fc102202ee786d2052448621c4a04d18d13c83ac5ee27008dd079e8ba954f8197ff3c6c412102c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795ffffffffa9d2061a7b5e12580ac2fed2714df9804bf0fd227b981f69fe408a06be9fd342000000006a47304402201bbfcd0c120ace9b8c7a6f5e77b61236bb1128e2a757f85ba80101885e9c1212022046fed4006dcd6a236034dede77c566acf74824d14b3ee3da884e9bd93884ff93412102c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795ffffffff02245c290b000000001976a9146e1da64f04fc29dbe0b8d33a341e05e3afc586eb88ac3d2de508000000001976a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac00000000',
+ blockhash:
+ '00000000000000008f563edf8604e537fe0d1e80f1c7c2d97dd094824f804ba3',
+ confirmations: 5637,
+ time: 1612567121,
+ blocktime: 1612567121,
+ height: 672077,
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+ {
+ txid: 'ec9c20c2c5cd5aa4c9261a9f97e68734b175962c4b3d9edc996dd415dd03c2e7',
+ hash: 'ec9c20c2c5cd5aa4c9261a9f97e68734b175962c4b3d9edc996dd415dd03c2e7',
+ version: 2,
+ size: 1405,
+ locktime: 0,
+ vin: [
+ {
+ txid: '3507d73b0bb82421d64ae79f469943e56f15d7db954ad235f48ede33c718d860',
+ vout: 0,
+ scriptSig: {
+ asm: '3044022000cc5b79e5da60cf4935f3a172089cd9b631b678462ee29091dc610816d059c4022002e3b6f32e825ac04d2907453d6d647a32a995c798df1c68401cc461f6bfbd3a[ALL|FORKID] 0352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ hex: '473044022000cc5b79e5da60cf4935f3a172089cd9b631b678462ee29091dc610816d059c4022002e3b6f32e825ac04d2907453d6d647a32a995c798df1c68401cc461f6bfbd3a41210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ },
+ sequence: 4294967295,
+ },
+ {
+ txid: '8f73a718d907d94e60c5f73f299bd01dc5b1c163c4ebc26b5304e37a1a7f34af',
+ vout: 0,
+ scriptSig: {
+ asm: '3045022100ac50553448f2a5fab1177ed0bc64541b2dba063d04f2d69a8a1d216fb1435e5802202c7f6abd1685a6d81f14ac3bdb0874d214a5f4260719f9c5dc519ac5d8dffd37[ALL|FORKID] 0352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ hex: '483045022100ac50553448f2a5fab1177ed0bc64541b2dba063d04f2d69a8a1d216fb1435e5802202c7f6abd1685a6d81f14ac3bdb0874d214a5f4260719f9c5dc519ac5d8dffd3741210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ },
+ sequence: 4294967295,
+ },
+ {
+ txid: 'd38b76bacd6aa75ad2d6fcfd994533e54d0541435970eace49486fde9d6ee2e3',
+ vout: 0,
+ scriptSig: {
+ asm: '304502210091836c6cb4c786bd3b74b73e579ddf8b843ba51841e5675fa53608449b67371802203de75f32b684cfe2d2e9cd424ea6eb4f49248e6698365c9364ebf84cd6e50eab[ALL|FORKID] 0352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ hex: '48304502210091836c6cb4c786bd3b74b73e579ddf8b843ba51841e5675fa53608449b67371802203de75f32b684cfe2d2e9cd424ea6eb4f49248e6698365c9364ebf84cd6e50eab41210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ },
+ sequence: 4294967295,
+ },
+ {
+ txid: 'd47607a72d6bc093556fa7f2cec9d67719bd627751d5d27bc53c4eb8eb6f54e5',
+ vout: 0,
+ scriptSig: {
+ asm: '3045022100e7727d9d26c645282553aef27947ad6795bc89b505ad089d617b6f696399352802206c736524a1410ed3e30cf1127f7f02c9a249392f8f8e7c670250472909d1c0d6[ALL|FORKID] 0352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ hex: '483045022100e7727d9d26c645282553aef27947ad6795bc89b505ad089d617b6f696399352802206c736524a1410ed3e30cf1127f7f02c9a249392f8f8e7c670250472909d1c0d641210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ },
+ sequence: 4294967295,
+ },
+ {
+ txid: '33f246811f794c4b64098a64c698ae5811054b13e289256a18e2d142beef57e7',
+ vout: 1,
+ scriptSig: {
+ asm: '304402203fe78ad5aaeefab7b3b2277eefc4a2ace9c2e92694b46bf4a76927bf2b82017102200ded59336aba269a54865d9fdd99e72081c0318ccbc37bc0fc0c72b60ae35382[ALL|FORKID] 0352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ hex: '47304402203fe78ad5aaeefab7b3b2277eefc4a2ace9c2e92694b46bf4a76927bf2b82017102200ded59336aba269a54865d9fdd99e72081c0318ccbc37bc0fc0c72b60ae3538241210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ },
+ sequence: 4294967295,
+ },
+ {
+ txid: '25f915d2912524ad602c882211ccaf479d6bf87ef7c24d1be0f325cec3727257',
+ vout: 0,
+ scriptSig: {
+ asm: '30440220670af03605b9495c8ecee357889ceeb137dadaa1662136fdc55c28fe9434e3c60220285195a62811941745a9f93e136e59c96b81d5b0d9525f3d16d001bc0f6fa9bb[ALL|FORKID] 0352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ hex: '4730440220670af03605b9495c8ecee357889ceeb137dadaa1662136fdc55c28fe9434e3c60220285195a62811941745a9f93e136e59c96b81d5b0d9525f3d16d001bc0f6fa9bb41210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ },
+ sequence: 4294967295,
+ },
+ {
+ txid: 'c9044b4d7438d006a722ef85474c8127265eced4f72c7d71c2f714444bc0e1f2',
+ vout: 0,
+ scriptSig: {
+ asm: '304402203f822a0b207ed49e6918663133a18037c24498c2f770c2649333a32f523e259d02203afc42a79d0da123b67f814effeee7c05c7996ea829b3cfa46c5c2e74209c096[ALL|FORKID] 0352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ hex: '47304402203f822a0b207ed49e6918663133a18037c24498c2f770c2649333a32f523e259d02203afc42a79d0da123b67f814effeee7c05c7996ea829b3cfa46c5c2e74209c09641210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ },
+ sequence: 4294967295,
+ },
+ {
+ txid: '045306f0019ae0d977de7ff17dd55e861b3fe94458693ee2b94ce5dd7003aab9',
+ vout: 0,
+ scriptSig: {
+ asm: '3045022100a7a2cf838a13a19f0e443ca35ac5ee3d55f70edca992f98402a84d4ab5ae1ad90220644a02c746eae7b44a4600199ecbf69f3b0f0bdf8479f461c482d67ef4a84e76[ALL|FORKID] 0352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ hex: '483045022100a7a2cf838a13a19f0e443ca35ac5ee3d55f70edca992f98402a84d4ab5ae1ad90220644a02c746eae7b44a4600199ecbf69f3b0f0bdf8479f461c482d67ef4a84e7641210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ },
+ sequence: 4294967295,
+ },
+ {
+ txid: '1452267e57429edcfdcb1184b24becea6ddf8f8a4f8e130dad6248545d9f8e75',
+ vout: 0,
+ scriptSig: {
+ asm: '30440220290701c797eb52ad6721db615c7d6f623c0200be0e6d6802df68c527655475450220446c4a4da9a0df5efcb57711ad61cf6167dfdda937bd0477189be8afedaedd05[ALL|FORKID] 0352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ hex: '4730440220290701c797eb52ad6721db615c7d6f623c0200be0e6d6802df68c527655475450220446c4a4da9a0df5efcb57711ad61cf6167dfdda937bd0477189be8afedaedd0541210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22d',
+ },
+ sequence: 4294967295,
+ },
+ ],
+ vout: [
+ {
+ value: 5.00001874,
+ n: 0,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 76458db0ed96fe9863fc1ccec9fa2cfab884b0f6 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ ],
+ },
+ },
+ {
+ value: 7.52551634,
+ n: 1,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 6e1da64f04fc29dbe0b8d33a341e05e3afc586eb OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a9146e1da64f04fc29dbe0b8d33a341e05e3afc586eb88ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ ],
+ },
+ },
+ ],
+ hex: '020000000960d818c733de8ef435d24a95dbd7156fe54399469fe74ad62124b80b3bd70735000000006a473044022000cc5b79e5da60cf4935f3a172089cd9b631b678462ee29091dc610816d059c4022002e3b6f32e825ac04d2907453d6d647a32a995c798df1c68401cc461f6bfbd3a41210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22dffffffffaf347f1a7ae304536bc2ebc463c1b1c51dd09b293ff7c5604ed907d918a7738f000000006b483045022100ac50553448f2a5fab1177ed0bc64541b2dba063d04f2d69a8a1d216fb1435e5802202c7f6abd1685a6d81f14ac3bdb0874d214a5f4260719f9c5dc519ac5d8dffd3741210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22dffffffffe3e26e9dde6f4849ceea70594341054de5334599fdfcd6d25aa76acdba768bd3000000006b48304502210091836c6cb4c786bd3b74b73e579ddf8b843ba51841e5675fa53608449b67371802203de75f32b684cfe2d2e9cd424ea6eb4f49248e6698365c9364ebf84cd6e50eab41210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22dffffffffe5546febb84e3cc57bd2d5517762bd1977d6c9cef2a76f5593c06b2da70776d4000000006b483045022100e7727d9d26c645282553aef27947ad6795bc89b505ad089d617b6f696399352802206c736524a1410ed3e30cf1127f7f02c9a249392f8f8e7c670250472909d1c0d641210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22dffffffffe757efbe42d1e2186a2589e2134b051158ae98c6648a09644b4c791f8146f233010000006a47304402203fe78ad5aaeefab7b3b2277eefc4a2ace9c2e92694b46bf4a76927bf2b82017102200ded59336aba269a54865d9fdd99e72081c0318ccbc37bc0fc0c72b60ae3538241210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22dffffffff577272c3ce25f3e01b4dc2f77ef86b9d47afcc1122882c60ad242591d215f925000000006a4730440220670af03605b9495c8ecee357889ceeb137dadaa1662136fdc55c28fe9434e3c60220285195a62811941745a9f93e136e59c96b81d5b0d9525f3d16d001bc0f6fa9bb41210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22dfffffffff2e1c04b4414f7c2717d2cf7d4ce5e2627814c4785ef22a706d038744d4b04c9000000006a47304402203f822a0b207ed49e6918663133a18037c24498c2f770c2649333a32f523e259d02203afc42a79d0da123b67f814effeee7c05c7996ea829b3cfa46c5c2e74209c09641210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22dffffffffb9aa0370dde54cb9e23e695844e93f1b865ed57df17fde77d9e09a01f0065304000000006b483045022100a7a2cf838a13a19f0e443ca35ac5ee3d55f70edca992f98402a84d4ab5ae1ad90220644a02c746eae7b44a4600199ecbf69f3b0f0bdf8479f461c482d67ef4a84e7641210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22dffffffff758e9f5d544862ad0d138e4f8a8fdf6deaec4bb28411cbfddc9e42577e265214000000006a4730440220290701c797eb52ad6721db615c7d6f623c0200be0e6d6802df68c527655475450220446c4a4da9a0df5efcb57711ad61cf6167dfdda937bd0477189be8afedaedd0541210352cbc218d193ceaf4fb38a772856380173db7a908905e3190841b3174c7ae22dffffffff02526ccd1d000000001976a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688acd206db2c000000001976a9146e1da64f04fc29dbe0b8d33a341e05e3afc586eb88ac00000000',
+ blockhash:
+ '00000000000000008f563edf8604e537fe0d1e80f1c7c2d97dd094824f804ba3',
+ confirmations: 5637,
+ time: 1612567121,
+ blocktime: 1612567121,
+ height: 672077,
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+ {
+ txid: 'dd35690b0cefd24dcc08acba8694ecd49293f365a81372cb66c8f1c1291d97c5',
+ hash: 'dd35690b0cefd24dcc08acba8694ecd49293f365a81372cb66c8f1c1291d97c5',
+ version: 2,
+ size: 224,
+ locktime: 0,
+ vin: [
+ {
+ txid: 'd3e1b8a65f9d50363cad9a496f7cecab59c9415dd9bcfd6f56c0c5dd4dffa7af',
+ vout: 1,
+ scriptSig: {
+ asm: '3045022100fb14c794778e33aa66b861e85650f07e802da8b257cc37ac9dc1ac6346a0171d022051d79d2fc81bcb5bc3c7c7025d4222ecc2060cbdbf71a6fb2c7856b2eeaef7dc[ALL|FORKID] 02e4af47715f4db1d2a8d686be40c42bba5e70d715e470314181730e797be2324b',
+ hex: '483045022100fb14c794778e33aa66b861e85650f07e802da8b257cc37ac9dc1ac6346a0171d022051d79d2fc81bcb5bc3c7c7025d4222ecc2060cbdbf71a6fb2c7856b2eeaef7dc412102e4af47715f4db1d2a8d686be40c42bba5e70d715e470314181730e797be2324b',
+ },
+ sequence: 4294967295,
+ },
+ ],
+ vout: [
+ {
+ value: 0,
+ n: 0,
+ scriptPubKey: {
+ asm: 'OP_RETURN 62696e676f656c65637472756d',
+ hex: '6a0d62696e676f656c65637472756d',
+ type: 'nulldata',
+ },
+ },
+ {
+ value: 0.61759811,
+ n: 1,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 09401a690d52252acd1152c2ddd36c5081dff574 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a91409401a690d52252acd1152c2ddd36c5081dff57488ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qqy5qxnfp4fz22kdz9fv9hwnd3ggrhl4wsekqyswf0',
+ ],
+ },
+ },
+ ],
+ hex: '0200000001afa7ff4dddc5c0566ffdbcd95d41c959abec7c6f499aad3c36509d5fa6b8e1d3010000006b483045022100fb14c794778e33aa66b861e85650f07e802da8b257cc37ac9dc1ac6346a0171d022051d79d2fc81bcb5bc3c7c7025d4222ecc2060cbdbf71a6fb2c7856b2eeaef7dc412102e4af47715f4db1d2a8d686be40c42bba5e70d715e470314181730e797be2324bffffffff020000000000000000176a026d021274657374696e67206d6573736167652031324361ae03000000001976a91409401a690d52252acd1152c2ddd36c5081dff57488ac00000000',
+ blockhash:
+ '00000000000000000cbd73d616ecdd107a92d33aee5406ce05141231a76d408a',
+ confirmations: 59,
+ time: 1635507345,
+ blocktime: 1635507345,
+ },
+ {
+ txid: '5adc33b5c0509b31c6da359177b19467c443bdc4dd37c283c0f87244c0ad63af',
+ hash: '5adc33b5c0509b31c6da359177b19467c443bdc4dd37c283c0f87244c0ad63af',
+ version: 2,
+ size: 223,
+ locktime: 0,
+ vin: [
+ {
+ txid: '2e1c5d1060bf5216678e31ed52d2ca564b81a34ac1a10749c5e124d25ec3c7a2',
+ vout: 0,
+ scriptSig: {
+ asm: '304402205f6f73369ee558a8dd149480dda3d5417aab3c9bc2c4ff97aaebfc2768ceaded022052d7e2cfa0743205db27ac0cd29bcae110f1ca00aeedb6f88694901a7379dc65[ALL|FORKID] 0320b7867e815a2b00fa935a44a4c348299f7171995c8470d8221e6485da521164',
+ hex: '47304402205f6f73369ee558a8dd149480dda3d5417aab3c9bc2c4ff97aaebfc2768ceaded022052d7e2cfa0743205db27ac0cd29bcae110f1ca00aeedb6f88694901a7379dc6541210320b7867e815a2b00fa935a44a4c348299f7171995c8470d8221e6485da521164',
+ },
+ sequence: 4294967295,
+ },
+ ],
+ vout: [
+ {
+ value: 0,
+ n: 0,
+ scriptPubKey: {
+ asm: 'OP_RETURN 1650553856 63617368746162756c6172',
+ hex: '6a04007461620b63617368746162756c6172',
+ type: 'nulldata',
+ },
+ value: '0',
+ },
+ {
+ value: 0.000045,
+ n: 1,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 b366ef7c1ffd4ef452d72556634720cc8741e1dc OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a914b366ef7c1ffd4ef452d72556634720cc8741e1dc88ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qzekdmmurl75aazj6uj4vc68yrxgws0pms30lsw8de',
+ ],
+ },
+ },
+ ],
+ hex: '0200000001a2c7c35ed224e1c54907a1c14aa3814b56cad252ed318e671652bf60105d1c2e000000006a47304402205f6f73369ee558a8dd149480dda3d5417aab3c9bc2c4ff97aaebfc2768ceaded022052d7e2cfa0743205db27ac0cd29bcae110f1ca00aeedb6f88694901a7379dc6541210320b7867e815a2b00fa935a44a4c348299f7171995c8470d8221e6485da521164ffffffff020000000000000000176a026d021274657374696e67206d65737361676520313394110000000000001976a914b366ef7c1ffd4ef452d72556634720cc8741e1dc88ac00000000',
+ blockhash:
+ '000000000000000012c00755aab6cdef0806ebe24da10d78574c67558d3d816b',
+ confirmations: 70,
+ time: 1635511136,
+ blocktime: 1635511136,
+ },
+ {
+ txid: '2e1c5d1060bf5216678e31ed52d2ca564b81a34ac1a10749c5e124d25ec3c7a2',
+ hash: '2e1c5d1060bf5216678e31ed52d2ca564b81a34ac1a10749c5e124d25ec3c7a2',
+ version: 2,
+ size: 225,
+ locktime: 0,
+ vin: [
+ {
+ txid: 'cb879adc0a388416eda7289020b9d7930e9df589db375e95947968673edfb780',
+ vout: 0,
+ scriptSig: {
+ asm: '304402202950a75c2833d0400b38d4f47ad4af727388057bdffba90fe8950e2a69a1df8502206955582de9c6c99663895a114634e4fc03e7f2ede79555a4ad747888cdf1250d[ALL|FORKID] 0295236f3c965a760068a021a45a85f551adc2626ddc51d7539497d568affc148a',
+ hex: '47304402202950a75c2833d0400b38d4f47ad4af727388057bdffba90fe8950e2a69a1df8502206955582de9c6c99663895a114634e4fc03e7f2ede79555a4ad747888cdf1250d41210295236f3c965a760068a021a45a85f551adc2626ddc51d7539497d568affc148a',
+ },
+ sequence: 4294967295,
+ },
+ ],
+ vout: [
+ {
+ value: 0.00005,
+ n: 0,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 cd6b0a1b19b12d88e62bd265704b59e38e71fc55 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a914cd6b0a1b19b12d88e62bd265704b59e38e71fc5588ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qrxkkzsmrxcjmz8x90fx2uztt83cuu0u25vrmw66jk',
+ ],
+ },
+ },
+ {
+ value: 0.00004545,
+ n: 1,
+ scriptPubKey: {
+ asm: 'OP_DUP OP_HASH160 09401a690d52252acd1152c2ddd36c5081dff574 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a91409401a690d52252acd1152c2ddd36c5081dff57488ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ addresses: [
+ 'bitcoincash:qqy5qxnfp4fz22kdz9fv9hwnd3ggrhl4wsekqyswf0',
+ ],
+ },
+ },
+ ],
+ hex: '020000000180b7df3e67687994955e37db89f59d0e93d7b9209028a7ed1684380adc9a87cb000000006a47304402202950a75c2833d0400b38d4f47ad4af727388057bdffba90fe8950e2a69a1df8502206955582de9c6c99663895a114634e4fc03e7f2ede79555a4ad747888cdf1250d41210295236f3c965a760068a021a45a85f551adc2626ddc51d7539497d568affc148affffffff0288130000000000001976a914cd6b0a1b19b12d88e62bd265704b59e38e71fc5588acc1110000000000001976a91409401a690d52252acd1152c2ddd36c5081dff57488ac00000000',
+ blockhash:
+ '00000000000000000ee5254eb809e121138497bdd9b5053cf2738714220b1ce2',
+ confirmations: 5625,
+ time: 1635509252,
+ blocktime: 1635509252,
+ },
+ {
+ blockhash:
+ '0000000000000000005aa0636bbc6b0117417d1db091b911259023885b5c0d12',
+ blocktime: 1643286535,
+ confirmations: 3,
+ hash: '8b569d64a7e51d1d3cf1cf2b99d8b34451bbebc7df6b67232e5b770418b0428c',
+ hex: '0200000002682a61fe5fe1f6468f5ebd9b6bfecd87d37281709e44222583f1868912f9b9ea020000006b483045022100d9bcfbeb1f27565b4cd3609eded0ce36cbac6472aa4fba0551cb9f5eae7ca3460220712263d13a6033a133eb67a96dba1ee626cfc6024ccd66825963692e2abd1144412102394542bf928bc707dcc156acf72e87c9d2fef77eaefc5f6b836d9ceeb0fc6a3effffffff5d4905ee2f09b0c3c131fe1b862f9882c2b8d79c9abf4a0351bbd03bacffd40a020000006a473044022059c39ed0798da7a4788355120d09737468ab182940ec78c3de1a2a23995c99aa02201bde53d7155892a145966149eedba665fbe02475a34b15a84c5d9a3d4b787d97412102394542bf928bc707dcc156acf72e87c9d2fef77eaefc5f6b836d9ceeb0fc6a3effffffff030000000000000000376a04534c500001010453454e44200203c768a66eba24affb19db1375b19388b6a0f9e1103b772de4d9f8f63ba79e08000000000000196422020000000000001976a9140b7d35fda03544a08e65464d54cfae4257eb6db788aca80a0000000000001976a9140b7d35fda03544a08e65464d54cfae4257eb6db788ac00000000',
+ locktime: 0,
+ size: 437,
+ time: 1643286535,
+ txid: '8b569d64a7e51d1d3cf1cf2b99d8b34451bbebc7df6b67232e5b770418b0428c',
+ version: 2,
+ vin: [
+ {
+ scriptSig: {
+ asm: '3045022100d9bcfbeb1f27565b4cd3609eded0ce36cbac6472aa4fba0551cb9f5eae7ca3460220712263d13a6033a133eb67a96dba1ee626cfc6024ccd66825963692e2abd1144[ALL|FORKID] 02394542bf928bc707dcc156acf72e87c9d2fef77eaefc5f6b836d9ceeb0fc6a3e',
+ hex: '483045022100d9bcfbeb1f27565b4cd3609eded0ce36cbac6472aa4fba0551cb9f5eae7ca3460220712263d13a6033a133eb67a96dba1ee626cfc6024ccd66825963692e2abd1144412102394542bf928bc707dcc156acf72e87c9d2fef77eaefc5f6b836d9ceeb0fc6a3e',
+ },
+ sequence: 4294967295,
+ txid: 'eab9f9128986f1832522449e708172d387cdfe6b9bbd5e8f46f6e15ffe612a68',
+ vout: 2,
+ },
+ {
+ scriptSig: {
+ asm: '3044022059c39ed0798da7a4788355120d09737468ab182940ec78c3de1a2a23995c99aa02201bde53d7155892a145966149eedba665fbe02475a34b15a84c5d9a3d4b787d97[ALL|FORKID] 02394542bf928bc707dcc156acf72e87c9d2fef77eaefc5f6b836d9ceeb0fc6a3e',
+ hex: '473044022059c39ed0798da7a4788355120d09737468ab182940ec78c3de1a2a23995c99aa02201bde53d7155892a145966149eedba665fbe02475a34b15a84c5d9a3d4b787d97412102394542bf928bc707dcc156acf72e87c9d2fef77eaefc5f6b836d9ceeb0fc6a3e',
+ },
+ sequence: 4294967295,
+ txid: '0ad4ffac3bd0bb51034abf9a9cd7b8c282982f861bfe31c1c3b0092fee05495d',
+ vout: 2,
+ },
+ ],
+ vout: [
+ {
+ n: 0,
+ scriptPubKey: {
+ asm: 'OP_RETURN 5262419 1 1145980243 0203c768a66eba24affb19db1375b19388b6a0f9e1103b772de4d9f8f63ba79e 0000000000001964',
+ hex: '6a04534c500001010453454e44200203c768a66eba24affb19db1375b19388b6a0f9e1103b772de4d9f8f63ba79e080000000000001964',
+ type: 'nulldata',
+ },
+ value: 0,
+ },
+ {
+ n: 1,
+ scriptPubKey: {
+ addresses: [
+ 'bitcoincash:qq9h6d0a5q65fgywv4ry64x04ep906mdku7ymranw3',
+ ],
+ asm: 'OP_DUP OP_HASH160 0b7d35fda03544a08e65464d54cfae4257eb6db7 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a9140b7d35fda03544a08e65464d54cfae4257eb6db788ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ },
+ value: 0.00000546,
+ },
+ {
+ n: 2,
+ scriptPubKey: {
+ addresses: [
+ 'bitcoincash:qq9h6d0a5q65fgywv4ry64x04ep906mdku7ymranw3',
+ ],
+ asm: 'OP_DUP OP_HASH160 0b7d35fda03544a08e65464d54cfae4257eb6db7 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a9140b7d35fda03544a08e65464d54cfae4257eb6db788ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ },
+ value: 0.00002728,
+ },
+ ],
+ },
+];
diff --git a/web/cashtab-v2/src/hooks/__mocks__/mockTxHistory.js b/web/cashtab-v2/src/hooks/__mocks__/mockTxHistory.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/__mocks__/mockTxHistory.js
@@ -0,0 +1,6992 @@
+export default [
+ {
+ transactions: [
+ {
+ height: 655282,
+ tx_hash:
+ 'db8b907052c2e48d037e37e8f5b490c8c0c4f42adb5b61ecdd682b729ad2cba0',
+ },
+ {
+ height: 655282,
+ tx_hash:
+ 'f5cef54fb9712f94d59072000577feece3cf7da008012671cca46106449d478d',
+ },
+ {
+ height: 655283,
+ tx_hash:
+ '6be465f36e5600f90ac6f7a802a7133e042081cafe5f57474290d661e6c94bfe',
+ },
+ {
+ height: 657864,
+ tx_hash:
+ '3e9d9a472655902b60e6c172de67c91216c1bbbd8550506b8d3bf48abf5acb36',
+ },
+ {
+ height: 657864,
+ tx_hash:
+ 'b98d293d732731898b968f6a11bb66a59e18e291fe960f82b2b3f0d6da754d69',
+ },
+ {
+ height: 657864,
+ tx_hash:
+ 'f4e8a47ae920968a87fc7f7e689ee55208b384f42d5597216a67903cc7a7a225',
+ },
+ {
+ height: 657867,
+ tx_hash:
+ 'fa71b5575c9187ce77fbc1b6405e8ac251dfd72883117446d147005c5b1ad349',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '5cb7f54ccbfea08c57af7e3e06efcd85c438c66afb5798bc095842ac6a1f2ba9',
+ },
+ {
+ height: 659821,
+ tx_hash:
+ '4cb42cceadd22dacdda8ce153c922bb61b34df14f47dddc5eac37c0f03a56b2e',
+ },
+ {
+ height: 659834,
+ tx_hash:
+ '00939911253560cba4a3de20d14c874bec90de56278a835edb301c1fa2490a7c',
+ },
+ {
+ height: 659836,
+ tx_hash:
+ '7b0a8476cbb9e747b7e83d9a0c266a2364612990959890adab0e6e682accdd07',
+ },
+ {
+ height: 659836,
+ tx_hash:
+ 'e047524aa31f182650ab053dacad63ba35f4667f06034f0b5873d73681ad5b78',
+ },
+ {
+ height: 659837,
+ tx_hash:
+ '0fc1f7e08993ca068192c082c054de3bbd9c008e462e2a9725f589f4fd626fab',
+ },
+ {
+ height: 659837,
+ tx_hash:
+ 'bd054fcee25e0fe66099bd9a338d281b78dafc057391bfbce83caf4d5594c0fc',
+ },
+ {
+ height: 659837,
+ tx_hash:
+ 'eeb1c131f026dbb7ec339c1c80632234ba0daad61ebc7235c40859424d671215',
+ },
+ {
+ height: 659837,
+ tx_hash:
+ 'efd81e257313be9531744bf04fa64d136152ef7a3c262fa7fd79861a2df3f3a8',
+ },
+ {
+ height: 659919,
+ tx_hash:
+ '243c4406e249d4b7773ffa15700e9b8893dce0b8170a671e8176a01ad0eeca54',
+ },
+ {
+ height: 659919,
+ tx_hash:
+ '2f8efadc86562c141a52fcdc0c596e6387f5d026edf0344893589f9754be877f',
+ },
+ {
+ height: 659919,
+ tx_hash:
+ '4297b9bdbcf722120e794543fe5150000308ab5d40cf4ec3c667dc7e721112e3',
+ },
+ {
+ height: 659919,
+ tx_hash:
+ '438ab0f53cd1b286281e6140865f8f5beae04c3744047e95f373e4f8ce7b7cf9',
+ },
+ {
+ height: 659919,
+ tx_hash:
+ '5c8c6afb25fa771b55b2a508e58043ed9de58d215251ece89319ff8ebd5c333d',
+ },
+ {
+ height: 659919,
+ tx_hash:
+ '6d2dca796958b3e9e1415b36bb1c212e13838bc17fecc6a6d55b9e8c4ce556ef',
+ },
+ {
+ height: 659919,
+ tx_hash:
+ 'befd7786f73980bd515c4be226fc36845f5f4daf78ca99a97cafc1d1d8d0e477',
+ },
+ {
+ height: 659919,
+ tx_hash:
+ 'c45c87253c6689ce88712a337b6057191ef6abc720f292e4593259b14e938815',
+ },
+ {
+ height: 659919,
+ tx_hash:
+ 'ec0beababb84a5e78eb979d2929a963c8c59f36e978953f3222582d3892d4f4f',
+ },
+ {
+ height: 659919,
+ tx_hash:
+ 'ff12509e41165bdd3eca0dcfa8aab25612bc2692c97c6f30101ed8cae0935175',
+ },
+ {
+ height: 659924,
+ tx_hash:
+ '14bd7a307aacb93675660b6fa957b0c8ab001d500cb07756524330f1863e9f9f',
+ },
+ {
+ height: 659948,
+ tx_hash:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ '06c3cf45ab61e3d077aff9b978bc35a03c105bb44c1db3e59042411685f9be2a',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ '0fbf5ba29b8cbf8535b5a1ff4182ddc37b2e4af371120fda4ffc5bb1322cf8c0',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ '1216f7c71b7c909c7b3353326cbed58f435b2a8086e0a1c0520cc4e23d6f8226',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ '15eda0c856853fad8cec01f6576a5bd2ceb5670e2515ff8579df70f2f0472716',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ '36ec207d57e8c0eb2af2b8ef08ccf785d52a6897588e580ad5f3705d0cc699bf',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ '38fabca191ab4900d5789b14bd8d2db1e417fd9c407091ff822a3029ca0d5674',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ '3b76d4db1854e76be28e64685d81cdb45916c07e12aad63faede4ad95f2f9082',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ '43b2da13a2a4efd72a3d9405ed7c45838c30f5387211292cca563720592e6f05',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ '43b60d06cb7819fc0d14bd505d30eb33ea6ea955557f0917101c5095d0134134',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ '4dddba623b7445446cdf2bea1e80ff9a3f082b7625bc7cba1d8dd8a6b7969fee',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ '76d64326735d89bc768cbe9c7e20dfc4dd9677d6b55c076fdff9321c2e8ceb64',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ '98d47fe1c8f8bcf8affb6f57edba7bcde0efd012142b6a95b410780b383aeacd',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ 'a53aaae3bc53433b3b8150752985092347a0ab5493bb018549a956a172a76866',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ 'aab17af10987f6b9d08efa52b0aa42711fda46727b992724fc5783e934192aa7',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ 'b5e0ae668eeea8526323e1d194585ac6f374a0627b84f52f8096f3320925998f',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ 'bb5dc87d9bcdb56ff36a63cb5a4701a6a19b5491dfea296c572e0088b6a0d417',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ 'c118898f3c2b75f76a19ba997cfd7bae5de95e474a4beb388fa4ce9a34490142',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ 'e2e4d4eedc18791ecb77eba391bde3b9b93976b26e4b083e087412aa80e6f8f3',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ 'ed7a0eb9f80ffcad92a20a9b8eb673561bde8ce143cec05fe4635020842a4c54',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'e895604954d16688ae4a927e33f1799644653674be016f571056c6e532a8a51e',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '0c178723df5d3e7d814e54bf62b1086b3241683b9cc73daa2a0c099437574979',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '41141eb7e76adc0e827115f1f7186abb32cc6635034f30f32c20580b66c63f0f',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '5f866837aa1c2bfc065a25cbe0726dd53f232eaccf86c24a5210653b5094ad9e',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '750b13b52db09d6ad217faf71a33010631926ef449f008f7c0c3f02e2b3cd0d9',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '915c7cccf7b80da5d50c9aa7c3218b0354fe6a14a6132740baf6f2f3fd15e3ad',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'a7d38e84c6563ad9d6dca0502aaf1c0031a09f9f884d8c746cf4a971bf9065ad',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'a8e49079d7a3419896e128562de0f8d9690d3bf1aef02c1f77cace5908944d08',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'a9af7fe6da50688117ef66ce098668aa89d5f2a3cc77a9f5aa164e8b7270637d',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'b1ec79c0eea96af597f60b341abc40dc6f22d00972f66ebe1a68b1335b0239fc',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'c58cd73b72df76d8546ffc9f56c8c1fe3b75a3f083457f41bfb35aac5ed30fec',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'ea335b793fb27b683c61351ffd500cd990eafdfa02499d1b19ca74e8e7c3c120',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'eeada6074a72c32c7617e2f74bb9a19d11a01a72c9b6ee7989bf0fef700eeb24',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'f5f6cd60a1d78c862ccf0d38f9dd05800b6cbe5ab2d15b36aaea1c23ef4b5db2',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'f81a4031fb3098b56e9e10bebcfa6e1891c82faf9a2164fe62658c0fe93e49fa',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '010ee4ce1aea60feb0192b3d1388bf9cb9da512010d8fac6adf54540a23e6814',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '054242a3c57e369b1444ddb18797add7ed0a91a33ecdc9ce1643d91da6b462b6',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '0c63e93fee9f0947d460c63100e58e062c339e583f01f61d2fdb4e4a97ba9743',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '15e04f97951e9d8fed9b04290632b263c73bb774f26bcac245ad39911e2f9f20',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '1f983f7ce21041465ff153356fe7729abc3f9eeed4217e85e0caaacd146d7329',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '345838f75defa2705751615b60bef3951b4cbb57107a3016cd7deab91200124f',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '428e10436e7131b49c31760dbfae4b84453987517cf7e424361943d491e5983d',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '53f541188aa9f4c51cd96c2c8191d1ad9b6b006d7d6d69d297450de85b50b7ee',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '58b7608b000fa91caa65b2081bf63b97807ac4b797991e240621d8f5be6ec12a',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '6791868b45829c05a8f96b8360d8dc0744e992595165269ad3d9cd02142a4288',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '7f3c2e48af5f3633fe421eaf3d1dc1bded3cd1703892fa0c474a582df9b9dad4',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ 'aeceb912a3e4f9bdfd9b7884e076cb58f96feba22bb8589b1f8c8e4495bff915',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ 'cead73dc26efc24aee5ccc68be59052b35e69788cba4a5aecdb8ef1556bf6334',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ 'ea690e9c656b12c8848b10fbe12283e4d249be3967f8b82b2bb3395a4afc0e63',
+ },
+ {
+ height: 659958,
+ tx_hash:
+ '32359e417eb92fff3159b98a29b5ac5c7ca30cecd777a93065dfbdad963fcdb9',
+ },
+ {
+ height: 659958,
+ tx_hash:
+ 'b0559ee37ec5e39ab76a5a94cddadb9ecc67bfe207bacbd3c2708bc3c2684626',
+ },
+ {
+ height: 659976,
+ tx_hash:
+ '0134b452c22febaba94064bd03757b4c9d60f348d7bf298c3f27e92b5445285a',
+ },
+ {
+ height: 659976,
+ tx_hash:
+ '1d606546d2f6a7ae65920fd95674ef028083887383779623446ce11e32675976',
+ },
+ {
+ height: 659976,
+ tx_hash:
+ '3a191aa30f9ce54663841b1c11e3faced709a1679210da844d4f0d6ef274dc41',
+ },
+ {
+ height: 659976,
+ tx_hash:
+ '7006fe0a733b1f146468ea9ee461608ecaffd1b4645a5b8876910ce632bbd98c',
+ },
+ {
+ height: 659976,
+ tx_hash:
+ '7c5c673aa53da6b58a31a2d6753f718b7dce058e7f6781336ceb0ab910189c87',
+ },
+ {
+ height: 659976,
+ tx_hash:
+ '94971dad305c8076150d36d0df092ab2379f4de9d8e5ec155ba235e1974191a9',
+ },
+ {
+ height: 659976,
+ tx_hash:
+ 'c5bc0300330dcd81127b1514223926a024ada4bd1a8cff8f594f23ef614c369b',
+ },
+ {
+ height: 659976,
+ tx_hash:
+ 'e07580a71d957b08f94b5cad90944828617922eec5a5be5b706eb31347ec6c1e',
+ },
+ {
+ height: 659976,
+ tx_hash:
+ 'ecd3058a4e31424774b4d00c34543190d166f5e70b1e32809d2d71d10e55af08',
+ },
+ {
+ height: 659977,
+ tx_hash:
+ '1319e74cc5a86b624164816e09acded5106f3f1bc09711c76b5485b99f3ddaa3',
+ },
+ {
+ height: 659977,
+ tx_hash:
+ '26fe342e22c0bc2470dd2fbe8c43ca287ac4d1a976f925467065e6c6076e54aa',
+ },
+ {
+ height: 659980,
+ tx_hash:
+ '33833793795e58c903acf739686a4596b9bc7eea3940dcb260654769a4020594',
+ },
+ {
+ height: 659981,
+ tx_hash:
+ '0e23d7f2d53dd7825b1d63b6119039544f3a229bba23d1b60d056060f7cb9928',
+ },
+ {
+ height: 659981,
+ tx_hash:
+ '25c9ffad4a2aca143a655160c66c0726aa7445af1a1cdcc790ed88d9501668da',
+ },
+ {
+ height: 659981,
+ tx_hash:
+ '96b0c53a5e0463d3ddae346ee66407ea8cf84fe4d28251926a9ece5bd4c85136',
+ },
+ {
+ height: 659982,
+ tx_hash:
+ '5d57e224c97222c921a936900201b08e73139c6bed70609340ab86beaa532dd8',
+ },
+ {
+ height: 659982,
+ tx_hash:
+ '6dd6565d53c6c16c506db4009d111b2002c30fa6109de93085c214ab47576006',
+ },
+ {
+ height: 659982,
+ tx_hash:
+ '70c4147829a54544e615381ff5e8e4673b6502a050427200a314cb11d6c0415c',
+ },
+ {
+ height: 659982,
+ tx_hash:
+ 'aa658953ea8a3cfd9841585a3c06f434de11bd6c0b20c1e961f8855bf5191d69',
+ },
+ {
+ height: 659982,
+ tx_hash:
+ 'b59ded66a3b2ae15655be1c63e43dce6d63fbb259abf699138de363c083afecd',
+ },
+ {
+ height: 659982,
+ tx_hash:
+ 'f736d4a58b4b9519e0624c948558314ac245f97fb109c500b8e6fcf0baa42e2d',
+ },
+ {
+ height: 659982,
+ tx_hash:
+ 'fbc14f962151ed52c17e633f1e819e65b1850a1c550a726f7597ca50b06497b3',
+ },
+ {
+ height: 659983,
+ tx_hash:
+ '0b639a5321b4e2a38e20dc1e858b836031facd2e41807b414309d033106aedf9',
+ },
+ {
+ height: 659983,
+ tx_hash:
+ '295ac05c68d5b9b5079ac887ce8e68e92a0ce2dd1c2604a611eadc892a67b8ff',
+ },
+ {
+ height: 659983,
+ tx_hash:
+ '4f22976b45310a358afbb2542e04dc1dbb613384cba76d265b947184362ca501',
+ },
+ {
+ height: 659983,
+ tx_hash:
+ '6379ad5d712becce1d0bd022d7b3ec2f5012b7484b50f15f067a4ff1c66c49da',
+ },
+ {
+ height: 659983,
+ tx_hash:
+ '7066c730c8a3760313e43be6880d414580e0a3cd76d06ddb5069e03436db73e4',
+ },
+ {
+ height: 659983,
+ tx_hash:
+ 'bcc0259a98e61013a6a1068b32bced113bc5e034faaece0d531d3c1db85e8ed8',
+ },
+ {
+ height: 659983,
+ tx_hash:
+ 'eb2834b9f6b4fe710239296c13e13d7cbcf0db84949051b7303f641895bd594d',
+ },
+ {
+ height: 659983,
+ tx_hash:
+ 'f49dbdb861d7320bab0bbb3d0d165e64a785b069b48907a336e587a80dff2fb1',
+ },
+ {
+ height: 660001,
+ tx_hash:
+ '6efcc8e6dd9bd01b16a45efb2f02f8bfc9b2a4bd06c3f55bb09872135a50ba8a',
+ },
+ {
+ height: 660001,
+ tx_hash:
+ '82e3d1ba8cb0d32ea964e4c928bcfdb10a64fb87247f17ffe15a6e666b3fc8c8',
+ },
+ {
+ height: 660002,
+ tx_hash:
+ '6e5f4461d498912b4cbfcf773710c33b698bee7831b688ce400c91e1e1b8b295',
+ },
+ {
+ height: 660003,
+ tx_hash:
+ '02b3d2631d286a0bd1b7de792552a9be8575aa2a98b8d815dae4414ebb2a9659',
+ },
+ {
+ height: 660003,
+ tx_hash:
+ '955ca147e9635116d66c91af6ddcbf10bb41604d8cb1515632bf50a17f93e30c',
+ },
+ {
+ height: 660004,
+ tx_hash:
+ '076d63f093014e420d53428142845925ec36966dd24784c2cf7363c2ccb1a5b8',
+ },
+ {
+ height: 660004,
+ tx_hash:
+ '23ca2ae091c458cbaea649258b889c2c706285b98ddb221427a81e03a449614c',
+ },
+ {
+ height: 660004,
+ tx_hash:
+ '31be756e77551a05c1305b66705b7192ed8fb396069f0ca317b15f3a402e53c4',
+ },
+ {
+ height: 660004,
+ tx_hash:
+ '699217564cb06f8d8dce7e5cd59e5da1d2d8d14da8d889e510fce6240373719f',
+ },
+ {
+ height: 660004,
+ tx_hash:
+ 'dccd4df1c4f0a7e235831558dd2f67126cf36aa5f4a995a47da008ac73588d41',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '0a23bdc158ea922105819892b6713ac7056447d32c4de9ce6264fd5d536d3cee',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '10a15caa5ad2e8b246d78770a86df87dbbf8ad01fa7f54335504b009bdf491e0',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '2098ef071098358f1d5c0a5d16b7983d2c59adf6c33ab2389f9fc8cc113c75e5',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '35bf4cee38807cb7f3b415fbece3e87cfa6c96ef01a65be898507e1ba07fc874',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '3f0b2caa53afda5181110f58b9d79128217dae61f1ab3e735831dcad2127a4df',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '427ee17e166c771cff3d4540c189ee3454cbf853ce3332f88f12bddb8c10c689',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '46d8dd93468ebcc4d8deb225830b4ed731ad13b495cc815883746f3f67863427',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '4f1b8503200a797e4d997edd2fccd0984194524c63afca8f2452419f3e9102d9',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '53c63c4c043b45ed908bae9b41f642cb63b320ed67903c2958f24adaa200c7a2',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '5b7fd7ac70c9263fc5cbee2c5347a35c188c27e02545d8d239610e5bcfd4765d',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '5c770ee60ed0e8f12a293287c7996ead3b0a4df00f0efe70a95eecc5cf5daf9c',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '650c2224215eee3f8ffd986756cec35a8fc7a608fa1ee7a823393017a13575d6',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '76deb9739651d1245ee08fc837d0b5262daef31359615b0e3dfde90071584350',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '7acbeb33168ebd4c32b3bff21f35c475899f0fa11641d37f4f3dbfabda3d70e3',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '94a924f562a9abf5f07b8ec2ee8db35d3201695ba0f86cd4800c2fb0a4f1da74',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '94eee908d9283ac363b5e865d5072dadd8fa600d2cadbf466ea4100206f95608',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '9b5883ab9d862dffae713319b75c9aa50e2ff8094b4eab3c9f573927d5878d65',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ 'ae0dfb40d585a03f8b997e2bf17b01a7fc57057d0e3ba61bb0292af9a879cc09',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ 'dc1657faa52bd16e1a6874c96633045df0c1f47f7accf4242d8d053dd4749e91',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ 'ea9cfadc86ab6e11702a513ec1e4088c833c414c3eb15527f8cc4767ab00ec27',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ 'f4b4dc37befe73860042ec8fe660c1408866f6a85ae4d5933e4a6a6d1324704e',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ 'fff38d96e86256958126e7773d730f268ee5ca1be2a183bec7c798a44b2032c7',
+ },
+ {
+ height: 660006,
+ tx_hash:
+ '6ff0b9ffbdd142a32c19bb6c47cfd9a46567363074cb247591118d4b35658d46',
+ },
+ {
+ height: 660007,
+ tx_hash:
+ '1524b259594ba692b2bb85f89db9e4bfc46ba94a83c1d52d1afb145ebff331cf',
+ },
+ {
+ height: 660014,
+ tx_hash:
+ 'cf250235a6bcb047f20e61875d42bdc2e5fd5a3399a8efef0b810707e39a567e',
+ },
+ {
+ height: 660019,
+ tx_hash:
+ '88b37c8d0b08ae5a59c109d23986d6b2a146590830a955bc092d39b36143adee',
+ },
+ {
+ height: 660019,
+ tx_hash:
+ 'fc7ed67852e5284e69a575ad926a18bde893416c58ffee3d1bb5a4066258e004',
+ },
+ {
+ height: 660025,
+ tx_hash:
+ '857004b90aeceb9bc1ca3eae7ebe6e9d29f62b4c3c964ce0e604f826de82bbb4',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '066bef4db4b67c2dd76b6371a4d360bcfb59b70ef850ab28fe55830bf4a2aa8e',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '0b4272a12924bb4692923568bdff065843aa70bb309bcd9d194a61bbd40d89de',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '13dd2020060e2cdf0852f7e1205a924428468114805515511e98f37a292edb95',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '155d6cc07dfee43902c6a470b5b781b3d4c405e98105627f975d18e790093598',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '16d0a14859555dbcf06d0e05d881a3d32fa314f3ec728b76ffac7eaa19eb08ff',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '1dbaeae2399a42c3d16836095cf13dfeca530c27eedf73f77a4f1819bf606611',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '27d1138ff46e1f29bf970c4d66c184ba61bc60576ebcbcbc9d343fa438e14bc4',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '2dba36b503e513fb02fe5d75e54b9adea63141840ff17acb69241bbb94f952d9',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '44e1dbb7c685e08a4950bc71dac4f950a3cfd64c1032b9d02a46e72cb66f3881',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '67cb34a67f2c4d3217433e291a32a9d53046bd5b08b0d0955a91fb14a014acc7',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '6a0067b4bc92d06dbf8a7889de0538a51a973b2653ef50d87f71cd57fd2fbedc',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '7027b0c53560d0480288cf34552b6ba1489bdc1da51e1db5f94a8f7005ee7622',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '7b1a500f7e79028e91a03c1ec2091e840442a40575dc81b1c3fa3ee819f08463',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '90cb5099d48e6c0c52c619f79eb73bc9ccb88141ec4b3f8d974a76b68c0368b1',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '9e7a82e572c733a5120a46b13b947577b27f817b2c45092fab90dfdc19b07c94',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ 'a7642455da89933a758ce179249bc3eaa85175ab768473abae27e0f7f54821aa',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ 'ac24a04a82c178c6b9ec1a41de35c693a4863db73ef85c50f42561d4fed14af4',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ 'ad3ff4e979865a7e392ac02b79c847cdb573e79f2ec19886ddd125e4fa2d839a',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ 'b205570d729c6143e2bfac1c8482729af43e127e144ea3f5eb3f062a581ad031',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ 'c5af60a226ddea52d34ed5e22bfcb836a6539d9aa72b0eaf08d00984ff463b0e',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ 'c67730a99a75140d1c818a66d011b533246c841eac16392a4b252a306d287ddf',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ 'd927d98e30b16f90c7f567cf21104348d3ce4f4cbad0833686aa50f1ec571d2d',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ 'dc4df9c40d346fb65a7219ddd87dcdf3292934eb7fdcb35251980c3198fe525c',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ 'e5129ccf0d1d7096032c473daa068cb2cf3fad8cfea1412a3b9ff3982912963f',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ 'ee6bf5ec3a24cee367ca83b3bc7abbe9dd34d90dd5dd7287a9866673bfc23c54',
+ },
+ {
+ height: 660214,
+ tx_hash:
+ 'd21b27d062eac87a4fbc740845e871d56a54f8fb98d5c5a4c4a6d36c070af550',
+ },
+ {
+ height: 660214,
+ tx_hash:
+ 'd84ce0acc9367d2107114724fa091d8a887bb801df2c7de8290c6e33c5966a74',
+ },
+ {
+ height: 660216,
+ tx_hash:
+ 'cd206ed1671dc4a24a95d437043d244f528a87e1f98e8c26e763393e7c9097c2',
+ },
+ {
+ height: 660217,
+ tx_hash:
+ '0bdec2a0d5aef79a88e5f1c25d69ae42c42388f900f5206925c2f598e1f98374',
+ },
+ {
+ height: 660217,
+ tx_hash:
+ 'e48152353953bf73e592a5554f9addccfbba336009bd2fe80aed2b407471412d',
+ },
+ {
+ height: 660596,
+ tx_hash:
+ '2e78637812b5604e06d0f13bec22412f65da1273b9345bf9db80c785968d69d2',
+ },
+ {
+ height: 660596,
+ tx_hash:
+ 'fdb13f0dfbe853e57d5acfab1d4c6218962fe6b0267450854d33aff5873578f2',
+ },
+ {
+ height: 660598,
+ tx_hash:
+ '709c10dde134cf61c16d601ca13cbff333edf68d67a4e19b62daf7d6e2db23a6',
+ },
+ {
+ height: 660598,
+ tx_hash:
+ 'b32503a1c85e24a3a6cae3f454576c43f43d0ab8987fa960887bef9c7a266f44',
+ },
+ {
+ height: 660598,
+ tx_hash:
+ 'c7326808183a8c90d6f475c0c000fb44ea638e0fb96ac7a1d187ada2cc653475',
+ },
+ {
+ height: 660598,
+ tx_hash:
+ 'fb770cbcac7a3cb2efa65bda9d50bf654cc60364c1766403b9329f1885b25bfe',
+ },
+ {
+ height: 660686,
+ tx_hash:
+ '37247593ada56fc61ac6d26d93f50a9e39d69c59dee2e3186bc269b4f89af15d',
+ },
+ {
+ height: 660686,
+ tx_hash:
+ 'f874970d3945fd29c1dde2e0eb248b41569a13666565a083741304081cf8ef04',
+ },
+ {
+ height: 660687,
+ tx_hash:
+ '45ff101fdc2b83ca32779202d1ad5b3445786825a927f7e74464f94fd32ccce8',
+ },
+ {
+ height: 660687,
+ tx_hash:
+ '482384837d8bd33ad456be7a6c45307bff73114976b9f784981dbee06dd940ba',
+ },
+ {
+ height: 660687,
+ tx_hash:
+ '6221a7ec14845c7012aa6f320d40c5bff27099c9a929f234de5173e4cf7da9a4',
+ },
+ {
+ height: 660687,
+ tx_hash:
+ 'be3964d7e51087e91c3f0cf7a1ee09794efc074df7a610321ca562074f3f688e',
+ },
+ {
+ height: 660687,
+ tx_hash:
+ 'cb39dd04e07e172a37addfcb1d6e167dc52c01867ba21c9bf8b5acf4dd969a3f',
+ },
+ {
+ height: 660687,
+ tx_hash:
+ 'e4efcd2c7ed0d1d4d544badbb1947bed9de50e578a3b19b1d7d27be45e9debf4',
+ },
+ {
+ height: 660690,
+ tx_hash:
+ '905a251f32b75df32a0c0170d63828ab11674e0fea1f67c7885cd43d3fa22d78',
+ },
+ {
+ height: 660843,
+ tx_hash:
+ 'c680ec60a81855f7f9143478588cea3887c27d3d8e640b77727a2f957cffa283',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '00dcc47dcebf3ad95140c271a70172a45a4f5de53ecc17d71471eea57a0c361f',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '04585cff8a53166afc86f3f0e06d5d2c8b08fb9d39c959ee3e3ff55f550bdabb',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '25a4af01d1acb12275ced70a50c475dffe6821bc988a232cd0c5c68282673ce6',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '2f87a94ad524fc702d47404899badd261346a794898d69cea9dbb56dca0f2bd1',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '31bb9a154181520cbd91ca98605143ad8aaa72a9a90d0649f63bea697d99f4fd',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '34c77f5f6cac57ce99574fcb09ed542371a002146e1e60135ba4ab23ea7dafeb',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '40e8809b48e0e299e3ceea365b7ef254f232e3248ed48e16dcb868d263df6dce',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '42e04820e080a5499507bdfa02881c3ccf76370833f9a69705ce6bf6f9fcd509',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '4d65bc6900b2454abfd89c782295a559ed559e909c1be81b5e76097fdc06f872',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '53c6db88c01c11781dd1ac67eca8177a2260e9005bc49180466eadf71c01f99a',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '55531993ed6c5ba7350fdfbfb820bde924e365e52a0e44a33713bd9acbd84379',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '5f109d1215de0d75ee4b4be079e6922a69d0a6f528899ef35fee0c4d64822b8c',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '66efb27f0a2712554e630db1ac8f7f2ea146820fa02f6f869c9310aa8faa03e4',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '962fcc8ba3164f3e3ad50c9e9b635d9487a0f7c125ad32421c303332a63ef830',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '974dd914cb2de49e7c167cff04ec0182e64861c0ff638223d608e6e51bc11237',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ 'ab0fbc0e18278bb9b5ae59660fd8046b0b481a800e011659333035d7c2593128',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ 'ac01f0010bcb5937038d637f9d9131124daab15ffda7458a0c801f38f7f9f3f3',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ 'ba5049164f13263cdf25453bce53f6b230687bdab2393e0f40c39c313386791c',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ 'd84daa1aa0b8fa265e83dcd506f0f410066eef880ebcd9e8dc70a55ec9fd78f5',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ 'e67b76c4c411fca92efe1cc0af1bd38c53ee62ce08b4cc81d61209d53d2511c5',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ 'f05c192813b5c1565e17b96d8d27481c317ccc25b81ff38fa700c6e91931e211',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ 'f3404e1c4b8fe9d73fae9d11bcd5adf1bcc55852208f0fda8fd4d234320faff9',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ 'fedda41bf7553358b60f0be373f02aa79dec5979c95159bc8c12afdb86b3dec2',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '0bef5c003b48b863770011c6be61f7517ed40e8a5733d183c4ca3855d53c98aa',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '11fa63ce928220225a3c5a4ebb9b01b5f443cfee28286fdde5bff473c92c768e',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '13eeb14530cad5528b15bfbefd63f943562f71d54c11a75beb009e8d8f6c041a',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '16b624b60de4a1d8a06baa129e3a88a4becd499e1d5d0d40b9f2ff4d28e3f660',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '2a0c36c458256103e5622c152bfa40c174053814a7bf8951d6d6107230fb3f47',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '38e70852d22a31a0b77997ba9a1728a9dfd95e56af8111082b04818b6f3a0a6d',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '4936707f9b7619da717e6d99200799c2fd1c814b9286b68cba3db22f5e35cabe',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '4fb6e80028a0591c31e0459cd4f7e66115e34c6f3e2a57f950dbf55399b0401a',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '506065c6e9bca13f30509d2f0748c69f6e462e53b4d7978d6b064de63f2201df',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '548a5be415f0640422920fdaedfbb2f5b48d175f926a205fc38a914cb45d11ba',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '635023902d67f915fe4386dde89457bb895593361f7cfcf7c70fb731273d2275',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '68fa5a225999c6f28e4a13cd81c9c3d45bae40dd746b9116d859219ad6060851',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '72b8414114fb2427fa374c806535870994f37e63ec8eb4da094a1f94a065b7a3',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '777193a354fd9019aa865309dc1b2ff4975abdac19382d2bcc51cab66daa31d0',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '8856a0b51ded579c8b880c3b4f7aa2cad491f073439d2cf05d8ea1a64bb0f7b6',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '9da408655f306099ca7cdd02d2fa3c8f3d1fe0acb99776c2ad6e84a0b41c8f46',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '9e8f911f79c2c1217f5220e705a4d6f3e73e99e4324f40b418787c01965c08c2',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'b6277c1dba244f5e07e09a3e6bb5c51ffc9d13f604f623d22f6ecdefe9831cc3',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'c43e2dfbe433e36cd44106bb028afe2833f85e57212222abfc6c6137eae05b5e',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'c4c591726492e851f7da68224c9de7960eb10d8dd8bfeefd2996fec21ef4b2fe',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'c7da9ae6a0ce9d4f2f3345f9f0e5da5371228c8aee72b6eeac1b42871b216e6b',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'ce71f7c38c6ddc0fb9329e528d8e1c8af6cddf79edb042feec75d11e63553f0a',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'cfdf9c5ed84c973742ed8b6e9e1d3562e5f538df0be7862ff4cd61046f8ee95d',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'd4bf048e67cdec88c7affd67ca0843ecb8eac53cefce1c4580bed5a699920267',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'dac23f10dd65caa51359c1643ffc93b94d14c05b739590ade85557d338a21040',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'e2ce53b60e290246dd5e4758c707ffd8a526d651caff49f7f06c841fd9f5870a',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'e8cf89a9941779fe9bcfd8a7000323646053dad1e99bc56f91947245900750b1',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'efa6f67078810875513a116b389886610d81ecf6daf97d55dd96d3fdd201dfac',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ '0455a8badb82518fd7825a518b4353c065d39e6364961e3212e47112a01d2aae',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ '0e8a113005d72e31dce25233bc6bf80deee9b12d3b6e2f451040e0c5f7b21c4b',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ '6eca3abb2bd469e98dccc21946a4ef4ade8ad817c64d572ce0ee07200e3014b7',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ '9fafac52babcf6fea369a45d5c4dd6725c5e1189ef0c5166d032a4ed592efd7a',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ 'bde6bcdfa2776174a082f427678b4b6ae6b2378c0ab70749422e7e0beb10763a',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ 'd2d5f174f39b4f6652677db62ab3fa5aeaa1d9c827ee9aaf2d5df8a6444c74e6',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ 'd65d2021402dd897dfceb6e581c35d43d514b6b8380f8961ef56a13c4ffe8f0b',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ 'd8889dccd673da4b71ac6d09b4cb022fe6ab59ad48e1a8f148775826a228683c',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ 'dfb4aca216ad22a04c7d7b219f67e33c6aac884afad1b73b3edc83e0bbddfb99',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ 'f89c196f56c50509038898eea569e3459200506a2492b2531b92576cb9bd3091',
+ },
+ {
+ height: 660872,
+ tx_hash:
+ 'beb5a6ab239349ff648d7f14966b116c4c0330c0dc255146222abce096c4b0aa',
+ },
+ {
+ height: 660875,
+ tx_hash:
+ '8544321bfe57ab93edbfeea0337100f078c7cfe2cbfd2e50119083c7fcc166ca',
+ },
+ {
+ height: 660875,
+ tx_hash:
+ 'd4d5c85667ba838b35ef4cf7a63ddb128aeecce498f09d415312bc30bbdc908a',
+ },
+ {
+ height: 660880,
+ tx_hash:
+ 'd0b4bf746104df8a3bbc9c077d8e88d73f2c90133a51b3c3847593e65447b9f0',
+ },
+ {
+ height: 660884,
+ tx_hash:
+ '1a49a668a59f8a5ba313466f4b487acc646898ef0a6ae0217c1037f70abfb54a',
+ },
+ {
+ height: 660885,
+ tx_hash:
+ '0784422a9da90c8894e9a82c141f367c22e8b4d8e6aadd107c9eb5c12d0996c0',
+ },
+ {
+ height: 660885,
+ tx_hash:
+ '1e34b91eb54c188602c768afb19941d332de6c1f4f5fa032b4fa90219162dda7',
+ },
+ {
+ height: 660933,
+ tx_hash:
+ '9c491d74a3fd32b4fc95fc16e7bff2f87c52667bb309efd02e1c82f34062486a',
+ },
+ {
+ height: 660941,
+ tx_hash:
+ 'eda88c7ecf1e1b3d2c2779ba6f643ec99816bfe300eb39e1f5b4f104d9dd11bd',
+ },
+ {
+ height: 660955,
+ tx_hash:
+ '2138714b1f0da1adc97d3080f05bfd5a403905dbf76f85ffe9c57bbaa8879223',
+ },
+ {
+ height: 660955,
+ tx_hash:
+ 'c8882795fbf6082cb8f77bbec75229f8c29bb14ad3b056c72ebe9e4de2650618',
+ },
+ {
+ height: 660956,
+ tx_hash:
+ '8aab07aff901695d5498b6469e380aa6fa052b1d9d84e9538a7dbb5005afdeef',
+ },
+ {
+ height: 660957,
+ tx_hash:
+ '9e46ed98a8864a42a5ccdc3d8507d03956bd37a96709655443a9480078a9dbb6',
+ },
+ {
+ height: 660958,
+ tx_hash:
+ 'd26beea3a28c80958ed7bfb5f9b9d1c22ad1028abed3e9c8e299cb5994ffd842',
+ },
+ {
+ height: 660959,
+ tx_hash:
+ '7b6ed9a3c13e69d893f217debb3d7313db8d48cf11fc7cdf2256afdafe83f2c2',
+ },
+ {
+ height: 660959,
+ tx_hash:
+ 'c2e05e20d4c0e1ee85e4822c5d46dae09b1f18dd7ff99042957519b2f0e1b46d',
+ },
+ {
+ height: 660971,
+ tx_hash:
+ '345cde8f670d8406104f9dab46e141ddba97973f80ccfed45809828e2a53250f',
+ },
+ {
+ height: 660971,
+ tx_hash:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ },
+ {
+ height: 660971,
+ tx_hash:
+ 'ff46ab7730194691b89301e7d5d4805c304db83522e8aa4e5fa8b592c8aecf41',
+ },
+ {
+ height: 660974,
+ tx_hash:
+ '2922728e4febc21523369902615165bc15753f79f7488d3f1a260808ff0e116d',
+ },
+ {
+ height: 660978,
+ tx_hash:
+ '4ebd5acb0f3c4edefb9d15295cc2e14f4dada90a3ff0ee17cf77efc57e2940a1',
+ },
+ {
+ height: 660978,
+ tx_hash:
+ 'b622b770f74f056e07e5d2ea4d7f8da1c4d865e21e11c31a263602a38d4a2474',
+ },
+ {
+ height: 660979,
+ tx_hash:
+ '1eb202ee93f673c4c6b645018a307244cc4b53ff8a307c290cbfa9c14a650b49',
+ },
+ {
+ height: 660979,
+ tx_hash:
+ '20f214c117b257910e0ebb783a6c69586a9443e640da428bf0ffdbda7abe2e0d',
+ },
+ {
+ height: 660979,
+ tx_hash:
+ '3e93389e5e5decdd35964b7b9d222c623d1be8bdbd8799ff6bb071d326e6da44',
+ },
+ {
+ height: 660979,
+ tx_hash:
+ '6daeef56edf01e7d1d2d12355236d63f8b138eebeffd7ae1c8560869c39917e9',
+ },
+ {
+ height: 660979,
+ tx_hash:
+ 'df2fc6711aca7a6368b70130af193294d7e7d77efc38dd92d16e8a25bfe9d35a',
+ },
+ {
+ height: 660979,
+ tx_hash:
+ 'e49e136606c8b1a34ca1227171dc70111da54555a174a5edfb561d093c0ae784',
+ },
+ {
+ height: 660979,
+ tx_hash:
+ 'eacbd782350e91a9afd515549711f386bf70ea764e8cd88a1ab1eb465199f4f0',
+ },
+ {
+ height: 660979,
+ tx_hash:
+ 'eea0558f33e1758aeeff319adf2d852cc91f19dfc0a7ecf75240edc9397059a6',
+ },
+ {
+ height: 660981,
+ tx_hash:
+ '4ea43afd7e538a5b11a7693f492ca94ae8ae14bed681647a55f361424666e72b',
+ },
+ {
+ height: 660981,
+ tx_hash:
+ 'aa026cd63ba572037c392339e39274447dffc38701b5031168cf4de987fef179',
+ },
+ {
+ height: 660981,
+ tx_hash:
+ 'd2061b1797436ec6606bdc896036c407b552ff7acfae65ca0805b6eb4d6fc385',
+ },
+ {
+ height: 660981,
+ tx_hash:
+ 'f37e7e580c1a5bd4c911ca9ea4f670ff7e5caee36efdb2644089ca15fd28c23a',
+ },
+ {
+ height: 660982,
+ tx_hash:
+ '4e8e36e44042b118849d377868dbe076b5139beaeb157db53d2d65c1f9335a67',
+ },
+ {
+ height: 660982,
+ tx_hash:
+ '67605f3d18135b52d95a4877a427d100c14f2610c63ee84eaf4856f883a0b70e',
+ },
+ {
+ height: 660982,
+ tx_hash:
+ '6bb01684939b8388a2532529e6dc27d1bd9d47ab535b7d4a55ec358b6cd8b282',
+ },
+ {
+ height: 660982,
+ tx_hash:
+ 'a2f259ccfc6abd682efc37732dfadb755a6ac90212579dde1b38f6af0d99684e',
+ },
+ {
+ height: 660982,
+ tx_hash:
+ 'd9e26201a0d3af9988e496c19b70ba1cd0eb5e40c4a6e5921a186ec1b25ca590',
+ },
+ {
+ height: 660989,
+ tx_hash:
+ 'd2ca52613c9899994cec69031828d43446b8158a521a6c7aa5df7a680fb4f7bc',
+ },
+ {
+ height: 660989,
+ tx_hash:
+ 'd576a359680d9c38da6e1d1cc14650f48638c150ec47324a3f6cd5d9da3caec7',
+ },
+ {
+ height: 661014,
+ tx_hash:
+ '783e2143a1a6fe6c27399e57ae2daf8f56b39d6c1dfe9414276636ea51e3145d',
+ },
+ {
+ height: 661014,
+ tx_hash:
+ 'a36639832da9abe750e92e2ea6e59e23b74271c7e1cf9190d9c51750a1e66f01',
+ },
+ {
+ height: 661014,
+ tx_hash:
+ 'c81ed42ccd7a7ace4c513ddaefa18c212cbb2ecb5382e2ee95669c1ae5708b79',
+ },
+ {
+ height: 661014,
+ tx_hash:
+ 'cca1d12cb240d1529d370b2cec40b2c0230586d0b53f1c48f6dac8dff2702672',
+ },
+ {
+ height: 661016,
+ tx_hash:
+ '525c840975a69ab365014395b39012ab95837ebb424088909a90bf25dfabdef8',
+ },
+ {
+ height: 661016,
+ tx_hash:
+ 'cfb409bd0fe1963874f1614c8848afca17c6fabf506c8da556c7a2616997f391',
+ },
+ {
+ height: 661101,
+ tx_hash:
+ '132f2bb5a3bfb691935b67c50c66d0fa63e2621d248d7e64f1dccb112225c9eb',
+ },
+ {
+ height: 661101,
+ tx_hash:
+ '2a00a8ed679e48695971aa87cd9c1e8ee37d2e885c12be11753bde435703a826',
+ },
+ {
+ height: 661101,
+ tx_hash:
+ '7cedb43b52348ff11cd04e553dabea054d259a4cd3e63425d562ff274d1b970a',
+ },
+ {
+ height: 661162,
+ tx_hash:
+ '68cf511d628b1165d50a463e298d50228171c35f2965529ee072a44e8550deff',
+ },
+ {
+ height: 661162,
+ tx_hash:
+ 'f519a4362eab88cc9369fc7fde776e289f4207ecf85905fd39663202842397b8',
+ },
+ {
+ height: 661527,
+ tx_hash:
+ 'cdec8114323d28d3e1b23df7d25e4e754e838faccce6c572cf48f05a3640ab38',
+ },
+ {
+ height: 661528,
+ tx_hash:
+ '366c4216919295f0352bc7da56a4d9a79724dc1a55eacefeb72b38079c08d377',
+ },
+ {
+ height: 661543,
+ tx_hash:
+ 'a2a24480353b1fa888d9279cbb6e0e3181a1217c9afe4ffc93d8eeeac12951af',
+ },
+ {
+ height: 661642,
+ tx_hash:
+ '178f7f09766b25f966ca11d2a1d5ea19bb4ff576c2a010e42616a1ca352fd503',
+ },
+ {
+ height: 661642,
+ tx_hash:
+ '2cdb5d2669a6f7273fc51444c9eec61f2041b6891b5002e0f3d43a9be12ab822',
+ },
+ {
+ height: 661642,
+ tx_hash:
+ '65bbcb0d5c1938899314912b69fc12d92ea3651aaa2b8685b3a46f055f7bdd7e',
+ },
+ {
+ height: 661642,
+ tx_hash:
+ '6b87ac222d555227f1ca6536a85902e831a80ba43a354bde3fdf4e30349a3732',
+ },
+ {
+ height: 661642,
+ tx_hash:
+ 'bd2e857a2e012e608f11fbcd7f399eeb09b530c4036cd3b8af5d63aef5fd46f9',
+ },
+ {
+ height: 661642,
+ tx_hash:
+ 'd24167545062ab25611ed9497f556d96769068359fdb909eb06a26c655db1c10',
+ },
+ {
+ height: 661642,
+ tx_hash:
+ 'e43ce30db0807d75c75a89661e1e7dad7cc32a0a532f1c9144a88613dc0e17ae',
+ },
+ {
+ height: 661642,
+ tx_hash:
+ 'f19b25bca58f254bab30b9ddb29ffdc96d021feba8f0777afaca422a7f20dfd2',
+ },
+ {
+ height: 661642,
+ tx_hash:
+ 'f26ccf97f90d7f5bf5e1e4d1e429449d3af3b2a4392a171ebadbcf509b6e73ec',
+ },
+ {
+ height: 661700,
+ tx_hash:
+ '7c1e51bc0aab105808b042f21f1ad95b79cebf79fae89cea2230e1ad933b6cd2',
+ },
+ {
+ height: 661700,
+ tx_hash:
+ '854d49d29819cdb5c4d9248146ffc82771cd3a7727f25a22993456f68050503e',
+ },
+ {
+ height: 661711,
+ tx_hash:
+ '12e48ae71d51104d55133ad3af83892650290a5764953f5b3bd2095c9a52c574',
+ },
+ {
+ height: 661711,
+ tx_hash:
+ '19dea491d654a9acd4ceddf38c81b79f3c1e0928c3c73862bbff5d4cb4c52889',
+ },
+ {
+ height: 661711,
+ tx_hash:
+ '28a83416798159c3c36fe1633a1c89639228f53b7b8e6552a573958efdef74b9',
+ },
+ {
+ height: 662090,
+ tx_hash:
+ '9f9e574b906097d4f770dbb71899e3038c3d6b2cdd9649255bea5d8e00c7aa3c',
+ },
+ {
+ height: 662141,
+ tx_hash:
+ '9b5c34bbab8a45d255b45f6cfd66aa378df61121249bc3c7610bfe797c8f0e65',
+ },
+ {
+ height: 662159,
+ tx_hash:
+ '05e90e9f35bc041a2939e0e28cf9c436c9adb0f247a7fb0d1f4abb26d418f096',
+ },
+ {
+ height: 662799,
+ tx_hash:
+ 'b399a5ae69e4ac4c96b27c680a541e6b8142006bdc2484a959821858fc0b4ca3',
+ },
+ {
+ height: 662874,
+ tx_hash:
+ 'f517a560df3b7939bce51faddff4c3bac25fff3e94edbf93546cbeda738bf8f3',
+ },
+ {
+ height: 662875,
+ tx_hash:
+ '8e325d3349f213e47dc0ffe9a855676dc029d9ef4643f5b292d24915bea78a35',
+ },
+ {
+ height: 662935,
+ tx_hash:
+ 'b32b1cbd27d9a597ba651a8d36990da188c0466ed58678b420877e1fb3d5b2b1',
+ },
+ {
+ height: 662935,
+ tx_hash:
+ 'ec423d0089f5cd85973ff6d875e9507f6b396b3b82bf6e9f5cfb24b7c70273bd',
+ },
+ {
+ height: 662987,
+ tx_hash:
+ '9b4361b24c756ff7a74ea5261be565acade0b246fb85422086ac273c1e4ee7d5',
+ },
+ {
+ height: 662990,
+ tx_hash:
+ 'be38b0488679e25823b7a72b925ac695a7b486e7f78122994b913f3079b0b939',
+ },
+ {
+ height: 662990,
+ tx_hash:
+ 'bfd855323c7b96d12c89e01e921f0a17c31222470960fe729aff172cd7f8928b',
+ },
+ {
+ height: 662997,
+ tx_hash:
+ '07654bee6690bb5a21ffe2bdf3b5cf7c6b0e9b353cde367e20d2983ad5afdd48',
+ },
+ {
+ height: 663002,
+ tx_hash:
+ '112a272092a7a06cb9c921c65315bca81f0485764a65ffceb788ed49b3ea0a66',
+ },
+ {
+ height: 663002,
+ tx_hash:
+ '474561d656f09c2aea939511393687723aa21f8d44cc56c13dc32c6f86344a48',
+ },
+ {
+ height: 663002,
+ tx_hash:
+ '9ed13602946d0197a5fec0caf1d43a9acedbf7c37d676560e2045c271e1717bb',
+ },
+ {
+ height: 663003,
+ tx_hash:
+ '9fe41b7d515ec788d5b09b687357d4605e2f6be35f49ddc9214eef324e793968',
+ },
+ {
+ height: 663003,
+ tx_hash:
+ 'c3b089dbe19cadcaf6344f6214fb782b2d3836060ae3ae9a8c3e595fc46beadc',
+ },
+ {
+ height: 663003,
+ tx_hash:
+ 'eaec79b1f5dcf0fbde6c2b8af239e327cac51e5ca1a9e80f0f419f4134a494b9',
+ },
+ {
+ height: 663004,
+ tx_hash:
+ '0d42d4d3609cf1691feb6456e94042cd9361cfc3d8c3b1442d51cfd861a301f0',
+ },
+ {
+ height: 663004,
+ tx_hash:
+ '3032d681c81e4a7655a000631685683162a1d04be9055b5ecd8d2da34cd86277',
+ },
+ {
+ height: 663004,
+ tx_hash:
+ '40ad1272a9d1837be02314726b830efb242bb28148ead2506f0b0521c6f37f7e',
+ },
+ {
+ height: 663009,
+ tx_hash:
+ '02d01be28eeec1a9a604e83915e63bb3b13d08a4deb7a54a660aeab4034ac58c',
+ },
+ {
+ height: 663067,
+ tx_hash:
+ '8c02c524bcbc5f0e11cd509d32713a874d0b9504f9ac243adbe2e1baf10840d6',
+ },
+ {
+ height: 663067,
+ tx_hash:
+ 'ea3cf7db958672d580a1090c41dc79f54ecdde34a235944eb5d5477d9e7bff64',
+ },
+ {
+ height: 663069,
+ tx_hash:
+ '3312d01a5c864fb9effc7a78f0a10ef3bfef9b04cec676a0a3e8ac5af47d5c24',
+ },
+ {
+ height: 664778,
+ tx_hash:
+ 'caa4f6b97689b5aad338390fc0ed28e843099d69f60de5ba9e5fcaa85efd9828',
+ },
+ {
+ height: 665029,
+ tx_hash:
+ 'd6dfd3690e869f2207540ca7391d8fd7ffc84402d16653724a09b5d915595b5c',
+ },
+ {
+ height: 665029,
+ tx_hash:
+ 'e7d0d9cb6d64988f3f89ca2ed2a2260c0077c01fda10480ce45976ece2596d7b',
+ },
+ {
+ height: 666951,
+ tx_hash:
+ 'e5a3f4357f703e0874779fb66e7555f7ac7f8e86fa3fa005e4bfcfc1115a5afe',
+ },
+ {
+ height: 666952,
+ tx_hash:
+ '026c66da4eabcaf7a55f578d82c317499497f97324009008e8963b4799497286',
+ },
+ {
+ height: 666952,
+ tx_hash:
+ 'bd465ee1c47e697c2d952f58e03d9cade28492e7bc33490cb962a3c3fe31e77b',
+ },
+ {
+ height: 666953,
+ tx_hash:
+ '90bf09271a83f27815c36bdc5eec25fba52b21241854f3f483213197b5bca827',
+ },
+ {
+ height: 666954,
+ tx_hash:
+ '1b19314963be975c57eb37df12b6a8e0598bcb743226cdc684895520f51c4dfe',
+ },
+ {
+ height: 666968,
+ tx_hash:
+ '3174c1ed5b7f1e5049347f6af4bd6744d24aba9c944e610b8cb56e407d63d948',
+ },
+ {
+ height: 666969,
+ tx_hash:
+ '5b3f5d76cf67533773098222b1aff0848c7754415ca201849a325580c46ca8f9',
+ },
+ {
+ height: 667560,
+ tx_hash:
+ 'c14eb8d5d4465903b9395738b6389dc43b21ecf864036c00bc36f5fbd7b744ff',
+ },
+ {
+ height: 667560,
+ tx_hash:
+ 'e6f556f5ff55aacebc7da7475cb4e48759a56f137c2659dcd86524b6ec2a0fc6',
+ },
+ {
+ height: 667561,
+ tx_hash:
+ '4ca7f70996c699b0f988597a2dd2700f1f24f305318ddc8fe137d96d5fa96bf5',
+ },
+ {
+ height: 667749,
+ tx_hash:
+ '65f24dfe69537363ddc415eca6142f268865442fe59f8abda7bd05585f63fe9d',
+ },
+ {
+ height: 667749,
+ tx_hash:
+ '6809cc8f0d715ccf5c7eb4c57242a87d1c53b2f9dc28f1c64ea54039c0561e5e',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ '1ce0a38e2a5a4afd594a7f901391f02c511ca6007fd6603a19f312493f8fc773',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'a0058a66a161c4b72bd39da75baaf58f59dda6208cfa425428b7934b12ba4bca',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'beac172f5478506f4fabd936ea853ed23d776abd4daf965fdd6bd0a3a50aecc4',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'de912bc7a6a1b14abe04960cd9a0ef88a4f59eb04db765f7bc2c0d2c2f997054',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'e25cebd4cccbbdd91b36f672d51f5ce978e0817839be9854c3550704aec4359d',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'e9a94cc174839e3659d2fe4d33490528d18ad91404b65eb8cc35d8fa2d3f5096',
+ },
+ {
+ height: 667751,
+ tx_hash:
+ '05e87142de1bb8c2a43d22a2e4b97855eb84c3c76f4ea956a654efda8d0557ca',
+ },
+ {
+ height: 667751,
+ tx_hash:
+ '4ed4a971fe2077211c29288ac0d24253c15301483243db431ae181e2eff0eb63',
+ },
+ {
+ height: 668550,
+ tx_hash:
+ '38a692e3fa974ee186eedc3a03bf3410dd03a5f35bc44f1a07f287b669dce44b',
+ },
+ {
+ height: 669544,
+ tx_hash:
+ 'dd684fc2396a90dd45c1db807a3c2fbb930f200b9a31bdbf02b05dc42bb2503c',
+ },
+ {
+ height: 669756,
+ tx_hash:
+ '7ced28d072aa6c246f4ce1efb1653a4f1f7c6f3d79c2471d08b5699ba52a41e3',
+ },
+ {
+ height: 669756,
+ tx_hash:
+ '9300aeea6abd0bc4942ed0873d835f26d2d62ee0c283157d4e84a762b74acd0c',
+ },
+ {
+ height: 669756,
+ tx_hash:
+ 'a3a82f06925809c784071e60fd2bd2a5a33ff33bc618d09c208b84f73291b4d8',
+ },
+ {
+ height: 669756,
+ tx_hash:
+ 'a8085391b122bd5d2531bff991752d9eee1fc0efd990e35693cd05570c7c33a2',
+ },
+ {
+ height: 678992,
+ tx_hash:
+ '5072cf021e0301284cf1cc1eb67dcb73fe8eb1f2a4fc3f8f3944d232e3946551',
+ },
+ ],
+ address: 'bitcoincash:qqvcsnz9x9nu7vq35vmrkjc7hkfxhhs9nuv44zm0ed',
+ },
+ {
+ transactions: [
+ {
+ height: 655282,
+ tx_hash:
+ 'a2bca1755f2f75302f503d42cbf12798c86ea7dbd68879ee77835f7e03bef66a',
+ },
+ {
+ height: 655283,
+ tx_hash:
+ '6be465f36e5600f90ac6f7a802a7133e042081cafe5f57474290d661e6c94bfe',
+ },
+ {
+ height: 656152,
+ tx_hash:
+ '509de402fdb55a4a99d514793838ec995113b172e94aa8b1f5e28042094c5b2a',
+ },
+ {
+ height: 656152,
+ tx_hash:
+ 'ac3bf783a3e8de97031981902ff07263241f4be9909a52fd06b8b7a253194144',
+ },
+ {
+ height: 656154,
+ tx_hash:
+ 'ec578e23b3ada9e89dbc75762cb1c0e92e968e9c30971f52d48d2e0ad546de99',
+ },
+ {
+ height: 657857,
+ tx_hash:
+ 'b887cdcf5a97b9c0186c6d32b6be5db41eb02c8dccc10592e6bf316d50bbb7bb',
+ },
+ {
+ height: 657864,
+ tx_hash:
+ '3e9d9a472655902b60e6c172de67c91216c1bbbd8550506b8d3bf48abf5acb36',
+ },
+ {
+ height: 657864,
+ tx_hash:
+ 'b98d293d732731898b968f6a11bb66a59e18e291fe960f82b2b3f0d6da754d69',
+ },
+ {
+ height: 658606,
+ tx_hash:
+ '03111a95d055895b67171c7406dd5744b7236a3573dfeb7c78612f7bf139760f',
+ },
+ {
+ height: 658606,
+ tx_hash:
+ '282c7fc7a4c7c00a2281ee8dcfcd0dcb6f3f2370e02f6036bdd4ffe67ecdab09',
+ },
+ {
+ height: 658606,
+ tx_hash:
+ '625b54ffaf10d2465a3ef974bfc8de1e85e030cf867f922330595b54345b398f',
+ },
+ {
+ height: 658606,
+ tx_hash:
+ 'e376b46ae69e1b13605771175b589512eb67d449bfe192fbf4091f1cb12a8494',
+ },
+ {
+ height: 658858,
+ tx_hash:
+ '5c31db4dd23c4bf07e1acc7fdd60ebbe71d440870436f01fc0f880c9445cba38',
+ },
+ {
+ height: 658949,
+ tx_hash:
+ '0bd36fb01ae6fc42786a05ef09ee8bf4eb1d57971f3255de24c9aa0bdd68c2d6',
+ },
+ {
+ height: 658949,
+ tx_hash:
+ '3cc9426f3a614dcb52c3d5b92e3d5cbdd77de88301629f1036d7c2886bb76447',
+ },
+ {
+ height: 658949,
+ tx_hash:
+ '8079bdd493ba356f648d2ddf6f4b3ba09dc0d952957fa22eaaecb06e1697befd',
+ },
+ {
+ height: 658949,
+ tx_hash:
+ '86625479a813ffa0b2b35c104fbc0a136dda953794307d8b595e08a6cf836522',
+ },
+ {
+ height: 658949,
+ tx_hash:
+ 'b477a089ea48b2664b32331ddd74811454f0e42004be2913aef02eef78ebdbfd',
+ },
+ {
+ height: 658951,
+ tx_hash:
+ '956928b7e195efb9c56ed05972a1127bb90b46cd43042a02729a59e9e048384b',
+ },
+ {
+ height: 658951,
+ tx_hash:
+ 'a57bd01bd55a5efd1c48844690e7e3a20845bb8330c50ca750ac94b0d96a726e',
+ },
+ {
+ height: 658954,
+ tx_hash:
+ '0f5759c0a0d9e7a94e7223037e7df1bec2c92071f6fd1bf7564161a8a7895565',
+ },
+ {
+ height: 658954,
+ tx_hash:
+ 'ad5446c66c94bd6720597c73a4e2f2a8c0ad8e78a05b32a26a25b3721488c054',
+ },
+ {
+ height: 658955,
+ tx_hash:
+ '3fdc120cc59bcb9d6288abf2cb3cb7c63a1842bef07130687af583834a62a543',
+ },
+ {
+ height: 658955,
+ tx_hash:
+ '43fbb29047b9f80bcd0dd82422a23a00466847d610dc70ab282cdb6bbb3dacce',
+ },
+ {
+ height: 658955,
+ tx_hash:
+ '5ad98ea8090b992b0da6945695ffa5450664fe1aa52bd17b6fe4dc9e03605446',
+ },
+ {
+ height: 658955,
+ tx_hash:
+ 'ecb00a019d9e19bc6778d77f298f44399a98298a5f5f977289557bda6aa61849',
+ },
+ {
+ height: 658962,
+ tx_hash:
+ 'bd438eef33e6ab34dc483112fe6ac17285d87115034c6f7f4bd5d2c5de350bc2',
+ },
+ {
+ height: 659158,
+ tx_hash:
+ 'dd79b73aad99e8c2a3dc395b514114cc0d22fa6dbbec52b1db752873f109ca1e',
+ },
+ {
+ height: 659159,
+ tx_hash:
+ '735ab6c1cd174392bb513a4c0ee14e7296862159b64778e13bb7b058ca42e75f',
+ },
+ {
+ height: 659159,
+ tx_hash:
+ '783bcbb0d332c990a520b905306e0d2ae6697bdeeca6a0514b3a94572c010e02',
+ },
+ {
+ height: 659159,
+ tx_hash:
+ '8d4ef8ba9e2a746525a98e25d2b8944c9dab33a912b67f912b17f90c46bbb989',
+ },
+ {
+ height: 659159,
+ tx_hash:
+ '91746d4b1c8bcce7c3f3d02d18dad82c610dfe77c65e24e59d35a1524d091569',
+ },
+ {
+ height: 659159,
+ tx_hash:
+ '9edb01cf23ddffd1f8188b58486e6f6724efcbaebb120b0867f84ec27364f00b',
+ },
+ {
+ height: 659159,
+ tx_hash:
+ 'ad18e589381b3b1225c553b1e4293a988f362789dccca8f130d76f9057d8b0fc',
+ },
+ {
+ height: 659159,
+ tx_hash:
+ 'ad9583de275e3a28df773ad91f7d37d72662d7cb2ee7e0c67ad04f86473f2c8b',
+ },
+ {
+ height: 659159,
+ tx_hash:
+ 'c49ceb74852b12e08ed7d7e20763a8cbda1454204c0642d5d3c23c59a7316b06',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ '01abfbf72a9448de15918bab59280430fc404cb1f362d5afa14a991a2e425158',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ '03dd0b84bf3563e678fd2dce44e2a4abc1112ac41bf9d26bfc6413154bbc6c22',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ '0a38451e16fb5d0bb23c1a579e129ea02b10fbbbaf64a99e8ae0608d8476d1d4',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ '21575a23b6f7b4c486c462bf04a7a6b040587388b18bee27e29f5ff376b8faba',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ '24376fb63a46e3eaa0a1ed5815c96ec4cbc4b056e96f636b98eabc6611a0de77',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ '27cf55e7237f1f2cab3b8eced79004b75952405871237003951fb312448b3f19',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ '2c94723bb024d466ec3883ef33ea348e83b78b990c5e34bd9d1a95b5c1be879b',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ '38c93b75010fe701d53f6c335a74f148f970c4d7bc285c6aa6e37723c4cf6c61',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ '399185ffc3bbb028c71fce662ad18b6eebb66e2a33f4d65fbff300e7464fed99',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ '3af0663dfe6976ed5d5aa55ed023970bd159e773bfb1ee097ba95b63dce3c51e',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ '47f40be465c22f23196afa9f616d126610c2600ec560bc385f0a1dfc2a9d07df',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ '86e873fb8d5504a7826d5730f42e34ec0d7a79b4eb6603078cbc354b5ef512df',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ '9e9ff8b1bde6ee12a7b690ab62f9cde09a5b67e823400891cfcacd64da4cf3e0',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ 'a3fd236e66e4a8c007268d19f2fa83466dc02302880bae4688bd0ee4c8f09ba0',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ 'a411a2357a58d044233067b25a78bcbb92ec1dd1b2342472187acc61dcdf9f46',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ 'a433a99b834e1ab8ced4b98ae1b06c932264e096c078afa154ed38ba5b38ae2b',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ 'a465ade0cbda4a3bf0f3094c5767f41b5bdd09ad5f7417f8ea637e3309ae460a',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ 'adf34bf073630b6cba82de054087a976411e0dc8207006f8e125afb9dbbc46cb',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ 'b386ab584d429b47206f63073caecf635e98e2c9b338b268a89a7a77ed1b64f0',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ 'b58eb442b60f46a669f9ff2f7328c2be8168cd9b9bd466e87c5d9d72a2605ce5',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ 'b9fc16c401eaaeb2da1bcf4803e83585d58d2a32ef9dbb33ffebe053406bccf1',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ 'be95cdb5bdaf3b32952a8b1fd676d53062f474912c1ba3eff743d6d47301deda',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ 'c775b506e6fa63f7dcf2b3716484833b5c095c36cc148d688307964e3e39282c',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ 'd23f36c4c26f1c35cef2e74b3a9ccb7c60b5bde63464cf95421f652e1312d177',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ 'd4d91292de0cc3bbb3dafd25284c377f4d0614119bb52e9959dbf06cadbb29e0',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ 'e4143c89c138aebf3b75dcb57f6cac87d438c1b926e1bc5e3786e75b4f5d9c7f',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ 'e502b1e7e180a47a57cc879c7eaa5a7533f878670af28bd7d1ff53ce4b8b9a48',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ 'e9becb4bdbeb188d989ca9dd0de8c3a98d34ce4a72a178adeaf1b900a82a128b',
+ },
+ {
+ height: 659160,
+ tx_hash:
+ 'f305a8d09d939676656f5da3f4376804dd9dbb40fa14b7ca8b58b4e6f9970ad7',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '02685ff3e16ec7f12e7e450bebe5a75e2751c9ed7470df8f8a2b72a785523f7f',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '05b9990e6a3ce75ea850903307aa91391e6eecb6a6148d3f9e7ef584fa690052',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '06508e4e4655799aa801ae6bed92fa19ddfc62e1aab731c013b80c66d9f43cf6',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '07a916010277d0e1d3f32d3969afd43ee9746bb89ea9680169c467a81894e3a1',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '083cd296a57e4050bd9dce38ead0138ec4eaf121a701108642b8ed48b9ef9ead',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '0e3965646e30067fd1432561ff17c75d2a8b3a5b81f3b1c0c8c79fb68bcc10e6',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '11a362df9554237913a813238473d20bbcadd81810e73720d3533b6ebf6292d2',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '1613b77686cd7298cd50581d736312593a78095ad6991dea4c5e4d3f5b0ea861',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '197ddb216e03f888a65f141bb80937bffe66d9eca416323c11b1946c855b5795',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '1b87dde05387b1749dc900572b7f242c52096e4de40ca34000adbb5364c56c7c',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '1cd9cf58eff8b16f0a279a7a02ee11ea9634a51334cbf006229a1d71728f6ede',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '1d5da36f5e4e5e6bb3c4058b83332c0b033dfaebb931796e12781c25573d1307',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '24ba358ae2863305f4a1b9f6cc62e7bea5c3abe7430efd416ddf02d5d12f3e20',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '28dd41fb6ac8844c7c0051f25a5417064d9436ac8f37376dff070699eccb3f51',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '34006b2adbdddb43b3fa1dd4c5f31647b480c0fa1a2ef3f63b9ac6c69c6c7712',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '3775281eb54bcae81171b173898d9b9f504af3305b4fcb5c15849d39f7951b7e',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '3d8f0345125fa2ba6ed0f5975079797fd34cbe17930b3d376a2e33b6237ae6ee',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '3e6da124c5ee8c7a6f69d4645029272b4bc7840986ea3ee01aee5f6e14bef238',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '40ce5aae5ec15dfec5ddb2d21acf0be5bc4b2e37e1bb92ac38723a9e7c0f0949',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '46921e8ef342949acd61183be38536e3b7be1891282cd75706751660700e7252',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '47cf9bc48fc63f762bc7c71a65636c8457e48fe36b514aa1d6c0937eb43895a2',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '53c044195bda3d73b99a0c01b5cd06f018c62f9416ad1845ef80976f22f2a8ee',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '677142a44354f335b1f17afa72c8d6ed5553100b6a88dd2cdf80a88e3bc134f6',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '720db40dd8995598dee7f372300e0466792da3a23fee382e60a1354ccb511513',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '7369ec44ec0873dcf5796f0f035f4f604b75f54b23479cc018e29e14cecb3f85',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '73aa6e17dc5edfbbc44824848d98f3708025774f3f3c8f011756fb729dd6556a',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '751c989277fc0febd68ddd5339f98d618d778130ff61999a6dda805099d12f1e',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '7a0f7352bdef23f8dd719225706a1b07323faf319b0fef340b5648d1512b34cd',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '7d5a7701ad539af786e2b36aecf595798ea3e700e5a4f89ef8627a42a2f17080',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '7fb5e13383ec6bdf5b99848209841bd545119ab817b944ff304d60d19297a09f',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '869591ba44d01ebe9b314f3c4a43d100ea3ddf351da1b9a31d5fdf1e479a7f88',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '8dbb6fe432a0632b9d5a7e354ba6563d4d785982c49e91ed706ec912e57d3a07',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '8fb0f12638445e6d7d7cba31d1f5e2e833397cdba11ffafbc444d4ef49007ee4',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '92acb09359c5b4bc449287817404e9a7bfe2e0de850b2a92e89b497b42d6bd4a',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '936024bf74e2ecdd5c820b2eda0631ed1052e4227a8d118e802d1230fa936ac4',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '99955c1b409b5c833aed764eec99a455e38a2638117441a5f56b7e8a9b955866',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ '9ad178f413c98a869ff62b79a358854984ac3e73d4d4e4a5fa593d539d7b0e53',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ 'a19cc2df0b76fc8748dcbc83ad7803c9cf86b5b986e04af6f48284a78264f615',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ 'a8002a3b70ca848888af45cf0e85a1d437cbf86213ad51116dc62c4410f28254',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ 'aa51b7b4080cf71e0b6cfcdd863dc31d797a5ff899edfe76a70fb8e158a2829d',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ 'b2479f5d4514a10eba29b67cb667b8dc3c3aa8e69e27b9ea094b2f2f23e93e1a',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ 'b4942343f75fbfe86b57b8dd1fd9078b88da2f7c305375d44281ceafa3fa0e19',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ 'cdc3812a9dfb419373f049098d0ba99f98f890c2c36f8cde6f795162316bfc4f',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ 'cf8d733e924c9e1fc011ba18cf578b063685f4042f774643de3aace3a2855e60',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ 'd602f334eed4acc657745341f233cbdbe1c4ec0bae11b91899afcc35c33c8de9',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ 'd9b919bd4b13e565c90cbd23e8344f2594c30a3983d37387fa68cd725000c4e0',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ 'dfbc65f14e7e8eb3d4b9b6a764649cddda680f3615fe494960f0cf11335d08a4',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ 'e4720469fe15237b17ac4bf455cc137c14a569e5a711db0d1b85fa6f0f2d777a',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ 'e5c8330c9791548bb6ee6693db9ba54bf72c202cf7418d3e1df1f916f3c08714',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ 'e614b68dced2df69877ce3e033b53421f8040ae5408b6150c5c11a408b6aa469',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ 'ec73e21a329a2829927a98b2f8372d1d840d3e1ee0383320e8c78c2fb331a4fb',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ 'ee3f7c7345e74cc47d57b3985cc9ce2ec0a2e5952806f8fe46f2b10b0038a9a1',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ 'eecfb35d64209e0879e5abe74cf5193f4d91e51b1c9671e35d30242641b32fbe',
+ },
+ {
+ height: 659161,
+ tx_hash:
+ 'fcbf34a7d2b7606cabdc2fcf867c515d3e4d5a8b5938f4c2fb72cc1e256a02fa',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '03d1e412c4041714f6a60771dfca699333e6ae39c61bd366457fe6a22ef6c245',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '06b5fced550ffabdcacc6a35a68e26549cf256b448979ca53d1df777485efaef',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '0bf8106d2d7d44dd953c57cecad9a4ca61a86d74f466f2d80f91257c336d94f4',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '130b14e5572dd0354b322b64fe8bb247b45ed6b17fdaf76d2a261734b12d73ec',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '218aeda3a2d2c4bd19a637bd3f450a61e7c43ecd3b49b4a2feeb1eb083cd0d52',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '23169236c31882ed4ab80aec8c976e8f7a6e0f1c138a9730ed1ccbb23078c2f3',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '2395b41864147749241c6d46681a39869d3cfc5e7c69d1f994ecd6d7afe2d4ed',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '26655f039b1ec067cdf78a74648407f0daca198de5b53e8a4cf62c26707b284f',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '287d19d754e46862c46b226ec7513b2b13a94bc78c7c5d85b95aeb5d8ebd7108',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '2b9b5b21b9b4dc45ee3bde8e5e7f72b6905b88009dfa86368404f2b01a3fe9c3',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '3c79e562eb18ef0e313e96f389fe084db7ee987ed7dbedb0b31e430450c1edc5',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '452dae2d1ed6ef2238d8c94273d5d30d73b03b892f8ff256a2c43a2ffce3fa31',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '4721c01a65334b9eb98e3abc6027db81498358308b551b24f6b1d5479a274c8d',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '522c2c044921190f9856ca9f94e50333f265e254c302d5fdd0f4aadc8b7a3414',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '5988f4dee9ec81ae600e98934b2396c12485dc9d39d934ca3b8090498ee53b93',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '760017fb9c6d13c12330ea9607f2f257bb922bee2e394419238019850302e607',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '7eb06e041e6ad149de3b5657ba525374a342a7044473e3ddea8fdc6df8c8deb7',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '84ae37c21c8c9553e39f6dd1cf415afbf16fac1646028c2ddbd5347c64555975',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '867f45bb5dd38efc872c267faefdd9012c6ee24cb945308f1c99a4f8b5804363',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '8aed6589d8e35535b06f82570039e7ce6dd2d45c7d7d8de58378791994d04bb0',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '90b443ae1073c5786e50f0d093fb99f59fc4d8a96b25662444f7c8975c04cb5a',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '9162d2aa65075090a25ac884ebcae6e1f37c5a4600d015aa37d809227757cfae',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '9551e117739d115d98dccc9e00ef75ed62997aba76432a3766a1da56c61df45f',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ '9d508b09c1e14e432c9415cd3d853bb3365c1b6c744be4589d6c3fe89aee476d',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'a0be17a68a426b7af4ea6dd3bea002fb5b2ed4299874f6e0df734bc6fa12b027',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'a7db7170cf669624b88fa90e56b2d2b9a45be61b8e0e1fa640fc9ec02d7e4776',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'a9d933a595f69cf8a0b21bd86b795faf43191deb33f4d02735fd4b6a951164be',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'a9f24237ba16deb2a8ff987c7322b1de90da98d2aebad1d5b33c81774ecfa69c',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'ac8e1037681244a7a45e544ea4fff956947132c9febe97c74e79dc4484e06b38',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'aee40fa670006bd2d903794f1eedc4865143ef4ba0d64fe2afca41e86adfc7a3',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'b229c3e8ac8ec92cc7dc40ae8230c3ba7acb65556543bb9417cabed002b5a734',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'c1642decd561bea919e654ccbc86c7d0952ccf05a553eb696dd444146b965d26',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'cda3aba7ff4a7b2c863abab330acd28b0f469f025bba32b9efc834aa58b6cefa',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'd2cf1af4b0cb2a9aa34e06379ff711e4f76c88238ceceadd371341464fbbe0d3',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'd7ff04c9b379b0385d692be33929712f7511f83863b49e71f2379feee010f5be',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'd8a752cce4fe94543712f1e1646cf548a42746ffad9d7e407b5865058f780e4c',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'd9190cec840e05fde43e49df98d857978e756abedf639b5398addf26578b75c7',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'dd86ec7e136011d7d33c6910d013201b669813112094652dbe3ea15bf742fc86',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'dda49c27b8585394f028e91115b9e138643c915235d47981ec8ce024f55cb834',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'de5e93f34b6a374d27d73945bcdf74672dee50e783ab59640cff8839db5f0c07',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'e6860709a1498653f1d98448f8a428cf466dbb12fa417dc03e115dafdc473e95',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'e88166f8f9580714b1fd461135f6fb59235a6fd8783d03f4907e7b86ef5f9977',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'ea42f3eacbf9622e5b39cbde7e9bcc5fdc273c9cc875c44bf5469d70f911cdb5',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'ee1666857a506f206aecacc7012d7e11d494c5384a62ce06aa127fc577d71edd',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'ee330f80c7d7dfce33246ba078e54fab597c7a2bf0ba75ed369668dd7a27d43a',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'f0f05925d23c3990ba99e3f224d552b8ca355bb9ef5432b7a412c34c2a2844b5',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'f1bf4ea7727010696af9cae2fc5f5a4d0af1362eb2d4d86aad8143ecca430c14',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'f611f7309d6a8c503ae71196dd0b5ad96e098c034ccb1c213c0cf5634cec3f29',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'fb2e3b82b42cef7a3e3fd67a87b6e07208fd61e60d9c540bb4570a2c86503a09',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'fd8686a78e16dcdfe957a32c6a418d050c21bcd68c46a681d807f465d1f10179',
+ },
+ {
+ height: 659162,
+ tx_hash:
+ 'ffba24414a29f141f28aae155e043e0f250f83a7d7e758901e42d3096f5ed47e',
+ },
+ {
+ height: 659263,
+ tx_hash:
+ '067eb58a90ca35451c63a70a2f96337291d02c0510890cfe6878474bd22d9751',
+ },
+ {
+ height: 659263,
+ tx_hash:
+ '1108c0805e66eddd656898e25bce73bcc83b37fb87872c446e1629a7243e60b7',
+ },
+ {
+ height: 659263,
+ tx_hash:
+ '2ff0ba001a055bfbf48a477be5db3e31165997d5e5024acba596acb9dd96b363',
+ },
+ {
+ height: 659263,
+ tx_hash:
+ '4cd0d8ee147d27a741467d7605876fbafd30e4f540f2573e03293ff3bd8b5044',
+ },
+ {
+ height: 659263,
+ tx_hash:
+ '6cfa1c03be334ec0481b25c85db2a592d29b2feda13e94751f87ac3921f93a35',
+ },
+ {
+ height: 659263,
+ tx_hash:
+ '8082931786a9804ed610894380e3e05cac0cac0ce5caa43be45456962ceabe3a',
+ },
+ {
+ height: 659263,
+ tx_hash:
+ '9c59bc5c4bf578f3aa32b32aa786133f51ca61921f9c6a0d056aa0eefd93252a',
+ },
+ {
+ height: 659263,
+ tx_hash:
+ 'a93044be85860696926cd1d821b8bd31d9c7499d501d25e0e7f3204f9f7c6678',
+ },
+ {
+ height: 659263,
+ tx_hash:
+ 'd7f64f87a961536c3ed55c07c7af2a14d23af15affc5ad3945e8a2bd1e44086e',
+ },
+ {
+ height: 659263,
+ tx_hash:
+ 'eab31a5e07b0652c6c548febc1f24c1f37748a908972d87cd53661da60d50f42',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ '10879bdd514e3cf7417bc2e557ad0922398456dbaed81dcdce6ce363bb438988',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ '110b7a668c5dd36fb8a394f6e9693434822d89f5c8048f9ff268e8d1c68fcb59',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ '14c225e0803b80b6c8718398955b6ad52abb7318279abb3dd2d480718a6f7481',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ '17a3eed35b59231a06f029ddff5d18e2fa7529d706a85196829cd87da8c0ad58',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ '1a4bbe13c467b23af586473c0078b32f01fa6315674cd4af6a9bc965bb3a5bfe',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ '302dcc2909dbb45888e1d40889cab7e3f6bdf003a42ca89191ef99a2c2bff8d7',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ '362e399c7233b07e89ac9e21c39f15ff945fed1b51901e0a856f1245ff397bef',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ '418a1c2691d59b5b2992bd54c52bee00ad15c132c11477f984c7a06c4c0b85fe',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ '4e4941cf2074e96077ef3a88c965aee56a6be59340cae58cfe196d121ff7908d',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ '4f9c5185d345dfeb7a59e2540ddd0896ed49a8069367d11f07d735e605aa1733',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ '598dae7c9616c9456125c0ea9d9a5339c6a7f0ec27c325a8e9f15b619a2e5442',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ '5b459091acd62a4455a4bcb5850eab2f8bbe36a6ec980715066cc1320bf839bb',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ '669e4c2e009d7ec1c921a6957e28f89160104ec96e8f0f5264ad8c8cfe32275a',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ '6ec1cd67fd5ba957695ed369ba5febda4e80d066a131675b45f1c22c8da8aa98',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ '7c1c343993252e0fff39b30867afb565941390519d587498217f5e48b1cb52be',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ '7c5fefb8241274a0193a437864ad9f86720ee2ef37b9b653429589aea447697e',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ '83b3fff0c3a9f427dbcb9fd12fc740172c692caf0f4a01c28047e02cfe6cd0b6',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ '99426c2e69ad617f5bafdce025530b0a0b4638cdb2cff01421743413a4494c89',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ '9df4a6a455b45d7b8a151b5eca5088bc7afdbf0d4511b4e3a86250583d4d8091',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ '9fdd8b48be6794d1164c6e220005fb76e166a36daa12e246465de1facaf4e276',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ 'a21341ad239cd72d166ab8c0ea408d42053c6d3f81eeabfaa40ceb2de436111c',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ 'a33184786a3f2ce96669411452cc87d86a314b6a4e235ee1c14fd4ff7ee6edb5',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ 'c3c8b476e0178c70c70cac13f02761b91f6f43164b22df08ee36daffb9f65bce',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ 'c75b850e4f4de93f79db6acab2bfa02bcb1410a7840587604efbb8d74acd02d2',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ 'cabf0e9a4d7d6d97e41d3267006ce7e4353119cc5fe419bac84e1d5b4a7c1504',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ 'cc99483e44c9b155d17d1d6b9b076fab1593bdc71685f10cf484f5502f2844ea',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ 'cd7a521f4377c9952a12b6e038a104f0eb918347f200808cd82c2cd9b9b74e72',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ 'cf7f7f9c33f59856eb8279e2ddcc48b206f390efbbf9f05a1022432b1de02394',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ 'd67a506adeac46a7c3c2e82c74294b67c9bdbc9b252afb5643b0264254fbcead',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ 'd7bb9d99a7638f436225d5bbc900d68cf565031777f2ea170ddc51cbd91cfcfc',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ 'f0a98539918d7a6b2b69dff574934da7816c496387f6df23d1ed93d634c659b0',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ 'f9f5ef79eeb09b4b746ee3b6759deca09f2565b6bb906b5fcd36c30aa7d3eee7',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ 'fa3581e25c99c32f0dae957951e5ed658d5a87991af40dd68c00034b221feed1',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ 'fb21d8db4efcaae42ffaba3c4cac0c124e27b5fa7df9ba6db156e6691930319e',
+ },
+ {
+ height: 659264,
+ tx_hash:
+ 'fbba2e5d84d36fafc2c988d01259ba4207fd865a71bed4d8334ee41d8b44cc23',
+ },
+ {
+ height: 659265,
+ tx_hash:
+ '6b9658c40927e9fc4ee04e7fc66254b4f8dbb794eabd8947b54bbf56ac03a4fa',
+ },
+ {
+ height: 659265,
+ tx_hash:
+ 'e24a82e12580128cd041aef6c3b302697025cb1300ba938883189b064431fac7',
+ },
+ {
+ height: 659265,
+ tx_hash:
+ 'e38da9a3c2b621421c60dbd958d72227272236c1aae672b3645a3798e5f2d6d6',
+ },
+ {
+ height: 659389,
+ tx_hash:
+ '8da688cf37d974b738a11ba3f3495cb22cb3dffd0314bab2b5f79f8e58073e5f',
+ },
+ {
+ height: 659389,
+ tx_hash:
+ 'af74e4deac024d05f9d5bb349042570a25e0e41fbc10352a804a4fa2de0ddd00',
+ },
+ {
+ height: 659398,
+ tx_hash:
+ '0b390e0e6a0d426205ba25164868acf62677cf3fdd48d15f5b36b53bbcddc6bd',
+ },
+ {
+ height: 659398,
+ tx_hash:
+ '4ad0183c57e13cce49fa3a5057eb31e5cbb2b06ff09ba635bc39a68f54f92c39',
+ },
+ {
+ height: 659398,
+ tx_hash:
+ 'e22c9938576d048dfdeb0283ef8d125551864c9003a577d3fb8c5d2bd230acaa',
+ },
+ {
+ height: 659398,
+ tx_hash:
+ 'f59718fe28f878678513d2afc9abdbf494fdcf53b7c26ca2b34f013a54668dda',
+ },
+ {
+ height: 659543,
+ tx_hash:
+ '6fea1fceaa7d300cc5655584f8cee0047fcd23274111630768d031bbb18071be',
+ },
+ {
+ height: 659821,
+ tx_hash:
+ '20f557448fbb44e3a69912a8ff3919069a137c6319ab6a0856e9205b6cd13ee5',
+ },
+ {
+ height: 659836,
+ tx_hash:
+ '7b0a8476cbb9e747b7e83d9a0c266a2364612990959890adab0e6e682accdd07',
+ },
+ {
+ height: 659837,
+ tx_hash:
+ '0fc1f7e08993ca068192c082c054de3bbd9c008e462e2a9725f589f4fd626fab',
+ },
+ {
+ height: 659837,
+ tx_hash:
+ 'eeb1c131f026dbb7ec339c1c80632234ba0daad61ebc7235c40859424d671215',
+ },
+ {
+ height: 659919,
+ tx_hash:
+ '2441ce6b4b213afbf432e7ffd59cd597a14c2bbca0fe1a641095b5f634af7d40',
+ },
+ {
+ height: 659919,
+ tx_hash:
+ 'c44685e8f36e84838d11502438438c997fe79645ffe27b51e3395ef6b9a4b6e2',
+ },
+ {
+ height: 659924,
+ tx_hash:
+ '14bd7a307aacb93675660b6fa957b0c8ab001d500cb07756524330f1863e9f9f',
+ },
+ {
+ height: 659924,
+ tx_hash:
+ '6a05c61fdda56107a6d99670128f8fb35330bb54833985395549d8935d15bc58',
+ },
+ {
+ height: 659948,
+ tx_hash:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '006fd36d7e22c5d36a6a1db558d914d389c4b4b7ff3b8e6bc630f7419c231b60',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '02d6007cf7eeed3d222f21790b795bb115595a95b802313637af19d1a17f5980',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '0b50bb6d99dd67762aef77cb4617a9556f7ae0224c5baf001285309a4f093cfc',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '0e03f92ea236fad07c1676888c299211c9d772e668e71d31ec67df309000d568',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '0fa2dd3bfaa817007b316fc31aa3e443c4bf892461c421d0483140d453c2d706',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '0ff4e8095612cf5664c9476c34ee0887a14665012bd3e7bbbee230d84334510a',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '19dabefc06a56272775662ac6d29e72f57dc2f347df97e6b196089a1a586d48a',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '25d3f6b28a51a6e0063647ec2fbdd8ca2ea19fffffefc3aac49c657a06a207b7',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '2b922661a1346ae021849b22128899ee06f8e524bb8ae1e4109ea32369d495ae',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '334fdb0ee56d7d5b9b83ab8dc20ec60f984be89bbd4d3a2c5083933d6fb9647f',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '355418a4112026f97cf8a835c9443ae31b391abee5cfa10348686bb1475c8ea8',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '3b6b1cd45bf60e3cb09f290e4454e32c3eb8f102c56cb95cce511b12a8548bb1',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '3c5e00744559443fd8cd9dcc6c7b560c1db5118aee57bbadb6d44e486dfef3da',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '3caa3e55575ff9450d43bf7a07ee2d9ad05d1a62c95e8cd89dfdc18b62e238a0',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '3e089a131e1e5e66d3b136bc702403a3269a81e12a7e429efd6db213706c16a9',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '3ea0722817429d8a52c22f942b1e0a08949513140440fea8b11ee94971ab2b8d',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '3efd685f210b55aab63c46b3753d96da64c5504fd1dcd8775f01b738d1c23923',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '427c48e1f3ea39ff384f4f3383d6ca27369d46bff6554f8074b0e0c02e3cda0a',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '47bbc655f6616037078475f9b897e2c83f18d7b28683321d7543b3e849918fd7',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '506bea841ea7ebc7d399feaf9bca91d53fce7cdd08184599d8e9d760dc5915d8',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '5526ffdd4a9d32212a7d5fc241dd01537daa4d443571a4b8b147b4c550ac0cb2',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '58f399e1496ef4fa8076f9253a4a7e1cd9c8dfd072558a571b86b39d3b91695b',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '5985f5b37a6411360f204ef54dd43c21d796389dc4e175a9817a320a1e5824da',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '62912def91a1af976e4d03b036c22b475b2c570be7697b408d5d2b2af8d1a878',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '66e56c5e7f335a7de4d442a2c6491dac8119dda2fc21c2221535a9d371a24198',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '6e0f37ca084ee9be41335ed457491a41016f99afdb7b63797db774d880d8360f',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '701efc8cc85773c3ef31a8d8d2eab2aa590e7c7cc1ba6b1f4d6bb18a93e057cc',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '7987a1385cf0290c0c8ec184fbbb092cf38d1c85a8643d231bf866a6a6546320',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '79a2737450940dc28acef2100a089c765d4efeec118605aa8f7d9f0d7fe7e557',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '7d536af4921950eed5002d0edfeec3782148d479289d96ed134cbc176eb35c2b',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '870ef4d2b8dd49cbcb05b0721b9822cc89246fa451e15f0db01d8e1660e19d90',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '873a697393343a9b68ebda7dee93f65501145b60cc3af464f88cf58b9951ef5b',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '8773686546d032f2ed7b7d153023d3fe5fe57c9a0bf0e3f4da1db038752096d9',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '8c38a7e190e59e1843fab302be34a3388d2b35e3f239a818e683d9aa6cf50fd8',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '8e5bc821dadd2a39b6c542b5f2272b0a23739c491d03dc874950ef96c30c9759',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '95d23af2080996e8e594096262c8a48e64490917a5f7e382bfe18385b9b9d746',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '961fcc4acfc9dc19f58d0af8dc920271f72befb8b1b990e95d0f63bfd64eb213',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '9e29f76e324d47039b2bfd6eae63eeeb8ef0387b12c3368718aca02a1b31915d',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ '9ed61596504e940f910f0ae27572804dbc52ebd0f07fa70eccc5ecc3392378bb',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ 'a52ff029a23ec25a864d601cce03a018f120451704d08aee1e880637611f9e83',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ 'a9bab10829b377978278dcae2f540a37b8e4a90c275057df37789a3ff9d6f08a',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ 'b1eabd49fcd1ddb460e61614adadb79cc5f454ef5d339e797c34a3f0977ca141',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ 'ba2c170e9c059b1abc3262f4dc997b2bb74f03144200050de960d11382a441f7',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ 'c4463cebeb8c723293012791930bc4fb540275b206d748a40cf5fecd2ad9ca50',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ 'c4e3ea614117a793a8a8245c5be5fb280997a39f14210b58fac23db0db4c7cc7',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ 'd35424d5a28e84eb2e0acf23e669b5ff63b61c2307f6a042acc33290f623f07b',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ 'ed2dd2cee7c1e1ddd4472aad5688df50cb3bc0ee889e59af12092dd2c3cb055c',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ 'ee358cba4652ff316118b499af769e7782f29e89ad49aacedcd10a21c9e42378',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ 'f501a01c67b5dabe690a154213950cbaa85610d14235eb04542b220e1a756780',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ 'f5303a3a485cb345148dc1d0d77fc126853db52724d9c96c050a74fcaaf437c9',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ 'fbd7dea0dd6149968dadbecc7bfaafdb755b1e90dc9e9a9371c7237a852dfdfc',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ 'fd9f8d865e2cf51c9f0da2a60a8ec20d982596eaeed6d6df2a63baae87fb2089',
+ },
+ {
+ height: 659949,
+ tx_hash:
+ 'fef9236caf0fd2217d1e91e58ac082ffebce8d853e26bd232b3c60a95a775bff',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ '394c7c0546971f217a7bb1df3d14d53c31779d4a446164a6d66bc4c2b3ea97b2',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ 'ed7a0eb9f80ffcad92a20a9b8eb673561bde8ce143cec05fe4635020842a4c54',
+ },
+ {
+ height: 659950,
+ tx_hash:
+ 'faef4d8bf56353702e29c22f2aace970ddbac617144456d509e23e1192b320a8',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '03995db7abbbbe0654225ef9e5e2d9d62d1cff24f0f607d1dc2f93f0c07e9851',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '077cc37e471088586eae9b37e059c9468e427ff335ac03034dc67a8dfe1c5c26',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '082c96c542f65c2937345213ff5fb4fda4213606befda0658e3829ce6b9afa55',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '08b7a1682ee7903ddffd00f2fd165784860f00ab39e54879d5d37ed9bd276956',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '0d5a1695e816e51d1ad507d0132f6504744a471974c69568cac7a5078c5dde2e',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '1761d51648bc4dc11694d4de5d54271feef85d2f43be1ea2449206e7422604ec',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '17aac8902aa45ecd03772b2680749a8a5beabf2222bf866950b52fbe2d9bbcd1',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '1812782a5cb59bf5ca1db753eb9ff69778fa3ccd6c4e30540a86216b27f5c3ba',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '18ba074b26e7acdc94ab6f0b959f8e23f94669c3f91ddcbebaddd3ca451db216',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '192fdc1fe4fce708bccf9c944934780d62c87a8cba90b893eb9b458005c017b7',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '1c63ce6c0c9cb79cc9948c72efc1d698a3b0b004e18b96e8372d4530f524c02f',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '20a98e025975aa819b3669f76d046aa756634f417c747e6b597567f7dd5711fd',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '252f92a9225287a7859052064ab788ecfc576b9d850ca0200dd775874a3756e9',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '28a80a0a49b70a91f56b9e07a4b6e2416465e9d3afce2849f6e652a842165e70',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '3136a3e4eb8bd716052adbe6180b9866f294cd5b0596ba90306a2a6028a8f1ee',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '360497a805addfdf74ceccf7ba7bb345efd5dff69f7a50c382c3e1038eb04a6d',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '36eb8cd687130f7b03a99f5677d1cf9c24b5ad9e73801adc0abc4d44e09c13c0',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '3bf5d937b4d2f97dc5425d54637d917231cca5110e89da691677ec8754ed910a',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '3c7f05819a15a46dc102d001618269bda997904572bbe1c3e81cbb3e25ac7633',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '3d085e599e389da8f166590d66d5dcd862a447ede5ea4cc0b7b07702d74cb457',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '40bd3693126593876f6292d883ccbe48c2c2677db6f0f6bd6e86b40afc119d3f',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '42e4b7f48241b6ee6880f40a349ad9f3711a69b7ebd7bca1694c00cd75da654f',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '44027e364660a930957a98e44f7db8885e2b5ba85817a56b2c2d9db6caa4baae',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '477dfad1ea4a51404811e698acb619d94a0e0ca7353a0d52e9d35c42d6b7634e',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '4817761f0c168263b428cf5acc832f4cc11d6316d80e225286f9278b32155a2d',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '4884ee5d141d6c40bf18671159ec003b2de6f4b77e582a11bcd421c4f0da0ace',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '4918d2034b4589481a7a23fad5934f6cff8930c2213dfbbce8e86921975d8437',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '4e56a459dc2f7d6872ffaeb7c154577f22287cc4755f9c7e1c26a91a2fbb6696',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '536478a8450a161f33029ca4c54c480d43d5f548a448779f444d98d6258c7d3c',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '564f50deb4a5aec764086ea12f6fb1dc9942fb81d7ca6fe690ee5d44ff3a12a6',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '5b9a82b15f37ba713c80f410d43b5984faa26228aaa55a79521410fc641e9a2f',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '5beb63eede1866a74d29c658458be9227af71294559039546792b1cd77df215f',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '60d90957f7a590fd82a0605592aff495669ef872b35a183ff13374d53ac55400',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '6328bc95f6be869791f6815c4aa17289995807d3e929d5024f04401374218100',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '69f46e3afb300d97e15e70b0f456b89f8b679051953f029a9fca56960b8ce09c',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '6b974ac96a7346fcd3e5bd6a56e73250078f48d972d24a6fd2c6eeb6d181a4af',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '6cb9413705ac661b691db805196b32356fed93f369fb01b276a4f6e47e9af8b4',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '729b5f5aaff309c1f91c9fd50ea78e790771007b1ec05139e2260d0ca5c1c9ac',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '737b7cb525f736270c42fe5e7dcd55c32c091d94809fa5d29f11f633457f0d19',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '7fd8ff8668c2964e57120c57eb4ab33da85b147a091c8c59bb7e89d14bd55ea4',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '84a6d7d33c3535246dad8224802c7961e928db8be38be3dbf5b710e6cd9cf0f6',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '8c240cb1a406611aa6c15bb42e4e24e03d5165a017886d013e59d6da444d074f',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '8cbd121aa03a3b29205a91cabf4f8592789b5fd6ba9b6b517d731b9509b7fdcd',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '94a65f56f21640a1a957be9b91db835ed66348eede4d6f08f57095f14aa056be',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '99bc2f3a5da725f1c7d3d1d529abc4368b68834a0fd3a7ef18cb6d1614e7a6a3',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '9a33a017116e9b38ee3e55265128772ec83d75d3a988d6229d03263f63312697',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '9d278b8e6a555d48456d05b34dd59e4c9721b32dcba3e2ac7cb99db90f9a998b',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ '9ebf6629b16182df8bcd78a90066e1f3cf678f012219300390d4a0b41fb831db',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'a62f417f51f602ecd5896abd5f357b22f5ac9517cfce4262440c342fd57da9f8',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'afb059866976b6a1d256f0e7e6eca7b4c17a68b1b0dfa523b744ff869ed9891f',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'afc537331a5a3f60d9cc8ce99079f17553f88d15c15e611f3097135ff533d8db',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'b2966e657169382e3dc276436a236ae2ed6641c36641a4613d87e643a2b926f8',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'baaa1156555ed8ecb7fa13d79f56c11239412a1e0d2598db253766faa2c0e168',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'bacf0b40f6d9fe2fb020becbeffc723d7e617a86c75f596ca3db3f634956f1a2',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'bf4475985136ed44a66c4c86b6e52acb197f0e95b9a11e3fd2c15f89ddf6a46b',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'bf5d76ae9f113eca8272b64d331dc7f074c3f5f7a008e21d1dcd39386a05ccc3',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'bfe72c6be5b7925be05b44d08cf31e4a8680b69f4f911c6e9dc5ac8634525f72',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'c23cd6e9730feb5d6702338f32c0e7085cb68ae9adfb668adea999eeaea24fd4',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'c2e645da972ab8e3a5bc3700b305bc52d11c9f4072b80d4c6e53fdbce0b49605',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'c46b57b4175022d4b0b741022a04ac9993e7e4129eb11e478704fd5ca268367a',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'c6e96b469cde0012b403d5a5da06f9e2bbd13ad445280a9b184c0e2c852f9ab2',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'c9de3bb30ad8749d0e295b30aad25d51eec81415f2e64d10f3c2fd441c056999',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'cc200aab9471b419b4d14f1e0b4be04da1f487a2ef2c505945666064b429c174',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'ce52da3b5c27ea366b9e255566721faa50988a4ae11da25737002804b94c6409',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'cf3c66b5fd00549b3bef3e36417a0f7f19d84a366f13b9e6e9c020c914f19bdb',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'db962ed8188ef57253334d7e0c3e189ea0df845e9bb61d5e48fb3a89020e44ba',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'de2791ef91c09b127b750efd41f31bc7b69a6bdcb8454f44562b5eb1ce8346c1',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'e8f18f31046c769f421ddb8f1da4b03e794102ca75c483ca1f6a884641fe4661',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'f9181c0d4676bdca524bd97564d26baec365b0283213be81d697325b4ec12426',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'fb155528412370deee1bf680b2db8a96c021e8e10d56b55d698ad74138a8702b',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'fc182d80ac94e210117b98571909f2acd9ba87ebd05989a0691333db5d002f10',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'fdfd3073fafb551f14608690c556a9743ca99bb4864f1bf2e541cf9e65ce7f6b',
+ },
+ {
+ height: 659951,
+ tx_hash:
+ 'fec7f5213ac68480bf4a09f00ff33deae4cd510535c789d6593c6916fb5d724a',
+ },
+ {
+ height: 659953,
+ tx_hash:
+ '0fd62a0fe69cf765ca35ab807595c2959cac543821c8dde412eb53b234e53dbe',
+ },
+ {
+ height: 659953,
+ tx_hash:
+ 'de7fa51f1b77067e314daa392935864be1d0d27a6b0df07c8fada599a44adebe',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '0143ed1e5ab164854a751d5d7c1b0ccfbd30f3a6f77082a72837c7dd3d93b9e5',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '06743858421f50184722b0b6f875329b505268e6bf124e91f9088670c6fdfbf3',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '076c3ebd88263917c4a50cea49ab8811bb66a41cde6df0df8de073425ce82bcb',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '0a097e19c9386b9b8e6044a3e7044fded1e6c5adb72ed8591193fa6e80f6699a',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '0b97f450ddeec37825b6d56f628df05dca6054fbf793cd6e202ba97955e22887',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '0cd02c7667bdec2619131421f961d6115e89d4818b999ac9050659d8f4f56b0e',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '0faa83c0f528f227e35a04ce787c563814a1cb639a17fd7a1959499e587ba206',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '0fc4675fa90e6c1696a2a47ead587a844d2c926a59c088be6115248c29da9297',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '13be77805a237831b144e4f61d11f38730914236f9fbc663d6a5d88aefa84cef',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '158688cfffc51d84248c197070e7d168c172b0110f45a35950d957f49f20e1af',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '189ec0ad8ebfd9ecce7951d505d691a9ea7b07d03a27b70135aa8a29b67d9335',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '18ab9601afe0c65bafdb346784e15618c77dd4d3ddcf27117223d2917bca25d4',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '1a6e634465be07c50e87116761c6c09fac6f3bc3efed224ce53b03b1ae4d53f9',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '2043bf52e22246c2dc2cad823c6debb7c092d638101ea1a3e1ff4ecf74cd8a61',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '204d696da604d255a42960536a99983e74bfaf248ecbb3c4e3220adeafef1495',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '233631faea7168ba939c41788f56a0ceae1b4eb8abe723d7b72b9a0b72633f20',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '250a3773859db97e5e434990a8d2f711df33b78c118834be23e27e6b46f724f9',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '26a918e5e4dbbefc559f23a0e7fe7c6e5be7e13c1edadd128368e84f034ce759',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '307f048ab4d4dc4b075ad6ef3a2b2edbbdcde930e5f732e57276aa7a2758f17f',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '310ba57ff5a3bfc9517f1be455a47644737289276471eceed61a9ab68be0b190',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '3467d3472f79414cfb702dafe3b15ec43dffb4c246b127ebffdc4580942d23e9',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '3605a97cd0095d8ea7f1fce232d46b519e49ce42543d1d15f1a3386a61d2f3d5',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '36e663be80366b447e084a826dd42b84208d04b4735e73e89949d5493ea88076',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '3acdf6664b9b04bf4dd6671ef1f56e6c6003b42ca6a511815442dc2be2668aaa',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '40057939e85ae8e488bb17260f93d25cdf465a54758520946df309dd32e9ec46',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '442c7562d93c3360824502352cc696ab026241cfee33ff554962c73005b1798c',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '4487244d8d438d1fa6fa319c3033dadaaf6ef86b713bb501f93aad592c490f72',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '49bb4d885e999a804c046e6065d4b37fd7ffeba4df1713262bf0a87bb23080ae',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '49eb8fe9ade0f61d97d946f9ad64369d1b8d6d20fc5cd241469cc794486c1b1d',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '4e10c7b830292d5893f3ef868cbd56b61aba0dda74946f00a74a7483fb027a9f',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '502263cde131a40c958a319002af667ab40d9a86e64c1c2c09558a3298b53eb9',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '64f579197b5c11a2a20e571e2c0e7eb4780a6aecee5aa94bf91d27bd67f0928d',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '680204be2c1abc6113d5ffcb9db498cbff4f3419d36970367c2554b9e248b62d',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '6a64b69a4ac358c1bf3699ed01d99b127cc4d1d883af718f006da9e5352aa2f8',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '6a88197578be0587a27f905c9c6e793bfd5557ecd5c7ffb8074a39d1812520bc',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '6c32b04c035f900f20c03a9498c64c8c9bc2d920c22d437efa44234a9dc41e89',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '705a78e10fedb25d54e0a747275b1280f98517537c486d821ec3a59b1a7e127e',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '7244c5d1eef3f119d20eecb16eb2d1444916a959aeeedd5e876a000782f0b686',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '77c795b2190a6f7ce72816b9b00cf3b67221f0c2067cc4728b7b4e52dde716ee',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '80404f42885c4eff392dd5fe4fd76dadc60716f96c5fd4d6d0db35b314b5fe01',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '84a4f5be52f6091a824faf5653be8b47f8bfa0639010e7b14262e9fa10e69a47',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '858c1a642526e2f93fd1d1b96e33c7d2c16af5f4ceab59d00bb3fbd490ac5f82',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '882aa74fb9d019627b27639d24769c6a74b2c85d94d5ad4012896f82d0c60c36',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '88cee734a13712ebb5dff4e2dadd337179ec349d10799d0d1e810a2a31f4b238',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '8aa7f11bb9000497da1cf2cefecdd39805d021cffd2ca69f0f6714738533bf52',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '9088bf4f9c3c4f0fb769647a51644264195e98a7898d537793cf21e7d6e5a664',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '926de463783e7dfc2b163d4418daeea376657650862428ee9a21ff6af12e31c2',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '94656b3813592b40380645995ada7aa8508783239d6cf6057c378024c7c74f29',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '97c7af09ff08825f442a34f1f5c59b336c0a71576be3a65853f90cb1cfdb828f',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '9a7a1282242b428e3cecf623502364b4ab6e50fc111521ef3843a74bfbd5ce34',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ '9b8e507c819279d1362c0315039cfb366402505026391e211c40679112d612c1',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'a7e92bf8f7076849cb6f6ee3fc9368b93a0e8bb7631a20e071c061881494c808',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'a9eb1ffeefa96c1a723419b258de423f28f13964539fb55794b95f1ba9e02bdc',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'ab6b64c9a6131889524314c8059a3678f518cb0d499ea49b9b6c587e8a4aca6e',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'ae048a8f44a80d94781acdd5734780f6684632eee184301c219cb88e1fd5532c',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'ae66aa81160bec5b9218defff19ca3b082dd831dd243114f53020962c0c4575f',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'af36e7649bc5161e102278fb77a9304eb9bb0a3de5ffc7c60d2e7e4f7cfb19cb',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'b374de5da6700febd6158eb1c4b29cbb5752afabbff842d26dfe652502d95acd',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'be094082b0b2fa1cf1a953d49194fc2559fa4734748e4d3bf827bf43153d59fd',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'c1365cbd49085d351b3f41cb61a7a82b1597741d42886248211567687bd7b910',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'c193d28f427bec4a24369dd62a8c167c13f2eadd6dd758632c2ecbdc62ef874b',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'c338cee2712ef8d682c7ff2a7cc057816511bf01b22379a5ed08665cb9eb7687',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'c93e85ba63c2a06ec1a46437868701b74921d0dc897d00ab5c3c0eff55895f69',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'd360f7884cff3095502a2b8ac5135d4ec8529b2db0ec74d4073af83704641394',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'dd36b0f77e56209b3d1ed4f81153a05978fda69eb204877ec39d8d1ba4bf8b0b',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'e0b84d81b6fee376922975deadb420623511489227ffbfefd5e7860aa8c7061b',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'e75aff90f663e1a0b7755fa170bd8744c0ee88ab1d6c1359dd239b44afd33354',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'e7faab05d6dde5034a3fdc3db763dca28f56746142009eb1272de492c79b7260',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'ebb16a09b80c46ee07bbfd495b5b66b42fec82600a5c77ad73cd6551234e7b1c',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'f66835059b7593149ab321b401860ecb99fb586836a228e4e7cb4e2f9b74e3c2',
+ },
+ {
+ height: 659954,
+ tx_hash:
+ 'fedafa4acf98bf1c98b9bad84ea7191f4a2cf8596880be64632682864be38dad',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '010ee4ce1aea60feb0192b3d1388bf9cb9da512010d8fac6adf54540a23e6814',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '054242a3c57e369b1444ddb18797add7ed0a91a33ecdc9ce1643d91da6b462b6',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '0c63e93fee9f0947d460c63100e58e062c339e583f01f61d2fdb4e4a97ba9743',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '15e04f97951e9d8fed9b04290632b263c73bb774f26bcac245ad39911e2f9f20',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '1f983f7ce21041465ff153356fe7729abc3f9eeed4217e85e0caaacd146d7329',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '345838f75defa2705751615b60bef3951b4cbb57107a3016cd7deab91200124f',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '428e10436e7131b49c31760dbfae4b84453987517cf7e424361943d491e5983d',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '53f541188aa9f4c51cd96c2c8191d1ad9b6b006d7d6d69d297450de85b50b7ee',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '58b7608b000fa91caa65b2081bf63b97807ac4b797991e240621d8f5be6ec12a',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '6791868b45829c05a8f96b8360d8dc0744e992595165269ad3d9cd02142a4288',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ '7f3c2e48af5f3633fe421eaf3d1dc1bded3cd1703892fa0c474a582df9b9dad4',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ 'aeceb912a3e4f9bdfd9b7884e076cb58f96feba22bb8589b1f8c8e4495bff915',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ 'cead73dc26efc24aee5ccc68be59052b35e69788cba4a5aecdb8ef1556bf6334',
+ },
+ {
+ height: 659957,
+ tx_hash:
+ 'ea690e9c656b12c8848b10fbe12283e4d249be3967f8b82b2bb3395a4afc0e63',
+ },
+ {
+ height: 659958,
+ tx_hash:
+ '14f356a1563526f4f5526509ab3c3b3ce9bbc50baf79280c84664520b47dbf00',
+ },
+ {
+ height: 659958,
+ tx_hash:
+ '1934cc0b108d8941e096033161c338272364233a89d508534ff2c1a3d88abf30',
+ },
+ {
+ height: 659958,
+ tx_hash:
+ '32359e417eb92fff3159b98a29b5ac5c7ca30cecd777a93065dfbdad963fcdb9',
+ },
+ {
+ height: 659958,
+ tx_hash:
+ '348b401833712a233165d321012d7bb50ea97767026f8d20f41cc44b7e175b26',
+ },
+ {
+ height: 659958,
+ tx_hash:
+ '4b6056546703a430b4b0763a7aaae01af976e455630b029f8be835008e597dd5',
+ },
+ {
+ height: 659958,
+ tx_hash:
+ '5addb374825b1bfb5a1a39a467e1aa394116503b48d0e63c343f7163af433125',
+ },
+ {
+ height: 659958,
+ tx_hash:
+ '62253e004dcf2b303517ebfdb16f2409b953193d2f3fbf6c56f3e679c33cbf0a',
+ },
+ {
+ height: 659958,
+ tx_hash:
+ '6249fb78dcfc7057ec14aa299b89f693174a9aef594164150b7cefca2cea5bcb',
+ },
+ {
+ height: 659958,
+ tx_hash:
+ '730fa9b85f20b89cf05bcaa48752892d1c6db9e92f396a90c022d8512d8ae321',
+ },
+ {
+ height: 659958,
+ tx_hash:
+ '8d9e1219adf6a781dbdb9d0e14ac7eeb0b60190a3482fc13855642bc8818f2d4',
+ },
+ {
+ height: 659958,
+ tx_hash:
+ '9ca7baf02b556f2f7a38e1f101b9bf59cd253902c5e1245978934e08beae946e',
+ },
+ {
+ height: 659958,
+ tx_hash:
+ 'b0559ee37ec5e39ab76a5a94cddadb9ecc67bfe207bacbd3c2708bc3c2684626',
+ },
+ {
+ height: 659958,
+ tx_hash:
+ 'b6d39d348d0be22bf4a4189d44cc7f1f22d13ae156da91e9b7120b3b640c670c',
+ },
+ {
+ height: 659958,
+ tx_hash:
+ 'b95ea7766593c53c27986887917cc2f570aebdd707496294570a79b5f7a30f2a',
+ },
+ {
+ height: 659958,
+ tx_hash:
+ 'd39555478c2e2a9e5198a5b24b628055037d7c12a1fbdff053d0f4a45938a218',
+ },
+ {
+ height: 659958,
+ tx_hash:
+ 'ff85732ab515240e6ecbc30a55a57d9041ccb43aac4c3d91091ff740c52d3af3',
+ },
+ {
+ height: 659971,
+ tx_hash:
+ 'dffd8c2c7056ada4a819ebeb1bc97ae3d0fad0125e46752f4b8bfaa7250103ab',
+ },
+ {
+ height: 659973,
+ tx_hash:
+ '3ff4a6f50d6500f6ddbcc036847e0a4ba327290eb4b76d38ada05212f700fc9c',
+ },
+ {
+ height: 659976,
+ tx_hash:
+ '3326d46304931fe95a8ed0be82508db07c10a2ca650daad82b8328ac58d05423',
+ },
+ {
+ height: 659976,
+ tx_hash:
+ '4a948a3add919129764b4ff492fc221ccd4449a734f882fc0230b04cd130ec51',
+ },
+ {
+ height: 659976,
+ tx_hash:
+ '8012d319a2430ceb526cf1e78b09e39c75c37911a10654ffc15eedf5b22c9c3c',
+ },
+ {
+ height: 659976,
+ tx_hash:
+ 'adfec98066701f0b09e2db297b2612b7a993444c30d98bab08feed55caa68e61',
+ },
+ {
+ height: 659976,
+ tx_hash:
+ 'dc40e8a602a68143b674d799c76d562712a0f81a12434514b63b2398484d82c9',
+ },
+ {
+ height: 659976,
+ tx_hash:
+ 'e4cc282f8091837a27c7eced7a5ceb1b0cec6809855937dcb0ebf9f9f205bf92',
+ },
+ {
+ height: 659983,
+ tx_hash:
+ '4f22976b45310a358afbb2542e04dc1dbb613384cba76d265b947184362ca501',
+ },
+ {
+ height: 659983,
+ tx_hash:
+ 'bcc0259a98e61013a6a1068b32bced113bc5e034faaece0d531d3c1db85e8ed8',
+ },
+ {
+ height: 659983,
+ tx_hash:
+ 'eb2834b9f6b4fe710239296c13e13d7cbcf0db84949051b7303f641895bd594d',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '10a15caa5ad2e8b246d78770a86df87dbbf8ad01fa7f54335504b009bdf491e0',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '3f0b2caa53afda5181110f58b9d79128217dae61f1ab3e735831dcad2127a4df',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '427ee17e166c771cff3d4540c189ee3454cbf853ce3332f88f12bddb8c10c689',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '4f1b8503200a797e4d997edd2fccd0984194524c63afca8f2452419f3e9102d9',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '53c63c4c043b45ed908bae9b41f642cb63b320ed67903c2958f24adaa200c7a2',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '650c2224215eee3f8ffd986756cec35a8fc7a608fa1ee7a823393017a13575d6',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '7acbeb33168ebd4c32b3bff21f35c475899f0fa11641d37f4f3dbfabda3d70e3',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '94a924f562a9abf5f07b8ec2ee8db35d3201695ba0f86cd4800c2fb0a4f1da74',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ '9b5883ab9d862dffae713319b75c9aa50e2ff8094b4eab3c9f573927d5878d65',
+ },
+ {
+ height: 660005,
+ tx_hash:
+ 'fff38d96e86256958126e7773d730f268ee5ca1be2a183bec7c798a44b2032c7',
+ },
+ {
+ height: 660007,
+ tx_hash:
+ '1524b259594ba692b2bb85f89db9e4bfc46ba94a83c1d52d1afb145ebff331cf',
+ },
+ {
+ height: 660025,
+ tx_hash:
+ '857004b90aeceb9bc1ca3eae7ebe6e9d29f62b4c3c964ce0e604f826de82bbb4',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '0a956e6fd8018971829fb5142accd1b98caf2c4abe5b8053c60c8c026d0f0ef4',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '0aa59e295a32252bdff1c1835f11d547234be81a7d8ee3a2ba7a25916e3ff7cb',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '141d6be5366a835dae2fb0326e68d05b12e4b79205e5f79dbb5f510fb9bda6ad',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '155d6cc07dfee43902c6a470b5b781b3d4c405e98105627f975d18e790093598',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '2717e419eda687f623fc8180eab9372ce0806e77cb377fba971c9e4e02258076',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '7027b0c53560d0480288cf34552b6ba1489bdc1da51e1db5f94a8f7005ee7622',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ '99265357de297de439f8cd7fddd0a129e8e0d78ac05cd0e981062a231be3851f',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ 'b205570d729c6143e2bfac1c8482729af43e127e144ea3f5eb3f062a581ad031',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ 'c67730a99a75140d1c818a66d011b533246c841eac16392a4b252a306d287ddf',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ 'cda9a683e01db474369bb1d99d5d18cce3902aa684acb95b439a096bf617a357',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ 'd3bd2e9f83bca5dd498a6b393e930a43517608e956d6ba8ace702789028ba672',
+ },
+ {
+ height: 660150,
+ tx_hash:
+ 'f6a909dfcc4857fe3e64c8a36d3ca362e6ee5881bee887978a2ffc25af42eda9',
+ },
+ {
+ height: 660214,
+ tx_hash:
+ 'd21b27d062eac87a4fbc740845e871d56a54f8fb98d5c5a4c4a6d36c070af550',
+ },
+ {
+ height: 660214,
+ tx_hash:
+ 'd84ce0acc9367d2107114724fa091d8a887bb801df2c7de8290c6e33c5966a74',
+ },
+ {
+ height: 660216,
+ tx_hash:
+ 'cd206ed1671dc4a24a95d437043d244f528a87e1f98e8c26e763393e7c9097c2',
+ },
+ {
+ height: 660217,
+ tx_hash:
+ '0bdec2a0d5aef79a88e5f1c25d69ae42c42388f900f5206925c2f598e1f98374',
+ },
+ {
+ height: 660217,
+ tx_hash:
+ 'e48152353953bf73e592a5554f9addccfbba336009bd2fe80aed2b407471412d',
+ },
+ {
+ height: 660383,
+ tx_hash:
+ '82adf8fbee0d538bc7b64ae5abe6a157c7786bcec01c31bd809dae0c1c052f51',
+ },
+ {
+ height: 660385,
+ tx_hash:
+ '74d8bd544b047b5cde4ad85f5b9b1314e0446725570ed865afc49db4277f5713',
+ },
+ {
+ height: 660409,
+ tx_hash:
+ '7e872aafe097c1c1ce3bdb355a193c44cf570b91038ec1608b6603c53a8273b9',
+ },
+ {
+ height: 660552,
+ tx_hash:
+ '6f3c95bfe55df4d091747b1d06744624a35c149813343101daa0a64d8da9b2ac',
+ },
+ {
+ height: 660553,
+ tx_hash:
+ '7ad56b9cb1539a74d634a9106a66c84900fe03ad9f4cb63beefc1e76a871dc1b',
+ },
+ {
+ height: 660557,
+ tx_hash:
+ '6cb0df4a17cdbcf259d1d93300f9498a53d299119acebd1b41dd5dc2ec7d2407',
+ },
+ {
+ height: 660557,
+ tx_hash:
+ '96a47fd286d47e9afb295cc88d6103848e28b6adfe2d08059e694d3ed222f810',
+ },
+ {
+ height: 660557,
+ tx_hash:
+ 'c966062bdaa9392401249d84c4d88872b897ea075ddb332df15c343bd143fde7',
+ },
+ {
+ height: 660557,
+ tx_hash:
+ 'd7aa7def034debb4b9881ac5b94212dfbd62400b17e03ab99c2e077840b2e6b5',
+ },
+ {
+ height: 660557,
+ tx_hash:
+ 'e25f08e2f1ec4dce933d76680d5ffa51b014548ae833519c0e1e96ee2f1631a3',
+ },
+ {
+ height: 660557,
+ tx_hash:
+ 'e41732d7a07bdafd32a5965b26fd69e02bddda3cec4b0533e11083c732c34de3',
+ },
+ {
+ height: 660557,
+ tx_hash:
+ 'e746a97f0caa83aedee7fcd17fa5bd2bc56472f58261c78122b9aff94172c55a',
+ },
+ {
+ height: 660557,
+ tx_hash:
+ 'e93cc55a1675d62c1a0e99e567c4ea527868e3b27a97c35d378ae5d357b11dbe',
+ },
+ {
+ height: 660558,
+ tx_hash:
+ '18365d59e473f46a510fcb89d17f62fcdbc93934eba9d4ebdf285ae9954a30a2',
+ },
+ {
+ height: 660558,
+ tx_hash:
+ '1a07dc9c5db5befb8ec79f96df24f65aa9de25fd169534574845f4cfe0263679',
+ },
+ {
+ height: 660558,
+ tx_hash:
+ '24a60390426d55e840d293de013b53a4bc2f18582c3e68cc613af4cdccebe54d',
+ },
+ {
+ height: 660558,
+ tx_hash:
+ '68a3263fbce82062c375541bbcee478675515153e5c3ccc2a8e3b4c9733d58c1',
+ },
+ {
+ height: 660558,
+ tx_hash:
+ '68e222f899e463a21944fa85dc24f46df9e0b8b42ba973e939efac8abc13d05e',
+ },
+ {
+ height: 660558,
+ tx_hash:
+ '74804b150ad14ca3f3c8e575d9e7b42f3bbc70ba8a1d8f2606a0af6d30d6895e',
+ },
+ {
+ height: 660558,
+ tx_hash:
+ '7d9446de4c37f464f0a1e11db11cc76f5a2ecf5c5ced0169c721a5ff3aee7741',
+ },
+ {
+ height: 660558,
+ tx_hash:
+ 'a8441ea886d8ab90a113d50897043a74cba39e935aa6d7116c2b4c75102b0e73',
+ },
+ {
+ height: 660558,
+ tx_hash:
+ 'bac2de8c6a1cfff25bac7736f20b54ba61bdf6b579ccbc3e4496918212865ed7',
+ },
+ {
+ height: 660558,
+ tx_hash:
+ 'c3e774aa1cc36ca569c635d27f3fbb764172ea4ddeedf429db03afcc935506c1',
+ },
+ {
+ height: 660558,
+ tx_hash:
+ 'dedf22927d58dd2f9b9247842dd41d722cdb27c20adaf785e92871a496039a74',
+ },
+ {
+ height: 660558,
+ tx_hash:
+ 'e4f076f3b65aaa706cf1ecc5e7cb7d381b711a8b586bdcf0c60d4a048184e5d7',
+ },
+ {
+ height: 660558,
+ tx_hash:
+ 'e8532e98da3b3784463d9d741a98a74829c0c765f836be27e1e0833893590c0f',
+ },
+ {
+ height: 660596,
+ tx_hash:
+ '2e78637812b5604e06d0f13bec22412f65da1273b9345bf9db80c785968d69d2',
+ },
+ {
+ height: 660596,
+ tx_hash:
+ 'fdb13f0dfbe853e57d5acfab1d4c6218962fe6b0267450854d33aff5873578f2',
+ },
+ {
+ height: 660598,
+ tx_hash:
+ '6eb359ed64025095c00baff7ca818af18c6d781b5d0935a757317b29b5b47f1d',
+ },
+ {
+ height: 660598,
+ tx_hash:
+ '7075c3c2ecfb65568dc26b5e1ea1e3b3933151a7e56f2a5dba21bba6193d66e5',
+ },
+ {
+ height: 660598,
+ tx_hash:
+ '709c10dde134cf61c16d601ca13cbff333edf68d67a4e19b62daf7d6e2db23a6',
+ },
+ {
+ height: 660598,
+ tx_hash:
+ 'a3363b0e00d5759ffca2f827106d0ef6cdf692a789cdb265a4a0bff2f5c65364',
+ },
+ {
+ height: 660598,
+ tx_hash:
+ 'b32503a1c85e24a3a6cae3f454576c43f43d0ab8987fa960887bef9c7a266f44',
+ },
+ {
+ height: 660598,
+ tx_hash:
+ 'bd935ddadbaa4a5e41dab1a6cac9edfc13d706ca9f1d3c8266fd69314281d0cc',
+ },
+ {
+ height: 660598,
+ tx_hash:
+ 'c7326808183a8c90d6f475c0c000fb44ea638e0fb96ac7a1d187ada2cc653475',
+ },
+ {
+ height: 660598,
+ tx_hash:
+ 'fb770cbcac7a3cb2efa65bda9d50bf654cc60364c1766403b9329f1885b25bfe',
+ },
+ {
+ height: 660686,
+ tx_hash:
+ '37247593ada56fc61ac6d26d93f50a9e39d69c59dee2e3186bc269b4f89af15d',
+ },
+ {
+ height: 660686,
+ tx_hash:
+ 'f874970d3945fd29c1dde2e0eb248b41569a13666565a083741304081cf8ef04',
+ },
+ {
+ height: 660687,
+ tx_hash:
+ '2efa3765cf7028cc0de6adb9b4c430b151a20a6d897467dd30f5dc340a194395',
+ },
+ {
+ height: 660687,
+ tx_hash:
+ '45ff101fdc2b83ca32779202d1ad5b3445786825a927f7e74464f94fd32ccce8',
+ },
+ {
+ height: 660687,
+ tx_hash:
+ '482384837d8bd33ad456be7a6c45307bff73114976b9f784981dbee06dd940ba',
+ },
+ {
+ height: 660687,
+ tx_hash:
+ '6221a7ec14845c7012aa6f320d40c5bff27099c9a929f234de5173e4cf7da9a4',
+ },
+ {
+ height: 660687,
+ tx_hash:
+ 'be3964d7e51087e91c3f0cf7a1ee09794efc074df7a610321ca562074f3f688e',
+ },
+ {
+ height: 660687,
+ tx_hash:
+ 'e4efcd2c7ed0d1d4d544badbb1947bed9de50e578a3b19b1d7d27be45e9debf4',
+ },
+ {
+ height: 660690,
+ tx_hash:
+ '048c4889afb20901d32c417e1bb567690929cb466db677422984effcb12eee49',
+ },
+ {
+ height: 660690,
+ tx_hash:
+ '905a251f32b75df32a0c0170d63828ab11674e0fea1f67c7885cd43d3fa22d78',
+ },
+ {
+ height: 660691,
+ tx_hash:
+ 'c6491eacbe814aa3ced0744249bb684a1f822fd657497e3d844bc33ca5da81f5',
+ },
+ {
+ height: 660693,
+ tx_hash:
+ '1840b8cef4d6bb1a81e084349ed07efde896eda7f8672c6639d637353a03f7f1',
+ },
+ {
+ height: 660694,
+ tx_hash:
+ '1ea439d985e57878cd39ab65dce2a82c59b9d2d2990c2182a7750f5c24d4c10f',
+ },
+ {
+ height: 660694,
+ tx_hash:
+ '8de2ca490e5817490d416861c29a50d364c8b7607a4b49f327de76c595be019e',
+ },
+ {
+ height: 660694,
+ tx_hash:
+ '97d4e42aa12f2cba8aa3d645485fe9b3664fcd982f653cda6b758b57d6067ba0',
+ },
+ {
+ height: 660694,
+ tx_hash:
+ 'bca99c6fd3262716d2877b6a874f36df0343864f0d6798b3fcda65eb574c233b',
+ },
+ {
+ height: 660698,
+ tx_hash:
+ 'fb4a54b258ea52a63863cc51ef830c75735d4dcf4492aecf50e1ae2316ee0457',
+ },
+ {
+ height: 660700,
+ tx_hash:
+ '318ad8b7042bc70cd7747cc6417161aa4e5997f3fb10855b39f3b4e246ddff9b',
+ },
+ {
+ height: 660747,
+ tx_hash:
+ '854b6e0639d27a4c1909c6d1d2998aa99f49750ea6e50ae4463a07e3c89e17bb',
+ },
+ {
+ height: 660831,
+ tx_hash:
+ '1a4b0530f6acbfd6723d1726dc6d4ffea91ddaf51f9e7a88df0c83068d91b637',
+ },
+ {
+ height: 660831,
+ tx_hash:
+ '207f6403e64236c063c90a56e30f1414c0dc2b856221d7839988694f8a20d534',
+ },
+ {
+ height: 660831,
+ tx_hash:
+ '42cb1a41d4f4c39e2050b952153429039b8f934ed0ad065924e0c4912f57286f',
+ },
+ {
+ height: 660831,
+ tx_hash:
+ '75801e3c5222acb38eacdf3b206f47871c1e74e27b8dd93d9a0ffc1812f3471e',
+ },
+ {
+ height: 660831,
+ tx_hash:
+ 'c3ae6c343da85e5e3d10b349bea62b811cda5869bcc007f3753628b189b8bc34',
+ },
+ {
+ height: 660831,
+ tx_hash:
+ 'df50885752778ff42c41902e8926133fa59d92b60e4f90113be6b6490d5d6499',
+ },
+ {
+ height: 660831,
+ tx_hash:
+ 'e63281d70e761352ed2460a146fe56f859163966bc7930a99d5448cfd07e4f3a',
+ },
+ {
+ height: 660831,
+ tx_hash:
+ 'ff39695482b5b23bca9924311500d6f90645b4658132cca816e89a6e9884a1bf',
+ },
+ {
+ height: 660832,
+ tx_hash:
+ 'a2069771bc9a17a42b5d7e339dfafe85278e838cad71ee2cd7be48aee36b4b82',
+ },
+ {
+ height: 660832,
+ tx_hash:
+ 'aa37cd367933be603220b002f6a3387cbaba5bb4cada3cadd375c521fec4782f',
+ },
+ {
+ height: 660832,
+ tx_hash:
+ 'd744f126f4e8d98dd6ad009c4c58960d166291fa4a55439374aa66220d2ff315',
+ },
+ {
+ height: 660833,
+ tx_hash:
+ 'e08ec8fc55e0578cb52d7664d3b60c390c80407cfc1bede1ddf180a2aec2bc78',
+ },
+ {
+ height: 660835,
+ tx_hash:
+ 'd0f975c5b7c105c0ea9c8c470665e9aec88d6b04fb44109de4a94dbf2e249a7f',
+ },
+ {
+ height: 660843,
+ tx_hash:
+ 'c680ec60a81855f7f9143478588cea3887c27d3d8e640b77727a2f957cffa283',
+ },
+ {
+ height: 660843,
+ tx_hash:
+ 'e84b0d38dc0ef348f59c2c986af732dba468c09d170be6de6c0c79fdd78b9f5b',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '054f441b4194ed1bf1550705250c6cab77b75a53de34ad5fad3c822b6c4f23fd',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '114513c07b4faa92341fc324b4ffb5244391c9c843fcbdeb1425e099e1717e3e',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '1b065b91724b530858bd0168589edc36d381a607d4f595a96c0a3887b45f8b39',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '228b2b03636d4e7b7c9d808c973295786fff4841639d724840e9103e427cfbb9',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '26c0aa7de1612627796b571c7a14a3071e2c96ea3366c9790df455fa5eab4b3f',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '3371415aa270dfa4323ab62d8430975cac152aec9308855de6bd1275c01c0166',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '37314425cba131bb44f9c65353450e9eb4ee7e76c22adfae685ca6859ae474d5',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '40e8809b48e0e299e3ceea365b7ef254f232e3248ed48e16dcb868d263df6dce',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '4c2496a09f52501d191592075e2b723bbc9e976599b881456f590bd87509f7e9',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '4f66bf9e8320d32540faf22c9a1c225e15ad399026cfd9a8fddc275617aac237',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '556f083f96b71e2f5aa060c1939e8616505381df275ec8101969482dcc627b43',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '5bd2b4307f3abf8077207544364414ebe2f68220d11c77d788fb2993bfded1e9',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '5e33b1bf1a7f0fe3251cf811d172968787b48dbf1b37868718fddaa11cb84fd6',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '602272f5602d3d998322c9b5dd0c837f13d28ba660e0905ecc7635c3e96ad8aa',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '7b685ced60deac82cab9045b2794e30d991e8155cc5b17046307fc8c18ab6f7d',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '820f74dd4914d9c231a65c795d30b07cd7e2d9034c58d9880e806963cd519791',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '8fa3d295981f7d00067d4bf50f975f0b80aaff5c318a3ec79a3fa62546023d99',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ '9d5e87160b6d105d4cfe1d9fac8babd07b4692f1991d9dea2631827a615a438a',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ 'a7c6a8f45f0e7faca3d430beaa42a7079f85f2a18779950d40a48637f26c4357',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ 'b4b055315d9c162653d0f0f8c1da223e4a6c79c69a98ed8f7761faec4ed429ef',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ 'bb705feb9334b98fcc2e6fed21d1179829874484f1e065fdc5d205b1b3753f06',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ 'c9808df869d1e2957b6371b5385af97e3cc91967eed78afd37b4c972d4bafb95',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ 'cf7161f41ae6da322bdcf05028d2cfe925866f3a432163c024fadf7354d89eef',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ 'da133d2f98d3cb3a66b8e4abf0ff1a19b31b92604faba1f855620a43e4930f07',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ 'eccb73e07e556888ef01dbcbe272ad3a093df22a4a1d265f18b814dc68b053c5',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ 'f2cb43738287f58da5c15dc441c7d223449d2b49d47e8e2b2ebe723850366e7c',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ 'f46d133de7a2f74413a795087357ffd4a0ebadc4d011c42019431e78b679fc03',
+ },
+ {
+ height: 660844,
+ tx_hash:
+ 'f78c4bffdbe24052d20db343ffe46ccdaf02192137e230f1995a6096a37b6039',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '0aa8e97f9f2112b60db4395020fdddc7b2a93abddc8824e15b21ddc80a3900d7',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '0ef3b2ff213728dfb7f72d3ec9ab907ca1ef819724b37516b7f7b9a246da88c5',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '108a923ae68e00a445047bf3c4c6dd594d55f464b1a21f627f56df808218bace',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '108f23996b06e1db55ca8fadc03587ece30db438c9b0cef3219bf81e97c93929',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '167802579f3e23af196c3328885efd316f8a757286675cf6c646529583d68df3',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '18fef25c659e6b264e388fe274fc3a7d386ef468774f42e7290fc6d5e3af1320',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '1d33bc2ffaf534dd9b21c57fde910fd2a48bb59e1a46916e29fb4aa6b3cb0d8c',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '1dcefa13abcf04a7e055e2c7698353e7690730a48976eac89e1f3a9f1e3e8061',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '204427871040783a43926e4f14a43fd3379136b6f189f8b392d2f2dea4b3c950',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '209aca7c3d906b2f7b012ea18d217bcb8081af0ac715f76f9b08187965ed80ab',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '2128868ae0359373751c46160fea8029914b9e9a3a195213db7b38909ea1cf7a',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '212f2f720957facf44d353f319825fac5510dcb590a4c40f2880902b7d49d813',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '2e8718619cf6bd87fa3a3b4bc9c6b96a5601ff216de13e81ebd8e5804d10dceb',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '3356431e58c73c0c26d971d24b154a163a0338cc815d71408204e874d1b14970',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '38bde8b9667e76d4755b01e662c4abf5140544da28c26e87a1814e29992b63aa',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '3c464bb33eddd4d6b154a5fa34d8c84348814aa8427b3796cbfd78fe2ba6d9e0',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '3e5fa9bd7dc8c0d0977f04dfe14b13fd02abf7bb5420eb668dec0113910c6a1e',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '4148db649a3dd4cdc7651b937116b2325d675bfaf1c3da22f9d1bda8d69dfebd',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '4388d865dfa9f12f6bc73af0ab6cfd5e3a96e55a5008a64d1aa144debf773444',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '54a6ca51bfd692e04803ac3b0dc32fdf1c08e4da9dc16515ff7929bdcbfdb840',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '6114f419c2b7ed62febf719d58a9318f736575fc0ab2f1ed06934cab9c0d95f4',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '6ff43f8fa23efbe29d54e074f7a4359979ca26497b0a153d4c3d48768c40b46b',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '83e8a2982f817fb9d9416ea6830848d00aef401658e68087c345339da67385d1',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '84ce26f24db68be5c5b6b8ca64baac96914eb707ca1986bc96ef8142e0022c4a',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '85138b6c203b21fbfe3d54c8f2638039f68c1e4e59c3147daa044f5532afe978',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '8aa29b912e09b4fa9dc37ae5465fdc1e576d206424547b0fd3baa930ba858f6d',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '91ca027d4755acf6f2a5f5dcaf72da5787b40e81ce96ad8f3075d78a6d2f2228',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ '92e6e05a8e01c5495793a8ae4588661c1b6e4e7b53168020b5074b2ac937f9fc',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'b50c85ed88fc190032979bd56194c5e25b3c619fc22563405fa224981ca47660',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'b7aa94cbfbaa95ebaf89d3b99ca825c238a44f09062ca509d17b65652bb347c3',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'c0976d917ab60ac47169e17a103ba08b4520ee7bb1bdf1b579cdb14fc28f435c',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'c66b5095f30ecdc60f97e390367c2adf528018f1035e683cca19a0af1f7fc734',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'c7e56112f298c56cd6111b457e763449aee0a9692b97bd6c80f9d3dde6fc3310',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'cec9de5c7296bbebd3d9ec3da40a5da90e2915bb00e8ab263d9ecf266bf3cd52',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'd4c718c44c89357212735e7310e50a56cce08e2ff9a119216e6b1dbee307b1f4',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'd67f5497e8940d8a5686e9f432271ef3ebfedd4197413772ce64fc18ae1443c7',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'd7d34bde36c703d8f401832f1422185cc4c25acd9e65fa5635aa58d189dbe102',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'd89c70a1d9d31f4ef99d4e29deff2f4b13a95f2744768fdea1d30e5e11a94fb7',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'dea163e61534e4aed2da51077cacc5f1bfb65d9f287118719644772e2c0eeca3',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'deb63dfb5df4c30ad8893f5a79bd87031ef4f87fc3716248c451cc27c4edf5be',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'deeade44d8c325976bbbc4ed4439d486e92630e6e24a01dee9cf0d3d917f87e7',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'e5639b4fef35807f0986aa0e7fa2814fe027d9d4d42c01315141ceef36f50bd8',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'e6c3e2e0e8b990b1506978eb62513f8f69bc9bad5715984001dddec0f251e1bf',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'e73f9f2d0ba99d6664dd8da2a7c28637d989ab6a03d20fdef6fb8e37154c9cf1',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'ecdd577ccdc7455239fc2de4ec37d6c986216c9f88ea8ac8ea9c11c7d8c4c4c3',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'ee94a10693cdcd3c3b1e171f983c400f510a7be867a0833fa7fc240dd6c9f149',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'f0fbced92a1fa846a00596cd40ed9b1323a24349473ec0b4021b49472c7bfd29',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'f1180c7649eb145574c6b3450ee244ada609f1b2a05ececed8c3af43e2ed6272',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'f663bd57bbfa2d9b72aa3f5b001d6a50ca56c1b11789ff8aba96d3cb1bd31f70',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'f99278b2cb5457684966330164b8ee27b131313b614d3d54bd91cc2e6a82265f',
+ },
+ {
+ height: 660869,
+ tx_hash:
+ 'fe7097a6914eaf6387cbd8e5dfd782bccb008b1185ce2e518a19569b0247024b',
+ },
+ {
+ height: 660870,
+ tx_hash:
+ '5736080ed1066c7e001d2fb770e27c476433a110d9daf3e1589a68dc8f67ae1e',
+ },
+ {
+ height: 660870,
+ tx_hash:
+ '8ec65d15890eb606aa3d6408271c96f260397468e66575d58b914f28686e5d1b',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ '0301275a8869797d4bf14a1b3df3892088c88b42d3674fc5ffc4cc2a4b1af8c2',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ '0aa845fa08881a8e12c35764dd59d6767714554c2aec817f193dc25b6da659d9',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ '1edf7158ed7195b6d53e0983cd96bc1b910d23ae6a9a283acfcbb0030c559616',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ '28369624fa39ffe30b72c4498c1ae2e611dfcccfeff512e7d5025ff96cb36a13',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ '50184ba24de7e238a6509c0dd48db175f163cb3c968ab98265da294118c49953',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ '54a615851c6f681541a7b98745bfddd98838c1896542b45650c2d056555955e5',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ '64bc637895d21bf91185eaf52e3cd54acd5724924bb99113fb6a1ef80581f05a',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ '6c5da609e82a06a4c919c14e6a078c91c41f59f4988380ed8bd7af2f85ab939e',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ '6cf2c5bc7d90f17e629787b71bf0a60939c71be1fed46f1ae018d964ce5d4e90',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ '83f230c90480e97c8f39528c2380a3f981599205f4306458a86ceb47ae5ac46e',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ '8e7b41d6f3380a40a3748dedb2f7dc20332cb9d1598536cfd6e936356ea7ab25',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ '99fb7fbe0f4980a63ad4c869f06bb3cb52bb26b40db9a8ba98de3d0807f703fe',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ 'd4026c6e75283e4e0e85f2e9288680fd2ed9daba08f6e812eee94622f12a3c94',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ 'e144d8de3a94a68422cf9653e8ff0107cb9c730d45c7160b01fce9f69f77348d',
+ },
+ {
+ height: 660871,
+ tx_hash:
+ 'eda398cfaa05f8f0a2293a66e78f41f231eb9652c7bb51853608abb8a1b4f83a',
+ },
+ {
+ height: 660873,
+ tx_hash:
+ '27e27bdada08aa953eb74d6064bf90990316cc5fb1f7b6cabb38a37bf77a4355',
+ },
+ {
+ height: 660933,
+ tx_hash:
+ '9c491d74a3fd32b4fc95fc16e7bff2f87c52667bb309efd02e1c82f34062486a',
+ },
+ {
+ height: 660971,
+ tx_hash:
+ '345cde8f670d8406104f9dab46e141ddba97973f80ccfed45809828e2a53250f',
+ },
+ {
+ height: 660971,
+ tx_hash:
+ 'aefc3f3c65760d0f0fa716a84d12c4dc76ca7552953d6c7a4358abb6e24c5d7c',
+ },
+ {
+ height: 660971,
+ tx_hash:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ },
+ {
+ height: 660971,
+ tx_hash:
+ 'ff46ab7730194691b89301e7d5d4805c304db83522e8aa4e5fa8b592c8aecf41',
+ },
+ {
+ height: 660974,
+ tx_hash:
+ '2922728e4febc21523369902615165bc15753f79f7488d3f1a260808ff0e116d',
+ },
+ {
+ height: 660978,
+ tx_hash:
+ '2ae85b47d9dc61bd90909048d057234efe9508bcc6a599708d029122ed113515',
+ },
+ {
+ height: 660978,
+ tx_hash:
+ '4ebd5acb0f3c4edefb9d15295cc2e14f4dada90a3ff0ee17cf77efc57e2940a1',
+ },
+ {
+ height: 660978,
+ tx_hash:
+ '5ed96f59ae4fec31ee8fc96304bd610c3658f9df2fde35119aad6f44547420f9',
+ },
+ {
+ height: 660978,
+ tx_hash:
+ '648465087cc8ba218ccf6b7261256924ef2dc1d20e5c10117a6d555065c01600',
+ },
+ {
+ height: 660978,
+ tx_hash:
+ 'b622b770f74f056e07e5d2ea4d7f8da1c4d865e21e11c31a263602a38d4a2474',
+ },
+ {
+ height: 660979,
+ tx_hash:
+ '6daeef56edf01e7d1d2d12355236d63f8b138eebeffd7ae1c8560869c39917e9',
+ },
+ {
+ height: 660981,
+ tx_hash:
+ '4ea43afd7e538a5b11a7693f492ca94ae8ae14bed681647a55f361424666e72b',
+ },
+ {
+ height: 660981,
+ tx_hash:
+ '68ff1d86a1b2fb0a203d85fd40cd440e41750497f8393c5a046bef3ece73f734',
+ },
+ {
+ height: 660981,
+ tx_hash:
+ 'aa026cd63ba572037c392339e39274447dffc38701b5031168cf4de987fef179',
+ },
+ {
+ height: 660981,
+ tx_hash:
+ 'd2061b1797436ec6606bdc896036c407b552ff7acfae65ca0805b6eb4d6fc385',
+ },
+ {
+ height: 660982,
+ tx_hash:
+ '67605f3d18135b52d95a4877a427d100c14f2610c63ee84eaf4856f883a0b70e',
+ },
+ {
+ height: 660982,
+ tx_hash:
+ '6bb01684939b8388a2532529e6dc27d1bd9d47ab535b7d4a55ec358b6cd8b282',
+ },
+ {
+ height: 660982,
+ tx_hash:
+ 'a2f259ccfc6abd682efc37732dfadb755a6ac90212579dde1b38f6af0d99684e',
+ },
+ {
+ height: 660982,
+ tx_hash:
+ 'd9e26201a0d3af9988e496c19b70ba1cd0eb5e40c4a6e5921a186ec1b25ca590',
+ },
+ {
+ height: 660989,
+ tx_hash:
+ 'd2ca52613c9899994cec69031828d43446b8158a521a6c7aa5df7a680fb4f7bc',
+ },
+ {
+ height: 660989,
+ tx_hash:
+ 'd576a359680d9c38da6e1d1cc14650f48638c150ec47324a3f6cd5d9da3caec7',
+ },
+ {
+ height: 661014,
+ tx_hash:
+ '783e2143a1a6fe6c27399e57ae2daf8f56b39d6c1dfe9414276636ea51e3145d',
+ },
+ {
+ height: 661014,
+ tx_hash:
+ 'a36639832da9abe750e92e2ea6e59e23b74271c7e1cf9190d9c51750a1e66f01',
+ },
+ {
+ height: 661014,
+ tx_hash:
+ 'c81ed42ccd7a7ace4c513ddaefa18c212cbb2ecb5382e2ee95669c1ae5708b79',
+ },
+ {
+ height: 661016,
+ tx_hash:
+ '36a64910c68bc2f870d172ae6ed9a66d8c236f23d776a2b321c2997975fe8ee9',
+ },
+ {
+ height: 661016,
+ tx_hash:
+ '525c840975a69ab365014395b39012ab95837ebb424088909a90bf25dfabdef8',
+ },
+ {
+ height: 661016,
+ tx_hash:
+ '624ea40e85bd14a3890f9a51efdef3d4fb30d8ff47694e471a04be5ed170978a',
+ },
+ {
+ height: 661016,
+ tx_hash:
+ 'cfb409bd0fe1963874f1614c8848afca17c6fabf506c8da556c7a2616997f391',
+ },
+ {
+ height: 661016,
+ tx_hash:
+ 'd9342d8e2ab3f7f5367c8e9b202bc57212636c25bbf4392217dd698f94e669ae',
+ },
+ {
+ height: 661101,
+ tx_hash:
+ '37240c07201416124b098c250867f3ea0c1c5e3c948d6eea5cd95a0e2c35cfd1',
+ },
+ {
+ height: 661125,
+ tx_hash:
+ 'b2afb3e70ccf4f42bfb624a9de7b1b93ee9a96e024e55a59c37b2bc7a42978fd',
+ },
+ {
+ height: 661161,
+ tx_hash:
+ 'ae180868bd0abe92f7f1fa2ec78d749b0928b77bc2d4008689354a4a51ee65ad',
+ },
+ {
+ height: 661162,
+ tx_hash:
+ '03e1415e358146fd1a25ad61a625bcfa4ab42aa6237223af3bfea6bfc8a7cfd9',
+ },
+ {
+ height: 661162,
+ tx_hash:
+ '27274703354294dac655be38c96a4ab394275635b7cf78009f4fb6cfd2fefbb7',
+ },
+ {
+ height: 661162,
+ tx_hash:
+ '705d707ec7e066dae677f70f9b314702ad4d19491061f4d77645d065b13c5f1e',
+ },
+ {
+ height: 661162,
+ tx_hash:
+ '7b96a717bbbf5eaafa904436a71ef0d557972442e115e25cab75b79ea60b98ce',
+ },
+ {
+ height: 661162,
+ tx_hash:
+ '912000f8985c49355825a44e40e63e109aed0de410c1b7f2b67c7af826f7cf70',
+ },
+ {
+ height: 661162,
+ tx_hash:
+ 'f519a4362eab88cc9369fc7fde776e289f4207ecf85905fd39663202842397b8',
+ },
+ {
+ height: 661254,
+ tx_hash:
+ '309b7a5eca926b80b1d17306038fdfac81d5f47c270cfa670f1d7b2063b125d2',
+ },
+ {
+ height: 661254,
+ tx_hash:
+ '416080a966f7483eace2c9edd688d17c7d4c4da3b192556d944064434528bce2',
+ },
+ {
+ height: 661254,
+ tx_hash:
+ '4f0b017cacf3876bb9b9346e97ced4b1ad091a44b2fbcffa01cbf8a35e4348ea',
+ },
+ {
+ height: 661254,
+ tx_hash:
+ '651becaf75e124ceb7577f89e3c47344ce5b02e5a8edac0c24997f26edf9197f',
+ },
+ {
+ height: 661254,
+ tx_hash:
+ 'd34fb9871f26e5a9deb7688b6b56609b953aa8b9e72df9dc3faf3c918ae2ae63',
+ },
+ {
+ height: 661254,
+ tx_hash:
+ 'd3cb34865c71227008d526685bf5c40d0ed991ace41d92b106521ea311ca7230',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '00420724edc40414506ab0760c2733ce29ee0e386395a4881f76ca7ae7bb01c3',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '02d1f33800abfdee3c696ccaf2be4f37b593141da11bcb2e442de83b010585cd',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '09ab751e083165c324f39e04a63063622cb53b023df5582e3c74a8fb696f9556',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '0e2a589185b8ce7fae29fb0e79a6c28427bd3b2ea1269a2edbfb5206599052ef',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '0ec66fc6364237ddcf218cf43683baa87af915cd6224f2bee1c9d59fe5aadca8',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '0f6cd9021fe37930111437ddd22050d8845199de9c4b3892728cc00b53598c5e',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '1b12029dc8638fbc05eb5ea331deba251074d8e51c8556b203272fe8d9cde027',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '1b6d63db4fda6dd352c0b3f69d509268482e19dce0dfbba76ea167e9f4a4b1df',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '1d88f081f3715655d3044831dfd38ad8668d71a40e155e4518720dd261d48b7f',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '29c6eff1df41f505c478f4a8f4ddbc8493183583334d0d172b9e1ff03a63768b',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '2df59c1aacc51e356ec474c34600988a39c2ad2ee3d2e81aa08d1a2e402e9bb2',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '34ce4ea1767655234ca96ff468f0f9005606d171709f97b88f7e04b57d792afd',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '38ac276044e3f58f125b39e622107b58f6497dd99526724c393738e4ae4798b8',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '3f9b951cc4780304dcee6b3b57bd0e4c2c2a5ebea70d9290f3f5a7f63210748c',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '445a51356256af2ea06d475a5159414e7149182856805746f24937ff1ce99a52',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '476498349e7d29650e0cc075a75f6a1c9549c840c7590129a6f89eeb30aa176e',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '4d2b9b8074876d9c666f52f228e703d48dd0436ade8271af90d2faf513406d8f',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '509a2a77ea6cdba342fd47d71de05534fd1efcabfe78f139e26facfc82ab742e',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '55c20071ee6b89f15c5213fcdb8a47328538a184bbf15a62310e54f6f5ff5f90',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '61566cf88e57292e9e405003c4642cdf28534360be073ecd6b159d2ce9230f40',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '67f457e66660a9247595f2fdbb64db28b3e43bab0fd1478913220326c02ae5f8',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '690b3e1c4b6a2e9e1cb5291f91afc04c570c12526985283ad2dc145b49855df2',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '6af02c722645b38d66932cc16ca6ca84ebe5ba71169565d5bc74791da0b7e7e1',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '79da923c2d1bac3fcb1fdc090f2e3871c259ad32d551e5f21609bf48bf496f77',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '829aebb6f0495dbf9e54eb4a989316b4c8f162af0aa9d342c0a4d17489420cc5',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '89c5e715adbc795022021ef4411a0278f0ac62ac1f4ed6505fa9e45b760add34',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ '8dea1e3884e63d39e9f41f0b3274662c503ca46786e077ea01f6bafef29882d5',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ 'a4badfbb06332950804034d32233cd5ab4c8fcf58615a0a1b3ede5775ca37eb3',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ 'aa9350b3a7e33f1ede7214237e28e5ce978e01f48f6835d9660869c71fa2a1d9',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ 'cc557f18d7a9c9906d21d8b5f97f82c98882df13842b6429c5710fbe101b71e5',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ 'd020a27644d6a9242a3d1bddea6a2e5b72844641d9cb6f08073c0333b8b624aa',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ 'd3bd51031d68ddcb18620cdc3f9eeb64f1614c908be68e9151830e2e654a8f09',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ 'd47b99b229a9781700260a160571a7b36418fe7174e27dac4e98799266608bf2',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ 'd5061f01bb63589352252d57054ef071a4124cd2b8b5ff0df1bff19486dfed89',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ 'e2b3545026b4ae51d474059b95492844b940e99973a2fbdfc2174f281c1dafd3',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ 'e9d5529ba5036818df350c5cf31a46b4b0d1151261ff12e44bd85a94f30db014',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ 'f308d992681ccbb438a3cc4129cc484ebc63890b5c727522747c2497645d3cc7',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ 'f415ffdcc8274f73a5a25a69834f7fa5563050d883496b072cd98c9e84bdd901',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ 'f7a90413abdc3d06b061ae443da02eb27193516d5bf4f2d736ed0f3531316f84',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ 'f8c53c4befd7953dc7cea7bbaaa411552d6c313fda0d45836562bf55ca78bdad',
+ },
+ {
+ height: 661305,
+ tx_hash:
+ 'fe46faaf85f55504072f2a2b082b8a527e7b54ad2b0dbf91a4a6ed7adb384aa3',
+ },
+ {
+ height: 661307,
+ tx_hash:
+ '4079a915919adb0a7f00737776192a66da8d98ac140e7dc99f613c8cff98704b',
+ },
+ {
+ height: 661307,
+ tx_hash:
+ '9b1e4137491d6a2c5e166d4240e702ca548d3ac9fbf3ff7f54e632b813946358',
+ },
+ {
+ height: 661307,
+ tx_hash:
+ 'ece98e37d6898fe21167b18b0e322e708fbe9a54011fa18dcd1a8e9113f6567f',
+ },
+ {
+ height: 661348,
+ tx_hash:
+ '33a20d9c8c1645856c6cf85ad8c6eae6f5da421b65771e2392c58fb11a9dbde3',
+ },
+ {
+ height: 661348,
+ tx_hash:
+ '57c4225467e007bf453f99171f1505cd9d6573e89a74a71b30af8a38fa2fc04f',
+ },
+ {
+ height: 661401,
+ tx_hash:
+ '1df39adc33662eb051035c4b772b75ebcd73b228fa1b95a103c206ee7a99d0cd',
+ },
+ {
+ height: 661401,
+ tx_hash:
+ '4f0c8668d0247fcf417e84c3211c6eadc98b4e9ae3547fe108dcb95a23066649',
+ },
+ {
+ height: 661407,
+ tx_hash:
+ '82339dcaec5f1fb21110bac287d44583eae902c8697ed663ed7ddcbb537dfd21',
+ },
+ {
+ height: 661407,
+ tx_hash:
+ '9add6c65ec0842f089e5d7f9be98f84867c5e11d25ccb1046d3f3e00fa18a7a0',
+ },
+ {
+ height: 661408,
+ tx_hash:
+ '57c5e2caf38aee723dd576d6b3c1b193f3a7a714c4297007a8255f2dcedd6bb5',
+ },
+ {
+ height: 661409,
+ tx_hash:
+ '05c5575dd90b3cecbaa1e3669bdd21bc01aa0e8da8840185a0009f32c3aa171f',
+ },
+ {
+ height: 661422,
+ tx_hash:
+ '0414c9dd4d2d332b3a9a385811e9a1b4c57a248c5290390bea9e3a49035b3573',
+ },
+ {
+ height: 661422,
+ tx_hash:
+ '54386ba7982c6114a4bb73197e6cddb4d9f30eacd495ce24318f692b9566acc1',
+ },
+ {
+ height: 661422,
+ tx_hash:
+ '80727d44a569e121b2ef96f373bdc6616bbabb54747855f427ea999573632100',
+ },
+ {
+ height: 661425,
+ tx_hash:
+ '827011db8fece325ed8ad94e93e1e088faaf7a4597cd1e8fa874710b87f70368',
+ },
+ {
+ height: 661425,
+ tx_hash:
+ '8629f3d9a4acd02f9c979e8435047896bc20d357698928dd44ed8cb3d3f59629',
+ },
+ {
+ height: 661452,
+ tx_hash:
+ 'a30c1cddf5a83e53ee3a5998ed4f4f33ce422f12a066b5dcf1e0e7b8a5dd3e31',
+ },
+ {
+ height: 661453,
+ tx_hash:
+ '4fe5d4d5f4ff0027797f6b5b5a0e8ba72d480c2931cb94333a28868286372beb',
+ },
+ {
+ height: 661453,
+ tx_hash:
+ '5fb25c8aace65915aec061dde39e00ac620f2c971d5e65a6944252b64ab66b4e',
+ },
+ {
+ height: 661453,
+ tx_hash:
+ 'e11d7de8302bd2e7f6a5f29c96f33def726dff5e58f102bd1c336dfe2ccdfcef',
+ },
+ {
+ height: 661454,
+ tx_hash:
+ '5a068215b1e96c27f79dbb8c07cc96072a32dfaeb833c5e36c87ced7943cfa7a',
+ },
+ {
+ height: 661455,
+ tx_hash:
+ '1db20cfe0089747d1e2760c68c3eaa2280f15fb60790da0aef84419f4b042067',
+ },
+ {
+ height: 661455,
+ tx_hash:
+ 'f05ddea58b570796a2dd506c8c2a1f64eabf1f363d6d19bbbc1d3f401e43339e',
+ },
+ {
+ height: 661494,
+ tx_hash:
+ '05204a2c289ef7ce29b9c7122e02bd1926b72ce7cdf94a00897e490ae33ae057',
+ },
+ {
+ height: 661496,
+ tx_hash:
+ 'b87e781bcc798d6e5acd40083cc378fb46c1c5b71fac21a359063fd2217b0c66',
+ },
+ {
+ height: 661496,
+ tx_hash:
+ 'dbcec1c36ec652cf9119a52a3a45bde0f78eab63e1139ddd46af7b361fb3245e',
+ },
+ {
+ height: 661496,
+ tx_hash:
+ 'f848416fbd39548207b765aca7a8c029a1b547966a0b6cb6e2fa5a153a41a1d6',
+ },
+ {
+ height: 661527,
+ tx_hash:
+ '2ea815e886b0c14e3bceda65d4d930f308c022b9525d6a028d7775edf3058a15',
+ },
+ {
+ height: 661527,
+ tx_hash:
+ '9a07567584b2af07376d32c04d4d5f0926b35722b7b30ac35c43939c7d86daf6',
+ },
+ {
+ height: 661528,
+ tx_hash:
+ 'b53409baf29ce2a17142f107c8fed5a264bdb87999cfaf9bc8fc9b901899bcf0',
+ },
+ {
+ height: 661528,
+ tx_hash:
+ 'e3c404ea9faefb6f60881723fe15346c7b44ba1413bf3a78da8ba16e28a6f95f',
+ },
+ {
+ height: 661528,
+ tx_hash:
+ 'e74d09ab01ab7f605701ec41d320ab6a7173c8157dec1fb7b8374189230bbd99',
+ },
+ {
+ height: 661529,
+ tx_hash:
+ '6f05207d320712480edeb42f597250ee3db1dd4b53811230ce3ebc12ae686a43',
+ },
+ {
+ height: 661530,
+ tx_hash:
+ '92ea5ccc19f0921ead53e331c6bc77d68a7c8720621f8b1909b75a04196c065c',
+ },
+ {
+ height: 661532,
+ tx_hash:
+ '7bdaeeaec99ffe0f901d6fcd6e141ce8d17dcf829f86f42ecb72f5f43891c60d',
+ },
+ {
+ height: 661533,
+ tx_hash:
+ 'cd95001a36dfe481482944c7bddd1c131fe6b4cddb1bb6b0547e7c8c38ee8d09',
+ },
+ {
+ height: 661536,
+ tx_hash:
+ '6f47a5f3cd9596de233c8fee4384c8555f976a8eb975b926abb859f44c16b686',
+ },
+ {
+ height: 661536,
+ tx_hash:
+ 'd3387cc1edd6dc58ed4e6e1201b5957f181f59cd0ac121f98d935e87596b0133',
+ },
+ {
+ height: 661642,
+ tx_hash:
+ '178f7f09766b25f966ca11d2a1d5ea19bb4ff576c2a010e42616a1ca352fd503',
+ },
+ {
+ height: 661642,
+ tx_hash:
+ '2cdb5d2669a6f7273fc51444c9eec61f2041b6891b5002e0f3d43a9be12ab822',
+ },
+ {
+ height: 661642,
+ tx_hash:
+ '65bbcb0d5c1938899314912b69fc12d92ea3651aaa2b8685b3a46f055f7bdd7e',
+ },
+ {
+ height: 661642,
+ tx_hash:
+ '6b87ac222d555227f1ca6536a85902e831a80ba43a354bde3fdf4e30349a3732',
+ },
+ {
+ height: 661642,
+ tx_hash:
+ 'bd2e857a2e012e608f11fbcd7f399eeb09b530c4036cd3b8af5d63aef5fd46f9',
+ },
+ {
+ height: 661642,
+ tx_hash:
+ 'd24167545062ab25611ed9497f556d96769068359fdb909eb06a26c655db1c10',
+ },
+ {
+ height: 661642,
+ tx_hash:
+ 'e43ce30db0807d75c75a89661e1e7dad7cc32a0a532f1c9144a88613dc0e17ae',
+ },
+ {
+ height: 661642,
+ tx_hash:
+ 'f19b25bca58f254bab30b9ddb29ffdc96d021feba8f0777afaca422a7f20dfd2',
+ },
+ {
+ height: 661642,
+ tx_hash:
+ 'f26ccf97f90d7f5bf5e1e4d1e429449d3af3b2a4392a171ebadbcf509b6e73ec',
+ },
+ {
+ height: 661651,
+ tx_hash:
+ 'a0f2d0954216a4a83999d4ad5d6519ccd6487d766e40032a2e83928e71f71e69',
+ },
+ {
+ height: 661682,
+ tx_hash:
+ '034a54bf1429ec0915fd3834e0d14a0fb99a23dfb2a6744109e58a7d461b6379',
+ },
+ {
+ height: 661683,
+ tx_hash:
+ '39bb65b63362485d7c7e144873aaf36c62e2205f0b8319196c262d0decbd853c',
+ },
+ {
+ height: 661683,
+ tx_hash:
+ '4433ff7a4e3e0f5c100788ad8bb57e987536c0070f65ea1328fa182534e98789',
+ },
+ {
+ height: 661683,
+ tx_hash:
+ 'faa7bda4f41a3502e65db22a5fafcbacc28e4935af94cc497456800bd24eaa82',
+ },
+ {
+ height: 661700,
+ tx_hash:
+ '0521c31570e509ac4ac207bb081f484893ffa6c5efc935949469b904888200df',
+ },
+ {
+ height: 661700,
+ tx_hash:
+ '4ef9fbd4f6caab621cab6416fcfc61f46e8ef63666b4a0434defb681aa587d7c',
+ },
+ {
+ height: 661700,
+ tx_hash:
+ '7c1e51bc0aab105808b042f21f1ad95b79cebf79fae89cea2230e1ad933b6cd2',
+ },
+ {
+ height: 661700,
+ tx_hash:
+ '854d49d29819cdb5c4d9248146ffc82771cd3a7727f25a22993456f68050503e',
+ },
+ {
+ height: 661706,
+ tx_hash:
+ '3919a1b2b52a5e56c0026d52167840fc21648ecb2fd683a1581a0d04b30824f3',
+ },
+ {
+ height: 661706,
+ tx_hash:
+ 'a8f17cf116803f0865cf2d8539865c52bb75c22b2097cb884f94db93fc421d17',
+ },
+ {
+ height: 661711,
+ tx_hash:
+ '28a83416798159c3c36fe1633a1c89639228f53b7b8e6552a573958efdef74b9',
+ },
+ {
+ height: 661711,
+ tx_hash:
+ 'ccfa994c438be923b6b04ed950be4cfe4b9b724f091e55f270c6b566cba609bf',
+ },
+ {
+ height: 661711,
+ tx_hash:
+ 'd662e05b76bed604caf1ceb8fb9fd7ed39a5b831c35c7f2fb567c50ee95cff72',
+ },
+ {
+ height: 661711,
+ tx_hash:
+ 'd79cbf3a7ac607fc99b59420333c7f0559d0e91ff589d6bdd105c5a6b0e8abb9',
+ },
+ {
+ height: 661711,
+ tx_hash:
+ 'e7c4b43b66f1b07359f0679f296e91055be3912e16b0919fe38a538f4e98e50d',
+ },
+ {
+ height: 661789,
+ tx_hash:
+ '096c641b7332f7fc3026d5294d20724ae2b38c7843033048f6ae57b4595b3179',
+ },
+ {
+ height: 662009,
+ tx_hash:
+ 'c3397769ea999c81c42eb6611d7d44c35c8e125856eadd394b1b7a4e3f9eedd0',
+ },
+ {
+ height: 662009,
+ tx_hash:
+ 'cb91598754838db350535c3a32dc3597764589300e99bfebd50f3379f23d3152',
+ },
+ {
+ height: 662009,
+ tx_hash:
+ 'ed762cecbb3d0695cd8115498df2bd28ca45b5085cab66ca057916e314239126',
+ },
+ {
+ height: 662277,
+ tx_hash:
+ '951d2a3da5cfa7edcadcd70e2d0bfbe32e27b9e2b717bbcc123731b1844197d4',
+ },
+ {
+ height: 662301,
+ tx_hash:
+ '4d04a251751328ec22b934278747df1261e76d6340eb7686c092f4b78db26f72',
+ },
+ {
+ height: 662498,
+ tx_hash:
+ 'a20fc2cb353642d40c26857c65347b1a3afb31babcb0ea912866cc94834e9cf7',
+ },
+ {
+ height: 662498,
+ tx_hash:
+ 'db7bcf1a9f2afa21b0177564a51912632aaebda5324f9e71aa8c292468a70e35',
+ },
+ {
+ height: 662529,
+ tx_hash:
+ '3f840a89a6bfd4ece41216bfdb897f7359e6846f447a9173ca890d0663cce419',
+ },
+ {
+ height: 662731,
+ tx_hash:
+ '144c0275543be95d9164097c164590ad01f233c742df0a33108341dcbc1def0d',
+ },
+ {
+ height: 662739,
+ tx_hash:
+ 'a67b5c6a57bb39a9d4270963755a2cc5131c8af9ceb749f74d899ec6645a1a40',
+ },
+ {
+ height: 662799,
+ tx_hash:
+ '28a7e3debda623274f3e2cb2efde1881cbfd08734909c184211de4deb3885eb2',
+ },
+ {
+ height: 662799,
+ tx_hash:
+ 'b399a5ae69e4ac4c96b27c680a541e6b8142006bdc2484a959821858fc0b4ca3',
+ },
+ {
+ height: 662873,
+ tx_hash:
+ 'f887b8cc01da80969a3f5cfe72c2b3ed3b7352b0153d1df0e8c4208ffafb3dad',
+ },
+ {
+ height: 662875,
+ tx_hash:
+ '8e325d3349f213e47dc0ffe9a855676dc029d9ef4643f5b292d24915bea78a35',
+ },
+ {
+ height: 662886,
+ tx_hash:
+ 'c6b0ce4a38e52236013a2024350de4cccb675558437402ab2919e1e61964dbcd',
+ },
+ {
+ height: 662929,
+ tx_hash:
+ '84b7670b677a0d4687ad5660624302b9092eb5320606c903741aacb56aeab012',
+ },
+ {
+ height: 662935,
+ tx_hash:
+ 'b32b1cbd27d9a597ba651a8d36990da188c0466ed58678b420877e1fb3d5b2b1',
+ },
+ {
+ height: 662990,
+ tx_hash:
+ 'bfd855323c7b96d12c89e01e921f0a17c31222470960fe729aff172cd7f8928b',
+ },
+ {
+ height: 663002,
+ tx_hash:
+ '112a272092a7a06cb9c921c65315bca81f0485764a65ffceb788ed49b3ea0a66',
+ },
+ {
+ height: 663002,
+ tx_hash:
+ '9ed13602946d0197a5fec0caf1d43a9acedbf7c37d676560e2045c271e1717bb',
+ },
+ {
+ height: 663003,
+ tx_hash:
+ 'c3b089dbe19cadcaf6344f6214fb782b2d3836060ae3ae9a8c3e595fc46beadc',
+ },
+ {
+ height: 663009,
+ tx_hash:
+ '02d01be28eeec1a9a604e83915e63bb3b13d08a4deb7a54a660aeab4034ac58c',
+ },
+ {
+ height: 663067,
+ tx_hash:
+ '8c02c524bcbc5f0e11cd509d32713a874d0b9504f9ac243adbe2e1baf10840d6',
+ },
+ {
+ height: 663067,
+ tx_hash:
+ 'ea3cf7db958672d580a1090c41dc79f54ecdde34a235944eb5d5477d9e7bff64',
+ },
+ {
+ height: 663069,
+ tx_hash:
+ '0b393cecd42154a35a67dcc376d787edfa95664ebc37349df2cae6f70e3c250a',
+ },
+ {
+ height: 663070,
+ tx_hash:
+ 'eddb300b525cb0f6a2a60d592be1cef6b8960dd0881f655664c7d57712d6283d',
+ },
+ {
+ height: 664178,
+ tx_hash:
+ 'c887e59adb1954a97d7eaf6257c86e121c93d2ad890bd9b66e5cd07d5e039187',
+ },
+ {
+ height: 664179,
+ tx_hash:
+ 'b4407c9ce3134a14224d2190db0b92651566e28c273058d868c3ee609002d025',
+ },
+ {
+ height: 664778,
+ tx_hash:
+ 'caa4f6b97689b5aad338390fc0ed28e843099d69f60de5ba9e5fcaa85efd9828',
+ },
+ {
+ height: 665029,
+ tx_hash:
+ 'd6dfd3690e869f2207540ca7391d8fd7ffc84402d16653724a09b5d915595b5c',
+ },
+ {
+ height: 665029,
+ tx_hash:
+ 'e7d0d9cb6d64988f3f89ca2ed2a2260c0077c01fda10480ce45976ece2596d7b',
+ },
+ {
+ height: 665029,
+ tx_hash:
+ 'ecc76da4408cc5e371ef42520d4b2b02e89a503912d97d1bdf7acb49e28fdf09',
+ },
+ {
+ height: 665658,
+ tx_hash:
+ '6013fa226a57a79d257ce8ea330005255b76b486686941c94acaba34c6aef9ca',
+ },
+ {
+ height: 665658,
+ tx_hash:
+ '8ed5da542eaa80a2d83ad24e0edd39c17e52693025d81d47a2a72af2b7219df4',
+ },
+ {
+ height: 665803,
+ tx_hash:
+ 'bbb477886dc7686abf87a8ce41df344810046eeada6e1049f2dc9162f42eb885',
+ },
+ {
+ height: 666402,
+ tx_hash:
+ '4368222efc561352db4fcb57997bba298598198b26002e9f749ac5b735bd548b',
+ },
+ {
+ height: 666951,
+ tx_hash:
+ 'e5a3f4357f703e0874779fb66e7555f7ac7f8e86fa3fa005e4bfcfc1115a5afe',
+ },
+ {
+ height: 666952,
+ tx_hash:
+ '026c66da4eabcaf7a55f578d82c317499497f97324009008e8963b4799497286',
+ },
+ {
+ height: 666969,
+ tx_hash:
+ '40ef3e1ff72074320154571dc27deba597d6d01503a2c5d1c482b397a2f1ae3a',
+ },
+ {
+ height: 666969,
+ tx_hash:
+ '5b3f5d76cf67533773098222b1aff0848c7754415ca201849a325580c46ca8f9',
+ },
+ {
+ height: 667560,
+ tx_hash:
+ '3f1df93bd533cf497ece529b96a1d0b32224e59e750e2fc20fd658ddf73b7149',
+ },
+ {
+ height: 667560,
+ tx_hash:
+ 'b299f1352255bbd95eba1399f01fa4871b275097d40ef9d3034aaccd2562c261',
+ },
+ {
+ height: 667749,
+ tx_hash:
+ '2c733160bf0c936a2b4282d61233b002906aac3a0ab17d4badade7121fafc4e7',
+ },
+ {
+ height: 667749,
+ tx_hash:
+ '3642216be898b672253033a1466c3a5f776a4f7842c21180dd7e56a143bd0b2d',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ '1ce0a38e2a5a4afd594a7f901391f02c511ca6007fd6603a19f312493f8fc773',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ '34bb0ac4ab4bdb2b4f08b23f4f6845a991c4482fe3b3c39c0c3a6e01288c1749',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ '66d5c82dfc10e323b4eaf6dbe2d81787100ea94a15b78f42a170ed34990e135e',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ '8830a4443843223d8fd88e3369e90a02dfd89e44186f80057d48afb4ff665eb6',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'a0058a66a161c4b72bd39da75baaf58f59dda6208cfa425428b7934b12ba4bca',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'b9b63b24eecf619fbe8a153381a76aa5e1f1ebe403522f0b85cf6d7408257afd',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'beac172f5478506f4fabd936ea853ed23d776abd4daf965fdd6bd0a3a50aecc4',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'e9a94cc174839e3659d2fe4d33490528d18ad91404b65eb8cc35d8fa2d3f5096',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'eb1b66b2edcc6cf5619f75bf66aef23bc62eead0f267ad9db36bc8dcd1c52e67',
+ },
+ {
+ height: 667750,
+ tx_hash:
+ 'f14d4b0916d22d6823deef0c140dab829ae0f6fd87bc5bb619cf396aaf87d256',
+ },
+ {
+ height: 667753,
+ tx_hash:
+ '422e28c0a2ebd4cc27e49989bd29ede97aeb7319417b3361ecb426ea76724aa6',
+ },
+ {
+ height: 667753,
+ tx_hash:
+ '4e7512fb549ff025cbaa5ba3e75e0e1a7d80bc9efd44bbc0df40d036bd39967b',
+ },
+ {
+ height: 667753,
+ tx_hash:
+ '8c130d3efa48a94ef4c02f5ad2d78e7c39a0322eed46bd1c36d4c65ef237a898',
+ },
+ {
+ height: 668550,
+ tx_hash:
+ 'c7c0ab5e761ae3ced92321ba3187db7381e25ef86e011ad9b3008207a5dedd76',
+ },
+ {
+ height: 668994,
+ tx_hash:
+ '6fe8cfcd586f1b446d76a9776fe4c57106364a20b984641f55be1e50aaa93b09',
+ },
+ {
+ height: 669497,
+ tx_hash:
+ '7dab81ab12de78c46646b449fba50d78d48d91000a2d3236d26fe5ea1ad57bca',
+ },
+ {
+ height: 669509,
+ tx_hash:
+ '6a87931d1aed13db4df3115f581fbb1e203fb6ef1c15fb74b7eea659cba1858d',
+ },
+ {
+ height: 669544,
+ tx_hash:
+ 'f253ec62202abedff48ad3bda4a1cd9f41dc1069ed3163442aea7810288fe45f',
+ },
+ {
+ height: 673879,
+ tx_hash:
+ '7f70e607c6ce6196275fefa2c39a25bee979258f31f9c3c7095350725fe04b3e',
+ },
+ {
+ height: 674455,
+ tx_hash:
+ '5f914f7b1d41d773fcf7bd8d035e1443df1a6f01ddc1038478a30fe60d5c9232',
+ },
+ ],
+ address: 'bitcoincash:qrcl220pxeec78vnchwyh6fsdyf60uv9tcynw3u2ev',
+ },
+ {
+ transactions: [
+ {
+ height: 666951,
+ tx_hash:
+ '12a9df22943e399248d2d4dcfcebcfe0de0126183068c5b98e788adffd8332c8',
+ },
+ {
+ height: 666952,
+ tx_hash:
+ '026c66da4eabcaf7a55f578d82c317499497f97324009008e8963b4799497286',
+ },
+ {
+ height: 666952,
+ tx_hash:
+ 'bd465ee1c47e697c2d952f58e03d9cade28492e7bc33490cb962a3c3fe31e77b',
+ },
+ {
+ height: 666953,
+ tx_hash:
+ '90bf09271a83f27815c36bdc5eec25fba52b21241854f3f483213197b5bca827',
+ },
+ {
+ height: 666954,
+ tx_hash:
+ '1b19314963be975c57eb37df12b6a8e0598bcb743226cdc684895520f51c4dfe',
+ },
+ {
+ height: 666968,
+ tx_hash:
+ '3174c1ed5b7f1e5049347f6af4bd6744d24aba9c944e610b8cb56e407d63d948',
+ },
+ {
+ height: 666968,
+ tx_hash:
+ '3af8c1a06b092c08c3dbcb880a0899daad4689f71315f36b7f0bf6f3f3e8a6e3',
+ },
+ {
+ height: 666969,
+ tx_hash:
+ '40ef3e1ff72074320154571dc27deba597d6d01503a2c5d1c482b397a2f1ae3a',
+ },
+ {
+ height: 666969,
+ tx_hash:
+ '5b3f5d76cf67533773098222b1aff0848c7754415ca201849a325580c46ca8f9',
+ },
+ {
+ height: 666969,
+ tx_hash:
+ '6cf915981cfbbe14f12143bd5879c2da359372d275f3609257d5809a863e1491',
+ },
+ {
+ height: 666969,
+ tx_hash:
+ '99583b593a3bec993328b076f4988fd77b8423d788183bf2968ed43cec11c454',
+ },
+ {
+ height: 667560,
+ tx_hash:
+ '34002080b2e1b42ff9f33d36dbbd0d8f1aaddc5a00b916054a40c45feebaf548',
+ },
+ {
+ height: 667560,
+ tx_hash:
+ '8edccfafe4b002da8f1aa71daae31846c51848968e7d92dcba5f0ff97beb734d',
+ },
+ {
+ height: 667560,
+ tx_hash:
+ 'b299f1352255bbd95eba1399f01fa4871b275097d40ef9d3034aaccd2562c261',
+ },
+ {
+ height: 667560,
+ tx_hash:
+ 'c14eb8d5d4465903b9395738b6389dc43b21ecf864036c00bc36f5fbd7b744ff',
+ },
+ {
+ height: 667560,
+ tx_hash:
+ 'd5af6a9836df9b32ab1c5364dde830a38c5616ff3904cbe59a0a24f46aca5213',
+ },
+ {
+ height: 667560,
+ tx_hash:
+ 'e6f556f5ff55aacebc7da7475cb4e48759a56f137c2659dcd86524b6ec2a0fc6',
+ },
+ {
+ height: 667793,
+ tx_hash:
+ '989007fd6024c7f7300b64fd86725c3e0300ea1452f38fd76cbe746a5f4dfc0d',
+ },
+ {
+ height: 667793,
+ tx_hash:
+ '9c295332b7bc16758b2e328f21189fa0ea79f71908b47529749b3ba54e523817',
+ },
+ {
+ height: 667908,
+ tx_hash:
+ 'd236bbaa916f5820549271a6324b2a5094f397367dc5102c430564ec64516c68',
+ },
+ {
+ height: 667909,
+ tx_hash:
+ '5bb8f9831d616b3a859ffec4507f66bd5f2f3c057d7f5d5fa5c026216d6c2646',
+ },
+ {
+ height: 667909,
+ tx_hash:
+ 'd3183b663a8d67b2b558654896b95102bbe68d164de219da96273ae52de93813',
+ },
+ {
+ height: 668550,
+ tx_hash:
+ '38a692e3fa974ee186eedc3a03bf3410dd03a5f35bc44f1a07f287b669dce44b',
+ },
+ {
+ height: 668550,
+ tx_hash:
+ 'c7c0ab5e761ae3ced92321ba3187db7381e25ef86e011ad9b3008207a5dedd76',
+ },
+ {
+ height: 668779,
+ tx_hash:
+ '24604835e5c68aedad2dbf4200ecc1af8c3fa92738445323af86def84d48d572',
+ },
+ {
+ height: 668779,
+ tx_hash:
+ '8ce5a01e99b3424b47a44772f502a29227359912ad0bdfbdeaf73016be022260',
+ },
+ {
+ height: 668989,
+ tx_hash:
+ '0f4f3b9facf595e59f8532dc2dfe00cbbfd9e72b4f89f7f74b3afa8f6c617e7c',
+ },
+ {
+ height: 668994,
+ tx_hash:
+ '6fe8cfcd586f1b446d76a9776fe4c57106364a20b984641f55be1e50aaa93b09',
+ },
+ {
+ height: 669057,
+ tx_hash:
+ 'c1c8b61de489af0efbf5d159f1b21718e49642ac204dac3dbc1b1e061a1ceeef',
+ },
+ {
+ height: 669057,
+ tx_hash:
+ 'dd560d87bd632e40c6548021006653a150197ede13fadb5eadfa29abe4400d0e',
+ },
+ {
+ height: 669497,
+ tx_hash:
+ '7dab81ab12de78c46646b449fba50d78d48d91000a2d3236d26fe5ea1ad57bca',
+ },
+ {
+ height: 669509,
+ tx_hash:
+ '6a87931d1aed13db4df3115f581fbb1e203fb6ef1c15fb74b7eea659cba1858d',
+ },
+ {
+ height: 669510,
+ tx_hash:
+ 'acbb66f826211f40b89e84d9bd2143dfb541d67e1e3c664b17ccd3ba66327a9e',
+ },
+ {
+ height: 669544,
+ tx_hash:
+ 'd2a9ce4e5cb9b3987009975f0159734cf1e3d0c2b6403b1d1e74ea19dbd3a3ea',
+ },
+ {
+ height: 669544,
+ tx_hash:
+ 'dd684fc2396a90dd45c1db807a3c2fbb930f200b9a31bdbf02b05dc42bb2503c',
+ },
+ {
+ height: 669544,
+ tx_hash:
+ 'def198f86a82cc82abca4062b5d48183fd26494527fb404021a162125f4cdf8e',
+ },
+ {
+ height: 669544,
+ tx_hash:
+ 'f253ec62202abedff48ad3bda4a1cd9f41dc1069ed3163442aea7810288fe45f',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ '0da6d49cf95d4603958e53360ad1e90bfccef41bfb327d6b2e8a77e242fa2d58',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ '194b2db6b8e27da12e4f4becf4af4316f6638c6969825f0b570628ec5ad5e288',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ '39521b38cd1b6126a57a68b8adfd836020cd53b195f3b4675c58095c5c300ef8',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ '93949923f02cb5271bd6d0b5a5b937ce5ae22df5bf6117161078f175f0c29d56',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ '9978ffd1736ed998bb4eed28cae59078f6b50600bb87233d7e88295e06e98842',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ 'ddace66ea968e16e55ebf218814401acc38e0a39150529fa3d1108af04e81373',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ 'e79608b72c3b1082a26340e82131fd380c24503940430503b1f6c8c17451986c',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ 'f1147285ac384159b5dfae513bda47a0459f876d046b48f13c8a7ec4f0d20d96',
+ },
+ {
+ height: 669639,
+ tx_hash:
+ 'f4ca891d090f2682c7086b27a4d3bc2ed1543fb96123b6649e8f26b644a45b51',
+ },
+ {
+ height: 669643,
+ tx_hash:
+ '654d2711547e599c7d068e7b0bbf42e73d817cf8256885949ed6ad0ba85cafe2',
+ },
+ {
+ height: 669643,
+ tx_hash:
+ '711bac9ffcec3993b2361c3d14ab642e3e1c3860b7849a2ab8cf97cc9623db6c',
+ },
+ {
+ height: 669643,
+ tx_hash:
+ '9a05315430afe471d5dbf9d7f7ba40150d962a479bdb17b7c1cca2641fffb679',
+ },
+ {
+ height: 669673,
+ tx_hash:
+ '1ea003a330e9387b669d21bde518805ac1e74e5909ae27a05d90b792f67dbc50',
+ },
+ {
+ height: 669673,
+ tx_hash:
+ 'bd8b527df1d5d3bd611a8f0ee8f14af83cb7d107fb2e140dbd2d9f4b3a86786a',
+ },
+ {
+ height: 669673,
+ tx_hash:
+ 'd2ad75a6974e4dc021483f381f314d260e958cbcc444230b485436b6264eaf3d',
+ },
+ {
+ height: 669756,
+ tx_hash:
+ '2947492b902f6fced1cc399f032dd3f7305736d685b41a7c712cf0e9363817f8',
+ },
+ {
+ height: 669756,
+ tx_hash:
+ '7ced28d072aa6c246f4ce1efb1653a4f1f7c6f3d79c2471d08b5699ba52a41e3',
+ },
+ {
+ height: 669756,
+ tx_hash:
+ '9300aeea6abd0bc4942ed0873d835f26d2d62ee0c283157d4e84a762b74acd0c',
+ },
+ {
+ height: 669756,
+ tx_hash:
+ 'a3a82f06925809c784071e60fd2bd2a5a33ff33bc618d09c208b84f73291b4d8',
+ },
+ {
+ height: 669756,
+ tx_hash:
+ 'a8085391b122bd5d2531bff991752d9eee1fc0efd990e35693cd05570c7c33a2',
+ },
+ {
+ height: 669783,
+ tx_hash:
+ '45aa0b721f941e7770c8962483cc2d84fb953425a32058a25ffd56ee03f579f7',
+ },
+ {
+ height: 669783,
+ tx_hash:
+ '5e9823e711b9dc8abd99ba5addbcafd942248b089f3fbf1949fce798a7d744af',
+ },
+ {
+ height: 669942,
+ tx_hash:
+ 'ff5fe4c631a5dd3e3b1cc74cb12b9eebf04d177c206eaadb8d949cc4fbb6a092',
+ },
+ {
+ height: 669958,
+ tx_hash:
+ '0da32e1f64a12ed2a4afd406368cc76ab3f8c462b26fbdd9817675ffa0fa7668',
+ },
+ {
+ height: 669959,
+ tx_hash:
+ '107ec7417a3fc10e8c27c4bf2d94dd910db875003063c0bdde8ea8975876369a',
+ },
+ {
+ height: 669959,
+ tx_hash:
+ '182f50952631c4bcdd46f4d42ac68376674727fa40dbcbf1101e40fbfd58b55a',
+ },
+ {
+ height: 669968,
+ tx_hash:
+ '1a021709e8ad8d9c38c9c4a0ee4d5f2e0b468fda601a1f0539322555ac0a6f50',
+ },
+ {
+ height: 669980,
+ tx_hash:
+ 'd77d65ec19778391a15acc353c4dea6a2bbd0dae04015655b4ba739277b85308',
+ },
+ {
+ height: 669989,
+ tx_hash:
+ '7a98268b2deecb798f4d1ce7ff9d44938e04b0b6442bca717b19a2d9068e4642',
+ },
+ {
+ height: 669989,
+ tx_hash:
+ '8b23e98a6463783c3ca4dbf40d055ee513ba0dc9260f1f373ad1cdee527bb434',
+ },
+ {
+ height: 670076,
+ tx_hash:
+ '4064e02fe523cb107fecaf3f5abaabb89f7e2bb6662751ba4f86f8d18ebeb1fa',
+ },
+ {
+ height: 670076,
+ tx_hash:
+ 'a94defde870444eb73f4cbcd02406a0086d401fe3acf646040e49ca258350459',
+ },
+ {
+ height: 670076,
+ tx_hash:
+ 'd467fa80ff8357cdb8ac18e012171d52eda75841bd7f22677187c267cd548974',
+ },
+ {
+ height: 670179,
+ tx_hash:
+ '2b1beaa4f771d7b6cb7d58d9322021b35c013b7a10e6e0ebb21600a1d95c9bc9',
+ },
+ {
+ height: 670179,
+ tx_hash:
+ '7234628650ae40bceb3e44965e7dc316c00de4c0d8cd37198524922f962ba2a1',
+ },
+ {
+ height: 670179,
+ tx_hash:
+ 'c2db84d3d6a899b58b12c189ebaef1af9653bf88c34cec1773f841774797a455',
+ },
+ {
+ height: 670180,
+ tx_hash:
+ '10c30adbea1ac17b593f9d1df95819ba9853ca401687a316ea186cce5fdd5bdc',
+ },
+ {
+ height: 670183,
+ tx_hash:
+ '2624b7518dfe6d1ab982b97b878620fc9d4ed0451a3948b706009aef6e0ead12',
+ },
+ {
+ height: 670482,
+ tx_hash:
+ 'b78a3f8d17fc69cd1314517c36abad85f09fbca4d43ac108bced2ac78428f2c8',
+ },
+ {
+ height: 670670,
+ tx_hash:
+ '55eec1cb63d2b3aa604ba2f505735de07cb224fcdbd8e554aa1180f59cdd0541',
+ },
+ {
+ height: 670670,
+ tx_hash:
+ '704b444df073d352aaae76ef442ef64dcf6fc3c80aafaab86f44564099c82743',
+ },
+ {
+ height: 670670,
+ tx_hash:
+ 'f4b40b09ec39867e5d904149845d01445a45bc4a85458bfa439bf5b44daf3c19',
+ },
+ {
+ height: 670806,
+ tx_hash:
+ '6fb6b822218a5ad767c0c0febc9a67f67c7543b204d54c9366af019606140f4e',
+ },
+ {
+ height: 670894,
+ tx_hash:
+ 'c3e937bc03c5dff336b102bc4ad9a6d1783f7b5e8784ab5367df4a9774f1e010',
+ },
+ {
+ height: 670896,
+ tx_hash:
+ 'e60cc8a04123f4dacabf37a819949ed6276e27d715563b8d6c272648fa376455',
+ },
+ {
+ height: 670909,
+ tx_hash:
+ '2a3614b8f7aef9e433233a3c1bb0e039bcd4de06b69d5fa7a2274bd87fe3ae31',
+ },
+ {
+ height: 670909,
+ tx_hash:
+ '45da9697f020907c368cfb32348908c568e8028a952910ad0ab9ebdceb0e3109',
+ },
+ {
+ height: 671190,
+ tx_hash:
+ '580019a3e626e126528d0645521246daf53c2ee5823623adcaa0599644311be5',
+ },
+ {
+ height: 671190,
+ tx_hash:
+ '741e8891b487e8f2c2b52c3d89206c6542a5e8b0df672b71e740567f719c1dbd',
+ },
+ {
+ height: 671489,
+ tx_hash:
+ '3f6764271830a3986854e5ff1f0e48a504e619a2208654a8061429e2faa26fdb',
+ },
+ {
+ height: 671613,
+ tx_hash:
+ '180e6fed32f8297f01be575dc6e225b6879065a5514301085ba8efabb9aa973a',
+ },
+ {
+ height: 671613,
+ tx_hash:
+ 'f438e4875934f88bb10b0e20ac8c5f14c49e2b74ff760bac8f0399001174b083',
+ },
+ {
+ height: 671730,
+ tx_hash:
+ 'bda94519967b2101b94459fceed97733a06747b564f6476e8dcca2e42af56525',
+ },
+ {
+ height: 671782,
+ tx_hash:
+ '9bb2033e12e00ced9d230504918041e916020f17ba21aa76c6b89bdc83949c85',
+ },
+ {
+ height: 671855,
+ tx_hash:
+ 'b544244fb46ee4a3bbc8d1b31683a7408fdae4adf74da6e874aa11baf2483abd',
+ },
+ {
+ height: 671862,
+ tx_hash:
+ '14dd299de5ea19adf3de18f43ea6066774800aa647faf3c33c82ca3615cbc521',
+ },
+ {
+ height: 671864,
+ tx_hash:
+ 'b1a9203989e69105f655cbb8abbc1d02a15ce9bb6c7ea94f8533b7d862db4951',
+ },
+ {
+ height: 671865,
+ tx_hash:
+ '6fe56995948070551cbcc9a553032dbfcd898dad6d1c745b78e6bdcde397d42e',
+ },
+ {
+ height: 671866,
+ tx_hash:
+ '51801bc6b5b73b5248b2ebdda93931e66097782ede9ed39f6ac3ead9372f2be9',
+ },
+ {
+ height: 671867,
+ tx_hash:
+ 'd3ef2a50a64602b8d7f8461d077f1c2b7f81689e01a0e730718c328d3020dbf9',
+ },
+ {
+ height: 671880,
+ tx_hash:
+ '5e0436c6741e226d05c5b7e7e23de8213d3583e2669e50a80b908bf4cb471317',
+ },
+ {
+ height: 671882,
+ tx_hash:
+ '3507d73b0bb82421d64ae79f469943e56f15d7db954ad235f48ede33c718d860',
+ },
+ {
+ height: 671882,
+ tx_hash:
+ '8f73a718d907d94e60c5f73f299bd01dc5b1c163c4ebc26b5304e37a1a7f34af',
+ },
+ {
+ height: 671882,
+ tx_hash:
+ 'd38b76bacd6aa75ad2d6fcfd994533e54d0541435970eace49486fde9d6ee2e3',
+ },
+ {
+ height: 671882,
+ tx_hash:
+ 'd47607a72d6bc093556fa7f2cec9d67719bd627751d5d27bc53c4eb8eb6f54e5',
+ },
+ {
+ height: 671898,
+ tx_hash:
+ '33f246811f794c4b64098a64c698ae5811054b13e289256a18e2d142beef57e7',
+ },
+ {
+ height: 672020,
+ tx_hash:
+ '25f915d2912524ad602c882211ccaf479d6bf87ef7c24d1be0f325cec3727257',
+ },
+ {
+ height: 672020,
+ tx_hash:
+ 'c9044b4d7438d006a722ef85474c8127265eced4f72c7d71c2f714444bc0e1f2',
+ },
+ {
+ height: 672029,
+ tx_hash:
+ '045306f0019ae0d977de7ff17dd55e861b3fe94458693ee2b94ce5dd7003aab9',
+ },
+ {
+ height: 672029,
+ tx_hash:
+ '1452267e57429edcfdcb1184b24becea6ddf8f8a4f8e130dad6248545d9f8e75',
+ },
+ {
+ height: 672029,
+ tx_hash:
+ '8d93eff6a9a1614fb880e6312555773a62bb54c28bde0d5472718ef562508652',
+ },
+ {
+ height: 672029,
+ tx_hash:
+ '933e204af8c0a73afd32634830e920f9f31d7e251502cb04386ec106d5dbeb4c',
+ },
+ {
+ height: 672029,
+ tx_hash:
+ '9ad75af97f0617a3729c2bd31bf7c4b380230e661cc921a3c6be0febc75a3e49',
+ },
+ {
+ height: 672029,
+ tx_hash:
+ 'b4b91d9a6e7aff77423ec9ebccd039db8f88dcb7eb624f9758dfca5bbdb6a1df',
+ },
+ {
+ height: 672029,
+ tx_hash:
+ 'f63e890423b3bffa6e01be2dcb4942940c2e8a1985926411558a22d1b5dd0e29',
+ },
+ {
+ height: 672077,
+ tx_hash:
+ '42d39fbe068a40fe691f987b22fdf04b80f94d71d2fec20a58125e7b1a06d2a9',
+ },
+ {
+ height: 672077,
+ tx_hash:
+ 'b96da810b15deb312ad4508a165033ca8ffa282f88e5b7b0e79be09a0b0424f9',
+ },
+ {
+ height: 672077,
+ tx_hash:
+ 'db464f77ac97deabc28df07a7e4a2e261c854a8ec4dc959b89b10531966f6cbf',
+ },
+ {
+ height: 672077,
+ tx_hash:
+ 'e32c20137e590f253b8d198608f7fffd428fc0bd7a9a0675bb6af091d1cb2ea4',
+ },
+ {
+ height: 672077,
+ tx_hash:
+ 'ec9c20c2c5cd5aa4c9261a9f97e68734b175962c4b3d9edc996dd415dd03c2e7',
+ },
+ {
+ height: 672592,
+ tx_hash:
+ '3c2d33496d18ce717ee9e0198faf400e0519371697e8cd9e9c8c120fcc0afede',
+ },
+ {
+ height: 672701,
+ tx_hash:
+ 'f90631b48521a4147dd9dd7091ce936eddc0c3e6221ec87fa4fabacc453a0b95',
+ },
+ {
+ height: 672753,
+ tx_hash:
+ '19ea4667a333ad2e62080b3492e31ef21eb89e2cd6d7ec41ac756f1ee74171e6',
+ },
+ {
+ height: 674455,
+ tx_hash:
+ '5f914f7b1d41d773fcf7bd8d035e1443df1a6f01ddc1038478a30fe60d5c9232',
+ },
+ {
+ height: 674993,
+ tx_hash:
+ '089f2188d5771a7de0589def2b8d6c1a1f33f45b6de26d9a0ef32782f019ecf1',
+ },
+ {
+ height: 677752,
+ tx_hash:
+ '8d47af8e46afc3cd908ddedf7f330ee849004d2464d65bd3b225518e924c9477',
+ },
+ {
+ height: 677989,
+ tx_hash:
+ '72acfdb2cd6ab8cb44f07a6fd78ae4aa31c304ea3ff0206b50bef60ff953d94d',
+ },
+ {
+ height: 677989,
+ tx_hash:
+ '9520af2513b54b1c47a8a520251d26f057ccbe986cb569682aa963bab626ba52',
+ },
+ {
+ height: 677989,
+ tx_hash:
+ 'b854a48079e42612bed3b68cf62a90a021f20ae28e694dbe5dbfeb29ee8fea98',
+ },
+ {
+ height: 677989,
+ tx_hash:
+ 'dee2ec72b0a22ceb99e67731de086a2545aaa9dc3fb4a8bdf9dddbae215d8f6c',
+ },
+ {
+ height: 678000,
+ tx_hash:
+ '9897f172154bb8f27bbf4e0385926a535267f044cd11232a7efca91bece7dba6',
+ },
+ {
+ height: 678616,
+ tx_hash:
+ '7abd604770d183ad33d3431c93b29b324b82cd11a6cf0671b4edb7d44d9b2a40',
+ },
+ {
+ height: 678992,
+ tx_hash:
+ '5072cf021e0301284cf1cc1eb67dcb73fe8eb1f2a4fc3f8f3944d232e3946551',
+ },
+ {
+ height: 678992,
+ tx_hash:
+ '82845d3c814d715b2c36aea0b076cc03815469a9c172c5bab7fc6a9f71b1906d',
+ },
+ ],
+ address: 'bitcoincash:qphpmfj0qn7znklqhrfn5dq7qh36l3vxavu346vqcl',
+ },
+];
diff --git a/web/cashtab-v2/src/hooks/__mocks__/sendBCH.js b/web/cashtab-v2/src/hooks/__mocks__/sendBCH.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/__mocks__/sendBCH.js
@@ -0,0 +1,38 @@
+import { fromSmallestDenomination } from '@utils/cashMethods';
+import { currency } from '@components/Common/Ticker';
+
+export default {
+ utxos: [
+ {
+ height: 0,
+ tx_hash:
+ '6e83b4bf54b5a85b6c40c4e2076a6e3945b86e4d219a931d0eb93ba1a1e3bd6f',
+ tx_pos: 1,
+ value: 131689,
+ address: 'bitcoincash:qrzuvj0vvnsz5949h4axercl5k420eygavv0awgz05',
+ satoshis: 131689,
+ txid: '6e83b4bf54b5a85b6c40c4e2076a6e3945b86e4d219a931d0eb93ba1a1e3bd6f',
+ vout: 1,
+ isValid: false,
+ wif: 'L3ufcMjHZ2u8v2NeyHB2pCSE5ezCk8dvR7kcLLX2B3xK5VgK9wz4',
+ },
+ ],
+ wallet: {
+ Path145: {
+ cashAddress:
+ 'bitcoincash:qrzuvj0vvnsz5949h4axercl5k420eygavv0awgz05',
+ },
+ Path1899: {
+ cashAddress:
+ 'bitcoincash:qrzuvj0vvnsz5949h4axercl5k420eygavv0awgz05',
+ },
+ },
+ destinationAddress:
+ 'bitcoincash:qr2npxqwznhp7gphatcqzexeclx0hhwdxg386ez36n',
+ sendAmount: fromSmallestDenomination(currency.dustSats).toString(),
+ expectedTxId:
+ '7a39961bbd7e27d804fb3169ef38a83234710fbc53897a4eb0c98454854a26d1',
+ expectedHex: [
+ '02000000016fbde3a1a13bb90e1d939a214d6eb845396e6a07e2c4406c5ba8b554bfb4836e010000006a473044022014213502b672599a965f03a91c4aecb789ed15e758ba6594426572ed2ff20ef202201137053f16b9f1b796076ebe6e4755304f3be5df96bb181aaf9f70ad229291bb4121032d9ea429b4782e9a2c18a383362c23a44efa2f6d6641d63f53788b4bf45c1decffffffff0226020000000000001976a914d530980e14ee1f2037eaf00164d9c7ccfbddcd3288ac7cfe0100000000001976a914c5c649ec64e02a16a5bd7a6c8f1fa5aaa7e488eb88ac00000000',
+ ],
+};
diff --git a/web/cashtab-v2/src/hooks/__tests__/migrations.test.js b/web/cashtab-v2/src/hooks/__tests__/migrations.test.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/__tests__/migrations.test.js
@@ -0,0 +1,138 @@
+import { currency } from '../../components/Common/Ticker';
+import BigNumber from 'bignumber.js';
+import BCHJS from '@psf/bch-js';
+import {
+ fromSmallestDenomination,
+ toSmallestDenomination,
+} from '@utils/cashMethods';
+
+describe('Testing functions for upgrading Cashtab', () => {
+ it('Replacement currency.dustSats parameter parsing matches legacy DUST parameter', () => {
+ expect(
+ parseFloat(
+ new BigNumber(
+ fromSmallestDenomination(currency.dustSats, 8).toString(),
+ ).toFixed(8),
+ ),
+ ).toBe(0.0000055);
+ });
+ it('Replicate 8-decimal return value from instance of toSatoshi in TransactionBuilder with toSmallestDenomination', () => {
+ const BCH = new BCHJS();
+ const testSendAmount = '0.12345678';
+ expect(
+ parseInt(toSmallestDenomination(new BigNumber(testSendAmount), 8)),
+ ).toBe(BCH.BitcoinCash.toSatoshi(Number(testSendAmount).toFixed(8)));
+ });
+ it('Replicate 2-decimal return value from instance of toSatoshi in TransactionBuilder with toSmallestDenomination', () => {
+ const BCH = new BCHJS();
+ const testSendAmount = '0.12';
+ expect(
+ parseInt(toSmallestDenomination(new BigNumber(testSendAmount), 8)),
+ ).toBe(BCH.BitcoinCash.toSatoshi(Number(testSendAmount).toFixed(8)));
+ });
+ it('Replicate 8-decimal return value from instance of toSatoshi in remainder comparison with toSmallestDenomination', () => {
+ const BCH = new BCHJS();
+ expect(
+ parseFloat(toSmallestDenomination(new BigNumber('0.00000546'), 8)),
+ ).toBe(
+ BCH.BitcoinCash.toSatoshi(
+ parseFloat(new BigNumber('0.00000546').toFixed(8)),
+ ),
+ );
+ });
+ it('toSmallestDenomination() returns false if input is not a BigNumber', () => {
+ const testInput = 132.12345678;
+ expect(toSmallestDenomination(testInput)).toBe(false);
+ });
+ it(`toSmallestDenomination() returns false if input is a BigNumber with more decimals than specified by cashDecimals parameter`, () => {
+ const testInput = new BigNumber('132.123456789');
+ expect(toSmallestDenomination(testInput, 8)).toBe(false);
+ });
+ it(`toSmallestDenomination() returns expected value if input is a BigNumber with 8 decimal places`, () => {
+ const testInput = new BigNumber('100.12345678');
+ expect(toSmallestDenomination(testInput, 8)).toStrictEqual(
+ new BigNumber('10012345678'),
+ );
+ });
+ it(`toSmallestDenomination() returns expected value if input is a BigNumber with 2 decimal places`, () => {
+ const testInput = new BigNumber('100.12');
+ expect(toSmallestDenomination(testInput, 2)).toStrictEqual(
+ new BigNumber('10012'),
+ );
+ });
+ it(`toSmallestDenomination() returns expected value if input is a BigNumber with 1 decimal place`, () => {
+ const testInput = new BigNumber('100.1');
+ expect(toSmallestDenomination(testInput, 8)).toStrictEqual(
+ new BigNumber('10010000000'),
+ );
+ });
+ it('toSmallestDenomination() returns exact result as toSatoshi but in BigNumber format', () => {
+ const BCH = new BCHJS();
+ const testAmount = new BigNumber('0.12345678');
+
+ // Match legacy implementation, inputting a BigNumber converted to a string by .toFixed(8)
+ const testAmountInSatoshis = BCH.BitcoinCash.toSatoshi(
+ testAmount.toFixed(8),
+ );
+
+ const testAmountInCashDecimals = toSmallestDenomination(testAmount, 8);
+
+ expect(testAmountInSatoshis).toStrictEqual(12345678);
+ expect(testAmountInCashDecimals).toStrictEqual(
+ new BigNumber(testAmountInSatoshis),
+ );
+ });
+ it(`BigNumber version of remainder variable is equivalent to Math.floor version`, () => {
+ // Test case for sending 0.12345678 BCHA
+ let satoshisToSendTest = toSmallestDenomination(
+ new BigNumber('0.12345678'),
+ 8,
+ );
+ // Assume total BCHA available in utxos is 500 sats higher than 0.123456578 BCHA
+ let originalAmountTest = satoshisToSendTest.plus(500);
+ // Assume 229 byte tx fee
+ let txFeeTest = 229;
+
+ expect(
+ Math.floor(
+ originalAmountTest.minus(satoshisToSendTest).minus(txFeeTest),
+ ),
+ ).toStrictEqual(
+ parseInt(
+ originalAmountTest.minus(satoshisToSendTest).minus(txFeeTest),
+ ),
+ );
+ });
+ it(`Using parseInt on a BigNumber returns output type required for Transaction Builder`, () => {
+ const remainder = new BigNumber('12345678');
+ expect(parseInt(remainder)).toStrictEqual(12345678);
+ });
+ it('Replicates return value from instance of toBitcoinCash with fromSmallestDenomination and cashDecimals = 8', () => {
+ const BCH = new BCHJS();
+ const testSendAmount = '12345678';
+ expect(fromSmallestDenomination(testSendAmount, 8)).toBe(
+ BCH.BitcoinCash.toBitcoinCash(testSendAmount),
+ );
+ });
+ it('Replicates largest possible digits return value from instance of toBitcoinCash with fromSmallestDenomination and cashDecimals = 8', () => {
+ const BCH = new BCHJS();
+ const testSendAmount = '1000000012345678';
+ expect(fromSmallestDenomination(testSendAmount, 8)).toBe(
+ BCH.BitcoinCash.toBitcoinCash(testSendAmount),
+ );
+ });
+
+ it('Replicates smallest unit value return value from instance of toBitcoinCash with fromSmallestDenomination and cashDecimals = 8', () => {
+ const BCH = new BCHJS();
+ const testSendAmount = '1';
+ expect(fromSmallestDenomination(testSendAmount, 8)).toBe(
+ BCH.BitcoinCash.toBitcoinCash(testSendAmount),
+ );
+ });
+
+ it(`Converts dust limit in satoshis to dust limit in current app setting`, () => {
+ expect(fromSmallestDenomination(currency.dustSats, 8).toString()).toBe(
+ '0.0000055',
+ );
+ });
+});
diff --git a/web/cashtab-v2/src/hooks/__tests__/useBCH.test.js b/web/cashtab-v2/src/hooks/__tests__/useBCH.test.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/__tests__/useBCH.test.js
@@ -0,0 +1,656 @@
+/* eslint-disable no-native-reassign */
+import useBCH from '../useBCH';
+import mockReturnGetHydratedUtxoDetails from '../__mocks__/mockReturnGetHydratedUtxoDetails';
+import mockReturnGetSlpBalancesAndUtxos from '../__mocks__/mockReturnGetSlpBalancesAndUtxos';
+import mockReturnGetHydratedUtxoDetailsWithZeroBalance from '../__mocks__/mockReturnGetHydratedUtxoDetailsWithZeroBalance';
+import mockReturnGetSlpBalancesAndUtxosNoZeroBalance from '../__mocks__/mockReturnGetSlpBalancesAndUtxosNoZeroBalance';
+import sendBCHMock from '../__mocks__/sendBCH';
+import createTokenMock from '../__mocks__/createToken';
+import mockTxHistory from '../__mocks__/mockTxHistory';
+import mockFlatTxHistory from '../__mocks__/mockFlatTxHistory';
+import mockTxDataWithPassthrough from '../__mocks__/mockTxDataWithPassthrough';
+import mockPublicKeys from '../__mocks__/mockPublicKeys';
+import {
+ flattenedHydrateUtxosResponse,
+ legacyHydrateUtxosResponse,
+} from '../__mocks__/mockHydrateUtxosBatched';
+import {
+ tokenSendWdt,
+ tokenReceiveGarmonbozia,
+ tokenReceiveTBS,
+ tokenGenesisCashtabMintAlpha,
+} from '../__mocks__/mockParseTokenInfoForTxHistory';
+import {
+ mockSentCashTx,
+ mockReceivedCashTx,
+ mockSentTokenTx,
+ mockReceivedTokenTx,
+ mockSentOpReturnMessageTx,
+ mockReceivedOpReturnMessageTx,
+ mockBurnEtokenTx,
+} from '../__mocks__/mockParsedTxs';
+import BCHJS from '@psf/bch-js'; // TODO: should be removed when external lib not needed anymore
+import { currency } from '../../components/Common/Ticker';
+import BigNumber from 'bignumber.js';
+import { fromSmallestDenomination } from '@utils/cashMethods';
+
+describe('useBCH hook', () => {
+ it('gets Rest Api Url on testnet', () => {
+ process = {
+ env: {
+ REACT_APP_NETWORK: `testnet`,
+ REACT_APP_BCHA_APIS:
+ 'https://rest.kingbch.com/v3/,https://wallet-service-prod.bitframe.org/v3/,notevenaurl,https://rest.kingbch.com/v3/',
+ REACT_APP_BCHA_APIS_TEST:
+ 'https://free-test.fullstack.cash/v3/',
+ },
+ };
+ const { getRestUrl } = useBCH();
+ const expectedApiUrl = `https://free-test.fullstack.cash/v3/`;
+ expect(getRestUrl(0)).toBe(expectedApiUrl);
+ });
+
+ it('gets primary Rest API URL on mainnet', () => {
+ process = {
+ env: {
+ REACT_APP_BCHA_APIS:
+ 'https://rest.kingbch.com/v3/,https://wallet-service-prod.bitframe.org/v3/,notevenaurl,https://rest.kingbch.com/v3/',
+ REACT_APP_NETWORK: 'mainnet',
+ },
+ };
+ const { getRestUrl } = useBCH();
+ const expectedApiUrl = `https://rest.kingbch.com/v3/`;
+ expect(getRestUrl(0)).toBe(expectedApiUrl);
+ });
+
+ it('calculates fee correctly for 2 P2PKH outputs', () => {
+ const { calcFee } = useBCH();
+ const BCH = new BCHJS();
+ const utxosMock = [{}, {}];
+
+ expect(calcFee(BCH, utxosMock, 2, 1.01)).toBe(378);
+ });
+
+ it('gets SLP and BCH balances and utxos from hydrated utxo details', async () => {
+ const { getSlpBalancesAndUtxos } = useBCH();
+ const BCH = new BCHJS();
+ const result = await getSlpBalancesAndUtxos(
+ BCH,
+ mockReturnGetHydratedUtxoDetails,
+ );
+
+ expect(result).toStrictEqual(mockReturnGetSlpBalancesAndUtxos);
+ });
+
+ it(`Ignores SLP utxos with utxo.tokenQty === '0'`, async () => {
+ const { getSlpBalancesAndUtxos } = useBCH();
+ const BCH = new BCHJS();
+
+ const result = await getSlpBalancesAndUtxos(
+ BCH,
+ mockReturnGetHydratedUtxoDetailsWithZeroBalance,
+ );
+
+ expect(result).toStrictEqual(
+ mockReturnGetSlpBalancesAndUtxosNoZeroBalance,
+ );
+ });
+
+ it(`Parses flattened batched hydrateUtxosResponse to yield same result as legacy unbatched hydrateUtxosResponse`, async () => {
+ const { getSlpBalancesAndUtxos } = useBCH();
+ const BCH = new BCHJS();
+
+ const batchedResult = await getSlpBalancesAndUtxos(
+ BCH,
+ flattenedHydrateUtxosResponse,
+ );
+
+ const legacyResult = await getSlpBalancesAndUtxos(
+ BCH,
+ legacyHydrateUtxosResponse,
+ );
+
+ expect(batchedResult).toStrictEqual(legacyResult);
+ });
+
+ it('sends XEC correctly', async () => {
+ const { sendXec } = useBCH();
+ const BCH = new BCHJS();
+ const {
+ expectedTxId,
+ expectedHex,
+ utxos,
+ wallet,
+ destinationAddress,
+ sendAmount,
+ } = sendBCHMock;
+
+ BCH.RawTransactions.sendRawTransaction = jest
+ .fn()
+ .mockResolvedValue(expectedTxId);
+ expect(
+ await sendXec(
+ BCH,
+ wallet,
+ utxos,
+ currency.defaultFee,
+ '',
+ false,
+ null,
+ destinationAddress,
+ sendAmount,
+ ),
+ ).toBe(`${currency.blockExplorerUrl}/tx/${expectedTxId}`);
+ expect(BCH.RawTransactions.sendRawTransaction).toHaveBeenCalledWith(
+ expectedHex,
+ );
+ });
+
+ it('sends XEC correctly with an encrypted OP_RETURN message', async () => {
+ const { sendXec } = useBCH();
+ const BCH = new BCHJS();
+ const { expectedTxId, utxos, wallet, destinationAddress, sendAmount } =
+ sendBCHMock;
+ const expectedPubKeyResponse = {
+ success: true,
+ publicKey:
+ '03451a3e61ae8eb76b8d4cd6057e4ebaf3ef63ae3fe5f441b72c743b5810b6a389',
+ };
+
+ BCH.encryption.getPubKey = jest
+ .fn()
+ .mockResolvedValue(expectedPubKeyResponse);
+
+ BCH.RawTransactions.sendRawTransaction = jest
+ .fn()
+ .mockResolvedValue(expectedTxId);
+ expect(
+ await sendXec(
+ BCH,
+ wallet,
+ utxos,
+ currency.defaultFee,
+ 'This is an encrypted opreturn message',
+ false,
+ null,
+ destinationAddress,
+ sendAmount,
+ true, // encryption flag for the OP_RETURN message
+ ),
+ ).toBe(`${currency.blockExplorerUrl}/tx/${expectedTxId}`);
+ });
+
+ it('sends one to many XEC correctly', async () => {
+ const { sendXec } = useBCH();
+ const BCH = new BCHJS();
+ const {
+ expectedTxId,
+ expectedHex,
+ utxos,
+ wallet,
+ destinationAddress,
+ sendAmount,
+ } = sendBCHMock;
+
+ const addressAndValueArray = [
+ 'bitcoincash:qrzuvj0vvnsz5949h4axercl5k420eygavv0awgz05,6',
+ 'bitcoincash:qrzuvj0vvnsz5949h4axercl5k420eygavv0awgz05,6.8',
+ 'bitcoincash:qrzuvj0vvnsz5949h4axercl5k420eygavv0awgz05,7',
+ 'bitcoincash:qrzuvj0vvnsz5949h4axercl5k420eygavv0awgz05,6',
+ ];
+
+ BCH.RawTransactions.sendRawTransaction = jest
+ .fn()
+ .mockResolvedValue(expectedTxId);
+ expect(
+ await sendXec(
+ BCH,
+ wallet,
+ utxos,
+ currency.defaultFee,
+ '',
+ true,
+ addressAndValueArray,
+ ),
+ ).toBe(`${currency.blockExplorerUrl}/tx/${expectedTxId}`);
+ });
+
+ it(`Throws error if called trying to send one base unit ${currency.ticker} more than available in utxo set`, async () => {
+ const { sendXec } = useBCH();
+ const BCH = new BCHJS();
+ const { expectedTxId, utxos, wallet, destinationAddress } = sendBCHMock;
+
+ const expectedTxFeeInSats = 229;
+
+ BCH.RawTransactions.sendRawTransaction = jest
+ .fn()
+ .mockResolvedValue(expectedTxId);
+ const oneBaseUnitMoreThanBalance = new BigNumber(utxos[0].value)
+ .minus(expectedTxFeeInSats)
+ .plus(1)
+ .div(10 ** currency.cashDecimals)
+ .toString();
+
+ const failedSendBch = sendXec(
+ BCH,
+ wallet,
+ utxos,
+ currency.defaultFee,
+ '',
+ false,
+ null,
+ destinationAddress,
+ oneBaseUnitMoreThanBalance,
+ );
+ expect(failedSendBch).rejects.toThrow(new Error('Insufficient funds'));
+ const nullValuesSendBch = await sendXec(
+ BCH,
+ wallet,
+ utxos,
+ currency.defaultFee,
+ '',
+ false,
+ null,
+ destinationAddress,
+ null,
+ );
+ expect(nullValuesSendBch).toBe(null);
+ });
+
+ it('Throws error on attempt to send one satoshi less than backend dust limit', async () => {
+ const { sendXec } = useBCH();
+ const BCH = new BCHJS();
+ const { expectedTxId, utxos, wallet, destinationAddress } = sendBCHMock;
+ BCH.RawTransactions.sendRawTransaction = jest
+ .fn()
+ .mockResolvedValue(expectedTxId);
+ const failedSendBch = sendXec(
+ BCH,
+ wallet,
+ utxos,
+ currency.defaultFee,
+ '',
+ false,
+ null,
+ destinationAddress,
+ new BigNumber(
+ fromSmallestDenomination(currency.dustSats).toString(),
+ )
+ .minus(new BigNumber('0.00000001'))
+ .toString(),
+ );
+ expect(failedSendBch).rejects.toThrow(new Error('dust'));
+ const nullValuesSendBch = await sendXec(
+ BCH,
+ wallet,
+ utxos,
+ currency.defaultFee,
+ '',
+ false,
+ null,
+ destinationAddress,
+ null,
+ );
+ expect(nullValuesSendBch).toBe(null);
+ });
+
+ it("throws error attempting to burn an eToken ID that is not within the wallet's utxo", async () => {
+ const { burnEtoken } = useBCH();
+ const BCH = new BCHJS();
+ const { wallet } = sendBCHMock;
+ const burnAmount = 10;
+ const eTokenId = '0203c768a66eba24affNOTVALID103b772de4d9f8f63ba79e';
+ const expectedError =
+ 'No token UTXOs for the specified token could be found.';
+
+ let thrownError;
+ try {
+ await burnEtoken(BCH, wallet, mockReturnGetSlpBalancesAndUtxos, {
+ eTokenId,
+ burnAmount,
+ });
+ } catch (err) {
+ thrownError = err;
+ }
+ expect(thrownError).toStrictEqual(new Error(expectedError));
+ });
+
+ it('receives errors from the network and parses it', async () => {
+ const { sendXec } = useBCH();
+ const BCH = new BCHJS();
+ const { sendAmount, utxos, wallet, destinationAddress } = sendBCHMock;
+ BCH.RawTransactions.sendRawTransaction = jest
+ .fn()
+ .mockImplementation(async () => {
+ throw new Error('insufficient priority (code 66)');
+ });
+ const insufficientPriority = sendXec(
+ BCH,
+ wallet,
+ utxos,
+ currency.defaultFee,
+ '',
+ false,
+ null,
+ destinationAddress,
+ sendAmount,
+ );
+ await expect(insufficientPriority).rejects.toThrow(
+ new Error('insufficient priority (code 66)'),
+ );
+
+ BCH.RawTransactions.sendRawTransaction = jest
+ .fn()
+ .mockImplementation(async () => {
+ throw new Error('txn-mempool-conflict (code 18)');
+ });
+ const txnMempoolConflict = sendXec(
+ BCH,
+ wallet,
+ utxos,
+ currency.defaultFee,
+ '',
+ false,
+ null,
+ destinationAddress,
+ sendAmount,
+ );
+ await expect(txnMempoolConflict).rejects.toThrow(
+ new Error('txn-mempool-conflict (code 18)'),
+ );
+
+ BCH.RawTransactions.sendRawTransaction = jest
+ .fn()
+ .mockImplementation(async () => {
+ throw new Error('Network Error');
+ });
+ const networkError = sendXec(
+ BCH,
+ wallet,
+ utxos,
+ currency.defaultFee,
+ '',
+ false,
+ null,
+ destinationAddress,
+ sendAmount,
+ );
+ await expect(networkError).rejects.toThrow(new Error('Network Error'));
+
+ BCH.RawTransactions.sendRawTransaction = jest
+ .fn()
+ .mockImplementation(async () => {
+ const err = new Error(
+ 'too-long-mempool-chain, too many unconfirmed ancestors [limit: 25] (code 64)',
+ );
+ throw err;
+ });
+
+ const tooManyAncestorsMempool = sendXec(
+ BCH,
+ wallet,
+ utxos,
+ currency.defaultFee,
+ '',
+ false,
+ null,
+ destinationAddress,
+ sendAmount,
+ );
+ await expect(tooManyAncestorsMempool).rejects.toThrow(
+ new Error(
+ 'too-long-mempool-chain, too many unconfirmed ancestors [limit: 25] (code 64)',
+ ),
+ );
+ });
+
+ it('creates a token correctly', async () => {
+ const { createToken } = useBCH();
+ const BCH = new BCHJS();
+ const { expectedTxId, expectedHex, wallet, configObj } =
+ createTokenMock;
+
+ BCH.RawTransactions.sendRawTransaction = jest
+ .fn()
+ .mockResolvedValue(expectedTxId);
+ expect(await createToken(BCH, wallet, 5.01, configObj)).toBe(
+ `${currency.tokenExplorerUrl}/tx/${expectedTxId}`,
+ );
+ expect(BCH.RawTransactions.sendRawTransaction).toHaveBeenCalledWith(
+ expectedHex,
+ );
+ });
+
+ it('Throws correct error if user attempts to create a token with an invalid wallet', async () => {
+ const { createToken } = useBCH();
+ const BCH = new BCHJS();
+ const { invalidWallet, configObj } = createTokenMock;
+
+ const invalidWalletTokenCreation = createToken(
+ BCH,
+ invalidWallet,
+ currency.defaultFee,
+ configObj,
+ );
+ await expect(invalidWalletTokenCreation).rejects.toThrow(
+ new Error('Invalid wallet'),
+ );
+ });
+
+ it('Correctly flattens transaction history', () => {
+ const { flattenTransactions } = useBCH();
+ expect(flattenTransactions(mockTxHistory, 10)).toStrictEqual(
+ mockFlatTxHistory,
+ );
+ });
+
+ it(`Correctly parses a "send ${currency.ticker}" transaction`, async () => {
+ const { parseTxData } = useBCH();
+ const BCH = new BCHJS();
+ expect(
+ await parseTxData(
+ BCH,
+ [mockTxDataWithPassthrough[0]],
+ mockPublicKeys,
+ ),
+ ).toStrictEqual(mockSentCashTx);
+ });
+
+ it(`Correctly parses a "receive ${currency.ticker}" transaction`, async () => {
+ const { parseTxData } = useBCH();
+ const BCH = new BCHJS();
+ expect(
+ await parseTxData(
+ BCH,
+ [mockTxDataWithPassthrough[5]],
+ mockPublicKeys,
+ ),
+ ).toStrictEqual(mockReceivedCashTx);
+ });
+
+ it(`Correctly parses a "send ${currency.tokenTicker}" transaction`, async () => {
+ const { parseTxData } = useBCH();
+ const BCH = new BCHJS();
+ expect(
+ await parseTxData(
+ BCH,
+ [mockTxDataWithPassthrough[1]],
+ mockPublicKeys,
+ ),
+ ).toStrictEqual(mockSentTokenTx);
+ });
+
+ it(`Correctly parses a "burn ${currency.tokenTicker}" transaction`, async () => {
+ const { parseTxData } = useBCH();
+ const BCH = new BCHJS();
+ expect(
+ await parseTxData(
+ BCH,
+ [mockTxDataWithPassthrough[13]],
+ mockPublicKeys,
+ ),
+ ).toStrictEqual(mockBurnEtokenTx);
+ });
+
+ it(`Correctly parses a "receive ${currency.tokenTicker}" transaction`, async () => {
+ const { parseTxData } = useBCH();
+ const BCH = new BCHJS();
+ expect(
+ await parseTxData(
+ BCH,
+ [mockTxDataWithPassthrough[3]],
+ mockPublicKeys,
+ ),
+ ).toStrictEqual(mockReceivedTokenTx);
+ });
+
+ it(`Correctly parses a "send ${currency.tokenTicker}" transaction with token details`, () => {
+ const { parseTokenInfoForTxHistory } = useBCH();
+ const BCH = new BCHJS();
+ expect(
+ parseTokenInfoForTxHistory(
+ BCH,
+ tokenSendWdt.parsedTx,
+ tokenSendWdt.tokenInfo,
+ ),
+ ).toStrictEqual(tokenSendWdt.cashtabTokenInfo);
+ });
+
+ it(`Correctly parses a "receive ${currency.tokenTicker}" transaction with token details and 9 decimals of precision`, () => {
+ const { parseTokenInfoForTxHistory } = useBCH();
+ const BCH = new BCHJS();
+ expect(
+ parseTokenInfoForTxHistory(
+ BCH,
+ tokenReceiveTBS.parsedTx,
+ tokenReceiveTBS.tokenInfo,
+ ),
+ ).toStrictEqual(tokenReceiveTBS.cashtabTokenInfo);
+ });
+
+ it(`Correctly parses a "receive ${currency.tokenTicker}" transaction from an HD wallet (change address different from sending address)`, () => {
+ const { parseTokenInfoForTxHistory } = useBCH();
+ const BCH = new BCHJS();
+ expect(
+ parseTokenInfoForTxHistory(
+ BCH,
+ tokenReceiveGarmonbozia.parsedTx,
+ tokenReceiveGarmonbozia.tokenInfo,
+ ),
+ ).toStrictEqual(tokenReceiveGarmonbozia.cashtabTokenInfo);
+ });
+
+ it(`Correctly parses a "GENESIS ${currency.tokenTicker}" transaction with token details`, () => {
+ const { parseTokenInfoForTxHistory } = useBCH();
+ const BCH = new BCHJS();
+ expect(
+ parseTokenInfoForTxHistory(
+ BCH,
+ tokenGenesisCashtabMintAlpha.parsedTx,
+ tokenGenesisCashtabMintAlpha.tokenInfo,
+ ),
+ ).toStrictEqual(tokenGenesisCashtabMintAlpha.cashtabTokenInfo);
+ });
+
+ it(`Correctly parses a "send ${currency.ticker}" transaction with an OP_RETURN message`, async () => {
+ const { parseTxData } = useBCH();
+ const BCH = new BCHJS();
+ expect(
+ await parseTxData(
+ BCH,
+ [mockTxDataWithPassthrough[10]],
+ mockPublicKeys,
+ ),
+ ).toStrictEqual(mockSentOpReturnMessageTx);
+ });
+
+ it(`Correctly parses a "receive ${currency.ticker}" transaction with an OP_RETURN message`, async () => {
+ const { parseTxData } = useBCH();
+ const BCH = new BCHJS();
+ BCH.RawTransactions.getRawTransaction = jest
+ .fn()
+ .mockResolvedValue(mockTxDataWithPassthrough[12]);
+ expect(
+ await parseTxData(
+ BCH,
+ [mockTxDataWithPassthrough[11]],
+ mockPublicKeys,
+ ),
+ ).toStrictEqual(mockReceivedOpReturnMessageTx);
+ });
+
+ it(`handleEncryptedOpReturn() correctly encrypts a message based on a valid cash address`, async () => {
+ const { handleEncryptedOpReturn } = useBCH();
+ const BCH = new BCHJS();
+ const destinationAddress =
+ 'bitcoincash:qqvuj09f80sw9j7qru84ptxf0hyqffc38gstxfs5ru';
+ const message =
+ 'This message is encrypted by ecies-lite with default parameters';
+
+ const expectedPubKeyResponse = {
+ success: true,
+ publicKey:
+ '03208c4f52229e021ddec5fc6e07a59fd66388ac52bc2a2c1e0f1afb24b0e275ac',
+ };
+
+ BCH.encryption.getPubKey = jest
+ .fn()
+ .mockResolvedValue(expectedPubKeyResponse);
+
+ const result = await handleEncryptedOpReturn(
+ BCH,
+ destinationAddress,
+ Buffer.from(message),
+ );
+
+ // loop through each ecies encryption parameter from the object returned from the handleEncryptedOpReturn() call
+ for (const k of Object.keys(result)) {
+ switch (result[k].toString()) {
+ case 'epk':
+ // verify the sender's ephemeral public key buffer
+ expect(result[k].toString()).toEqual(
+ 'BPxEy0o7QsRok2GSpuLU27g0EqLIhf6LIxHx7P5UTZF9EFuQbqGzr5cCA51qVnvIJ9CZ84iW1DeDdvhg/EfPSas=',
+ );
+ break;
+ case 'iv':
+ // verify the initialization vector for the cipher algorithm
+ expect(result[k].toString()).toEqual(
+ '2FcU3fRZUOBt7dqshZjd+g==',
+ );
+ break;
+ case 'ct':
+ // verify the encrypted message buffer
+ expect(result[k].toString()).toEqual(
+ 'wVxPjv/ZiQ4etHqqTTIEoKvYYf4po05I/kNySrdsN3verxlHI07Rbob/VfF4MDfYHpYmDwlR9ax1shhdSzUG/A==',
+ );
+ break;
+ case 'mac':
+ // verify integrity of the message (checksum)
+ expect(result[k].toString()).toEqual(
+ 'F9KxuR48O0wxa9tFYq6/Hy3joI2edKxLFSeDVk6JKZE=',
+ );
+ break;
+ }
+ }
+ });
+
+ it(`getRecipientPublicKey() correctly retrieves the public key of a cash address`, async () => {
+ const { getRecipientPublicKey } = useBCH();
+ const BCH = new BCHJS();
+ const expectedPubKeyResponse = {
+ success: true,
+ publicKey:
+ '03208c4f52229e021ddec5fc6e07a59fd66388ac52bc2a2c1e0f1afb24b0e275ac',
+ };
+ const expectedPubKey =
+ '03208c4f52229e021ddec5fc6e07a59fd66388ac52bc2a2c1e0f1afb24b0e275ac';
+ const destinationAddress =
+ 'bitcoincash:qqvuj09f80sw9j7qru84ptxf0hyqffc38gstxfs5ru';
+ BCH.encryption.getPubKey = jest
+ .fn()
+ .mockResolvedValue(expectedPubKeyResponse);
+ expect(await getRecipientPublicKey(BCH, destinationAddress)).toBe(
+ expectedPubKey,
+ );
+ });
+});
diff --git a/web/cashtab-v2/src/hooks/__tests__/useWallet.test.js b/web/cashtab-v2/src/hooks/__tests__/useWallet.test.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/__tests__/useWallet.test.js
@@ -0,0 +1,50 @@
+import useWallet from '../useWallet';
+import useBCH from '../useBCH';
+import { renderHook } from '@testing-library/react-hooks';
+import mockLegacyWallets from '../__mocks__/mockLegacyWallets';
+import BCHJS from '@psf/bch-js';
+
+jest.mock('../useBCH');
+useBCH.mockReturnValue({ getBCH: () => new BCHJS() });
+
+test('Migrating legacy wallet on testnet', async () => {
+ const { result } = renderHook(() => useWallet());
+ process = {
+ env: {
+ REACT_APP_NETWORK: `testnet`,
+ REACT_APP_BCHA_APIS:
+ 'https://rest.kingbch.com/v3/,https://wallet-service-prod.bitframe.org/v3/,notevenaurl,https://rest.kingbch.com/v3/',
+ REACT_APP_BCHA_APIS_TEST: 'https://free-test.fullstack.cash/v3/',
+ },
+ };
+
+ const BCH = new BCHJS();
+ result.current.getWallet = false;
+ let wallet;
+ wallet = await result.current.migrateLegacyWallet(
+ BCH,
+ mockLegacyWallets.legacyAlphaTestnet,
+ );
+ expect(wallet).toStrictEqual(mockLegacyWallets.migratedLegacyAlphaTestnet);
+});
+
+test('Migrating legacy wallet on mainnet', async () => {
+ const { result } = renderHook(() => useWallet());
+ process = {
+ env: {
+ REACT_APP_NETWORK: `mainnet`,
+ REACT_APP_BCHA_APIS:
+ 'https://rest.kingbch.com/v3/,https://wallet-service-prod.bitframe.org/v3/,notevenaurl,https://rest.kingbch.com/v3/',
+ REACT_APP_BCHA_APIS_TEST: 'https://free-test.fullstack.cash/v3/',
+ },
+ };
+
+ const BCH = new BCHJS();
+ result.current.getWallet = false;
+ let wallet;
+ wallet = await result.current.migrateLegacyWallet(
+ BCH,
+ mockLegacyWallets.legacyAlphaMainnet,
+ );
+ expect(wallet).toStrictEqual(mockLegacyWallets.migratedLegacyAlphaMainnet);
+});
diff --git a/web/cashtab-v2/src/hooks/useAsyncTimeout.js b/web/cashtab-v2/src/hooks/useAsyncTimeout.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/useAsyncTimeout.js
@@ -0,0 +1,34 @@
+import { useEffect, useRef } from 'react';
+
+const useAsyncTimeout = (callback, delay) => {
+ const savedCallback = useRef(callback);
+
+ useEffect(() => {
+ savedCallback.current = callback;
+ });
+
+ useEffect(() => {
+ let id = null;
+ const tick = () => {
+ const promise = savedCallback.current();
+
+ if (promise instanceof Promise) {
+ promise.then(() => {
+ id = setTimeout(tick, delay);
+ });
+ } else {
+ id = setTimeout(tick, delay);
+ }
+ };
+
+ if (id !== null) {
+ id = setTimeout(tick, delay);
+ return () => clearTimeout(id);
+ } else {
+ tick();
+ return;
+ }
+ }, [delay]);
+};
+
+export default useAsyncTimeout;
diff --git a/web/cashtab-v2/src/hooks/useBCH.js b/web/cashtab-v2/src/hooks/useBCH.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/useBCH.js
@@ -0,0 +1,1675 @@
+import BigNumber from 'bignumber.js';
+import { currency } from '@components/Common/Ticker';
+import { isValidTokenStats } from '@utils/validation';
+import SlpWallet from 'minimal-slp-wallet';
+import {
+ toSmallestDenomination,
+ fromSmallestDenomination,
+ batchArray,
+ flattenBatchedHydratedUtxos,
+ isValidStoredWallet,
+ checkNullUtxosForTokenStatus,
+ confirmNonEtokenUtxos,
+ convertToEncryptStruct,
+ getPublicKey,
+ parseOpReturn,
+} from '@utils/cashMethods';
+import cashaddr from 'ecashaddrjs';
+import ecies from 'ecies-lite';
+import wif from 'wif';
+
+export default function useBCH() {
+ const SEND_BCH_ERRORS = {
+ INSUFFICIENT_FUNDS: 0,
+ NETWORK_ERROR: 1,
+ INSUFFICIENT_PRIORITY: 66, // ~insufficient fee
+ DOUBLE_SPENDING: 18,
+ MAX_UNCONFIRMED_TXS: 64,
+ };
+
+ const getRestUrl = (apiIndex = 0) => {
+ const apiString =
+ process.env.REACT_APP_NETWORK === `mainnet`
+ ? process.env.REACT_APP_BCHA_APIS
+ : process.env.REACT_APP_BCHA_APIS_TEST;
+ const apiArray = apiString.split(',');
+ return apiArray[apiIndex];
+ };
+
+ const flattenTransactions = (
+ txHistory,
+ txCount = currency.txHistoryCount,
+ ) => {
+ /*
+ Convert txHistory, format
+ [{address: '', transactions: [{height: '', tx_hash: ''}, ...{}]}, {}, {}]
+
+ to flatTxHistory
+ [{txid: '', blockheight: '', address: ''}]
+ sorted by blockheight, newest transactions to oldest transactions
+ */
+ let flatTxHistory = [];
+ let includedTxids = [];
+ for (let i = 0; i < txHistory.length; i += 1) {
+ const { address, transactions } = txHistory[i];
+ for (let j = transactions.length - 1; j >= 0; j -= 1) {
+ let flatTx = {};
+ flatTx.address = address;
+ // If tx is unconfirmed, give arbitrarily high blockheight
+ flatTx.height =
+ transactions[j].height <= 0
+ ? 10000000
+ : transactions[j].height;
+ flatTx.txid = transactions[j].tx_hash;
+ // Only add this tx if the same transaction is not already in the array
+ // This edge case can happen with older wallets, txs can be on multiple paths
+ if (!includedTxids.includes(flatTx.txid)) {
+ includedTxids.push(flatTx.txid);
+ flatTxHistory.push(flatTx);
+ }
+ }
+ }
+
+ // Sort with most recent transaction at index 0
+ flatTxHistory.sort((a, b) => b.height - a.height);
+ // Only return 10
+
+ return flatTxHistory.splice(0, txCount);
+ };
+
+ const parseTxData = async (BCH, txData, publicKeys, wallet) => {
+ /*
+ Desired output
+ [
+ {
+ txid: '',
+ type: send, receive
+ receivingAddress: '',
+ quantity: amount bcha
+ token: true/false
+ tokenInfo: {
+ tokenId:
+ tokenQty:
+ txType: mint, send, other
+ }
+ opReturnMessage: 'message extracted from asm' or ''
+ }
+ ]
+ */
+
+ const parsedTxHistory = [];
+ for (let i = 0; i < txData.length; i += 1) {
+ const tx = txData[i];
+
+ const parsedTx = {};
+
+ // Move over info that does not need to be calculated
+ parsedTx.txid = tx.txid;
+ parsedTx.height = tx.height;
+ let destinationAddress = tx.address;
+
+ // if there was an error in getting the tx data from api, the tx will only have txid and height
+ // So, it will not have 'vin'
+ if (!Object.keys(tx).includes('vin')) {
+ // Populate as a limited-info tx that can be expanded in a block explorer
+ parsedTxHistory.push(parsedTx);
+ continue;
+ }
+
+ parsedTx.confirmations = tx.confirmations;
+ parsedTx.blocktime = tx.blocktime;
+ let amountSent = 0;
+ let amountReceived = 0;
+ let opReturnMessage = '';
+ let isCashtabMessage = false;
+ let isEncryptedMessage = false;
+ let decryptionSuccess = false;
+ // Assume an incoming transaction
+ let outgoingTx = false;
+ let tokenTx = false;
+ let substring = '';
+
+ // If vin's scriptSig contains one of the publicKeys of this wallet
+ // This is an outgoing tx
+ for (let j = 0; j < tx.vin.length; j += 1) {
+ // Since Cashtab only concerns with utxos of Path145, Path245 and Path1899 addresses,
+ // which are hashes of thier public keys. We can safely assume that Cashtab can only
+ // consumes utxos of type 'pubkeyhash'
+ // Therefore, only tx with vin's scriptSig of type 'pubkeyhash' can potentially be an outgoing tx.
+ // any other scriptSig type indicates that the tx is incoming.
+ try {
+ const thisInputScriptSig = tx.vin[j].scriptSig;
+ let inputPubKey = undefined;
+ const inputType = BCH.Script.classifyInput(
+ BCH.Script.decode(
+ Buffer.from(thisInputScriptSig.hex, 'hex'),
+ ),
+ );
+ if (inputType === 'pubkeyhash') {
+ inputPubKey = thisInputScriptSig.hex.substring(
+ thisInputScriptSig.hex.length - 66,
+ );
+ }
+ publicKeys.forEach(pubKey => {
+ if (pubKey === inputPubKey) {
+ // This is an outgoing transaction
+ outgoingTx = true;
+ }
+ });
+ if (outgoingTx === true) break;
+ } catch (err) {
+ console.log(
+ "useBCH.parsedTxHistory() error: in trying to classify Input' scriptSig",
+ );
+ }
+ }
+
+ // Iterate over vout to find how much was sent or received
+ for (let j = 0; j < tx.vout.length; j += 1) {
+ const thisOutput = tx.vout[j];
+
+ // If there is no addresses object in the output, it's either an OP_RETURN msg or token tx
+ if (
+ !Object.keys(thisOutput.scriptPubKey).includes('addresses')
+ ) {
+ let hex = thisOutput.scriptPubKey.hex;
+ let parsedOpReturnArray = parseOpReturn(hex);
+
+ if (!parsedOpReturnArray) {
+ console.log(
+ 'useBCH.parsedTxData() error: parsed array is empty',
+ );
+ break;
+ }
+
+ let message = '';
+ let txType = parsedOpReturnArray[0];
+ if (txType === currency.opReturn.appPrefixesHex.eToken) {
+ // this is an eToken transaction
+ tokenTx = true;
+ } else if (
+ txType === currency.opReturn.appPrefixesHex.cashtab
+ ) {
+ // this is a Cashtab message
+ try {
+ opReturnMessage = Buffer.from(
+ parsedOpReturnArray[1],
+ 'hex',
+ );
+ isCashtabMessage = true;
+ } catch (err) {
+ // soft error if an unexpected or invalid cashtab hex is encountered
+ opReturnMessage = '';
+ console.log(
+ 'useBCH.parsedTxData() error: invalid cashtab msg hex: ' +
+ parsedOpReturnArray[1],
+ );
+ }
+ } else if (
+ txType ===
+ currency.opReturn.appPrefixesHex.cashtabEncrypted
+ ) {
+ // this is an encrypted Cashtab message
+ let msgString = parsedOpReturnArray[1];
+ let fundingWif, privateKeyObj, privateKeyBuff;
+ if (
+ wallet &&
+ wallet.state &&
+ wallet.state.slpBalancesAndUtxos &&
+ wallet.state.slpBalancesAndUtxos.nonSlpUtxos[0]
+ ) {
+ fundingWif =
+ wallet.state.slpBalancesAndUtxos.nonSlpUtxos[0]
+ .wif;
+ privateKeyObj = wif.decode(fundingWif);
+ privateKeyBuff = privateKeyObj.privateKey;
+ if (!privateKeyBuff) {
+ throw new Error('Private key extraction error');
+ }
+ } else {
+ break;
+ }
+
+ let structData;
+ let decryptedMessage;
+
+ try {
+ // Convert the hex encoded message to a buffer
+ const msgBuf = Buffer.from(msgString, 'hex');
+
+ // Convert the bufer into a structured object.
+ structData = convertToEncryptStruct(msgBuf);
+
+ decryptedMessage = await ecies.decrypt(
+ privateKeyBuff,
+ structData,
+ );
+ decryptionSuccess = true;
+ } catch (err) {
+ console.log(
+ 'useBCH.parsedTxData() decryption error: ' +
+ err,
+ );
+ decryptedMessage =
+ 'Only the message recipient can view this';
+ }
+ isCashtabMessage = true;
+ isEncryptedMessage = true;
+ opReturnMessage = decryptedMessage;
+ } else {
+ // this is an externally generated message
+ message = txType; // index 0 is the message content in this instance
+
+ // if there are more than one part to the external message
+ const arrayLength = parsedOpReturnArray.length;
+ for (let i = 1; i < arrayLength; i++) {
+ message = message + parsedOpReturnArray[i];
+ }
+
+ try {
+ opReturnMessage = Buffer.from(message, 'hex');
+ } catch (err) {
+ // soft error if an unexpected or invalid cashtab hex is encountered
+ opReturnMessage = '';
+ console.log(
+ 'useBCH.parsedTxData() error: invalid external msg hex: ' +
+ substring,
+ );
+ }
+ }
+ continue; // skipping the remainder of tx data parsing logic in both token and OP_RETURN tx cases
+ }
+ if (
+ thisOutput.scriptPubKey.addresses &&
+ thisOutput.scriptPubKey.addresses[0] === tx.address
+ ) {
+ if (outgoingTx) {
+ // This amount is change
+ continue;
+ }
+ amountReceived += thisOutput.value;
+ } else if (outgoingTx) {
+ amountSent += thisOutput.value;
+ // Assume there's only one destination address, i.e. it was sent by a Cashtab wallet
+ destinationAddress = thisOutput.scriptPubKey.addresses[0];
+ }
+ }
+
+ // If the tx is incoming and have a message attached
+ // get the address of the sender for this tx and encode into eCash address
+ let senderAddress = null;
+ if (!outgoingTx && opReturnMessage !== '') {
+ const firstVin = tx.vin[0];
+ try {
+ // get the tx that generated the first vin of this tx
+ const firstVinTxData =
+ await BCH.RawTransactions.getRawTransaction(
+ firstVin.txid,
+ true,
+ );
+ // extract the address of the tx output
+ let senderBchAddress =
+ firstVinTxData.vout[firstVin.vout].scriptPubKey
+ .addresses[0];
+ const { type, hash } = cashaddr.decode(senderBchAddress);
+ senderAddress = cashaddr.encode('ecash', type, hash);
+ } catch (err) {
+ console.log(
+ `Error in BCH.RawTransactions.getRawTransaction(${firstVin.txid}, true)`,
+ );
+ }
+ }
+ // Construct parsedTx
+ parsedTx.amountSent = amountSent;
+ parsedTx.amountReceived = amountReceived;
+ parsedTx.tokenTx = tokenTx;
+ parsedTx.outgoingTx = outgoingTx;
+ parsedTx.replyAddress = senderAddress;
+ parsedTx.destinationAddress = destinationAddress;
+ parsedTx.opReturnMessage = Buffer.from(opReturnMessage).toString();
+ parsedTx.isCashtabMessage = isCashtabMessage;
+ parsedTx.isEncryptedMessage = isEncryptedMessage;
+ parsedTx.decryptionSuccess = decryptionSuccess;
+ parsedTxHistory.push(parsedTx);
+ }
+ return parsedTxHistory;
+ };
+
+ const getTxHistory = async (BCH, addresses) => {
+ let txHistoryResponse;
+ try {
+ //console.log(`API Call: BCH.Electrumx.utxo(addresses)`);
+ //console.log(addresses);
+ txHistoryResponse = await BCH.Electrumx.transactions(addresses);
+ //console.log(`BCH.Electrumx.transactions(addresses) succeeded`);
+ //console.log(`txHistoryResponse`, txHistoryResponse);
+
+ if (txHistoryResponse.success && txHistoryResponse.transactions) {
+ return txHistoryResponse.transactions;
+ } else {
+ // eslint-disable-next-line no-throw-literal
+ throw new Error('Error in getTxHistory');
+ }
+ } catch (err) {
+ console.log(`Error in BCH.Electrumx.transactions(addresses):`);
+ console.log(err);
+ return err;
+ }
+ };
+
+ const getTxDataWithPassThrough = async (BCH, flatTx) => {
+ // necessary as BCH.RawTransactions.getRawTransaction does not return address or blockheight
+ let txDataWithPassThrough = {};
+ try {
+ txDataWithPassThrough = await BCH.RawTransactions.getRawTransaction(
+ flatTx.txid,
+ true,
+ );
+ } catch (err) {
+ console.log(
+ `Error in BCH.RawTransactions.getRawTransaction(${flatTx.txid}, true)`,
+ );
+ console.log(err);
+ // Include txid if you don't get it from the attempted response
+ txDataWithPassThrough.txid = flatTx.txid;
+ }
+ txDataWithPassThrough.height = flatTx.height;
+ txDataWithPassThrough.address = flatTx.address;
+ return txDataWithPassThrough;
+ };
+
+ const getTxData = async (BCH, txHistory, publicKeys, wallet) => {
+ // Flatten tx history
+ let flatTxs = flattenTransactions(txHistory);
+
+ // Build array of promises to get tx data for all 10 transactions
+ let getTxDataWithPassThroughPromises = [];
+ for (let i = 0; i < flatTxs.length; i += 1) {
+ const getTxDataWithPassThroughPromise =
+ returnGetTxDataWithPassThroughPromise(BCH, flatTxs[i]);
+ getTxDataWithPassThroughPromises.push(
+ getTxDataWithPassThroughPromise,
+ );
+ }
+
+ // Get txData for the 10 most recent transactions
+ let getTxDataWithPassThroughPromisesResponse;
+ try {
+ getTxDataWithPassThroughPromisesResponse = await Promise.all(
+ getTxDataWithPassThroughPromises,
+ );
+
+ const parsed = parseTxData(
+ BCH,
+ getTxDataWithPassThroughPromisesResponse,
+ publicKeys,
+ wallet,
+ );
+
+ return parsed;
+ } catch (err) {
+ console.log(
+ `Error in Promise.all(getTxDataWithPassThroughPromises):`,
+ );
+ console.log(err);
+ return err;
+ }
+ };
+
+ const parseTokenInfoForTxHistory = (BCH, parsedTx, tokenInfo) => {
+ // Address at which the eToken was received
+ const { destinationAddress } = parsedTx;
+ // Here in cashtab, destinationAddress is in bitcoincash: format
+ // In the API response of tokenInfo, this will be in simpleledger: format
+ // So, must convert to simpleledger
+ const receivingSlpAddress =
+ BCH.SLP.Address.toSLPAddress(destinationAddress);
+
+ const { transactionType, sendInputsFull, sendOutputsFull } = tokenInfo;
+ const sendingTokenAddresses = [];
+ // Scan over inputs to find out originating addresses
+ for (let i = 0; i < sendInputsFull.length; i += 1) {
+ const sendingAddress = sendInputsFull[i].address;
+ sendingTokenAddresses.push(sendingAddress);
+ }
+ // Scan over outputs to find out how much was sent
+ let qtySent = new BigNumber(0);
+ let qtyReceived = new BigNumber(0);
+ for (let i = 0; i < sendOutputsFull.length; i += 1) {
+ if (sendingTokenAddresses.includes(sendOutputsFull[i].address)) {
+ // token change and should be ignored, unless it's a genesis transaction
+ // then this is the amount created
+ if (transactionType === 'GENESIS') {
+ qtyReceived = qtyReceived.plus(
+ new BigNumber(sendOutputsFull[i].amount),
+ );
+ }
+ continue;
+ }
+ if (parsedTx.outgoingTx) {
+ qtySent = qtySent.plus(
+ new BigNumber(sendOutputsFull[i].amount),
+ );
+ } else {
+ // Only if this matches the receiving address
+ if (sendOutputsFull[i].address === receivingSlpAddress) {
+ qtyReceived = qtyReceived.plus(
+ new BigNumber(sendOutputsFull[i].amount),
+ );
+ }
+ }
+ }
+ const cashtabTokenInfo = {};
+ cashtabTokenInfo.qtySent = qtySent.toString();
+ cashtabTokenInfo.qtyReceived = qtyReceived.toString();
+ cashtabTokenInfo.tokenId = tokenInfo.tokenIdHex;
+ cashtabTokenInfo.tokenName = tokenInfo.tokenName;
+ cashtabTokenInfo.tokenTicker = tokenInfo.tokenTicker;
+ cashtabTokenInfo.transactionType = transactionType;
+
+ return cashtabTokenInfo;
+ };
+
+ const addTokenTxDataToSingleTx = async (BCH, parsedTx) => {
+ // Accept one parsedTx
+
+ // If it's not a token tx, just return it as is and do not parse for token data
+ if (!parsedTx.tokenTx) {
+ return parsedTx;
+ }
+
+ // If it could be a token tx, do an API call to get token info and return it
+ let tokenData;
+ try {
+ tokenData = await BCH.SLP.Utils.txDetails(parsedTx.txid);
+ } catch (err) {
+ console.log(
+ `Error in parsing BCH.SLP.Utils.txDetails(${parsedTx.txid})`,
+ );
+ console.log(err);
+ // This is not a token tx
+ parsedTx.tokenTx = false;
+ return parsedTx;
+ }
+
+ const { tokenInfo } = tokenData;
+
+ parsedTx.tokenInfo = parseTokenInfoForTxHistory(
+ BCH,
+ parsedTx,
+ tokenInfo,
+ );
+
+ return parsedTx;
+ };
+
+ const addTokenTxData = async (BCH, parsedTxs) => {
+ // Collect all txids for token transactions into array of promises
+ // Promise.all to get their tx history
+ // Add a tokeninfo object to parsedTxs for token txs
+ // Get txData for the 10 most recent transactions
+
+ // Build array of promises to get tx data for all 10 transactions
+ let addTokenTxDataToSingleTxPromises = [];
+ for (let i = 0; i < parsedTxs.length; i += 1) {
+ const addTokenTxDataToSingleTxPromise =
+ returnAddTokenTxDataToSingleTxPromise(BCH, parsedTxs[i]);
+ addTokenTxDataToSingleTxPromises.push(
+ addTokenTxDataToSingleTxPromise,
+ );
+ }
+ let addTokenTxDataToSingleTxPromisesResponse;
+ try {
+ addTokenTxDataToSingleTxPromisesResponse = await Promise.all(
+ addTokenTxDataToSingleTxPromises,
+ );
+ return addTokenTxDataToSingleTxPromisesResponse;
+ } catch (err) {
+ console.log(
+ `Error in Promise.all(addTokenTxDataToSingleTxPromises):`,
+ );
+ console.log(err);
+ return err;
+ }
+ };
+
+ // Split out the BCH.Electrumx.utxo(addresses) call from the getSlpBalancesandUtxos function
+ // If utxo set has not changed, you do not need to hydrate the utxo set
+ // This drastically reduces calls to the API
+ const getUtxos = async (BCH, addresses) => {
+ let utxosResponse;
+ try {
+ //console.log(`API Call: BCH.Electrumx.utxo(addresses)`);
+ //console.log(addresses);
+ utxosResponse = await BCH.Electrumx.utxo(addresses);
+ //console.log(`BCH.Electrumx.utxo(addresses) succeeded`);
+ //console.log(`utxosResponse`, utxosResponse);
+ return utxosResponse.utxos;
+ } catch (err) {
+ console.log(`Error in BCH.Electrumx.utxo(addresses):`);
+ return err;
+ }
+ };
+
+ const getHydratedUtxoDetails = async (BCH, utxos) => {
+ const hydrateUtxosPromises = [];
+ for (let i = 0; i < utxos.length; i += 1) {
+ let thisAddress = utxos[i].address;
+ let theseUtxos = utxos[i].utxos;
+ const batchedUtxos = batchArray(
+ theseUtxos,
+ currency.xecApiBatchSize,
+ );
+
+ // Iterate over each utxo in this address field
+ for (let j = 0; j < batchedUtxos.length; j += 1) {
+ const utxoSetForThisPromise = [
+ { utxos: batchedUtxos[j], address: thisAddress },
+ ];
+ const hydrateUtxosPromise = returnHydrateUtxosPromise(
+ BCH,
+ utxoSetForThisPromise,
+ );
+ hydrateUtxosPromises.push(hydrateUtxosPromise);
+ }
+ }
+ let hydrateUtxosPromisesResponse;
+ try {
+ hydrateUtxosPromisesResponse = await Promise.all(
+ hydrateUtxosPromises,
+ );
+ const flattenedBatchedHydratedUtxos = flattenBatchedHydratedUtxos(
+ hydrateUtxosPromisesResponse,
+ );
+ return flattenedBatchedHydratedUtxos;
+ } catch (err) {
+ console.log(`Error in Promise.all(hydrateUtxosPromises)`);
+ console.log(err);
+ return err;
+ }
+ };
+
+ const returnTxDataPromise = (BCH, txidBatch) => {
+ return new Promise((resolve, reject) => {
+ BCH.Electrumx.txData(txidBatch).then(
+ result => {
+ resolve(result);
+ },
+ err => {
+ reject(err);
+ },
+ );
+ });
+ };
+
+ const returnGetTxDataWithPassThroughPromise = (BCH, flatTx) => {
+ return new Promise((resolve, reject) => {
+ getTxDataWithPassThrough(BCH, flatTx).then(
+ result => {
+ resolve(result);
+ },
+ err => {
+ reject(err);
+ },
+ );
+ });
+ };
+
+ const returnAddTokenTxDataToSingleTxPromise = (BCH, parsedTx) => {
+ return new Promise((resolve, reject) => {
+ addTokenTxDataToSingleTx(BCH, parsedTx).then(
+ result => {
+ resolve(result);
+ },
+ err => {
+ reject(err);
+ },
+ );
+ });
+ };
+
+ const returnHydrateUtxosPromise = (BCH, utxoSetForThisPromise) => {
+ return new Promise((resolve, reject) => {
+ BCH.SLP.Utils.hydrateUtxos(utxoSetForThisPromise).then(
+ result => {
+ resolve(result);
+ },
+ err => {
+ reject(err);
+ },
+ );
+ });
+ };
+
+ const fetchTxDataForNullUtxos = async (BCH, nullUtxos) => {
+ // Check nullUtxos. If they aren't eToken txs, count them
+ console.log(
+ `Null utxos found, checking OP_RETURN fields to confirm they are not eToken txs.`,
+ );
+ const txids = [];
+ for (let i = 0; i < nullUtxos.length; i += 1) {
+ // Batch API call to get their OP_RETURN asm info
+ txids.push(nullUtxos[i].tx_hash);
+ }
+
+ // segment the txids array into chunks under the api limit
+ const batchedTxids = batchArray(txids, currency.xecApiBatchSize);
+
+ // build an array of promises
+ let txDataPromises = [];
+ // loop through each batch of 20 txids
+ for (let j = 0; j < batchedTxids.length; j += 1) {
+ const txidsForThisPromise = batchedTxids[j];
+ // build the promise for the api call with the 20 txids in current batch
+ const txDataPromise = returnTxDataPromise(BCH, txidsForThisPromise);
+ txDataPromises.push(txDataPromise);
+ }
+
+ try {
+ const txDataPromisesResponse = await Promise.all(txDataPromises);
+ // Scan tx data for each utxo to confirm they are not eToken txs
+ let thisTxDataResult;
+ let nonEtokenUtxos = [];
+ for (let k = 0; k < txDataPromisesResponse.length; k += 1) {
+ thisTxDataResult = txDataPromisesResponse[k].transactions;
+ nonEtokenUtxos = nonEtokenUtxos.concat(
+ checkNullUtxosForTokenStatus(thisTxDataResult),
+ );
+ }
+ return nonEtokenUtxos;
+ } catch (err) {
+ console.log(
+ `Error in checkNullUtxosForTokenStatus(nullUtxos)` + err,
+ );
+ console.log(`nullUtxos`, nullUtxos);
+ // If error, ignore these utxos, will be updated next utxo set refresh
+ return [];
+ }
+ };
+
+ const getSlpBalancesAndUtxos = async (BCH, hydratedUtxoDetails) => {
+ let hydratedUtxos = [];
+ for (let i = 0; i < hydratedUtxoDetails.slpUtxos.length; i += 1) {
+ const hydratedUtxosAtAddress = hydratedUtxoDetails.slpUtxos[i];
+ for (let j = 0; j < hydratedUtxosAtAddress.utxos.length; j += 1) {
+ const hydratedUtxo = hydratedUtxosAtAddress.utxos[j];
+ hydratedUtxo.address = hydratedUtxosAtAddress.address;
+ hydratedUtxos.push(hydratedUtxo);
+ }
+ }
+
+ //console.log(`hydratedUtxos`, hydratedUtxos);
+
+ // WARNING
+ // If you hit rate limits, your above utxos object will come back with `isValid` as null, but otherwise ok
+ // You need to throw an error before setting nonSlpUtxos and slpUtxos in this case
+ const nullUtxos = hydratedUtxos.filter(utxo => utxo.isValid === null);
+
+ if (nullUtxos.length > 0) {
+ console.log(`${nullUtxos.length} null utxos found!`);
+ console.log('nullUtxos', nullUtxos);
+ const nullNonEtokenUtxos = await fetchTxDataForNullUtxos(
+ BCH,
+ nullUtxos,
+ );
+
+ // Set isValid === false for nullUtxos that are confirmed non-eToken
+ hydratedUtxos = confirmNonEtokenUtxos(
+ hydratedUtxos,
+ nullNonEtokenUtxos,
+ );
+ }
+
+ // Prevent app from treating slpUtxos as nonSlpUtxos
+ // Must enforce === false as api will occasionally return utxo.isValid === null
+ // Do not classify any utxos that include token information as nonSlpUtxos
+ const nonSlpUtxos = hydratedUtxos.filter(
+ utxo =>
+ utxo.isValid === false &&
+ utxo.value !== currency.etokenSats &&
+ !utxo.tokenName,
+ );
+ // To be included in slpUtxos, the utxo must
+ // have utxo.isValid = true
+ // If utxo has a utxo.tokenQty field, i.e. not a minting baton, then utxo.tokenQty !== '0'
+ const slpUtxos = hydratedUtxos.filter(
+ utxo => utxo.isValid && !(utxo.tokenQty === '0'),
+ );
+
+ let tokensById = {};
+
+ slpUtxos.forEach(slpUtxo => {
+ let token = tokensById[slpUtxo.tokenId];
+
+ if (token) {
+ // Minting baton does nto have a slpUtxo.tokenQty type
+
+ if (slpUtxo.tokenQty) {
+ token.balance = token.balance.plus(
+ new BigNumber(slpUtxo.tokenQty),
+ );
+ }
+
+ //token.hasBaton = slpUtxo.transactionType === "genesis";
+ if (slpUtxo.utxoType && !token.hasBaton) {
+ token.hasBaton = slpUtxo.utxoType === 'minting-baton';
+ }
+
+ // Examples of slpUtxo
+ /*
+ Genesis transaction:
+ {
+ address: "bitcoincash:qrhzv5t79e2afc3rdutcu0d3q20gl7ul3ue58whah6"
+ decimals: 9
+ height: 617564
+ isValid: true
+ satoshis: 546
+ tokenDocumentHash: ""
+ tokenDocumentUrl: "developer.bitcoin.com"
+ tokenId: "6c41f244676ecfcbe3b4fabee2c72c2dadf8d74f8849afabc8a549157db69199"
+ tokenName: "PiticoLaunch"
+ tokenTicker: "PTCL"
+ tokenType: 1
+ tx_hash: "6c41f244676ecfcbe3b4fabee2c72c2dadf8d74f8849afabc8a549157db69199"
+ tx_pos: 2
+ txid: "6c41f244676ecfcbe3b4fabee2c72c2dadf8d74f8849afabc8a549157db69199"
+ utxoType: "minting-baton"
+ value: 546
+ vout: 2
+ }
+
+ Send transaction:
+ {
+ address: "bitcoincash:qrhzv5t79e2afc3rdutcu0d3q20gl7ul3ue58whah6"
+ decimals: 9
+ height: 655115
+ isValid: true
+ satoshis: 546
+ tokenDocumentHash: ""
+ tokenDocumentUrl: "developer.bitcoin.com"
+ tokenId: "6c41f244676ecfcbe3b4fabee2c72c2dadf8d74f8849afabc8a549157db69199"
+ tokenName: "PiticoLaunch"
+ tokenQty: 1.123456789
+ tokenTicker: "PTCL"
+ tokenType: 1
+ transactionType: "send"
+ tx_hash: "dea400f963bc9f51e010f88533010f8d1f82fc2bcc485ff8500c3a82b25abd9e"
+ tx_pos: 1
+ txid: "dea400f963bc9f51e010f88533010f8d1f82fc2bcc485ff8500c3a82b25abd9e"
+ utxoType: "token"
+ value: 546
+ vout: 1
+ }
+ */
+ } else {
+ token = {};
+ token.info = slpUtxo;
+ token.tokenId = slpUtxo.tokenId;
+ if (slpUtxo.tokenQty) {
+ token.balance = new BigNumber(slpUtxo.tokenQty);
+ } else {
+ token.balance = new BigNumber(0);
+ }
+ if (slpUtxo.utxoType) {
+ token.hasBaton = slpUtxo.utxoType === 'minting-baton';
+ } else {
+ token.hasBaton = false;
+ }
+
+ tokensById[slpUtxo.tokenId] = token;
+ }
+ });
+
+ const tokens = Object.values(tokensById);
+ // console.log(`tokens`, tokens);
+ return {
+ tokens,
+ nonSlpUtxos,
+ slpUtxos,
+ };
+ };
+
+ const calcFee = (
+ BCH,
+ utxos,
+ p2pkhOutputNumber = 2,
+ satoshisPerByte = currency.defaultFee,
+ ) => {
+ const byteCount = BCH.BitcoinCash.getByteCount(
+ { P2PKH: utxos.length },
+ { P2PKH: p2pkhOutputNumber },
+ );
+ const txFee = Math.ceil(satoshisPerByte * byteCount);
+ return txFee;
+ };
+
+ const createToken = async (BCH, wallet, feeInSatsPerByte, configObj) => {
+ try {
+ // Throw error if wallet does not have utxo set in state
+ if (!isValidStoredWallet(wallet)) {
+ const walletError = new Error(`Invalid wallet`);
+ throw walletError;
+ }
+ const utxos = wallet.state.slpBalancesAndUtxos.nonSlpUtxos;
+
+ const CREATION_ADDR = wallet.Path1899.cashAddress;
+ const inputUtxos = [];
+ let transactionBuilder;
+
+ // instance of transaction builder
+ if (process.env.REACT_APP_NETWORK === `mainnet`)
+ transactionBuilder = new BCH.TransactionBuilder();
+ else transactionBuilder = new BCH.TransactionBuilder('testnet');
+
+ let originalAmount = new BigNumber(0);
+
+ let txFee = 0;
+ for (let i = 0; i < utxos.length; i++) {
+ const utxo = utxos[i];
+ originalAmount = originalAmount.plus(new BigNumber(utxo.value));
+ const vout = utxo.vout;
+ const txid = utxo.txid;
+ // add input with txid and index of vout
+ transactionBuilder.addInput(txid, vout);
+
+ inputUtxos.push(utxo);
+ txFee = calcFee(BCH, inputUtxos, 3, feeInSatsPerByte);
+
+ if (
+ originalAmount
+ .minus(new BigNumber(currency.etokenSats))
+ .minus(new BigNumber(txFee))
+ .gte(0)
+ ) {
+ break;
+ }
+ }
+
+ // amount to send back to the remainder address.
+ const remainder = originalAmount
+ .minus(new BigNumber(currency.etokenSats))
+ .minus(new BigNumber(txFee));
+
+ if (remainder.lt(0)) {
+ const error = new Error(`Insufficient funds`);
+ error.code = SEND_BCH_ERRORS.INSUFFICIENT_FUNDS;
+ throw error;
+ }
+
+ // Generate the OP_RETURN entry for an SLP GENESIS transaction.
+ const script =
+ BCH.SLP.TokenType1.generateGenesisOpReturn(configObj);
+ // OP_RETURN needs to be the first output in the transaction.
+ transactionBuilder.addOutput(script, 0);
+
+ // add output w/ address and amount to send
+ transactionBuilder.addOutput(CREATION_ADDR, currency.etokenSats);
+
+ // Send change to own address
+ if (remainder.gte(new BigNumber(currency.etokenSats))) {
+ transactionBuilder.addOutput(
+ CREATION_ADDR,
+ parseInt(remainder),
+ );
+ }
+
+ // Sign the transactions with the HD node.
+ for (let i = 0; i < inputUtxos.length; i++) {
+ const utxo = inputUtxos[i];
+ transactionBuilder.sign(
+ i,
+ BCH.ECPair.fromWIF(utxo.wif),
+ undefined,
+ transactionBuilder.hashTypes.SIGHASH_ALL,
+ utxo.value,
+ );
+ }
+
+ // build tx
+ const tx = transactionBuilder.build();
+ // output rawhex
+ const hex = tx.toHex();
+
+ // Broadcast transaction to the network
+ const txidStr = await BCH.RawTransactions.sendRawTransaction([hex]);
+
+ if (txidStr && txidStr[0]) {
+ console.log(`${currency.ticker} txid`, txidStr[0]);
+ }
+ let link;
+
+ if (process.env.REACT_APP_NETWORK === `mainnet`) {
+ link = `${currency.tokenExplorerUrl}/tx/${txidStr}`;
+ } else {
+ link = `${currency.blockExplorerUrlTestnet}/tx/${txidStr}`;
+ }
+ //console.log(`link`, link);
+
+ return link;
+ } catch (err) {
+ if (err.error === 'insufficient priority (code 66)') {
+ err.code = SEND_BCH_ERRORS.INSUFFICIENT_PRIORITY;
+ } else if (err.error === 'txn-mempool-conflict (code 18)') {
+ err.code = SEND_BCH_ERRORS.DOUBLE_SPENDING;
+ } else if (err.error === 'Network Error') {
+ err.code = SEND_BCH_ERRORS.NETWORK_ERROR;
+ } else if (
+ err.error ===
+ 'too-long-mempool-chain, too many unconfirmed ancestors [limit: 25] (code 64)'
+ ) {
+ err.code = SEND_BCH_ERRORS.MAX_UNCONFIRMED_TXS;
+ }
+ console.log(`error: `, err);
+ throw err;
+ }
+ };
+
+ // No unit tests for this function as it is only an API wrapper
+ // Return false if do not get a valid response
+ const getTokenStats = async (BCH, tokenId) => {
+ let tokenStats;
+ try {
+ tokenStats = await BCH.SLP.Utils.tokenStats(tokenId);
+ if (isValidTokenStats(tokenStats)) {
+ return tokenStats;
+ }
+ } catch (err) {
+ console.log(`Error fetching token stats for tokenId ${tokenId}`);
+ console.log(err);
+ return false;
+ }
+ };
+
+ const sendToken = async (
+ BCH,
+ wallet,
+ slpBalancesAndUtxos,
+ { tokenId, amount, tokenReceiverAddress },
+ ) => {
+ // Handle error of user having no BCH
+ if (slpBalancesAndUtxos.nonSlpUtxos.length === 0) {
+ throw new Error(
+ `You need some ${currency.ticker} to send ${currency.tokenTicker}`,
+ );
+ }
+ const largestBchUtxo = slpBalancesAndUtxos.nonSlpUtxos.reduce(
+ (previous, current) =>
+ previous.value > current.value ? previous : current,
+ );
+
+ const bchECPair = BCH.ECPair.fromWIF(largestBchUtxo.wif);
+ const tokenUtxos = slpBalancesAndUtxos.slpUtxos.filter(utxo => {
+ if (
+ utxo && // UTXO is associated with a token.
+ utxo.tokenId === tokenId && // UTXO matches the token ID.
+ utxo.utxoType === 'token' // UTXO is not a minting baton.
+ ) {
+ return true;
+ }
+ return false;
+ });
+
+ if (tokenUtxos.length === 0) {
+ throw new Error(
+ 'No token UTXOs for the specified token could be found.',
+ );
+ }
+
+ // BEGIN transaction construction.
+
+ // instance of transaction builder
+ let transactionBuilder;
+ if (process.env.REACT_APP_NETWORK === 'mainnet') {
+ transactionBuilder = new BCH.TransactionBuilder();
+ } else transactionBuilder = new BCH.TransactionBuilder('testnet');
+
+ const originalAmount = largestBchUtxo.value;
+ transactionBuilder.addInput(
+ largestBchUtxo.tx_hash,
+ largestBchUtxo.tx_pos,
+ );
+
+ let finalTokenAmountSent = new BigNumber(0);
+ let tokenAmountBeingSentToAddress = new BigNumber(amount);
+
+ let tokenUtxosBeingSpent = [];
+ for (let i = 0; i < tokenUtxos.length; i++) {
+ finalTokenAmountSent = finalTokenAmountSent.plus(
+ new BigNumber(tokenUtxos[i].tokenQty),
+ );
+ transactionBuilder.addInput(
+ tokenUtxos[i].tx_hash,
+ tokenUtxos[i].tx_pos,
+ );
+ tokenUtxosBeingSpent.push(tokenUtxos[i]);
+ if (tokenAmountBeingSentToAddress.lte(finalTokenAmountSent)) {
+ break;
+ }
+ }
+
+ const slpSendObj = BCH.SLP.TokenType1.generateSendOpReturn(
+ tokenUtxosBeingSpent,
+ tokenAmountBeingSentToAddress.toString(),
+ );
+
+ const slpData = slpSendObj.script;
+
+ // Add OP_RETURN as first output.
+ transactionBuilder.addOutput(slpData, 0);
+
+ // Send dust transaction representing tokens being sent.
+ transactionBuilder.addOutput(
+ BCH.SLP.Address.toLegacyAddress(tokenReceiverAddress),
+ currency.etokenSats,
+ );
+
+ // Return any token change back to the sender.
+ if (slpSendObj.outputs > 1) {
+ // Change goes back to where slp utxo came from
+ transactionBuilder.addOutput(
+ BCH.SLP.Address.toLegacyAddress(
+ tokenUtxosBeingSpent[0].address,
+ ),
+ currency.etokenSats,
+ );
+ }
+
+ // get byte count to calculate fee. paying 1 sat
+ // Note: This may not be totally accurate. Just guessing on the byteCount size.
+ const txFee = calcFee(
+ BCH,
+ tokenUtxosBeingSpent,
+ 5,
+ 1.1 * currency.defaultFee,
+ );
+
+ // amount to send back to the sending address. It's the original amount - 1 sat/byte for tx size
+ const remainder = originalAmount - txFee - currency.etokenSats * 2;
+ if (remainder < 1) {
+ throw new Error('Selected UTXO does not have enough satoshis');
+ }
+
+ // Last output: send the BCH change back to the wallet.
+
+ // Send it back from whence it came
+ transactionBuilder.addOutput(
+ BCH.Address.toLegacyAddress(largestBchUtxo.address),
+ remainder,
+ );
+
+ // Sign the transaction with the private key for the BCH UTXO paying the fees.
+ let redeemScript;
+ transactionBuilder.sign(
+ 0,
+ bchECPair,
+ redeemScript,
+ transactionBuilder.hashTypes.SIGHASH_ALL,
+ originalAmount,
+ );
+
+ // Sign each token UTXO being consumed.
+ for (let i = 0; i < tokenUtxosBeingSpent.length; i++) {
+ const thisUtxo = tokenUtxosBeingSpent[i];
+ const accounts = [wallet.Path245, wallet.Path145, wallet.Path1899];
+ const utxoEcPair = BCH.ECPair.fromWIF(
+ accounts
+ .filter(acc => acc.cashAddress === thisUtxo.address)
+ .pop().fundingWif,
+ );
+
+ transactionBuilder.sign(
+ 1 + i,
+ utxoEcPair,
+ redeemScript,
+ transactionBuilder.hashTypes.SIGHASH_ALL,
+ thisUtxo.value,
+ );
+ }
+
+ // build tx
+ const tx = transactionBuilder.build();
+
+ // output rawhex
+ const hex = tx.toHex();
+ // console.log(`Transaction raw hex: `, hex);
+
+ // END transaction construction.
+
+ const txidStr = await BCH.RawTransactions.sendRawTransaction([hex]);
+ if (txidStr && txidStr[0]) {
+ console.log(`${currency.tokenTicker} txid`, txidStr[0]);
+ }
+
+ let link;
+ if (process.env.REACT_APP_NETWORK === `mainnet`) {
+ link = `${currency.blockExplorerUrl}/tx/${txidStr}`;
+ } else {
+ link = `${currency.blockExplorerUrlTestnet}/tx/${txidStr}`;
+ }
+
+ //console.log(`link`, link);
+
+ return link;
+ };
+
+ const burnEtoken = async (
+ BCH,
+ wallet,
+ slpBalancesAndUtxos,
+ { tokenId, amount },
+ ) => {
+ // Handle error of user having no XEC
+ if (slpBalancesAndUtxos.nonSlpUtxos.length === 0) {
+ throw new Error(`You need some ${currency.ticker} to burn eTokens`);
+ }
+ const largestBchUtxo = slpBalancesAndUtxos.nonSlpUtxos.reduce(
+ (previous, current) =>
+ previous.value > current.value ? previous : current,
+ );
+
+ const bchECPair = BCH.ECPair.fromWIF(largestBchUtxo.wif);
+ const tokenUtxos = slpBalancesAndUtxos.slpUtxos.filter(utxo => {
+ if (
+ utxo && // UTXO is associated with a token.
+ utxo.tokenId === tokenId && // UTXO matches the token ID.
+ utxo.utxoType === 'token' // UTXO is not a minting baton.
+ ) {
+ return true;
+ }
+ return false;
+ });
+
+ if (tokenUtxos.length === 0) {
+ throw new Error(
+ 'No token UTXOs for the specified token could be found.',
+ );
+ }
+
+ // BEGIN transaction construction.
+
+ // instance of transaction builder
+ let transactionBuilder;
+ if (process.env.REACT_APP_NETWORK === 'mainnet') {
+ transactionBuilder = new BCH.TransactionBuilder();
+ } else transactionBuilder = new BCH.TransactionBuilder('testnet');
+
+ const originalAmount = largestBchUtxo.value;
+ transactionBuilder.addInput(
+ largestBchUtxo.tx_hash,
+ largestBchUtxo.tx_pos,
+ );
+
+ let finalTokenAmountBurnt = new BigNumber(0);
+ let tokenAmountBeingBurnt = new BigNumber(amount);
+
+ let tokenUtxosBeingBurnt = [];
+ for (let i = 0; i < tokenUtxos.length; i++) {
+ finalTokenAmountBurnt = finalTokenAmountBurnt.plus(
+ new BigNumber(tokenUtxos[i].tokenQty),
+ );
+ transactionBuilder.addInput(
+ tokenUtxos[i].tx_hash,
+ tokenUtxos[i].tx_pos,
+ );
+ tokenUtxosBeingBurnt.push(tokenUtxos[i]);
+ if (tokenAmountBeingBurnt.lte(finalTokenAmountBurnt)) {
+ break;
+ }
+ }
+
+ const slpBurnObj = BCH.SLP.TokenType1.generateBurnOpReturn(
+ tokenUtxosBeingBurnt,
+ tokenAmountBeingBurnt,
+ );
+
+ if (!slpBurnObj) {
+ throw new Error(`Invalid eToken burn transaction.`);
+ }
+
+ // Add OP_RETURN as first output.
+ transactionBuilder.addOutput(slpBurnObj, 0);
+
+ // Send dust transaction representing tokens being burnt.
+ transactionBuilder.addOutput(
+ BCH.SLP.Address.toLegacyAddress(largestBchUtxo.address),
+ currency.etokenSats,
+ );
+
+ // get byte count to calculate fee. paying 1 sat
+ const txFee = calcFee(
+ BCH,
+ tokenUtxosBeingBurnt,
+ 3,
+ currency.defaultFee,
+ );
+
+ // amount to send back to the address requesting the burn. It's the original amount - 1 sat/byte for tx size
+ const remainder = originalAmount - txFee - currency.etokenSats * 2;
+ if (remainder < 1) {
+ throw new Error('Selected UTXO does not have enough satoshis');
+ }
+
+ // Send it back from whence it came
+ transactionBuilder.addOutput(
+ BCH.Address.toLegacyAddress(largestBchUtxo.address),
+ remainder,
+ );
+
+ // Sign the transaction with the private key for the XEC UTXO paying the fees.
+ let redeemScript;
+ transactionBuilder.sign(
+ 0,
+ bchECPair,
+ redeemScript,
+ transactionBuilder.hashTypes.SIGHASH_ALL,
+ originalAmount,
+ );
+
+ // Sign each token UTXO being consumed.
+ for (let i = 0; i < tokenUtxosBeingBurnt.length; i++) {
+ const thisUtxo = tokenUtxosBeingBurnt[i];
+ const accounts = [wallet.Path245, wallet.Path145, wallet.Path1899];
+ const utxoEcPair = BCH.ECPair.fromWIF(
+ accounts
+ .filter(acc => acc.cashAddress === thisUtxo.address)
+ .pop().fundingWif,
+ );
+
+ transactionBuilder.sign(
+ 1 + i,
+ utxoEcPair,
+ redeemScript,
+ transactionBuilder.hashTypes.SIGHASH_ALL,
+ thisUtxo.value,
+ );
+ }
+
+ // build tx
+ const tx = transactionBuilder.build();
+
+ // output rawhex
+ const hex = tx.toHex();
+ // console.log(`Transaction raw hex: `, hex);
+
+ // END transaction construction.
+
+ const txidStr = await BCH.RawTransactions.sendRawTransaction([hex]);
+ if (txidStr && txidStr[0]) {
+ console.log(`${currency.tokenTicker} txid`, txidStr[0]);
+ }
+
+ let link;
+ if (process.env.REACT_APP_NETWORK === `mainnet`) {
+ link = `${currency.tokenExplorerUrl}/tx/${txidStr}`;
+ } else {
+ link = `${currency.blockExplorerUrlTestnet}/tx/${txidStr}`;
+ }
+
+ return link;
+ };
+
+ const signPkMessage = async (BCH, pk, message) => {
+ try {
+ let signature = await BCH.BitcoinCash.signMessageWithPrivKey(
+ pk,
+ message,
+ );
+ return signature;
+ } catch (err) {
+ console.log(`useBCH.signPkMessage() error: `, err);
+ throw err;
+ }
+ };
+
+ const getRecipientPublicKey = async (BCH, recipientAddress) => {
+ let recipientPubKey;
+ try {
+ recipientPubKey = await getPublicKey(BCH, recipientAddress);
+ } catch (err) {
+ console.log(`useBCH.getRecipientPublicKey() error: ` + err);
+ throw err;
+ }
+ return recipientPubKey;
+ };
+
+ const handleEncryptedOpReturn = async (
+ BCH,
+ destinationAddress,
+ optionalOpReturnMsg,
+ ) => {
+ let recipientPubKey, encryptedEj;
+ try {
+ recipientPubKey = await getRecipientPublicKey(
+ BCH,
+ destinationAddress,
+ );
+ } catch (err) {
+ console.log(`useBCH.handleEncryptedOpReturn() error: ` + err);
+ throw err;
+ }
+
+ if (recipientPubKey === 'not found') {
+ // if the API can't find a pub key, it is due to the wallet having no outbound tx
+ throw new Error(
+ 'Cannot send an encrypted message to a wallet with no outgoing transactions',
+ );
+ }
+
+ try {
+ const pubKeyBuf = Buffer.from(recipientPubKey, 'hex');
+ const bufferedFile = Buffer.from(optionalOpReturnMsg);
+ const structuredEj = await ecies.encrypt(pubKeyBuf, bufferedFile);
+
+ // Serialize the encrypted data object
+ encryptedEj = Buffer.concat([
+ structuredEj.epk,
+ structuredEj.iv,
+ structuredEj.ct,
+ structuredEj.mac,
+ ]);
+ } catch (err) {
+ console.log(`useBCH.handleEncryptedOpReturn() error: ` + err);
+ throw err;
+ }
+
+ return encryptedEj;
+ };
+
+ const sendXec = async (
+ BCH,
+ wallet,
+ utxos,
+ feeInSatsPerByte,
+ optionalOpReturnMsg,
+ isOneToMany,
+ destinationAddressAndValueArray,
+ destinationAddress,
+ sendAmount,
+ encryptionFlag,
+ ) => {
+ try {
+ let value = new BigNumber(0);
+
+ if (isOneToMany) {
+ // this is a one to many XEC transaction
+ if (
+ !destinationAddressAndValueArray ||
+ !destinationAddressAndValueArray.length
+ ) {
+ throw new Error('Invalid destinationAddressAndValueArray');
+ }
+ const arrayLength = destinationAddressAndValueArray.length;
+ for (let i = 0; i < arrayLength; i++) {
+ // add the total value being sent in this array of recipients
+ value = BigNumber.sum(
+ value,
+ new BigNumber(
+ destinationAddressAndValueArray[i].split(',')[1],
+ ),
+ );
+ }
+
+ // If user is attempting to send an aggregate value that is less than minimum accepted by the backend
+ if (
+ value.lt(
+ new BigNumber(
+ fromSmallestDenomination(
+ currency.dustSats,
+ ).toString(),
+ ),
+ )
+ ) {
+ // Throw the same error given by the backend attempting to broadcast such a tx
+ throw new Error('dust');
+ }
+ } else {
+ // this is a one to one XEC transaction then check sendAmount
+ // note: one to many transactions won't be sending a single sendAmount
+
+ if (!sendAmount) {
+ return null;
+ }
+
+ value = new BigNumber(sendAmount);
+
+ // If user is attempting to send less than minimum accepted by the backend
+ if (
+ value.lt(
+ new BigNumber(
+ fromSmallestDenomination(
+ currency.dustSats,
+ ).toString(),
+ ),
+ )
+ ) {
+ // Throw the same error given by the backend attempting to broadcast such a tx
+ throw new Error('dust');
+ }
+ }
+
+ const inputUtxos = [];
+ let transactionBuilder;
+
+ // instance of transaction builder
+ if (process.env.REACT_APP_NETWORK === `mainnet`)
+ transactionBuilder = new BCH.TransactionBuilder();
+ else transactionBuilder = new BCH.TransactionBuilder('testnet');
+
+ const satoshisToSend = toSmallestDenomination(value);
+
+ // Throw validation error if toSmallestDenomination returns false
+ if (!satoshisToSend) {
+ const error = new Error(
+ `Invalid decimal places for send amount`,
+ );
+ throw error;
+ }
+
+ let script;
+ // Start of building the OP_RETURN output.
+ // only build the OP_RETURN output if the user supplied it
+ if (
+ optionalOpReturnMsg &&
+ typeof optionalOpReturnMsg !== 'undefined' &&
+ optionalOpReturnMsg.trim() !== ''
+ ) {
+ if (encryptionFlag) {
+ // if the user has opted to encrypt this message
+ let encryptedEj;
+ try {
+ encryptedEj = await handleEncryptedOpReturn(
+ BCH,
+ destinationAddress,
+ optionalOpReturnMsg,
+ );
+ } catch (err) {
+ console.log(`useBCH.sendXec() encryption error.`);
+ throw err;
+ }
+
+ // build the OP_RETURN script with the encryption prefix
+ script = [
+ BCH.Script.opcodes.OP_RETURN, // 6a
+ Buffer.from(
+ currency.opReturn.appPrefixesHex.cashtabEncrypted,
+ 'hex',
+ ), // 65746162
+ Buffer.from(encryptedEj),
+ ];
+ } else {
+ // this is an un-encrypted message
+ script = [
+ BCH.Script.opcodes.OP_RETURN, // 6a
+ Buffer.from(
+ currency.opReturn.appPrefixesHex.cashtab,
+ 'hex',
+ ), // 00746162
+ Buffer.from(optionalOpReturnMsg),
+ ];
+ }
+ const data = BCH.Script.encode(script);
+ transactionBuilder.addOutput(data, 0);
+ }
+ // End of building the OP_RETURN output.
+
+ let originalAmount = new BigNumber(0);
+ let txFee = 0;
+ // A normal tx will have 2 outputs, destination and change
+ // A one to many tx will have n outputs + 1 change output, where n is the number of recipients
+ const txOutputs = isOneToMany
+ ? destinationAddressAndValueArray.length + 1
+ : 2;
+ for (let i = 0; i < utxos.length; i++) {
+ const utxo = utxos[i];
+ originalAmount = originalAmount.plus(utxo.value);
+ const vout = utxo.vout;
+ const txid = utxo.txid;
+ // add input with txid and index of vout
+ transactionBuilder.addInput(txid, vout);
+
+ inputUtxos.push(utxo);
+ txFee = calcFee(BCH, inputUtxos, txOutputs, feeInSatsPerByte);
+
+ if (originalAmount.minus(satoshisToSend).minus(txFee).gte(0)) {
+ break;
+ }
+ }
+
+ // Get change address from sending utxos
+ // fall back to what is stored in wallet
+ let REMAINDER_ADDR;
+
+ // Validate address
+ let isValidChangeAddress;
+ try {
+ REMAINDER_ADDR = inputUtxos[0].address;
+ isValidChangeAddress =
+ BCH.Address.isCashAddress(REMAINDER_ADDR);
+ } catch (err) {
+ isValidChangeAddress = false;
+ }
+ if (!isValidChangeAddress) {
+ REMAINDER_ADDR = wallet.Path1899.cashAddress;
+ }
+
+ // amount to send back to the remainder address.
+ const remainder = originalAmount.minus(satoshisToSend).minus(txFee);
+
+ if (remainder.lt(0)) {
+ const error = new Error(`Insufficient funds`);
+ error.code = SEND_BCH_ERRORS.INSUFFICIENT_FUNDS;
+ throw error;
+ }
+
+ if (isOneToMany) {
+ // for one to many mode, add the multiple outputs from the array
+ let arrayLength = destinationAddressAndValueArray.length;
+ for (let i = 0; i < arrayLength; i++) {
+ // add each send tx from the array as an output
+ let outputAddress =
+ destinationAddressAndValueArray[i].split(',')[0];
+ let outputValue = new BigNumber(
+ destinationAddressAndValueArray[i].split(',')[1],
+ );
+ transactionBuilder.addOutput(
+ BCH.Address.toCashAddress(outputAddress),
+ parseInt(toSmallestDenomination(outputValue)),
+ );
+ }
+ } else {
+ // for one to one mode, add output w/ single address and amount to send
+ transactionBuilder.addOutput(
+ BCH.Address.toCashAddress(destinationAddress),
+ parseInt(toSmallestDenomination(value)),
+ );
+ }
+
+ if (remainder.gte(new BigNumber(currency.dustSats))) {
+ transactionBuilder.addOutput(
+ REMAINDER_ADDR,
+ parseInt(remainder),
+ );
+ }
+
+ // Sign the transactions with the HD node.
+ for (let i = 0; i < inputUtxos.length; i++) {
+ const utxo = inputUtxos[i];
+ transactionBuilder.sign(
+ i,
+ BCH.ECPair.fromWIF(utxo.wif),
+ undefined,
+ transactionBuilder.hashTypes.SIGHASH_ALL,
+ utxo.value,
+ );
+ }
+
+ // build tx
+ const tx = transactionBuilder.build();
+ // output rawhex
+ const hex = tx.toHex();
+
+ // Broadcast transaction to the network
+ const txidStr = await BCH.RawTransactions.sendRawTransaction([hex]);
+
+ if (txidStr && txidStr[0]) {
+ console.log(`${currency.ticker} txid`, txidStr[0]);
+ }
+ let link;
+ if (process.env.REACT_APP_NETWORK === `mainnet`) {
+ link = `${currency.blockExplorerUrl}/tx/${txidStr}`;
+ } else {
+ link = `${currency.blockExplorerUrlTestnet}/tx/${txidStr}`;
+ }
+ //console.log(`link`, link);
+
+ return link;
+ } catch (err) {
+ if (err.error === 'insufficient priority (code 66)') {
+ err.code = SEND_BCH_ERRORS.INSUFFICIENT_PRIORITY;
+ } else if (err.error === 'txn-mempool-conflict (code 18)') {
+ err.code = SEND_BCH_ERRORS.DOUBLE_SPENDING;
+ } else if (err.error === 'Network Error') {
+ err.code = SEND_BCH_ERRORS.NETWORK_ERROR;
+ } else if (
+ err.error ===
+ 'too-long-mempool-chain, too many unconfirmed ancestors [limit: 25] (code 64)'
+ ) {
+ err.code = SEND_BCH_ERRORS.MAX_UNCONFIRMED_TXS;
+ }
+ console.log(`error: `, err);
+ throw err;
+ }
+ };
+
+ const getBCH = (apiIndex = 0) => {
+ let ConstructedSlpWallet;
+
+ ConstructedSlpWallet = new SlpWallet('', {
+ restURL: getRestUrl(apiIndex),
+ });
+ return ConstructedSlpWallet.bchjs;
+ };
+
+ return {
+ getBCH,
+ calcFee,
+ getUtxos,
+ getHydratedUtxoDetails,
+ getSlpBalancesAndUtxos,
+ getTxHistory,
+ flattenTransactions,
+ parseTxData,
+ addTokenTxData,
+ parseTokenInfoForTxHistory,
+ getTxData,
+ getRestUrl,
+ signPkMessage,
+ sendXec,
+ sendToken,
+ createToken,
+ getTokenStats,
+ handleEncryptedOpReturn,
+ getRecipientPublicKey,
+ burnEtoken,
+ };
+}
diff --git a/web/cashtab-v2/src/hooks/useImage.js b/web/cashtab-v2/src/hooks/useImage.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/useImage.js
@@ -0,0 +1,207 @@
+const useImage = () => {
+ const createImage = url =>
+ new Promise((resolve, reject) => {
+ const image = new Image();
+ image.addEventListener('load', () => resolve(image));
+ image.addEventListener('error', error => reject(error));
+ image.setAttribute('crossOrigin', 'anonymous');
+ image.src = url;
+ });
+
+ const getResizedImg = async (imageSrc, callback, fileName) => {
+ const image = await createImage(imageSrc);
+
+ const width = 128;
+ const height = 128;
+ const canvas = document.createElement('canvas');
+ canvas.width = width;
+ canvas.height = height;
+ const ctx = canvas.getContext('2d');
+
+ ctx.drawImage(image, 0, 0, width, height);
+ if (!HTMLCanvasElement.prototype.toBlob) {
+ Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {
+ value: function (callback, type, quality) {
+ var dataURL = this.toDataURL(type, quality).split(',')[1];
+ setTimeout(function () {
+ var binStr = atob(dataURL),
+ len = binStr.length,
+ arr = new Uint8Array(len);
+ for (var i = 0; i < len; i++) {
+ arr[i] = binStr.charCodeAt(i);
+ }
+ callback(
+ new Blob([arr], { type: type || 'image/png' }),
+ );
+ });
+ },
+ });
+ }
+
+ return new Promise(resolve => {
+ ctx.canvas.toBlob(
+ blob => {
+ const file = new File([blob], fileName, {
+ type: 'image/png',
+ });
+ const resultReader = new FileReader();
+
+ resultReader.readAsDataURL(file);
+
+ resultReader.addEventListener('load', () =>
+ callback({ file, url: resultReader.result }),
+ );
+ resolve();
+ },
+ 'image/png',
+ 1,
+ );
+ });
+ };
+
+ const getRoundImg = async (imageSrc, fileName) => {
+ const image = await createImage(imageSrc);
+ console.log('image :', image);
+ const canvas = document.createElement('canvas');
+ canvas.width = image.width;
+ canvas.height = image.height;
+ const ctx = canvas.getContext('2d');
+
+ ctx.drawImage(image, 0, 0);
+ ctx.globalCompositeOperation = 'destination-in';
+ ctx.beginPath();
+ ctx.arc(
+ image.width / 2,
+ image.height / 2,
+ image.height / 2,
+ 0,
+ Math.PI * 2,
+ );
+ ctx.closePath();
+ ctx.fill();
+ if (!HTMLCanvasElement.prototype.toBlob) {
+ Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {
+ value: function (callback, type, quality) {
+ var dataURL = this.toDataURL(type, quality).split(',')[1];
+ setTimeout(function () {
+ var binStr = atob(dataURL),
+ len = binStr.length,
+ arr = new Uint8Array(len);
+ for (var i = 0; i < len; i++) {
+ arr[i] = binStr.charCodeAt(i);
+ }
+ callback(
+ new Blob([arr], { type: type || 'image/png' }),
+ );
+ });
+ },
+ });
+ }
+ return new Promise(resolve => {
+ ctx.canvas.toBlob(
+ blob => {
+ const file = new File([blob], fileName, {
+ type: 'image/png',
+ });
+ const resultReader = new FileReader();
+
+ resultReader.readAsDataURL(file);
+
+ resultReader.addEventListener('load', () =>
+ resolve({ file, url: resultReader.result }),
+ );
+ },
+ 'image/png',
+ 1,
+ );
+ });
+ };
+
+ const getRadianAngle = degreeValue => {
+ return (degreeValue * Math.PI) / 180;
+ };
+
+ const getCroppedImg = async (
+ imageSrc,
+ pixelCrop,
+ rotation = 0,
+ fileName,
+ ) => {
+ const image = await createImage(imageSrc);
+ console.log('image :', image);
+ const canvas = document.createElement('canvas');
+ const ctx = canvas.getContext('2d');
+
+ const maxSize = Math.max(image.width, image.height);
+ const safeArea = 2 * ((maxSize / 2) * Math.sqrt(2));
+
+ canvas.width = safeArea;
+ canvas.height = safeArea;
+
+ ctx.translate(safeArea / 2, safeArea / 2);
+ ctx.rotate(getRadianAngle(rotation));
+ ctx.translate(-safeArea / 2, -safeArea / 2);
+
+ ctx.drawImage(
+ image,
+ safeArea / 2 - image.width * 0.5,
+ safeArea / 2 - image.height * 0.5,
+ );
+ const data = ctx.getImageData(0, 0, safeArea, safeArea);
+
+ canvas.width = pixelCrop.width;
+ canvas.height = pixelCrop.height;
+
+ ctx.putImageData(
+ data,
+ 0 - safeArea / 2 + image.width * 0.5 - pixelCrop.x,
+ 0 - safeArea / 2 + image.height * 0.5 - pixelCrop.y,
+ );
+
+ if (!HTMLCanvasElement.prototype.toBlob) {
+ Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {
+ value: function (callback, type, quality) {
+ var dataURL = this.toDataURL(type, quality).split(',')[1];
+ setTimeout(function () {
+ var binStr = atob(dataURL),
+ len = binStr.length,
+ arr = new Uint8Array(len);
+ for (var i = 0; i < len; i++) {
+ arr[i] = binStr.charCodeAt(i);
+ }
+ callback(
+ new Blob([arr], { type: type || 'image/png' }),
+ );
+ });
+ },
+ });
+ }
+ return new Promise(resolve => {
+ ctx.canvas.toBlob(
+ blob => {
+ const file = new File([blob], fileName, {
+ type: 'image/png',
+ });
+ const resultReader = new FileReader();
+
+ resultReader.readAsDataURL(file);
+
+ resultReader.addEventListener('load', () =>
+ resolve({ file, url: resultReader.result }),
+ );
+ },
+ 'image/png',
+ 1,
+ );
+ });
+ };
+
+ return {
+ getCroppedImg,
+ getRadianAngle,
+ getRoundImg,
+ getResizedImg,
+ };
+};
+
+export default useImage;
diff --git a/web/cashtab-v2/src/hooks/useInnerScroll.js b/web/cashtab-v2/src/hooks/useInnerScroll.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/useInnerScroll.js
@@ -0,0 +1,7 @@
+import { useEffect } from 'react';
+
+export const useInnerScroll = () =>
+ useEffect(() => {
+ document.body.style.overflow = 'hidden';
+ return () => (document.body.style.overflow = '');
+ }, []);
diff --git a/web/cashtab-v2/src/hooks/useInterval.js b/web/cashtab-v2/src/hooks/useInterval.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/useInterval.js
@@ -0,0 +1,20 @@
+import { useRef, useEffect } from 'react';
+
+const useInterval = (callback, delay) => {
+ const savedCallback = useRef();
+
+ useEffect(() => {
+ savedCallback.current = callback;
+ });
+
+ useEffect(() => {
+ function tick() {
+ savedCallback.current();
+ }
+
+ let id = setInterval(tick, delay);
+ return () => clearInterval(id);
+ }, [delay]);
+};
+
+export default useInterval;
diff --git a/web/cashtab-v2/src/hooks/usePrevious.js b/web/cashtab-v2/src/hooks/usePrevious.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/usePrevious.js
@@ -0,0 +1,17 @@
+import { useRef, useEffect } from 'react';
+
+export const usePrevious = value => {
+ // The ref object is a generic container whose current property is mutable ...
+ // ... and can hold any value, similar to an instance property on a class
+ const ref = useRef();
+
+ // Store current value in ref
+ useEffect(() => {
+ ref.current = value;
+ }, [value]); // Only re-run if value changes
+
+ // Return previous value (happens before update in useEffect above)
+ return ref.current;
+};
+
+export default usePrevious;
diff --git a/web/cashtab-v2/src/hooks/useWallet.js b/web/cashtab-v2/src/hooks/useWallet.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/useWallet.js
@@ -0,0 +1,1211 @@
+/* eslint-disable react-hooks/exhaustive-deps */
+
+import { useState, useEffect } from 'react';
+import useAsyncTimeout from '@hooks/useAsyncTimeout';
+import usePrevious from '@hooks/usePrevious';
+import useBCH from '@hooks/useBCH';
+import BigNumber from 'bignumber.js';
+import {
+ fromSmallestDenomination,
+ loadStoredWallet,
+ isValidStoredWallet,
+ isLegacyMigrationRequired,
+ whichUtxosWereAdded,
+ whichUtxosWereConsumed,
+ addNewHydratedUtxos,
+ removeConsumedUtxos,
+ areAllUtxosIncludedInIncrementallyHydratedUtxos,
+} from '@utils/cashMethods';
+import { isValidCashtabSettings } from '@utils/validation';
+import localforage from 'localforage';
+import { currency } from '@components/Common/Ticker';
+import isEmpty from 'lodash.isempty';
+import isEqual from 'lodash.isequal';
+import {
+ xecReceivedNotification,
+ eTokenReceivedNotification,
+} from '@components/Common/Notifications';
+const useWallet = () => {
+ const [wallet, setWallet] = useState(false);
+ const [cashtabSettings, setCashtabSettings] = useState(false);
+ const [fiatPrice, setFiatPrice] = useState(null);
+ const [apiError, setApiError] = useState(false);
+ const [checkFiatInterval, setCheckFiatInterval] = useState(null);
+ const [hasUpdated, setHasUpdated] = useState(false);
+ const {
+ getBCH,
+ getUtxos,
+ getHydratedUtxoDetails,
+ getSlpBalancesAndUtxos,
+ getTxHistory,
+ getTxData,
+ addTokenTxData,
+ } = useBCH();
+ const [loading, setLoading] = useState(true);
+ const [apiIndex, setApiIndex] = useState(0);
+ const [BCH, setBCH] = useState(getBCH(apiIndex));
+ const { balances, tokens, utxos } = isValidStoredWallet(wallet)
+ ? wallet.state
+ : {
+ balances: {},
+ tokens: [],
+ utxos: null,
+ };
+ const previousBalances = usePrevious(balances);
+ const previousTokens = usePrevious(tokens);
+ const previousUtxos = usePrevious(utxos);
+
+ // If you catch API errors, call this function
+ const tryNextAPI = () => {
+ let currentApiIndex = apiIndex;
+ // How many APIs do you have?
+ const apiString = process.env.REACT_APP_BCHA_APIS;
+
+ const apiArray = apiString.split(',');
+
+ console.log(`You have ${apiArray.length} APIs to choose from`);
+ console.log(`Current selection: ${apiIndex}`);
+ // If only one, exit
+ if (apiArray.length === 0) {
+ console.log(
+ `There are no backup APIs, you are stuck with this error`,
+ );
+ return;
+ } else if (currentApiIndex < apiArray.length - 1) {
+ currentApiIndex += 1;
+ console.log(
+ `Incrementing API index from ${apiIndex} to ${currentApiIndex}`,
+ );
+ } else {
+ // Otherwise use the first option again
+ console.log(`Retrying first API index`);
+ currentApiIndex = 0;
+ }
+ //return setApiIndex(currentApiIndex);
+ console.log(`Setting Api Index to ${currentApiIndex}`);
+ setApiIndex(currentApiIndex);
+ return setBCH(getBCH(currentApiIndex));
+ // If you have more than one, use the next one
+ // If you are at the "end" of the array, use the first one
+ };
+
+ const normalizeSlpBalancesAndUtxos = (slpBalancesAndUtxos, wallet) => {
+ const Accounts = [wallet.Path245, wallet.Path145, wallet.Path1899];
+ slpBalancesAndUtxos.nonSlpUtxos.forEach(utxo => {
+ const derivatedAccount = Accounts.find(
+ account => account.cashAddress === utxo.address,
+ );
+ utxo.wif = derivatedAccount.fundingWif;
+ });
+
+ return slpBalancesAndUtxos;
+ };
+
+ const normalizeBalance = slpBalancesAndUtxos => {
+ const totalBalanceInSatoshis = slpBalancesAndUtxos.nonSlpUtxos.reduce(
+ (previousBalance, utxo) => previousBalance + utxo.value,
+ 0,
+ );
+ return {
+ totalBalanceInSatoshis,
+ totalBalance: fromSmallestDenomination(totalBalanceInSatoshis),
+ };
+ };
+
+ const deriveAccount = async (BCH, { masterHDNode, path }) => {
+ const node = BCH.HDNode.derivePath(masterHDNode, path);
+ const publicKey = BCH.HDNode.toPublicKey(node).toString('hex');
+ const cashAddress = BCH.HDNode.toCashAddress(node);
+ const slpAddress = BCH.SLP.Address.toSLPAddress(cashAddress);
+
+ return {
+ publicKey,
+ cashAddress,
+ slpAddress,
+ fundingWif: BCH.HDNode.toWIF(node),
+ fundingAddress: BCH.SLP.Address.toSLPAddress(cashAddress),
+ legacyAddress: BCH.SLP.Address.toLegacyAddress(cashAddress),
+ };
+ };
+
+ const loadWalletFromStorageOnStartup = async setWallet => {
+ // get wallet object from localforage
+ const wallet = await getWallet();
+ // If wallet object in storage is valid, use it to set state on startup
+ if (isValidStoredWallet(wallet)) {
+ // Convert all the token balance figures to big numbers
+ const liveWalletState = loadStoredWallet(wallet.state);
+ wallet.state = liveWalletState;
+
+ setWallet(wallet);
+ return setLoading(false);
+ }
+ // Loading will remain true until API calls populate this legacy wallet
+ setWallet(wallet);
+ };
+
+ const haveUtxosChanged = (wallet, utxos, previousUtxos) => {
+ // Relevant points for this array comparing exercise
+ // https://stackoverflow.com/questions/13757109/triple-equal-signs-return-false-for-arrays-in-javascript-why
+ // https://stackoverflow.com/questions/7837456/how-to-compare-arrays-in-javascript
+
+ // If this is initial state
+ if (utxos === null) {
+ // Then make sure to get slpBalancesAndUtxos
+ return true;
+ }
+ // If this is the first time the wallet received utxos
+ if (typeof utxos === 'undefined') {
+ // Then they have certainly changed
+ return true;
+ }
+ if (typeof previousUtxos === 'undefined') {
+ // Compare to what you have in localStorage on startup
+ // If previousUtxos are undefined, see if you have previousUtxos in wallet state
+ // If you do, and it has everything you need, set wallet state with that instead of calling hydrateUtxos on all utxos
+ if (isValidStoredWallet(wallet)) {
+ // Convert all the token balance figures to big numbers
+ const liveWalletState = loadStoredWallet(wallet.state);
+ wallet.state = liveWalletState;
+
+ return setWallet(wallet);
+ }
+ // If wallet in storage is a legacy wallet or otherwise does not have all state fields,
+ // then assume utxos have changed
+ return true;
+ }
+ // return true for empty array, since this means you definitely do not want to skip the next API call
+ if (utxos && utxos.length === 0) {
+ return true;
+ }
+
+ // If wallet is valid, compare what exists in written wallet state instead of former api call
+ let utxosToCompare = previousUtxos;
+ if (isValidStoredWallet(wallet)) {
+ try {
+ utxosToCompare = wallet.state.utxos;
+ } catch (err) {
+ console.log(`Error setting utxos to wallet.state.utxos`, err);
+ console.log(`Wallet at err`, wallet);
+ // If this happens, assume utxo set has changed
+ return true;
+ }
+ }
+
+ // Compare utxo sets
+ return !isEqual(utxos, utxosToCompare);
+ };
+
+ const update = async ({ wallet }) => {
+ //console.log(`tick()`);
+ //console.time("update");
+ try {
+ if (!wallet) {
+ return;
+ }
+ const cashAddresses = [
+ wallet.Path245.cashAddress,
+ wallet.Path145.cashAddress,
+ wallet.Path1899.cashAddress,
+ ];
+
+ const publicKeys = [
+ wallet.Path145.publicKey,
+ wallet.Path245.publicKey,
+ wallet.Path1899.publicKey,
+ ];
+
+ const utxos = await getUtxos(BCH, cashAddresses);
+
+ // If an error is returned or utxos from only 1 address are returned
+ if (!utxos || isEmpty(utxos) || utxos.error || utxos.length < 2) {
+ // Throw error here to prevent more attempted api calls
+ // as you are likely already at rate limits
+ throw new Error('Error fetching utxos');
+ }
+
+ // Need to call with wallet as a parameter rather than trusting it is in state, otherwise can sometimes get wallet=false from haveUtxosChanged
+ const utxosHaveChanged = haveUtxosChanged(
+ wallet,
+ utxos,
+ previousUtxos,
+ );
+
+ // If the utxo set has not changed,
+ if (!utxosHaveChanged) {
+ // remove api error here; otherwise it will remain if recovering from a rate
+ // limit error with an unchanged utxo set
+ setApiError(false);
+ // then wallet.state has not changed and does not need to be updated
+ //console.timeEnd("update");
+ return;
+ }
+
+ let incrementalHydratedUtxosValid;
+ let incrementallyAdjustedHydratedUtxoDetails;
+ try {
+ // Make sure you have all the required inputs to use this approach
+ if (
+ !wallet ||
+ !wallet.state ||
+ !wallet.state.utxos ||
+ !wallet.state.hydratedUtxoDetails ||
+ !utxos
+ ) {
+ throw new Error(
+ 'Wallet does not have required state for incremental approach, hydrating full utxo set',
+ );
+ }
+ const utxosAdded = whichUtxosWereAdded(
+ wallet.state.utxos,
+ utxos,
+ );
+ const utxosConsumed = whichUtxosWereConsumed(
+ wallet.state.utxos,
+ utxos,
+ );
+
+ incrementallyAdjustedHydratedUtxoDetails =
+ wallet.state.hydratedUtxoDetails;
+
+ if (utxosConsumed) {
+ incrementallyAdjustedHydratedUtxoDetails =
+ removeConsumedUtxos(
+ utxosConsumed,
+ incrementallyAdjustedHydratedUtxoDetails,
+ );
+ }
+
+ if (utxosAdded) {
+ const addedHydratedUtxos = await getHydratedUtxoDetails(
+ BCH,
+ utxosAdded,
+ );
+
+ incrementallyAdjustedHydratedUtxoDetails =
+ addNewHydratedUtxos(
+ addedHydratedUtxos,
+ incrementallyAdjustedHydratedUtxoDetails,
+ );
+ }
+
+ incrementalHydratedUtxosValid =
+ areAllUtxosIncludedInIncrementallyHydratedUtxos(
+ utxos,
+ incrementallyAdjustedHydratedUtxoDetails,
+ );
+ } catch (err) {
+ console.log(
+ `Error in incremental determination of hydratedUtxoDetails`,
+ );
+ console.log(err);
+ incrementalHydratedUtxosValid = false;
+ }
+
+ if (!incrementalHydratedUtxosValid) {
+ console.log(
+ `Incremental approach invalid, hydrating all utxos`,
+ );
+ incrementallyAdjustedHydratedUtxoDetails =
+ await getHydratedUtxoDetails(BCH, utxos);
+ }
+
+ const slpBalancesAndUtxos = await getSlpBalancesAndUtxos(
+ BCH,
+ incrementallyAdjustedHydratedUtxoDetails,
+ );
+ console.log(`slpBalancesAndUtxos`, slpBalancesAndUtxos);
+ const txHistory = await getTxHistory(BCH, cashAddresses);
+
+ // public keys are used to determined if a tx is incoming outgoing
+ const parsedTxHistory = await getTxData(
+ BCH,
+ txHistory,
+ publicKeys,
+ wallet,
+ );
+
+ const parsedWithTokens = await addTokenTxData(BCH, parsedTxHistory);
+
+ if (typeof slpBalancesAndUtxos === 'undefined') {
+ console.log(`slpBalancesAndUtxos is undefined`);
+ throw new Error('slpBalancesAndUtxos is undefined');
+ }
+ const { tokens } = slpBalancesAndUtxos;
+
+ const newState = {
+ balances: {},
+ tokens: [],
+ slpBalancesAndUtxos: [],
+ };
+
+ newState.slpBalancesAndUtxos = normalizeSlpBalancesAndUtxos(
+ slpBalancesAndUtxos,
+ wallet,
+ );
+
+ newState.balances = normalizeBalance(slpBalancesAndUtxos);
+
+ newState.tokens = tokens;
+
+ newState.parsedTxHistory = parsedWithTokens;
+
+ newState.utxos = utxos;
+
+ newState.hydratedUtxoDetails =
+ incrementallyAdjustedHydratedUtxoDetails;
+
+ // Set wallet with new state field
+ wallet.state = newState;
+ setWallet(wallet);
+
+ // Write this state to indexedDb using localForage
+ writeWalletState(wallet, newState);
+ // If everything executed correctly, remove apiError
+ setApiError(false);
+ } catch (error) {
+ console.log(`Error in update({wallet})`);
+ console.log(error);
+ // Set this in state so that transactions are disabled until the issue is resolved
+ setApiError(true);
+ //console.timeEnd("update");
+ // Try another endpoint
+ console.log(`Trying next API...`);
+ tryNextAPI();
+ }
+ //console.timeEnd("update");
+ };
+
+ const getActiveWalletFromLocalForage = async () => {
+ let wallet;
+ try {
+ wallet = await localforage.getItem('wallet');
+ } catch (err) {
+ console.log(`Error in getActiveWalletFromLocalForage`, err);
+ wallet = null;
+ }
+ return wallet;
+ };
+
+ const getWallet = async () => {
+ let wallet;
+ let existingWallet;
+ try {
+ existingWallet = await getActiveWalletFromLocalForage();
+ // existing wallet will be
+ // 1 - the 'wallet' value from localForage, if it exists
+ // 2 - false if it does not exist in localForage
+ // 3 - null if error
+
+ // If the wallet does not have Path1899, add it
+ // or each Path1899, Path145, Path245 does not have a public key, add them
+ if (existingWallet) {
+ if (isLegacyMigrationRequired(existingWallet)) {
+ console.log(
+ `Wallet does not have Path1899 or does not have public key`,
+ );
+ existingWallet = await migrateLegacyWallet(
+ BCH,
+ existingWallet,
+ );
+ }
+ }
+
+ // If not in localforage then existingWallet = false, check localstorage
+ if (!existingWallet) {
+ console.log(`no existing wallet, checking local storage`);
+ existingWallet = JSON.parse(
+ window.localStorage.getItem('wallet'),
+ );
+ console.log(`existingWallet from localStorage`, existingWallet);
+ // If you find it here, move it to indexedDb
+ if (existingWallet !== null) {
+ wallet = await getWalletDetails(existingWallet);
+ await localforage.setItem('wallet', wallet);
+ return wallet;
+ }
+ }
+ } catch (err) {
+ console.log(`Error in getWallet()`, err);
+ /*
+ Error here implies problem interacting with localForage or localStorage API
+
+ Have not seen this error in testing
+
+ In this case, you still want to return 'wallet' using the logic below based on
+ the determination of 'existingWallet' from the logic above
+ */
+ }
+
+ if (existingWallet === null || !existingWallet) {
+ wallet = await getWalletDetails(existingWallet);
+ await localforage.setItem('wallet', wallet);
+ } else {
+ wallet = existingWallet;
+ }
+ return wallet;
+ };
+
+ const migrateLegacyWallet = async (BCH, wallet) => {
+ console.log(`migrateLegacyWallet`);
+ console.log(`legacyWallet`, wallet);
+ const NETWORK = process.env.REACT_APP_NETWORK;
+ const mnemonic = wallet.mnemonic;
+ const rootSeedBuffer = await BCH.Mnemonic.toSeed(mnemonic);
+
+ let masterHDNode;
+
+ if (NETWORK === `mainnet`) {
+ masterHDNode = BCH.HDNode.fromSeed(rootSeedBuffer);
+ } else {
+ masterHDNode = BCH.HDNode.fromSeed(rootSeedBuffer, 'testnet');
+ }
+
+ const Path245 = await deriveAccount(BCH, {
+ masterHDNode,
+ path: "m/44'/245'/0'/0/0",
+ });
+ const Path145 = await deriveAccount(BCH, {
+ masterHDNode,
+ path: "m/44'/145'/0'/0/0",
+ });
+ const Path1899 = await deriveAccount(BCH, {
+ masterHDNode,
+ path: "m/44'/1899'/0'/0/0",
+ });
+
+ wallet.Path245 = Path245;
+ wallet.Path145 = Path145;
+ wallet.Path1899 = Path1899;
+
+ try {
+ await localforage.setItem('wallet', wallet);
+ } catch (err) {
+ console.log(
+ `Error setting wallet to wallet indexedDb in migrateLegacyWallet()`,
+ );
+ console.log(err);
+ }
+
+ return wallet;
+ };
+
+ const writeWalletState = async (wallet, newState) => {
+ // Add new state as an object on the active wallet
+ wallet.state = newState;
+ try {
+ await localforage.setItem('wallet', wallet);
+ } catch (err) {
+ console.log(`Error in writeWalletState()`);
+ console.log(err);
+ }
+ };
+
+ const getWalletDetails = async wallet => {
+ if (!wallet) {
+ return false;
+ }
+ // Since this info is in localforage now, only get the var
+ const NETWORK = process.env.REACT_APP_NETWORK;
+ const mnemonic = wallet.mnemonic;
+ const rootSeedBuffer = await BCH.Mnemonic.toSeed(mnemonic);
+ let masterHDNode;
+
+ if (NETWORK === `mainnet`) {
+ masterHDNode = BCH.HDNode.fromSeed(rootSeedBuffer);
+ } else {
+ masterHDNode = BCH.HDNode.fromSeed(rootSeedBuffer, 'testnet');
+ }
+
+ const Path245 = await deriveAccount(BCH, {
+ masterHDNode,
+ path: "m/44'/245'/0'/0/0",
+ });
+ const Path145 = await deriveAccount(BCH, {
+ masterHDNode,
+ path: "m/44'/145'/0'/0/0",
+ });
+ const Path1899 = await deriveAccount(BCH, {
+ masterHDNode,
+ path: "m/44'/1899'/0'/0/0",
+ });
+
+ let name = Path1899.cashAddress.slice(12, 17);
+ // Only set the name if it does not currently exist
+ if (wallet && wallet.name) {
+ name = wallet.name;
+ }
+
+ return {
+ mnemonic: wallet.mnemonic,
+ name,
+ Path245,
+ Path145,
+ Path1899,
+ };
+ };
+
+ const getSavedWallets = async activeWallet => {
+ let savedWallets;
+ try {
+ savedWallets = await localforage.getItem('savedWallets');
+ if (savedWallets === null) {
+ savedWallets = [];
+ }
+ } catch (err) {
+ console.log(`Error in getSavedWallets`);
+ console.log(err);
+ savedWallets = [];
+ }
+ // Even though the active wallet is still stored in savedWallets, don't return it in this function
+ for (let i = 0; i < savedWallets.length; i += 1) {
+ if (
+ typeof activeWallet !== 'undefined' &&
+ activeWallet.name &&
+ savedWallets[i].name === activeWallet.name
+ ) {
+ savedWallets.splice(i, 1);
+ }
+ }
+ return savedWallets;
+ };
+
+ const activateWallet = async walletToActivate => {
+ /*
+ If the user is migrating from old version to this version, make sure to save the activeWallet
+
+ 1 - check savedWallets for the previously active wallet
+ 2 - If not there, add it
+ */
+ setHasUpdated(false);
+ let currentlyActiveWallet;
+ try {
+ currentlyActiveWallet = await localforage.getItem('wallet');
+ } catch (err) {
+ console.log(
+ `Error in localforage.getItem("wallet") in activateWallet()`,
+ );
+ return false;
+ }
+ // Get savedwallets
+ let savedWallets;
+ try {
+ savedWallets = await localforage.getItem('savedWallets');
+ } catch (err) {
+ console.log(
+ `Error in localforage.getItem("savedWallets") in activateWallet()`,
+ );
+ return false;
+ }
+ /*
+ When a legacy user runs cashtab.com/, their active wallet will be migrated to Path1899 by
+ the getWallet function. getWallet function also makes sure that each Path has a public key
+
+ Wallets in savedWallets are migrated when they are activated, in this function
+
+ Two cases to handle
+
+ 1 - currentlyActiveWallet has Path1899, but its stored keyvalue pair in savedWallets does not
+ > Update savedWallets so that Path1899 is added to currentlyActiveWallet
+
+ 2 - walletToActivate does not have Path1899
+ > Update walletToActivate with Path1899 before activation
+
+ NOTE: since publicKey property is added later,
+ wallet without public key in Path1899 is also considered legacy and required migration.
+ */
+
+ // Need to handle a similar situation with state
+ // If you find the activeWallet in savedWallets but without state, resave active wallet with state
+ // Note you do not have the Case 2 described above here, as wallet state is added in the update() function of useWallet.js
+ // Also note, since state can be expected to change frequently (unlike path deriv), you will likely save it every time you activate a new wallet
+ // Check savedWallets for currentlyActiveWallet
+ let walletInSavedWallets = false;
+ for (let i = 0; i < savedWallets.length; i += 1) {
+ if (savedWallets[i].name === currentlyActiveWallet.name) {
+ walletInSavedWallets = true;
+ // Check savedWallets for unmigrated currentlyActiveWallet
+ if (isLegacyMigrationRequired(savedWallets[i])) {
+ // Case 1, described above
+ savedWallets[i].Path1899 = currentlyActiveWallet.Path1899;
+ savedWallets[i].Path145 = currentlyActiveWallet.Path145;
+ savedWallets[i].Path245 = currentlyActiveWallet.Path245;
+ }
+
+ /*
+ Update wallet state
+ Note, this makes previous `walletUnmigrated` variable redundant
+ savedWallets[i] should always be updated, since wallet state can be expected to change most of the time
+ */
+ savedWallets[i].state = currentlyActiveWallet.state;
+ }
+ }
+
+ // resave savedWallets
+ try {
+ // Set walletName as the active wallet
+ await localforage.setItem('savedWallets', savedWallets);
+ } catch (err) {
+ console.log(
+ `Error in localforage.setItem("savedWallets") in activateWallet() for unmigrated wallet`,
+ );
+ }
+
+ if (!walletInSavedWallets) {
+ console.log(`Wallet is not in saved Wallets, adding`);
+ savedWallets.push(currentlyActiveWallet);
+ // resave savedWallets
+ try {
+ // Set walletName as the active wallet
+ await localforage.setItem('savedWallets', savedWallets);
+ } catch (err) {
+ console.log(
+ `Error in localforage.setItem("savedWallets") in activateWallet()`,
+ );
+ }
+ }
+ // If wallet does not have Path1899, add it
+ // or each of the Path1899, Path145, Path245 does not have a public key, add them
+ // by calling migrateLagacyWallet()
+ if (isLegacyMigrationRequired(walletToActivate)) {
+ // Case 2, described above
+ console.log(
+ `Case 2: Wallet to activate does not have Path1899 or does not have public key in each Path`,
+ );
+ console.log(
+ `Wallet to activate from SavedWallets does not have Path1899 or does not have public key in each Path`,
+ );
+ console.log(`walletToActivate`, walletToActivate);
+ walletToActivate = await migrateLegacyWallet(BCH, walletToActivate);
+ } else {
+ // Otherwise activate it as normal
+ // Now that we have verified the last wallet was saved, we can activate the new wallet
+ try {
+ await localforage.setItem('wallet', walletToActivate);
+ } catch (err) {
+ console.log(
+ `Error in localforage.setItem("wallet", walletToActivate) in activateWallet()`,
+ );
+ return false;
+ }
+ }
+ // Make sure stored wallet is in correct format to be used as live wallet
+ if (isValidStoredWallet(walletToActivate)) {
+ // Convert all the token balance figures to big numbers
+ const liveWalletState = loadStoredWallet(walletToActivate.state);
+ walletToActivate.state = liveWalletState;
+ }
+
+ return walletToActivate;
+ };
+
+ const renameWallet = async (oldName, newName) => {
+ // Load savedWallets
+ let savedWallets;
+ try {
+ savedWallets = await localforage.getItem('savedWallets');
+ } catch (err) {
+ console.log(
+ `Error in await localforage.getItem("savedWallets") in renameWallet`,
+ );
+ console.log(err);
+ return false;
+ }
+ // Verify that no existing wallet has this name
+ for (let i = 0; i < savedWallets.length; i += 1) {
+ if (savedWallets[i].name === newName) {
+ // return an error
+ return false;
+ }
+ }
+
+ // change name of desired wallet
+ for (let i = 0; i < savedWallets.length; i += 1) {
+ if (savedWallets[i].name === oldName) {
+ // Replace the name of this entry with the new name
+ savedWallets[i].name = newName;
+ }
+ }
+ // resave savedWallets
+ try {
+ // Set walletName as the active wallet
+ await localforage.setItem('savedWallets', savedWallets);
+ } catch (err) {
+ console.log(
+ `Error in localforage.setItem("savedWallets", savedWallets) in renameWallet()`,
+ );
+ return false;
+ }
+ return true;
+ };
+
+ const deleteWallet = async walletToBeDeleted => {
+ // delete a wallet
+ // returns true if wallet is successfully deleted
+ // otherwise returns false
+ // Load savedWallets
+ let savedWallets;
+ try {
+ savedWallets = await localforage.getItem('savedWallets');
+ } catch (err) {
+ console.log(
+ `Error in await localforage.getItem("savedWallets") in deleteWallet`,
+ );
+ console.log(err);
+ return false;
+ }
+ // Iterate over to find the wallet to be deleted
+ // Verify that no existing wallet has this name
+ let walletFoundAndRemoved = false;
+ for (let i = 0; i < savedWallets.length; i += 1) {
+ if (savedWallets[i].name === walletToBeDeleted.name) {
+ // Verify it has the same mnemonic too, that's a better UUID
+ if (savedWallets[i].mnemonic === walletToBeDeleted.mnemonic) {
+ // Delete it
+ savedWallets.splice(i, 1);
+ walletFoundAndRemoved = true;
+ }
+ }
+ }
+ // If you don't find the wallet, return false
+ if (!walletFoundAndRemoved) {
+ return false;
+ }
+
+ // Resave savedWallets less the deleted wallet
+ try {
+ // Set walletName as the active wallet
+ await localforage.setItem('savedWallets', savedWallets);
+ } catch (err) {
+ console.log(
+ `Error in localforage.setItem("savedWallets", savedWallets) in deleteWallet()`,
+ );
+ return false;
+ }
+ return true;
+ };
+
+ const addNewSavedWallet = async importMnemonic => {
+ // Add a new wallet to savedWallets from importMnemonic or just new wallet
+ const lang = 'english';
+ // create 128 bit BIP39 mnemonic
+ const Bip39128BitMnemonic = importMnemonic
+ ? importMnemonic
+ : BCH.Mnemonic.generate(128, BCH.Mnemonic.wordLists()[lang]);
+ const newSavedWallet = await getWalletDetails({
+ mnemonic: Bip39128BitMnemonic.toString(),
+ });
+ // Get saved wallets
+ let savedWallets;
+ try {
+ savedWallets = await localforage.getItem('savedWallets');
+ // If this doesn't exist yet, savedWallets === null
+ if (savedWallets === null) {
+ savedWallets = [];
+ }
+ } catch (err) {
+ console.log(
+ `Error in savedWallets = await localforage.getItem("savedWallets") in addNewSavedWallet()`,
+ );
+ console.log(err);
+ console.log(`savedWallets in error state`, savedWallets);
+ }
+ // If this wallet is from an imported mnemonic, make sure it does not already exist in savedWallets
+ if (importMnemonic) {
+ for (let i = 0; i < savedWallets.length; i += 1) {
+ // Check for condition "importing new wallet that is already in savedWallets"
+ if (savedWallets[i].mnemonic === importMnemonic) {
+ // set this as the active wallet to keep name history
+ console.log(
+ `Error: this wallet already exists in savedWallets`,
+ );
+ console.log(`Wallet not being added.`);
+ return false;
+ }
+ }
+ }
+ // add newSavedWallet
+ savedWallets.push(newSavedWallet);
+ // update savedWallets
+ try {
+ await localforage.setItem('savedWallets', savedWallets);
+ } catch (err) {
+ console.log(
+ `Error in localforage.setItem("savedWallets", activeWallet) called in createWallet with ${importMnemonic}`,
+ );
+ console.log(`savedWallets`, savedWallets);
+ console.log(err);
+ }
+ return true;
+ };
+
+ const createWallet = async importMnemonic => {
+ const lang = 'english';
+ // create 128 bit BIP39 mnemonic
+ const Bip39128BitMnemonic = importMnemonic
+ ? importMnemonic
+ : BCH.Mnemonic.generate(128, BCH.Mnemonic.wordLists()[lang]);
+ const wallet = await getWalletDetails({
+ mnemonic: Bip39128BitMnemonic.toString(),
+ });
+
+ try {
+ await localforage.setItem('wallet', wallet);
+ } catch (err) {
+ console.log(
+ `Error setting wallet to wallet indexedDb in createWallet()`,
+ );
+ console.log(err);
+ }
+ // Since this function is only called from OnBoarding.js, also add this to the saved wallet
+ try {
+ await localforage.setItem('savedWallets', [wallet]);
+ } catch (err) {
+ console.log(
+ `Error setting wallet to savedWallets indexedDb in createWallet()`,
+ );
+ console.log(err);
+ }
+ return wallet;
+ };
+
+ const validateMnemonic = (
+ mnemonic,
+ wordlist = BCH.Mnemonic.wordLists().english,
+ ) => {
+ let mnemonicTestOutput;
+
+ try {
+ mnemonicTestOutput = BCH.Mnemonic.validate(mnemonic, wordlist);
+
+ if (mnemonicTestOutput === 'Valid mnemonic') {
+ return true;
+ } else {
+ return false;
+ }
+ } catch (err) {
+ console.log(err);
+ return false;
+ }
+ };
+
+ const handleUpdateWallet = async setWallet => {
+ await loadWalletFromStorageOnStartup(setWallet);
+ };
+
+ const loadCashtabSettings = async () => {
+ // get settings object from localforage
+ let localSettings;
+ try {
+ localSettings = await localforage.getItem('settings');
+ // If there is no keyvalue pair in localforage with key 'settings'
+ if (localSettings === null) {
+ // Create one with the default settings from Ticker.js
+ localforage.setItem('settings', currency.defaultSettings);
+ // Set state to default settings
+ setCashtabSettings(currency.defaultSettings);
+ return currency.defaultSettings;
+ }
+ } catch (err) {
+ console.log(`Error getting cashtabSettings`, err);
+ // TODO If they do not exist, write them
+ // TODO add function to change them
+ setCashtabSettings(currency.defaultSettings);
+ return currency.defaultSettings;
+ }
+ // If you found an object in localforage at the settings key, make sure it's valid
+ if (isValidCashtabSettings(localSettings)) {
+ setCashtabSettings(localSettings);
+ return localSettings;
+ }
+ // if not valid, also set cashtabSettings to default
+ setCashtabSettings(currency.defaultSettings);
+ return currency.defaultSettings;
+ };
+
+ // With different currency selections possible, need unique intervals for price checks
+ // Must be able to end them and set new ones with new currencies
+ const initializeFiatPriceApi = async selectedFiatCurrency => {
+ // Update fiat price and confirm it is set to make sure ap keeps loading state until this is updated
+ await fetchBchPrice(selectedFiatCurrency);
+ // Set interval for updating the price with given currency
+
+ const thisFiatInterval = setInterval(function () {
+ fetchBchPrice(selectedFiatCurrency);
+ }, 60000);
+
+ // set interval in state
+ setCheckFiatInterval(thisFiatInterval);
+ };
+
+ const clearFiatPriceApi = fiatPriceApi => {
+ // Clear fiat price check interval of previously selected currency
+ clearInterval(fiatPriceApi);
+ };
+
+ const changeCashtabSettings = async (key, newValue) => {
+ // Set loading to true as you do not want to display the fiat price of the last currency
+ // loading = true will lock the UI until the fiat price has updated
+ setLoading(true);
+ // Get settings from localforage
+ let currentSettings;
+ let newSettings;
+ try {
+ currentSettings = await localforage.getItem('settings');
+ } catch (err) {
+ console.log(`Error in changeCashtabSettings`, err);
+ // Set fiat price to null, which disables fiat sends throughout the app
+ setFiatPrice(null);
+ // Unlock the UI
+ setLoading(false);
+ return;
+ }
+
+ // Make sure function was called with valid params
+ if (currency.settingsValidation[key].includes(newValue)) {
+ // Update settings
+ newSettings = currentSettings;
+ newSettings[key] = newValue;
+ } else {
+ // Set fiat price to null, which disables fiat sends throughout the app
+ setFiatPrice(null);
+ // Unlock the UI
+ setLoading(false);
+ return;
+ }
+ // Set new settings in state so they are available in context throughout the app
+ setCashtabSettings(newSettings);
+ // If this settings change adjusted the fiat currency, update fiat price
+ if (key === 'fiatCurrency') {
+ clearFiatPriceApi(checkFiatInterval);
+ initializeFiatPriceApi(newValue);
+ }
+ // Write new settings in localforage
+ try {
+ await localforage.setItem('settings', newSettings);
+ } catch (err) {
+ console.log(
+ `Error writing newSettings object to localforage in changeCashtabSettings`,
+ err,
+ );
+ console.log(`newSettings`, newSettings);
+ // do nothing. If this happens, the user will see default currency next time they load the app.
+ }
+ setLoading(false);
+ };
+
+ // Parse for incoming XEC transactions
+ // hasUpdated is set to true in the useAsyncTimeout function, and re-sets to false during activateWallet
+ if (
+ previousBalances &&
+ balances &&
+ 'totalBalance' in previousBalances &&
+ 'totalBalance' in balances &&
+ new BigNumber(balances.totalBalance)
+ .minus(previousBalances.totalBalance)
+ .gt(0) &&
+ hasUpdated
+ ) {
+ xecReceivedNotification(
+ balances,
+ previousBalances,
+ cashtabSettings,
+ fiatPrice,
+ );
+ }
+
+ // Parse for incoming eToken transactions
+ if (
+ tokens &&
+ tokens[0] &&
+ tokens[0].balance &&
+ previousTokens &&
+ previousTokens[0] &&
+ previousTokens[0].balance &&
+ hasUpdated === true
+ ) {
+ // If tokens length is greater than previousTokens length, a new token has been received
+ // Note, a user could receive a new token, AND more of existing tokens in between app updates
+ // In this case, the app will only notify about the new token
+ // TODO better handling for all possible cases to cover this
+ // TODO handle with websockets for better response time, less complicated calc
+ if (tokens.length > previousTokens.length) {
+ // Find the new token
+ const tokenIds = tokens.map(({ tokenId }) => tokenId);
+ const previousTokenIds = previousTokens.map(
+ ({ tokenId }) => tokenId,
+ );
+ //console.log(`tokenIds`, tokenIds);
+ //console.log(`previousTokenIds`, previousTokenIds);
+
+ // An array with the new token Id
+ const newTokenIdArr = tokenIds.filter(
+ tokenId => !previousTokenIds.includes(tokenId),
+ );
+ // It's possible that 2 new tokens were received
+ // To do, handle this case
+ const newTokenId = newTokenIdArr[0];
+ //console.log(newTokenId);
+
+ // How much of this tokenId did you get?
+ // would be at
+
+ // Find where the newTokenId is
+ const receivedTokenObjectIndex = tokens.findIndex(
+ x => x.tokenId === newTokenId,
+ );
+ //console.log(`receivedTokenObjectIndex`, receivedTokenObjectIndex);
+ // Calculate amount received
+ //console.log(`receivedTokenObject:`, tokens[receivedTokenObjectIndex]);
+
+ const receivedSlpQty =
+ tokens[receivedTokenObjectIndex].balance.toString();
+ const receivedSlpTicker =
+ tokens[receivedTokenObjectIndex].info.tokenTicker;
+ const receivedSlpName =
+ tokens[receivedTokenObjectIndex].info.tokenName;
+ //console.log(`receivedSlpQty`, receivedSlpQty);
+
+ // Notification if you received SLP
+ if (receivedSlpQty > 0) {
+ eTokenReceivedNotification(
+ currency,
+ receivedSlpTicker,
+ receivedSlpQty,
+ receivedSlpName,
+ );
+ }
+ //
+ } else {
+ // If tokens[i].balance > previousTokens[i].balance, a new SLP tx of an existing token has been received
+ // Note that tokens[i].balance is of type BigNumber
+ for (let i = 0; i < tokens.length; i += 1) {
+ if (tokens[i].balance.gt(previousTokens[i].balance)) {
+ // Received this token
+ // console.log(`previousTokenId`, previousTokens[i].tokenId);
+ // console.log(`currentTokenId`, tokens[i].tokenId);
+
+ if (previousTokens[i].tokenId !== tokens[i].tokenId) {
+ console.log(
+ `TokenIds do not match, breaking from SLP notifications`,
+ );
+ // Then don't send the notification
+ // Also don't 'continue' ; this means you have sent a token, just stop iterating through
+ break;
+ }
+ const receivedSlpQty = tokens[i].balance.minus(
+ previousTokens[i].balance,
+ );
+
+ const receivedSlpTicker = tokens[i].info.tokenTicker;
+ const receivedSlpName = tokens[i].info.tokenName;
+
+ eTokenReceivedNotification(
+ currency,
+ receivedSlpTicker,
+ receivedSlpQty,
+ receivedSlpName,
+ );
+ }
+ }
+ }
+ }
+
+ // Update wallet every 10s
+ useAsyncTimeout(async () => {
+ const wallet = await getWallet();
+ update({
+ wallet,
+ }).finally(() => {
+ setLoading(false);
+ if (!hasUpdated) {
+ setHasUpdated(true);
+ }
+ });
+ }, 1000);
+
+ const fetchBchPrice = async (
+ fiatCode = cashtabSettings ? cashtabSettings.fiatCurrency : 'usd',
+ ) => {
+ // Split this variable out in case coingecko changes
+ const cryptoId = currency.coingeckoId;
+ // Keep this in the code, because different URLs will have different outputs require different parsing
+ const priceApiUrl = `https://api.coingecko.com/api/v3/simple/price?ids=${cryptoId}&vs_currencies=${fiatCode}&include_last_updated_at=true`;
+ let bchPrice;
+ let bchPriceJson;
+ try {
+ bchPrice = await fetch(priceApiUrl);
+ //console.log(`bchPrice`, bchPrice);
+ } catch (err) {
+ console.log(`Error fetching BCH Price`);
+ console.log(err);
+ }
+ try {
+ bchPriceJson = await bchPrice.json();
+ //console.log(`bchPriceJson`, bchPriceJson);
+ let bchPriceInFiat = bchPriceJson[cryptoId][fiatCode];
+
+ const validEcashPrice = typeof bchPriceInFiat === 'number';
+
+ if (validEcashPrice) {
+ setFiatPrice(bchPriceInFiat);
+ } else {
+ // If API price looks fishy, do not allow app to send using fiat settings
+ setFiatPrice(null);
+ }
+ } catch (err) {
+ console.log(`Error parsing price API response to JSON`);
+ console.log(err);
+ }
+ };
+
+ useEffect(async () => {
+ handleUpdateWallet(setWallet);
+ const initialSettings = await loadCashtabSettings();
+ initializeFiatPriceApi(initialSettings.fiatCurrency);
+ }, []);
+
+ return {
+ BCH,
+ wallet,
+ fiatPrice,
+ loading,
+ apiError,
+ cashtabSettings,
+ changeCashtabSettings,
+ getActiveWalletFromLocalForage,
+ getWallet,
+ validateMnemonic,
+ getWalletDetails,
+ getSavedWallets,
+ migrateLegacyWallet,
+ createWallet: async importMnemonic => {
+ setLoading(true);
+ const newWallet = await createWallet(importMnemonic);
+ setWallet(newWallet);
+ update({
+ wallet: newWallet,
+ }).finally(() => setLoading(false));
+ },
+ activateWallet: async walletToActivate => {
+ setLoading(true);
+ const newWallet = await activateWallet(walletToActivate);
+ setWallet(newWallet);
+ if (isValidStoredWallet(walletToActivate)) {
+ // If you have all state parameters needed in storage, immediately load the wallet
+ setLoading(false);
+ } else {
+ // If the wallet is missing state parameters in storage, wait for API info
+ // This handles case of unmigrated legacy wallet
+ update({
+ wallet: newWallet,
+ }).finally(() => setLoading(false));
+ }
+ },
+ addNewSavedWallet,
+ renameWallet,
+ deleteWallet,
+ };
+};
+
+export default useWallet;
diff --git a/web/cashtab-v2/src/hooks/useWebAuthentication.js b/web/cashtab-v2/src/hooks/useWebAuthentication.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/useWebAuthentication.js
@@ -0,0 +1,238 @@
+import { useState, useEffect } from 'react';
+import localforage from 'localforage';
+import { currency } from '@components/Common/Ticker';
+import {
+ convertBase64ToArrayBuffer,
+ convertArrayBufferToBase64,
+} from '@utils/convertArrBuffBase64';
+
+// return an Authentication Object
+// OR null if user device does not support Web Authentication
+const useWebAuthentication = () => {
+ const [isWebAuthnSupported, setIsWebAuthnSupported] = useState(false);
+ // Possible values of isAuthenticationRequired:
+ // true - YES, authentication is required
+ // false - NO, authentication is not required
+ // undefined - has not been set, this is the first time the app runs
+ const [isAuthenticationRequired, setIsAuthenticationRequired] =
+ useState(undefined);
+ const [credentialId, setCredentialId] = useState(null);
+ const [isSignedIn, setIsSignedIn] = useState(false);
+ const [userId, setUserId] = useState(Date.now().toString(16));
+ const [loading, setLoading] = useState(true);
+
+ const loadAuthenticationConfigFromLocalStorage = async () => {
+ // try to load authentication configuration from local storage
+ try {
+ return await localforage.getItem('authenticationConfig');
+ } catch (err) {
+ console.error(
+ 'Error is localforange.getItem("authenticatonConfig") in loadAuthenticationConfigFromLocalStorage() in useWebAuthentication()',
+ );
+ // Should stop when attempting to read from localstorage failed
+ // countinuing would prompt user to register new credential
+ // that would risk overrididing existing credential
+ throw err;
+ }
+ };
+
+ const saveAuthenticationConfigToLocalStorage = () => {
+ try {
+ return localforage.setItem('authenticationConfig', {
+ isAuthenticationRequired,
+ userId,
+ credentialId,
+ });
+ } catch (err) {
+ console.error(
+ 'Error is localforange.setItem("authenticatonConfig") in saveAuthenticationConfigToLocalStorage() in useWebAuthentication()',
+ );
+ throw err;
+ }
+ };
+
+ // Run Once
+ useEffect(async () => {
+ // check to see if user device supports User Verification
+ const available =
+ await window.PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();
+ // only attempt to save/load authentication configuration from local storage if web authetication is supported
+ if (available) {
+ const authenticationConfig =
+ await loadAuthenticationConfigFromLocalStorage();
+ // if this is the first time the app is run, then save the default config value
+ if (authenticationConfig === null) {
+ saveAuthenticationConfigToLocalStorage();
+ } else {
+ setUserId(authenticationConfig.userId);
+ setCredentialId(authenticationConfig.credentialId);
+ setIsAuthenticationRequired(
+ authenticationConfig.isAuthenticationRequired,
+ );
+ }
+ // signout the user when the app is not visible (minimize the browser, switch tab, switch app window)
+ const handleDocVisibilityChange = () => {
+ if (document.visibilityState !== 'visible')
+ setIsSignedIn(false);
+ };
+ document.addEventListener(
+ 'visibilitychange',
+ handleDocVisibilityChange,
+ );
+
+ setIsWebAuthnSupported(available);
+ setLoading(false);
+
+ return () => {
+ document.removeEventListener(
+ 'visibilitychange',
+ handleDocVisibilityChange,
+ );
+ };
+ }
+ }, []);
+
+ // save the config whenever it is changed
+ useEffect(async () => {
+ if (isAuthenticationRequired === undefined) return;
+ await saveAuthenticationConfigToLocalStorage();
+ }, [isAuthenticationRequired, credentialId]);
+
+ // options for PublicKeyCredentialCreation
+ const publicKeyCredentialCreationOptions = {
+ // hardcode for now
+ // consider generating random string and then verifying it against the reponse from authenticator
+ challenge: Uint8Array.from('cashtab-wallet-for-ecash', c =>
+ c.charCodeAt(0),
+ ),
+ rp: {
+ name: currency.name,
+ id: document.domain,
+ },
+ user: {
+ id: Uint8Array.from(userId, c => c.charCodeAt(0)),
+ name: `Local User`,
+ displayName: 'Local User',
+ },
+ pubKeyCredParams: [
+ { alg: -7, type: 'public-key' },
+ { alg: -35, type: 'public-key' },
+ { alg: -36, type: 'public-key' },
+ { alg: -257, type: 'public-key' },
+ { alg: -258, type: 'public-key' },
+ { alg: -259, type: 'public-key' },
+ { alg: -37, type: 'public-key' },
+ { alg: -38, type: 'public-key' },
+ { alg: -39, type: 'public-key' },
+ { alg: -8, type: 'public-key' },
+ ],
+ authenticatorSelection: {
+ userVerification: 'required',
+ authenticatorAttachment: 'platform',
+ requireResidentKey: false,
+ },
+ timeout: 60000,
+ attestation: 'none',
+ excludeCredentials: [],
+ extensions: {},
+ };
+
+ // options for PublicKeyCredentialRequest
+ const publickKeyRequestOptions = {
+ // hardcode for now
+ // consider generating random string and then verifying it against the reponse from authenticator
+ challenge: Uint8Array.from('cashtab-wallet-for-ecash', c =>
+ c.charCodeAt(0),
+ ),
+ timeout: 60000,
+ // rpId: document.domain,
+ allowCredentials: [
+ {
+ type: 'public-key',
+ // the credentialId is stored as base64
+ // need to convert it to ArrayBuffer
+ id: convertBase64ToArrayBuffer(credentialId),
+ transports: ['internal'],
+ },
+ ],
+ userVerification: 'required',
+ extensions: {},
+ };
+
+ const authentication = {
+ isAuthenticationRequired,
+ credentialId,
+ isSignedIn,
+ loading,
+ turnOnAuthentication: () => {
+ // Need to make sure that the credetialId is set
+ // before turning on the authentication requirement
+ // otherwise, user will be locked out of the app
+ // in other words, user must sign up / register first
+ if (credentialId) {
+ setIsAuthenticationRequired(true);
+ }
+ },
+ turnOffAuthentication: () => {
+ setIsAuthenticationRequired(false);
+ },
+
+ signUp: async () => {
+ try {
+ const publicKeyCredential = await navigator.credentials.create({
+ publicKey: publicKeyCredentialCreationOptions,
+ });
+ if (publicKeyCredential) {
+ // convert the rawId from ArrayBuffer to base64 String
+ const base64Id = convertArrayBufferToBase64(
+ publicKeyCredential.rawId,
+ );
+ setIsSignedIn(true);
+ setCredentialId(base64Id);
+ setIsAuthenticationRequired(true);
+ } else {
+ throw new Error(
+ 'Error: navigator.credentials.create() returns null, in signUp()',
+ );
+ }
+ } catch (err) {
+ throw err;
+ }
+ },
+
+ signIn: async () => {
+ try {
+ const assertion = await navigator.credentials.get({
+ publicKey: publickKeyRequestOptions,
+ });
+ if (assertion) {
+ // convert rawId from ArrayBuffer to base64 String
+ const base64Id = convertArrayBufferToBase64(
+ assertion.rawId,
+ );
+ if (base64Id === credentialId) setIsSignedIn(true);
+ } else {
+ throw new Error(
+ 'Error: navigator.credentials.get() returns null, signIn()',
+ );
+ }
+ } catch (err) {
+ throw err;
+ }
+ },
+
+ signOut: () => {
+ setIsSignedIn(false);
+ },
+ };
+
+ // Web Authentication support on a user's device may become unavailable due to various reasons
+ // (hardware failure, OS problems, the behaviour of some authenticators after several failed authentication attempts, etc)
+ // If this is the case, and user has previous enabled the lock, the decision here is to lock up the wallet.
+ // Otherwise, malicious user needs to simply disbale the platform authenticator to gain access to the wallet
+ return !isWebAuthnSupported && !isAuthenticationRequired
+ ? null
+ : authentication;
+};
+
+export default useWebAuthentication;
diff --git a/web/cashtab-v2/src/hooks/useWindowDimensions.js b/web/cashtab-v2/src/hooks/useWindowDimensions.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/hooks/useWindowDimensions.js
@@ -0,0 +1,29 @@
+import { useState, useEffect } from 'react';
+
+// From this stack overflow thread:
+// https://stackoverflow.com/questions/36862334/get-viewport-window-height-in-reactjs
+
+function getWindowDimensions() {
+ const { innerWidth: width, innerHeight: height } = window;
+ return {
+ width,
+ height,
+ };
+}
+
+export default function useWindowDimensions() {
+ const [windowDimensions, setWindowDimensions] = useState(
+ getWindowDimensions(),
+ );
+
+ useEffect(() => {
+ function handleResize() {
+ setWindowDimensions(getWindowDimensions());
+ }
+
+ window.addEventListener('resize', handleResize);
+ return () => window.removeEventListener('resize', handleResize);
+ }, []);
+
+ return windowDimensions;
+}
diff --git a/web/cashtab-v2/src/index.css b/web/cashtab-v2/src/index.css
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/index.css
@@ -0,0 +1,13 @@
+body {
+ margin: 0;
+ font-family: 'Ubuntu', -apple-system, BlinkMacSystemFont, 'Segoe UI',
+ 'Roboto', 'Oxygen', 'Cantarell', 'Fira Sans', 'Droid Sans',
+ 'Helvetica Neue', sans-serif;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+code {
+ font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
+ monospace;
+}
diff --git a/web/cashtab-v2/src/index.js b/web/cashtab-v2/src/index.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/index.js
@@ -0,0 +1,29 @@
+import React from 'react';
+import ReactDOM from 'react-dom';
+import './index.css';
+import App from './components/App';
+import { AuthenticationProvider, WalletProvider } from './utils/context';
+import { HashRouter as Router } from 'react-router-dom';
+import GA from './utils/GoogleAnalytics';
+
+ReactDOM.render(
+ <AuthenticationProvider>
+ <WalletProvider>
+ <Router>
+ {GA.init() && <GA.RouteTracker />}
+ <App />
+ </Router>
+ </WalletProvider>
+ </AuthenticationProvider>,
+ document.getElementById('root'),
+);
+
+if ('serviceWorker' in navigator) {
+ window.addEventListener('load', () =>
+ navigator.serviceWorker.register('/serviceWorker.js').catch(() => null),
+ );
+}
+
+if (module.hot) {
+ module.hot.accept();
+}
diff --git a/web/cashtab-v2/src/serviceWorker.js b/web/cashtab-v2/src/serviceWorker.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/serviceWorker.js
@@ -0,0 +1,105 @@
+import { clientsClaim } from 'workbox-core';
+import { setCacheNameDetails } from 'workbox-core';
+import { precacheAndRoute } from 'workbox-precaching';
+import { registerRoute } from 'workbox-routing';
+import { CacheFirst } from 'workbox-strategies';
+import { ExpirationPlugin } from 'workbox-expiration';
+
+clientsClaim();
+self.skipWaiting();
+
+// cofingure prefix, suffix, and cacheNames
+const prefix = 'cashtab';
+const suffix = 'v1.0.1';
+const staticAssetsCache = `static-assets`;
+
+// configure prefix and suffix for default cache names
+setCacheNameDetails({
+ prefix: prefix,
+ suffix: suffix,
+ precache: staticAssetsCache,
+});
+
+// injection point for static assets caching
+precacheAndRoute(self.__WB_MANIFEST);
+
+// A response is only cacheable if
+// - status code is 200
+// - it has a blockhash - meaning it has been confirmed
+const isResponseCacheable = async (
+ response,
+ checkResponseDataForCacheableConditons,
+) => {
+ // TODO: add error checking
+ // response must be of type Response
+ // checkResponseDataForCacheableConditons() must be a function
+ let cachable = false;
+ if (response && response.status === 200) {
+ const clonedResponse = response.clone();
+ const clonedResponseData = await clonedResponse.json();
+ if (checkResponseDataForCacheableConditons(clonedResponseData)) {
+ cachable = true;
+ }
+ }
+
+ return cachable;
+};
+
+const createCustomPlugin = checkResponseDataForCacheableConditons => {
+ return {
+ cacheWillUpdate: async ({ response }) => {
+ const cacheable = await isResponseCacheable(
+ response,
+ checkResponseDataForCacheableConditons,
+ );
+ if (cacheable) {
+ return response;
+ }
+ return null;
+ },
+ };
+};
+
+const blockhashExistsInTxResponse = responseBodyJson => {
+ return responseBodyJson && responseBodyJson.blockhash;
+};
+
+const blockhashExistsInSlpTxResponse = responseBodyJson => {
+ return (
+ responseBodyJson &&
+ responseBodyJson.retData &&
+ responseBodyJson.retData.blockhash
+ );
+};
+
+// Caching TX and Token Details using CacheFirst Strategy
+const txDetailsCaches = [
+ {
+ // ecash tx
+ path: '/rawtransactions/getRawTransaction/',
+ name: `${prefix}-tx-data-${suffix}`,
+ customPlugin: createCustomPlugin(blockhashExistsInTxResponse),
+ },
+ {
+ // slp tx
+ path: '/slp/txDetails/',
+ name: `${prefix}-slp-tx-data-${suffix}`,
+ customPlugin: createCustomPlugin(blockhashExistsInSlpTxResponse),
+ },
+];
+
+txDetailsCaches.forEach(cache => {
+ registerRoute(
+ ({ url }) => url.pathname.includes(cache.path),
+ new CacheFirst({
+ cacheName: cache.name,
+ plugins: [
+ cache.customPlugin,
+ new ExpirationPlugin({
+ maxEntries: 1000,
+ maxAgeSeconds: 365 * 24 * 60 * 60,
+ }),
+ ],
+ }),
+ );
+});
diff --git a/web/cashtab-v2/src/utils/GoogleAnalytics.js b/web/cashtab-v2/src/utils/GoogleAnalytics.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/GoogleAnalytics.js
@@ -0,0 +1,77 @@
+// utils/GoogleAnalytics.js
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import * as ReactGA from 'react-ga';
+import { Route } from 'react-router-dom';
+
+class GoogleAnalytics extends Component {
+ componentDidMount() {
+ this.logPageChange(
+ this.props.location.pathname,
+ this.props.location.search,
+ );
+ }
+
+ componentDidUpdate({ location: prevLocation }) {
+ const {
+ location: { pathname, search },
+ } = this.props;
+ const isDifferentPathname = pathname !== prevLocation.pathname;
+ const isDifferentSearch = search !== prevLocation.search;
+
+ if (isDifferentPathname || isDifferentSearch) {
+ this.logPageChange(pathname, search);
+ }
+ }
+
+ logPageChange(pathname, search = '') {
+ const page = pathname + search;
+ const { location } = window;
+ ReactGA.set({
+ page,
+ location: `${location.origin}${page}`,
+ ...this.props.options,
+ });
+ ReactGA.pageview(page);
+ }
+
+ render() {
+ return null;
+ }
+}
+
+GoogleAnalytics.propTypes = {
+ location: PropTypes.shape({
+ pathname: PropTypes.string,
+ search: PropTypes.string,
+ }).isRequired,
+ options: PropTypes.object,
+};
+
+const RouteTracker = () => <Route component={GoogleAnalytics} />;
+
+const init = (options = {}) => {
+ const isGAEnabled = process.env.NODE_ENV === 'production';
+
+ if (isGAEnabled) {
+ ReactGA.initialize('UA-183678810-1');
+ }
+
+ return isGAEnabled;
+};
+
+export const Event = (category, action, label) => {
+ ReactGA.event({
+ category: category,
+ action: action,
+ label: label,
+ });
+};
+
+const GoogleAnalyticsDefault = {
+ GoogleAnalytics,
+ RouteTracker,
+ init,
+};
+
+export default GoogleAnalyticsDefault;
diff --git a/web/cashtab-v2/src/utils/__mocks__/flattenBatchedHydratedUtxosMocks.js b/web/cashtab-v2/src/utils/__mocks__/flattenBatchedHydratedUtxosMocks.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/__mocks__/flattenBatchedHydratedUtxosMocks.js
@@ -0,0 +1,2600 @@
+// @generated
+
+export const unflattenedHydrateUtxosResponse = [
+ {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 681187,
+ tx_hash:
+ '0d391574918bf5ecbb00fa0c48d2a88be80c4b86a421992309f28871186b40fe',
+ tx_pos: 0,
+ value: 1000,
+ txid: '0d391574918bf5ecbb00fa0c48d2a88be80c4b86a421992309f28871186b40fe',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '09eb70948f37e22eda0e425daed577cbb665794fea8b69da558700aabf95d9ab',
+ tx_pos: 0,
+ value: 2000,
+ txid: '09eb70948f37e22eda0e425daed577cbb665794fea8b69da558700aabf95d9ab',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '0bdfe5a8eae0b00ad18d4fe2dba0ec20e661a8739348163bef484a90e049fa17',
+ tx_pos: 0,
+ value: 9000,
+ txid: '0bdfe5a8eae0b00ad18d4fe2dba0ec20e661a8739348163bef484a90e049fa17',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '12db7f983196388991f901bb76da6f00cbb7ce8261d5a3194ea34bc4ee03b218',
+ tx_pos: 0,
+ value: 11000,
+ txid: '12db7f983196388991f901bb76da6f00cbb7ce8261d5a3194ea34bc4ee03b218',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '31ad22a45f2510044407df031f97816006295d0a4f1e424a38835865010a107b',
+ tx_pos: 0,
+ value: 7000,
+ txid: '31ad22a45f2510044407df031f97816006295d0a4f1e424a38835865010a107b',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '5b74e05ced6b7d862fe9cab94071b2ccfa475c0cef94b90c7edb8a06f90e5ad6',
+ tx_pos: 1,
+ value: 546,
+ txid: '5b74e05ced6b7d862fe9cab94071b2ccfa475c0cef94b90c7edb8a06f90e5ad6',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '1e-7',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '76c473666913b517a34c25a00a06e8da128267b832a8be900db59cbe3de36b77',
+ tx_pos: 0,
+ value: 12000,
+ txid: '76c473666913b517a34c25a00a06e8da128267b832a8be900db59cbe3de36b77',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '9d5399046bf89de7d1d1f725066d1c9a9eb26877d622f0236b5bd0b59dbc55c9',
+ tx_pos: 0,
+ value: 8000,
+ txid: '9d5399046bf89de7d1d1f725066d1c9a9eb26877d622f0236b5bd0b59dbc55c9',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'a6347e8b522835ef1592996b668a87290f44cc26eec7f41a20f7b3a2f1e7ae31',
+ tx_pos: 0,
+ value: 10000,
+ txid: 'a6347e8b522835ef1592996b668a87290f44cc26eec7f41a20f7b3a2f1e7ae31',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'cc3f8684f9fbeffa8e9142c3c29c411d267a20bc758e0230f3ac60082b1409c4',
+ tx_pos: 0,
+ value: 3000,
+ txid: 'cc3f8684f9fbeffa8e9142c3c29c411d267a20bc758e0230f3ac60082b1409c4',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+ },
+ {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 681188,
+ tx_hash:
+ 'd491dc4ae9959bd6e95ad733eec1f97977b7d7fe400e83a47277a337d4e2ea43',
+ tx_pos: 0,
+ value: 6000,
+ txid: 'd491dc4ae9959bd6e95ad733eec1f97977b7d7fe400e83a47277a337d4e2ea43',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'd736a55663aa176581b6484e0d3b499cbf7ad1a57e6fc9ac547cec67b41fd0ba',
+ tx_pos: 0,
+ value: 4000,
+ txid: 'd736a55663aa176581b6484e0d3b499cbf7ad1a57e6fc9ac547cec67b41fd0ba',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'e7a70afaf07ca689066ed36facc7c86b0e24da2d4c5fa6f5e1fd1806f5a39ec2',
+ tx_pos: 0,
+ value: 5000,
+ txid: 'e7a70afaf07ca689066ed36facc7c86b0e24da2d4c5fa6f5e1fd1806f5a39ec2',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '0aacdb7d85c466a7d6d4edf127883da40b05617d9c4ff7493bde3c973f22231d',
+ tx_pos: 1,
+ value: 546,
+ txid: '0aacdb7d85c466a7d6d4edf127883da40b05617d9c4ff7493bde3c973f22231d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '10',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '2cc8f480e9adfb74aff7351bdbbf12ed8972e35fb8bd0f43b9ea5e4aeaec5693',
+ tx_pos: 1,
+ value: 546,
+ txid: '2cc8f480e9adfb74aff7351bdbbf12ed8972e35fb8bd0f43b9ea5e4aeaec5693',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '6',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '36bdf8461dbc19ff46681e9bcb6d5312c8d276ef17779ff8016d647594c39991',
+ tx_pos: 1,
+ value: 546,
+ txid: '36bdf8461dbc19ff46681e9bcb6d5312c8d276ef17779ff8016d647594c39991',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '4',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '6b1476b65d3e29248c3809e18add16cddfee9e1d9a7060df97b35e517e8b7131',
+ tx_pos: 1,
+ value: 546,
+ txid: '6b1476b65d3e29248c3809e18add16cddfee9e1d9a7060df97b35e517e8b7131',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '7',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '986dc9f9cc91e9976f2a8470805ab3b6bccfd4eaf224cdfa35bb62294bd8aac3',
+ tx_pos: 1,
+ value: 546,
+ txid: '986dc9f9cc91e9976f2a8470805ab3b6bccfd4eaf224cdfa35bb62294bd8aac3',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'c4ef58f111ae86c7e1a9be4d5b553de6f6061b4bdca130d360c4e18476679ad7',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c4ef58f111ae86c7e1a9be4d5b553de6f6061b4bdca130d360c4e18476679ad7',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'c551e9ea96ce844bb1aaee65c99a312bb5fa66f8f822ab45dec63c7c3b77bbe5',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c551e9ea96ce844bb1aaee65c99a312bb5fa66f8f822ab45dec63c7c3b77bbe5',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '5',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+ },
+ {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 681189,
+ tx_hash:
+ 'da2af7958ab41e892c63d6a68be0cb4a0fd3315f2d5d5d7c51f92891187b9f1f',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da2af7958ab41e892c63d6a68be0cb4a0fd3315f2d5d5d7c51f92891187b9f1f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '3',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'e69c1b507f7ca3dfac790e26fbd132085cf1796648563a5facfe3c82a6401e6c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e69c1b507f7ca3dfac790e26fbd132085cf1796648563a5facfe3c82a6401e6c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '8',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '11',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'f3a106c523a1af4c3d68d3c82a015f3d7c890f590b410bde535b5ad392c447a4',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f3a106c523a1af4c3d68d3c82a015f3d7c890f590b410bde535b5ad392c447a4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ '52fe0ccf7b5936095bbdadebc0de9f844a99457096ca4f7b45543a2badefdf35',
+ tx_pos: 1,
+ value: 546,
+ txid: '52fe0ccf7b5936095bbdadebc0de9f844a99457096ca4f7b45543a2badefdf35',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '4',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'aa50baef76708fee1f19bd098c0d7407b64b280afd76a450067a89ab2bddd3e8',
+ tx_pos: 1,
+ value: 546,
+ txid: 'aa50baef76708fee1f19bd098c0d7407b64b280afd76a450067a89ab2bddd3e8',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'bfc175d1933aed136d7bd887481144ec42112c34e7889cf3f21013409e233e3d',
+ tx_pos: 1,
+ value: 546,
+ txid: 'bfc175d1933aed136d7bd887481144ec42112c34e7889cf3f21013409e233e3d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '3',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'c2d2e57203f5d66c3bddd3f4fd5ccb053006588bfa0fec76bdbbfd2169984e9c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c2d2e57203f5d66c3bddd3f4fd5ccb053006588bfa0fec76bdbbfd2169984e9c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ tx_pos: 1,
+ value: 546,
+ txid: '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '5',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+ },
+ {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 1,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '1e-8',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'f6ef57f697219aaa576bf43d69a7f8b8753dcbcbb502f602259a7d14fafd52c5',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f6ef57f697219aaa576bf43d69a7f8b8753dcbcbb502f602259a7d14fafd52c5',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681192,
+ tx_hash:
+ '43a925c679debac91183b0ccd08780cc94dc58d79cdb506df92ed5963c6bbb34',
+ tx_pos: 1,
+ value: 546,
+ txid: '43a925c679debac91183b0ccd08780cc94dc58d79cdb506df92ed5963c6bbb34',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '2e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681192,
+ tx_hash:
+ '880baf5691c2b4c5a22ae4032e2004c0c54bfabf003468044a2e341846137136',
+ tx_pos: 1,
+ value: 546,
+ txid: '880baf5691c2b4c5a22ae4032e2004c0c54bfabf003468044a2e341846137136',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '3e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681192,
+ tx_hash:
+ 'b7f8b23f5ce12842eb655239919b6142052a2fa2b2ce974a4baac36b0137f332',
+ tx_pos: 1,
+ value: 546,
+ txid: 'b7f8b23f5ce12842eb655239919b6142052a2fa2b2ce974a4baac36b0137f332',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '4e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681192,
+ tx_hash:
+ 'f27ff24c15b01c30d44218c6dc8706fd33cc7bc9b4b38399075f0f41d8e412af',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f27ff24c15b01c30d44218c6dc8706fd33cc7bc9b4b38399075f0f41d8e412af',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '5e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+ },
+];
+
+export const flattenedHydrateUtxosResponse = {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 681187,
+ tx_hash:
+ '0d391574918bf5ecbb00fa0c48d2a88be80c4b86a421992309f28871186b40fe',
+ tx_pos: 0,
+ value: 1000,
+ txid: '0d391574918bf5ecbb00fa0c48d2a88be80c4b86a421992309f28871186b40fe',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '09eb70948f37e22eda0e425daed577cbb665794fea8b69da558700aabf95d9ab',
+ tx_pos: 0,
+ value: 2000,
+ txid: '09eb70948f37e22eda0e425daed577cbb665794fea8b69da558700aabf95d9ab',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '0bdfe5a8eae0b00ad18d4fe2dba0ec20e661a8739348163bef484a90e049fa17',
+ tx_pos: 0,
+ value: 9000,
+ txid: '0bdfe5a8eae0b00ad18d4fe2dba0ec20e661a8739348163bef484a90e049fa17',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '12db7f983196388991f901bb76da6f00cbb7ce8261d5a3194ea34bc4ee03b218',
+ tx_pos: 0,
+ value: 11000,
+ txid: '12db7f983196388991f901bb76da6f00cbb7ce8261d5a3194ea34bc4ee03b218',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '31ad22a45f2510044407df031f97816006295d0a4f1e424a38835865010a107b',
+ tx_pos: 0,
+ value: 7000,
+ txid: '31ad22a45f2510044407df031f97816006295d0a4f1e424a38835865010a107b',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '5b74e05ced6b7d862fe9cab94071b2ccfa475c0cef94b90c7edb8a06f90e5ad6',
+ tx_pos: 1,
+ value: 546,
+ txid: '5b74e05ced6b7d862fe9cab94071b2ccfa475c0cef94b90c7edb8a06f90e5ad6',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '1e-7',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '76c473666913b517a34c25a00a06e8da128267b832a8be900db59cbe3de36b77',
+ tx_pos: 0,
+ value: 12000,
+ txid: '76c473666913b517a34c25a00a06e8da128267b832a8be900db59cbe3de36b77',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '9d5399046bf89de7d1d1f725066d1c9a9eb26877d622f0236b5bd0b59dbc55c9',
+ tx_pos: 0,
+ value: 8000,
+ txid: '9d5399046bf89de7d1d1f725066d1c9a9eb26877d622f0236b5bd0b59dbc55c9',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'a6347e8b522835ef1592996b668a87290f44cc26eec7f41a20f7b3a2f1e7ae31',
+ tx_pos: 0,
+ value: 10000,
+ txid: 'a6347e8b522835ef1592996b668a87290f44cc26eec7f41a20f7b3a2f1e7ae31',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'cc3f8684f9fbeffa8e9142c3c29c411d267a20bc758e0230f3ac60082b1409c4',
+ tx_pos: 0,
+ value: 3000,
+ txid: 'cc3f8684f9fbeffa8e9142c3c29c411d267a20bc758e0230f3ac60082b1409c4',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ utxos: [
+ {
+ height: 681188,
+ tx_hash:
+ 'd491dc4ae9959bd6e95ad733eec1f97977b7d7fe400e83a47277a337d4e2ea43',
+ tx_pos: 0,
+ value: 6000,
+ txid: 'd491dc4ae9959bd6e95ad733eec1f97977b7d7fe400e83a47277a337d4e2ea43',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'd736a55663aa176581b6484e0d3b499cbf7ad1a57e6fc9ac547cec67b41fd0ba',
+ tx_pos: 0,
+ value: 4000,
+ txid: 'd736a55663aa176581b6484e0d3b499cbf7ad1a57e6fc9ac547cec67b41fd0ba',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'e7a70afaf07ca689066ed36facc7c86b0e24da2d4c5fa6f5e1fd1806f5a39ec2',
+ tx_pos: 0,
+ value: 5000,
+ txid: 'e7a70afaf07ca689066ed36facc7c86b0e24da2d4c5fa6f5e1fd1806f5a39ec2',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '0aacdb7d85c466a7d6d4edf127883da40b05617d9c4ff7493bde3c973f22231d',
+ tx_pos: 1,
+ value: 546,
+ txid: '0aacdb7d85c466a7d6d4edf127883da40b05617d9c4ff7493bde3c973f22231d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '10',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '2cc8f480e9adfb74aff7351bdbbf12ed8972e35fb8bd0f43b9ea5e4aeaec5693',
+ tx_pos: 1,
+ value: 546,
+ txid: '2cc8f480e9adfb74aff7351bdbbf12ed8972e35fb8bd0f43b9ea5e4aeaec5693',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '6',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '36bdf8461dbc19ff46681e9bcb6d5312c8d276ef17779ff8016d647594c39991',
+ tx_pos: 1,
+ value: 546,
+ txid: '36bdf8461dbc19ff46681e9bcb6d5312c8d276ef17779ff8016d647594c39991',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '4',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '6b1476b65d3e29248c3809e18add16cddfee9e1d9a7060df97b35e517e8b7131',
+ tx_pos: 1,
+ value: 546,
+ txid: '6b1476b65d3e29248c3809e18add16cddfee9e1d9a7060df97b35e517e8b7131',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '7',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '986dc9f9cc91e9976f2a8470805ab3b6bccfd4eaf224cdfa35bb62294bd8aac3',
+ tx_pos: 1,
+ value: 546,
+ txid: '986dc9f9cc91e9976f2a8470805ab3b6bccfd4eaf224cdfa35bb62294bd8aac3',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'c4ef58f111ae86c7e1a9be4d5b553de6f6061b4bdca130d360c4e18476679ad7',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c4ef58f111ae86c7e1a9be4d5b553de6f6061b4bdca130d360c4e18476679ad7',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'c551e9ea96ce844bb1aaee65c99a312bb5fa66f8f822ab45dec63c7c3b77bbe5',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c551e9ea96ce844bb1aaee65c99a312bb5fa66f8f822ab45dec63c7c3b77bbe5',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '5',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ utxos: [
+ {
+ height: 681189,
+ tx_hash:
+ 'da2af7958ab41e892c63d6a68be0cb4a0fd3315f2d5d5d7c51f92891187b9f1f',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da2af7958ab41e892c63d6a68be0cb4a0fd3315f2d5d5d7c51f92891187b9f1f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '3',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'e69c1b507f7ca3dfac790e26fbd132085cf1796648563a5facfe3c82a6401e6c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e69c1b507f7ca3dfac790e26fbd132085cf1796648563a5facfe3c82a6401e6c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '8',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '11',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'f3a106c523a1af4c3d68d3c82a015f3d7c890f590b410bde535b5ad392c447a4',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f3a106c523a1af4c3d68d3c82a015f3d7c890f590b410bde535b5ad392c447a4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ '52fe0ccf7b5936095bbdadebc0de9f844a99457096ca4f7b45543a2badefdf35',
+ tx_pos: 1,
+ value: 546,
+ txid: '52fe0ccf7b5936095bbdadebc0de9f844a99457096ca4f7b45543a2badefdf35',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '4',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'aa50baef76708fee1f19bd098c0d7407b64b280afd76a450067a89ab2bddd3e8',
+ tx_pos: 1,
+ value: 546,
+ txid: 'aa50baef76708fee1f19bd098c0d7407b64b280afd76a450067a89ab2bddd3e8',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'bfc175d1933aed136d7bd887481144ec42112c34e7889cf3f21013409e233e3d',
+ tx_pos: 1,
+ value: 546,
+ txid: 'bfc175d1933aed136d7bd887481144ec42112c34e7889cf3f21013409e233e3d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '3',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'c2d2e57203f5d66c3bddd3f4fd5ccb053006588bfa0fec76bdbbfd2169984e9c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c2d2e57203f5d66c3bddd3f4fd5ccb053006588bfa0fec76bdbbfd2169984e9c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ tx_pos: 1,
+ value: 546,
+ txid: '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '5',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ utxos: [
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 1,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '1e-8',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'f6ef57f697219aaa576bf43d69a7f8b8753dcbcbb502f602259a7d14fafd52c5',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f6ef57f697219aaa576bf43d69a7f8b8753dcbcbb502f602259a7d14fafd52c5',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681192,
+ tx_hash:
+ '43a925c679debac91183b0ccd08780cc94dc58d79cdb506df92ed5963c6bbb34',
+ tx_pos: 1,
+ value: 546,
+ txid: '43a925c679debac91183b0ccd08780cc94dc58d79cdb506df92ed5963c6bbb34',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '2e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681192,
+ tx_hash:
+ '880baf5691c2b4c5a22ae4032e2004c0c54bfabf003468044a2e341846137136',
+ tx_pos: 1,
+ value: 546,
+ txid: '880baf5691c2b4c5a22ae4032e2004c0c54bfabf003468044a2e341846137136',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '3e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681192,
+ tx_hash:
+ 'b7f8b23f5ce12842eb655239919b6142052a2fa2b2ce974a4baac36b0137f332',
+ tx_pos: 1,
+ value: 546,
+ txid: 'b7f8b23f5ce12842eb655239919b6142052a2fa2b2ce974a4baac36b0137f332',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '4e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681192,
+ tx_hash:
+ 'f27ff24c15b01c30d44218c6dc8706fd33cc7bc9b4b38399075f0f41d8e412af',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f27ff24c15b01c30d44218c6dc8706fd33cc7bc9b4b38399075f0f41d8e412af',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '5e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+};
+
+export const batchedFinal = {
+ tokens: [
+ {
+ info: {
+ height: 681188,
+ tx_hash:
+ '5b74e05ced6b7d862fe9cab94071b2ccfa475c0cef94b90c7edb8a06f90e5ad6',
+ tx_pos: 1,
+ value: 546,
+ txid: '5b74e05ced6b7d862fe9cab94071b2ccfa475c0cef94b90c7edb8a06f90e5ad6',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '1e-7',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ balance: '66.0000001',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681190,
+ tx_hash:
+ '52fe0ccf7b5936095bbdadebc0de9f844a99457096ca4f7b45543a2badefdf35',
+ tx_pos: 1,
+ value: 546,
+ txid: '52fe0ccf7b5936095bbdadebc0de9f844a99457096ca4f7b45543a2badefdf35',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '4',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ balance: '15',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ balance: '1',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 1,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ balance: '1',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '1e-8',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ balance: '1e-8',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ balance: '1',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'f6ef57f697219aaa576bf43d69a7f8b8753dcbcbb502f602259a7d14fafd52c5',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f6ef57f697219aaa576bf43d69a7f8b8753dcbcbb502f602259a7d14fafd52c5',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ balance: '1.5e-8',
+ hasBaton: false,
+ },
+ ],
+ nonSlpUtxos: [
+ {
+ height: 681187,
+ tx_hash:
+ '0d391574918bf5ecbb00fa0c48d2a88be80c4b86a421992309f28871186b40fe',
+ tx_pos: 0,
+ value: 1000,
+ txid: '0d391574918bf5ecbb00fa0c48d2a88be80c4b86a421992309f28871186b40fe',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '09eb70948f37e22eda0e425daed577cbb665794fea8b69da558700aabf95d9ab',
+ tx_pos: 0,
+ value: 2000,
+ txid: '09eb70948f37e22eda0e425daed577cbb665794fea8b69da558700aabf95d9ab',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '0bdfe5a8eae0b00ad18d4fe2dba0ec20e661a8739348163bef484a90e049fa17',
+ tx_pos: 0,
+ value: 9000,
+ txid: '0bdfe5a8eae0b00ad18d4fe2dba0ec20e661a8739348163bef484a90e049fa17',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '12db7f983196388991f901bb76da6f00cbb7ce8261d5a3194ea34bc4ee03b218',
+ tx_pos: 0,
+ value: 11000,
+ txid: '12db7f983196388991f901bb76da6f00cbb7ce8261d5a3194ea34bc4ee03b218',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '31ad22a45f2510044407df031f97816006295d0a4f1e424a38835865010a107b',
+ tx_pos: 0,
+ value: 7000,
+ txid: '31ad22a45f2510044407df031f97816006295d0a4f1e424a38835865010a107b',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '76c473666913b517a34c25a00a06e8da128267b832a8be900db59cbe3de36b77',
+ tx_pos: 0,
+ value: 12000,
+ txid: '76c473666913b517a34c25a00a06e8da128267b832a8be900db59cbe3de36b77',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ '9d5399046bf89de7d1d1f725066d1c9a9eb26877d622f0236b5bd0b59dbc55c9',
+ tx_pos: 0,
+ value: 8000,
+ txid: '9d5399046bf89de7d1d1f725066d1c9a9eb26877d622f0236b5bd0b59dbc55c9',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'a6347e8b522835ef1592996b668a87290f44cc26eec7f41a20f7b3a2f1e7ae31',
+ tx_pos: 0,
+ value: 10000,
+ txid: 'a6347e8b522835ef1592996b668a87290f44cc26eec7f41a20f7b3a2f1e7ae31',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'cc3f8684f9fbeffa8e9142c3c29c411d267a20bc758e0230f3ac60082b1409c4',
+ tx_pos: 0,
+ value: 3000,
+ txid: 'cc3f8684f9fbeffa8e9142c3c29c411d267a20bc758e0230f3ac60082b1409c4',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'd491dc4ae9959bd6e95ad733eec1f97977b7d7fe400e83a47277a337d4e2ea43',
+ tx_pos: 0,
+ value: 6000,
+ txid: 'd491dc4ae9959bd6e95ad733eec1f97977b7d7fe400e83a47277a337d4e2ea43',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'd736a55663aa176581b6484e0d3b499cbf7ad1a57e6fc9ac547cec67b41fd0ba',
+ tx_pos: 0,
+ value: 4000,
+ txid: 'd736a55663aa176581b6484e0d3b499cbf7ad1a57e6fc9ac547cec67b41fd0ba',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681188,
+ tx_hash:
+ 'e7a70afaf07ca689066ed36facc7c86b0e24da2d4c5fa6f5e1fd1806f5a39ec2',
+ tx_pos: 0,
+ value: 5000,
+ txid: 'e7a70afaf07ca689066ed36facc7c86b0e24da2d4c5fa6f5e1fd1806f5a39ec2',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+ slpUtxos: [
+ {
+ height: 681188,
+ tx_hash:
+ '5b74e05ced6b7d862fe9cab94071b2ccfa475c0cef94b90c7edb8a06f90e5ad6',
+ tx_pos: 1,
+ value: 546,
+ txid: '5b74e05ced6b7d862fe9cab94071b2ccfa475c0cef94b90c7edb8a06f90e5ad6',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '1e-7',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '0aacdb7d85c466a7d6d4edf127883da40b05617d9c4ff7493bde3c973f22231d',
+ tx_pos: 1,
+ value: 546,
+ txid: '0aacdb7d85c466a7d6d4edf127883da40b05617d9c4ff7493bde3c973f22231d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '10',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '2cc8f480e9adfb74aff7351bdbbf12ed8972e35fb8bd0f43b9ea5e4aeaec5693',
+ tx_pos: 1,
+ value: 546,
+ txid: '2cc8f480e9adfb74aff7351bdbbf12ed8972e35fb8bd0f43b9ea5e4aeaec5693',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '6',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '36bdf8461dbc19ff46681e9bcb6d5312c8d276ef17779ff8016d647594c39991',
+ tx_pos: 1,
+ value: 546,
+ txid: '36bdf8461dbc19ff46681e9bcb6d5312c8d276ef17779ff8016d647594c39991',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '4',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '6b1476b65d3e29248c3809e18add16cddfee9e1d9a7060df97b35e517e8b7131',
+ tx_pos: 1,
+ value: 546,
+ txid: '6b1476b65d3e29248c3809e18add16cddfee9e1d9a7060df97b35e517e8b7131',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '7',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ '986dc9f9cc91e9976f2a8470805ab3b6bccfd4eaf224cdfa35bb62294bd8aac3',
+ tx_pos: 1,
+ value: 546,
+ txid: '986dc9f9cc91e9976f2a8470805ab3b6bccfd4eaf224cdfa35bb62294bd8aac3',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'c4ef58f111ae86c7e1a9be4d5b553de6f6061b4bdca130d360c4e18476679ad7',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c4ef58f111ae86c7e1a9be4d5b553de6f6061b4bdca130d360c4e18476679ad7',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'c551e9ea96ce844bb1aaee65c99a312bb5fa66f8f822ab45dec63c7c3b77bbe5',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c551e9ea96ce844bb1aaee65c99a312bb5fa66f8f822ab45dec63c7c3b77bbe5',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '5',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'da2af7958ab41e892c63d6a68be0cb4a0fd3315f2d5d5d7c51f92891187b9f1f',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da2af7958ab41e892c63d6a68be0cb4a0fd3315f2d5d5d7c51f92891187b9f1f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '3',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'e69c1b507f7ca3dfac790e26fbd132085cf1796648563a5facfe3c82a6401e6c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e69c1b507f7ca3dfac790e26fbd132085cf1796648563a5facfe3c82a6401e6c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '8',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '11',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'f3a106c523a1af4c3d68d3c82a015f3d7c890f590b410bde535b5ad392c447a4',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f3a106c523a1af4c3d68d3c82a015f3d7c890f590b410bde535b5ad392c447a4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '9',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ '52fe0ccf7b5936095bbdadebc0de9f844a99457096ca4f7b45543a2badefdf35',
+ tx_pos: 1,
+ value: 546,
+ txid: '52fe0ccf7b5936095bbdadebc0de9f844a99457096ca4f7b45543a2badefdf35',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '4',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'aa50baef76708fee1f19bd098c0d7407b64b280afd76a450067a89ab2bddd3e8',
+ tx_pos: 1,
+ value: 546,
+ txid: 'aa50baef76708fee1f19bd098c0d7407b64b280afd76a450067a89ab2bddd3e8',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'bfc175d1933aed136d7bd887481144ec42112c34e7889cf3f21013409e233e3d',
+ tx_pos: 1,
+ value: 546,
+ txid: 'bfc175d1933aed136d7bd887481144ec42112c34e7889cf3f21013409e233e3d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '3',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'c2d2e57203f5d66c3bddd3f4fd5ccb053006588bfa0fec76bdbbfd2169984e9c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c2d2e57203f5d66c3bddd3f4fd5ccb053006588bfa0fec76bdbbfd2169984e9c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ tx_pos: 1,
+ value: 546,
+ txid: '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '5',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 1,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '1e-8',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'f6ef57f697219aaa576bf43d69a7f8b8753dcbcbb502f602259a7d14fafd52c5',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f6ef57f697219aaa576bf43d69a7f8b8753dcbcbb502f602259a7d14fafd52c5',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681192,
+ tx_hash:
+ '43a925c679debac91183b0ccd08780cc94dc58d79cdb506df92ed5963c6bbb34',
+ tx_pos: 1,
+ value: 546,
+ txid: '43a925c679debac91183b0ccd08780cc94dc58d79cdb506df92ed5963c6bbb34',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '2e-9',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681192,
+ tx_hash:
+ '880baf5691c2b4c5a22ae4032e2004c0c54bfabf003468044a2e341846137136',
+ tx_pos: 1,
+ value: 546,
+ txid: '880baf5691c2b4c5a22ae4032e2004c0c54bfabf003468044a2e341846137136',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '3e-9',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681192,
+ tx_hash:
+ 'b7f8b23f5ce12842eb655239919b6142052a2fa2b2ce974a4baac36b0137f332',
+ tx_pos: 1,
+ value: 546,
+ txid: 'b7f8b23f5ce12842eb655239919b6142052a2fa2b2ce974a4baac36b0137f332',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '4e-9',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ height: 681192,
+ tx_hash:
+ 'f27ff24c15b01c30d44218c6dc8706fd33cc7bc9b4b38399075f0f41d8e412af',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f27ff24c15b01c30d44218c6dc8706fd33cc7bc9b4b38399075f0f41d8e412af',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '5e-9',
+ isValid: true,
+ address: 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ ],
+};
diff --git a/web/cashtab-v2/src/utils/__mocks__/incrementalUtxoMocks.js b/web/cashtab-v2/src/utils/__mocks__/incrementalUtxoMocks.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/__mocks__/incrementalUtxoMocks.js
@@ -0,0 +1,18515 @@
+export const previousUtxosObjUtxoArray = [
+ {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 685181,
+ tx_hash:
+ '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 686546,
+ tx_hash:
+ 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 687240,
+ tx_hash:
+ 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 688194,
+ tx_hash:
+ '3de671a7107d3803d78f7f4a4e5c794d0903a8d28d16076445c084943c1e2db8',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 688449,
+ tx_hash:
+ 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 693606,
+ tx_hash:
+ '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 699216,
+ tx_hash:
+ '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 699359,
+ tx_hash:
+ 'b99cb29050779d4f185c3c31c22e664436966314c8b260075b38bbb453180603',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 700185,
+ tx_hash:
+ '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 700469,
+ tx_hash:
+ 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 700572,
+ tx_hash:
+ '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 700677,
+ tx_hash:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 700915,
+ tx_hash:
+ 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701191,
+ tx_hash:
+ 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701194,
+ tx_hash:
+ 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701208,
+ tx_hash:
+ '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701221,
+ tx_hash:
+ '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701223,
+ tx_hash:
+ '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 709251,
+ tx_hash:
+ '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 709259,
+ tx_hash:
+ '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 709668,
+ tx_hash:
+ 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 710065,
+ tx_hash:
+ '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 711088,
+ tx_hash:
+ '982ca55c84510e4184ff5a6e7fc310a1de7833e8c617b46014f962ed89bf0f57',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 711227,
+ tx_hash:
+ 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 715111,
+ tx_hash:
+ 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 715816,
+ tx_hash:
+ '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 717055,
+ tx_hash:
+ '18c0360f0db5399223cbed48f55c4cee9d9914c8a4a7dedcf9172a36201e9896',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 717653,
+ tx_hash:
+ '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 717824,
+ tx_hash:
+ 'c0fe05d7bf71cd0f476ea18cdd4ecb26e1b9a33c911f4aaf143b2b18bc3b5f4f',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 718091,
+ tx_hash:
+ '905cc5662cad77df56c3770863634ce498dde9d4772dc494d33b7ce3f36fa66c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 718280,
+ tx_hash:
+ 'f31f4ad7bf035cfb587a07a12ec60937cb8cbeafa7e4d7ed4f3276fea26fcfec',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 718790,
+ tx_hash:
+ '67faa4753da2940d053f32edcda2c052a16c683aeb73f10cfde5c18266c14fe2',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 720056,
+ tx_hash:
+ '9c6363fb537d529f512a12d292ea9682fe7159e6bf5ebfec5b7067b401d2dba4',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '4eed87ba70864d9daa46d201c47db4513f77e5d4cc01256ab4dcc6dae9dfa055',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '7975514a3185cbb70900e9767e5fcc91c86913cb1d2ad9a28474253875271e33',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'e10ae7a1bc78561ed367d59f150aebc13ef2054ba62f1a0db08fc7612d5ed58b',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'fb71c88bd5369cb8278f49ac672a9721833c36fc69143848b46ae15860339ea6',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720078,
+ tx_hash:
+ 'c3c6c6fb1619d001c29f17a701d042bc6b983e71113822aeeb66ca434fd9fa6c',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720951,
+ tx_hash:
+ 'fb50eac73a4fd5e2a701e0dbf4e575cea9c083e061b1db722e057164c7317e5b',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 721083,
+ tx_hash:
+ 'dfb3dbf90fd87f6d66465ff05a61ddf1e1ca30900fadfe9cd4b73468649935ed',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 724822,
+ tx_hash:
+ 'ed0dab39d5e976e433a705785726901dc83daa7d579412c18ee997341de010d3',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 725143,
+ tx_hash:
+ 'e99296764134d6ea9ba7521490563762cfaf1541854ba9babc26c0df8665ac32',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 725871,
+ tx_hash:
+ '82a3fe0b03ab07a564351443634da1b1ed3960e4771c59b6f8abbf7ef4b3258d',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 725882,
+ tx_hash:
+ '1db1bef70013d178d7912731435029f9c8588f1d0089944c53eccffd255b5efc',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '6c70ada5dfda75788b48ad6da211a3ea56b4b2bad8fa807954b553742e62c73d',
+ tx_pos: 0,
+ value: 60000,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '94b34b291f3c77d008f3521462563ea1656542f9f8908d18a489edf5eda27fdb',
+ tx_pos: 0,
+ value: 900,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '9e6d5d346effd3b57bd68d95a9bfc9de1e5787f110589aa3b88d7852eebb425f',
+ tx_pos: 1,
+ value: 673,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ tx_pos: 3,
+ value: 95212726,
+ },
+];
+
+export const includedUtxoAlpha = {
+ height: 680784,
+ tx_hash: '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ tx_pos: 1,
+ value: 546,
+};
+export const includedUtxoBeta = {
+ height: 0,
+ tx_hash: '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ tx_pos: 3,
+ value: 95212726,
+};
+
+export const excludedUtxoAlpha = {
+ // Note this is includedUtxoAlpha with tx_pos of 0 instead of 1
+ height: 680784,
+ tx_hash: '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ tx_pos: 0,
+ value: 546,
+};
+export const excludedUtxoBeta = {
+ // Note this is includedUtxoBeta with value 95212725 instead of 95212726
+ height: 0,
+ tx_hash: '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ tx_pos: 3,
+ value: 95212725,
+};
+
+export const validUtxo = {
+ height: 724992,
+ tx_hash: '8d4bdedb7c4443412e0c2f316a330863aef54d9ba73560ca60cca6408527b247',
+ tx_pos: 0,
+ value: 10200,
+};
+export const invalidUtxoMissingHeight = {
+ tx_hash: '8d4bdedb7c4443412e0c2f316a330863aef54d9ba73560ca60cca6408527b247',
+ tx_pos: 0,
+ value: 10200,
+};
+export const invalidUtxoTxidUndefined = {
+ height: 724992,
+ tx_hash: undefined,
+ tx_pos: 0,
+ value: 10200,
+};
+
+export const previousUtxosTemplate = [
+ {
+ utxos: [],
+ address: 'Cashtab 145 address probably with no utxos',
+ },
+ {
+ utxos: [],
+ address: 'Cashtab 245 address probably with no utxos',
+ },
+ {
+ utxos: [
+ {
+ tx_hash: 'some random xec utxo',
+ tx_pos: 1,
+ value: 1000,
+ },
+ {
+ tx_hash: 'some random eToken utxo',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ tx_hash: 'alpha',
+ tx_pos: 1,
+ value: 25000,
+ },
+ {
+ tx_hash: 'Consumed utxo from a tx sending 100,000 XEC',
+ tx_pos: 0,
+ value: 7500000,
+ },
+ {
+ tx_hash:
+ 'Consumed utxo from a tx sending 100,000 XEC, not necessarily the same txid',
+ tx_pos: 1,
+ value: 5000000,
+ },
+ {
+ tx_hash: 'Consumed utxo from sending an eToken tx (XEC utxo)',
+ tx_pos: 0,
+ value: 10546,
+ },
+ {
+ tx_hash:
+ 'Consumed utxo from sending an eToken tx (eToken utxo)',
+ tx_pos: 1,
+ value: 546,
+ },
+ ],
+ address: 'Cashtab 1899 address probably with all the utxos',
+ },
+];
+
+export const currentUtxosAfterSingleXecReceiveTxTemplate = [
+ {
+ utxos: [],
+ address: 'Cashtab 145 address probably with no utxos',
+ },
+ {
+ utxos: [],
+ address: 'Cashtab 245 address probably with no utxos',
+ },
+ {
+ utxos: [
+ {
+ tx_hash: 'some random xec utxo',
+ tx_pos: 1,
+ value: 1000,
+ },
+ {
+ tx_hash: 'some random new xec utxo',
+ tx_pos: 1,
+ value: 1000,
+ },
+ {
+ tx_hash: 'some random eToken utxo',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ tx_hash: 'alpha',
+ tx_pos: 1,
+ value: 25000,
+ },
+ {
+ tx_hash: 'Consumed utxo from a tx sending 100,000 XEC',
+ tx_pos: 0,
+ value: 7500000,
+ },
+ {
+ tx_hash:
+ 'Consumed utxo from a tx sending 100,000 XEC, not necessarily the same txid',
+ tx_pos: 1,
+ value: 5000000,
+ },
+ {
+ tx_hash: 'Consumed utxo from sending an eToken tx (XEC utxo)',
+ tx_pos: 0,
+ value: 10546,
+ },
+ {
+ tx_hash:
+ 'Consumed utxo from sending an eToken tx (eToken utxo)',
+ tx_pos: 1,
+ value: 546,
+ },
+ ],
+ address: 'Cashtab 1899 address probably with all the utxos',
+ },
+];
+export const utxosAddedBySingleXecReceiveTxTemplate = [
+ {
+ utxos: [],
+ address: 'Cashtab 145 address probably with no utxos',
+ },
+ {
+ utxos: [],
+ address: 'Cashtab 245 address probably with no utxos',
+ },
+ {
+ utxos: [
+ {
+ tx_hash: 'some random new xec utxo',
+ tx_pos: 1,
+ value: 1000,
+ },
+ ],
+ address: 'Cashtab 1899 address probably with all the utxos',
+ },
+];
+export const previousUtxosBeforeSingleXecReceiveTx = [
+ {
+ utxos: [
+ {
+ height: 660149,
+ tx_hash:
+ '976753770d4fd3baa0a36e0792ba6b0f906efc771b25690b5300f5437ba0f0db',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 660971,
+ tx_hash:
+ 'aefc3f3c65760d0f0fa716a84d12c4dc76ca7552953d6c7a4358abb6e24c5d7c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 661700,
+ tx_hash:
+ '854d49d29819cdb5c4d9248146ffc82771cd3a7727f25a22993456f68050503e',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 662159,
+ tx_hash:
+ '05e90e9f35bc041a2939e0e28cf9c436c9adb0f247a7fb0d1f4abb26d418f096',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 662935,
+ tx_hash:
+ 'ec423d0089f5cd85973ff6d875e9507f6b396b3b82bf6e9f5cfb24b7c70273bd',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 666954,
+ tx_hash:
+ '1b19314963be975c57eb37df12b6a8e0598bcb743226cdc684895520f51c4dfe',
+ tx_pos: 1,
+ value: 546,
+ },
+ ],
+ address: 'bitcoincash:qpv9fx6mjdpgltygudnpw3tvmxdyzx7savhphtzswu',
+ },
+ {
+ utxos: [],
+ address: 'bitcoincash:qppc593r2hhksvrz5l77n5yd6usrj74waqnqemgjgf',
+ },
+ {
+ utxos: [
+ {
+ height: 669673,
+ tx_hash:
+ 'bd8b527df1d5d3bd611a8f0ee8f14af83cb7d107fb2e140dbd2d9f4b3a86786a',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 669673,
+ tx_hash:
+ 'd2ad75a6974e4dc021483f381f314d260e958cbcc444230b485436b6264eaf3d',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 669942,
+ tx_hash:
+ 'ff5fe4c631a5dd3e3b1cc74cb12b9eebf04d177c206eaadb8d949cc4fbb6a092',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 669958,
+ tx_hash:
+ '0da32e1f64a12ed2a4afd406368cc76ab3f8c462b26fbdd9817675ffa0fa7668',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 669959,
+ tx_hash:
+ '182f50952631c4bcdd46f4d42ac68376674727fa40dbcbf1101e40fbfd58b55a',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 670076,
+ tx_hash:
+ '4064e02fe523cb107fecaf3f5abaabb89f7e2bb6662751ba4f86f8d18ebeb1fa',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 670482,
+ tx_hash:
+ 'b78a3f8d17fc69cd1314517c36abad85f09fbca4d43ac108bced2ac78428f2c8',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 670670,
+ tx_hash:
+ '55eec1cb63d2b3aa604ba2f505735de07cb224fcdbd8e554aa1180f59cdd0541',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 671724,
+ tx_hash:
+ '37f63a9b1bcdc4733425dcfc3a7f3564d5095467ad7f64707fe52dbe5c1e1897',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 672701,
+ tx_hash:
+ 'f90631b48521a4147dd9dd7091ce936eddc0c3e6221ec87fa4fabacc453a0b95',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 691329,
+ tx_hash:
+ '8d38f2f805ed3f4089cd28cd89ca279628a9fa933b04fd4820d14e66fc4d4ed5',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 714696,
+ tx_hash:
+ 'a3add503bba986398b39fa2200ce658423a597b4f7fe9de04a2da4501f8b05a3',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714696,
+ tx_hash:
+ 'f29939b961d8f3b27d7826e3f22451fcf9273ac84421312a20148b1e083a5bb0',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714701,
+ tx_hash:
+ '2502bdc75d3afdce0742505d53e6d50cefb1268d7c2a835c06b701702b79e1b8',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714705,
+ tx_hash:
+ '742a8e656fe7a6cff86e688ec191be780974fc54b900f58cd15049be89e9e1c5',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714823,
+ tx_hash:
+ 'c70d5f036368e184d2a52389b2f4c2471855aebaccbd418db24d4515ce062dbe',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714823,
+ tx_hash:
+ 'edb693529851379bcbd75008f78940df8232510e6a1c64d8dc81693ae2a53f66',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 722860,
+ tx_hash:
+ 'afe4bc6ff9a3e26b6fb8803b754223b9f368402f479b21c39b2ff8f54bfb7f5e',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 723247,
+ tx_hash:
+ 'cc03f4b178f54327d5c337650531abf2a2464e2a9a486c38c6194f8ac96e9842',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 724544,
+ tx_hash:
+ '83b9bab68c36364035976c7590df0b19d2f7b16c98d51d124891289bf3a122a5',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 724545,
+ tx_hash:
+ '9ea438223212fc98af2ada411ecf75e83a10ad091bebfb0adc3925f32f311c71',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 725144,
+ tx_hash:
+ '69fdd3dc4914c33f980aee4dcc04e65706e43498acf92f48bf70c159cb708111',
+ tx_pos: 1,
+ value: 1254435,
+ },
+ {
+ height: 725144,
+ tx_hash:
+ 'ef67e7785c2a991c4f5fc20f88b2649dd2fb2c637b6861a9586d4449ea1b06b3',
+ tx_pos: 1,
+ value: 463186023,
+ },
+ ],
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+];
+export const currentUtxosAfterSingleXecReceiveTx = [
+ {
+ utxos: [
+ {
+ height: 660149,
+ tx_hash:
+ '976753770d4fd3baa0a36e0792ba6b0f906efc771b25690b5300f5437ba0f0db',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 660971,
+ tx_hash:
+ 'aefc3f3c65760d0f0fa716a84d12c4dc76ca7552953d6c7a4358abb6e24c5d7c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 661700,
+ tx_hash:
+ '854d49d29819cdb5c4d9248146ffc82771cd3a7727f25a22993456f68050503e',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 662159,
+ tx_hash:
+ '05e90e9f35bc041a2939e0e28cf9c436c9adb0f247a7fb0d1f4abb26d418f096',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 662935,
+ tx_hash:
+ 'ec423d0089f5cd85973ff6d875e9507f6b396b3b82bf6e9f5cfb24b7c70273bd',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 666954,
+ tx_hash:
+ '1b19314963be975c57eb37df12b6a8e0598bcb743226cdc684895520f51c4dfe',
+ tx_pos: 1,
+ value: 546,
+ },
+ ],
+ address: 'bitcoincash:qpv9fx6mjdpgltygudnpw3tvmxdyzx7savhphtzswu',
+ },
+ {
+ utxos: [],
+ address: 'bitcoincash:qppc593r2hhksvrz5l77n5yd6usrj74waqnqemgjgf',
+ },
+ {
+ utxos: [
+ {
+ height: 669673,
+ tx_hash:
+ 'bd8b527df1d5d3bd611a8f0ee8f14af83cb7d107fb2e140dbd2d9f4b3a86786a',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 669673,
+ tx_hash:
+ 'd2ad75a6974e4dc021483f381f314d260e958cbcc444230b485436b6264eaf3d',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 669942,
+ tx_hash:
+ 'ff5fe4c631a5dd3e3b1cc74cb12b9eebf04d177c206eaadb8d949cc4fbb6a092',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 669958,
+ tx_hash:
+ '0da32e1f64a12ed2a4afd406368cc76ab3f8c462b26fbdd9817675ffa0fa7668',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 669959,
+ tx_hash:
+ '182f50952631c4bcdd46f4d42ac68376674727fa40dbcbf1101e40fbfd58b55a',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 670076,
+ tx_hash:
+ '4064e02fe523cb107fecaf3f5abaabb89f7e2bb6662751ba4f86f8d18ebeb1fa',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 670482,
+ tx_hash:
+ 'b78a3f8d17fc69cd1314517c36abad85f09fbca4d43ac108bced2ac78428f2c8',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 670670,
+ tx_hash:
+ '55eec1cb63d2b3aa604ba2f505735de07cb224fcdbd8e554aa1180f59cdd0541',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 671724,
+ tx_hash:
+ '37f63a9b1bcdc4733425dcfc3a7f3564d5095467ad7f64707fe52dbe5c1e1897',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 672701,
+ tx_hash:
+ 'f90631b48521a4147dd9dd7091ce936eddc0c3e6221ec87fa4fabacc453a0b95',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 691329,
+ tx_hash:
+ '8d38f2f805ed3f4089cd28cd89ca279628a9fa933b04fd4820d14e66fc4d4ed5',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 714696,
+ tx_hash:
+ 'a3add503bba986398b39fa2200ce658423a597b4f7fe9de04a2da4501f8b05a3',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714696,
+ tx_hash:
+ 'f29939b961d8f3b27d7826e3f22451fcf9273ac84421312a20148b1e083a5bb0',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714701,
+ tx_hash:
+ '2502bdc75d3afdce0742505d53e6d50cefb1268d7c2a835c06b701702b79e1b8',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714705,
+ tx_hash:
+ '742a8e656fe7a6cff86e688ec191be780974fc54b900f58cd15049be89e9e1c5',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714823,
+ tx_hash:
+ 'c70d5f036368e184d2a52389b2f4c2471855aebaccbd418db24d4515ce062dbe',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714823,
+ tx_hash:
+ 'edb693529851379bcbd75008f78940df8232510e6a1c64d8dc81693ae2a53f66',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 722860,
+ tx_hash:
+ 'afe4bc6ff9a3e26b6fb8803b754223b9f368402f479b21c39b2ff8f54bfb7f5e',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 723247,
+ tx_hash:
+ 'cc03f4b178f54327d5c337650531abf2a2464e2a9a486c38c6194f8ac96e9842',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 724544,
+ tx_hash:
+ '83b9bab68c36364035976c7590df0b19d2f7b16c98d51d124891289bf3a122a5',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 724545,
+ tx_hash:
+ '9ea438223212fc98af2ada411ecf75e83a10ad091bebfb0adc3925f32f311c71',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 725144,
+ tx_hash:
+ '69fdd3dc4914c33f980aee4dcc04e65706e43498acf92f48bf70c159cb708111',
+ tx_pos: 1,
+ value: 1254435,
+ },
+ {
+ height: 725144,
+ tx_hash:
+ 'ef67e7785c2a991c4f5fc20f88b2649dd2fb2c637b6861a9586d4449ea1b06b3',
+ tx_pos: 1,
+ value: 463186023,
+ },
+ {
+ height: 0,
+ tx_hash:
+ 'c1d76ac732b84b9cbd6d94c1463c1739e1a701c5e6bd966f904226ae43c13e0c',
+ tx_pos: 0,
+ value: 42069,
+ },
+ ],
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+];
+export const utxosAddedBySingleXecReceiveTx = [
+ {
+ address: 'bitcoincash:qpv9fx6mjdpgltygudnpw3tvmxdyzx7savhphtzswu',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qppc593r2hhksvrz5l77n5yd6usrj74waqnqemgjgf',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ utxos: [
+ {
+ height: 0,
+ tx_hash:
+ 'c1d76ac732b84b9cbd6d94c1463c1739e1a701c5e6bd966f904226ae43c13e0c',
+ tx_pos: 0,
+ value: 42069,
+ },
+ ],
+ },
+];
+export const currentUtxosAfterMultiXecReceiveTxTemplate = [
+ {
+ utxos: [],
+ address: 'Cashtab 145 address probably with no utxos',
+ },
+ {
+ utxos: [],
+ address: 'Cashtab 245 address probably with no utxos',
+ },
+ {
+ utxos: [
+ {
+ tx_hash: 'some random xec utxo',
+ tx_pos: 1,
+ value: 1000,
+ },
+ {
+ tx_hash: 'some random eToken utxo',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ tx_hash: 'alpha',
+ tx_pos: 1,
+ value: 25000,
+ },
+ {
+ tx_hash: 'some random new xec utxo from a multi-send tx',
+ tx_pos: 0,
+ value: 1000,
+ },
+ {
+ tx_hash: 'some random new xec utxo from a multi-send tx',
+ tx_pos: 1,
+ value: 1000,
+ },
+ {
+ tx_hash: 'some random new xec utxo from a multi-send tx',
+ tx_pos: 2,
+ value: 1000,
+ },
+ {
+ tx_hash: 'Consumed utxo from a tx sending 100,000 XEC',
+ tx_pos: 0,
+ value: 7500000,
+ },
+ {
+ tx_hash:
+ 'Consumed utxo from a tx sending 100,000 XEC, not necessarily the same txid',
+ tx_pos: 1,
+ value: 5000000,
+ },
+ {
+ tx_hash: 'Consumed utxo from sending an eToken tx (XEC utxo)',
+ tx_pos: 0,
+ value: 10546,
+ },
+ {
+ tx_hash:
+ 'Consumed utxo from sending an eToken tx (eToken utxo)',
+ tx_pos: 1,
+ value: 546,
+ },
+ ],
+ address: 'Cashtab 1899 address probably with all the utxos',
+ },
+];
+export const utxosAddedByMultiXecReceiveTxTemplate = [
+ {
+ utxos: [],
+ address: 'Cashtab 145 address probably with no utxos',
+ },
+ {
+ utxos: [],
+ address: 'Cashtab 245 address probably with no utxos',
+ },
+ {
+ utxos: [
+ {
+ tx_hash: 'some random new xec utxo from a multi-send tx',
+ tx_pos: 0,
+ value: 1000,
+ },
+ {
+ tx_hash: 'some random new xec utxo from a multi-send tx',
+ tx_pos: 1,
+ value: 1000,
+ },
+ {
+ tx_hash: 'some random new xec utxo from a multi-send tx',
+ tx_pos: 2,
+ value: 1000,
+ },
+ ],
+ address: 'Cashtab 1899 address probably with all the utxos',
+ },
+];
+export const previousUtxosBeforeMultiXecReceiveTx =
+ currentUtxosAfterSingleXecReceiveTx;
+
+export const currentUtxosAfterMultiXecReceiveTx = [
+ {
+ utxos: [
+ {
+ height: 660149,
+ tx_hash:
+ '976753770d4fd3baa0a36e0792ba6b0f906efc771b25690b5300f5437ba0f0db',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 660971,
+ tx_hash:
+ 'aefc3f3c65760d0f0fa716a84d12c4dc76ca7552953d6c7a4358abb6e24c5d7c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 661700,
+ tx_hash:
+ '854d49d29819cdb5c4d9248146ffc82771cd3a7727f25a22993456f68050503e',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 662159,
+ tx_hash:
+ '05e90e9f35bc041a2939e0e28cf9c436c9adb0f247a7fb0d1f4abb26d418f096',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 662935,
+ tx_hash:
+ 'ec423d0089f5cd85973ff6d875e9507f6b396b3b82bf6e9f5cfb24b7c70273bd',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 666954,
+ tx_hash:
+ '1b19314963be975c57eb37df12b6a8e0598bcb743226cdc684895520f51c4dfe',
+ tx_pos: 1,
+ value: 546,
+ },
+ ],
+ address: 'bitcoincash:qpv9fx6mjdpgltygudnpw3tvmxdyzx7savhphtzswu',
+ },
+ {
+ utxos: [],
+ address: 'bitcoincash:qppc593r2hhksvrz5l77n5yd6usrj74waqnqemgjgf',
+ },
+ {
+ utxos: [
+ {
+ height: 669673,
+ tx_hash:
+ 'bd8b527df1d5d3bd611a8f0ee8f14af83cb7d107fb2e140dbd2d9f4b3a86786a',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 669673,
+ tx_hash:
+ 'd2ad75a6974e4dc021483f381f314d260e958cbcc444230b485436b6264eaf3d',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 669942,
+ tx_hash:
+ 'ff5fe4c631a5dd3e3b1cc74cb12b9eebf04d177c206eaadb8d949cc4fbb6a092',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 669958,
+ tx_hash:
+ '0da32e1f64a12ed2a4afd406368cc76ab3f8c462b26fbdd9817675ffa0fa7668',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 669959,
+ tx_hash:
+ '182f50952631c4bcdd46f4d42ac68376674727fa40dbcbf1101e40fbfd58b55a',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 670076,
+ tx_hash:
+ '4064e02fe523cb107fecaf3f5abaabb89f7e2bb6662751ba4f86f8d18ebeb1fa',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 670482,
+ tx_hash:
+ 'b78a3f8d17fc69cd1314517c36abad85f09fbca4d43ac108bced2ac78428f2c8',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 670670,
+ tx_hash:
+ '55eec1cb63d2b3aa604ba2f505735de07cb224fcdbd8e554aa1180f59cdd0541',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 671724,
+ tx_hash:
+ '37f63a9b1bcdc4733425dcfc3a7f3564d5095467ad7f64707fe52dbe5c1e1897',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 672701,
+ tx_hash:
+ 'f90631b48521a4147dd9dd7091ce936eddc0c3e6221ec87fa4fabacc453a0b95',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 691329,
+ tx_hash:
+ '8d38f2f805ed3f4089cd28cd89ca279628a9fa933b04fd4820d14e66fc4d4ed5',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 714696,
+ tx_hash:
+ 'a3add503bba986398b39fa2200ce658423a597b4f7fe9de04a2da4501f8b05a3',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714696,
+ tx_hash:
+ 'f29939b961d8f3b27d7826e3f22451fcf9273ac84421312a20148b1e083a5bb0',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714701,
+ tx_hash:
+ '2502bdc75d3afdce0742505d53e6d50cefb1268d7c2a835c06b701702b79e1b8',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714705,
+ tx_hash:
+ '742a8e656fe7a6cff86e688ec191be780974fc54b900f58cd15049be89e9e1c5',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714823,
+ tx_hash:
+ 'c70d5f036368e184d2a52389b2f4c2471855aebaccbd418db24d4515ce062dbe',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714823,
+ tx_hash:
+ 'edb693529851379bcbd75008f78940df8232510e6a1c64d8dc81693ae2a53f66',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 722860,
+ tx_hash:
+ 'afe4bc6ff9a3e26b6fb8803b754223b9f368402f479b21c39b2ff8f54bfb7f5e',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 723247,
+ tx_hash:
+ 'cc03f4b178f54327d5c337650531abf2a2464e2a9a486c38c6194f8ac96e9842',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 724544,
+ tx_hash:
+ '83b9bab68c36364035976c7590df0b19d2f7b16c98d51d124891289bf3a122a5',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 724545,
+ tx_hash:
+ '9ea438223212fc98af2ada411ecf75e83a10ad091bebfb0adc3925f32f311c71',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 725144,
+ tx_hash:
+ '69fdd3dc4914c33f980aee4dcc04e65706e43498acf92f48bf70c159cb708111',
+ tx_pos: 1,
+ value: 1254435,
+ },
+ {
+ height: 725144,
+ tx_hash:
+ 'ef67e7785c2a991c4f5fc20f88b2649dd2fb2c637b6861a9586d4449ea1b06b3',
+ tx_pos: 1,
+ value: 463186023,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '19130781afa8476b82797b0abb8ee5206f6f84ab4b1c296b900020f2a885d29a',
+ tx_pos: 0,
+ value: 42000,
+ },
+ {
+ height: 0,
+ tx_hash:
+ 'c1d76ac732b84b9cbd6d94c1463c1739e1a701c5e6bd966f904226ae43c13e0c',
+ tx_pos: 0,
+ value: 42069,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '19130781afa8476b82797b0abb8ee5206f6f84ab4b1c296b900020f2a885d29a',
+ tx_pos: 1,
+ value: 6900,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '19130781afa8476b82797b0abb8ee5206f6f84ab4b1c296b900020f2a885d29a',
+ tx_pos: 2,
+ value: 3300,
+ },
+ ],
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+];
+export const utxosAddedByMultiXecReceiveTx = [
+ {
+ address: 'bitcoincash:qpv9fx6mjdpgltygudnpw3tvmxdyzx7savhphtzswu',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qppc593r2hhksvrz5l77n5yd6usrj74waqnqemgjgf',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ utxos: [
+ {
+ height: 0,
+ tx_hash:
+ '19130781afa8476b82797b0abb8ee5206f6f84ab4b1c296b900020f2a885d29a',
+ tx_pos: 0,
+ value: 42000,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '19130781afa8476b82797b0abb8ee5206f6f84ab4b1c296b900020f2a885d29a',
+ tx_pos: 1,
+ value: 6900,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '19130781afa8476b82797b0abb8ee5206f6f84ab4b1c296b900020f2a885d29a',
+ tx_pos: 2,
+ value: 3300,
+ },
+ ],
+ },
+];
+export const currentUtxosAfterEtokenReceiveTxTemplate = [
+ {
+ utxos: [],
+ address: 'Cashtab 145 address probably with no utxos',
+ },
+ {
+ utxos: [],
+ address: 'Cashtab 245 address probably with no utxos',
+ },
+ {
+ utxos: [
+ {
+ tx_hash: 'some random xec utxo',
+ tx_pos: 1,
+ value: 1000,
+ },
+ {
+ tx_hash: 'some random eToken utxo',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ tx_hash: 'alpha',
+ tx_pos: 1,
+ value: 25000,
+ },
+ {
+ tx_hash: 'Newly Received eToken Utxo',
+ tx_pos: 0,
+ value: 546,
+ },
+ ],
+ address: 'Cashtab 1899 address probably with all the utxos',
+ },
+];
+export const utxosAddedByEtokenReceiveTxTemplate = [
+ {
+ utxos: [],
+ address: 'Cashtab 145 address probably with no utxos',
+ },
+ {
+ utxos: [],
+ address: 'Cashtab 245 address probably with no utxos',
+ },
+ {
+ utxos: [
+ {
+ tx_hash: 'Newly Received eToken Utxo',
+ tx_pos: 0,
+ value: 546,
+ },
+ ],
+ address: 'Cashtab 1899 address probably with all the utxos',
+ },
+];
+export const previousUtxosBeforeEtokenReceiveTx =
+ currentUtxosAfterMultiXecReceiveTx;
+export const currentUtxosAfterEtokenReceiveTx = [
+ {
+ utxos: [
+ {
+ height: 660149,
+ tx_hash:
+ '976753770d4fd3baa0a36e0792ba6b0f906efc771b25690b5300f5437ba0f0db',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 660971,
+ tx_hash:
+ 'aefc3f3c65760d0f0fa716a84d12c4dc76ca7552953d6c7a4358abb6e24c5d7c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 661700,
+ tx_hash:
+ '854d49d29819cdb5c4d9248146ffc82771cd3a7727f25a22993456f68050503e',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 662159,
+ tx_hash:
+ '05e90e9f35bc041a2939e0e28cf9c436c9adb0f247a7fb0d1f4abb26d418f096',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 662935,
+ tx_hash:
+ 'ec423d0089f5cd85973ff6d875e9507f6b396b3b82bf6e9f5cfb24b7c70273bd',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 666954,
+ tx_hash:
+ '1b19314963be975c57eb37df12b6a8e0598bcb743226cdc684895520f51c4dfe',
+ tx_pos: 1,
+ value: 546,
+ },
+ ],
+ address: 'bitcoincash:qpv9fx6mjdpgltygudnpw3tvmxdyzx7savhphtzswu',
+ },
+ {
+ utxos: [],
+ address: 'bitcoincash:qppc593r2hhksvrz5l77n5yd6usrj74waqnqemgjgf',
+ },
+ {
+ utxos: [
+ {
+ height: 669673,
+ tx_hash:
+ 'bd8b527df1d5d3bd611a8f0ee8f14af83cb7d107fb2e140dbd2d9f4b3a86786a',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 669673,
+ tx_hash:
+ 'd2ad75a6974e4dc021483f381f314d260e958cbcc444230b485436b6264eaf3d',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 669942,
+ tx_hash:
+ 'ff5fe4c631a5dd3e3b1cc74cb12b9eebf04d177c206eaadb8d949cc4fbb6a092',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 669958,
+ tx_hash:
+ '0da32e1f64a12ed2a4afd406368cc76ab3f8c462b26fbdd9817675ffa0fa7668',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 669959,
+ tx_hash:
+ '182f50952631c4bcdd46f4d42ac68376674727fa40dbcbf1101e40fbfd58b55a',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 670076,
+ tx_hash:
+ '4064e02fe523cb107fecaf3f5abaabb89f7e2bb6662751ba4f86f8d18ebeb1fa',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 670482,
+ tx_hash:
+ 'b78a3f8d17fc69cd1314517c36abad85f09fbca4d43ac108bced2ac78428f2c8',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 670670,
+ tx_hash:
+ '55eec1cb63d2b3aa604ba2f505735de07cb224fcdbd8e554aa1180f59cdd0541',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 671724,
+ tx_hash:
+ '37f63a9b1bcdc4733425dcfc3a7f3564d5095467ad7f64707fe52dbe5c1e1897',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 672701,
+ tx_hash:
+ 'f90631b48521a4147dd9dd7091ce936eddc0c3e6221ec87fa4fabacc453a0b95',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 691329,
+ tx_hash:
+ '8d38f2f805ed3f4089cd28cd89ca279628a9fa933b04fd4820d14e66fc4d4ed5',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 714696,
+ tx_hash:
+ 'a3add503bba986398b39fa2200ce658423a597b4f7fe9de04a2da4501f8b05a3',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714696,
+ tx_hash:
+ 'f29939b961d8f3b27d7826e3f22451fcf9273ac84421312a20148b1e083a5bb0',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714701,
+ tx_hash:
+ '2502bdc75d3afdce0742505d53e6d50cefb1268d7c2a835c06b701702b79e1b8',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714705,
+ tx_hash:
+ '742a8e656fe7a6cff86e688ec191be780974fc54b900f58cd15049be89e9e1c5',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714823,
+ tx_hash:
+ 'c70d5f036368e184d2a52389b2f4c2471855aebaccbd418db24d4515ce062dbe',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714823,
+ tx_hash:
+ 'edb693529851379bcbd75008f78940df8232510e6a1c64d8dc81693ae2a53f66',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 722860,
+ tx_hash:
+ 'afe4bc6ff9a3e26b6fb8803b754223b9f368402f479b21c39b2ff8f54bfb7f5e',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 723247,
+ tx_hash:
+ 'cc03f4b178f54327d5c337650531abf2a2464e2a9a486c38c6194f8ac96e9842',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 724544,
+ tx_hash:
+ '83b9bab68c36364035976c7590df0b19d2f7b16c98d51d124891289bf3a122a5',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 724545,
+ tx_hash:
+ '9ea438223212fc98af2ada411ecf75e83a10ad091bebfb0adc3925f32f311c71',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 725144,
+ tx_hash:
+ '69fdd3dc4914c33f980aee4dcc04e65706e43498acf92f48bf70c159cb708111',
+ tx_pos: 1,
+ value: 1254435,
+ },
+ {
+ height: 725144,
+ tx_hash:
+ 'ef67e7785c2a991c4f5fc20f88b2649dd2fb2c637b6861a9586d4449ea1b06b3',
+ tx_pos: 1,
+ value: 463186023,
+ },
+ {
+ height: 726142,
+ tx_hash:
+ '19130781afa8476b82797b0abb8ee5206f6f84ab4b1c296b900020f2a885d29a',
+ tx_pos: 0,
+ value: 42000,
+ },
+ {
+ height: 726142,
+ tx_hash:
+ '19130781afa8476b82797b0abb8ee5206f6f84ab4b1c296b900020f2a885d29a',
+ tx_pos: 1,
+ value: 6900,
+ },
+ {
+ height: 726142,
+ tx_hash:
+ '19130781afa8476b82797b0abb8ee5206f6f84ab4b1c296b900020f2a885d29a',
+ tx_pos: 2,
+ value: 3300,
+ },
+ {
+ height: 726142,
+ tx_hash:
+ 'c1d76ac732b84b9cbd6d94c1463c1739e1a701c5e6bd966f904226ae43c13e0c',
+ tx_pos: 0,
+ value: 42069,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '66f0663e79f6a7fa3bf0834a16b48cb86fa42076c0df25ae89b402d5ee97c311',
+ tx_pos: 1,
+ value: 546,
+ },
+ ],
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+];
+export const utxosAddedByEtokenReceiveTx = [
+ {
+ address: 'bitcoincash:qpv9fx6mjdpgltygudnpw3tvmxdyzx7savhphtzswu',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qppc593r2hhksvrz5l77n5yd6usrj74waqnqemgjgf',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ utxos: [
+ {
+ height: 0,
+ tx_hash:
+ '66f0663e79f6a7fa3bf0834a16b48cb86fa42076c0df25ae89b402d5ee97c311',
+ tx_pos: 1,
+ value: 546,
+ },
+ ],
+ },
+];
+export const previousUtxosBeforeSendAllTxTemplate = [
+ {
+ utxos: [],
+ address: 'Cashtab 145 address probably with no utxos',
+ },
+ {
+ utxos: [],
+ address: 'Cashtab 245 address probably with no utxos',
+ },
+ {
+ utxos: [
+ {
+ tx_hash: 'alpha',
+ tx_pos: 1,
+ value: 25550,
+ },
+ ],
+ address: 'Cashtab 1899 address probably with all the utxos',
+ },
+];
+export const currentUtxosAfterSendAllTxTemplate = [
+ {
+ utxos: [],
+ address: 'Cashtab 145 address probably with no utxos',
+ },
+ {
+ utxos: [],
+ address: 'Cashtab 245 address probably with no utxos',
+ },
+ {
+ utxos: [],
+ address: 'Cashtab 1899 address probably with all the utxos',
+ },
+];
+export const previousUtxosBeforeSendAllTx = [
+ {
+ utxos: [],
+ address: 'bitcoincash:qq3q2vr3qkawa3m2lhg5wurzgpxjqvek6crvxgpsrf',
+ },
+ {
+ utxos: [],
+ address: 'bitcoincash:qzv8arsknrmda2n4xg02rvtp2yzh072c6s5ms7jhfq',
+ },
+ {
+ utxos: [
+ {
+ height: 726153,
+ tx_hash:
+ 'a40216751b8c9c5ade1dd2962afcdc657e4e2c92416fb0b2dd956bce75425afb',
+ tx_pos: 0,
+ value: 4206900,
+ },
+ ],
+ address: 'bitcoincash:qq3af2r4n5ndek40cq3lq8y5qjq8v0aq4sc0faj07q',
+ },
+];
+export const currentUtxosAfterSendAllTx = [
+ {
+ utxos: [],
+ address: 'bitcoincash:qq3q2vr3qkawa3m2lhg5wurzgpxjqvek6crvxgpsrf',
+ },
+ {
+ utxos: [],
+ address: 'bitcoincash:qzv8arsknrmda2n4xg02rvtp2yzh072c6s5ms7jhfq',
+ },
+ {
+ utxos: [],
+ address: 'bitcoincash:qq3af2r4n5ndek40cq3lq8y5qjq8v0aq4sc0faj07q',
+ },
+];
+export const previousUtxosBeforeSingleXecSendTx =
+ currentUtxosAfterEtokenReceiveTx;
+export const currentUtxosAfterSingleXecSendTx = [
+ {
+ utxos: [
+ {
+ height: 660149,
+ tx_hash:
+ '976753770d4fd3baa0a36e0792ba6b0f906efc771b25690b5300f5437ba0f0db',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 660971,
+ tx_hash:
+ 'aefc3f3c65760d0f0fa716a84d12c4dc76ca7552953d6c7a4358abb6e24c5d7c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 661700,
+ tx_hash:
+ '854d49d29819cdb5c4d9248146ffc82771cd3a7727f25a22993456f68050503e',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 662159,
+ tx_hash:
+ '05e90e9f35bc041a2939e0e28cf9c436c9adb0f247a7fb0d1f4abb26d418f096',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 662935,
+ tx_hash:
+ 'ec423d0089f5cd85973ff6d875e9507f6b396b3b82bf6e9f5cfb24b7c70273bd',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 666954,
+ tx_hash:
+ '1b19314963be975c57eb37df12b6a8e0598bcb743226cdc684895520f51c4dfe',
+ tx_pos: 1,
+ value: 546,
+ },
+ ],
+ address: 'bitcoincash:qpv9fx6mjdpgltygudnpw3tvmxdyzx7savhphtzswu',
+ },
+ {
+ utxos: [],
+ address: 'bitcoincash:qppc593r2hhksvrz5l77n5yd6usrj74waqnqemgjgf',
+ },
+ {
+ utxos: [
+ {
+ height: 669673,
+ tx_hash:
+ 'bd8b527df1d5d3bd611a8f0ee8f14af83cb7d107fb2e140dbd2d9f4b3a86786a',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 669673,
+ tx_hash:
+ 'd2ad75a6974e4dc021483f381f314d260e958cbcc444230b485436b6264eaf3d',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 669942,
+ tx_hash:
+ 'ff5fe4c631a5dd3e3b1cc74cb12b9eebf04d177c206eaadb8d949cc4fbb6a092',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 669958,
+ tx_hash:
+ '0da32e1f64a12ed2a4afd406368cc76ab3f8c462b26fbdd9817675ffa0fa7668',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 669959,
+ tx_hash:
+ '182f50952631c4bcdd46f4d42ac68376674727fa40dbcbf1101e40fbfd58b55a',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 670076,
+ tx_hash:
+ '4064e02fe523cb107fecaf3f5abaabb89f7e2bb6662751ba4f86f8d18ebeb1fa',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 670482,
+ tx_hash:
+ 'b78a3f8d17fc69cd1314517c36abad85f09fbca4d43ac108bced2ac78428f2c8',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 670670,
+ tx_hash:
+ '55eec1cb63d2b3aa604ba2f505735de07cb224fcdbd8e554aa1180f59cdd0541',
+ tx_pos: 0,
+ value: 546,
+ },
+ {
+ height: 671724,
+ tx_hash:
+ '37f63a9b1bcdc4733425dcfc3a7f3564d5095467ad7f64707fe52dbe5c1e1897',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 672701,
+ tx_hash:
+ 'f90631b48521a4147dd9dd7091ce936eddc0c3e6221ec87fa4fabacc453a0b95',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 691329,
+ tx_hash:
+ '8d38f2f805ed3f4089cd28cd89ca279628a9fa933b04fd4820d14e66fc4d4ed5',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 714696,
+ tx_hash:
+ 'a3add503bba986398b39fa2200ce658423a597b4f7fe9de04a2da4501f8b05a3',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714696,
+ tx_hash:
+ 'f29939b961d8f3b27d7826e3f22451fcf9273ac84421312a20148b1e083a5bb0',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714701,
+ tx_hash:
+ '2502bdc75d3afdce0742505d53e6d50cefb1268d7c2a835c06b701702b79e1b8',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714705,
+ tx_hash:
+ '742a8e656fe7a6cff86e688ec191be780974fc54b900f58cd15049be89e9e1c5',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714823,
+ tx_hash:
+ 'c70d5f036368e184d2a52389b2f4c2471855aebaccbd418db24d4515ce062dbe',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 714823,
+ tx_hash:
+ 'edb693529851379bcbd75008f78940df8232510e6a1c64d8dc81693ae2a53f66',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 722860,
+ tx_hash:
+ 'afe4bc6ff9a3e26b6fb8803b754223b9f368402f479b21c39b2ff8f54bfb7f5e',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 723247,
+ tx_hash:
+ 'cc03f4b178f54327d5c337650531abf2a2464e2a9a486c38c6194f8ac96e9842',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 724544,
+ tx_hash:
+ '83b9bab68c36364035976c7590df0b19d2f7b16c98d51d124891289bf3a122a5',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 724545,
+ tx_hash:
+ '9ea438223212fc98af2ada411ecf75e83a10ad091bebfb0adc3925f32f311c71',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 726142,
+ tx_hash:
+ '19130781afa8476b82797b0abb8ee5206f6f84ab4b1c296b900020f2a885d29a',
+ tx_pos: 0,
+ value: 42000,
+ },
+ {
+ height: 726142,
+ tx_hash:
+ '19130781afa8476b82797b0abb8ee5206f6f84ab4b1c296b900020f2a885d29a',
+ tx_pos: 1,
+ value: 6900,
+ },
+ {
+ height: 726142,
+ tx_hash:
+ '19130781afa8476b82797b0abb8ee5206f6f84ab4b1c296b900020f2a885d29a',
+ tx_pos: 2,
+ value: 3300,
+ },
+ {
+ height: 726142,
+ tx_hash:
+ 'c1d76ac732b84b9cbd6d94c1463c1739e1a701c5e6bd966f904226ae43c13e0c',
+ tx_pos: 0,
+ value: 42069,
+ },
+ {
+ height: 726143,
+ tx_hash:
+ '66f0663e79f6a7fa3bf0834a16b48cb86fa42076c0df25ae89b402d5ee97c311',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '082fb2d1289f1c6576c34c714c3a7b3e8fef89e16802d0ea47777fcf339c99ee',
+ tx_pos: 1,
+ value: 460232806,
+ },
+ ],
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+];
+// i.e. change
+export const utxosAddedBySingleXecSendTx = [
+ {
+ address: 'bitcoincash:qpv9fx6mjdpgltygudnpw3tvmxdyzx7savhphtzswu',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qppc593r2hhksvrz5l77n5yd6usrj74waqnqemgjgf',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ utxos: [
+ {
+ height: 0,
+ tx_hash:
+ '082fb2d1289f1c6576c34c714c3a7b3e8fef89e16802d0ea47777fcf339c99ee',
+ tx_pos: 1,
+ value: 460232806,
+ },
+ ],
+ },
+];
+export const currentUtxosAfterSingleXecSendTxTemplate = [
+ {
+ utxos: [],
+ address: 'Cashtab 145 address probably with no utxos',
+ },
+ {
+ utxos: [],
+ address: 'Cashtab 245 address probably with no utxos',
+ },
+ {
+ utxos: [
+ {
+ tx_hash: 'some random xec utxo',
+ tx_pos: 1,
+ value: 1000,
+ },
+ {
+ tx_hash: 'some random eToken utxo',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ tx_hash: 'alpha',
+ tx_pos: 1,
+ value: 25000,
+ },
+ {
+ tx_hash: 'Change utxo from a tx sending 100,000 XEC',
+ tx_pos: 0,
+ value: 2500000,
+ },
+ {
+ tx_hash: 'Consumed utxo from sending an eToken tx (XEC utxo)',
+ tx_pos: 0,
+ value: 10546,
+ },
+ {
+ tx_hash:
+ 'Consumed utxo from sending an eToken tx (eToken utxo)',
+ tx_pos: 1,
+ value: 546,
+ },
+ ],
+ address: 'Cashtab 1899 address probably with all the utxos',
+ },
+];
+export const utxosAddedBySingleXecSendTxTemplate = [
+ {
+ utxos: [],
+ address: 'Cashtab 145 address probably with no utxos',
+ },
+ {
+ utxos: [],
+ address: 'Cashtab 245 address probably with no utxos',
+ },
+ {
+ utxos: [
+ {
+ tx_hash: 'Change utxo from a tx sending 100,000 XEC',
+ tx_pos: 0,
+ value: 2500000,
+ },
+ ],
+ address: 'Cashtab 1899 address probably with all the utxos',
+ },
+];
+export const currentUtxosAfterEtokenSendTxTemplate = [
+ {
+ utxos: [],
+ address: 'Cashtab 145 address probably with no utxos',
+ },
+ {
+ utxos: [],
+ address: 'Cashtab 245 address probably with no utxos',
+ },
+ {
+ utxos: [
+ {
+ tx_hash: 'some random xec utxo',
+ tx_pos: 1,
+ value: 1000,
+ },
+ {
+ tx_hash: 'some random eToken utxo',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ tx_hash: 'alpha',
+ tx_pos: 1,
+ value: 25000,
+ },
+ {
+ tx_hash: 'Consumed utxo from a tx sending 100,000 XEC',
+ tx_pos: 0,
+ value: 7500000,
+ },
+ {
+ tx_hash:
+ 'Consumed utxo from a tx sending 100,000 XEC, not necessarily the same txid',
+ tx_pos: 1,
+ value: 5000000,
+ },
+ {
+ tx_hash: 'Change utxo from an eToken tx (XEC change)',
+ tx_pos: 0,
+ value: 9454,
+ },
+ {
+ tx_hash: 'Change utxo from an eToken tx (eToken change)',
+ tx_pos: 0,
+ value: 546,
+ },
+ ],
+ address: 'Cashtab 1899 address probably with all the utxos',
+ },
+];
+export const utxosAddedByEtokenSendTxTemplate = [
+ {
+ utxos: [],
+ address: 'Cashtab 145 address probably with no utxos',
+ },
+ {
+ utxos: [],
+ address: 'Cashtab 245 address probably with no utxos',
+ },
+ {
+ utxos: [
+ {
+ tx_hash: 'Change utxo from an eToken tx (XEC change)',
+ tx_pos: 0,
+ value: 9454,
+ },
+ {
+ tx_hash: 'Change utxo from an eToken tx (eToken change)',
+ tx_pos: 0,
+ value: 546,
+ },
+ ],
+ address: 'Cashtab 1899 address probably with all the utxos',
+ },
+];
+export const previousUtxosBeforeEtokenSendTx = [
+ {
+ utxos: [],
+ address: 'bitcoincash:qq0mw6nah9huwaxt45qw3fegjpszkjlrqsvttwy36p',
+ },
+ {
+ utxos: [],
+ address: 'bitcoincash:qz5lf9pxde9neq3hzte8mmwts03sktl9nuz6m3dynu',
+ },
+ {
+ utxos: [
+ {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 685181,
+ tx_hash:
+ '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 686546,
+ tx_hash:
+ 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 687240,
+ tx_hash:
+ 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 688194,
+ tx_hash:
+ '3de671a7107d3803d78f7f4a4e5c794d0903a8d28d16076445c084943c1e2db8',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 688449,
+ tx_hash:
+ 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 693606,
+ tx_hash:
+ '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 699216,
+ tx_hash:
+ '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 699359,
+ tx_hash:
+ 'b99cb29050779d4f185c3c31c22e664436966314c8b260075b38bbb453180603',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 700185,
+ tx_hash:
+ '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 700469,
+ tx_hash:
+ 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 700572,
+ tx_hash:
+ '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 700677,
+ tx_hash:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 700915,
+ tx_hash:
+ 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701191,
+ tx_hash:
+ 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701194,
+ tx_hash:
+ 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701208,
+ tx_hash:
+ '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701221,
+ tx_hash:
+ '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701223,
+ tx_hash:
+ '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 709251,
+ tx_hash:
+ '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 709259,
+ tx_hash:
+ '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 709668,
+ tx_hash:
+ 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 710065,
+ tx_hash:
+ '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 711088,
+ tx_hash:
+ '982ca55c84510e4184ff5a6e7fc310a1de7833e8c617b46014f962ed89bf0f57',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 711227,
+ tx_hash:
+ 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 715111,
+ tx_hash:
+ 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 715816,
+ tx_hash:
+ '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 717055,
+ tx_hash:
+ '18c0360f0db5399223cbed48f55c4cee9d9914c8a4a7dedcf9172a36201e9896',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 717653,
+ tx_hash:
+ '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 717824,
+ tx_hash:
+ 'c0fe05d7bf71cd0f476ea18cdd4ecb26e1b9a33c911f4aaf143b2b18bc3b5f4f',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 718091,
+ tx_hash:
+ '905cc5662cad77df56c3770863634ce498dde9d4772dc494d33b7ce3f36fa66c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 718280,
+ tx_hash:
+ 'f31f4ad7bf035cfb587a07a12ec60937cb8cbeafa7e4d7ed4f3276fea26fcfec',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 718790,
+ tx_hash:
+ '67faa4753da2940d053f32edcda2c052a16c683aeb73f10cfde5c18266c14fe2',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 720056,
+ tx_hash:
+ '9c6363fb537d529f512a12d292ea9682fe7159e6bf5ebfec5b7067b401d2dba4',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '4eed87ba70864d9daa46d201c47db4513f77e5d4cc01256ab4dcc6dae9dfa055',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '7975514a3185cbb70900e9767e5fcc91c86913cb1d2ad9a28474253875271e33',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'e10ae7a1bc78561ed367d59f150aebc13ef2054ba62f1a0db08fc7612d5ed58b',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'fb71c88bd5369cb8278f49ac672a9721833c36fc69143848b46ae15860339ea6',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720078,
+ tx_hash:
+ 'c3c6c6fb1619d001c29f17a701d042bc6b983e71113822aeeb66ca434fd9fa6c',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720951,
+ tx_hash:
+ 'fb50eac73a4fd5e2a701e0dbf4e575cea9c083e061b1db722e057164c7317e5b',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 721083,
+ tx_hash:
+ 'dfb3dbf90fd87f6d66465ff05a61ddf1e1ca30900fadfe9cd4b73468649935ed',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 724822,
+ tx_hash:
+ 'ed0dab39d5e976e433a705785726901dc83daa7d579412c18ee997341de010d3',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 725143,
+ tx_hash:
+ 'e99296764134d6ea9ba7521490563762cfaf1541854ba9babc26c0df8665ac32',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 725871,
+ tx_hash:
+ '82a3fe0b03ab07a564351443634da1b1ed3960e4771c59b6f8abbf7ef4b3258d',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 725882,
+ tx_hash:
+ '1db1bef70013d178d7912731435029f9c8588f1d0089944c53eccffd255b5efc',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 726001,
+ tx_hash:
+ '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 726008,
+ tx_hash:
+ '85e9379d5b9b371aa7f9464376290fbc6a40083ec14883460b649898f6d7c60b',
+ tx_pos: 0,
+ value: 10000,
+ },
+ {
+ height: 726008,
+ tx_hash:
+ '85e9379d5b9b371aa7f9464376290fbc6a40083ec14883460b649898f6d7c60b',
+ tx_pos: 1,
+ value: 20000,
+ },
+ {
+ height: 726008,
+ tx_hash:
+ '85e9379d5b9b371aa7f9464376290fbc6a40083ec14883460b649898f6d7c60b',
+ tx_pos: 2,
+ value: 30000,
+ },
+ {
+ height: 726008,
+ tx_hash:
+ '85e9379d5b9b371aa7f9464376290fbc6a40083ec14883460b649898f6d7c60b',
+ tx_pos: 3,
+ value: 40000,
+ },
+ {
+ height: 726008,
+ tx_hash:
+ '85e9379d5b9b371aa7f9464376290fbc6a40083ec14883460b649898f6d7c60b',
+ tx_pos: 4,
+ value: 50000,
+ },
+ {
+ height: 726009,
+ tx_hash:
+ '52d2fd9d10debecbed6f8c3554517dada688c83197c4e57ad74556f0317c84b4',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 726009,
+ tx_hash:
+ '9a0ba92af0aaaf16ec6a8bf0fc12d919078cd4c3f556a27dc792689803337ef9',
+ tx_pos: 1,
+ value: 95202647,
+ },
+ {
+ height: 726009,
+ tx_hash:
+ 'b7bc037936eaac55cb2f377bbf564a06e86c419875f4ab2879f452e598aa999b',
+ tx_pos: 1,
+ value: 50148,
+ },
+ {
+ height: 726009,
+ tx_hash:
+ 'd2e7d88785948ea46d1162401abf6e26b42b886df5c7fe5a64fe14ed292ebcdd',
+ tx_pos: 1,
+ value: 5146,
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+];
+export const currentUtxosAfterEtokenSendTx = [
+ {
+ utxos: [],
+ address: 'bitcoincash:qq0mw6nah9huwaxt45qw3fegjpszkjlrqsvttwy36p',
+ },
+ {
+ utxos: [],
+ address: 'bitcoincash:qz5lf9pxde9neq3hzte8mmwts03sktl9nuz6m3dynu',
+ },
+ {
+ utxos: [
+ {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 685181,
+ tx_hash:
+ '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 686546,
+ tx_hash:
+ 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 687240,
+ tx_hash:
+ 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 688194,
+ tx_hash:
+ '3de671a7107d3803d78f7f4a4e5c794d0903a8d28d16076445c084943c1e2db8',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 688449,
+ tx_hash:
+ 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 693606,
+ tx_hash:
+ '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 699216,
+ tx_hash:
+ '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 699359,
+ tx_hash:
+ 'b99cb29050779d4f185c3c31c22e664436966314c8b260075b38bbb453180603',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 700185,
+ tx_hash:
+ '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 700469,
+ tx_hash:
+ 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 700572,
+ tx_hash:
+ '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 700677,
+ tx_hash:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 700915,
+ tx_hash:
+ 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701191,
+ tx_hash:
+ 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701194,
+ tx_hash:
+ 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701208,
+ tx_hash:
+ '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701221,
+ tx_hash:
+ '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701223,
+ tx_hash:
+ '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 709251,
+ tx_hash:
+ '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 709259,
+ tx_hash:
+ '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 709668,
+ tx_hash:
+ 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 710065,
+ tx_hash:
+ '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 711227,
+ tx_hash:
+ 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 715111,
+ tx_hash:
+ 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 715816,
+ tx_hash:
+ '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 717055,
+ tx_hash:
+ '18c0360f0db5399223cbed48f55c4cee9d9914c8a4a7dedcf9172a36201e9896',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 717653,
+ tx_hash:
+ '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 717824,
+ tx_hash:
+ 'c0fe05d7bf71cd0f476ea18cdd4ecb26e1b9a33c911f4aaf143b2b18bc3b5f4f',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 718091,
+ tx_hash:
+ '905cc5662cad77df56c3770863634ce498dde9d4772dc494d33b7ce3f36fa66c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 718280,
+ tx_hash:
+ 'f31f4ad7bf035cfb587a07a12ec60937cb8cbeafa7e4d7ed4f3276fea26fcfec',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 718790,
+ tx_hash:
+ '67faa4753da2940d053f32edcda2c052a16c683aeb73f10cfde5c18266c14fe2',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 720056,
+ tx_hash:
+ '9c6363fb537d529f512a12d292ea9682fe7159e6bf5ebfec5b7067b401d2dba4',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '4eed87ba70864d9daa46d201c47db4513f77e5d4cc01256ab4dcc6dae9dfa055',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '7975514a3185cbb70900e9767e5fcc91c86913cb1d2ad9a28474253875271e33',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'e10ae7a1bc78561ed367d59f150aebc13ef2054ba62f1a0db08fc7612d5ed58b',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'fb71c88bd5369cb8278f49ac672a9721833c36fc69143848b46ae15860339ea6',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720078,
+ tx_hash:
+ 'c3c6c6fb1619d001c29f17a701d042bc6b983e71113822aeeb66ca434fd9fa6c',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720951,
+ tx_hash:
+ 'fb50eac73a4fd5e2a701e0dbf4e575cea9c083e061b1db722e057164c7317e5b',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 721083,
+ tx_hash:
+ 'dfb3dbf90fd87f6d66465ff05a61ddf1e1ca30900fadfe9cd4b73468649935ed',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 724822,
+ tx_hash:
+ 'ed0dab39d5e976e433a705785726901dc83daa7d579412c18ee997341de010d3',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 725143,
+ tx_hash:
+ 'e99296764134d6ea9ba7521490563762cfaf1541854ba9babc26c0df8665ac32',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 725871,
+ tx_hash:
+ '82a3fe0b03ab07a564351443634da1b1ed3960e4771c59b6f8abbf7ef4b3258d',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 725882,
+ tx_hash:
+ '1db1bef70013d178d7912731435029f9c8588f1d0089944c53eccffd255b5efc',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 726001,
+ tx_hash:
+ '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 726008,
+ tx_hash:
+ '85e9379d5b9b371aa7f9464376290fbc6a40083ec14883460b649898f6d7c60b',
+ tx_pos: 0,
+ value: 10000,
+ },
+ {
+ height: 726008,
+ tx_hash:
+ '85e9379d5b9b371aa7f9464376290fbc6a40083ec14883460b649898f6d7c60b',
+ tx_pos: 1,
+ value: 20000,
+ },
+ {
+ height: 726008,
+ tx_hash:
+ '85e9379d5b9b371aa7f9464376290fbc6a40083ec14883460b649898f6d7c60b',
+ tx_pos: 2,
+ value: 30000,
+ },
+ {
+ height: 726008,
+ tx_hash:
+ '85e9379d5b9b371aa7f9464376290fbc6a40083ec14883460b649898f6d7c60b',
+ tx_pos: 3,
+ value: 40000,
+ },
+ {
+ height: 726008,
+ tx_hash:
+ '85e9379d5b9b371aa7f9464376290fbc6a40083ec14883460b649898f6d7c60b',
+ tx_pos: 4,
+ value: 50000,
+ },
+ {
+ height: 726009,
+ tx_hash:
+ '52d2fd9d10debecbed6f8c3554517dada688c83197c4e57ad74556f0317c84b4',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 726009,
+ tx_hash:
+ 'b7bc037936eaac55cb2f377bbf564a06e86c419875f4ab2879f452e598aa999b',
+ tx_pos: 1,
+ value: 50148,
+ },
+ {
+ height: 726009,
+ tx_hash:
+ 'd2e7d88785948ea46d1162401abf6e26b42b886df5c7fe5a64fe14ed292ebcdd',
+ tx_pos: 1,
+ value: 5146,
+ },
+ {
+ height: 0,
+ tx_hash:
+ 'b8982cf5531afcba125a9e17550d42a01045c3aa5ee70a485f8fbcde3dae191d',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 0,
+ tx_hash:
+ 'b8982cf5531afcba125a9e17550d42a01045c3aa5ee70a485f8fbcde3dae191d',
+ tx_pos: 3,
+ value: 95200829,
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+];
+export const utxosAddedByEtokenSendTx = [
+ {
+ address: 'bitcoincash:qq0mw6nah9huwaxt45qw3fegjpszkjlrqsvttwy36p',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qz5lf9pxde9neq3hzte8mmwts03sktl9nuz6m3dynu',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ utxos: [
+ {
+ height: 0,
+ tx_hash:
+ 'b8982cf5531afcba125a9e17550d42a01045c3aa5ee70a485f8fbcde3dae191d',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 0,
+ tx_hash:
+ 'b8982cf5531afcba125a9e17550d42a01045c3aa5ee70a485f8fbcde3dae191d',
+ tx_pos: 3,
+ value: 95200829,
+ },
+ ],
+ },
+];
+
+export const utxosConsumedByEtokenSendTx = [
+ {
+ address: 'bitcoincash:qq0mw6nah9huwaxt45qw3fegjpszkjlrqsvttwy36p',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qz5lf9pxde9neq3hzte8mmwts03sktl9nuz6m3dynu',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ utxos: [
+ {
+ height: 711088,
+ tx_hash:
+ '982ca55c84510e4184ff5a6e7fc310a1de7833e8c617b46014f962ed89bf0f57',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 726009,
+ tx_hash:
+ '9a0ba92af0aaaf16ec6a8bf0fc12d919078cd4c3f556a27dc792689803337ef9',
+ tx_pos: 1,
+ value: 95202647,
+ },
+ ],
+ },
+];
+export const utxosConsumedByEtokenSendTxTemplate = [
+ {
+ utxos: [],
+ address: 'Cashtab 145 address probably with no utxos',
+ },
+ {
+ utxos: [],
+ address: 'Cashtab 245 address probably with no utxos',
+ },
+ {
+ utxos: [
+ {
+ tx_hash: 'Consumed utxo from sending an eToken tx (XEC utxo)',
+ tx_pos: 0,
+ value: 10546,
+ },
+ {
+ tx_hash:
+ 'Consumed utxo from sending an eToken tx (eToken utxo)',
+ tx_pos: 1,
+ value: 546,
+ },
+ ],
+ address: 'Cashtab 1899 address probably with all the utxos',
+ },
+];
+export const utxosConsumedBySingleXecSendTxTemplate = [
+ {
+ utxos: [],
+ address: 'Cashtab 145 address probably with no utxos',
+ },
+ {
+ utxos: [],
+ address: 'Cashtab 245 address probably with no utxos',
+ },
+ {
+ utxos: [
+ {
+ tx_hash: 'Consumed utxo from a tx sending 100,000 XEC',
+ tx_pos: 0,
+ value: 7500000,
+ },
+ {
+ tx_hash:
+ 'Consumed utxo from a tx sending 100,000 XEC, not necessarily the same txid',
+ tx_pos: 1,
+ value: 5000000,
+ },
+ ],
+ address: 'Cashtab 1899 address probably with all the utxos',
+ },
+];
+export const utxosConsumedBySendAllTxTemplate =
+ previousUtxosBeforeSendAllTxTemplate;
+
+export const utxosConsumedBySingleXecSendTx = [
+ {
+ address: 'bitcoincash:qpv9fx6mjdpgltygudnpw3tvmxdyzx7savhphtzswu',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qppc593r2hhksvrz5l77n5yd6usrj74waqnqemgjgf',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ utxos: [
+ {
+ height: 725144,
+ tx_hash:
+ '69fdd3dc4914c33f980aee4dcc04e65706e43498acf92f48bf70c159cb708111',
+ tx_pos: 1,
+ value: 1254435,
+ },
+ {
+ height: 725144,
+ tx_hash:
+ 'ef67e7785c2a991c4f5fc20f88b2649dd2fb2c637b6861a9586d4449ea1b06b3',
+ tx_pos: 1,
+ value: 463186023,
+ },
+ ],
+ },
+];
+
+export const utxosConsumedBySendAllTx = [
+ {
+ address: 'bitcoincash:qq3q2vr3qkawa3m2lhg5wurzgpxjqvek6crvxgpsrf',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qzv8arsknrmda2n4xg02rvtp2yzh072c6s5ms7jhfq',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qq3af2r4n5ndek40cq3lq8y5qjq8v0aq4sc0faj07q',
+ utxos: [
+ {
+ height: 726153,
+ tx_hash:
+ 'a40216751b8c9c5ade1dd2962afcdc657e4e2c92416fb0b2dd956bce75425afb',
+ tx_pos: 0,
+ value: 4206900,
+ },
+ ],
+ },
+];
+
+// addNewHydratedUtxos mocks
+
+export const newHydratedUtxosSingleTemplate = {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 725886,
+ tx_hash:
+ '29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78',
+ tx_pos: 0,
+ value: 3300,
+ txid: '29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78',
+ vout: 0,
+ isValid: false,
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+};
+
+export const hydratedUtxoDetailsBeforeAddingTemplate = {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 725886,
+ tx_hash:
+ '29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78',
+ tx_pos: 0,
+ value: 3300,
+ txid: '29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78',
+ vout: 0,
+ isValid: false,
+ },
+ {
+ height: 725886,
+ tx_hash:
+ '29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78',
+ tx_pos: 0,
+ value: 3300,
+ txid: '29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78',
+ vout: 0,
+ isValid: false,
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+};
+
+export const hydratedUtxoDetailsAfterAddingSingleUtxoTemplate = {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 725886,
+ tx_hash:
+ '29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78',
+ tx_pos: 0,
+ value: 3300,
+ txid: '29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78',
+ vout: 0,
+ isValid: false,
+ },
+ {
+ height: 725886,
+ tx_hash:
+ '29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78',
+ tx_pos: 0,
+ value: 3300,
+ txid: '29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78',
+ vout: 0,
+ isValid: false,
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 725886,
+ tx_hash:
+ '29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78',
+ tx_pos: 0,
+ value: 3300,
+ txid: '29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78',
+ vout: 0,
+ isValid: false,
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+};
+
+export const addedHydratedUtxosOverTwenty = {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 0,
+ value: 2000,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 0,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 1,
+ value: 2100,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 1,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 2,
+ value: 2200,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 2,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 3,
+ value: 2300,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 3,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 4,
+ value: 2400,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 4,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 5,
+ value: 2500,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 5,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 6,
+ value: 2600,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 6,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 7,
+ value: 2700,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 7,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 8,
+ value: 2800,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 8,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 9,
+ value: 2900,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 9,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 10,
+ value: 3000,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 10,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 11,
+ value: 3100,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 11,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 12,
+ value: 3200,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 12,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 13,
+ value: 3300,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 13,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 14,
+ value: 3400,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 14,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 15,
+ value: 3500,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 15,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 16,
+ value: 3600,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 16,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 17,
+ value: 3700,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 17,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 18,
+ value: 3800,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 18,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 19,
+ value: 3900,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 19,
+ isValid: false,
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 20,
+ value: 4000,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 20,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 21,
+ value: 4100,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 21,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 22,
+ value: 4200,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 22,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 23,
+ value: 69292642,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 23,
+ isValid: false,
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+};
+export const existingHydratedUtxoDetails = {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ txid: '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ tx_pos: 1,
+ value: 546,
+ txid: '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: false,
+ tokenQty: '9897999885.21030105',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ tx_pos: 1,
+ value: 546,
+ txid: '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: false,
+ tokenQty: '308.87654321',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ txid: 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1e-9',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 685181,
+ tx_hash:
+ '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ tx_pos: 1,
+ value: 546,
+ txid: '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '50d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e',
+ tokenTicker: 'TBC',
+ tokenName: 'tabcash',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 686546,
+ tx_hash:
+ 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ tx_pos: 1,
+ value: 546,
+ txid: 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 687240,
+ tx_hash:
+ 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ tx_pos: 2,
+ value: 546,
+ txid: 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0.99999999',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 688449,
+ tx_hash:
+ 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'e4e1a2fb071fa71ca727e08ed1d8ea52a9531c79d1e5f1ebf483c66b71a8621c',
+ tokenTicker: 'CPA',
+ tokenName: 'Cashtab Prod Alpha',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '80',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ tx_pos: 1,
+ value: 546,
+ txid: '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0.12',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ tx_pos: 1,
+ value: 546,
+ txid: '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0.12',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 693606,
+ tx_hash:
+ '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ tx_pos: 2,
+ value: 546,
+ txid: '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '45f0ff5cae7e89da6b96c26c8c48a959214c5f0e983e78d0925f8956ca8848c6',
+ tokenTicker: 'CMA',
+ tokenName: 'CashtabMintAlpha',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 5,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 699216,
+ tx_hash:
+ '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ tx_pos: 2,
+ value: 546,
+ txid: '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '0916e71779c9de7ee125741d3f5ab01f556356dbc86fd327a24f1e9e22ebc917',
+ tokenTicker: 'CTL2',
+ tokenName: 'Cashtab Token Launch Launch Token v2',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1899',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700185,
+ tx_hash:
+ '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ tx_pos: 2,
+ value: 546,
+ txid: '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '22f4ba40312ea3e90e1bfa88d2aa694c271d2e07361907b6eb5568873ffa62bf',
+ tokenTicker: 'CLA',
+ tokenName: 'Cashtab Local Alpha',
+ tokenDocumentUrl: 'boomertakes.com',
+ tokenDocumentHash: '',
+ decimals: 5,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ tx_pos: 2,
+ value: 546,
+ txid: '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '77ec4036ef8546ac46df6d3a5374e961216f92624627eaeef5d2e1a253df9fc6',
+ tokenTicker: 'CTLv3',
+ tokenName: 'Cashtab Token Launch Launch Token v3',
+ tokenDocumentUrl: 'coinex.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '267',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tx_pos: 1,
+ value: 546,
+ txid: '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '1000000000',
+ tokenId:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tokenTicker: 'CBB',
+ tokenName: 'Cashtab Beta Bits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ tx_pos: 2,
+ value: 546,
+ txid: 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999898',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700572,
+ tx_hash:
+ '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ tx_pos: 2,
+ value: 546,
+ txid: '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '990',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700677,
+ tx_hash:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '333',
+ tokenId:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tokenTicker: 'SA',
+ tokenName: 'Spinner Alpha',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 700915,
+ tx_hash:
+ 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ tx_pos: 2,
+ value: 546,
+ txid: 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999975',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ tx_pos: 1,
+ value: 546,
+ txid: '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '3',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ tx_pos: 1,
+ value: 546,
+ txid: '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ tx_pos: 1,
+ value: 546,
+ txid: 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ tx_pos: 1,
+ value: 546,
+ txid: '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ tx_pos: 1,
+ value: 546,
+ txid: '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701191,
+ tx_hash:
+ 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701194,
+ tx_hash:
+ 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701208,
+ tx_hash:
+ '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ tx_pos: 1,
+ value: 546,
+ txid: '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ tx_pos: 1,
+ value: 546,
+ txid: '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0.789698951',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ tx_pos: 1,
+ value: 546,
+ txid: '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701221,
+ tx_hash:
+ '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ tx_pos: 1,
+ value: 546,
+ txid: '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701223,
+ tx_hash:
+ '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ tx_pos: 2,
+ value: 546,
+ txid: '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '9e9738e9ac3ff202736bf7775f875ebae6f812650df577a947c20c52475e43da',
+ tokenTicker: 'CUTT',
+ tokenName: 'Cashtab Unit Test Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '90',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709251,
+ tx_hash:
+ '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ tx_pos: 1,
+ value: 546,
+ txid: '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'f36e1b3d9a2aaf74f132fef3834e9743b945a667a4204e761b85f2e7b65fd41a',
+ tokenTicker: 'POW',
+ tokenName: 'ProofofWriting.com Token',
+ tokenDocumentUrl: 'https://www.proofofwriting.com/26',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709259,
+ tx_hash:
+ '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ tx_pos: 1,
+ value: 546,
+ txid: '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709668,
+ tx_hash:
+ 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 710065,
+ tx_hash:
+ '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ tx_pos: 1,
+ value: 546,
+ txid: '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '9e9738e9ac3ff202736bf7775f875ebae6f812650df577a947c20c52475e43da',
+ tokenTicker: 'CUTT',
+ tokenName: 'Cashtab Unit Test Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 711227,
+ tx_hash:
+ 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '98183238638ecb4ddc365056e22de0e8a05448c1e6084bae247fae5a74ad4f48',
+ tokenTicker: 'DVV',
+ tokenName: 'Delta Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '17',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 715111,
+ tx_hash:
+ 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ tx_pos: 1,
+ value: 546,
+ txid: 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '6969',
+ tokenId:
+ 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ tokenTicker: 'SCΩΩG',
+ tokenName: 'Scoogi Omega',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ tx_pos: 1,
+ value: 546,
+ txid: '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '100',
+ tokenId:
+ '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ tokenTicker: '001',
+ tokenName: '01',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ tx_pos: 1,
+ value: 546,
+ txid: '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '102',
+ tokenId:
+ '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ tokenTicker: '002',
+ tokenName: '2',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715816,
+ tx_hash:
+ '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ tx_pos: 1,
+ value: 546,
+ txid: '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '102',
+ tokenId:
+ '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ tokenTicker: '002',
+ tokenName: '2',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717055,
+ tx_hash:
+ '18c0360f0db5399223cbed48f55c4cee9d9914c8a4a7dedcf9172a36201e9896',
+ tx_pos: 1,
+ value: 546,
+ txid: '18c0360f0db5399223cbed48f55c4cee9d9914c8a4a7dedcf9172a36201e9896',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'e859eeb52e7afca6217fb36784b3b6d3c7386a52f391dd0d00f2ec03a5e8e77b',
+ tokenTicker: 'test',
+ tokenName: 'test',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 1,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717653,
+ tx_hash:
+ '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ tx_pos: 1,
+ value: 546,
+ txid: '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '1000000000',
+ tokenId:
+ '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ tokenTicker: 'OMI',
+ tokenName: 'Omicron',
+ tokenDocumentUrl: 'cdc.gov',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717824,
+ tx_hash:
+ 'c0fe05d7bf71cd0f476ea18cdd4ecb26e1b9a33c911f4aaf143b2b18bc3b5f4f',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c0fe05d7bf71cd0f476ea18cdd4ecb26e1b9a33c911f4aaf143b2b18bc3b5f4f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bdb3b4215ca0622e0c4c07655522c376eaa891838a82f0217fa453bb0595a37c',
+ tokenTicker: 'Service',
+ tokenName: 'Evc token',
+ tokenDocumentUrl: 'https://cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '10000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718091,
+ tx_hash:
+ '905cc5662cad77df56c3770863634ce498dde9d4772dc494d33b7ce3f36fa66c',
+ tx_pos: 2,
+ value: 546,
+ txid: '905cc5662cad77df56c3770863634ce498dde9d4772dc494d33b7ce3f36fa66c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '523512076',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718280,
+ tx_hash:
+ 'f31f4ad7bf035cfb587a07a12ec60937cb8cbeafa7e4d7ed4f3276fea26fcfec',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f31f4ad7bf035cfb587a07a12ec60937cb8cbeafa7e4d7ed4f3276fea26fcfec',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bdb3b4215ca0622e0c4c07655522c376eaa891838a82f0217fa453bb0595a37c',
+ tokenTicker: 'Service',
+ tokenName: 'Evc token',
+ tokenDocumentUrl: 'https://cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '10000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718790,
+ tx_hash:
+ '67faa4753da2940d053f32edcda2c052a16c683aeb73f10cfde5c18266c14fe2',
+ tx_pos: 2,
+ value: 546,
+ txid: '67faa4753da2940d053f32edcda2c052a16c683aeb73f10cfde5c18266c14fe2',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7bbf452698a24b138b0357f689587fc6ea58410c34503b1179b91e40e10bba8b',
+ tokenTicker: 'COVID',
+ tokenName: 'COVID-19',
+ tokenDocumentUrl: 'https://en.wikipedia.org/wiki/COVID-19',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9999999900',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720056,
+ tx_hash:
+ '9c6363fb537d529f512a12d292ea9682fe7159e6bf5ebfec5b7067b401d2dba4',
+ tx_pos: 1,
+ value: 546,
+ txid: '9c6363fb537d529f512a12d292ea9682fe7159e6bf5ebfec5b7067b401d2dba4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '100',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '4eed87ba70864d9daa46d201c47db4513f77e5d4cc01256ab4dcc6dae9dfa055',
+ tx_pos: 1,
+ value: 546,
+ txid: '4eed87ba70864d9daa46d201c47db4513f77e5d4cc01256ab4dcc6dae9dfa055',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '7975514a3185cbb70900e9767e5fcc91c86913cb1d2ad9a28474253875271e33',
+ tx_pos: 1,
+ value: 546,
+ txid: '7975514a3185cbb70900e9767e5fcc91c86913cb1d2ad9a28474253875271e33',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '3',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'e10ae7a1bc78561ed367d59f150aebc13ef2054ba62f1a0db08fc7612d5ed58b',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e10ae7a1bc78561ed367d59f150aebc13ef2054ba62f1a0db08fc7612d5ed58b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'fb71c88bd5369cb8278f49ac672a9721833c36fc69143848b46ae15860339ea6',
+ tx_pos: 1,
+ value: 546,
+ txid: 'fb71c88bd5369cb8278f49ac672a9721833c36fc69143848b46ae15860339ea6',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '4',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720078,
+ tx_hash:
+ 'c3c6c6fb1619d001c29f17a701d042bc6b983e71113822aeeb66ca434fd9fa6c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c3c6c6fb1619d001c29f17a701d042bc6b983e71113822aeeb66ca434fd9fa6c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720951,
+ tx_hash:
+ 'fb50eac73a4fd5e2a701e0dbf4e575cea9c083e061b1db722e057164c7317e5b',
+ tx_pos: 2,
+ value: 546,
+ txid: 'fb50eac73a4fd5e2a701e0dbf4e575cea9c083e061b1db722e057164c7317e5b',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '666c4318d1f7fef5f2c698262492c519018d4e9130f95d05f6be9f0fb7149e96',
+ tokenTicker: 'CPG',
+ tokenName: 'Cashtab Prod Gamma',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '99',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 721083,
+ tx_hash:
+ 'dfb3dbf90fd87f6d66465ff05a61ddf1e1ca30900fadfe9cd4b73468649935ed',
+ tx_pos: 2,
+ value: 546,
+ txid: 'dfb3dbf90fd87f6d66465ff05a61ddf1e1ca30900fadfe9cd4b73468649935ed',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '157e0cdef5d5c51bdea00eac9ab821d809bb9d03cf98da85833614bedb129be6',
+ tokenTicker: 'CLNSP',
+ tokenName: 'ComponentLongNameSpeedLoad',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '82',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 724822,
+ tx_hash:
+ 'ed0dab39d5e976e433a705785726901dc83daa7d579412c18ee997341de010d3',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ed0dab39d5e976e433a705785726901dc83daa7d579412c18ee997341de010d3',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1185eebdde038a25050a3dbb66e2d5332305d1d4a4febab31f6e31bc49baac61',
+ tokenTicker: 'BETA',
+ tokenName: 'BETA',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 725143,
+ tx_hash:
+ 'e99296764134d6ea9ba7521490563762cfaf1541854ba9babc26c0df8665ac32',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e99296764134d6ea9ba7521490563762cfaf1541854ba9babc26c0df8665ac32',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'cfdc270ab82c001eaddd357f773a8dfe61cfdd891df66b39fee060f34f7a4015',
+ tokenTicker: 'SCOOG',
+ tokenName: 'Scoogi Alpha',
+ tokenDocumentUrl: 'cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 725871,
+ tx_hash:
+ '82a3fe0b03ab07a564351443634da1b1ed3960e4771c59b6f8abbf7ef4b3258d',
+ tx_pos: 1,
+ value: 546,
+ txid: '82a3fe0b03ab07a564351443634da1b1ed3960e4771c59b6f8abbf7ef4b3258d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'acba1d7f354c6d4d001eb99d31de174e5cea8a31d692afd6e7eb8474ad541f55',
+ tokenTicker: 'CTB',
+ tokenName: 'CashTabBits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '5.5e-8',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 725882,
+ tx_hash:
+ '1db1bef70013d178d7912731435029f9c8588f1d0089944c53eccffd255b5efc',
+ tx_pos: 2,
+ value: 546,
+ txid: '1db1bef70013d178d7912731435029f9c8588f1d0089944c53eccffd255b5efc',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'ccf5fe5a387559c8ab9efdeb0c0ef1b444e677298cfddf07671245ce3cb3c79f',
+ tokenTicker: 'XGB',
+ tokenName: 'Garmonbozia',
+ tokenDocumentUrl:
+ 'https://twinpeaks.fandom.com/wiki/Garmonbozia',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '478',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726001,
+ tx_hash:
+ '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ tx_pos: 2,
+ value: 546,
+ txid: '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '996000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726009,
+ tx_hash:
+ '52d2fd9d10debecbed6f8c3554517dada688c83197c4e57ad74556f0317c84b4',
+ tx_pos: 1,
+ value: 546,
+ txid: '52d2fd9d10debecbed6f8c3554517dada688c83197c4e57ad74556f0317c84b4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '69',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726019,
+ tx_hash:
+ 'b8982cf5531afcba125a9e17550d42a01045c3aa5ee70a485f8fbcde3dae191d',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b8982cf5531afcba125a9e17550d42a01045c3aa5ee70a485f8fbcde3dae191d',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '98183238638ecb4ddc365056e22de0e8a05448c1e6084bae247fae5a74ad4f48',
+ tokenTicker: 'DVV',
+ tokenName: 'Delta Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999989983',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726053,
+ tx_hash:
+ '0283492a729cfb7999684e733f2ee76bc4f652b9047ff47dbe3534b8f5960697',
+ tx_pos: 2,
+ value: 546,
+ txid: '0283492a729cfb7999684e733f2ee76bc4f652b9047ff47dbe3534b8f5960697',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'b8f2a9e767a0be7b80c7e414ef2534586d4da72efddb39a4e70e501ab73375cc',
+ tokenTicker: 'CTD',
+ tokenName: 'Cashtab Dark',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726167,
+ tx_hash:
+ '2487ed30179cca902291424f273df1b37b2b9245eb97007ec3c75ca20ebaae1f',
+ tx_pos: 1,
+ value: 546,
+ txid: '2487ed30179cca902291424f273df1b37b2b9245eb97007ec3c75ca20ebaae1f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6a9305a13135625f4b533256e8d2e21a7343005331e1839348a39040f61e09d3',
+ tokenTicker: 'SCOOG',
+ tokenName: 'Scoogi Alpha',
+ tokenDocumentUrl: 'cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '69',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726277,
+ tx_hash:
+ '8b8fbe88ba8086ccf7176ef1a07f753aa49b9e4c766b58bde556758ec707e3eb',
+ tx_pos: 2,
+ value: 546,
+ txid: '8b8fbe88ba8086ccf7176ef1a07f753aa49b9e4c766b58bde556758ec707e3eb',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999888',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726809,
+ tx_hash:
+ '123a31b903c9a7de544a443a02f73e0cbee6304931704e55d0583a8aca8df48e',
+ tx_pos: 2,
+ value: 546,
+ txid: '123a31b903c9a7de544a443a02f73e0cbee6304931704e55d0583a8aca8df48e',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '3de671a7107d3803d78f7f4a4e5c794d0903a8d28d16076445c084943c1e2db8',
+ tokenTicker: 'CLB',
+ tokenName: 'Cashtab Local Beta',
+ tokenDocumentUrl: 'boomertakes.com',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '22',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ '0bd0c49135b94b99989ec3b0396020a96fcbe2925bb25c40120dc047c0a097ec',
+ tx_pos: 1,
+ value: 546,
+ txid: '0bd0c49135b94b99989ec3b0396020a96fcbe2925bb25c40120dc047c0a097ec',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '44929ff3b1fc634f982fede112cf12b21199a2ebbcf718412a38de9177d77168',
+ tokenTicker: 'coin',
+ tokenName: 'johncoin',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ '5b2509c3235726f6d048af1336533d9db178a253cb2427a661ea676996cea141',
+ tx_pos: 2,
+ value: 546,
+ txid: '5b2509c3235726f6d048af1336533d9db178a253cb2427a661ea676996cea141',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '639a8dba34788ff3ebd3977d4ac045825394285ee648bb1d159e1c12b787ff25',
+ tokenTicker: 'CFL',
+ tokenName: 'Cashtab Facelift',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9955',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ tx_pos: 1,
+ value: 546,
+ txid: 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '100',
+ tokenId:
+ 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ tokenTicker: 'CFL',
+ tokenName: 'Cashtab Facelift',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727176,
+ tx_hash:
+ '159b70d26940f6bf968c086eb526982421169889f3492b0d025ac3cd777ec1cd',
+ tx_pos: 1,
+ value: 24874488,
+ txid: '159b70d26940f6bf968c086eb526982421169889f3492b0d025ac3cd777ec1cd',
+ vout: 1,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727176,
+ tx_hash:
+ '8f645ce7b231a3ea81168229c1b6a1157e8a58fb8a8a127a80efc2ed39c4f72e',
+ tx_pos: 1,
+ value: 546,
+ txid: '8f645ce7b231a3ea81168229c1b6a1157e8a58fb8a8a127a80efc2ed39c4f72e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'b40d1f6acdb6ee68d7eca0167fe2753c076bc309b2e3b1af8bff70ca34b945b0',
+ tokenTicker: 'KAT',
+ tokenName: 'KA_Test',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '5000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+};
+export const existingHydratedUtxoDetailsAfterAdd = {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ txid: '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ tx_pos: 1,
+ value: 546,
+ txid: '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: false,
+ tokenQty: '9897999885.21030105',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ tx_pos: 1,
+ value: 546,
+ txid: '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: false,
+ tokenQty: '308.87654321',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ txid: 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1e-9',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 685181,
+ tx_hash:
+ '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ tx_pos: 1,
+ value: 546,
+ txid: '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '50d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e',
+ tokenTicker: 'TBC',
+ tokenName: 'tabcash',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 686546,
+ tx_hash:
+ 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ tx_pos: 1,
+ value: 546,
+ txid: 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 687240,
+ tx_hash:
+ 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ tx_pos: 2,
+ value: 546,
+ txid: 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0.99999999',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 688449,
+ tx_hash:
+ 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'e4e1a2fb071fa71ca727e08ed1d8ea52a9531c79d1e5f1ebf483c66b71a8621c',
+ tokenTicker: 'CPA',
+ tokenName: 'Cashtab Prod Alpha',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '80',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ tx_pos: 1,
+ value: 546,
+ txid: '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0.12',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ tx_pos: 1,
+ value: 546,
+ txid: '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0.12',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 693606,
+ tx_hash:
+ '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ tx_pos: 2,
+ value: 546,
+ txid: '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '45f0ff5cae7e89da6b96c26c8c48a959214c5f0e983e78d0925f8956ca8848c6',
+ tokenTicker: 'CMA',
+ tokenName: 'CashtabMintAlpha',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 5,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 699216,
+ tx_hash:
+ '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ tx_pos: 2,
+ value: 546,
+ txid: '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '0916e71779c9de7ee125741d3f5ab01f556356dbc86fd327a24f1e9e22ebc917',
+ tokenTicker: 'CTL2',
+ tokenName: 'Cashtab Token Launch Launch Token v2',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1899',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700185,
+ tx_hash:
+ '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ tx_pos: 2,
+ value: 546,
+ txid: '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '22f4ba40312ea3e90e1bfa88d2aa694c271d2e07361907b6eb5568873ffa62bf',
+ tokenTicker: 'CLA',
+ tokenName: 'Cashtab Local Alpha',
+ tokenDocumentUrl: 'boomertakes.com',
+ tokenDocumentHash: '',
+ decimals: 5,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ tx_pos: 2,
+ value: 546,
+ txid: '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '77ec4036ef8546ac46df6d3a5374e961216f92624627eaeef5d2e1a253df9fc6',
+ tokenTicker: 'CTLv3',
+ tokenName: 'Cashtab Token Launch Launch Token v3',
+ tokenDocumentUrl: 'coinex.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '267',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tx_pos: 1,
+ value: 546,
+ txid: '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '1000000000',
+ tokenId:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tokenTicker: 'CBB',
+ tokenName: 'Cashtab Beta Bits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ tx_pos: 2,
+ value: 546,
+ txid: 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999898',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700572,
+ tx_hash:
+ '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ tx_pos: 2,
+ value: 546,
+ txid: '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '990',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700677,
+ tx_hash:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '333',
+ tokenId:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tokenTicker: 'SA',
+ tokenName: 'Spinner Alpha',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 700915,
+ tx_hash:
+ 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ tx_pos: 2,
+ value: 546,
+ txid: 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999975',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ tx_pos: 1,
+ value: 546,
+ txid: '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '3',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ tx_pos: 1,
+ value: 546,
+ txid: '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ tx_pos: 1,
+ value: 546,
+ txid: 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ tx_pos: 1,
+ value: 546,
+ txid: '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ tx_pos: 1,
+ value: 546,
+ txid: '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701191,
+ tx_hash:
+ 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701194,
+ tx_hash:
+ 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701208,
+ tx_hash:
+ '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ tx_pos: 1,
+ value: 546,
+ txid: '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ tx_pos: 1,
+ value: 546,
+ txid: '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0.789698951',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ tx_pos: 1,
+ value: 546,
+ txid: '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701221,
+ tx_hash:
+ '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ tx_pos: 1,
+ value: 546,
+ txid: '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701223,
+ tx_hash:
+ '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ tx_pos: 2,
+ value: 546,
+ txid: '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '9e9738e9ac3ff202736bf7775f875ebae6f812650df577a947c20c52475e43da',
+ tokenTicker: 'CUTT',
+ tokenName: 'Cashtab Unit Test Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '90',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709251,
+ tx_hash:
+ '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ tx_pos: 1,
+ value: 546,
+ txid: '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'f36e1b3d9a2aaf74f132fef3834e9743b945a667a4204e761b85f2e7b65fd41a',
+ tokenTicker: 'POW',
+ tokenName: 'ProofofWriting.com Token',
+ tokenDocumentUrl: 'https://www.proofofwriting.com/26',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709259,
+ tx_hash:
+ '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ tx_pos: 1,
+ value: 546,
+ txid: '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709668,
+ tx_hash:
+ 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 710065,
+ tx_hash:
+ '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ tx_pos: 1,
+ value: 546,
+ txid: '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '9e9738e9ac3ff202736bf7775f875ebae6f812650df577a947c20c52475e43da',
+ tokenTicker: 'CUTT',
+ tokenName: 'Cashtab Unit Test Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 711227,
+ tx_hash:
+ 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '98183238638ecb4ddc365056e22de0e8a05448c1e6084bae247fae5a74ad4f48',
+ tokenTicker: 'DVV',
+ tokenName: 'Delta Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '17',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 715111,
+ tx_hash:
+ 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ tx_pos: 1,
+ value: 546,
+ txid: 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '6969',
+ tokenId:
+ 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ tokenTicker: 'SCΩΩG',
+ tokenName: 'Scoogi Omega',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ tx_pos: 1,
+ value: 546,
+ txid: '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '100',
+ tokenId:
+ '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ tokenTicker: '001',
+ tokenName: '01',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ tx_pos: 1,
+ value: 546,
+ txid: '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '102',
+ tokenId:
+ '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ tokenTicker: '002',
+ tokenName: '2',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715816,
+ tx_hash:
+ '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ tx_pos: 1,
+ value: 546,
+ txid: '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '102',
+ tokenId:
+ '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ tokenTicker: '002',
+ tokenName: '2',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717055,
+ tx_hash:
+ '18c0360f0db5399223cbed48f55c4cee9d9914c8a4a7dedcf9172a36201e9896',
+ tx_pos: 1,
+ value: 546,
+ txid: '18c0360f0db5399223cbed48f55c4cee9d9914c8a4a7dedcf9172a36201e9896',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'e859eeb52e7afca6217fb36784b3b6d3c7386a52f391dd0d00f2ec03a5e8e77b',
+ tokenTicker: 'test',
+ tokenName: 'test',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 1,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717653,
+ tx_hash:
+ '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ tx_pos: 1,
+ value: 546,
+ txid: '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '1000000000',
+ tokenId:
+ '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ tokenTicker: 'OMI',
+ tokenName: 'Omicron',
+ tokenDocumentUrl: 'cdc.gov',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717824,
+ tx_hash:
+ 'c0fe05d7bf71cd0f476ea18cdd4ecb26e1b9a33c911f4aaf143b2b18bc3b5f4f',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c0fe05d7bf71cd0f476ea18cdd4ecb26e1b9a33c911f4aaf143b2b18bc3b5f4f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bdb3b4215ca0622e0c4c07655522c376eaa891838a82f0217fa453bb0595a37c',
+ tokenTicker: 'Service',
+ tokenName: 'Evc token',
+ tokenDocumentUrl: 'https://cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '10000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718091,
+ tx_hash:
+ '905cc5662cad77df56c3770863634ce498dde9d4772dc494d33b7ce3f36fa66c',
+ tx_pos: 2,
+ value: 546,
+ txid: '905cc5662cad77df56c3770863634ce498dde9d4772dc494d33b7ce3f36fa66c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '523512076',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718280,
+ tx_hash:
+ 'f31f4ad7bf035cfb587a07a12ec60937cb8cbeafa7e4d7ed4f3276fea26fcfec',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f31f4ad7bf035cfb587a07a12ec60937cb8cbeafa7e4d7ed4f3276fea26fcfec',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bdb3b4215ca0622e0c4c07655522c376eaa891838a82f0217fa453bb0595a37c',
+ tokenTicker: 'Service',
+ tokenName: 'Evc token',
+ tokenDocumentUrl: 'https://cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '10000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718790,
+ tx_hash:
+ '67faa4753da2940d053f32edcda2c052a16c683aeb73f10cfde5c18266c14fe2',
+ tx_pos: 2,
+ value: 546,
+ txid: '67faa4753da2940d053f32edcda2c052a16c683aeb73f10cfde5c18266c14fe2',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7bbf452698a24b138b0357f689587fc6ea58410c34503b1179b91e40e10bba8b',
+ tokenTicker: 'COVID',
+ tokenName: 'COVID-19',
+ tokenDocumentUrl: 'https://en.wikipedia.org/wiki/COVID-19',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9999999900',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720056,
+ tx_hash:
+ '9c6363fb537d529f512a12d292ea9682fe7159e6bf5ebfec5b7067b401d2dba4',
+ tx_pos: 1,
+ value: 546,
+ txid: '9c6363fb537d529f512a12d292ea9682fe7159e6bf5ebfec5b7067b401d2dba4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '100',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '4eed87ba70864d9daa46d201c47db4513f77e5d4cc01256ab4dcc6dae9dfa055',
+ tx_pos: 1,
+ value: 546,
+ txid: '4eed87ba70864d9daa46d201c47db4513f77e5d4cc01256ab4dcc6dae9dfa055',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '7975514a3185cbb70900e9767e5fcc91c86913cb1d2ad9a28474253875271e33',
+ tx_pos: 1,
+ value: 546,
+ txid: '7975514a3185cbb70900e9767e5fcc91c86913cb1d2ad9a28474253875271e33',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '3',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'e10ae7a1bc78561ed367d59f150aebc13ef2054ba62f1a0db08fc7612d5ed58b',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e10ae7a1bc78561ed367d59f150aebc13ef2054ba62f1a0db08fc7612d5ed58b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'fb71c88bd5369cb8278f49ac672a9721833c36fc69143848b46ae15860339ea6',
+ tx_pos: 1,
+ value: 546,
+ txid: 'fb71c88bd5369cb8278f49ac672a9721833c36fc69143848b46ae15860339ea6',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '4',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720078,
+ tx_hash:
+ 'c3c6c6fb1619d001c29f17a701d042bc6b983e71113822aeeb66ca434fd9fa6c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c3c6c6fb1619d001c29f17a701d042bc6b983e71113822aeeb66ca434fd9fa6c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720951,
+ tx_hash:
+ 'fb50eac73a4fd5e2a701e0dbf4e575cea9c083e061b1db722e057164c7317e5b',
+ tx_pos: 2,
+ value: 546,
+ txid: 'fb50eac73a4fd5e2a701e0dbf4e575cea9c083e061b1db722e057164c7317e5b',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '666c4318d1f7fef5f2c698262492c519018d4e9130f95d05f6be9f0fb7149e96',
+ tokenTicker: 'CPG',
+ tokenName: 'Cashtab Prod Gamma',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '99',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 721083,
+ tx_hash:
+ 'dfb3dbf90fd87f6d66465ff05a61ddf1e1ca30900fadfe9cd4b73468649935ed',
+ tx_pos: 2,
+ value: 546,
+ txid: 'dfb3dbf90fd87f6d66465ff05a61ddf1e1ca30900fadfe9cd4b73468649935ed',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '157e0cdef5d5c51bdea00eac9ab821d809bb9d03cf98da85833614bedb129be6',
+ tokenTicker: 'CLNSP',
+ tokenName: 'ComponentLongNameSpeedLoad',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '82',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 724822,
+ tx_hash:
+ 'ed0dab39d5e976e433a705785726901dc83daa7d579412c18ee997341de010d3',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ed0dab39d5e976e433a705785726901dc83daa7d579412c18ee997341de010d3',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1185eebdde038a25050a3dbb66e2d5332305d1d4a4febab31f6e31bc49baac61',
+ tokenTicker: 'BETA',
+ tokenName: 'BETA',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 725143,
+ tx_hash:
+ 'e99296764134d6ea9ba7521490563762cfaf1541854ba9babc26c0df8665ac32',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e99296764134d6ea9ba7521490563762cfaf1541854ba9babc26c0df8665ac32',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'cfdc270ab82c001eaddd357f773a8dfe61cfdd891df66b39fee060f34f7a4015',
+ tokenTicker: 'SCOOG',
+ tokenName: 'Scoogi Alpha',
+ tokenDocumentUrl: 'cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 725871,
+ tx_hash:
+ '82a3fe0b03ab07a564351443634da1b1ed3960e4771c59b6f8abbf7ef4b3258d',
+ tx_pos: 1,
+ value: 546,
+ txid: '82a3fe0b03ab07a564351443634da1b1ed3960e4771c59b6f8abbf7ef4b3258d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'acba1d7f354c6d4d001eb99d31de174e5cea8a31d692afd6e7eb8474ad541f55',
+ tokenTicker: 'CTB',
+ tokenName: 'CashTabBits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '5.5e-8',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 725882,
+ tx_hash:
+ '1db1bef70013d178d7912731435029f9c8588f1d0089944c53eccffd255b5efc',
+ tx_pos: 2,
+ value: 546,
+ txid: '1db1bef70013d178d7912731435029f9c8588f1d0089944c53eccffd255b5efc',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'ccf5fe5a387559c8ab9efdeb0c0ef1b444e677298cfddf07671245ce3cb3c79f',
+ tokenTicker: 'XGB',
+ tokenName: 'Garmonbozia',
+ tokenDocumentUrl:
+ 'https://twinpeaks.fandom.com/wiki/Garmonbozia',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '478',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726001,
+ tx_hash:
+ '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ tx_pos: 2,
+ value: 546,
+ txid: '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '996000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726009,
+ tx_hash:
+ '52d2fd9d10debecbed6f8c3554517dada688c83197c4e57ad74556f0317c84b4',
+ tx_pos: 1,
+ value: 546,
+ txid: '52d2fd9d10debecbed6f8c3554517dada688c83197c4e57ad74556f0317c84b4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '69',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726019,
+ tx_hash:
+ 'b8982cf5531afcba125a9e17550d42a01045c3aa5ee70a485f8fbcde3dae191d',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b8982cf5531afcba125a9e17550d42a01045c3aa5ee70a485f8fbcde3dae191d',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '98183238638ecb4ddc365056e22de0e8a05448c1e6084bae247fae5a74ad4f48',
+ tokenTicker: 'DVV',
+ tokenName: 'Delta Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999989983',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726053,
+ tx_hash:
+ '0283492a729cfb7999684e733f2ee76bc4f652b9047ff47dbe3534b8f5960697',
+ tx_pos: 2,
+ value: 546,
+ txid: '0283492a729cfb7999684e733f2ee76bc4f652b9047ff47dbe3534b8f5960697',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'b8f2a9e767a0be7b80c7e414ef2534586d4da72efddb39a4e70e501ab73375cc',
+ tokenTicker: 'CTD',
+ tokenName: 'Cashtab Dark',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726167,
+ tx_hash:
+ '2487ed30179cca902291424f273df1b37b2b9245eb97007ec3c75ca20ebaae1f',
+ tx_pos: 1,
+ value: 546,
+ txid: '2487ed30179cca902291424f273df1b37b2b9245eb97007ec3c75ca20ebaae1f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6a9305a13135625f4b533256e8d2e21a7343005331e1839348a39040f61e09d3',
+ tokenTicker: 'SCOOG',
+ tokenName: 'Scoogi Alpha',
+ tokenDocumentUrl: 'cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '69',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726277,
+ tx_hash:
+ '8b8fbe88ba8086ccf7176ef1a07f753aa49b9e4c766b58bde556758ec707e3eb',
+ tx_pos: 2,
+ value: 546,
+ txid: '8b8fbe88ba8086ccf7176ef1a07f753aa49b9e4c766b58bde556758ec707e3eb',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999888',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726809,
+ tx_hash:
+ '123a31b903c9a7de544a443a02f73e0cbee6304931704e55d0583a8aca8df48e',
+ tx_pos: 2,
+ value: 546,
+ txid: '123a31b903c9a7de544a443a02f73e0cbee6304931704e55d0583a8aca8df48e',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '3de671a7107d3803d78f7f4a4e5c794d0903a8d28d16076445c084943c1e2db8',
+ tokenTicker: 'CLB',
+ tokenName: 'Cashtab Local Beta',
+ tokenDocumentUrl: 'boomertakes.com',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '22',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ '0bd0c49135b94b99989ec3b0396020a96fcbe2925bb25c40120dc047c0a097ec',
+ tx_pos: 1,
+ value: 546,
+ txid: '0bd0c49135b94b99989ec3b0396020a96fcbe2925bb25c40120dc047c0a097ec',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '44929ff3b1fc634f982fede112cf12b21199a2ebbcf718412a38de9177d77168',
+ tokenTicker: 'coin',
+ tokenName: 'johncoin',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ '5b2509c3235726f6d048af1336533d9db178a253cb2427a661ea676996cea141',
+ tx_pos: 2,
+ value: 546,
+ txid: '5b2509c3235726f6d048af1336533d9db178a253cb2427a661ea676996cea141',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '639a8dba34788ff3ebd3977d4ac045825394285ee648bb1d159e1c12b787ff25',
+ tokenTicker: 'CFL',
+ tokenName: 'Cashtab Facelift',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9955',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ tx_pos: 1,
+ value: 546,
+ txid: 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '100',
+ tokenId:
+ 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ tokenTicker: 'CFL',
+ tokenName: 'Cashtab Facelift',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727176,
+ tx_hash:
+ '159b70d26940f6bf968c086eb526982421169889f3492b0d025ac3cd777ec1cd',
+ tx_pos: 1,
+ value: 24874488,
+ txid: '159b70d26940f6bf968c086eb526982421169889f3492b0d025ac3cd777ec1cd',
+ vout: 1,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727176,
+ tx_hash:
+ '8f645ce7b231a3ea81168229c1b6a1157e8a58fb8a8a127a80efc2ed39c4f72e',
+ tx_pos: 1,
+ value: 546,
+ txid: '8f645ce7b231a3ea81168229c1b6a1157e8a58fb8a8a127a80efc2ed39c4f72e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'b40d1f6acdb6ee68d7eca0167fe2753c076bc309b2e3b1af8bff70ca34b945b0',
+ tokenTicker: 'KAT',
+ tokenName: 'KA_Test',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '5000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 0,
+ value: 2000,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 0,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 1,
+ value: 2100,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 1,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 2,
+ value: 2200,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 2,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 3,
+ value: 2300,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 3,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 4,
+ value: 2400,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 4,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 5,
+ value: 2500,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 5,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 6,
+ value: 2600,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 6,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 7,
+ value: 2700,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 7,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 8,
+ value: 2800,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 8,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 9,
+ value: 2900,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 9,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 10,
+ value: 3000,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 10,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 11,
+ value: 3100,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 11,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 12,
+ value: 3200,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 12,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 13,
+ value: 3300,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 13,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 14,
+ value: 3400,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 14,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 15,
+ value: 3500,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 15,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 16,
+ value: 3600,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 16,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 17,
+ value: 3700,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 17,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 18,
+ value: 3800,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 18,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 19,
+ value: 3900,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 19,
+ isValid: false,
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 20,
+ value: 4000,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 20,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 21,
+ value: 4100,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 21,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 22,
+ value: 4200,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 22,
+ isValid: false,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 23,
+ value: 69292642,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 23,
+ isValid: false,
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+};
+
+export const hydratedUtxoDetailsBeforeConsumedTemplate = {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 725886,
+ tx_hash:
+ '29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78',
+ tx_pos: 0,
+ value: 3300,
+ txid: '29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78',
+ vout: 0,
+ isValid: false,
+ },
+ {
+ height: 725886,
+ tx_hash:
+ '29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78',
+ tx_pos: 1,
+ value: 3300,
+ txid: '29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78',
+ vout: 0,
+ isValid: false,
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+};
+
+export const consumedUtxoTemplate = [
+ {
+ utxos: [
+ {
+ height: 725886,
+ tx_hash:
+ '29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78',
+ tx_pos: 0,
+ value: 3300,
+ txid: '29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78',
+ vout: 0,
+ isValid: false,
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+];
+export const hydratedUtxoDetailsAfterRemovingConsumedUtxoTemplate = {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 725886,
+ tx_hash:
+ '29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78',
+ tx_pos: 1,
+ value: 3300,
+ txid: '29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78',
+ vout: 0,
+ isValid: false,
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+};
+
+export const hydratedUtxoDetailsBeforeRemovingConsumedUtxos = {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ txid: '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ tx_pos: 1,
+ value: 546,
+ txid: '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: false,
+ tokenQty: '9897999885.21030105',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ tx_pos: 1,
+ value: 546,
+ txid: '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '308.87654321',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ txid: 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '1e-9',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 685181,
+ tx_hash:
+ '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ tx_pos: 1,
+ value: 546,
+ txid: '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '50d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e',
+ tokenTicker: 'TBC',
+ tokenName: 'tabcash',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 686546,
+ tx_hash:
+ 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ tx_pos: 1,
+ value: 546,
+ txid: 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 687240,
+ tx_hash:
+ 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ tx_pos: 2,
+ value: 546,
+ txid: 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '0.99999999',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 688449,
+ tx_hash:
+ 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'e4e1a2fb071fa71ca727e08ed1d8ea52a9531c79d1e5f1ebf483c66b71a8621c',
+ tokenTicker: 'CPA',
+ tokenName: 'Cashtab Prod Alpha',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '80',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ tx_pos: 1,
+ value: 546,
+ txid: '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '0.12',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ tx_pos: 1,
+ value: 546,
+ txid: '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '0.12',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 693606,
+ tx_hash:
+ '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ tx_pos: 2,
+ value: 546,
+ txid: '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '45f0ff5cae7e89da6b96c26c8c48a959214c5f0e983e78d0925f8956ca8848c6',
+ tokenTicker: 'CMA',
+ tokenName: 'CashtabMintAlpha',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 5,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 699216,
+ tx_hash:
+ '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ tx_pos: 2,
+ value: 546,
+ txid: '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '0916e71779c9de7ee125741d3f5ab01f556356dbc86fd327a24f1e9e22ebc917',
+ tokenTicker: 'CTL2',
+ tokenName: 'Cashtab Token Launch Launch Token v2',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1899',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700185,
+ tx_hash:
+ '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ tx_pos: 2,
+ value: 546,
+ txid: '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '22f4ba40312ea3e90e1bfa88d2aa694c271d2e07361907b6eb5568873ffa62bf',
+ tokenTicker: 'CLA',
+ tokenName: 'Cashtab Local Alpha',
+ tokenDocumentUrl: 'boomertakes.com',
+ tokenDocumentHash: '',
+ decimals: 5,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ tx_pos: 2,
+ value: 546,
+ txid: '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '77ec4036ef8546ac46df6d3a5374e961216f92624627eaeef5d2e1a253df9fc6',
+ tokenTicker: 'CTLv3',
+ tokenName: 'Cashtab Token Launch Launch Token v3',
+ tokenDocumentUrl: 'coinex.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '267',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tx_pos: 1,
+ value: 546,
+ txid: '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '1000000000',
+ tokenId:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tokenTicker: 'CBB',
+ tokenName: 'Cashtab Beta Bits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ tx_pos: 2,
+ value: 546,
+ txid: 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999898',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700572,
+ tx_hash:
+ '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ tx_pos: 2,
+ value: 546,
+ txid: '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '990',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700677,
+ tx_hash:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '333',
+ tokenId:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tokenTicker: 'SA',
+ tokenName: 'Spinner Alpha',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 700915,
+ tx_hash:
+ 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ tx_pos: 2,
+ value: 546,
+ txid: 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999975',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ tx_pos: 1,
+ value: 546,
+ txid: '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '3',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ tx_pos: 1,
+ value: 546,
+ txid: '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ tx_pos: 1,
+ value: 546,
+ txid: 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ tx_pos: 1,
+ value: 546,
+ txid: '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ tx_pos: 1,
+ value: 546,
+ txid: '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701191,
+ tx_hash:
+ 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701194,
+ tx_hash:
+ 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701208,
+ tx_hash:
+ '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ tx_pos: 1,
+ value: 546,
+ txid: '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ tx_pos: 1,
+ value: 546,
+ txid: '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0.789698951',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ tx_pos: 1,
+ value: 546,
+ txid: '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701221,
+ tx_hash:
+ '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ tx_pos: 1,
+ value: 546,
+ txid: '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701223,
+ tx_hash:
+ '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ tx_pos: 2,
+ value: 546,
+ txid: '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '9e9738e9ac3ff202736bf7775f875ebae6f812650df577a947c20c52475e43da',
+ tokenTicker: 'CUTT',
+ tokenName: 'Cashtab Unit Test Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '90',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709251,
+ tx_hash:
+ '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ tx_pos: 1,
+ value: 546,
+ txid: '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'f36e1b3d9a2aaf74f132fef3834e9743b945a667a4204e761b85f2e7b65fd41a',
+ tokenTicker: 'POW',
+ tokenName: 'ProofofWriting.com Token',
+ tokenDocumentUrl: 'https://www.proofofwriting.com/26',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709259,
+ tx_hash:
+ '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ tx_pos: 1,
+ value: 546,
+ txid: '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709668,
+ tx_hash:
+ 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 710065,
+ tx_hash:
+ '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ tx_pos: 1,
+ value: 546,
+ txid: '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '9e9738e9ac3ff202736bf7775f875ebae6f812650df577a947c20c52475e43da',
+ tokenTicker: 'CUTT',
+ tokenName: 'Cashtab Unit Test Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 711227,
+ tx_hash:
+ 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '98183238638ecb4ddc365056e22de0e8a05448c1e6084bae247fae5a74ad4f48',
+ tokenTicker: 'DVV',
+ tokenName: 'Delta Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '17',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 715111,
+ tx_hash:
+ 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ tx_pos: 1,
+ value: 546,
+ txid: 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '6969',
+ tokenId:
+ 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ tokenTicker: 'SCΩΩG',
+ tokenName: 'Scoogi Omega',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ tx_pos: 1,
+ value: 546,
+ txid: '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '100',
+ tokenId:
+ '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ tokenTicker: '001',
+ tokenName: '01',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ tx_pos: 1,
+ value: 546,
+ txid: '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '102',
+ tokenId:
+ '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ tokenTicker: '002',
+ tokenName: '2',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715816,
+ tx_hash:
+ '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ tx_pos: 1,
+ value: 546,
+ txid: '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '102',
+ tokenId:
+ '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ tokenTicker: '002',
+ tokenName: '2',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717055,
+ tx_hash:
+ '18c0360f0db5399223cbed48f55c4cee9d9914c8a4a7dedcf9172a36201e9896',
+ tx_pos: 1,
+ value: 546,
+ txid: '18c0360f0db5399223cbed48f55c4cee9d9914c8a4a7dedcf9172a36201e9896',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'e859eeb52e7afca6217fb36784b3b6d3c7386a52f391dd0d00f2ec03a5e8e77b',
+ tokenTicker: 'test',
+ tokenName: 'test',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 1,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717653,
+ tx_hash:
+ '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ tx_pos: 1,
+ value: 546,
+ txid: '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '1000000000',
+ tokenId:
+ '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ tokenTicker: 'OMI',
+ tokenName: 'Omicron',
+ tokenDocumentUrl: 'cdc.gov',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717824,
+ tx_hash:
+ 'c0fe05d7bf71cd0f476ea18cdd4ecb26e1b9a33c911f4aaf143b2b18bc3b5f4f',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c0fe05d7bf71cd0f476ea18cdd4ecb26e1b9a33c911f4aaf143b2b18bc3b5f4f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bdb3b4215ca0622e0c4c07655522c376eaa891838a82f0217fa453bb0595a37c',
+ tokenTicker: 'Service',
+ tokenName: 'Evc token',
+ tokenDocumentUrl: 'https://cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '10000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718091,
+ tx_hash:
+ '905cc5662cad77df56c3770863634ce498dde9d4772dc494d33b7ce3f36fa66c',
+ tx_pos: 2,
+ value: 546,
+ txid: '905cc5662cad77df56c3770863634ce498dde9d4772dc494d33b7ce3f36fa66c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '523512076',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718280,
+ tx_hash:
+ 'f31f4ad7bf035cfb587a07a12ec60937cb8cbeafa7e4d7ed4f3276fea26fcfec',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f31f4ad7bf035cfb587a07a12ec60937cb8cbeafa7e4d7ed4f3276fea26fcfec',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bdb3b4215ca0622e0c4c07655522c376eaa891838a82f0217fa453bb0595a37c',
+ tokenTicker: 'Service',
+ tokenName: 'Evc token',
+ tokenDocumentUrl: 'https://cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '10000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718790,
+ tx_hash:
+ '67faa4753da2940d053f32edcda2c052a16c683aeb73f10cfde5c18266c14fe2',
+ tx_pos: 2,
+ value: 546,
+ txid: '67faa4753da2940d053f32edcda2c052a16c683aeb73f10cfde5c18266c14fe2',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7bbf452698a24b138b0357f689587fc6ea58410c34503b1179b91e40e10bba8b',
+ tokenTicker: 'COVID',
+ tokenName: 'COVID-19',
+ tokenDocumentUrl: 'https://en.wikipedia.org/wiki/COVID-19',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9999999900',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720056,
+ tx_hash:
+ '9c6363fb537d529f512a12d292ea9682fe7159e6bf5ebfec5b7067b401d2dba4',
+ tx_pos: 1,
+ value: 546,
+ txid: '9c6363fb537d529f512a12d292ea9682fe7159e6bf5ebfec5b7067b401d2dba4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '100',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '4eed87ba70864d9daa46d201c47db4513f77e5d4cc01256ab4dcc6dae9dfa055',
+ tx_pos: 1,
+ value: 546,
+ txid: '4eed87ba70864d9daa46d201c47db4513f77e5d4cc01256ab4dcc6dae9dfa055',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '7975514a3185cbb70900e9767e5fcc91c86913cb1d2ad9a28474253875271e33',
+ tx_pos: 1,
+ value: 546,
+ txid: '7975514a3185cbb70900e9767e5fcc91c86913cb1d2ad9a28474253875271e33',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '3',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'e10ae7a1bc78561ed367d59f150aebc13ef2054ba62f1a0db08fc7612d5ed58b',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e10ae7a1bc78561ed367d59f150aebc13ef2054ba62f1a0db08fc7612d5ed58b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'fb71c88bd5369cb8278f49ac672a9721833c36fc69143848b46ae15860339ea6',
+ tx_pos: 1,
+ value: 546,
+ txid: 'fb71c88bd5369cb8278f49ac672a9721833c36fc69143848b46ae15860339ea6',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '4',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720078,
+ tx_hash:
+ 'c3c6c6fb1619d001c29f17a701d042bc6b983e71113822aeeb66ca434fd9fa6c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c3c6c6fb1619d001c29f17a701d042bc6b983e71113822aeeb66ca434fd9fa6c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720951,
+ tx_hash:
+ 'fb50eac73a4fd5e2a701e0dbf4e575cea9c083e061b1db722e057164c7317e5b',
+ tx_pos: 2,
+ value: 546,
+ txid: 'fb50eac73a4fd5e2a701e0dbf4e575cea9c083e061b1db722e057164c7317e5b',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '666c4318d1f7fef5f2c698262492c519018d4e9130f95d05f6be9f0fb7149e96',
+ tokenTicker: 'CPG',
+ tokenName: 'Cashtab Prod Gamma',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '99',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 721083,
+ tx_hash:
+ 'dfb3dbf90fd87f6d66465ff05a61ddf1e1ca30900fadfe9cd4b73468649935ed',
+ tx_pos: 2,
+ value: 546,
+ txid: 'dfb3dbf90fd87f6d66465ff05a61ddf1e1ca30900fadfe9cd4b73468649935ed',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '157e0cdef5d5c51bdea00eac9ab821d809bb9d03cf98da85833614bedb129be6',
+ tokenTicker: 'CLNSP',
+ tokenName: 'ComponentLongNameSpeedLoad',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '82',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 724822,
+ tx_hash:
+ 'ed0dab39d5e976e433a705785726901dc83daa7d579412c18ee997341de010d3',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ed0dab39d5e976e433a705785726901dc83daa7d579412c18ee997341de010d3',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1185eebdde038a25050a3dbb66e2d5332305d1d4a4febab31f6e31bc49baac61',
+ tokenTicker: 'BETA',
+ tokenName: 'BETA',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 725143,
+ tx_hash:
+ 'e99296764134d6ea9ba7521490563762cfaf1541854ba9babc26c0df8665ac32',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e99296764134d6ea9ba7521490563762cfaf1541854ba9babc26c0df8665ac32',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'cfdc270ab82c001eaddd357f773a8dfe61cfdd891df66b39fee060f34f7a4015',
+ tokenTicker: 'SCOOG',
+ tokenName: 'Scoogi Alpha',
+ tokenDocumentUrl: 'cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 725871,
+ tx_hash:
+ '82a3fe0b03ab07a564351443634da1b1ed3960e4771c59b6f8abbf7ef4b3258d',
+ tx_pos: 1,
+ value: 546,
+ txid: '82a3fe0b03ab07a564351443634da1b1ed3960e4771c59b6f8abbf7ef4b3258d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'acba1d7f354c6d4d001eb99d31de174e5cea8a31d692afd6e7eb8474ad541f55',
+ tokenTicker: 'CTB',
+ tokenName: 'CashTabBits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '5.5e-8',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 725882,
+ tx_hash:
+ '1db1bef70013d178d7912731435029f9c8588f1d0089944c53eccffd255b5efc',
+ tx_pos: 2,
+ value: 546,
+ txid: '1db1bef70013d178d7912731435029f9c8588f1d0089944c53eccffd255b5efc',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'ccf5fe5a387559c8ab9efdeb0c0ef1b444e677298cfddf07671245ce3cb3c79f',
+ tokenTicker: 'XGB',
+ tokenName: 'Garmonbozia',
+ tokenDocumentUrl:
+ 'https://twinpeaks.fandom.com/wiki/Garmonbozia',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '478',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726001,
+ tx_hash:
+ '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ tx_pos: 2,
+ value: 546,
+ txid: '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '996000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726009,
+ tx_hash:
+ '52d2fd9d10debecbed6f8c3554517dada688c83197c4e57ad74556f0317c84b4',
+ tx_pos: 1,
+ value: 546,
+ txid: '52d2fd9d10debecbed6f8c3554517dada688c83197c4e57ad74556f0317c84b4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '69',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726019,
+ tx_hash:
+ 'b8982cf5531afcba125a9e17550d42a01045c3aa5ee70a485f8fbcde3dae191d',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b8982cf5531afcba125a9e17550d42a01045c3aa5ee70a485f8fbcde3dae191d',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '98183238638ecb4ddc365056e22de0e8a05448c1e6084bae247fae5a74ad4f48',
+ tokenTicker: 'DVV',
+ tokenName: 'Delta Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999989983',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726053,
+ tx_hash:
+ '0283492a729cfb7999684e733f2ee76bc4f652b9047ff47dbe3534b8f5960697',
+ tx_pos: 2,
+ value: 546,
+ txid: '0283492a729cfb7999684e733f2ee76bc4f652b9047ff47dbe3534b8f5960697',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'b8f2a9e767a0be7b80c7e414ef2534586d4da72efddb39a4e70e501ab73375cc',
+ tokenTicker: 'CTD',
+ tokenName: 'Cashtab Dark',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726167,
+ tx_hash:
+ '2487ed30179cca902291424f273df1b37b2b9245eb97007ec3c75ca20ebaae1f',
+ tx_pos: 1,
+ value: 546,
+ txid: '2487ed30179cca902291424f273df1b37b2b9245eb97007ec3c75ca20ebaae1f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6a9305a13135625f4b533256e8d2e21a7343005331e1839348a39040f61e09d3',
+ tokenTicker: 'SCOOG',
+ tokenName: 'Scoogi Alpha',
+ tokenDocumentUrl: 'cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '69',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726277,
+ tx_hash:
+ '8b8fbe88ba8086ccf7176ef1a07f753aa49b9e4c766b58bde556758ec707e3eb',
+ tx_pos: 2,
+ value: 546,
+ txid: '8b8fbe88ba8086ccf7176ef1a07f753aa49b9e4c766b58bde556758ec707e3eb',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999888',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726809,
+ tx_hash:
+ '123a31b903c9a7de544a443a02f73e0cbee6304931704e55d0583a8aca8df48e',
+ tx_pos: 2,
+ value: 546,
+ txid: '123a31b903c9a7de544a443a02f73e0cbee6304931704e55d0583a8aca8df48e',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '3de671a7107d3803d78f7f4a4e5c794d0903a8d28d16076445c084943c1e2db8',
+ tokenTicker: 'CLB',
+ tokenName: 'Cashtab Local Beta',
+ tokenDocumentUrl: 'boomertakes.com',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '22',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ '0bd0c49135b94b99989ec3b0396020a96fcbe2925bb25c40120dc047c0a097ec',
+ tx_pos: 1,
+ value: 546,
+ txid: '0bd0c49135b94b99989ec3b0396020a96fcbe2925bb25c40120dc047c0a097ec',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '44929ff3b1fc634f982fede112cf12b21199a2ebbcf718412a38de9177d77168',
+ tokenTicker: 'coin',
+ tokenName: 'johncoin',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ '5b2509c3235726f6d048af1336533d9db178a253cb2427a661ea676996cea141',
+ tx_pos: 2,
+ value: 546,
+ txid: '5b2509c3235726f6d048af1336533d9db178a253cb2427a661ea676996cea141',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '639a8dba34788ff3ebd3977d4ac045825394285ee648bb1d159e1c12b787ff25',
+ tokenTicker: 'CFL',
+ tokenName: 'Cashtab Facelift',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9955',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ tx_pos: 1,
+ value: 546,
+ txid: 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '100',
+ tokenId:
+ 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ tokenTicker: 'CFL',
+ tokenName: 'Cashtab Facelift',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727176,
+ tx_hash:
+ '8f645ce7b231a3ea81168229c1b6a1157e8a58fb8a8a127a80efc2ed39c4f72e',
+ tx_pos: 1,
+ value: 546,
+ txid: '8f645ce7b231a3ea81168229c1b6a1157e8a58fb8a8a127a80efc2ed39c4f72e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'b40d1f6acdb6ee68d7eca0167fe2753c076bc309b2e3b1af8bff70ca34b945b0',
+ tokenTicker: 'KAT',
+ tokenName: 'KA_Test',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '5000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 0,
+ value: 2000,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 1,
+ value: 2100,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 1,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 2,
+ value: 2200,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 2,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 3,
+ value: 2300,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 3,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 4,
+ value: 2400,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 4,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 5,
+ value: 2500,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 5,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 6,
+ value: 2600,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 6,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 7,
+ value: 2700,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 7,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 8,
+ value: 2800,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 8,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 9,
+ value: 2900,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 9,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 10,
+ value: 3000,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 10,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 11,
+ value: 3100,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 11,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 12,
+ value: 3200,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 12,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 13,
+ value: 3300,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 13,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 14,
+ value: 3400,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 14,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 15,
+ value: 3500,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 15,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 16,
+ value: 3600,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 16,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 17,
+ value: 3700,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 17,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 18,
+ value: 3800,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 18,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 19,
+ value: 3900,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 19,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 20,
+ value: 4000,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 20,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 21,
+ value: 4100,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 21,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 22,
+ value: 4200,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 22,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 23,
+ value: 69292642,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 23,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 0,
+ tx_hash:
+ '08947b3ef5919dafeb3ffbf3c6e8b46398fd13c51fe337326483c2382f1e501f',
+ tx_pos: 1,
+ value: 24868533,
+ txid: '08947b3ef5919dafeb3ffbf3c6e8b46398fd13c51fe337326483c2382f1e501f',
+ vout: 1,
+ isValid: false,
+ },
+ {
+ height: 727176,
+ tx_hash:
+ '159b70d26940f6bf968c086eb526982421169889f3492b0d025ac3cd777ec1cd',
+ tx_pos: 1,
+ value: 24874488,
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+};
+export const consumedUtxos = [
+ {
+ address: 'bitcoincash:qq0mw6nah9huwaxt45qw3fegjpszkjlrqsvttwy36p',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qz5lf9pxde9neq3hzte8mmwts03sktl9nuz6m3dynu',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ utxos: [
+ {
+ height: 727176,
+ tx_hash:
+ '159b70d26940f6bf968c086eb526982421169889f3492b0d025ac3cd777ec1cd',
+ tx_pos: 1,
+ value: 24874488,
+ },
+ ],
+ },
+];
+export const hydratedUtxoDetailsAfterRemovingConsumedUtxos = {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ txid: '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ tx_pos: 1,
+ value: 546,
+ txid: '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: false,
+ tokenQty: '9897999885.21030105',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ tx_pos: 1,
+ value: 546,
+ txid: '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '308.87654321',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ txid: 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '1e-9',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 685181,
+ tx_hash:
+ '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ tx_pos: 1,
+ value: 546,
+ txid: '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '50d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e',
+ tokenTicker: 'TBC',
+ tokenName: 'tabcash',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 686546,
+ tx_hash:
+ 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ tx_pos: 1,
+ value: 546,
+ txid: 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 687240,
+ tx_hash:
+ 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ tx_pos: 2,
+ value: 546,
+ txid: 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '0.99999999',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 688449,
+ tx_hash:
+ 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'e4e1a2fb071fa71ca727e08ed1d8ea52a9531c79d1e5f1ebf483c66b71a8621c',
+ tokenTicker: 'CPA',
+ tokenName: 'Cashtab Prod Alpha',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '80',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ tx_pos: 1,
+ value: 546,
+ txid: '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '0.12',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ tx_pos: 1,
+ value: 546,
+ txid: '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '0.12',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 693606,
+ tx_hash:
+ '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ tx_pos: 2,
+ value: 546,
+ txid: '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '45f0ff5cae7e89da6b96c26c8c48a959214c5f0e983e78d0925f8956ca8848c6',
+ tokenTicker: 'CMA',
+ tokenName: 'CashtabMintAlpha',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 5,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 699216,
+ tx_hash:
+ '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ tx_pos: 2,
+ value: 546,
+ txid: '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '0916e71779c9de7ee125741d3f5ab01f556356dbc86fd327a24f1e9e22ebc917',
+ tokenTicker: 'CTL2',
+ tokenName: 'Cashtab Token Launch Launch Token v2',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1899',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700185,
+ tx_hash:
+ '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ tx_pos: 2,
+ value: 546,
+ txid: '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '22f4ba40312ea3e90e1bfa88d2aa694c271d2e07361907b6eb5568873ffa62bf',
+ tokenTicker: 'CLA',
+ tokenName: 'Cashtab Local Alpha',
+ tokenDocumentUrl: 'boomertakes.com',
+ tokenDocumentHash: '',
+ decimals: 5,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ tx_pos: 2,
+ value: 546,
+ txid: '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '77ec4036ef8546ac46df6d3a5374e961216f92624627eaeef5d2e1a253df9fc6',
+ tokenTicker: 'CTLv3',
+ tokenName: 'Cashtab Token Launch Launch Token v3',
+ tokenDocumentUrl: 'coinex.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '267',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tx_pos: 1,
+ value: 546,
+ txid: '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '1000000000',
+ tokenId:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tokenTicker: 'CBB',
+ tokenName: 'Cashtab Beta Bits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ tx_pos: 2,
+ value: 546,
+ txid: 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999898',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700572,
+ tx_hash:
+ '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ tx_pos: 2,
+ value: 546,
+ txid: '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '990',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700677,
+ tx_hash:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '333',
+ tokenId:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tokenTicker: 'SA',
+ tokenName: 'Spinner Alpha',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 700915,
+ tx_hash:
+ 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ tx_pos: 2,
+ value: 546,
+ txid: 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999975',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ tx_pos: 1,
+ value: 546,
+ txid: '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '3',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ tx_pos: 1,
+ value: 546,
+ txid: '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ tx_pos: 1,
+ value: 546,
+ txid: 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ tx_pos: 1,
+ value: 546,
+ txid: '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ tx_pos: 1,
+ value: 546,
+ txid: '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701191,
+ tx_hash:
+ 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701194,
+ tx_hash:
+ 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701208,
+ tx_hash:
+ '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ tx_pos: 1,
+ value: 546,
+ txid: '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ tx_pos: 1,
+ value: 546,
+ txid: '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0.789698951',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ tx_pos: 1,
+ value: 546,
+ txid: '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701221,
+ tx_hash:
+ '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ tx_pos: 1,
+ value: 546,
+ txid: '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701223,
+ tx_hash:
+ '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ tx_pos: 2,
+ value: 546,
+ txid: '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '9e9738e9ac3ff202736bf7775f875ebae6f812650df577a947c20c52475e43da',
+ tokenTicker: 'CUTT',
+ tokenName: 'Cashtab Unit Test Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '90',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709251,
+ tx_hash:
+ '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ tx_pos: 1,
+ value: 546,
+ txid: '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'f36e1b3d9a2aaf74f132fef3834e9743b945a667a4204e761b85f2e7b65fd41a',
+ tokenTicker: 'POW',
+ tokenName: 'ProofofWriting.com Token',
+ tokenDocumentUrl: 'https://www.proofofwriting.com/26',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709259,
+ tx_hash:
+ '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ tx_pos: 1,
+ value: 546,
+ txid: '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709668,
+ tx_hash:
+ 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 710065,
+ tx_hash:
+ '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ tx_pos: 1,
+ value: 546,
+ txid: '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '9e9738e9ac3ff202736bf7775f875ebae6f812650df577a947c20c52475e43da',
+ tokenTicker: 'CUTT',
+ tokenName: 'Cashtab Unit Test Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 711227,
+ tx_hash:
+ 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '98183238638ecb4ddc365056e22de0e8a05448c1e6084bae247fae5a74ad4f48',
+ tokenTicker: 'DVV',
+ tokenName: 'Delta Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '17',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 715111,
+ tx_hash:
+ 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ tx_pos: 1,
+ value: 546,
+ txid: 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '6969',
+ tokenId:
+ 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ tokenTicker: 'SCΩΩG',
+ tokenName: 'Scoogi Omega',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ tx_pos: 1,
+ value: 546,
+ txid: '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '100',
+ tokenId:
+ '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ tokenTicker: '001',
+ tokenName: '01',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ tx_pos: 1,
+ value: 546,
+ txid: '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '102',
+ tokenId:
+ '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ tokenTicker: '002',
+ tokenName: '2',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715816,
+ tx_hash:
+ '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ tx_pos: 1,
+ value: 546,
+ txid: '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '102',
+ tokenId:
+ '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ tokenTicker: '002',
+ tokenName: '2',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717055,
+ tx_hash:
+ '18c0360f0db5399223cbed48f55c4cee9d9914c8a4a7dedcf9172a36201e9896',
+ tx_pos: 1,
+ value: 546,
+ txid: '18c0360f0db5399223cbed48f55c4cee9d9914c8a4a7dedcf9172a36201e9896',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'e859eeb52e7afca6217fb36784b3b6d3c7386a52f391dd0d00f2ec03a5e8e77b',
+ tokenTicker: 'test',
+ tokenName: 'test',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 1,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717653,
+ tx_hash:
+ '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ tx_pos: 1,
+ value: 546,
+ txid: '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '1000000000',
+ tokenId:
+ '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ tokenTicker: 'OMI',
+ tokenName: 'Omicron',
+ tokenDocumentUrl: 'cdc.gov',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717824,
+ tx_hash:
+ 'c0fe05d7bf71cd0f476ea18cdd4ecb26e1b9a33c911f4aaf143b2b18bc3b5f4f',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c0fe05d7bf71cd0f476ea18cdd4ecb26e1b9a33c911f4aaf143b2b18bc3b5f4f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bdb3b4215ca0622e0c4c07655522c376eaa891838a82f0217fa453bb0595a37c',
+ tokenTicker: 'Service',
+ tokenName: 'Evc token',
+ tokenDocumentUrl: 'https://cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '10000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718091,
+ tx_hash:
+ '905cc5662cad77df56c3770863634ce498dde9d4772dc494d33b7ce3f36fa66c',
+ tx_pos: 2,
+ value: 546,
+ txid: '905cc5662cad77df56c3770863634ce498dde9d4772dc494d33b7ce3f36fa66c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '523512076',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718280,
+ tx_hash:
+ 'f31f4ad7bf035cfb587a07a12ec60937cb8cbeafa7e4d7ed4f3276fea26fcfec',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f31f4ad7bf035cfb587a07a12ec60937cb8cbeafa7e4d7ed4f3276fea26fcfec',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bdb3b4215ca0622e0c4c07655522c376eaa891838a82f0217fa453bb0595a37c',
+ tokenTicker: 'Service',
+ tokenName: 'Evc token',
+ tokenDocumentUrl: 'https://cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '10000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718790,
+ tx_hash:
+ '67faa4753da2940d053f32edcda2c052a16c683aeb73f10cfde5c18266c14fe2',
+ tx_pos: 2,
+ value: 546,
+ txid: '67faa4753da2940d053f32edcda2c052a16c683aeb73f10cfde5c18266c14fe2',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7bbf452698a24b138b0357f689587fc6ea58410c34503b1179b91e40e10bba8b',
+ tokenTicker: 'COVID',
+ tokenName: 'COVID-19',
+ tokenDocumentUrl: 'https://en.wikipedia.org/wiki/COVID-19',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9999999900',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720056,
+ tx_hash:
+ '9c6363fb537d529f512a12d292ea9682fe7159e6bf5ebfec5b7067b401d2dba4',
+ tx_pos: 1,
+ value: 546,
+ txid: '9c6363fb537d529f512a12d292ea9682fe7159e6bf5ebfec5b7067b401d2dba4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '100',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '4eed87ba70864d9daa46d201c47db4513f77e5d4cc01256ab4dcc6dae9dfa055',
+ tx_pos: 1,
+ value: 546,
+ txid: '4eed87ba70864d9daa46d201c47db4513f77e5d4cc01256ab4dcc6dae9dfa055',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '7975514a3185cbb70900e9767e5fcc91c86913cb1d2ad9a28474253875271e33',
+ tx_pos: 1,
+ value: 546,
+ txid: '7975514a3185cbb70900e9767e5fcc91c86913cb1d2ad9a28474253875271e33',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '3',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'e10ae7a1bc78561ed367d59f150aebc13ef2054ba62f1a0db08fc7612d5ed58b',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e10ae7a1bc78561ed367d59f150aebc13ef2054ba62f1a0db08fc7612d5ed58b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'fb71c88bd5369cb8278f49ac672a9721833c36fc69143848b46ae15860339ea6',
+ tx_pos: 1,
+ value: 546,
+ txid: 'fb71c88bd5369cb8278f49ac672a9721833c36fc69143848b46ae15860339ea6',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '4',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720078,
+ tx_hash:
+ 'c3c6c6fb1619d001c29f17a701d042bc6b983e71113822aeeb66ca434fd9fa6c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c3c6c6fb1619d001c29f17a701d042bc6b983e71113822aeeb66ca434fd9fa6c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720951,
+ tx_hash:
+ 'fb50eac73a4fd5e2a701e0dbf4e575cea9c083e061b1db722e057164c7317e5b',
+ tx_pos: 2,
+ value: 546,
+ txid: 'fb50eac73a4fd5e2a701e0dbf4e575cea9c083e061b1db722e057164c7317e5b',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '666c4318d1f7fef5f2c698262492c519018d4e9130f95d05f6be9f0fb7149e96',
+ tokenTicker: 'CPG',
+ tokenName: 'Cashtab Prod Gamma',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '99',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 721083,
+ tx_hash:
+ 'dfb3dbf90fd87f6d66465ff05a61ddf1e1ca30900fadfe9cd4b73468649935ed',
+ tx_pos: 2,
+ value: 546,
+ txid: 'dfb3dbf90fd87f6d66465ff05a61ddf1e1ca30900fadfe9cd4b73468649935ed',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '157e0cdef5d5c51bdea00eac9ab821d809bb9d03cf98da85833614bedb129be6',
+ tokenTicker: 'CLNSP',
+ tokenName: 'ComponentLongNameSpeedLoad',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '82',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 724822,
+ tx_hash:
+ 'ed0dab39d5e976e433a705785726901dc83daa7d579412c18ee997341de010d3',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ed0dab39d5e976e433a705785726901dc83daa7d579412c18ee997341de010d3',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1185eebdde038a25050a3dbb66e2d5332305d1d4a4febab31f6e31bc49baac61',
+ tokenTicker: 'BETA',
+ tokenName: 'BETA',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 725143,
+ tx_hash:
+ 'e99296764134d6ea9ba7521490563762cfaf1541854ba9babc26c0df8665ac32',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e99296764134d6ea9ba7521490563762cfaf1541854ba9babc26c0df8665ac32',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'cfdc270ab82c001eaddd357f773a8dfe61cfdd891df66b39fee060f34f7a4015',
+ tokenTicker: 'SCOOG',
+ tokenName: 'Scoogi Alpha',
+ tokenDocumentUrl: 'cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 725871,
+ tx_hash:
+ '82a3fe0b03ab07a564351443634da1b1ed3960e4771c59b6f8abbf7ef4b3258d',
+ tx_pos: 1,
+ value: 546,
+ txid: '82a3fe0b03ab07a564351443634da1b1ed3960e4771c59b6f8abbf7ef4b3258d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'acba1d7f354c6d4d001eb99d31de174e5cea8a31d692afd6e7eb8474ad541f55',
+ tokenTicker: 'CTB',
+ tokenName: 'CashTabBits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '5.5e-8',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 725882,
+ tx_hash:
+ '1db1bef70013d178d7912731435029f9c8588f1d0089944c53eccffd255b5efc',
+ tx_pos: 2,
+ value: 546,
+ txid: '1db1bef70013d178d7912731435029f9c8588f1d0089944c53eccffd255b5efc',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'ccf5fe5a387559c8ab9efdeb0c0ef1b444e677298cfddf07671245ce3cb3c79f',
+ tokenTicker: 'XGB',
+ tokenName: 'Garmonbozia',
+ tokenDocumentUrl:
+ 'https://twinpeaks.fandom.com/wiki/Garmonbozia',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '478',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726001,
+ tx_hash:
+ '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ tx_pos: 2,
+ value: 546,
+ txid: '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '996000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726009,
+ tx_hash:
+ '52d2fd9d10debecbed6f8c3554517dada688c83197c4e57ad74556f0317c84b4',
+ tx_pos: 1,
+ value: 546,
+ txid: '52d2fd9d10debecbed6f8c3554517dada688c83197c4e57ad74556f0317c84b4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '69',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726019,
+ tx_hash:
+ 'b8982cf5531afcba125a9e17550d42a01045c3aa5ee70a485f8fbcde3dae191d',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b8982cf5531afcba125a9e17550d42a01045c3aa5ee70a485f8fbcde3dae191d',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '98183238638ecb4ddc365056e22de0e8a05448c1e6084bae247fae5a74ad4f48',
+ tokenTicker: 'DVV',
+ tokenName: 'Delta Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999989983',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726053,
+ tx_hash:
+ '0283492a729cfb7999684e733f2ee76bc4f652b9047ff47dbe3534b8f5960697',
+ tx_pos: 2,
+ value: 546,
+ txid: '0283492a729cfb7999684e733f2ee76bc4f652b9047ff47dbe3534b8f5960697',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'b8f2a9e767a0be7b80c7e414ef2534586d4da72efddb39a4e70e501ab73375cc',
+ tokenTicker: 'CTD',
+ tokenName: 'Cashtab Dark',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726167,
+ tx_hash:
+ '2487ed30179cca902291424f273df1b37b2b9245eb97007ec3c75ca20ebaae1f',
+ tx_pos: 1,
+ value: 546,
+ txid: '2487ed30179cca902291424f273df1b37b2b9245eb97007ec3c75ca20ebaae1f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6a9305a13135625f4b533256e8d2e21a7343005331e1839348a39040f61e09d3',
+ tokenTicker: 'SCOOG',
+ tokenName: 'Scoogi Alpha',
+ tokenDocumentUrl: 'cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '69',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726277,
+ tx_hash:
+ '8b8fbe88ba8086ccf7176ef1a07f753aa49b9e4c766b58bde556758ec707e3eb',
+ tx_pos: 2,
+ value: 546,
+ txid: '8b8fbe88ba8086ccf7176ef1a07f753aa49b9e4c766b58bde556758ec707e3eb',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999888',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726809,
+ tx_hash:
+ '123a31b903c9a7de544a443a02f73e0cbee6304931704e55d0583a8aca8df48e',
+ tx_pos: 2,
+ value: 546,
+ txid: '123a31b903c9a7de544a443a02f73e0cbee6304931704e55d0583a8aca8df48e',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '3de671a7107d3803d78f7f4a4e5c794d0903a8d28d16076445c084943c1e2db8',
+ tokenTicker: 'CLB',
+ tokenName: 'Cashtab Local Beta',
+ tokenDocumentUrl: 'boomertakes.com',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '22',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ '0bd0c49135b94b99989ec3b0396020a96fcbe2925bb25c40120dc047c0a097ec',
+ tx_pos: 1,
+ value: 546,
+ txid: '0bd0c49135b94b99989ec3b0396020a96fcbe2925bb25c40120dc047c0a097ec',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '44929ff3b1fc634f982fede112cf12b21199a2ebbcf718412a38de9177d77168',
+ tokenTicker: 'coin',
+ tokenName: 'johncoin',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ '5b2509c3235726f6d048af1336533d9db178a253cb2427a661ea676996cea141',
+ tx_pos: 2,
+ value: 546,
+ txid: '5b2509c3235726f6d048af1336533d9db178a253cb2427a661ea676996cea141',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '639a8dba34788ff3ebd3977d4ac045825394285ee648bb1d159e1c12b787ff25',
+ tokenTicker: 'CFL',
+ tokenName: 'Cashtab Facelift',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9955',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ tx_pos: 1,
+ value: 546,
+ txid: 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '100',
+ tokenId:
+ 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ tokenTicker: 'CFL',
+ tokenName: 'Cashtab Facelift',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727176,
+ tx_hash:
+ '8f645ce7b231a3ea81168229c1b6a1157e8a58fb8a8a127a80efc2ed39c4f72e',
+ tx_pos: 1,
+ value: 546,
+ txid: '8f645ce7b231a3ea81168229c1b6a1157e8a58fb8a8a127a80efc2ed39c4f72e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'b40d1f6acdb6ee68d7eca0167fe2753c076bc309b2e3b1af8bff70ca34b945b0',
+ tokenTicker: 'KAT',
+ tokenName: 'KA_Test',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '5000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 0,
+ value: 2000,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 1,
+ value: 2100,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 1,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 2,
+ value: 2200,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 2,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 3,
+ value: 2300,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 3,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 4,
+ value: 2400,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 4,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 5,
+ value: 2500,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 5,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 6,
+ value: 2600,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 6,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 7,
+ value: 2700,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 7,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 8,
+ value: 2800,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 8,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 9,
+ value: 2900,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 9,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 10,
+ value: 3000,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 10,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 11,
+ value: 3100,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 11,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 12,
+ value: 3200,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 12,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 13,
+ value: 3300,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 13,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 14,
+ value: 3400,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 14,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 15,
+ value: 3500,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 15,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 16,
+ value: 3600,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 16,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 17,
+ value: 3700,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 17,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 18,
+ value: 3800,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 18,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 19,
+ value: 3900,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 19,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 20,
+ value: 4000,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 20,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 21,
+ value: 4100,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 21,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 22,
+ value: 4200,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 22,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 23,
+ value: 69292642,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 23,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 0,
+ tx_hash:
+ '08947b3ef5919dafeb3ffbf3c6e8b46398fd13c51fe337326483c2382f1e501f',
+ tx_pos: 1,
+ value: 24868533,
+ txid: '08947b3ef5919dafeb3ffbf3c6e8b46398fd13c51fe337326483c2382f1e501f',
+ vout: 1,
+ isValid: false,
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+};
+
+export const consumedUtxosMoreThanTwenty = [
+ {
+ address: 'bitcoincash:qq0mw6nah9huwaxt45qw3fegjpszkjlrqsvttwy36p',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qz5lf9pxde9neq3hzte8mmwts03sktl9nuz6m3dynu',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ utxos: [
+ {
+ height: 727176,
+ tx_hash:
+ '159b70d26940f6bf968c086eb526982421169889f3492b0d025ac3cd777ec1cd',
+ tx_pos: 1,
+ value: 24874488,
+ },
+ {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ txid: '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ tx_pos: 1,
+ value: 546,
+ txid: '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: false,
+ tokenQty: '9897999885.21030105',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ tx_pos: 1,
+ value: 546,
+ txid: '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '308.87654321',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ txid: 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '1e-9',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 685181,
+ tx_hash:
+ '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ tx_pos: 1,
+ value: 546,
+ txid: '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '50d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e',
+ tokenTicker: 'TBC',
+ tokenName: 'tabcash',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 686546,
+ tx_hash:
+ 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ tx_pos: 1,
+ value: 546,
+ txid: 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700915,
+ tx_hash:
+ 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ tx_pos: 2,
+ value: 546,
+ txid: 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999975',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ tx_pos: 1,
+ value: 546,
+ txid: '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '3',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 6,
+ value: 2600,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 6,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 7,
+ value: 2700,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 7,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 8,
+ value: 2800,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 8,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 9,
+ value: 2900,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 9,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 10,
+ value: 3000,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 10,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 11,
+ value: 3100,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 11,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 12,
+ value: 3200,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 12,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 13,
+ value: 3300,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 13,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 14,
+ value: 3400,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 14,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 15,
+ value: 3500,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 15,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 16,
+ value: 3600,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 16,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ },
+];
+export const consumedUtxosMoreThanTwentyInRandomObjects = [
+ {
+ address: 'bitcoincash:qq0mw6nah9huwaxt45qw3fegjpszkjlrqsvttwy36p',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qz5lf9pxde9neq3hzte8mmwts03sktl9nuz6m3dynu',
+ utxos: [],
+ },
+ {
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ utxos: [
+ {
+ height: 727176,
+ tx_hash:
+ '159b70d26940f6bf968c086eb526982421169889f3492b0d025ac3cd777ec1cd',
+ tx_pos: 1,
+ value: 24874488,
+ },
+ ],
+ },
+ {
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ utxos: [
+ {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ txid: '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ tx_pos: 1,
+ value: 546,
+ txid: '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: false,
+ tokenQty: '9897999885.21030105',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ tx_pos: 1,
+ value: 546,
+ txid: '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '308.87654321',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ txid: 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '1e-9',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 685181,
+ tx_hash:
+ '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ tx_pos: 1,
+ value: 546,
+ txid: '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '50d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e',
+ tokenTicker: 'TBC',
+ tokenName: 'tabcash',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 686546,
+ tx_hash:
+ 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ tx_pos: 1,
+ value: 546,
+ txid: 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700915,
+ tx_hash:
+ 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ tx_pos: 2,
+ value: 546,
+ txid: 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999975',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ },
+ {
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ utxos: [
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 14,
+ value: 3400,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 14,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 15,
+ value: 3500,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 15,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 16,
+ value: 3600,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 16,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727176,
+ tx_hash:
+ '159b70d26940f6bf968c086eb526982421169889f3492b0d025ac3cd777ec1cd',
+ tx_pos: 1,
+ value: 24874488,
+ },
+ ],
+ },
+ {
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ utxos: [
+ {
+ height: 701079,
+ tx_hash:
+ '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ tx_pos: 1,
+ value: 546,
+ txid: '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '3',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 6,
+ value: 2600,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 6,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 7,
+ value: 2700,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 7,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 8,
+ value: 2800,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 8,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 9,
+ value: 2900,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 9,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 10,
+ value: 3000,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 10,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 11,
+ value: 3100,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 11,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 12,
+ value: 3200,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 12,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 13,
+ value: 3300,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 13,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ },
+];
+export const hydratedUtxoDetailsAfterRemovingMoreThanTwentyConsumedUtxos = {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 687240,
+ tx_hash:
+ 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ tx_pos: 2,
+ value: 546,
+ txid: 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '0.99999999',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 688449,
+ tx_hash:
+ 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'e4e1a2fb071fa71ca727e08ed1d8ea52a9531c79d1e5f1ebf483c66b71a8621c',
+ tokenTicker: 'CPA',
+ tokenName: 'Cashtab Prod Alpha',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '80',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ tx_pos: 1,
+ value: 546,
+ txid: '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '0.12',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ tx_pos: 1,
+ value: 546,
+ txid: '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '0.12',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 693606,
+ tx_hash:
+ '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ tx_pos: 2,
+ value: 546,
+ txid: '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '45f0ff5cae7e89da6b96c26c8c48a959214c5f0e983e78d0925f8956ca8848c6',
+ tokenTicker: 'CMA',
+ tokenName: 'CashtabMintAlpha',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 5,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 699216,
+ tx_hash:
+ '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ tx_pos: 2,
+ value: 546,
+ txid: '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '0916e71779c9de7ee125741d3f5ab01f556356dbc86fd327a24f1e9e22ebc917',
+ tokenTicker: 'CTL2',
+ tokenName: 'Cashtab Token Launch Launch Token v2',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1899',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700185,
+ tx_hash:
+ '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ tx_pos: 2,
+ value: 546,
+ txid: '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '22f4ba40312ea3e90e1bfa88d2aa694c271d2e07361907b6eb5568873ffa62bf',
+ tokenTicker: 'CLA',
+ tokenName: 'Cashtab Local Alpha',
+ tokenDocumentUrl: 'boomertakes.com',
+ tokenDocumentHash: '',
+ decimals: 5,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ tx_pos: 2,
+ value: 546,
+ txid: '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '77ec4036ef8546ac46df6d3a5374e961216f92624627eaeef5d2e1a253df9fc6',
+ tokenTicker: 'CTLv3',
+ tokenName: 'Cashtab Token Launch Launch Token v3',
+ tokenDocumentUrl: 'coinex.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '267',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tx_pos: 1,
+ value: 546,
+ txid: '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '1000000000',
+ tokenId:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tokenTicker: 'CBB',
+ tokenName: 'Cashtab Beta Bits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ tx_pos: 2,
+ value: 546,
+ txid: 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999898',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700572,
+ tx_hash:
+ '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ tx_pos: 2,
+ value: 546,
+ txid: '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '990',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700677,
+ tx_hash:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '333',
+ tokenId:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tokenTicker: 'SA',
+ tokenName: 'Spinner Alpha',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 701079,
+ tx_hash:
+ '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ tx_pos: 1,
+ value: 546,
+ txid: '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ tx_pos: 1,
+ value: 546,
+ txid: 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ tx_pos: 1,
+ value: 546,
+ txid: '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ tx_pos: 1,
+ value: 546,
+ txid: '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701191,
+ tx_hash:
+ 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701194,
+ tx_hash:
+ 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701208,
+ tx_hash:
+ '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ tx_pos: 1,
+ value: 546,
+ txid: '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ tx_pos: 1,
+ value: 546,
+ txid: '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0.789698951',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ tx_pos: 1,
+ value: 546,
+ txid: '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701221,
+ tx_hash:
+ '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ tx_pos: 1,
+ value: 546,
+ txid: '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701223,
+ tx_hash:
+ '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ tx_pos: 2,
+ value: 546,
+ txid: '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '9e9738e9ac3ff202736bf7775f875ebae6f812650df577a947c20c52475e43da',
+ tokenTicker: 'CUTT',
+ tokenName: 'Cashtab Unit Test Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '90',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709251,
+ tx_hash:
+ '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ tx_pos: 1,
+ value: 546,
+ txid: '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'f36e1b3d9a2aaf74f132fef3834e9743b945a667a4204e761b85f2e7b65fd41a',
+ tokenTicker: 'POW',
+ tokenName: 'ProofofWriting.com Token',
+ tokenDocumentUrl: 'https://www.proofofwriting.com/26',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709259,
+ tx_hash:
+ '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ tx_pos: 1,
+ value: 546,
+ txid: '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709668,
+ tx_hash:
+ 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 710065,
+ tx_hash:
+ '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ tx_pos: 1,
+ value: 546,
+ txid: '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '9e9738e9ac3ff202736bf7775f875ebae6f812650df577a947c20c52475e43da',
+ tokenTicker: 'CUTT',
+ tokenName: 'Cashtab Unit Test Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 711227,
+ tx_hash:
+ 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '98183238638ecb4ddc365056e22de0e8a05448c1e6084bae247fae5a74ad4f48',
+ tokenTicker: 'DVV',
+ tokenName: 'Delta Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '17',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 715111,
+ tx_hash:
+ 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ tx_pos: 1,
+ value: 546,
+ txid: 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '6969',
+ tokenId:
+ 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ tokenTicker: 'SCΩΩG',
+ tokenName: 'Scoogi Omega',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ tx_pos: 1,
+ value: 546,
+ txid: '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '100',
+ tokenId:
+ '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ tokenTicker: '001',
+ tokenName: '01',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ tx_pos: 1,
+ value: 546,
+ txid: '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '102',
+ tokenId:
+ '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ tokenTicker: '002',
+ tokenName: '2',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715816,
+ tx_hash:
+ '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ tx_pos: 1,
+ value: 546,
+ txid: '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '102',
+ tokenId:
+ '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ tokenTicker: '002',
+ tokenName: '2',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717055,
+ tx_hash:
+ '18c0360f0db5399223cbed48f55c4cee9d9914c8a4a7dedcf9172a36201e9896',
+ tx_pos: 1,
+ value: 546,
+ txid: '18c0360f0db5399223cbed48f55c4cee9d9914c8a4a7dedcf9172a36201e9896',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'e859eeb52e7afca6217fb36784b3b6d3c7386a52f391dd0d00f2ec03a5e8e77b',
+ tokenTicker: 'test',
+ tokenName: 'test',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 1,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717653,
+ tx_hash:
+ '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ tx_pos: 1,
+ value: 546,
+ txid: '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '1000000000',
+ tokenId:
+ '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ tokenTicker: 'OMI',
+ tokenName: 'Omicron',
+ tokenDocumentUrl: 'cdc.gov',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717824,
+ tx_hash:
+ 'c0fe05d7bf71cd0f476ea18cdd4ecb26e1b9a33c911f4aaf143b2b18bc3b5f4f',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c0fe05d7bf71cd0f476ea18cdd4ecb26e1b9a33c911f4aaf143b2b18bc3b5f4f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bdb3b4215ca0622e0c4c07655522c376eaa891838a82f0217fa453bb0595a37c',
+ tokenTicker: 'Service',
+ tokenName: 'Evc token',
+ tokenDocumentUrl: 'https://cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '10000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718091,
+ tx_hash:
+ '905cc5662cad77df56c3770863634ce498dde9d4772dc494d33b7ce3f36fa66c',
+ tx_pos: 2,
+ value: 546,
+ txid: '905cc5662cad77df56c3770863634ce498dde9d4772dc494d33b7ce3f36fa66c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ isValid: null,
+ tokenQty: '523512076',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718280,
+ tx_hash:
+ 'f31f4ad7bf035cfb587a07a12ec60937cb8cbeafa7e4d7ed4f3276fea26fcfec',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f31f4ad7bf035cfb587a07a12ec60937cb8cbeafa7e4d7ed4f3276fea26fcfec',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bdb3b4215ca0622e0c4c07655522c376eaa891838a82f0217fa453bb0595a37c',
+ tokenTicker: 'Service',
+ tokenName: 'Evc token',
+ tokenDocumentUrl: 'https://cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '10000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718790,
+ tx_hash:
+ '67faa4753da2940d053f32edcda2c052a16c683aeb73f10cfde5c18266c14fe2',
+ tx_pos: 2,
+ value: 546,
+ txid: '67faa4753da2940d053f32edcda2c052a16c683aeb73f10cfde5c18266c14fe2',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7bbf452698a24b138b0357f689587fc6ea58410c34503b1179b91e40e10bba8b',
+ tokenTicker: 'COVID',
+ tokenName: 'COVID-19',
+ tokenDocumentUrl: 'https://en.wikipedia.org/wiki/COVID-19',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9999999900',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720056,
+ tx_hash:
+ '9c6363fb537d529f512a12d292ea9682fe7159e6bf5ebfec5b7067b401d2dba4',
+ tx_pos: 1,
+ value: 546,
+ txid: '9c6363fb537d529f512a12d292ea9682fe7159e6bf5ebfec5b7067b401d2dba4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '100',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '4eed87ba70864d9daa46d201c47db4513f77e5d4cc01256ab4dcc6dae9dfa055',
+ tx_pos: 1,
+ value: 546,
+ txid: '4eed87ba70864d9daa46d201c47db4513f77e5d4cc01256ab4dcc6dae9dfa055',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '7975514a3185cbb70900e9767e5fcc91c86913cb1d2ad9a28474253875271e33',
+ tx_pos: 1,
+ value: 546,
+ txid: '7975514a3185cbb70900e9767e5fcc91c86913cb1d2ad9a28474253875271e33',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '3',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'e10ae7a1bc78561ed367d59f150aebc13ef2054ba62f1a0db08fc7612d5ed58b',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e10ae7a1bc78561ed367d59f150aebc13ef2054ba62f1a0db08fc7612d5ed58b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'fb71c88bd5369cb8278f49ac672a9721833c36fc69143848b46ae15860339ea6',
+ tx_pos: 1,
+ value: 546,
+ txid: 'fb71c88bd5369cb8278f49ac672a9721833c36fc69143848b46ae15860339ea6',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '4',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720078,
+ tx_hash:
+ 'c3c6c6fb1619d001c29f17a701d042bc6b983e71113822aeeb66ca434fd9fa6c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c3c6c6fb1619d001c29f17a701d042bc6b983e71113822aeeb66ca434fd9fa6c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720951,
+ tx_hash:
+ 'fb50eac73a4fd5e2a701e0dbf4e575cea9c083e061b1db722e057164c7317e5b',
+ tx_pos: 2,
+ value: 546,
+ txid: 'fb50eac73a4fd5e2a701e0dbf4e575cea9c083e061b1db722e057164c7317e5b',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '666c4318d1f7fef5f2c698262492c519018d4e9130f95d05f6be9f0fb7149e96',
+ tokenTicker: 'CPG',
+ tokenName: 'Cashtab Prod Gamma',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '99',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 721083,
+ tx_hash:
+ 'dfb3dbf90fd87f6d66465ff05a61ddf1e1ca30900fadfe9cd4b73468649935ed',
+ tx_pos: 2,
+ value: 546,
+ txid: 'dfb3dbf90fd87f6d66465ff05a61ddf1e1ca30900fadfe9cd4b73468649935ed',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '157e0cdef5d5c51bdea00eac9ab821d809bb9d03cf98da85833614bedb129be6',
+ tokenTicker: 'CLNSP',
+ tokenName: 'ComponentLongNameSpeedLoad',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '82',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 724822,
+ tx_hash:
+ 'ed0dab39d5e976e433a705785726901dc83daa7d579412c18ee997341de010d3',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ed0dab39d5e976e433a705785726901dc83daa7d579412c18ee997341de010d3',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1185eebdde038a25050a3dbb66e2d5332305d1d4a4febab31f6e31bc49baac61',
+ tokenTicker: 'BETA',
+ tokenName: 'BETA',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 725143,
+ tx_hash:
+ 'e99296764134d6ea9ba7521490563762cfaf1541854ba9babc26c0df8665ac32',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e99296764134d6ea9ba7521490563762cfaf1541854ba9babc26c0df8665ac32',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'cfdc270ab82c001eaddd357f773a8dfe61cfdd891df66b39fee060f34f7a4015',
+ tokenTicker: 'SCOOG',
+ tokenName: 'Scoogi Alpha',
+ tokenDocumentUrl: 'cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 725871,
+ tx_hash:
+ '82a3fe0b03ab07a564351443634da1b1ed3960e4771c59b6f8abbf7ef4b3258d',
+ tx_pos: 1,
+ value: 546,
+ txid: '82a3fe0b03ab07a564351443634da1b1ed3960e4771c59b6f8abbf7ef4b3258d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'acba1d7f354c6d4d001eb99d31de174e5cea8a31d692afd6e7eb8474ad541f55',
+ tokenTicker: 'CTB',
+ tokenName: 'CashTabBits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '5.5e-8',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 725882,
+ tx_hash:
+ '1db1bef70013d178d7912731435029f9c8588f1d0089944c53eccffd255b5efc',
+ tx_pos: 2,
+ value: 546,
+ txid: '1db1bef70013d178d7912731435029f9c8588f1d0089944c53eccffd255b5efc',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'ccf5fe5a387559c8ab9efdeb0c0ef1b444e677298cfddf07671245ce3cb3c79f',
+ tokenTicker: 'XGB',
+ tokenName: 'Garmonbozia',
+ tokenDocumentUrl:
+ 'https://twinpeaks.fandom.com/wiki/Garmonbozia',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '478',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726001,
+ tx_hash:
+ '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ tx_pos: 2,
+ value: 546,
+ txid: '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '996000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726009,
+ tx_hash:
+ '52d2fd9d10debecbed6f8c3554517dada688c83197c4e57ad74556f0317c84b4',
+ tx_pos: 1,
+ value: 546,
+ txid: '52d2fd9d10debecbed6f8c3554517dada688c83197c4e57ad74556f0317c84b4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '69',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726019,
+ tx_hash:
+ 'b8982cf5531afcba125a9e17550d42a01045c3aa5ee70a485f8fbcde3dae191d',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b8982cf5531afcba125a9e17550d42a01045c3aa5ee70a485f8fbcde3dae191d',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '98183238638ecb4ddc365056e22de0e8a05448c1e6084bae247fae5a74ad4f48',
+ tokenTicker: 'DVV',
+ tokenName: 'Delta Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999989983',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726053,
+ tx_hash:
+ '0283492a729cfb7999684e733f2ee76bc4f652b9047ff47dbe3534b8f5960697',
+ tx_pos: 2,
+ value: 546,
+ txid: '0283492a729cfb7999684e733f2ee76bc4f652b9047ff47dbe3534b8f5960697',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'b8f2a9e767a0be7b80c7e414ef2534586d4da72efddb39a4e70e501ab73375cc',
+ tokenTicker: 'CTD',
+ tokenName: 'Cashtab Dark',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726167,
+ tx_hash:
+ '2487ed30179cca902291424f273df1b37b2b9245eb97007ec3c75ca20ebaae1f',
+ tx_pos: 1,
+ value: 546,
+ txid: '2487ed30179cca902291424f273df1b37b2b9245eb97007ec3c75ca20ebaae1f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6a9305a13135625f4b533256e8d2e21a7343005331e1839348a39040f61e09d3',
+ tokenTicker: 'SCOOG',
+ tokenName: 'Scoogi Alpha',
+ tokenDocumentUrl: 'cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '69',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726277,
+ tx_hash:
+ '8b8fbe88ba8086ccf7176ef1a07f753aa49b9e4c766b58bde556758ec707e3eb',
+ tx_pos: 2,
+ value: 546,
+ txid: '8b8fbe88ba8086ccf7176ef1a07f753aa49b9e4c766b58bde556758ec707e3eb',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999888',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726809,
+ tx_hash:
+ '123a31b903c9a7de544a443a02f73e0cbee6304931704e55d0583a8aca8df48e',
+ tx_pos: 2,
+ value: 546,
+ txid: '123a31b903c9a7de544a443a02f73e0cbee6304931704e55d0583a8aca8df48e',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '3de671a7107d3803d78f7f4a4e5c794d0903a8d28d16076445c084943c1e2db8',
+ tokenTicker: 'CLB',
+ tokenName: 'Cashtab Local Beta',
+ tokenDocumentUrl: 'boomertakes.com',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '22',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ '0bd0c49135b94b99989ec3b0396020a96fcbe2925bb25c40120dc047c0a097ec',
+ tx_pos: 1,
+ value: 546,
+ txid: '0bd0c49135b94b99989ec3b0396020a96fcbe2925bb25c40120dc047c0a097ec',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '44929ff3b1fc634f982fede112cf12b21199a2ebbcf718412a38de9177d77168',
+ tokenTicker: 'coin',
+ tokenName: 'johncoin',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ '5b2509c3235726f6d048af1336533d9db178a253cb2427a661ea676996cea141',
+ tx_pos: 2,
+ value: 546,
+ txid: '5b2509c3235726f6d048af1336533d9db178a253cb2427a661ea676996cea141',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '639a8dba34788ff3ebd3977d4ac045825394285ee648bb1d159e1c12b787ff25',
+ tokenTicker: 'CFL',
+ tokenName: 'Cashtab Facelift',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9955',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ tx_pos: 1,
+ value: 546,
+ txid: 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '100',
+ tokenId:
+ 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ tokenTicker: 'CFL',
+ tokenName: 'Cashtab Facelift',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727176,
+ tx_hash:
+ '8f645ce7b231a3ea81168229c1b6a1157e8a58fb8a8a127a80efc2ed39c4f72e',
+ tx_pos: 1,
+ value: 546,
+ txid: '8f645ce7b231a3ea81168229c1b6a1157e8a58fb8a8a127a80efc2ed39c4f72e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'b40d1f6acdb6ee68d7eca0167fe2753c076bc309b2e3b1af8bff70ca34b945b0',
+ tokenTicker: 'KAT',
+ tokenName: 'KA_Test',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '5000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 0,
+ value: 2000,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 0,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 1,
+ value: 2100,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 1,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 2,
+ value: 2200,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 2,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 3,
+ value: 2300,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 3,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 4,
+ value: 2400,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 4,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 5,
+ value: 2500,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 5,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 17,
+ value: 3700,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 17,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 18,
+ value: 3800,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 18,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 19,
+ value: 3900,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 19,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 20,
+ value: 4000,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 20,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 21,
+ value: 4100,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 21,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 22,
+ value: 4200,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 22,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727731,
+ tx_hash:
+ '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ tx_pos: 23,
+ value: 69292642,
+ txid: '999cdbb996a721e423114da9685a2a8888eeeb0239975ffccade1c8811cefd5e',
+ vout: 23,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 0,
+ tx_hash:
+ '08947b3ef5919dafeb3ffbf3c6e8b46398fd13c51fe337326483c2382f1e501f',
+ tx_pos: 1,
+ value: 24868533,
+ txid: '08947b3ef5919dafeb3ffbf3c6e8b46398fd13c51fe337326483c2382f1e501f',
+ vout: 1,
+ isValid: false,
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+};
+
+export const utxoCountSingleTemplate = [
+ {
+ address: 'string',
+ utxos: [],
+ },
+ {
+ address: 'string',
+ utxos: [],
+ },
+ {
+ address: 'string',
+ utxos: [{}],
+ },
+];
+export const utxoCountMultiTemplate = [
+ {
+ address: 'string',
+ utxos: [{}, {}, {}],
+ },
+ {
+ address: 'string',
+ utxos: [{}, {}, {}, {}],
+ },
+ {
+ address: 'string',
+ utxos: [{}, {}, {}, {}, {}],
+ },
+];
+
+export const incrementalUtxosTemplate = [
+ {
+ address: 'string',
+ utxos: [],
+ },
+ {
+ address: 'string',
+ utxos: [],
+ },
+ {
+ address: 'string',
+ utxos: [
+ { tx_hash: 'txid 1', tx_pos: 0, value: 100 },
+ { tx_hash: 'txid 2', tx_pos: 0, value: 101 },
+ { tx_hash: 'txid 3', tx_pos: 1, value: 201 },
+ { tx_hash: 'txid 4', tx_pos: 2, value: 301 },
+ { tx_hash: 'txid 5', tx_pos: 3, value: 888 },
+ ],
+ },
+];
+export const incrementallyHydratedUtxosTemplate = {
+ slpUtxos: [
+ {
+ address: 'string',
+ utxos: [],
+ },
+ {
+ address: 'string',
+ utxos: [],
+ },
+ {
+ address: 'string',
+ utxos: [
+ { tx_hash: 'txid 1', tx_pos: 0, value: 100 },
+ { tx_hash: 'txid 2', tx_pos: 0, value: 101 },
+ ],
+ },
+ {
+ address: 'string',
+ utxos: [
+ { tx_hash: 'txid 3', tx_pos: 1, value: 201 },
+ { tx_hash: 'txid 4', tx_pos: 2, value: 301 },
+ { tx_hash: 'txid 5', tx_pos: 3, value: 888 },
+ ],
+ },
+ ],
+};
+export const incrementallyHydratedUtxosTemplateMissing = {
+ slpUtxos: [
+ {
+ address: 'string',
+ utxos: [],
+ },
+ {
+ address: 'string',
+ utxos: [],
+ },
+ {
+ address: 'string',
+ utxos: [
+ { tx_hash: 'txid 1', tx_pos: 0, value: 100 },
+ { tx_hash: 'txid 2', tx_pos: 0, value: 101 },
+ ],
+ },
+ {
+ address: 'string',
+ utxos: [
+ { tx_hash: 'txid 3', tx_pos: 1, value: 201 },
+ { tx_hash: 'txid 4', tx_pos: 2, value: 301 },
+ ],
+ },
+ ],
+};
+
+export const utxosAfterSentTxIncremental = [
+ {
+ utxos: [],
+ address: 'bitcoincash:qq0mw6nah9huwaxt45qw3fegjpszkjlrqsvttwy36p',
+ },
+ {
+ utxos: [],
+ address: 'bitcoincash:qz5lf9pxde9neq3hzte8mmwts03sktl9nuz6m3dynu',
+ },
+ {
+ utxos: [
+ {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 685181,
+ tx_hash:
+ '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 686546,
+ tx_hash:
+ 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 687240,
+ tx_hash:
+ 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 688449,
+ tx_hash:
+ 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 693606,
+ tx_hash:
+ '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 699216,
+ tx_hash:
+ '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 700185,
+ tx_hash:
+ '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 700469,
+ tx_hash:
+ 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 700572,
+ tx_hash:
+ '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 700677,
+ tx_hash:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 700915,
+ tx_hash:
+ 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701191,
+ tx_hash:
+ 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701194,
+ tx_hash:
+ 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701208,
+ tx_hash:
+ '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701221,
+ tx_hash:
+ '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 701223,
+ tx_hash:
+ '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 709251,
+ tx_hash:
+ '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 709259,
+ tx_hash:
+ '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 709668,
+ tx_hash:
+ 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 710065,
+ tx_hash:
+ '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 711227,
+ tx_hash:
+ 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 715111,
+ tx_hash:
+ 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 715816,
+ tx_hash:
+ '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 717055,
+ tx_hash:
+ '18c0360f0db5399223cbed48f55c4cee9d9914c8a4a7dedcf9172a36201e9896',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 717653,
+ tx_hash:
+ '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 717824,
+ tx_hash:
+ 'c0fe05d7bf71cd0f476ea18cdd4ecb26e1b9a33c911f4aaf143b2b18bc3b5f4f',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 718091,
+ tx_hash:
+ '905cc5662cad77df56c3770863634ce498dde9d4772dc494d33b7ce3f36fa66c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 718280,
+ tx_hash:
+ 'f31f4ad7bf035cfb587a07a12ec60937cb8cbeafa7e4d7ed4f3276fea26fcfec',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 718790,
+ tx_hash:
+ '67faa4753da2940d053f32edcda2c052a16c683aeb73f10cfde5c18266c14fe2',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 720056,
+ tx_hash:
+ '9c6363fb537d529f512a12d292ea9682fe7159e6bf5ebfec5b7067b401d2dba4',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '4eed87ba70864d9daa46d201c47db4513f77e5d4cc01256ab4dcc6dae9dfa055',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '7975514a3185cbb70900e9767e5fcc91c86913cb1d2ad9a28474253875271e33',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'e10ae7a1bc78561ed367d59f150aebc13ef2054ba62f1a0db08fc7612d5ed58b',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'fb71c88bd5369cb8278f49ac672a9721833c36fc69143848b46ae15860339ea6',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720078,
+ tx_hash:
+ 'c3c6c6fb1619d001c29f17a701d042bc6b983e71113822aeeb66ca434fd9fa6c',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 720951,
+ tx_hash:
+ 'fb50eac73a4fd5e2a701e0dbf4e575cea9c083e061b1db722e057164c7317e5b',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 721083,
+ tx_hash:
+ 'dfb3dbf90fd87f6d66465ff05a61ddf1e1ca30900fadfe9cd4b73468649935ed',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 724822,
+ tx_hash:
+ 'ed0dab39d5e976e433a705785726901dc83daa7d579412c18ee997341de010d3',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 725143,
+ tx_hash:
+ 'e99296764134d6ea9ba7521490563762cfaf1541854ba9babc26c0df8665ac32',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 725871,
+ tx_hash:
+ '82a3fe0b03ab07a564351443634da1b1ed3960e4771c59b6f8abbf7ef4b3258d',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 725882,
+ tx_hash:
+ '1db1bef70013d178d7912731435029f9c8588f1d0089944c53eccffd255b5efc',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 726001,
+ tx_hash:
+ '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 726009,
+ tx_hash:
+ '52d2fd9d10debecbed6f8c3554517dada688c83197c4e57ad74556f0317c84b4',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 726019,
+ tx_hash:
+ 'b8982cf5531afcba125a9e17550d42a01045c3aa5ee70a485f8fbcde3dae191d',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 726053,
+ tx_hash:
+ '0283492a729cfb7999684e733f2ee76bc4f652b9047ff47dbe3534b8f5960697',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 726167,
+ tx_hash:
+ '2487ed30179cca902291424f273df1b37b2b9245eb97007ec3c75ca20ebaae1f',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 726277,
+ tx_hash:
+ '8b8fbe88ba8086ccf7176ef1a07f753aa49b9e4c766b58bde556758ec707e3eb',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 726809,
+ tx_hash:
+ '123a31b903c9a7de544a443a02f73e0cbee6304931704e55d0583a8aca8df48e',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 726826,
+ tx_hash:
+ '0bd0c49135b94b99989ec3b0396020a96fcbe2925bb25c40120dc047c0a097ec',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 726826,
+ tx_hash:
+ '5b2509c3235726f6d048af1336533d9db178a253cb2427a661ea676996cea141',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 726826,
+ tx_hash:
+ 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 727176,
+ tx_hash:
+ '8f645ce7b231a3ea81168229c1b6a1157e8a58fb8a8a127a80efc2ed39c4f72e',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 727832,
+ tx_hash:
+ '08947b3ef5919dafeb3ffbf3c6e8b46398fd13c51fe337326483c2382f1e501f',
+ tx_pos: 1,
+ value: 24868533,
+ },
+ {
+ height: 727857,
+ tx_hash:
+ '2d2a173f93638fca8c087b8324aab222642231deb249a4a0d764dbbae19fd385',
+ tx_pos: 1,
+ value: 5045,
+ },
+ {
+ height: 727857,
+ tx_hash:
+ 'ebba5f05db1ca0be3f8b97410374b64c8e80ae6631bc8fc5a52c3804220dfbb2',
+ tx_pos: 2,
+ value: 1753,
+ },
+ {
+ height: 727864,
+ tx_hash:
+ '04e13833b7de3656ba436be8b3f2286399a03053451b3f753c8928cd4972aaea',
+ tx_pos: 2,
+ value: 2148,
+ },
+ {
+ height: 727864,
+ tx_hash:
+ '759fd5de82d3b4744be54a4cd5428d63b349822268a37c9c53279a9d86d2020c',
+ tx_pos: 2,
+ value: 1595,
+ },
+ {
+ height: 727864,
+ tx_hash:
+ '965052b661e086f2d2d3d0647c86e57e28bf5e72d6e6ab3f63b0744b442b1ae9',
+ tx_pos: 1,
+ value: 1695,
+ },
+ {
+ height: 0,
+ tx_hash:
+ '980c780b6e4f094293bde43a40b7b545190bca7b137718cc00ca406e12fc98e4',
+ tx_pos: 1,
+ value: 1648,
+ },
+ {
+ height: 0,
+ tx_hash:
+ 'b8a098e8c6f28637bf02c2d26ffa1bf0e7d1a4d761a65ca17e15684816163f6d',
+ tx_pos: 1,
+ value: 69279620,
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+];
+export const incrementallyHydratedUtxosAfterProcessing = {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ txid: '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ tx_pos: 1,
+ value: 546,
+ txid: '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: false,
+ tokenQty: '9897999885.21030105',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ tx_pos: 1,
+ value: 546,
+ txid: '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: false,
+ tokenQty: '308.87654321',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ txid: 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1e-9',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 685181,
+ tx_hash:
+ '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ tx_pos: 1,
+ value: 546,
+ txid: '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '50d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e',
+ tokenTicker: 'TBC',
+ tokenName: 'tabcash',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 686546,
+ tx_hash:
+ 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ tx_pos: 1,
+ value: 546,
+ txid: 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 687240,
+ tx_hash:
+ 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ tx_pos: 2,
+ value: 546,
+ txid: 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0.99999999',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 688449,
+ tx_hash:
+ 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'e4e1a2fb071fa71ca727e08ed1d8ea52a9531c79d1e5f1ebf483c66b71a8621c',
+ tokenTicker: 'CPA',
+ tokenName: 'Cashtab Prod Alpha',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '80',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ tx_pos: 1,
+ value: 546,
+ txid: '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0.12',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ tx_pos: 1,
+ value: 546,
+ txid: '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0.12',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 693606,
+ tx_hash:
+ '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ tx_pos: 2,
+ value: 546,
+ txid: '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '45f0ff5cae7e89da6b96c26c8c48a959214c5f0e983e78d0925f8956ca8848c6',
+ tokenTicker: 'CMA',
+ tokenName: 'CashtabMintAlpha',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 5,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 699216,
+ tx_hash:
+ '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ tx_pos: 2,
+ value: 546,
+ txid: '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '0916e71779c9de7ee125741d3f5ab01f556356dbc86fd327a24f1e9e22ebc917',
+ tokenTicker: 'CTL2',
+ tokenName: 'Cashtab Token Launch Launch Token v2',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1899',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700185,
+ tx_hash:
+ '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ tx_pos: 2,
+ value: 546,
+ txid: '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '22f4ba40312ea3e90e1bfa88d2aa694c271d2e07361907b6eb5568873ffa62bf',
+ tokenTicker: 'CLA',
+ tokenName: 'Cashtab Local Alpha',
+ tokenDocumentUrl: 'boomertakes.com',
+ tokenDocumentHash: '',
+ decimals: 5,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ tx_pos: 2,
+ value: 546,
+ txid: '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '77ec4036ef8546ac46df6d3a5374e961216f92624627eaeef5d2e1a253df9fc6',
+ tokenTicker: 'CTLv3',
+ tokenName: 'Cashtab Token Launch Launch Token v3',
+ tokenDocumentUrl: 'coinex.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '267',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tx_pos: 1,
+ value: 546,
+ txid: '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '1000000000',
+ tokenId:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tokenTicker: 'CBB',
+ tokenName: 'Cashtab Beta Bits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ tx_pos: 2,
+ value: 546,
+ txid: 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999898',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700572,
+ tx_hash:
+ '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ tx_pos: 2,
+ value: 546,
+ txid: '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '990',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700677,
+ tx_hash:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '333',
+ tokenId:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tokenTicker: 'SA',
+ tokenName: 'Spinner Alpha',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 700915,
+ tx_hash:
+ 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ tx_pos: 2,
+ value: 546,
+ txid: 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999975',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ tx_pos: 1,
+ value: 546,
+ txid: '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '3',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ tx_pos: 1,
+ value: 546,
+ txid: '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ tx_pos: 1,
+ value: 546,
+ txid: 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ tx_pos: 1,
+ value: 546,
+ txid: '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ tx_pos: 1,
+ value: 546,
+ txid: '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701191,
+ tx_hash:
+ 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701194,
+ tx_hash:
+ 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701208,
+ tx_hash:
+ '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ tx_pos: 1,
+ value: 546,
+ txid: '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ tx_pos: 1,
+ value: 546,
+ txid: '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0.789698951',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ tx_pos: 1,
+ value: 546,
+ txid: '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701221,
+ tx_hash:
+ '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ tx_pos: 1,
+ value: 546,
+ txid: '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701223,
+ tx_hash:
+ '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ tx_pos: 2,
+ value: 546,
+ txid: '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '9e9738e9ac3ff202736bf7775f875ebae6f812650df577a947c20c52475e43da',
+ tokenTicker: 'CUTT',
+ tokenName: 'Cashtab Unit Test Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '90',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709251,
+ tx_hash:
+ '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ tx_pos: 1,
+ value: 546,
+ txid: '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'f36e1b3d9a2aaf74f132fef3834e9743b945a667a4204e761b85f2e7b65fd41a',
+ tokenTicker: 'POW',
+ tokenName: 'ProofofWriting.com Token',
+ tokenDocumentUrl: 'https://www.proofofwriting.com/26',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709259,
+ tx_hash:
+ '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ tx_pos: 1,
+ value: 546,
+ txid: '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709668,
+ tx_hash:
+ 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 710065,
+ tx_hash:
+ '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ tx_pos: 1,
+ value: 546,
+ txid: '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '9e9738e9ac3ff202736bf7775f875ebae6f812650df577a947c20c52475e43da',
+ tokenTicker: 'CUTT',
+ tokenName: 'Cashtab Unit Test Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 711227,
+ tx_hash:
+ 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '98183238638ecb4ddc365056e22de0e8a05448c1e6084bae247fae5a74ad4f48',
+ tokenTicker: 'DVV',
+ tokenName: 'Delta Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '17',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 715111,
+ tx_hash:
+ 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ tx_pos: 1,
+ value: 546,
+ txid: 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '6969',
+ tokenId:
+ 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ tokenTicker: 'SCΩΩG',
+ tokenName: 'Scoogi Omega',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ tx_pos: 1,
+ value: 546,
+ txid: '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '100',
+ tokenId:
+ '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ tokenTicker: '001',
+ tokenName: '01',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ tx_pos: 1,
+ value: 546,
+ txid: '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '102',
+ tokenId:
+ '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ tokenTicker: '002',
+ tokenName: '2',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715816,
+ tx_hash:
+ '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ tx_pos: 1,
+ value: 546,
+ txid: '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '102',
+ tokenId:
+ '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ tokenTicker: '002',
+ tokenName: '2',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717055,
+ tx_hash:
+ '18c0360f0db5399223cbed48f55c4cee9d9914c8a4a7dedcf9172a36201e9896',
+ tx_pos: 1,
+ value: 546,
+ txid: '18c0360f0db5399223cbed48f55c4cee9d9914c8a4a7dedcf9172a36201e9896',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'e859eeb52e7afca6217fb36784b3b6d3c7386a52f391dd0d00f2ec03a5e8e77b',
+ tokenTicker: 'test',
+ tokenName: 'test',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 1,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717653,
+ tx_hash:
+ '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ tx_pos: 1,
+ value: 546,
+ txid: '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '1000000000',
+ tokenId:
+ '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ tokenTicker: 'OMI',
+ tokenName: 'Omicron',
+ tokenDocumentUrl: 'cdc.gov',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717824,
+ tx_hash:
+ 'c0fe05d7bf71cd0f476ea18cdd4ecb26e1b9a33c911f4aaf143b2b18bc3b5f4f',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c0fe05d7bf71cd0f476ea18cdd4ecb26e1b9a33c911f4aaf143b2b18bc3b5f4f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bdb3b4215ca0622e0c4c07655522c376eaa891838a82f0217fa453bb0595a37c',
+ tokenTicker: 'Service',
+ tokenName: 'Evc token',
+ tokenDocumentUrl: 'https://cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '10000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718091,
+ tx_hash:
+ '905cc5662cad77df56c3770863634ce498dde9d4772dc494d33b7ce3f36fa66c',
+ tx_pos: 2,
+ value: 546,
+ txid: '905cc5662cad77df56c3770863634ce498dde9d4772dc494d33b7ce3f36fa66c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '523512076',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718280,
+ tx_hash:
+ 'f31f4ad7bf035cfb587a07a12ec60937cb8cbeafa7e4d7ed4f3276fea26fcfec',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f31f4ad7bf035cfb587a07a12ec60937cb8cbeafa7e4d7ed4f3276fea26fcfec',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bdb3b4215ca0622e0c4c07655522c376eaa891838a82f0217fa453bb0595a37c',
+ tokenTicker: 'Service',
+ tokenName: 'Evc token',
+ tokenDocumentUrl: 'https://cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '10000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718790,
+ tx_hash:
+ '67faa4753da2940d053f32edcda2c052a16c683aeb73f10cfde5c18266c14fe2',
+ tx_pos: 2,
+ value: 546,
+ txid: '67faa4753da2940d053f32edcda2c052a16c683aeb73f10cfde5c18266c14fe2',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7bbf452698a24b138b0357f689587fc6ea58410c34503b1179b91e40e10bba8b',
+ tokenTicker: 'COVID',
+ tokenName: 'COVID-19',
+ tokenDocumentUrl: 'https://en.wikipedia.org/wiki/COVID-19',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9999999900',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720056,
+ tx_hash:
+ '9c6363fb537d529f512a12d292ea9682fe7159e6bf5ebfec5b7067b401d2dba4',
+ tx_pos: 1,
+ value: 546,
+ txid: '9c6363fb537d529f512a12d292ea9682fe7159e6bf5ebfec5b7067b401d2dba4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '100',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '4eed87ba70864d9daa46d201c47db4513f77e5d4cc01256ab4dcc6dae9dfa055',
+ tx_pos: 1,
+ value: 546,
+ txid: '4eed87ba70864d9daa46d201c47db4513f77e5d4cc01256ab4dcc6dae9dfa055',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '7975514a3185cbb70900e9767e5fcc91c86913cb1d2ad9a28474253875271e33',
+ tx_pos: 1,
+ value: 546,
+ txid: '7975514a3185cbb70900e9767e5fcc91c86913cb1d2ad9a28474253875271e33',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '3',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'e10ae7a1bc78561ed367d59f150aebc13ef2054ba62f1a0db08fc7612d5ed58b',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e10ae7a1bc78561ed367d59f150aebc13ef2054ba62f1a0db08fc7612d5ed58b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'fb71c88bd5369cb8278f49ac672a9721833c36fc69143848b46ae15860339ea6',
+ tx_pos: 1,
+ value: 546,
+ txid: 'fb71c88bd5369cb8278f49ac672a9721833c36fc69143848b46ae15860339ea6',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '4',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720078,
+ tx_hash:
+ 'c3c6c6fb1619d001c29f17a701d042bc6b983e71113822aeeb66ca434fd9fa6c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c3c6c6fb1619d001c29f17a701d042bc6b983e71113822aeeb66ca434fd9fa6c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720951,
+ tx_hash:
+ 'fb50eac73a4fd5e2a701e0dbf4e575cea9c083e061b1db722e057164c7317e5b',
+ tx_pos: 2,
+ value: 546,
+ txid: 'fb50eac73a4fd5e2a701e0dbf4e575cea9c083e061b1db722e057164c7317e5b',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '666c4318d1f7fef5f2c698262492c519018d4e9130f95d05f6be9f0fb7149e96',
+ tokenTicker: 'CPG',
+ tokenName: 'Cashtab Prod Gamma',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '99',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 721083,
+ tx_hash:
+ 'dfb3dbf90fd87f6d66465ff05a61ddf1e1ca30900fadfe9cd4b73468649935ed',
+ tx_pos: 2,
+ value: 546,
+ txid: 'dfb3dbf90fd87f6d66465ff05a61ddf1e1ca30900fadfe9cd4b73468649935ed',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '157e0cdef5d5c51bdea00eac9ab821d809bb9d03cf98da85833614bedb129be6',
+ tokenTicker: 'CLNSP',
+ tokenName: 'ComponentLongNameSpeedLoad',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '82',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 724822,
+ tx_hash:
+ 'ed0dab39d5e976e433a705785726901dc83daa7d579412c18ee997341de010d3',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ed0dab39d5e976e433a705785726901dc83daa7d579412c18ee997341de010d3',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1185eebdde038a25050a3dbb66e2d5332305d1d4a4febab31f6e31bc49baac61',
+ tokenTicker: 'BETA',
+ tokenName: 'BETA',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 725143,
+ tx_hash:
+ 'e99296764134d6ea9ba7521490563762cfaf1541854ba9babc26c0df8665ac32',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e99296764134d6ea9ba7521490563762cfaf1541854ba9babc26c0df8665ac32',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'cfdc270ab82c001eaddd357f773a8dfe61cfdd891df66b39fee060f34f7a4015',
+ tokenTicker: 'SCOOG',
+ tokenName: 'Scoogi Alpha',
+ tokenDocumentUrl: 'cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 725871,
+ tx_hash:
+ '82a3fe0b03ab07a564351443634da1b1ed3960e4771c59b6f8abbf7ef4b3258d',
+ tx_pos: 1,
+ value: 546,
+ txid: '82a3fe0b03ab07a564351443634da1b1ed3960e4771c59b6f8abbf7ef4b3258d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'acba1d7f354c6d4d001eb99d31de174e5cea8a31d692afd6e7eb8474ad541f55',
+ tokenTicker: 'CTB',
+ tokenName: 'CashTabBits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '5.5e-8',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 725882,
+ tx_hash:
+ '1db1bef70013d178d7912731435029f9c8588f1d0089944c53eccffd255b5efc',
+ tx_pos: 2,
+ value: 546,
+ txid: '1db1bef70013d178d7912731435029f9c8588f1d0089944c53eccffd255b5efc',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'ccf5fe5a387559c8ab9efdeb0c0ef1b444e677298cfddf07671245ce3cb3c79f',
+ tokenTicker: 'XGB',
+ tokenName: 'Garmonbozia',
+ tokenDocumentUrl:
+ 'https://twinpeaks.fandom.com/wiki/Garmonbozia',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '478',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726001,
+ tx_hash:
+ '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ tx_pos: 2,
+ value: 546,
+ txid: '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '996000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726009,
+ tx_hash:
+ '52d2fd9d10debecbed6f8c3554517dada688c83197c4e57ad74556f0317c84b4',
+ tx_pos: 1,
+ value: 546,
+ txid: '52d2fd9d10debecbed6f8c3554517dada688c83197c4e57ad74556f0317c84b4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '69',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726019,
+ tx_hash:
+ 'b8982cf5531afcba125a9e17550d42a01045c3aa5ee70a485f8fbcde3dae191d',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b8982cf5531afcba125a9e17550d42a01045c3aa5ee70a485f8fbcde3dae191d',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '98183238638ecb4ddc365056e22de0e8a05448c1e6084bae247fae5a74ad4f48',
+ tokenTicker: 'DVV',
+ tokenName: 'Delta Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999989983',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726053,
+ tx_hash:
+ '0283492a729cfb7999684e733f2ee76bc4f652b9047ff47dbe3534b8f5960697',
+ tx_pos: 2,
+ value: 546,
+ txid: '0283492a729cfb7999684e733f2ee76bc4f652b9047ff47dbe3534b8f5960697',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'b8f2a9e767a0be7b80c7e414ef2534586d4da72efddb39a4e70e501ab73375cc',
+ tokenTicker: 'CTD',
+ tokenName: 'Cashtab Dark',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726167,
+ tx_hash:
+ '2487ed30179cca902291424f273df1b37b2b9245eb97007ec3c75ca20ebaae1f',
+ tx_pos: 1,
+ value: 546,
+ txid: '2487ed30179cca902291424f273df1b37b2b9245eb97007ec3c75ca20ebaae1f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6a9305a13135625f4b533256e8d2e21a7343005331e1839348a39040f61e09d3',
+ tokenTicker: 'SCOOG',
+ tokenName: 'Scoogi Alpha',
+ tokenDocumentUrl: 'cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '69',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726277,
+ tx_hash:
+ '8b8fbe88ba8086ccf7176ef1a07f753aa49b9e4c766b58bde556758ec707e3eb',
+ tx_pos: 2,
+ value: 546,
+ txid: '8b8fbe88ba8086ccf7176ef1a07f753aa49b9e4c766b58bde556758ec707e3eb',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999888',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726809,
+ tx_hash:
+ '123a31b903c9a7de544a443a02f73e0cbee6304931704e55d0583a8aca8df48e',
+ tx_pos: 2,
+ value: 546,
+ txid: '123a31b903c9a7de544a443a02f73e0cbee6304931704e55d0583a8aca8df48e',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '3de671a7107d3803d78f7f4a4e5c794d0903a8d28d16076445c084943c1e2db8',
+ tokenTicker: 'CLB',
+ tokenName: 'Cashtab Local Beta',
+ tokenDocumentUrl: 'boomertakes.com',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '22',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ '0bd0c49135b94b99989ec3b0396020a96fcbe2925bb25c40120dc047c0a097ec',
+ tx_pos: 1,
+ value: 546,
+ txid: '0bd0c49135b94b99989ec3b0396020a96fcbe2925bb25c40120dc047c0a097ec',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '44929ff3b1fc634f982fede112cf12b21199a2ebbcf718412a38de9177d77168',
+ tokenTicker: 'coin',
+ tokenName: 'johncoin',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ '5b2509c3235726f6d048af1336533d9db178a253cb2427a661ea676996cea141',
+ tx_pos: 2,
+ value: 546,
+ txid: '5b2509c3235726f6d048af1336533d9db178a253cb2427a661ea676996cea141',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '639a8dba34788ff3ebd3977d4ac045825394285ee648bb1d159e1c12b787ff25',
+ tokenTicker: 'CFL',
+ tokenName: 'Cashtab Facelift',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9955',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ tx_pos: 1,
+ value: 546,
+ txid: 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '100',
+ tokenId:
+ 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ tokenTicker: 'CFL',
+ tokenName: 'Cashtab Facelift',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727176,
+ tx_hash:
+ '8f645ce7b231a3ea81168229c1b6a1157e8a58fb8a8a127a80efc2ed39c4f72e',
+ tx_pos: 1,
+ value: 546,
+ txid: '8f645ce7b231a3ea81168229c1b6a1157e8a58fb8a8a127a80efc2ed39c4f72e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'b40d1f6acdb6ee68d7eca0167fe2753c076bc309b2e3b1af8bff70ca34b945b0',
+ tokenTicker: 'KAT',
+ tokenName: 'KA_Test',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '5000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 727832,
+ tx_hash:
+ '08947b3ef5919dafeb3ffbf3c6e8b46398fd13c51fe337326483c2382f1e501f',
+ tx_pos: 1,
+ value: 24868533,
+ txid: '08947b3ef5919dafeb3ffbf3c6e8b46398fd13c51fe337326483c2382f1e501f',
+ vout: 1,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727857,
+ tx_hash:
+ '2d2a173f93638fca8c087b8324aab222642231deb249a4a0d764dbbae19fd385',
+ tx_pos: 1,
+ value: 5045,
+ txid: '2d2a173f93638fca8c087b8324aab222642231deb249a4a0d764dbbae19fd385',
+ vout: 1,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727857,
+ tx_hash:
+ 'ebba5f05db1ca0be3f8b97410374b64c8e80ae6631bc8fc5a52c3804220dfbb2',
+ tx_pos: 2,
+ value: 1753,
+ txid: 'ebba5f05db1ca0be3f8b97410374b64c8e80ae6631bc8fc5a52c3804220dfbb2',
+ vout: 2,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727864,
+ tx_hash:
+ '04e13833b7de3656ba436be8b3f2286399a03053451b3f753c8928cd4972aaea',
+ tx_pos: 2,
+ value: 2148,
+ txid: '04e13833b7de3656ba436be8b3f2286399a03053451b3f753c8928cd4972aaea',
+ vout: 2,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727864,
+ tx_hash:
+ '759fd5de82d3b4744be54a4cd5428d63b349822268a37c9c53279a9d86d2020c',
+ tx_pos: 2,
+ value: 1595,
+ txid: '759fd5de82d3b4744be54a4cd5428d63b349822268a37c9c53279a9d86d2020c',
+ vout: 2,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727864,
+ tx_hash:
+ '965052b661e086f2d2d3d0647c86e57e28bf5e72d6e6ab3f63b0744b442b1ae9',
+ tx_pos: 1,
+ value: 1695,
+ txid: '965052b661e086f2d2d3d0647c86e57e28bf5e72d6e6ab3f63b0744b442b1ae9',
+ vout: 1,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 0,
+ tx_hash:
+ '980c780b6e4f094293bde43a40b7b545190bca7b137718cc00ca406e12fc98e4',
+ tx_pos: 1,
+ value: 1648,
+ txid: '980c780b6e4f094293bde43a40b7b545190bca7b137718cc00ca406e12fc98e4',
+ vout: 1,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 0,
+ tx_hash:
+ 'b8a098e8c6f28637bf02c2d26ffa1bf0e7d1a4d761a65ca17e15684816163f6d',
+ tx_pos: 1,
+ value: 69279620,
+ txid: 'b8a098e8c6f28637bf02c2d26ffa1bf0e7d1a4d761a65ca17e15684816163f6d',
+ vout: 1,
+ isValid: false,
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+};
+
+export const incrementallyHydratedUtxosAfterProcessingOneMissing = {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 680784,
+ tx_hash:
+ '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ tx_pos: 1,
+ value: 546,
+ txid: '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: false,
+ tokenQty: '9897999885.21030105',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ tx_pos: 1,
+ value: 546,
+ txid: '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: false,
+ tokenQty: '308.87654321',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ txid: 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1e-9',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 685181,
+ tx_hash:
+ '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ tx_pos: 1,
+ value: 546,
+ txid: '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '50d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e',
+ tokenTicker: 'TBC',
+ tokenName: 'tabcash',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 686546,
+ tx_hash:
+ 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ tx_pos: 1,
+ value: 546,
+ txid: 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 687240,
+ tx_hash:
+ 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ tx_pos: 2,
+ value: 546,
+ txid: 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0.99999999',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 688449,
+ tx_hash:
+ 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'e4e1a2fb071fa71ca727e08ed1d8ea52a9531c79d1e5f1ebf483c66b71a8621c',
+ tokenTicker: 'CPA',
+ tokenName: 'Cashtab Prod Alpha',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '80',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ tx_pos: 1,
+ value: 546,
+ txid: '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0.12',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ tx_pos: 1,
+ value: 546,
+ txid: '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0.12',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 693606,
+ tx_hash:
+ '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ tx_pos: 2,
+ value: 546,
+ txid: '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '45f0ff5cae7e89da6b96c26c8c48a959214c5f0e983e78d0925f8956ca8848c6',
+ tokenTicker: 'CMA',
+ tokenName: 'CashtabMintAlpha',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 5,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 699216,
+ tx_hash:
+ '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ tx_pos: 2,
+ value: 546,
+ txid: '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '0916e71779c9de7ee125741d3f5ab01f556356dbc86fd327a24f1e9e22ebc917',
+ tokenTicker: 'CTL2',
+ tokenName: 'Cashtab Token Launch Launch Token v2',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1899',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700185,
+ tx_hash:
+ '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ tx_pos: 2,
+ value: 546,
+ txid: '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '22f4ba40312ea3e90e1bfa88d2aa694c271d2e07361907b6eb5568873ffa62bf',
+ tokenTicker: 'CLA',
+ tokenName: 'Cashtab Local Alpha',
+ tokenDocumentUrl: 'boomertakes.com',
+ tokenDocumentHash: '',
+ decimals: 5,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ tx_pos: 2,
+ value: 546,
+ txid: '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '77ec4036ef8546ac46df6d3a5374e961216f92624627eaeef5d2e1a253df9fc6',
+ tokenTicker: 'CTLv3',
+ tokenName: 'Cashtab Token Launch Launch Token v3',
+ tokenDocumentUrl: 'coinex.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '267',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tx_pos: 1,
+ value: 546,
+ txid: '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '1000000000',
+ tokenId:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tokenTicker: 'CBB',
+ tokenName: 'Cashtab Beta Bits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ tx_pos: 2,
+ value: 546,
+ txid: 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999898',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700572,
+ tx_hash:
+ '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ tx_pos: 2,
+ value: 546,
+ txid: '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '990',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700677,
+ tx_hash:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '333',
+ tokenId:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tokenTicker: 'SA',
+ tokenName: 'Spinner Alpha',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 700915,
+ tx_hash:
+ 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ tx_pos: 2,
+ value: 546,
+ txid: 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999975',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ tx_pos: 1,
+ value: 546,
+ txid: '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '3',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ tx_pos: 1,
+ value: 546,
+ txid: '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ tx_pos: 1,
+ value: 546,
+ txid: 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ tx_pos: 1,
+ value: 546,
+ txid: '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ tx_pos: 1,
+ value: 546,
+ txid: '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701191,
+ tx_hash:
+ 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701194,
+ tx_hash:
+ 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701208,
+ tx_hash:
+ '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ tx_pos: 1,
+ value: 546,
+ txid: '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ tx_pos: 1,
+ value: 546,
+ txid: '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0.789698951',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ tx_pos: 1,
+ value: 546,
+ txid: '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701221,
+ tx_hash:
+ '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ tx_pos: 1,
+ value: 546,
+ txid: '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701223,
+ tx_hash:
+ '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ tx_pos: 2,
+ value: 546,
+ txid: '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '9e9738e9ac3ff202736bf7775f875ebae6f812650df577a947c20c52475e43da',
+ tokenTicker: 'CUTT',
+ tokenName: 'Cashtab Unit Test Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '90',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709251,
+ tx_hash:
+ '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ tx_pos: 1,
+ value: 546,
+ txid: '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'f36e1b3d9a2aaf74f132fef3834e9743b945a667a4204e761b85f2e7b65fd41a',
+ tokenTicker: 'POW',
+ tokenName: 'ProofofWriting.com Token',
+ tokenDocumentUrl: 'https://www.proofofwriting.com/26',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709259,
+ tx_hash:
+ '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ tx_pos: 1,
+ value: 546,
+ txid: '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709668,
+ tx_hash:
+ 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 710065,
+ tx_hash:
+ '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ tx_pos: 1,
+ value: 546,
+ txid: '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '9e9738e9ac3ff202736bf7775f875ebae6f812650df577a947c20c52475e43da',
+ tokenTicker: 'CUTT',
+ tokenName: 'Cashtab Unit Test Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 711227,
+ tx_hash:
+ 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '98183238638ecb4ddc365056e22de0e8a05448c1e6084bae247fae5a74ad4f48',
+ tokenTicker: 'DVV',
+ tokenName: 'Delta Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '17',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 715111,
+ tx_hash:
+ 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ tx_pos: 1,
+ value: 546,
+ txid: 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '6969',
+ tokenId:
+ 'b39fdb53e21d67fa5fd3a11122f1452f15884047f2b80e8efe633c3b520b7a39',
+ tokenTicker: 'SCΩΩG',
+ tokenName: 'Scoogi Omega',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ tx_pos: 1,
+ value: 546,
+ txid: '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '100',
+ tokenId:
+ '3515f4a9851ad44124e0ddf6149344deb27a97720fc7e5254a9d2c86da7415a9',
+ tokenTicker: '001',
+ tokenName: '01',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715815,
+ tx_hash:
+ '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ tx_pos: 1,
+ value: 546,
+ txid: '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '102',
+ tokenId:
+ '6fb6122742cac8fd1df2d68997fdfa4c077bc22d9ef4a336bfb63d24225f9060',
+ tokenTicker: '002',
+ tokenName: '2',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 715816,
+ tx_hash:
+ '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ tx_pos: 1,
+ value: 546,
+ txid: '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '102',
+ tokenId:
+ '2936188a41f22a3e0a47d13296147fb3f9ddd2f939fe6382904d21a610e8e49c',
+ tokenTicker: '002',
+ tokenName: '2',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717055,
+ tx_hash:
+ '18c0360f0db5399223cbed48f55c4cee9d9914c8a4a7dedcf9172a36201e9896',
+ tx_pos: 1,
+ value: 546,
+ txid: '18c0360f0db5399223cbed48f55c4cee9d9914c8a4a7dedcf9172a36201e9896',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'e859eeb52e7afca6217fb36784b3b6d3c7386a52f391dd0d00f2ec03a5e8e77b',
+ tokenTicker: 'test',
+ tokenName: 'test',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 1,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717653,
+ tx_hash:
+ '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ tx_pos: 1,
+ value: 546,
+ txid: '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '1000000000',
+ tokenId:
+ '3adbf501e21c711d20118e003711168eb39f560c01f4c6d6736fa3f3fceaa577',
+ tokenTicker: 'OMI',
+ tokenName: 'Omicron',
+ tokenDocumentUrl: 'cdc.gov',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 717824,
+ tx_hash:
+ 'c0fe05d7bf71cd0f476ea18cdd4ecb26e1b9a33c911f4aaf143b2b18bc3b5f4f',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c0fe05d7bf71cd0f476ea18cdd4ecb26e1b9a33c911f4aaf143b2b18bc3b5f4f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bdb3b4215ca0622e0c4c07655522c376eaa891838a82f0217fa453bb0595a37c',
+ tokenTicker: 'Service',
+ tokenName: 'Evc token',
+ tokenDocumentUrl: 'https://cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '10000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718091,
+ tx_hash:
+ '905cc5662cad77df56c3770863634ce498dde9d4772dc494d33b7ce3f36fa66c',
+ tx_pos: 2,
+ value: 546,
+ txid: '905cc5662cad77df56c3770863634ce498dde9d4772dc494d33b7ce3f36fa66c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '523512076',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718280,
+ tx_hash:
+ 'f31f4ad7bf035cfb587a07a12ec60937cb8cbeafa7e4d7ed4f3276fea26fcfec',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f31f4ad7bf035cfb587a07a12ec60937cb8cbeafa7e4d7ed4f3276fea26fcfec',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bdb3b4215ca0622e0c4c07655522c376eaa891838a82f0217fa453bb0595a37c',
+ tokenTicker: 'Service',
+ tokenName: 'Evc token',
+ tokenDocumentUrl: 'https://cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '10000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 718790,
+ tx_hash:
+ '67faa4753da2940d053f32edcda2c052a16c683aeb73f10cfde5c18266c14fe2',
+ tx_pos: 2,
+ value: 546,
+ txid: '67faa4753da2940d053f32edcda2c052a16c683aeb73f10cfde5c18266c14fe2',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7bbf452698a24b138b0357f689587fc6ea58410c34503b1179b91e40e10bba8b',
+ tokenTicker: 'COVID',
+ tokenName: 'COVID-19',
+ tokenDocumentUrl: 'https://en.wikipedia.org/wiki/COVID-19',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9999999900',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720056,
+ tx_hash:
+ '9c6363fb537d529f512a12d292ea9682fe7159e6bf5ebfec5b7067b401d2dba4',
+ tx_pos: 1,
+ value: 546,
+ txid: '9c6363fb537d529f512a12d292ea9682fe7159e6bf5ebfec5b7067b401d2dba4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '100',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '4eed87ba70864d9daa46d201c47db4513f77e5d4cc01256ab4dcc6dae9dfa055',
+ tx_pos: 1,
+ value: 546,
+ txid: '4eed87ba70864d9daa46d201c47db4513f77e5d4cc01256ab4dcc6dae9dfa055',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ '7975514a3185cbb70900e9767e5fcc91c86913cb1d2ad9a28474253875271e33',
+ tx_pos: 1,
+ value: 546,
+ txid: '7975514a3185cbb70900e9767e5fcc91c86913cb1d2ad9a28474253875271e33',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '3',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'e10ae7a1bc78561ed367d59f150aebc13ef2054ba62f1a0db08fc7612d5ed58b',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e10ae7a1bc78561ed367d59f150aebc13ef2054ba62f1a0db08fc7612d5ed58b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '1',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720070,
+ tx_hash:
+ 'fb71c88bd5369cb8278f49ac672a9721833c36fc69143848b46ae15860339ea6',
+ tx_pos: 1,
+ value: 546,
+ txid: 'fb71c88bd5369cb8278f49ac672a9721833c36fc69143848b46ae15860339ea6',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '4',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720078,
+ tx_hash:
+ 'c3c6c6fb1619d001c29f17a701d042bc6b983e71113822aeeb66ca434fd9fa6c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c3c6c6fb1619d001c29f17a701d042bc6b983e71113822aeeb66ca434fd9fa6c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6376cae692cf0302ecdd63234c14cbb2b21cec75ab538335f90254cfb3ed44cc',
+ tokenTicker: 'CLT',
+ tokenName: 'Cashtab Local Tests',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '55',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 720951,
+ tx_hash:
+ 'fb50eac73a4fd5e2a701e0dbf4e575cea9c083e061b1db722e057164c7317e5b',
+ tx_pos: 2,
+ value: 546,
+ txid: 'fb50eac73a4fd5e2a701e0dbf4e575cea9c083e061b1db722e057164c7317e5b',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '666c4318d1f7fef5f2c698262492c519018d4e9130f95d05f6be9f0fb7149e96',
+ tokenTicker: 'CPG',
+ tokenName: 'Cashtab Prod Gamma',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '99',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 721083,
+ tx_hash:
+ 'dfb3dbf90fd87f6d66465ff05a61ddf1e1ca30900fadfe9cd4b73468649935ed',
+ tx_pos: 2,
+ value: 546,
+ txid: 'dfb3dbf90fd87f6d66465ff05a61ddf1e1ca30900fadfe9cd4b73468649935ed',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '157e0cdef5d5c51bdea00eac9ab821d809bb9d03cf98da85833614bedb129be6',
+ tokenTicker: 'CLNSP',
+ tokenName: 'ComponentLongNameSpeedLoad',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '82',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 724822,
+ tx_hash:
+ 'ed0dab39d5e976e433a705785726901dc83daa7d579412c18ee997341de010d3',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ed0dab39d5e976e433a705785726901dc83daa7d579412c18ee997341de010d3',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1185eebdde038a25050a3dbb66e2d5332305d1d4a4febab31f6e31bc49baac61',
+ tokenTicker: 'BETA',
+ tokenName: 'BETA',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 725143,
+ tx_hash:
+ 'e99296764134d6ea9ba7521490563762cfaf1541854ba9babc26c0df8665ac32',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e99296764134d6ea9ba7521490563762cfaf1541854ba9babc26c0df8665ac32',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'cfdc270ab82c001eaddd357f773a8dfe61cfdd891df66b39fee060f34f7a4015',
+ tokenTicker: 'SCOOG',
+ tokenName: 'Scoogi Alpha',
+ tokenDocumentUrl: 'cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '0',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 725871,
+ tx_hash:
+ '82a3fe0b03ab07a564351443634da1b1ed3960e4771c59b6f8abbf7ef4b3258d',
+ tx_pos: 1,
+ value: 546,
+ txid: '82a3fe0b03ab07a564351443634da1b1ed3960e4771c59b6f8abbf7ef4b3258d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'acba1d7f354c6d4d001eb99d31de174e5cea8a31d692afd6e7eb8474ad541f55',
+ tokenTicker: 'CTB',
+ tokenName: 'CashTabBits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '5.5e-8',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 725882,
+ tx_hash:
+ '1db1bef70013d178d7912731435029f9c8588f1d0089944c53eccffd255b5efc',
+ tx_pos: 2,
+ value: 546,
+ txid: '1db1bef70013d178d7912731435029f9c8588f1d0089944c53eccffd255b5efc',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'ccf5fe5a387559c8ab9efdeb0c0ef1b444e677298cfddf07671245ce3cb3c79f',
+ tokenTicker: 'XGB',
+ tokenName: 'Garmonbozia',
+ tokenDocumentUrl:
+ 'https://twinpeaks.fandom.com/wiki/Garmonbozia',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '478',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726001,
+ tx_hash:
+ '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ tx_pos: 2,
+ value: 546,
+ txid: '3c89d42ff868c74546ba819aaf4e5c5d5e5c63437d91c9c1cf5406ccbec3d952',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '996000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726009,
+ tx_hash:
+ '52d2fd9d10debecbed6f8c3554517dada688c83197c4e57ad74556f0317c84b4',
+ tx_pos: 1,
+ value: 546,
+ txid: '52d2fd9d10debecbed6f8c3554517dada688c83197c4e57ad74556f0317c84b4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '69',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726019,
+ tx_hash:
+ 'b8982cf5531afcba125a9e17550d42a01045c3aa5ee70a485f8fbcde3dae191d',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b8982cf5531afcba125a9e17550d42a01045c3aa5ee70a485f8fbcde3dae191d',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '98183238638ecb4ddc365056e22de0e8a05448c1e6084bae247fae5a74ad4f48',
+ tokenTicker: 'DVV',
+ tokenName: 'Delta Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999989983',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726053,
+ tx_hash:
+ '0283492a729cfb7999684e733f2ee76bc4f652b9047ff47dbe3534b8f5960697',
+ tx_pos: 2,
+ value: 546,
+ txid: '0283492a729cfb7999684e733f2ee76bc4f652b9047ff47dbe3534b8f5960697',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'b8f2a9e767a0be7b80c7e414ef2534586d4da72efddb39a4e70e501ab73375cc',
+ tokenTicker: 'CTD',
+ tokenName: 'Cashtab Dark',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726167,
+ tx_hash:
+ '2487ed30179cca902291424f273df1b37b2b9245eb97007ec3c75ca20ebaae1f',
+ tx_pos: 1,
+ value: 546,
+ txid: '2487ed30179cca902291424f273df1b37b2b9245eb97007ec3c75ca20ebaae1f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '6a9305a13135625f4b533256e8d2e21a7343005331e1839348a39040f61e09d3',
+ tokenTicker: 'SCOOG',
+ tokenName: 'Scoogi Alpha',
+ tokenDocumentUrl: 'cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '69',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726277,
+ tx_hash:
+ '8b8fbe88ba8086ccf7176ef1a07f753aa49b9e4c766b58bde556758ec707e3eb',
+ tx_pos: 2,
+ value: 546,
+ txid: '8b8fbe88ba8086ccf7176ef1a07f753aa49b9e4c766b58bde556758ec707e3eb',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '999888',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726809,
+ tx_hash:
+ '123a31b903c9a7de544a443a02f73e0cbee6304931704e55d0583a8aca8df48e',
+ tx_pos: 2,
+ value: 546,
+ txid: '123a31b903c9a7de544a443a02f73e0cbee6304931704e55d0583a8aca8df48e',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '3de671a7107d3803d78f7f4a4e5c794d0903a8d28d16076445c084943c1e2db8',
+ tokenTicker: 'CLB',
+ tokenName: 'Cashtab Local Beta',
+ tokenDocumentUrl: 'boomertakes.com',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '22',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ '0bd0c49135b94b99989ec3b0396020a96fcbe2925bb25c40120dc047c0a097ec',
+ tx_pos: 1,
+ value: 546,
+ txid: '0bd0c49135b94b99989ec3b0396020a96fcbe2925bb25c40120dc047c0a097ec',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '44929ff3b1fc634f982fede112cf12b21199a2ebbcf718412a38de9177d77168',
+ tokenTicker: 'coin',
+ tokenName: 'johncoin',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '2',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ '5b2509c3235726f6d048af1336533d9db178a253cb2427a661ea676996cea141',
+ tx_pos: 2,
+ value: 546,
+ txid: '5b2509c3235726f6d048af1336533d9db178a253cb2427a661ea676996cea141',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '639a8dba34788ff3ebd3977d4ac045825394285ee648bb1d159e1c12b787ff25',
+ tokenTicker: 'CFL',
+ tokenName: 'Cashtab Facelift',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '9955',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 726826,
+ tx_hash:
+ 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ tx_pos: 1,
+ value: 546,
+ txid: 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '100',
+ tokenId:
+ 'd376ebcd518067c8e10c0505865cf7336160b47807e6f1a95739ba90ae838840',
+ tokenTicker: 'CFL',
+ tokenName: 'Cashtab Facelift',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727176,
+ tx_hash:
+ '8f645ce7b231a3ea81168229c1b6a1157e8a58fb8a8a127a80efc2ed39c4f72e',
+ tx_pos: 1,
+ value: 546,
+ txid: '8f645ce7b231a3ea81168229c1b6a1157e8a58fb8a8a127a80efc2ed39c4f72e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'b40d1f6acdb6ee68d7eca0167fe2753c076bc309b2e3b1af8bff70ca34b945b0',
+ tokenTicker: 'KAT',
+ tokenName: 'KA_Test',
+ tokenDocumentUrl: 'https://cashtab.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ tokenQty: '5000',
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 727832,
+ tx_hash:
+ '08947b3ef5919dafeb3ffbf3c6e8b46398fd13c51fe337326483c2382f1e501f',
+ tx_pos: 1,
+ value: 24868533,
+ txid: '08947b3ef5919dafeb3ffbf3c6e8b46398fd13c51fe337326483c2382f1e501f',
+ vout: 1,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727857,
+ tx_hash:
+ '2d2a173f93638fca8c087b8324aab222642231deb249a4a0d764dbbae19fd385',
+ tx_pos: 1,
+ value: 5045,
+ txid: '2d2a173f93638fca8c087b8324aab222642231deb249a4a0d764dbbae19fd385',
+ vout: 1,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727857,
+ tx_hash:
+ 'ebba5f05db1ca0be3f8b97410374b64c8e80ae6631bc8fc5a52c3804220dfbb2',
+ tx_pos: 2,
+ value: 1753,
+ txid: 'ebba5f05db1ca0be3f8b97410374b64c8e80ae6631bc8fc5a52c3804220dfbb2',
+ vout: 2,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727864,
+ tx_hash:
+ '04e13833b7de3656ba436be8b3f2286399a03053451b3f753c8928cd4972aaea',
+ tx_pos: 2,
+ value: 2148,
+ txid: '04e13833b7de3656ba436be8b3f2286399a03053451b3f753c8928cd4972aaea',
+ vout: 2,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727864,
+ tx_hash:
+ '759fd5de82d3b4744be54a4cd5428d63b349822268a37c9c53279a9d86d2020c',
+ tx_pos: 2,
+ value: 1595,
+ txid: '759fd5de82d3b4744be54a4cd5428d63b349822268a37c9c53279a9d86d2020c',
+ vout: 2,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 727864,
+ tx_hash:
+ '965052b661e086f2d2d3d0647c86e57e28bf5e72d6e6ab3f63b0744b442b1ae9',
+ tx_pos: 1,
+ value: 1695,
+ txid: '965052b661e086f2d2d3d0647c86e57e28bf5e72d6e6ab3f63b0744b442b1ae9',
+ vout: 1,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 0,
+ tx_hash:
+ '980c780b6e4f094293bde43a40b7b545190bca7b137718cc00ca406e12fc98e4',
+ tx_pos: 1,
+ value: 1648,
+ txid: '980c780b6e4f094293bde43a40b7b545190bca7b137718cc00ca406e12fc98e4',
+ vout: 1,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ utxos: [
+ {
+ height: 0,
+ tx_hash:
+ 'b8a098e8c6f28637bf02c2d26ffa1bf0e7d1a4d761a65ca17e15684816163f6d',
+ tx_pos: 1,
+ value: 69279620,
+ txid: 'b8a098e8c6f28637bf02c2d26ffa1bf0e7d1a4d761a65ca17e15684816163f6d',
+ vout: 1,
+ isValid: false,
+ },
+ ],
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+};
diff --git a/web/cashtab-v2/src/utils/__mocks__/mockAddressArray.js b/web/cashtab-v2/src/utils/__mocks__/mockAddressArray.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/__mocks__/mockAddressArray.js
@@ -0,0 +1,261 @@
+export const invalidAddressArrayInput = [
+ 'ecash:qrqgwxrrrrrrrrrrrrrrrrrrrrrrrrr7zsvk,7',
+ 'ecash:qzsha6zffffffffffffffffffffffffffffwuuzel2lfzv,67',
+ 'ecash:qqlkeeeeeeeeeeeeeeee4wyz0v403dj,4376',
+ 'ecash:qz2taawwwwwwwwwwwwwwwwwwwqfqjrqst4,673728',
+ 'ecash:qz2tggggggggggggggggggzclqfqjrqst4,368',
+ 'ecash:qp0hlj2rrrrrrrrrrrrrrrrrrfhckq4zj9s6,23673',
+];
+
+export const validAddressArrayInput = [
+ 'ecash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dyguh7zsvk,7',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,67',
+ 'ecash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wyz0v403dj,4376',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,673728',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,368',
+ 'ecash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhckq4zj9s6,23673',
+];
+
+export const validAddressArrayInputMixedPrefixes = [
+ 'qrqgwxnaxlfagezvr2zj4s9yee6rrs96dyguh7zsvk,7',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,67',
+ 'ecash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wyz0v403dj,4376',
+ 'qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,673728',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,368',
+ 'ecash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhckq4zj9s6,23673',
+];
+
+export const validAddressArrayOutput = [
+ 'bitcoincash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dy33r4e22p,7\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,67\n',
+ 'bitcoincash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wymzc75tt9,4376\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,673728\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,368\n',
+ 'bitcoincash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhc0dpfflkd,23673\n',
+];
+
+export const validLargeAddressArrayInput = [
+ 'ecash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dyguh7zsvk,7',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,67',
+ 'ecash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wyz0v403dj,4376',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,673728',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,368',
+ 'ecash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhckq4zj9s6,23673',
+ 'ecash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvtdy0n9s0,983',
+ 'ecash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5rgq8q3ks,7834867',
+ 'ecash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alcy8kq39f2,348732',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,3272377',
+ 'ecash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dyguh7zsvk,7',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,67',
+ 'ecash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wyz0v403dj,4376',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,673728',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,368',
+ 'ecash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhckq4zj9s6,23673',
+ 'ecash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvtdy0n9s0,983',
+ 'ecash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5rgq8q3ks,7834867',
+ 'ecash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alcy8kq39f2,348732',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,3272377',
+ 'ecash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dyguh7zsvk,7',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,67',
+ 'ecash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wyz0v403dj,4376',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,673728',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,368',
+ 'ecash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhckq4zj9s6,23673',
+ 'ecash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvtdy0n9s0,983',
+ 'ecash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5rgq8q3ks,7834867',
+ 'ecash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alcy8kq39f2,348732',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,3272377',
+ 'ecash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dyguh7zsvk,7',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,67',
+ 'ecash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wyz0v403dj,4376',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,673728',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,368',
+ 'ecash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhckq4zj9s6,23673',
+ 'ecash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvtdy0n9s0,983',
+ 'ecash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5rgq8q3ks,7834867',
+ 'ecash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alcy8kq39f2,348732',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,3272377',
+ 'ecash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dyguh7zsvk,7',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,67',
+ 'ecash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wyz0v403dj,4376',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,673728',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,368',
+ 'ecash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhckq4zj9s6,23673',
+ 'ecash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvtdy0n9s0,983',
+ 'ecash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5rgq8q3ks,7834867',
+ 'ecash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alcy8kq39f2,348732',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,3272377',
+ 'ecash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dyguh7zsvk,7',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,67',
+ 'ecash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wyz0v403dj,4376',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,673728',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,368',
+ 'ecash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhckq4zj9s6,23673',
+ 'ecash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvtdy0n9s0,983',
+ 'ecash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5rgq8q3ks,7834867',
+ 'ecash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alcy8kq39f2,348732',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,3272377',
+ 'ecash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dyguh7zsvk,7',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,67',
+ 'ecash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wyz0v403dj,4376',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,673728',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,368',
+ 'ecash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhckq4zj9s6,23673',
+ 'ecash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvtdy0n9s0,983',
+ 'ecash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5rgq8q3ks,7834867',
+ 'ecash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alcy8kq39f2,348732',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,3272377',
+ 'ecash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dyguh7zsvk,7',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,67',
+ 'ecash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wyz0v403dj,4376',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,673728',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,368',
+ 'ecash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhckq4zj9s6,23673',
+ 'ecash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvtdy0n9s0,983',
+ 'ecash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5rgq8q3ks,7834867',
+ 'ecash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alcy8kq39f2,348732',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,3272377',
+ 'ecash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dyguh7zsvk,7',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,67',
+ 'ecash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wyz0v403dj,4376',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,673728',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,368',
+ 'ecash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhckq4zj9s6,23673',
+ 'ecash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvtdy0n9s0,983',
+ 'ecash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5rgq8q3ks,7834867',
+ 'ecash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alcy8kq39f2,348732',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,3272377',
+ 'ecash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dyguh7zsvk,7',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,67',
+ 'ecash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wyz0v403dj,4376',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,673728',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,368',
+ 'ecash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhckq4zj9s6,23673',
+ 'ecash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvtdy0n9s0,983',
+ 'ecash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5rgq8q3ks,7834867',
+ 'ecash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alcy8kq39f2,348732',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,3272377',
+ 'ecash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dyguh7zsvk,7',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,67',
+ 'ecash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wyz0v403dj,4376',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,673728',
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,368',
+ 'ecash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhckq4zj9s6,23673',
+ 'ecash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvtdy0n9s0,983',
+ 'ecash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5rgq8q3ks,7834867',
+ 'ecash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alcy8kq39f2,348732',
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,3272377',
+];
+
+export const validLargeAddressArrayOutput = [
+ 'bitcoincash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dy33r4e22p,7\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,67\n',
+ 'bitcoincash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wymzc75tt9,4376\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,673728\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,368\n',
+ 'bitcoincash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhc0dpfflkd,23673\n',
+ 'bitcoincash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvjqsyglkc,983\n',
+ 'bitcoincash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5695vmts8,7834867\n',
+ 'bitcoincash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alca2zt2l0a,348732\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,3272377\n',
+ 'bitcoincash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dy33r4e22p,7\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,67\n',
+ 'bitcoincash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wymzc75tt9,4376\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,673728\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,368\n',
+ 'bitcoincash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhc0dpfflkd,23673\n',
+ 'bitcoincash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvjqsyglkc,983\n',
+ 'bitcoincash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5695vmts8,7834867\n',
+ 'bitcoincash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alca2zt2l0a,348732\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,3272377\n',
+ 'bitcoincash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dy33r4e22p,7\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,67\n',
+ 'bitcoincash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wymzc75tt9,4376\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,673728\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,368\n',
+ 'bitcoincash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhc0dpfflkd,23673\n',
+ 'bitcoincash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvjqsyglkc,983\n',
+ 'bitcoincash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5695vmts8,7834867\n',
+ 'bitcoincash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alca2zt2l0a,348732\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,3272377\n',
+ 'bitcoincash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dy33r4e22p,7\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,67\n',
+ 'bitcoincash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wymzc75tt9,4376\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,673728\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,368\n',
+ 'bitcoincash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhc0dpfflkd,23673\n',
+ 'bitcoincash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvjqsyglkc,983\n',
+ 'bitcoincash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5695vmts8,7834867\n',
+ 'bitcoincash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alca2zt2l0a,348732\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,3272377\n',
+ 'bitcoincash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dy33r4e22p,7\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,67\n',
+ 'bitcoincash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wymzc75tt9,4376\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,673728\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,368\n',
+ 'bitcoincash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhc0dpfflkd,23673\n',
+ 'bitcoincash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvjqsyglkc,983\n',
+ 'bitcoincash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5695vmts8,7834867\n',
+ 'bitcoincash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alca2zt2l0a,348732\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,3272377\n',
+ 'bitcoincash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dy33r4e22p,7\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,67\n',
+ 'bitcoincash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wymzc75tt9,4376\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,673728\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,368\n',
+ 'bitcoincash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhc0dpfflkd,23673\n',
+ 'bitcoincash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvjqsyglkc,983\n',
+ 'bitcoincash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5695vmts8,7834867\n',
+ 'bitcoincash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alca2zt2l0a,348732\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,3272377\n',
+ 'bitcoincash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dy33r4e22p,7\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,67\n',
+ 'bitcoincash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wymzc75tt9,4376\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,673728\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,368\n',
+ 'bitcoincash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhc0dpfflkd,23673\n',
+ 'bitcoincash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvjqsyglkc,983\n',
+ 'bitcoincash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5695vmts8,7834867\n',
+ 'bitcoincash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alca2zt2l0a,348732\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,3272377\n',
+ 'bitcoincash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dy33r4e22p,7\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,67\n',
+ 'bitcoincash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wymzc75tt9,4376\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,673728\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,368\n',
+ 'bitcoincash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhc0dpfflkd,23673\n',
+ 'bitcoincash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvjqsyglkc,983\n',
+ 'bitcoincash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5695vmts8,7834867\n',
+ 'bitcoincash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alca2zt2l0a,348732\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,3272377\n',
+ 'bitcoincash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dy33r4e22p,7\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,67\n',
+ 'bitcoincash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wymzc75tt9,4376\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,673728\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,368\n',
+ 'bitcoincash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhc0dpfflkd,23673\n',
+ 'bitcoincash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvjqsyglkc,983\n',
+ 'bitcoincash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5695vmts8,7834867\n',
+ 'bitcoincash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alca2zt2l0a,348732\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,3272377\n',
+ 'bitcoincash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dy33r4e22p,7\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,67\n',
+ 'bitcoincash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wymzc75tt9,4376\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,673728\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,368\n',
+ 'bitcoincash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhc0dpfflkd,23673\n',
+ 'bitcoincash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvjqsyglkc,983\n',
+ 'bitcoincash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5695vmts8,7834867\n',
+ 'bitcoincash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alca2zt2l0a,348732\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,3272377\n',
+ 'bitcoincash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dy33r4e22p,7\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,67\n',
+ 'bitcoincash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wymzc75tt9,4376\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,673728\n',
+ 'bitcoincash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqsdxgm2dz,368\n',
+ 'bitcoincash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhc0dpfflkd,23673\n',
+ 'bitcoincash:qzju5ql7lk2h4k5uj0cukmu6zg859zsjjvjqsyglkc,983\n',
+ 'bitcoincash:qq3ap93nt5trdtjuum0adv7n29xx7gl2a5695vmts8,7834867\n',
+ 'bitcoincash:qzq7a8vpzq5wyqgka0r3wk5t90rxw75alca2zt2l0a,348732\n',
+ 'bitcoincash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuum5tpynym,3272377\n',
+];
diff --git a/web/cashtab-v2/src/utils/__mocks__/mockBatchedArrays.js b/web/cashtab-v2/src/utils/__mocks__/mockBatchedArrays.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/__mocks__/mockBatchedArrays.js
@@ -0,0 +1,3 @@
+// @generated
+export const unbatchedArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
+export const arrayBatchedByThree = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]];
diff --git a/web/cashtab-v2/src/utils/__mocks__/mockCachedUtxos.js b/web/cashtab-v2/src/utils/__mocks__/mockCachedUtxos.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/__mocks__/mockCachedUtxos.js
@@ -0,0 +1,566 @@
+// @generated
+
+import BigNumber from 'bignumber.js';
+
+export const cachedUtxos = {
+ slpBalancesAndUtxos: { nonSlpUtxos: [] },
+ tokens: [
+ {
+ info: {
+ height: 681188,
+ tx_hash:
+ '5b74e05ced6b7d862fe9cab94071b2ccfa475c0cef94b90c7edb8a06f90e5ad6',
+ tx_pos: 1,
+ value: 546,
+ txid: '5b74e05ced6b7d862fe9cab94071b2ccfa475c0cef94b90c7edb8a06f90e5ad6',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '1e-7',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ balance: {
+ s: 1,
+ e: 1,
+ c: [66, 10000000],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681190,
+ tx_hash:
+ '52fe0ccf7b5936095bbdadebc0de9f844a99457096ca4f7b45543a2badefdf35',
+ tx_pos: 1,
+ value: 546,
+ txid: '52fe0ccf7b5936095bbdadebc0de9f844a99457096ca4f7b45543a2badefdf35',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '4',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ balance: {
+ s: 1,
+ e: 1,
+ c: [15],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ balance: {
+ s: 1,
+ e: 0,
+ c: [1],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 1,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ balance: {
+ s: 1,
+ e: 0,
+ c: [1],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '1e-8',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ balance: {
+ s: 1,
+ e: -8,
+ c: [1000000],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ balance: {
+ s: 1,
+ e: 0,
+ c: [1],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'f6ef57f697219aaa576bf43d69a7f8b8753dcbcbb502f602259a7d14fafd52c5',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f6ef57f697219aaa576bf43d69a7f8b8753dcbcbb502f602259a7d14fafd52c5',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ balance: {
+ s: 1,
+ e: -8,
+ c: [1600000],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681329,
+ tx_hash:
+ '16ccf6a34209b25fe78f6a3cdf685eb89f498a7edf144b9e049958c8eda2b439',
+ tx_pos: 1,
+ value: 546,
+ txid: '16ccf6a34209b25fe78f6a3cdf685eb89f498a7edf144b9e049958c8eda2b439',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'd849fbb04ce77870deaf0e2d9a67146b055f6d8bba18285f5c5f662e20d23199',
+ tokenTicker: 'BBT',
+ tokenName: 'BurnBits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ 'd849fbb04ce77870deaf0e2d9a67146b055f6d8bba18285f5c5f662e20d23199',
+ balance: {
+ s: 1,
+ e: -9,
+ c: [100000],
+ },
+ hasBaton: false,
+ },
+ ],
+};
+export const utxosLoadedFromCache = {
+ balances: {
+ totalBalance: 0,
+ totalBalanceInSatoshis: 0,
+ },
+ slpBalancesAndUtxos: {
+ nonSlpUtxos: [],
+ },
+ tokens: [
+ {
+ info: {
+ height: 681188,
+ tx_hash:
+ '5b74e05ced6b7d862fe9cab94071b2ccfa475c0cef94b90c7edb8a06f90e5ad6',
+ tx_pos: 1,
+ value: 546,
+ txid: '5b74e05ced6b7d862fe9cab94071b2ccfa475c0cef94b90c7edb8a06f90e5ad6',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '1e-7',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ balance: new BigNumber({
+ s: 1,
+ e: 1,
+ c: [66, 10000000],
+ _isBigNumber: true,
+ }),
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681190,
+ tx_hash:
+ '52fe0ccf7b5936095bbdadebc0de9f844a99457096ca4f7b45543a2badefdf35',
+ tx_pos: 1,
+ value: 546,
+ txid: '52fe0ccf7b5936095bbdadebc0de9f844a99457096ca4f7b45543a2badefdf35',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '4',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ balance: new BigNumber({
+ s: 1,
+ e: 1,
+ c: [15],
+ _isBigNumber: true,
+ }),
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ balance: new BigNumber({
+ s: 1,
+ e: 0,
+ c: [1],
+ _isBigNumber: true,
+ }),
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 1,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ balance: new BigNumber({
+ s: 1,
+ e: 0,
+ c: [1],
+ _isBigNumber: true,
+ }),
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '1e-8',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ balance: new BigNumber({
+ s: 1,
+ e: -8,
+ c: [1000000],
+ _isBigNumber: true,
+ }),
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ balance: new BigNumber({
+ s: 1,
+ e: 0,
+ c: [1],
+ _isBigNumber: true,
+ }),
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'f6ef57f697219aaa576bf43d69a7f8b8753dcbcbb502f602259a7d14fafd52c5',
+ tx_pos: 1,
+ value: 546,
+ txid: 'f6ef57f697219aaa576bf43d69a7f8b8753dcbcbb502f602259a7d14fafd52c5',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ balance: new BigNumber({
+ s: 1,
+ e: -8,
+ c: [1600000],
+ _isBigNumber: true,
+ }),
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681329,
+ tx_hash:
+ '16ccf6a34209b25fe78f6a3cdf685eb89f498a7edf144b9e049958c8eda2b439',
+ tx_pos: 1,
+ value: 546,
+ txid: '16ccf6a34209b25fe78f6a3cdf685eb89f498a7edf144b9e049958c8eda2b439',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'd849fbb04ce77870deaf0e2d9a67146b055f6d8bba18285f5c5f662e20d23199',
+ tokenTicker: 'BBT',
+ tokenName: 'BurnBits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ tokenId:
+ 'd849fbb04ce77870deaf0e2d9a67146b055f6d8bba18285f5c5f662e20d23199',
+ balance: new BigNumber({
+ s: 1,
+ e: -9,
+ c: [100000],
+ _isBigNumber: true,
+ }),
+ hasBaton: false,
+ },
+ ],
+};
diff --git a/web/cashtab-v2/src/utils/__mocks__/mockLegacyWallets.js b/web/cashtab-v2/src/utils/__mocks__/mockLegacyWallets.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/__mocks__/mockLegacyWallets.js
@@ -0,0 +1,164 @@
+export const missingPath1899Wallet = {
+ Path145: {
+ cashAddress: 'bitcoincash:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9v0lgx569z',
+ fundingAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ fundingWif: 'L2xvTe6CdNxroR6pbdpGWNjAa55AZX5Wm59W5TXMuH31ihNJdDjt',
+ legacyAddress: '1511T3ynXKgCwXhFijCUWKuTfqbPxFV1AF',
+ slpAddress: 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ },
+ Path245: {
+ cashAddress: 'bitcoincash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy54hkry298',
+ fundingAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ fundingWif: 'KwgNkyijAaxFr5XQdnaYyNMXVSZobgHzSoKKfWiC3Q7Xr4n7iYMG',
+ legacyAddress: '1EgPUfBgU7ekho3EjtGze87dRADnUE8ojP',
+ slpAddress: 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ },
+ mnemonic:
+ 'apart vacuum color cream drama kind foil history hurt alone ask census',
+ name: 'Missing Path1899',
+ state: {},
+};
+
+export const missingPublicKeyInPath1899Wallet = {
+ Path145: {
+ cashAddress: 'bitcoincash:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9v0lgx569z',
+ fundingAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ fundingWif: 'L2xvTe6CdNxroR6pbdpGWNjAa55AZX5Wm59W5TXMuH31ihNJdDjt',
+ legacyAddress: '1511T3ynXKgCwXhFijCUWKuTfqbPxFV1AF',
+ publicKey:
+ '02fe5308d77bcce825068a9e46adc6f032dbbe39167a7b6d05ac563ac71d8b186e',
+ slpAddress: 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ },
+ Path1899: {
+ cashAddress: 'bitcoincash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cptzgcqy6',
+ fundingAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ fundingWif: 'Kx4FiBMvKK1iXjFk5QTaAK6E4mDGPjmwDZ2HDKGUZpE4gCXMaPe9',
+ legacyAddress: '1J1Aq5tAAYxZgSDRo8soKM2Rb41z3xrYpm',
+ slpAddress: 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ },
+ Path245: {
+ cashAddress: 'bitcoincash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy54hkry298',
+ fundingAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ fundingWif: 'KwgNkyijAaxFr5XQdnaYyNMXVSZobgHzSoKKfWiC3Q7Xr4n7iYMG',
+ legacyAddress: '1EgPUfBgU7ekho3EjtGze87dRADnUE8ojP',
+ publicKey:
+ '03c4a69fd90c8b196683216cffd2943a7b13b0db0812e44a4ff156ac7e03fc4ed7',
+ slpAddress: 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ },
+ mnemonic:
+ 'apart vacuum color cream drama kind foil history hurt alone ask census',
+ name: 'Missing Public Key in Path1899',
+ state: {},
+};
+
+export const missingPublicKeyInPath145Wallet = {
+ Path145: {
+ cashAddress: 'bitcoincash:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9v0lgx569z',
+ fundingAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ fundingWif: 'L2xvTe6CdNxroR6pbdpGWNjAa55AZX5Wm59W5TXMuH31ihNJdDjt',
+ legacyAddress: '1511T3ynXKgCwXhFijCUWKuTfqbPxFV1AF',
+ slpAddress: 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ },
+ Path1899: {
+ cashAddress: 'bitcoincash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cptzgcqy6',
+ fundingAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ fundingWif: 'Kx4FiBMvKK1iXjFk5QTaAK6E4mDGPjmwDZ2HDKGUZpE4gCXMaPe9',
+ legacyAddress: '1J1Aq5tAAYxZgSDRo8soKM2Rb41z3xrYpm',
+ publicKey:
+ '02a06bb380cf180d703f6f80796a13555aefff817d1f6f842f1e5c555b15f0fa70',
+ slpAddress: 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ },
+ Path245: {
+ cashAddress: 'bitcoincash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy54hkry298',
+ fundingAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ fundingWif: 'KwgNkyijAaxFr5XQdnaYyNMXVSZobgHzSoKKfWiC3Q7Xr4n7iYMG',
+ legacyAddress: '1EgPUfBgU7ekho3EjtGze87dRADnUE8ojP',
+ publicKey:
+ '03c4a69fd90c8b196683216cffd2943a7b13b0db0812e44a4ff156ac7e03fc4ed7',
+ slpAddress: 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ },
+ mnemonic:
+ 'apart vacuum color cream drama kind foil history hurt alone ask census',
+ name: 'Missing Public Key in Path145',
+ state: {},
+};
+
+export const missingPublicKeyInPath245Wallet = {
+ Path145: {
+ cashAddress: 'bitcoincash:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9v0lgx569z',
+ fundingAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ fundingWif: 'L2xvTe6CdNxroR6pbdpGWNjAa55AZX5Wm59W5TXMuH31ihNJdDjt',
+ legacyAddress: '1511T3ynXKgCwXhFijCUWKuTfqbPxFV1AF',
+ publicKey:
+ '02fe5308d77bcce825068a9e46adc6f032dbbe39167a7b6d05ac563ac71d8b186e',
+ slpAddress: 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ },
+ Path1899: {
+ cashAddress: 'bitcoincash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cptzgcqy6',
+ fundingAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ fundingWif: 'Kx4FiBMvKK1iXjFk5QTaAK6E4mDGPjmwDZ2HDKGUZpE4gCXMaPe9',
+ legacyAddress: '1J1Aq5tAAYxZgSDRo8soKM2Rb41z3xrYpm',
+ publicKey:
+ '02a06bb380cf180d703f6f80796a13555aefff817d1f6f842f1e5c555b15f0fa70',
+ slpAddress: 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ },
+ Path245: {
+ cashAddress: 'bitcoincash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy54hkry298',
+ fundingAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ fundingWif: 'KwgNkyijAaxFr5XQdnaYyNMXVSZobgHzSoKKfWiC3Q7Xr4n7iYMG',
+ legacyAddress: '1EgPUfBgU7ekho3EjtGze87dRADnUE8ojP',
+ slpAddress: 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ },
+ mnemonic:
+ 'apart vacuum color cream drama kind foil history hurt alone ask census',
+ name: 'Missing Public Key in Path245',
+ state: {},
+};
+
+export const notLegacyWallet = {
+ Path145: {
+ cashAddress: 'bitcoincash:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9v0lgx569z',
+ fundingAddress:
+ 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ fundingWif: 'L2xvTe6CdNxroR6pbdpGWNjAa55AZX5Wm59W5TXMuH31ihNJdDjt',
+ legacyAddress: '1511T3ynXKgCwXhFijCUWKuTfqbPxFV1AF',
+ publicKey:
+ '02fe5308d77bcce825068a9e46adc6f032dbbe39167a7b6d05ac563ac71d8b186e',
+ slpAddress: 'simpleledger:qq47pcxfn8n7w7jy86njd7pvgsv39l9f9vryrap6mu',
+ },
+ Path1899: {
+ cashAddress: 'bitcoincash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cptzgcqy6',
+ fundingAddress:
+ 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ fundingWif: 'Kx4FiBMvKK1iXjFk5QTaAK6E4mDGPjmwDZ2HDKGUZpE4gCXMaPe9',
+ legacyAddress: '1J1Aq5tAAYxZgSDRo8soKM2Rb41z3xrYpm',
+ publicKey:
+ '02a06bb380cf180d703f6f80796a13555aefff817d1f6f842f1e5c555b15f0fa70',
+ slpAddress: 'simpleledger:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7cdsfndq6y',
+ },
+ Path245: {
+ cashAddress: 'bitcoincash:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy54hkry298',
+ fundingAddress:
+ 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ fundingWif: 'KwgNkyijAaxFr5XQdnaYyNMXVSZobgHzSoKKfWiC3Q7Xr4n7iYMG',
+ legacyAddress: '1EgPUfBgU7ekho3EjtGze87dRADnUE8ojP',
+ publicKey:
+ '03c4a69fd90c8b196683216cffd2943a7b13b0db0812e44a4ff156ac7e03fc4ed7',
+ slpAddress: 'simpleledger:qztqe8k4v8ckn8cvfxt5659nhd7dcyvxy5evac32me',
+ },
+ mnemonic:
+ 'apart vacuum color cream drama kind foil history hurt alone ask census',
+ name: 'Current Wallet, Not Legacy',
+ state: {},
+};
diff --git a/web/cashtab-v2/src/utils/__mocks__/mockOpReturnParsedArray.js b/web/cashtab-v2/src/utils/__mocks__/mockOpReturnParsedArray.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/__mocks__/mockOpReturnParsedArray.js
@@ -0,0 +1,52 @@
+import { currency } from '@components/Common/Ticker';
+export const shortCashtabMessageInputHex = '6a04007461620461736466';
+export const longCashtabMessageInputHex =
+ '6a04007461624ca054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e';
+export const shortExternalMessageInputHex =
+ '6a1173686f727420656c65637472756d313132';
+export const longExternalMessageInputHex =
+ '6a4cdb54657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d6940';
+export const shortSegmentedExternalMessageInputHex =
+ '6a1173686f727420656c65637472756d3131321173686f727420656c65637472756d3131321173686f727420656c65637472756d313132';
+export const longSegmentedExternalMessageInputHex =
+ '6a4cdb54657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69404cdb54657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d6940';
+export const mixedSegmentedExternalMessageInputHex =
+ '6a4cdb54657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69404cdb54657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69401173686f727420656c65637472756d313132';
+export const eTokenInputHex =
+ '6a04534c500001010453454e4420f9eabf94edec18e91f518c6b1e22cc47a7464d005f04a06e65f70be7755c94bc0800000000000000c80800000000000024b8';
+
+export const mockParsedShortCashtabMessageArray = ['00746162', '61736466'];
+
+export const mockParsedLongCashtabMessageArray = [
+ '00746162',
+ '54657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e',
+];
+
+export const mockParsedShortExternalMessageArray = [
+ '73686f727420656c65637472756d313132',
+];
+
+export const mockParsedLongExternalMessageArray = [
+ '54657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d6940',
+];
+
+export const mockParsedShortSegmentedExternalMessageArray = [
+ '73686f727420656c65637472756d313132',
+ '73686f727420656c65637472756d313132',
+ '73686f727420656c65637472756d313132',
+];
+
+export const mockParsedLongSegmentedExternalMessageArray = [
+ '54657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d6940',
+ '54657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d6940',
+];
+
+export const mockParsedMixedSegmentedExternalMessageArray = [
+ '54657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d6940',
+ '54657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d69742054657374696e672074686520323535206c696d6940',
+ '73686f727420656c65637472756d313132',
+];
+
+export const mockParsedETokenOutputArray = [
+ currency.opReturn.appPrefixesHex.eToken,
+];
diff --git a/web/cashtab-v2/src/utils/__mocks__/mockStoredWallets.js b/web/cashtab-v2/src/utils/__mocks__/mockStoredWallets.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/__mocks__/mockStoredWallets.js
@@ -0,0 +1,2249 @@
+// @generated
+
+export const validStoredWallet = {
+ mnemonic: 'Nope',
+ name: 'TripDos',
+ Path245: {
+ cashAddress: 'bitcoincash:qq0mw6nah9huwaxt45qw3fegjpszkjlrqsvttwy36p',
+ slpAddress: 'simpleledger:qq0mw6nah9huwaxt45qw3fegjpszkjlrqsqsq433yl',
+ fundingWif: 'Nope',
+ fundingAddress:
+ 'simpleledger:qq0mw6nah9huwaxt45qw3fegjpszkjlrqsqsq433yl',
+ legacyAddress: '13thfuvhCA1dGE7nVgyU61BZfoD8ApXJsg',
+ },
+ Path145: {
+ cashAddress: 'bitcoincash:qz5lf9pxde9neq3hzte8mmwts03sktl9nuz6m3dynu',
+ slpAddress: 'simpleledger:qz5lf9pxde9neq3hzte8mmwts03sktl9nuwps2cydz',
+ fundingWif: 'Nope',
+ fundingAddress:
+ 'simpleledger:qz5lf9pxde9neq3hzte8mmwts03sktl9nuwps2cydz',
+ legacyAddress: '1GVeC3gB6V3EStcQbJiry5BJn4fRdHjKyc',
+ },
+ Path1899: {
+ cashAddress: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ slpAddress: 'simpleledger:qz2708636snqhsxu8wnlka78h6fdp77ar5syue64fa',
+ fundingWif: 'Nope',
+ fundingAddress:
+ 'simpleledger:qz2708636snqhsxu8wnlka78h6fdp77ar5syue64fa',
+ legacyAddress: '1Efd9z9GRVJK2r73nUpFmBnsKUmfXNm2y2',
+ },
+ state: {
+ balances: {
+ totalBalanceInSatoshis: 1503017804,
+ totalBalance: 15.03017804,
+ },
+ tokens: [
+ {
+ info: {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ txid: '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ balance: {
+ s: 1,
+ e: 0,
+ c: [1],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ txid: 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ balance: {
+ s: 1,
+ e: -9,
+ c: [100000],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681189,
+ tx_hash:
+ 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ tx_pos: 2,
+ value: 546,
+ txid: 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '523512277.7961432',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ balance: {
+ s: 1,
+ e: 8,
+ c: [523512277, 79614320000000],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ balance: {
+ s: 1,
+ e: 0,
+ c: [1],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ tx_pos: 2,
+ value: 546,
+ txid: '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '996797',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ balance: {
+ s: 1,
+ e: 5,
+ c: [996797],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ balance: {
+ s: 1,
+ e: 0,
+ c: [1],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ tx_pos: 2,
+ value: 546,
+ txid: 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '0.99999999',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ balance: {
+ s: 1,
+ e: -1,
+ c: [99999999000000],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ balance: {
+ s: 1,
+ e: 0,
+ c: [1],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681329,
+ tx_hash:
+ '08e9a7b9537e60f630eba0f339be6b97e9d8061d5fc0c4d3247226fc86574ce9',
+ tx_pos: 2,
+ value: 546,
+ txid: '08e9a7b9537e60f630eba0f339be6b97e9d8061d5fc0c4d3247226fc86574ce9',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '999997.999999994',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ balance: {
+ s: 1,
+ e: 5,
+ c: [999997, 99999999400000],
+ },
+ hasBaton: false,
+ },
+ ],
+ slpBalancesAndUtxos: {
+ tokens: [
+ {
+ info: {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ txid: '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ balance: {
+ s: 1,
+ e: 0,
+ c: [1],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ txid: 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ balance: {
+ s: 1,
+ e: -9,
+ c: [100000],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681189,
+ tx_hash:
+ 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ tx_pos: 2,
+ value: 546,
+ txid: 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '523512277.7961432',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ balance: {
+ s: 1,
+ e: 8,
+ c: [523512277, 79614320000000],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ balance: {
+ s: 1,
+ e: 0,
+ c: [1],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ tx_pos: 2,
+ value: 546,
+ txid: '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '996797',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ balance: {
+ s: 1,
+ e: 5,
+ c: [996797],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ balance: {
+ s: 1,
+ e: 0,
+ c: [1],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ tx_pos: 2,
+ value: 546,
+ txid: 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '0.99999999',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ balance: {
+ s: 1,
+ e: -1,
+ c: [99999999000000],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ balance: {
+ s: 1,
+ e: 0,
+ c: [1],
+ },
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681329,
+ tx_hash:
+ '08e9a7b9537e60f630eba0f339be6b97e9d8061d5fc0c4d3247226fc86574ce9',
+ tx_pos: 2,
+ value: 546,
+ txid: '08e9a7b9537e60f630eba0f339be6b97e9d8061d5fc0c4d3247226fc86574ce9',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '999997.999999994',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ balance: {
+ s: 1,
+ e: 5,
+ c: [999997, 99999999400000],
+ },
+ hasBaton: false,
+ },
+ ],
+ nonSlpUtxos: [
+ {
+ height: 682107,
+ tx_hash:
+ '8d4c90ecf069e3a1494339724ddbb8bf28e3b38315a009ca5c49237b3ae7687a',
+ tx_pos: 1,
+ value: 1503017804,
+ txid: '8d4c90ecf069e3a1494339724ddbb8bf28e3b38315a009ca5c49237b3ae7687a',
+ vout: 1,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ wif: 'Nope',
+ },
+ ],
+ slpUtxos: [
+ {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ txid: '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ txid: 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ tx_pos: 2,
+ value: 546,
+ txid: 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '523512277.7961432',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ tx_pos: 2,
+ value: 546,
+ txid: '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '996797',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ tx_pos: 2,
+ value: 546,
+ txid: 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '0.99999999',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681329,
+ tx_hash:
+ '08e9a7b9537e60f630eba0f339be6b97e9d8061d5fc0c4d3247226fc86574ce9',
+ tx_pos: 2,
+ value: 546,
+ txid: '08e9a7b9537e60f630eba0f339be6b97e9d8061d5fc0c4d3247226fc86574ce9',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '999997.999999994',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ },
+ parsedTxHistory: [
+ {
+ txid: '8d4c90ecf069e3a1494339724ddbb8bf28e3b38315a009ca5c49237b3ae7687a',
+ confirmations: 644,
+ height: 682107,
+ blocktime: 1618439595,
+ amountSent: 0.00002,
+ amountReceived: 0,
+ tokenTx: false,
+ outgoingTx: true,
+ destinationAddress:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ txid: '08e9a7b9537e60f630eba0f339be6b97e9d8061d5fc0c4d3247226fc86574ce9',
+ confirmations: 1422,
+ height: 681329,
+ blocktime: 1617988189,
+ amountSent: 0.00000546,
+ amountReceived: 0,
+ tokenTx: true,
+ outgoingTx: true,
+ destinationAddress:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ tokenInfo: {
+ qtySent: '1e-9',
+ qtyReceived: '0',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenName: 'eBits',
+ tokenTicker: 'XBIT',
+ },
+ },
+ {
+ txid: 'f27ff24c15b01c30d44218c6dc8706fd33cc7bc9b4b38399075f0f41d8e412af',
+ confirmations: 1559,
+ height: 681192,
+ blocktime: 1617923457,
+ amountSent: 0.00000546,
+ amountReceived: 0,
+ tokenTx: true,
+ outgoingTx: true,
+ destinationAddress:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ tokenInfo: {
+ qtySent: '5e-9',
+ qtyReceived: '0',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenName: 'eBits',
+ tokenTicker: 'XBIT',
+ },
+ },
+ {
+ txid: 'b7f8b23f5ce12842eb655239919b6142052a2fa2b2ce974a4baac36b0137f332',
+ confirmations: 1559,
+ height: 681192,
+ blocktime: 1617923457,
+ amountSent: 0.00000546,
+ amountReceived: 0,
+ tokenTx: true,
+ outgoingTx: true,
+ destinationAddress:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ tokenInfo: {
+ qtySent: '4e-9',
+ qtyReceived: '0',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenName: 'eBits',
+ tokenTicker: 'XBIT',
+ },
+ },
+ {
+ txid: '880baf5691c2b4c5a22ae4032e2004c0c54bfabf003468044a2e341846137136',
+ confirmations: 1559,
+ height: 681192,
+ blocktime: 1617923457,
+ amountSent: 0.00000546,
+ amountReceived: 0,
+ tokenTx: true,
+ outgoingTx: true,
+ destinationAddress:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ tokenInfo: {
+ qtySent: '3e-9',
+ qtyReceived: '0',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenName: 'eBits',
+ tokenTicker: 'XBIT',
+ },
+ },
+ ],
+ utxos: [
+ {
+ utxos: [],
+ address:
+ 'bitcoincash:qq0mw6nah9huwaxt45qw3fegjpszkjlrqsvttwy36p',
+ },
+ {
+ utxos: [],
+ address:
+ 'bitcoincash:qz5lf9pxde9neq3hzte8mmwts03sktl9nuz6m3dynu',
+ },
+ {
+ utxos: [
+ {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 681191,
+ tx_hash:
+ '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 681329,
+ tx_hash:
+ '08e9a7b9537e60f630eba0f339be6b97e9d8061d5fc0c4d3247226fc86574ce9',
+ tx_pos: 2,
+ value: 546,
+ },
+ {
+ height: 682107,
+ tx_hash:
+ '8d4c90ecf069e3a1494339724ddbb8bf28e3b38315a009ca5c49237b3ae7687a',
+ tx_pos: 1,
+ value: 1503017804,
+ },
+ ],
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ hydratedUtxoDetails: {
+ slpUtxos: [
+ {
+ utxos: [
+ {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ txid: '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ tx_pos: 1,
+ value: 546,
+ txid: '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '9897999885.21030105',
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ tx_pos: 1,
+ value: 546,
+ txid: '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '308.87654321',
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ txid: 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ tx_pos: 2,
+ value: 546,
+ txid: 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '523512277.7961432',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ tx_pos: 2,
+ value: 546,
+ txid: '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '996797',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ tx_pos: 2,
+ value: 546,
+ txid: 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '0.99999999',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681329,
+ tx_hash:
+ '08e9a7b9537e60f630eba0f339be6b97e9d8061d5fc0c4d3247226fc86574ce9',
+ tx_pos: 2,
+ value: 546,
+ txid: '08e9a7b9537e60f630eba0f339be6b97e9d8061d5fc0c4d3247226fc86574ce9',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '999997.999999994',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 682107,
+ tx_hash:
+ '8d4c90ecf069e3a1494339724ddbb8bf28e3b38315a009ca5c49237b3ae7687a',
+ tx_pos: 1,
+ value: 1503017804,
+ txid: '8d4c90ecf069e3a1494339724ddbb8bf28e3b38315a009ca5c49237b3ae7687a',
+ vout: 1,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ wif: 'Nope',
+ },
+ ],
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ },
+ },
+};
+
+// Sample unmigrated (i.e. before diff adding required fields to wallet.state) wallet, with private key info removed
+export const invalidStoredWallet = {
+ mnemonic: 'Remembered to take this out this time',
+ name: 'TripDos',
+ Path245: {
+ cashAddress: 'bitcoincash:qq0mw6nah9huwaxt45qw3fegjpszkjlrqsvttwy36p',
+ slpAddress: 'simpleledger:qq0mw6nah9huwaxt45qw3fegjpszkjlrqsqsq433yl',
+ fundingWif: 'Remembered to take this out this time',
+ fundingAddress:
+ 'simpleledger:qq0mw6nah9huwaxt45qw3fegjpszkjlrqsqsq433yl',
+ legacyAddress: '13thfuvhCA1dGE7nVgyU61BZfoD8ApXJsg',
+ },
+ Path145: {
+ cashAddress: 'bitcoincash:qz5lf9pxde9neq3hzte8mmwts03sktl9nuz6m3dynu',
+ slpAddress: 'simpleledger:qz5lf9pxde9neq3hzte8mmwts03sktl9nuwps2cydz',
+ fundingWif: 'Remembered to take this out this time',
+ fundingAddress:
+ 'simpleledger:qz5lf9pxde9neq3hzte8mmwts03sktl9nuwps2cydz',
+ legacyAddress: '1GVeC3gB6V3EStcQbJiry5BJn4fRdHjKyc',
+ },
+ Path1899: {
+ cashAddress: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ slpAddress: 'simpleledger:qz2708636snqhsxu8wnlka78h6fdp77ar5syue64fa',
+ fundingWif: 'Remembered to take this out this time',
+ fundingAddress:
+ 'simpleledger:qz2708636snqhsxu8wnlka78h6fdp77ar5syue64fa',
+ legacyAddress: '1Efd9z9GRVJK2r73nUpFmBnsKUmfXNm2y2',
+ },
+ state: {
+ balances: {
+ totalBalanceInSatoshis: 1503017804,
+ totalBalance: 15.03017804,
+ },
+ tokens: [
+ {
+ info: {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ txid: '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ balance: '1',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ txid: 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ balance: '1e-9',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681189,
+ tx_hash:
+ 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ tx_pos: 2,
+ value: 546,
+ txid: 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '523512277.7961432',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ balance: '523512277.7961432',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ balance: '1',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ tx_pos: 2,
+ value: 546,
+ txid: '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '996797',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ balance: '996797',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ balance: '1',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ tx_pos: 2,
+ value: 546,
+ txid: 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '0.99999999',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ balance: '0.99999999',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ balance: '1',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681329,
+ tx_hash:
+ '08e9a7b9537e60f630eba0f339be6b97e9d8061d5fc0c4d3247226fc86574ce9',
+ tx_pos: 2,
+ value: 546,
+ txid: '08e9a7b9537e60f630eba0f339be6b97e9d8061d5fc0c4d3247226fc86574ce9',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '999997.999999994',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ balance: '999997.999999994',
+ hasBaton: false,
+ },
+ ],
+ slpBalancesAndUtxos: {
+ tokens: [
+ {
+ info: {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ txid: '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ balance: '1',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ txid: 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ balance: '1e-9',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681189,
+ tx_hash:
+ 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ tx_pos: 2,
+ value: 546,
+ txid: 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '523512277.7961432',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ balance: '523512277.7961432',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ balance: '1',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ tx_pos: 2,
+ value: 546,
+ txid: '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '996797',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ balance: '996797',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ balance: '1',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ tx_pos: 2,
+ value: 546,
+ txid: 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '0.99999999',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ balance: '0.99999999',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681191,
+ tx_hash:
+ 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ balance: '1',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 681329,
+ tx_hash:
+ '08e9a7b9537e60f630eba0f339be6b97e9d8061d5fc0c4d3247226fc86574ce9',
+ tx_pos: 2,
+ value: 546,
+ txid: '08e9a7b9537e60f630eba0f339be6b97e9d8061d5fc0c4d3247226fc86574ce9',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '999997.999999994',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ balance: '999997.999999994',
+ hasBaton: false,
+ },
+ ],
+ nonSlpUtxos: [
+ {
+ height: 682107,
+ tx_hash:
+ '8d4c90ecf069e3a1494339724ddbb8bf28e3b38315a009ca5c49237b3ae7687a',
+ tx_pos: 1,
+ value: 1503017804,
+ txid: '8d4c90ecf069e3a1494339724ddbb8bf28e3b38315a009ca5c49237b3ae7687a',
+ vout: 1,
+ isValid: false,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ wif: 'Remembered to take this out this time',
+ },
+ ],
+ slpUtxos: [
+ {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ txid: '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ txid: 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681189,
+ tx_hash:
+ 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ tx_pos: 2,
+ value: 546,
+ txid: 'f38ccfa615e38f0c871f4eb35db420157808014f1f5743f1522529253c0c4c56',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '523512277.7961432',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ tx_pos: 2,
+ value: 546,
+ txid: '091c9f32deb2f4f3733673803f51acf050b65d8042d1561824c6cd22d14bb43b',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '996797',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ tx_pos: 2,
+ value: 546,
+ txid: 'c70408fca1a5bf48f338f7ef031e586293be6948a5bff1fbbdd4eb923ef11e59',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '0.99999999',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e1097932e5a607c100dc73fa18169be2e501e1782c7c94500742974d6353476c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681329,
+ tx_hash:
+ '08e9a7b9537e60f630eba0f339be6b97e9d8061d5fc0c4d3247226fc86574ce9',
+ tx_pos: 2,
+ value: 546,
+ txid: '08e9a7b9537e60f630eba0f339be6b97e9d8061d5fc0c4d3247226fc86574ce9',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '999997.999999994',
+ isValid: true,
+ address:
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ ],
+ },
+ parsedTxHistory: [
+ {
+ txid: '8d4c90ecf069e3a1494339724ddbb8bf28e3b38315a009ca5c49237b3ae7687a',
+ confirmations: 643,
+ height: 682107,
+ blocktime: 1618439595,
+ amountSent: 0.00002,
+ amountReceived: 0,
+ tokenTx: false,
+ outgoingTx: true,
+ destinationAddress:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ },
+ {
+ txid: '08e9a7b9537e60f630eba0f339be6b97e9d8061d5fc0c4d3247226fc86574ce9',
+ confirmations: 1421,
+ height: 681329,
+ blocktime: 1617988189,
+ amountSent: 0.00000546,
+ amountReceived: 0,
+ tokenTx: true,
+ outgoingTx: true,
+ destinationAddress:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ tokenInfo: {
+ qtySent: '1e-9',
+ qtyReceived: '0',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenName: 'eBits',
+ tokenTicker: 'XBIT',
+ },
+ },
+ {
+ txid: 'f27ff24c15b01c30d44218c6dc8706fd33cc7bc9b4b38399075f0f41d8e412af',
+ confirmations: 1558,
+ height: 681192,
+ blocktime: 1617923457,
+ amountSent: 0.00000546,
+ amountReceived: 0,
+ tokenTx: true,
+ outgoingTx: true,
+ destinationAddress:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ tokenInfo: {
+ qtySent: '5e-9',
+ qtyReceived: '0',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenName: 'eBits',
+ tokenTicker: 'XBIT',
+ },
+ },
+ {
+ txid: 'b7f8b23f5ce12842eb655239919b6142052a2fa2b2ce974a4baac36b0137f332',
+ confirmations: 1558,
+ height: 681192,
+ blocktime: 1617923457,
+ amountSent: 0.00000546,
+ amountReceived: 0,
+ tokenTx: true,
+ outgoingTx: true,
+ destinationAddress:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ tokenInfo: {
+ qtySent: '4e-9',
+ qtyReceived: '0',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenName: 'eBits',
+ tokenTicker: 'XBIT',
+ },
+ },
+ {
+ txid: '880baf5691c2b4c5a22ae4032e2004c0c54bfabf003468044a2e341846137136',
+ confirmations: 1558,
+ height: 681192,
+ blocktime: 1617923457,
+ amountSent: 0.00000546,
+ amountReceived: 0,
+ tokenTx: true,
+ outgoingTx: true,
+ destinationAddress:
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ tokenInfo: {
+ qtySent: '3e-9',
+ qtyReceived: '0',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenName: 'eBits',
+ tokenTicker: 'XBIT',
+ },
+ },
+ ],
+ },
+};
diff --git a/web/cashtab-v2/src/utils/__mocks__/mockTokenList.js b/web/cashtab-v2/src/utils/__mocks__/mockTokenList.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/__mocks__/mockTokenList.js
@@ -0,0 +1,369 @@
+export const mockTokens = [
+ {
+ info: {
+ height: 661014,
+ tx_hash:
+ 'cca1d12cb240d1529d370b2cec40b2c0230586d0b53f1c48f6dac8dff2702672',
+ tx_pos: 2,
+ value: 546,
+ txid: 'cca1d12cb240d1529d370b2cec40b2c0230586d0b53f1c48f6dac8dff2702672',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash:
+ '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '476587641.203853',
+ isValid: true,
+ address: 'bitcoincash:qpv9fx6mjdpgltygudnpw3tvmxdyzx7savhphtzswu',
+ },
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ balance: '476587644.2038557',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 661700,
+ tx_hash:
+ '854d49d29819cdb5c4d9248146ffc82771cd3a7727f25a22993456f68050503e',
+ tx_pos: 1,
+ value: 546,
+ txid: '854d49d29819cdb5c4d9248146ffc82771cd3a7727f25a22993456f68050503e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'd4ffc597cb08b8c929e464f84069b9009649c7514860f673da48b1b3eba5b56e',
+ tokenTicker: 'JoeyTest2',
+ tokenName: 'Jt2',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qpv9fx6mjdpgltygudnpw3tvmxdyzx7savhphtzswu',
+ },
+ tokenId:
+ 'd4ffc597cb08b8c929e464f84069b9009649c7514860f673da48b1b3eba5b56e',
+ balance: '1',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 661711,
+ tx_hash:
+ '28a83416798159c3c36fe1633a1c89639228f53b7b8e6552a573958efdef74b9',
+ tx_pos: 1,
+ value: 546,
+ txid: '28a83416798159c3c36fe1633a1c89639228f53b7b8e6552a573958efdef74b9',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qpv9fx6mjdpgltygudnpw3tvmxdyzx7savhphtzswu',
+ },
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ balance: '1',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 661711,
+ tx_hash:
+ 'd662e05b76bed604caf1ceb8fb9fd7ed39a5b831c35c7f2fb567c50ee95cff72',
+ tx_pos: 1,
+ value: 546,
+ txid: 'd662e05b76bed604caf1ceb8fb9fd7ed39a5b831c35c7f2fb567c50ee95cff72',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '645d9161e03ae27e5a3bb9cd256ee90341d320d13ac403229a9800b638cf4a83',
+ tokenTicker: 'ARCHON',
+ tokenName: 'Icon Worthiness',
+ tokenDocumentUrl: 'mint.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qpv9fx6mjdpgltygudnpw3tvmxdyzx7savhphtzswu',
+ },
+ tokenId:
+ '645d9161e03ae27e5a3bb9cd256ee90341d320d13ac403229a9800b638cf4a83',
+ balance: '1',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 661789,
+ tx_hash:
+ '7e782389d203e5f213b6a02041929870c1c47c967a869bf8fae2aab1f8b72a84',
+ tx_pos: 1,
+ value: 546,
+ txid: '7e782389d203e5f213b6a02041929870c1c47c967a869bf8fae2aab1f8b72a84',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '8ead21ce4b3b9e7b57607b97b65b5013496dc6e3dfdea162c08ce7265a66ebc8',
+ tokenTicker: 'IFP',
+ tokenName: 'Infrastructure Funding Proposal Token',
+ tokenDocumentUrl: 'ifp.cash',
+ tokenDocumentHash: '�gA������3�$\n��1\u0005�A-lg\b�:�O�H��S',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qpv9fx6mjdpgltygudnpw3tvmxdyzx7savhphtzswu',
+ },
+ tokenId:
+ '8ead21ce4b3b9e7b57607b97b65b5013496dc6e3dfdea162c08ce7265a66ebc8',
+ balance: '1',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 666951,
+ tx_hash:
+ 'e5a3f4357f703e0874779fb66e7555f7ac7f8e86fa3fa005e4bfcfc1115a5afe',
+ tx_pos: 1,
+ value: 546,
+ txid: 'e5a3f4357f703e0874779fb66e7555f7ac7f8e86fa3fa005e4bfcfc1115a5afe',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'eed8c50e278d02087c820f8fdc16bc0db034912b5c61d9bb315d1eaeec5d3c7b',
+ tokenTicker: 'CAMS',
+ tokenName: 'CAMS Token',
+ tokenDocumentUrl: 'https://onlycams.cc',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ tokenQty: '0.12',
+ isValid: true,
+ address: 'bitcoincash:qpv9fx6mjdpgltygudnpw3tvmxdyzx7savhphtzswu',
+ },
+ tokenId:
+ 'eed8c50e278d02087c820f8fdc16bc0db034912b5c61d9bb315d1eaeec5d3c7b',
+ balance: '0.12',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 666952,
+ tx_hash:
+ 'bd465ee1c47e697c2d952f58e03d9cade28492e7bc33490cb962a3c3fe31e77b',
+ tx_pos: 1,
+ value: 546,
+ txid: 'bd465ee1c47e697c2d952f58e03d9cade28492e7bc33490cb962a3c3fe31e77b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '7',
+ isValid: true,
+ address: 'bitcoincash:qpv9fx6mjdpgltygudnpw3tvmxdyzx7savhphtzswu',
+ },
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ balance: '11',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 667909,
+ tx_hash:
+ '5bb8f9831d616b3a859ffec4507f66bd5f2f3c057d7f5d5fa5c026216d6c2646',
+ tx_pos: 2,
+ value: 546,
+ txid: '5bb8f9831d616b3a859ffec4507f66bd5f2f3c057d7f5d5fa5c026216d6c2646',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ balance: '1',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 667909,
+ tx_hash:
+ 'd3183b663a8d67b2b558654896b95102bbe68d164de219da96273ae52de93813',
+ tx_pos: 2,
+ value: 546,
+ txid: 'd3183b663a8d67b2b558654896b95102bbe68d164de219da96273ae52de93813',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '4.004000001',
+ isValid: true,
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ balance: '1000109.789698951',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 669057,
+ tx_hash:
+ 'dd560d87bd632e40c6548021006653a150197ede13fadb5eadfa29abe4400d0e',
+ tx_pos: 2,
+ value: 546,
+ txid: 'dd560d87bd632e40c6548021006653a150197ede13fadb5eadfa29abe4400d0e',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '4',
+ isValid: true,
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ balance: '4',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 669673,
+ tx_hash:
+ 'bd8b527df1d5d3bd611a8f0ee8f14af83cb7d107fb2e140dbd2d9f4b3a86786a',
+ tx_pos: 1,
+ value: 546,
+ txid: 'bd8b527df1d5d3bd611a8f0ee8f14af83cb7d107fb2e140dbd2d9f4b3a86786a',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bfddfcfc9fb9a8d61ed74fa94b5e32ccc03305797eea461658303df5805578ef',
+ tokenTicker: 'Sending Token',
+ tokenName: 'Sending Token',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+ tokenId:
+ 'bfddfcfc9fb9a8d61ed74fa94b5e32ccc03305797eea461658303df5805578ef',
+ balance: '4e-9',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 671724,
+ tx_hash:
+ '37f63a9b1bcdc4733425dcfc3a7f3564d5095467ad7f64707fe52dbe5c1e1897',
+ tx_pos: 2,
+ value: 546,
+ txid: '37f63a9b1bcdc4733425dcfc3a7f3564d5095467ad7f64707fe52dbe5c1e1897',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'acba1d7f354c6d4d001eb99d31de174e5cea8a31d692afd6e7eb8474ad541f55',
+ tokenTicker: 'CTB',
+ tokenName: 'CashTabBits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '90.000000001',
+ isValid: true,
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+ tokenId:
+ 'acba1d7f354c6d4d001eb99d31de174e5cea8a31d692afd6e7eb8474ad541f55',
+ balance: '90.000000001',
+ hasBaton: false,
+ },
+ {
+ info: {
+ height: 0,
+ tx_hash:
+ '618d0dd8c0c5fa5a34c6515c865dd72bb76f8311cd6ee9aef153bab20dabc0e6',
+ tx_pos: 1,
+ value: 546,
+ txid: '618d0dd8c0c5fa5a34c6515c865dd72bb76f8311cd6ee9aef153bab20dabc0e6',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '50d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e',
+ tokenTicker: 'TBC',
+ tokenName: 'tabcash',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '100',
+ isValid: true,
+ address: 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ },
+ tokenId:
+ '50d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e',
+ balance: '100',
+ hasBaton: false,
+ },
+];
diff --git a/web/cashtab-v2/src/utils/__mocks__/mockTokenStats.js b/web/cashtab-v2/src/utils/__mocks__/mockTokenStats.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/__mocks__/mockTokenStats.js
@@ -0,0 +1,71 @@
+// @generated
+
+export const stStatsValid = {
+ decimals: 0,
+ timestamp: '2020-03-11 09:42:06',
+ versionType: 1,
+ documentUri: 'developer.bitcoin.com',
+ symbol: 'ST',
+ name: 'ST',
+ containsBaton: true,
+ id: 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ documentHash: null,
+ initialTokenQty: 399,
+ blockCreated: 625949,
+ timestampUnix: 1583919726,
+ totalMinted: 100113086,
+ totalBurned: 998711,
+ circulatingSupply: 99113976,
+};
+
+export const noCovidStatsValid = {
+ decimals: 0,
+ timestamp: '2021-04-01 19:16:56',
+ versionType: 1,
+ documentUri:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ symbol: 'NOCOVID',
+ name: 'Covid19 Lifetime Immunity',
+ containsBaton: true,
+ id: '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ documentHash: null,
+ initialTokenQty: 1000000,
+ blockCreated: 680063,
+ timestampUnix: 1617304616,
+ totalMinted: 2000000,
+ totalBurned: 0,
+ circulatingSupply: 1000000,
+};
+export const noCovidStatsInvalid = {
+ decimals: 0,
+ timestamp: '2021-04-01 19:16:56',
+ versionType: 1,
+ symbol: 'NOCOVID',
+ name: 'Covid19 Lifetime Immunity',
+ containsBaton: true,
+ id: '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ documentHash: null,
+ initialTokenQty: 1000000,
+ blockCreated: 680063,
+ timestampUnix: 1617304616,
+ totalMinted: 2000000,
+ totalBurned: 0,
+ circulatingSupply: 1000000,
+};
+export const cGenStatsValid = {
+ decimals: 9,
+ timestamp: '2021-05-03 22:56:24',
+ versionType: 1,
+ documentUri: 'https://boomertakes.com/',
+ symbol: 'CGEN',
+ name: 'Cashtab Genesis',
+ containsBaton: false,
+ id: '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ documentHash: null,
+ initialTokenQty: 1000000,
+ blockCreated: 684837,
+ timestampUnix: 1620082584,
+ totalMinted: 1000000,
+ totalBurned: 0,
+ circulatingSupply: 1000000,
+};
diff --git a/web/cashtab-v2/src/utils/__mocks__/mockXecAirdropRecipients.js b/web/cashtab-v2/src/utils/__mocks__/mockXecAirdropRecipients.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/__mocks__/mockXecAirdropRecipients.js
@@ -0,0 +1,27 @@
+export const validXecAirdropList =
+ 'ecash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dyguh7zsvk,7\n' +
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,67\n' +
+ 'ecash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wyz0v403dj,4376\n' +
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,673728\n' +
+ 'ecash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhckq4zj9s6,23673\n';
+
+export const invalidXecAirdropList =
+ 'ecash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dyguh7zsvk,7\n' +
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,3\n' +
+ 'ecash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wyz0v403dj,4376\n' +
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,673728\n' +
+ 'ecash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhckq4zj9s6,23673\n';
+
+export const invalidXecAirdropListMultipleInvalidValues =
+ 'ecash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dyguh7zsvk,7\n' +
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,3,3,4\n' +
+ 'ecash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wyz0v403dj,4,1,2\n' +
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,673728\n' +
+ 'ecash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhckq4zj9s6,23673\n';
+
+export const invalidXecAirdropListMultipleValidValues =
+ 'ecash:qrqgwxnaxlfagezvr2zj4s9yee6rrs96dyguh7zsvk,7\n' +
+ 'ecash:qzsha6zk9m0f3hlfe5q007zdwnzvn3vwuuzel2lfzv,8,9,44\n' +
+ 'ecash:qqlkyzmeupf7q8t2ttf2u8xgyk286pg4wyz0v403dj,4376,43,1212\n' +
+ 'ecash:qz2taa43tljkvnvkeqv9pyx337hmg0zclqfqjrqst4,673728\n' +
+ 'ecash:qp0hlj26nwjpk9c3f0umjz7qmwpzfh0fhckq4zj9s6,23673\n';
diff --git a/web/cashtab-v2/src/utils/__mocks__/nullUtxoMocks.js b/web/cashtab-v2/src/utils/__mocks__/nullUtxoMocks.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/__mocks__/nullUtxoMocks.js
@@ -0,0 +1,2868 @@
+// @generated
+export const mockTxDataResults = [
+ {
+ details: {
+ blockhash:
+ '0000000000000000058bb64eb2169904f91f241d03efdc3347b0a915852772e9',
+ blocktime: 1634592652,
+ confirmations: 5310,
+ hash: '89c50a30cc82c65781969c0e6f132e12b0a46ff9ce0ca33d51e37596d89846b3',
+ hex: '02000000049c0affdbc46bcc02bd4a84b2bd412e2c75c2564c3805b66c4dc687fa6d77d437000000006a47304402202f86e3f312feaca6da998856115435cdf201412d1173cd2e9ad9ec6b842d43eb0220361a0b26497f902ca946e5c7df35a78626aa696842de77aa4767c8adac3976ec4121023b8829bbe4f7be1a0996042035d7028355e28e50d1edf9fb5605cbb550b21c31ffffffff2a810224dbdd15cb878731fc379ab8b1ef3ad6f5ab2819f1169df103328a158c000000006a47304402201ecbe21324c0190b9fdd5671c9731864a630e39c61cb8362b7aea1283c29eb1202204bd1e497ace6e70e40d8c05067a2a3ce9dfd3772b9bf17ccd8a988a46deb5bab4121023b8829bbe4f7be1a0996042035d7028355e28e50d1edf9fb5605cbb550b21c31ffffffff5a4c1931dbbf82086bb7ac7202afffcf46d825bc4645735f3d37d1df1a03adff000000006b483045022100b32f67bd2d9acec5b9a0f36c8ac313ddd4742d9ed79aa6b6746b81a686364cef022026758923f3a307c0e5d7e16cc769f221e72c9410159e22830383b5286fc249134121023b8829bbe4f7be1a0996042035d7028355e28e50d1edf9fb5605cbb550b21c31ffffffff5410d0ac29627410af24701dd43d0cafc6bc73c38031cbf1036df51b9cf092f7010000006a47304402202fbd343116e9269fbe9e20f9673165090139ef128d7b2f4306d107c8c14a342e022033ca9a1fc880c02fa8d0518ebd8f8cde81a3e6130085121a718d2bbba7f5ed244121023b8829bbe4f7be1a0996042035d7028355e28e50d1edf9fb5605cbb550b21c31ffffffff030000000000000000026a00e0150000000000001976a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88ac6f190c00000000001976a9143a358c608cc24107008380abe21f82c5c89f603a88ac00000000',
+ locktime: 0,
+ size: 678,
+ time: 1634592652,
+ txid: '89c50a30cc82c65781969c0e6f132e12b0a46ff9ce0ca33d51e37596d89846b3',
+ version: 2,
+ vin: [
+ {
+ scriptSig: {
+ asm: '304402202f86e3f312feaca6da998856115435cdf201412d1173cd2e9ad9ec6b842d43eb0220361a0b26497f902ca946e5c7df35a78626aa696842de77aa4767c8adac3976ec[ALL|FORKID] 023b8829bbe4f7be1a0996042035d7028355e28e50d1edf9fb5605cbb550b21c31',
+ hex: '47304402202f86e3f312feaca6da998856115435cdf201412d1173cd2e9ad9ec6b842d43eb0220361a0b26497f902ca946e5c7df35a78626aa696842de77aa4767c8adac3976ec4121023b8829bbe4f7be1a0996042035d7028355e28e50d1edf9fb5605cbb550b21c31',
+ },
+ sequence: 4294967295,
+ txid: '37d4776dfa87c64d6cb605384c56c2752c2e41bdb2844abd02cc6bc4dbff0a9c',
+ vout: 0,
+ },
+ {
+ scriptSig: {
+ asm: '304402201ecbe21324c0190b9fdd5671c9731864a630e39c61cb8362b7aea1283c29eb1202204bd1e497ace6e70e40d8c05067a2a3ce9dfd3772b9bf17ccd8a988a46deb5bab[ALL|FORKID] 023b8829bbe4f7be1a0996042035d7028355e28e50d1edf9fb5605cbb550b21c31',
+ hex: '47304402201ecbe21324c0190b9fdd5671c9731864a630e39c61cb8362b7aea1283c29eb1202204bd1e497ace6e70e40d8c05067a2a3ce9dfd3772b9bf17ccd8a988a46deb5bab4121023b8829bbe4f7be1a0996042035d7028355e28e50d1edf9fb5605cbb550b21c31',
+ },
+ sequence: 4294967295,
+ txid: '8c158a3203f19d16f11928abf5d63aefb1b89a37fc318787cb15dddb2402812a',
+ vout: 0,
+ },
+ {
+ scriptSig: {
+ asm: '3045022100b32f67bd2d9acec5b9a0f36c8ac313ddd4742d9ed79aa6b6746b81a686364cef022026758923f3a307c0e5d7e16cc769f221e72c9410159e22830383b5286fc24913[ALL|FORKID] 023b8829bbe4f7be1a0996042035d7028355e28e50d1edf9fb5605cbb550b21c31',
+ hex: '483045022100b32f67bd2d9acec5b9a0f36c8ac313ddd4742d9ed79aa6b6746b81a686364cef022026758923f3a307c0e5d7e16cc769f221e72c9410159e22830383b5286fc249134121023b8829bbe4f7be1a0996042035d7028355e28e50d1edf9fb5605cbb550b21c31',
+ },
+ sequence: 4294967295,
+ txid: 'ffad031adfd1373d5f734546bc25d846cfffaf0272acb76b0882bfdb31194c5a',
+ vout: 0,
+ },
+ {
+ scriptSig: {
+ asm: '304402202fbd343116e9269fbe9e20f9673165090139ef128d7b2f4306d107c8c14a342e022033ca9a1fc880c02fa8d0518ebd8f8cde81a3e6130085121a718d2bbba7f5ed24[ALL|FORKID] 023b8829bbe4f7be1a0996042035d7028355e28e50d1edf9fb5605cbb550b21c31',
+ hex: '47304402202fbd343116e9269fbe9e20f9673165090139ef128d7b2f4306d107c8c14a342e022033ca9a1fc880c02fa8d0518ebd8f8cde81a3e6130085121a718d2bbba7f5ed244121023b8829bbe4f7be1a0996042035d7028355e28e50d1edf9fb5605cbb550b21c31',
+ },
+ sequence: 4294967295,
+ txid: 'f792f09c1bf56d03f1cb3180c373bcc6af0c3dd41d7024af10746229acd01054',
+ vout: 1,
+ },
+ ],
+ vout: [
+ {
+ n: 0,
+ scriptPubKey: {
+ asm: 'OP_RETURN 0',
+ hex: '6a00',
+ type: 'nulldata',
+ },
+ value: 0,
+ },
+ {
+ n: 1,
+ scriptPubKey: {
+ addresses: [
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ ],
+ asm: 'OP_DUP OP_HASH160 95e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ },
+ value: 0.000056,
+ },
+ {
+ n: 2,
+ scriptPubKey: {
+ addresses: [
+ 'bitcoincash:qqartrrq3npyzpcqswq2hcslstzu38mq8gvgtuqfpf',
+ ],
+ asm: 'OP_DUP OP_HASH160 3a358c608cc24107008380abe21f82c5c89f603a OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a9143a358c608cc24107008380abe21f82c5c89f603a88ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ },
+ value: 0.00792943,
+ },
+ ],
+ },
+ txid: '89c50a30cc82c65781969c0e6f132e12b0a46ff9ce0ca33d51e37596d89846b3',
+ },
+ {
+ details: {
+ blockhash:
+ '0000000000000000075fc77d4e0f1cd12a48e53c0117baa2ef525e7e2e46627d',
+ blocktime: 1635461347,
+ confirmations: 3878,
+ hash: '97954e12814be22ff873d1428e58a3eacc5fadef90b529b62134f407f629d5d9',
+ hex: '0200000001ec02ae242978974321d385c783ca2d1d7c3a2bc203608219825c3b48894ed630020000006b483045022100eafccfb470f3d38fcc95ca711242eae38212230f5bbbe30fe344e8f01199252a0220444c4ab6809d3dd2fc4896c5b9ce3c1bb58cbfdd21300c98b2a90fb2f5f04fbc412102c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795ffffffff030000000000000000036a0131800c0000000000001976a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88aceaf6d800000000001976a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac00000000',
+ locktime: 0,
+ size: 238,
+ time: 1635461347,
+ txid: '97954e12814be22ff873d1428e58a3eacc5fadef90b529b62134f407f629d5d9',
+ version: 2,
+ vin: [
+ {
+ scriptSig: {
+ asm: '3045022100eafccfb470f3d38fcc95ca711242eae38212230f5bbbe30fe344e8f01199252a0220444c4ab6809d3dd2fc4896c5b9ce3c1bb58cbfdd21300c98b2a90fb2f5f04fbc[ALL|FORKID] 02c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+ hex: '483045022100eafccfb470f3d38fcc95ca711242eae38212230f5bbbe30fe344e8f01199252a0220444c4ab6809d3dd2fc4896c5b9ce3c1bb58cbfdd21300c98b2a90fb2f5f04fbc412102c237f49dd4c812f27b09d69d4c8a4da12744fda8ad63ce151fed2a3f41fd8795',
+ },
+ sequence: 4294967295,
+ txid: '30d64e89483b5c8219826003c22b3a7c1d2dca83c785d3214397782924ae02ec',
+ vout: 2,
+ },
+ ],
+ vout: [
+ {
+ n: 0,
+ scriptPubKey: {
+ asm: 'OP_RETURN 49',
+ hex: '6a0131',
+ type: 'nulldata',
+ },
+ value: 0,
+ },
+ {
+ n: 1,
+ scriptPubKey: {
+ addresses: [
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ ],
+ asm: 'OP_DUP OP_HASH160 95e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ },
+ value: 0.000032,
+ },
+ {
+ n: 2,
+ scriptPubKey: {
+ addresses: [
+ 'bitcoincash:qpmytrdsakt0axrrlswvaj069nat3p9s7ct4lsf8k9',
+ ],
+ asm: 'OP_DUP OP_HASH160 76458db0ed96fe9863fc1ccec9fa2cfab884b0f6 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a91476458db0ed96fe9863fc1ccec9fa2cfab884b0f688ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ },
+ value: 0.14218986,
+ },
+ ],
+ },
+ txid: '97954e12814be22ff873d1428e58a3eacc5fadef90b529b62134f407f629d5d9',
+ },
+];
+
+export const mockTxDataResultsWithEtoken = [
+ {
+ details: {
+ blockhash:
+ '000000000000000022f3b95ea9544c77938f232601b87a82b5c375b81e0123ae',
+ blocktime: 1607034208,
+ confirmations: 51994,
+ hash: 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ hex: '0200000001d5e74e1e3c27ac86204285fb46b2e0adac65e51b26a54ea7f76f754cb261439b020000006a4730440220033fd897a0c6ae88eac326562de260264e3197b336508b584d81f244e5a47b7a022013f78b1f954eab4027e377745315f9c35811ec2802fc4d7c4280312aa9e7eee94121034509251caa5f01e2787c436949eb94d71dcc451bcde5791ae5b7109255f5f0a3ffffffff040000000000000000466a04534c500001010747454e45534953035442530854657374426974731968747470733a2f2f74686563727970746f6775792e636f6d2f4c0001090102088ac7230489e8000022020000000000001976a914b8d9512d2adf8b4e70c45c26b6b00d75c28eaa9688ac22020000000000001976a914b8d9512d2adf8b4e70c45c26b6b00d75c28eaa9688ace6680100000000001976a914b8d9512d2adf8b4e70c45c26b6b00d75c28eaa9688ac00000000',
+ locktime: 0,
+ size: 338,
+ time: 1607034208,
+ txid: 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ version: 2,
+ vin: [
+ {
+ scriptSig: {
+ asm: '30440220033fd897a0c6ae88eac326562de260264e3197b336508b584d81f244e5a47b7a022013f78b1f954eab4027e377745315f9c35811ec2802fc4d7c4280312aa9e7eee9[ALL|FORKID] 034509251caa5f01e2787c436949eb94d71dcc451bcde5791ae5b7109255f5f0a3',
+ hex: '4730440220033fd897a0c6ae88eac326562de260264e3197b336508b584d81f244e5a47b7a022013f78b1f954eab4027e377745315f9c35811ec2802fc4d7c4280312aa9e7eee94121034509251caa5f01e2787c436949eb94d71dcc451bcde5791ae5b7109255f5f0a3',
+ },
+ sequence: 4294967295,
+ txid: '9b4361b24c756ff7a74ea5261be565acade0b246fb85422086ac273c1e4ee7d5',
+ vout: 2,
+ },
+ ],
+ vout: [
+ {
+ n: 0,
+ scriptPubKey: {
+ asm: 'OP_RETURN 5262419 1 47454e45534953 5456468 5465737442697473 68747470733a2f2f74686563727970746f6775792e636f6d2f 0 9 2 8ac7230489e80000',
+ hex: '6a04534c500001010747454e45534953035442530854657374426974731968747470733a2f2f74686563727970746f6775792e636f6d2f4c0001090102088ac7230489e80000',
+ type: 'nulldata',
+ },
+ value: 0,
+ },
+ {
+ n: 1,
+ scriptPubKey: {
+ addresses: [
+ 'bitcoincash:qzudj5fd9t0cknnsc3wzdd4sp46u9r42jcnqnwfss0',
+ ],
+ asm: 'OP_DUP OP_HASH160 b8d9512d2adf8b4e70c45c26b6b00d75c28eaa96 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a914b8d9512d2adf8b4e70c45c26b6b00d75c28eaa9688ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ },
+ value: 0.00000546,
+ },
+ {
+ n: 2,
+ scriptPubKey: {
+ addresses: [
+ 'bitcoincash:qzudj5fd9t0cknnsc3wzdd4sp46u9r42jcnqnwfss0',
+ ],
+ asm: 'OP_DUP OP_HASH160 b8d9512d2adf8b4e70c45c26b6b00d75c28eaa96 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a914b8d9512d2adf8b4e70c45c26b6b00d75c28eaa9688ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ },
+ value: 0.00000546,
+ },
+ {
+ n: 3,
+ scriptPubKey: {
+ addresses: [
+ 'bitcoincash:qzudj5fd9t0cknnsc3wzdd4sp46u9r42jcnqnwfss0',
+ ],
+ asm: 'OP_DUP OP_HASH160 b8d9512d2adf8b4e70c45c26b6b00d75c28eaa96 OP_EQUALVERIFY OP_CHECKSIG',
+ hex: '76a914b8d9512d2adf8b4e70c45c26b6b00d75c28eaa9688ac',
+ reqSigs: 1,
+ type: 'pubkeyhash',
+ },
+ value: 0.0009239,
+ },
+ ],
+ },
+ },
+];
+
+export const mockNonEtokenUtxos = [
+ '89c50a30cc82c65781969c0e6f132e12b0a46ff9ce0ca33d51e37596d89846b3',
+ '97954e12814be22ff873d1428e58a3eacc5fadef90b529b62134f407f629d5d9',
+];
+
+export const mockHydratedUtxosWithNullValues = [
+ {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ txid: '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ tx_pos: 1,
+ value: 546,
+ txid: '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '9897999885.21030105',
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ tx_pos: 1,
+ value: 546,
+ txid: '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '308.87654321',
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ txid: 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 685181,
+ tx_hash:
+ '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ tx_pos: 1,
+ value: 546,
+ txid: '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '50d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e',
+ tokenTicker: 'TBC',
+ tokenName: 'tabcash',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 686546,
+ tx_hash:
+ 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ tx_pos: 1,
+ value: 546,
+ txid: 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 687185,
+ tx_hash:
+ 'bee011e2d220ef8d785b19f5c3a469d1079ede74862ac192885582dd466c81dc',
+ tx_pos: 2,
+ value: 546,
+ txid: 'bee011e2d220ef8d785b19f5c3a469d1079ede74862ac192885582dd466c81dc',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash: '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '523512275.7961432',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 687240,
+ tx_hash:
+ 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ tx_pos: 2,
+ value: 546,
+ txid: 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '0.99999999',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 688194,
+ tx_hash:
+ '3de671a7107d3803d78f7f4a4e5c794d0903a8d28d16076445c084943c1e2db8',
+ tx_pos: 1,
+ value: 546,
+ txid: '3de671a7107d3803d78f7f4a4e5c794d0903a8d28d16076445c084943c1e2db8',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '22.22',
+ tokenId:
+ '3de671a7107d3803d78f7f4a4e5c794d0903a8d28d16076445c084943c1e2db8',
+ tokenTicker: 'CLB',
+ tokenName: 'Cashtab Local Beta',
+ tokenDocumentUrl: 'boomertakes.com',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 688449,
+ tx_hash:
+ 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'e4e1a2fb071fa71ca727e08ed1d8ea52a9531c79d1e5f1ebf483c66b71a8621c',
+ tokenTicker: 'CPA',
+ tokenName: 'Cashtab Prod Alpha',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '80',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 688495,
+ tx_hash:
+ '666c4318d1f7fef5f2c698262492c519018d4e9130f95d05f6be9f0fb7149e96',
+ tx_pos: 1,
+ value: 546,
+ txid: '666c4318d1f7fef5f2c698262492c519018d4e9130f95d05f6be9f0fb7149e96',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '100',
+ tokenId:
+ '666c4318d1f7fef5f2c698262492c519018d4e9130f95d05f6be9f0fb7149e96',
+ tokenTicker: 'CPG',
+ tokenName: 'Cashtab Prod Gamma',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 688495,
+ tx_hash:
+ '979f7741bb99ef43d7cf55ac5f070408fcb95dfce5818eb44f49e5b759a36d11',
+ tx_pos: 2,
+ value: 546,
+ txid: '979f7741bb99ef43d7cf55ac5f070408fcb95dfce5818eb44f49e5b759a36d11',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '157e0cdef5d5c51bdea00eac9ab821d809bb9d03cf98da85833614bedb129be6',
+ tokenTicker: 'CLNSP',
+ tokenName: 'ComponentLongNameSpeedLoad',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '99',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 691329,
+ tx_hash:
+ '8d38f2f805ed3f4089cd28cd89ca279628a9fa933b04fd4820d14e66fc4d4ed5',
+ tx_pos: 2,
+ value: 546,
+ txid: '8d38f2f805ed3f4089cd28cd89ca279628a9fa933b04fd4820d14e66fc4d4ed5',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'ccf5fe5a387559c8ab9efdeb0c0ef1b444e677298cfddf07671245ce3cb3c79f',
+ tokenTicker: 'XGB',
+ tokenName: 'Garmonbozia',
+ tokenDocumentUrl: 'https://twinpeaks.fandom.com/wiki/Garmonbozia',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '490',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ tx_pos: 1,
+ value: 546,
+ txid: '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '0.12',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ tx_pos: 1,
+ value: 546,
+ txid: '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '0.12',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 693502,
+ tx_hash:
+ '912c2a87242e855c045814a58a9c4d279251918eecc7f73be107817047890f68',
+ tx_pos: 1,
+ value: 546,
+ txid: '912c2a87242e855c045814a58a9c4d279251918eecc7f73be107817047890f68',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1185eebdde038a25050a3dbb66e2d5332305d1d4a4febab31f6e31bc49baac61',
+ tokenTicker: 'BETA',
+ tokenName: 'BETA',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ tokenQty: '100',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 693606,
+ tx_hash:
+ '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ tx_pos: 2,
+ value: 546,
+ txid: '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '45f0ff5cae7e89da6b96c26c8c48a959214c5f0e983e78d0925f8956ca8848c6',
+ tokenTicker: 'CMA',
+ tokenName: 'CashtabMintAlpha',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 5,
+ tokenType: 1,
+ tokenQty: '55',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 699216,
+ tx_hash:
+ '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ tx_pos: 2,
+ value: 546,
+ txid: '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '0916e71779c9de7ee125741d3f5ab01f556356dbc86fd327a24f1e9e22ebc917',
+ tokenTicker: 'CTL2',
+ tokenName: 'Cashtab Token Launch Launch Token v2',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1899',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 699359,
+ tx_hash:
+ 'b99cb29050779d4f185c3c31c22e664436966314c8b260075b38bbb453180603',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b99cb29050779d4f185c3c31c22e664436966314c8b260075b38bbb453180603',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '999900',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700185,
+ tx_hash:
+ '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ tx_pos: 2,
+ value: 546,
+ txid: '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '22f4ba40312ea3e90e1bfa88d2aa694c271d2e07361907b6eb5568873ffa62bf',
+ tokenTicker: 'CLA',
+ tokenName: 'Cashtab Local Alpha',
+ tokenDocumentUrl: 'boomertakes.com',
+ tokenDocumentHash: '',
+ decimals: 5,
+ tokenType: 1,
+ tokenQty: '55',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ tx_pos: 2,
+ value: 546,
+ txid: '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '77ec4036ef8546ac46df6d3a5374e961216f92624627eaeef5d2e1a253df9fc6',
+ tokenTicker: 'CTLv3',
+ tokenName: 'Cashtab Token Launch Launch Token v3',
+ tokenDocumentUrl: 'coinex.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '267',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tx_pos: 1,
+ value: 546,
+ txid: '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '1000000000',
+ tokenId:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tokenTicker: 'CBB',
+ tokenName: 'Cashtab Beta Bits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ tx_pos: 2,
+ value: 546,
+ txid: 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '999898',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700572,
+ tx_hash:
+ '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ tx_pos: 2,
+ value: 546,
+ txid: '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '990',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700572,
+ tx_hash:
+ '482d635c37bac5f62d7a191c448471f91dab4c151c8a4f38d362ff2fc93e5e24',
+ tx_pos: 2,
+ value: 546,
+ txid: '482d635c37bac5f62d7a191c448471f91dab4c151c8a4f38d362ff2fc93e5e24',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash: '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '0.2038568',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700677,
+ tx_hash:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '333',
+ tokenId:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tokenTicker: 'SA',
+ tokenName: 'Spinner Alpha',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700915,
+ tx_hash:
+ 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ tx_pos: 2,
+ value: 546,
+ txid: 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '999975',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ tx_pos: 1,
+ value: 546,
+ txid: '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '3',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ tx_pos: 1,
+ value: 546,
+ txid: '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ tx_pos: 1,
+ value: 546,
+ txid: 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ tx_pos: 1,
+ value: 546,
+ txid: '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ tx_pos: 1,
+ value: 546,
+ txid: '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701191,
+ tx_hash:
+ 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701194,
+ tx_hash:
+ 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701208,
+ tx_hash:
+ '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ tx_pos: 1,
+ value: 546,
+ txid: '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ tx_pos: 1,
+ value: 546,
+ txid: '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '0.789698951',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ tx_pos: 1,
+ value: 546,
+ txid: '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701221,
+ tx_hash:
+ '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ tx_pos: 1,
+ value: 546,
+ txid: '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701223,
+ tx_hash:
+ '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ tx_pos: 2,
+ value: 546,
+ txid: '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '9e9738e9ac3ff202736bf7775f875ebae6f812650df577a947c20c52475e43da',
+ tokenTicker: 'CUTT',
+ tokenName: 'Cashtab Unit Test Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ tokenQty: '90',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709251,
+ tx_hash:
+ '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ tx_pos: 1,
+ value: 546,
+ txid: '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'f36e1b3d9a2aaf74f132fef3834e9743b945a667a4204e761b85f2e7b65fd41a',
+ tokenTicker: 'POW',
+ tokenName: 'ProofofWriting.com Token',
+ tokenDocumentUrl: 'https://www.proofofwriting.com/26',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1000',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709259,
+ tx_hash:
+ '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ tx_pos: 1,
+ value: 546,
+ txid: '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709668,
+ tx_hash:
+ 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709669,
+ tx_hash:
+ '89c50a30cc82c65781969c0e6f132e12b0a46ff9ce0ca33d51e37596d89846b3',
+ tx_pos: 1,
+ value: 5600,
+ txid: '89c50a30cc82c65781969c0e6f132e12b0a46ff9ce0ca33d51e37596d89846b3',
+ vout: 1,
+ isValid: null,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 710065,
+ tx_hash:
+ '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ tx_pos: 1,
+ value: 546,
+ txid: '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '9e9738e9ac3ff202736bf7775f875ebae6f812650df577a947c20c52475e43da',
+ tokenTicker: 'CUTT',
+ tokenName: 'Cashtab Unit Test Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 711088,
+ tx_hash:
+ '982ca55c84510e4184ff5a6e7fc310a1de7833e8c617b46014f962ed89bf0f57',
+ tx_pos: 2,
+ value: 546,
+ txid: '982ca55c84510e4184ff5a6e7fc310a1de7833e8c617b46014f962ed89bf0f57',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '98183238638ecb4ddc365056e22de0e8a05448c1e6084bae247fae5a74ad4f48',
+ tokenTicker: 'DVV',
+ tokenName: 'Delta Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '999998946',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 711101,
+ tx_hash:
+ '97954e12814be22ff873d1428e58a3eacc5fadef90b529b62134f407f629d5d9',
+ tx_pos: 1,
+ value: 3200,
+ txid: '97954e12814be22ff873d1428e58a3eacc5fadef90b529b62134f407f629d5d9',
+ vout: 1,
+ isValid: null,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 711227,
+ tx_hash:
+ '5a12af320209b76ff7f827d16b914e7acd8087fb9912c0d526abb1eab6780447',
+ tx_pos: 2,
+ value: 546,
+ txid: '5a12af320209b76ff7f827d16b914e7acd8087fb9912c0d526abb1eab6780447',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '996569',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 711227,
+ tx_hash:
+ 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '98183238638ecb4ddc365056e22de0e8a05448c1e6084bae247fae5a74ad4f48',
+ tokenTicker: 'DVV',
+ tokenName: 'Delta Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '17',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714118,
+ tx_hash:
+ '4832776d00ad5ad7c9bcd9e8ceca9d35ca3302873750139497ec5e215a10339f',
+ tx_pos: 1,
+ value: 3300,
+ txid: '4832776d00ad5ad7c9bcd9e8ceca9d35ca3302873750139497ec5e215a10339f',
+ vout: 1,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714695,
+ tx_hash:
+ 'cfdc270ab82c001eaddd357f773a8dfe61cfdd891df66b39fee060f34f7a4015',
+ tx_pos: 1,
+ value: 546,
+ txid: 'cfdc270ab82c001eaddd357f773a8dfe61cfdd891df66b39fee060f34f7a4015',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '6969',
+ tokenId:
+ 'cfdc270ab82c001eaddd357f773a8dfe61cfdd891df66b39fee060f34f7a4015',
+ tokenTicker: 'SCOOG',
+ tokenName: 'Scoogi Alpha',
+ tokenDocumentUrl: 'cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714695,
+ tx_hash:
+ 'cfdc270ab82c001eaddd357f773a8dfe61cfdd891df66b39fee060f34f7a4015',
+ tx_pos: 2,
+ value: 228098498,
+ txid: 'cfdc270ab82c001eaddd357f773a8dfe61cfdd891df66b39fee060f34f7a4015',
+ vout: 2,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714977,
+ tx_hash:
+ '25780d22441e192f1aebec5c8d650910a91adf6db88f21de6c91946d4e0b294c',
+ tx_pos: 0,
+ value: 1500,
+ txid: '25780d22441e192f1aebec5c8d650910a91adf6db88f21de6c91946d4e0b294c',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714977,
+ tx_hash:
+ '2d1f58dbfee240ae85ef01ef9e2ccfd9fb1accbd6dd9ee1c41bc32b98b584bf5',
+ tx_pos: 0,
+ value: 1600,
+ txid: '2d1f58dbfee240ae85ef01ef9e2ccfd9fb1accbd6dd9ee1c41bc32b98b584bf5',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714977,
+ tx_hash:
+ '820d8a69624584d68cab32312b71b4f26b0532cc9d4fc55b4c011a1c88c924e9',
+ tx_pos: 0,
+ value: 1801,
+ txid: '820d8a69624584d68cab32312b71b4f26b0532cc9d4fc55b4c011a1c88c924e9',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714977,
+ tx_hash:
+ '9de68ff597db32a21fd428ecea179dd7a7a35599fb6851394f8f9a8d1e873887',
+ tx_pos: 0,
+ value: 1600,
+ txid: '9de68ff597db32a21fd428ecea179dd7a7a35599fb6851394f8f9a8d1e873887',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714977,
+ tx_hash:
+ 'b962f066438786ea148ce3fb4dfb1cb0b78b24cad9e06aac7cb47a191e36882e',
+ tx_pos: 0,
+ value: 1700,
+ txid: 'b962f066438786ea148ce3fb4dfb1cb0b78b24cad9e06aac7cb47a191e36882e',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714977,
+ tx_hash:
+ 'bd1e1cbee618ed463e7501ae650cb9a947a96c2de737c64ee223b14901eb2777',
+ tx_pos: 0,
+ value: 1800,
+ txid: 'bd1e1cbee618ed463e7501ae650cb9a947a96c2de737c64ee223b14901eb2777',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714978,
+ tx_hash:
+ '2b2307a0295cefa5d1813fe22a606624b068a84c8c16f4574a32f3455c58e318',
+ tx_pos: 0,
+ value: 2500,
+ txid: '2b2307a0295cefa5d1813fe22a606624b068a84c8c16f4574a32f3455c58e318',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714978,
+ tx_hash:
+ '2d0f18e6da2e57549802046fedcb4397226b7f0d36ecc050660a5654f8ab7129',
+ tx_pos: 0,
+ value: 1803,
+ txid: '2d0f18e6da2e57549802046fedcb4397226b7f0d36ecc050660a5654f8ab7129',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714978,
+ tx_hash:
+ '903392499c20bc3fa30fe947d1cd2f48d015742cc266c3af5eb644366fac6e3b',
+ tx_pos: 0,
+ value: 2300,
+ txid: '903392499c20bc3fa30fe947d1cd2f48d015742cc266c3af5eb644366fac6e3b',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714978,
+ tx_hash:
+ '903f53502098bdc55a90e8841adf85eb2728a7a99e6cae5bd3ba7b248d26e793',
+ tx_pos: 0,
+ value: 2200,
+ txid: '903f53502098bdc55a90e8841adf85eb2728a7a99e6cae5bd3ba7b248d26e793',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714978,
+ tx_hash:
+ '9c513ff48d13f90b0cea833a29c64362934efd296a6a41ff33ba40f603bf9296',
+ tx_pos: 0,
+ value: 1802,
+ txid: '9c513ff48d13f90b0cea833a29c64362934efd296a6a41ff33ba40f603bf9296',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714978,
+ tx_hash:
+ 'dc2ebbb1f46ce7a4484e784c7677c82844c025ee5f15491256a0fe7452a9f60c',
+ tx_pos: 0,
+ value: 2400,
+ txid: 'dc2ebbb1f46ce7a4484e784c7677c82844c025ee5f15491256a0fe7452a9f60c',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 0,
+ tx_hash:
+ '77cbd64cfe525854f83c203d22bd5e9e4c69df6f636be5a53170c3d4e128e376',
+ tx_pos: 0,
+ value: 2600,
+ txid: '77cbd64cfe525854f83c203d22bd5e9e4c69df6f636be5a53170c3d4e128e376',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+];
+
+export const mockHydratedUtxosWithNullValuesSetToFalse = [
+ {
+ height: 680782,
+ tx_hash:
+ '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ tx_pos: 1,
+ value: 546,
+ txid: '525457276f1b6984170c9b35a8312d4988fce495723eabadd2afcdb3b872b2f1',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bf24d955f59351e738ecd905966606a6837e478e1982943d724eab10caad82fd',
+ tokenTicker: 'ST',
+ tokenName: 'ST',
+ tokenDocumentUrl: 'developer.bitcoin.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ tx_pos: 1,
+ value: 546,
+ txid: '28f061fee068d3b9cb578141bac3d4d9ec4eccebec680464bf0aafaac414811f',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '9897999885.21030105',
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ tx_pos: 1,
+ value: 546,
+ txid: '5fa3ffccea55c968beb7d214c563c92336ce2bbccbb714ba819848a7f7060bdb',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '308.87654321',
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 680784,
+ tx_hash:
+ 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ tx_pos: 1,
+ value: 546,
+ txid: 'daa98a872b7d88fefd2257b006db001ef82a601f3943b92e0c753076598a7b75',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1e-9',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681190,
+ tx_hash:
+ 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e9dca9aa954131a0004325fff11dfddcd6e5843c468116cf4d38cb264032cdc0',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1f6a65e7a4bde92c0a012de2bcf4007034504a765377cdf08a3ee01d1eaa6901',
+ tokenTicker: '🍔',
+ tokenName: 'Burger',
+ tokenDocumentUrl:
+ 'https://c4.wallpaperflare.com/wallpaper/58/564/863/giant-hamburger-wallpaper-preview.jpg',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 681191,
+ tx_hash:
+ 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b35c502f388cdfbdd6841b7a73e973149b3c8deca76295a3e4665939e0562796',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'dd84ca78db4d617221b58eabc6667af8fe2f7eadbfcc213d35be9f1b419beb8d',
+ tokenTicker: 'TAP',
+ tokenName: 'Thoughts and Prayers',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 685181,
+ tx_hash:
+ '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ tx_pos: 1,
+ value: 546,
+ txid: '7987f68aa70d29ac0e0ac31d74354a8b1cd515c9893f6a5cdc7a3bf505e08b05',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '50d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e',
+ tokenTicker: 'TBC',
+ tokenName: 'tabcash',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 686546,
+ tx_hash:
+ 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ tx_pos: 1,
+ value: 546,
+ txid: 'bd84598096c113cd2110bc1748dd0613a933e2ddc440654c12ca4db4659933ed',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 687185,
+ tx_hash:
+ 'bee011e2d220ef8d785b19f5c3a469d1079ede74862ac192885582dd466c81dc',
+ tx_pos: 2,
+ value: 546,
+ txid: 'bee011e2d220ef8d785b19f5c3a469d1079ede74862ac192885582dd466c81dc',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash: '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '523512275.7961432',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 687240,
+ tx_hash:
+ 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ tx_pos: 2,
+ value: 546,
+ txid: 'cd9e5bc5fc041e46e8ce01ddb232c54fe48f1fb4a7288f10fdd03a6c2af875e1',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'df808a41672a0a0ae6475b44f272a107bc9961b90f29dc918d71301f24fe92fb',
+ tokenTicker: 'NAKAMOTO',
+ tokenName: 'NAKAMOTO',
+ tokenDocumentUrl: '',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '0.99999999',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 688194,
+ tx_hash:
+ '3de671a7107d3803d78f7f4a4e5c794d0903a8d28d16076445c084943c1e2db8',
+ tx_pos: 1,
+ value: 546,
+ txid: '3de671a7107d3803d78f7f4a4e5c794d0903a8d28d16076445c084943c1e2db8',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '22.22',
+ tokenId:
+ '3de671a7107d3803d78f7f4a4e5c794d0903a8d28d16076445c084943c1e2db8',
+ tokenTicker: 'CLB',
+ tokenName: 'Cashtab Local Beta',
+ tokenDocumentUrl: 'boomertakes.com',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 688449,
+ tx_hash:
+ 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'ab5079e9d24c33b31893cb98d409d24acdc396b5ab751e4c428d2463e991030c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'e4e1a2fb071fa71ca727e08ed1d8ea52a9531c79d1e5f1ebf483c66b71a8621c',
+ tokenTicker: 'CPA',
+ tokenName: 'Cashtab Prod Alpha',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '80',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 688495,
+ tx_hash:
+ '666c4318d1f7fef5f2c698262492c519018d4e9130f95d05f6be9f0fb7149e96',
+ tx_pos: 1,
+ value: 546,
+ txid: '666c4318d1f7fef5f2c698262492c519018d4e9130f95d05f6be9f0fb7149e96',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '100',
+ tokenId:
+ '666c4318d1f7fef5f2c698262492c519018d4e9130f95d05f6be9f0fb7149e96',
+ tokenTicker: 'CPG',
+ tokenName: 'Cashtab Prod Gamma',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 688495,
+ tx_hash:
+ '979f7741bb99ef43d7cf55ac5f070408fcb95dfce5818eb44f49e5b759a36d11',
+ tx_pos: 2,
+ value: 546,
+ txid: '979f7741bb99ef43d7cf55ac5f070408fcb95dfce5818eb44f49e5b759a36d11',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '157e0cdef5d5c51bdea00eac9ab821d809bb9d03cf98da85833614bedb129be6',
+ tokenTicker: 'CLNSP',
+ tokenName: 'ComponentLongNameSpeedLoad',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '99',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 691329,
+ tx_hash:
+ '8d38f2f805ed3f4089cd28cd89ca279628a9fa933b04fd4820d14e66fc4d4ed5',
+ tx_pos: 2,
+ value: 546,
+ txid: '8d38f2f805ed3f4089cd28cd89ca279628a9fa933b04fd4820d14e66fc4d4ed5',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'ccf5fe5a387559c8ab9efdeb0c0ef1b444e677298cfddf07671245ce3cb3c79f',
+ tokenTicker: 'XGB',
+ tokenName: 'Garmonbozia',
+ tokenDocumentUrl: 'https://twinpeaks.fandom.com/wiki/Garmonbozia',
+ tokenDocumentHash: '',
+ decimals: 8,
+ tokenType: 1,
+ tokenQty: '490',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ tx_pos: 1,
+ value: 546,
+ txid: '0158981b89b75bd923d511aaaaccd94b8d1d86babeeb69c29e3caf71e33bcc11',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '0.12',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 692599,
+ tx_hash:
+ '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ tx_pos: 1,
+ value: 546,
+ txid: '1ef9ad7d3e01fd9d83983eac92eefb4900b343225a80c29bff025deff9aab57c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bef614aac85c0c866f4d39e4d12a96851267d38d1bca5bdd6488bbd42e28b6b1',
+ tokenTicker: 'CTP',
+ tokenName: 'Cash Tab Points',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '0.12',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 693502,
+ tx_hash:
+ '912c2a87242e855c045814a58a9c4d279251918eecc7f73be107817047890f68',
+ tx_pos: 1,
+ value: 546,
+ txid: '912c2a87242e855c045814a58a9c4d279251918eecc7f73be107817047890f68',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1185eebdde038a25050a3dbb66e2d5332305d1d4a4febab31f6e31bc49baac61',
+ tokenTicker: 'BETA',
+ tokenName: 'BETA',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ tokenQty: '100',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 693606,
+ tx_hash:
+ '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ tx_pos: 2,
+ value: 546,
+ txid: '9989f6f4941d7cf3206b327d957b022b41bf7e449a11fd5dd5cf1e9bc93f1ecf',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '45f0ff5cae7e89da6b96c26c8c48a959214c5f0e983e78d0925f8956ca8848c6',
+ tokenTicker: 'CMA',
+ tokenName: 'CashtabMintAlpha',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 5,
+ tokenType: 1,
+ tokenQty: '55',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 699216,
+ tx_hash:
+ '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ tx_pos: 2,
+ value: 546,
+ txid: '6f4e602620f5df257df8655f5834d5cfbbb73f62601c69afa96198f8ab4c2680',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '0916e71779c9de7ee125741d3f5ab01f556356dbc86fd327a24f1e9e22ebc917',
+ tokenTicker: 'CTL2',
+ tokenName: 'Cashtab Token Launch Launch Token v2',
+ tokenDocumentUrl: 'thecryptoguy.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1899',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 699359,
+ tx_hash:
+ 'b99cb29050779d4f185c3c31c22e664436966314c8b260075b38bbb453180603',
+ tx_pos: 2,
+ value: 546,
+ txid: 'b99cb29050779d4f185c3c31c22e664436966314c8b260075b38bbb453180603',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '1101bd5d7b6bbc3176fb2b93d08e76ab532b04ff731d71502249e3cb9b6fcb1a',
+ tokenTicker: 'XBIT',
+ tokenName: 'eBits',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '999900',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700185,
+ tx_hash:
+ '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ tx_pos: 2,
+ value: 546,
+ txid: '71e458d9fd68a72fd5b13e2c758c6ba246495fa2933764876221450c096938b8',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '22f4ba40312ea3e90e1bfa88d2aa694c271d2e07361907b6eb5568873ffa62bf',
+ tokenTicker: 'CLA',
+ tokenName: 'Cashtab Local Alpha',
+ tokenDocumentUrl: 'boomertakes.com',
+ tokenDocumentHash: '',
+ decimals: 5,
+ tokenType: 1,
+ tokenQty: '55',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ tx_pos: 2,
+ value: 546,
+ txid: '41b9da9a5719b7bf61a02a598a37ee918a4da01e6ff5b1fb5366221ee93fd498',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '77ec4036ef8546ac46df6d3a5374e961216f92624627eaeef5d2e1a253df9fc6',
+ tokenTicker: 'CTLv3',
+ tokenName: 'Cashtab Token Launch Launch Token v3',
+ tokenDocumentUrl: 'coinex.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '267',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tx_pos: 1,
+ value: 546,
+ txid: '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '1000000000',
+ tokenId:
+ '6e24e89b6d5284138c69777527760500b99614631bca7f2a5c38f4648dae9524',
+ tokenTicker: 'CBB',
+ tokenName: 'Cashtab Beta Bits',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700469,
+ tx_hash:
+ 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ tx_pos: 2,
+ value: 546,
+ txid: 'bab327965a4fd423a383859b021ea2971987ceaa6fa3bc3994c3a3266a237db5',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '999898',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700572,
+ tx_hash:
+ '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ tx_pos: 2,
+ value: 546,
+ txid: '431f527f657b399d8753fb63aee6c806ca0f8907d93606c46b36a33dcb5cb5b9',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '990',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700572,
+ tx_hash:
+ '482d635c37bac5f62d7a191c448471f91dab4c151c8a4f38d362ff2fc93e5e24',
+ tx_pos: 2,
+ value: 546,
+ txid: '482d635c37bac5f62d7a191c448471f91dab4c151c8a4f38d362ff2fc93e5e24',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7443f7c831cdf2b2b04d5f0465ed0bcf348582675b0e4f17906438c232c22f3d',
+ tokenTicker: 'WDT',
+ tokenName:
+ 'Test Token With Exceptionally Long Name For CSS And Style Revisions',
+ tokenDocumentUrl:
+ 'https://www.ImpossiblyLongWebsiteDidYouThinkWebDevWouldBeFun.org',
+ tokenDocumentHash: '����\\�IS\u001e9�����k+���\u0018���\u001b]�߷2��',
+ decimals: 7,
+ tokenType: 1,
+ tokenQty: '0.2038568',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700677,
+ tx_hash:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '333',
+ tokenId:
+ 'da9460ce4b1c92b4f6ef4e4a6bc2d05539f49d02b17681389d9ce22b8dca50f0',
+ tokenTicker: 'SA',
+ tokenName: 'Spinner Alpha',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 700915,
+ tx_hash:
+ 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ tx_pos: 2,
+ value: 546,
+ txid: 'ef80e1ceeada69a9639c320c1fba47ea4417cd3aad1be1635c3472ce28aaef33',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '999975',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ tx_pos: 1,
+ value: 546,
+ txid: '0d5408adeefc0d9468d957a0a2bca1b63c371e68e61b3fd9c30de60058471935',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '3',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ tx_pos: 1,
+ value: 546,
+ txid: '6397497c053e5c641ae624d4af80e8aa931a0e7b018f17a9543afed9b705cf29',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c665bfd2353940648b018a3126ddbc7ac309729c7ca4598ebd7941930fd80b60',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ebf864950d862ebb53e121350d15c8b34b2374eb22afffb98fcb655b38441d59',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701079,
+ tx_hash:
+ 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ tx_pos: 1,
+ value: 546,
+ txid: 'fe10460f822163c33515f3a853c1470d68223c9c0e8f8cbc6c954ca537129f30',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ tx_pos: 1,
+ value: 546,
+ txid: '3656afe8682997be4cab4275e4bbec3f81c8aa264cec206a7215d449ee6b9af4',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701189,
+ tx_hash:
+ '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ tx_pos: 1,
+ value: 546,
+ txid: '87656bf2c2f2d46d16ba6b41b4ff488a3eff1e852c64bc921322f580e375f3cb',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701191,
+ tx_hash:
+ 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ tx_pos: 1,
+ value: 546,
+ txid: 'c212e45f21418fa7fd5bbf2941892353c1d6ddb9d6d16ff12fba3f7919c37b43',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701194,
+ tx_hash:
+ 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ tx_pos: 1,
+ value: 546,
+ txid: 'ff61be814b18f60a640169c5d70b42ce29bd9caf2f5e5592655e924760634c1e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '16b12bbacdbb8c8a799adbfd782bfff9843c1f9b0be148eaae02a1a7f74f95c4',
+ tokenTicker: 'CGEN',
+ tokenName: 'Cashtab Genesis',
+ tokenDocumentUrl: 'https://boomertakes.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701208,
+ tx_hash:
+ '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ tx_pos: 1,
+ value: 546,
+ txid: '0e9179929b71d8a94ce9de75434d9e0901eacf3b2b882fa02a56eab450d0bd0b',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4db25a4b2f0b57415ce25fab6d9cb3ac2bbb444ff493dc16d0615a11ad06c875',
+ tokenTicker: 'LVV',
+ tokenName: 'Lambda Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ tx_pos: 1,
+ value: 546,
+ txid: '4ad31e5ab9cfcead7d8b48b81a542044e44e63124eb96d6463fe4bbe5b77e9ad',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '0.789698951',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701211,
+ tx_hash:
+ '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ tx_pos: 1,
+ value: 546,
+ txid: '72d4827a9a0b9adac9430ba799cb049af14fd79df11569b4e1a4741ac114b84d',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba',
+ tokenTicker: 'TBS',
+ tokenName: 'TestBits',
+ tokenDocumentUrl: 'https://thecryptoguy.com/',
+ tokenDocumentHash: '',
+ decimals: 9,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701221,
+ tx_hash:
+ '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ tx_pos: 1,
+ value: 546,
+ txid: '42d3e2d97604f09c002df701f964adacacd28bc328acc0066a2563d63f522681',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 701223,
+ tx_hash:
+ '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ tx_pos: 2,
+ value: 546,
+ txid: '890bd4d72e75c4123b73dc81b9f4f89716fabe456a9047f9a5a5ef4a5162d218',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '9e9738e9ac3ff202736bf7775f875ebae6f812650df577a947c20c52475e43da',
+ tokenTicker: 'CUTT',
+ tokenName: 'Cashtab Unit Test Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ tokenQty: '90',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709251,
+ tx_hash:
+ '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ tx_pos: 1,
+ value: 546,
+ txid: '9e8483407944d9b75c331ebd6178b0cabc3e8c3b5bb0492b7b2256c8740f655a',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'f36e1b3d9a2aaf74f132fef3834e9743b945a667a4204e761b85f2e7b65fd41a',
+ tokenTicker: 'POW',
+ tokenName: 'ProofofWriting.com Token',
+ tokenDocumentUrl: 'https://www.proofofwriting.com/26',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1000',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709259,
+ tx_hash:
+ '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ tx_pos: 1,
+ value: 546,
+ txid: '4f4fc78f7a008fc109789722d89fe95fe75ca1f15af625f24ae4ec74d420552e',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ 'aa7202397a06097e8ff36855aa72c0ee032659747e5bd7cbcd3099fc3a62b6b6',
+ tokenTicker: 'CTL',
+ tokenName: 'Cashtab Token Launch Launch Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709668,
+ tx_hash:
+ 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ tx_pos: 1,
+ value: 546,
+ txid: 'da371839612b153543d0cffb09e0220dca7c7acfebda660785807b269bd0341c',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '7f8889682d57369ed0e32336f8b7e0ffec625a35cca183f4e81fde4e71a538a1',
+ tokenTicker: 'HONK',
+ tokenName: 'HONK HONK',
+ tokenDocumentUrl: 'THE REAL HONK SLP TOKEN',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '2',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 709669,
+ tx_hash:
+ '89c50a30cc82c65781969c0e6f132e12b0a46ff9ce0ca33d51e37596d89846b3',
+ tx_pos: 1,
+ value: 5600,
+ txid: '89c50a30cc82c65781969c0e6f132e12b0a46ff9ce0ca33d51e37596d89846b3',
+ vout: 1,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 710065,
+ tx_hash:
+ '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ tx_pos: 1,
+ value: 546,
+ txid: '117939de3822734df69fb5cc27a6429860ee2f7a78917603da8b8aebba2a9150',
+ vout: 1,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '9e9738e9ac3ff202736bf7775f875ebae6f812650df577a947c20c52475e43da',
+ tokenTicker: 'CUTT',
+ tokenName: 'Cashtab Unit Test Token',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 2,
+ tokenType: 1,
+ tokenQty: '1',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 711088,
+ tx_hash:
+ '982ca55c84510e4184ff5a6e7fc310a1de7833e8c617b46014f962ed89bf0f57',
+ tx_pos: 2,
+ value: 546,
+ txid: '982ca55c84510e4184ff5a6e7fc310a1de7833e8c617b46014f962ed89bf0f57',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '98183238638ecb4ddc365056e22de0e8a05448c1e6084bae247fae5a74ad4f48',
+ tokenTicker: 'DVV',
+ tokenName: 'Delta Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '999998946',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 711101,
+ tx_hash:
+ '97954e12814be22ff873d1428e58a3eacc5fadef90b529b62134f407f629d5d9',
+ tx_pos: 1,
+ value: 3200,
+ txid: '97954e12814be22ff873d1428e58a3eacc5fadef90b529b62134f407f629d5d9',
+ vout: 1,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 711227,
+ tx_hash:
+ '5a12af320209b76ff7f827d16b914e7acd8087fb9912c0d526abb1eab6780447',
+ tx_pos: 2,
+ value: 546,
+ txid: '5a12af320209b76ff7f827d16b914e7acd8087fb9912c0d526abb1eab6780447',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '4bd147fc5d5ff26249a9299c46b80920c0b81f59a60e05428262160ebee0b0c3',
+ tokenTicker: 'NOCOVID',
+ tokenName: 'Covid19 Lifetime Immunity',
+ tokenDocumentUrl:
+ 'https://www.who.int/emergencies/diseases/novel-coronavirus-2019/covid-19-vaccines',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '996569',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 711227,
+ tx_hash:
+ 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ tx_pos: 2,
+ value: 546,
+ txid: 'e26db37d5c64b265514cd5cbb9d5194a7f2967b5974d167236d46be4954e435c',
+ vout: 2,
+ utxoType: 'token',
+ transactionType: 'send',
+ tokenId:
+ '98183238638ecb4ddc365056e22de0e8a05448c1e6084bae247fae5a74ad4f48',
+ tokenTicker: 'DVV',
+ tokenName: 'Delta Variant Variants',
+ tokenDocumentUrl: 'https://cashtabapp.com/',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ tokenQty: '17',
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714118,
+ tx_hash:
+ '4832776d00ad5ad7c9bcd9e8ceca9d35ca3302873750139497ec5e215a10339f',
+ tx_pos: 1,
+ value: 3300,
+ txid: '4832776d00ad5ad7c9bcd9e8ceca9d35ca3302873750139497ec5e215a10339f',
+ vout: 1,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714695,
+ tx_hash:
+ 'cfdc270ab82c001eaddd357f773a8dfe61cfdd891df66b39fee060f34f7a4015',
+ tx_pos: 1,
+ value: 546,
+ txid: 'cfdc270ab82c001eaddd357f773a8dfe61cfdd891df66b39fee060f34f7a4015',
+ vout: 1,
+ utxoType: 'token',
+ tokenQty: '6969',
+ tokenId:
+ 'cfdc270ab82c001eaddd357f773a8dfe61cfdd891df66b39fee060f34f7a4015',
+ tokenTicker: 'SCOOG',
+ tokenName: 'Scoogi Alpha',
+ tokenDocumentUrl: 'cashtab.com',
+ tokenDocumentHash: '',
+ decimals: 0,
+ tokenType: 1,
+ isValid: true,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714695,
+ tx_hash:
+ 'cfdc270ab82c001eaddd357f773a8dfe61cfdd891df66b39fee060f34f7a4015',
+ tx_pos: 2,
+ value: 228098498,
+ txid: 'cfdc270ab82c001eaddd357f773a8dfe61cfdd891df66b39fee060f34f7a4015',
+ vout: 2,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714977,
+ tx_hash:
+ '25780d22441e192f1aebec5c8d650910a91adf6db88f21de6c91946d4e0b294c',
+ tx_pos: 0,
+ value: 1500,
+ txid: '25780d22441e192f1aebec5c8d650910a91adf6db88f21de6c91946d4e0b294c',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714977,
+ tx_hash:
+ '2d1f58dbfee240ae85ef01ef9e2ccfd9fb1accbd6dd9ee1c41bc32b98b584bf5',
+ tx_pos: 0,
+ value: 1600,
+ txid: '2d1f58dbfee240ae85ef01ef9e2ccfd9fb1accbd6dd9ee1c41bc32b98b584bf5',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714977,
+ tx_hash:
+ '820d8a69624584d68cab32312b71b4f26b0532cc9d4fc55b4c011a1c88c924e9',
+ tx_pos: 0,
+ value: 1801,
+ txid: '820d8a69624584d68cab32312b71b4f26b0532cc9d4fc55b4c011a1c88c924e9',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714977,
+ tx_hash:
+ '9de68ff597db32a21fd428ecea179dd7a7a35599fb6851394f8f9a8d1e873887',
+ tx_pos: 0,
+ value: 1600,
+ txid: '9de68ff597db32a21fd428ecea179dd7a7a35599fb6851394f8f9a8d1e873887',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714977,
+ tx_hash:
+ 'b962f066438786ea148ce3fb4dfb1cb0b78b24cad9e06aac7cb47a191e36882e',
+ tx_pos: 0,
+ value: 1700,
+ txid: 'b962f066438786ea148ce3fb4dfb1cb0b78b24cad9e06aac7cb47a191e36882e',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714977,
+ tx_hash:
+ 'bd1e1cbee618ed463e7501ae650cb9a947a96c2de737c64ee223b14901eb2777',
+ tx_pos: 0,
+ value: 1800,
+ txid: 'bd1e1cbee618ed463e7501ae650cb9a947a96c2de737c64ee223b14901eb2777',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714978,
+ tx_hash:
+ '2b2307a0295cefa5d1813fe22a606624b068a84c8c16f4574a32f3455c58e318',
+ tx_pos: 0,
+ value: 2500,
+ txid: '2b2307a0295cefa5d1813fe22a606624b068a84c8c16f4574a32f3455c58e318',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714978,
+ tx_hash:
+ '2d0f18e6da2e57549802046fedcb4397226b7f0d36ecc050660a5654f8ab7129',
+ tx_pos: 0,
+ value: 1803,
+ txid: '2d0f18e6da2e57549802046fedcb4397226b7f0d36ecc050660a5654f8ab7129',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714978,
+ tx_hash:
+ '903392499c20bc3fa30fe947d1cd2f48d015742cc266c3af5eb644366fac6e3b',
+ tx_pos: 0,
+ value: 2300,
+ txid: '903392499c20bc3fa30fe947d1cd2f48d015742cc266c3af5eb644366fac6e3b',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714978,
+ tx_hash:
+ '903f53502098bdc55a90e8841adf85eb2728a7a99e6cae5bd3ba7b248d26e793',
+ tx_pos: 0,
+ value: 2200,
+ txid: '903f53502098bdc55a90e8841adf85eb2728a7a99e6cae5bd3ba7b248d26e793',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714978,
+ tx_hash:
+ '9c513ff48d13f90b0cea833a29c64362934efd296a6a41ff33ba40f603bf9296',
+ tx_pos: 0,
+ value: 1802,
+ txid: '9c513ff48d13f90b0cea833a29c64362934efd296a6a41ff33ba40f603bf9296',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 714978,
+ tx_hash:
+ 'dc2ebbb1f46ce7a4484e784c7677c82844c025ee5f15491256a0fe7452a9f60c',
+ tx_pos: 0,
+ value: 2400,
+ txid: 'dc2ebbb1f46ce7a4484e784c7677c82844c025ee5f15491256a0fe7452a9f60c',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+ {
+ height: 0,
+ tx_hash:
+ '77cbd64cfe525854f83c203d22bd5e9e4c69df6f636be5a53170c3d4e128e376',
+ tx_pos: 0,
+ value: 2600,
+ txid: '77cbd64cfe525854f83c203d22bd5e9e4c69df6f636be5a53170c3d4e128e376',
+ vout: 0,
+ isValid: false,
+ address: 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ },
+];
diff --git a/web/cashtab-v2/src/utils/__tests__/cashMethods.test.js b/web/cashtab-v2/src/utils/__tests__/cashMethods.test.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/__tests__/cashMethods.test.js
@@ -0,0 +1,773 @@
+import { ValidationError } from 'ecashaddrjs';
+import {
+ fromSmallestDenomination,
+ batchArray,
+ flattenBatchedHydratedUtxos,
+ loadStoredWallet,
+ isValidStoredWallet,
+ fromLegacyDecimals,
+ convertToEcashPrefix,
+ checkNullUtxosForTokenStatus,
+ confirmNonEtokenUtxos,
+ isLegacyMigrationRequired,
+ toLegacyCash,
+ toLegacyToken,
+ toLegacyCashArray,
+ convertEtokenToEcashAddr,
+ parseOpReturn,
+ isExcludedUtxo,
+ whichUtxosWereAdded,
+ whichUtxosWereConsumed,
+ addNewHydratedUtxos,
+ removeConsumedUtxos,
+ getUtxoCount,
+ areAllUtxosIncludedInIncrementallyHydratedUtxos,
+} from '@utils/cashMethods';
+
+import {
+ unbatchedArray,
+ arrayBatchedByThree,
+} from '../__mocks__/mockBatchedArrays';
+import {
+ validAddressArrayInput,
+ validAddressArrayInputMixedPrefixes,
+ validAddressArrayOutput,
+ validLargeAddressArrayInput,
+ validLargeAddressArrayOutput,
+ invalidAddressArrayInput,
+} from '../__mocks__/mockAddressArray';
+
+import {
+ unflattenedHydrateUtxosResponse,
+ flattenedHydrateUtxosResponse,
+} from '../__mocks__/flattenBatchedHydratedUtxosMocks';
+import {
+ cachedUtxos,
+ utxosLoadedFromCache,
+} from '../__mocks__/mockCachedUtxos';
+import {
+ validStoredWallet,
+ invalidStoredWallet,
+} from '../__mocks__/mockStoredWallets';
+
+import {
+ mockTxDataResults,
+ mockNonEtokenUtxos,
+ mockTxDataResultsWithEtoken,
+ mockHydratedUtxosWithNullValues,
+ mockHydratedUtxosWithNullValuesSetToFalse,
+} from '../__mocks__/nullUtxoMocks';
+
+import {
+ missingPath1899Wallet,
+ missingPublicKeyInPath1899Wallet,
+ missingPublicKeyInPath145Wallet,
+ missingPublicKeyInPath245Wallet,
+ notLegacyWallet,
+} from '../__mocks__/mockLegacyWallets';
+
+import {
+ shortCashtabMessageInputHex,
+ longCashtabMessageInputHex,
+ shortExternalMessageInputHex,
+ longExternalMessageInputHex,
+ shortSegmentedExternalMessageInputHex,
+ longSegmentedExternalMessageInputHex,
+ mixedSegmentedExternalMessageInputHex,
+ mockParsedShortCashtabMessageArray,
+ mockParsedLongCashtabMessageArray,
+ mockParsedShortExternalMessageArray,
+ mockParsedLongExternalMessageArray,
+ mockParsedShortSegmentedExternalMessageArray,
+ mockParsedLongSegmentedExternalMessageArray,
+ mockParsedMixedSegmentedExternalMessageArray,
+ eTokenInputHex,
+ mockParsedETokenOutputArray,
+} from '../__mocks__/mockOpReturnParsedArray';
+
+import {
+ excludedUtxoAlpha,
+ excludedUtxoBeta,
+ includedUtxoAlpha,
+ includedUtxoBeta,
+ previousUtxosObjUtxoArray,
+ previousUtxosTemplate,
+ currentUtxosAfterSingleXecReceiveTxTemplate,
+ utxosAddedBySingleXecReceiveTxTemplate,
+ previousUtxosBeforeSingleXecReceiveTx,
+ currentUtxosAfterSingleXecReceiveTx,
+ utxosAddedBySingleXecReceiveTx,
+ currentUtxosAfterMultiXecReceiveTxTemplate,
+ utxosAddedByMultiXecReceiveTxTemplate,
+ previousUtxosBeforeMultiXecReceiveTx,
+ currentUtxosAfterMultiXecReceiveTx,
+ utxosAddedByMultiXecReceiveTx,
+ currentUtxosAfterEtokenReceiveTxTemplate,
+ utxosAddedByEtokenReceiveTxTemplate,
+ previousUtxosBeforeEtokenReceiveTx,
+ currentUtxosAfterEtokenReceiveTx,
+ utxosAddedByEtokenReceiveTx,
+ previousUtxosBeforeSendAllTxTemplate,
+ currentUtxosAfterSendAllTxTemplate,
+ previousUtxosBeforeSendAllTx,
+ currentUtxosAfterSendAllTx,
+ previousUtxosBeforeSingleXecSendTx,
+ currentUtxosAfterSingleXecSendTx,
+ utxosAddedBySingleXecSendTx,
+ currentUtxosAfterSingleXecSendTxTemplate,
+ utxosAddedBySingleXecSendTxTemplate,
+ currentUtxosAfterEtokenSendTxTemplate,
+ utxosAddedByEtokenSendTxTemplate,
+ previousUtxosBeforeEtokenSendTx,
+ currentUtxosAfterEtokenSendTx,
+ utxosAddedByEtokenSendTx,
+ utxosConsumedByEtokenSendTx,
+ utxosConsumedByEtokenSendTxTemplate,
+ utxosConsumedBySingleXecSendTx,
+ utxosConsumedBySingleXecSendTxTemplate,
+ utxosConsumedBySendAllTx,
+ utxosConsumedBySendAllTxTemplate,
+ hydratedUtxoDetailsBeforeAddingTemplate,
+ hydratedUtxoDetailsAfterAddingSingleUtxoTemplate,
+ newHydratedUtxosSingleTemplate,
+ addedHydratedUtxosOverTwenty,
+ existingHydratedUtxoDetails,
+ existingHydratedUtxoDetailsAfterAdd,
+ hydratedUtxoDetailsBeforeConsumedTemplate,
+ consumedUtxoTemplate,
+ hydratedUtxoDetailsAfterRemovingConsumedUtxoTemplate,
+ consumedUtxos,
+ hydratedUtxoDetailsBeforeRemovingConsumedUtxos,
+ hydratedUtxoDetailsAfterRemovingConsumedUtxos,
+ consumedUtxosMoreThanTwenty,
+ hydratedUtxoDetailsAfterRemovingMoreThanTwentyConsumedUtxos,
+ consumedUtxosMoreThanTwentyInRandomObjects,
+ utxoCountMultiTemplate,
+ utxoCountSingleTemplate,
+ incrementalUtxosTemplate,
+ incrementallyHydratedUtxosTemplate,
+ incrementallyHydratedUtxosTemplateMissing,
+ utxosAfterSentTxIncremental,
+ incrementallyHydratedUtxosAfterProcessing,
+ incrementallyHydratedUtxosAfterProcessingOneMissing,
+} from '../__mocks__/incrementalUtxoMocks';
+
+describe('Correctly executes cash utility functions', () => {
+ it(`Correctly converts smallest base unit to smallest decimal for cashDecimals = 2`, () => {
+ expect(fromSmallestDenomination(1, 2)).toBe(0.01);
+ });
+ it(`Correctly converts largest base unit to smallest decimal for cashDecimals = 2`, () => {
+ expect(fromSmallestDenomination(1000000012345678, 2)).toBe(
+ 10000000123456.78,
+ );
+ });
+ it(`Correctly converts smallest base unit to smallest decimal for cashDecimals = 8`, () => {
+ expect(fromSmallestDenomination(1, 8)).toBe(0.00000001);
+ });
+ it(`Correctly converts largest base unit to smallest decimal for cashDecimals = 8`, () => {
+ expect(fromSmallestDenomination(1000000012345678, 8)).toBe(
+ 10000000.12345678,
+ );
+ });
+ it(`Correctly converts an array of length 10 to an array of 4 arrays, each with max length 3`, () => {
+ expect(batchArray(unbatchedArray, 3)).toStrictEqual(
+ arrayBatchedByThree,
+ );
+ });
+ it(`If array length is less than batch size, return original array as first and only element of new array`, () => {
+ expect(batchArray(unbatchedArray, 20)).toStrictEqual([unbatchedArray]);
+ });
+ it(`Flattens hydrateUtxos from Promise.all() response into array that can be parsed by getSlpBalancesAndUtxos`, () => {
+ expect(
+ flattenBatchedHydratedUtxos(unflattenedHydrateUtxosResponse),
+ ).toStrictEqual(flattenedHydrateUtxosResponse);
+ });
+ it(`Accepts a cachedWalletState that has not preserved BigNumber object types, and returns the same wallet state with BigNumber type re-instituted`, () => {
+ expect(loadStoredWallet(cachedUtxos)).toStrictEqual(
+ utxosLoadedFromCache,
+ );
+ });
+ it(`Recognizes a stored wallet as valid if it has all required fields`, () => {
+ expect(isValidStoredWallet(validStoredWallet)).toBe(true);
+ });
+ it(`Recognizes a stored wallet as invalid if it is missing required fields`, () => {
+ expect(isValidStoredWallet(invalidStoredWallet)).toBe(false);
+ });
+ it(`Converts a legacy BCH amount to an XEC amount`, () => {
+ expect(fromLegacyDecimals(0.00000546, 2)).toStrictEqual(5.46);
+ });
+ it(`Leaves a legacy BCH amount unchanged if currency.cashDecimals is 8`, () => {
+ expect(fromLegacyDecimals(0.00000546, 8)).toStrictEqual(0.00000546);
+ });
+ it(`convertToEcashPrefix converts a bitcoincash: prefixed address to an ecash: prefixed address`, () => {
+ expect(
+ convertToEcashPrefix(
+ 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr',
+ ),
+ ).toBe('ecash:qz2708636snqhsxu8wnlka78h6fdp77ar59jrf5035');
+ });
+ it(`convertToEcashPrefix returns an ecash: prefix address unchanged`, () => {
+ expect(
+ convertToEcashPrefix(
+ 'ecash:qz2708636snqhsxu8wnlka78h6fdp77ar59jrf5035',
+ ),
+ ).toBe('ecash:qz2708636snqhsxu8wnlka78h6fdp77ar59jrf5035');
+ });
+ it(`toLegacyToken returns an etoken: prefix address as simpleledger:`, () => {
+ expect(
+ toLegacyToken('etoken:qz2708636snqhsxu8wnlka78h6fdp77ar5tv2tzg4r'),
+ ).toBe('simpleledger:qz2708636snqhsxu8wnlka78h6fdp77ar5syue64fa');
+ });
+ it(`toLegacyToken returns an prefixless valid etoken address in simpleledger: format with prefix`, () => {
+ expect(
+ toLegacyToken('qz2708636snqhsxu8wnlka78h6fdp77ar5tv2tzg4r'),
+ ).toBe('simpleledger:qz2708636snqhsxu8wnlka78h6fdp77ar5syue64fa');
+ });
+ it(`Correctly parses utxo vout tx data to confirm the transactions are not eToken txs`, () => {
+ expect(checkNullUtxosForTokenStatus(mockTxDataResults)).toStrictEqual(
+ mockNonEtokenUtxos,
+ );
+ });
+ it(`Correctly parses utxo vout tx data and screens out an eToken by asm field`, () => {
+ expect(
+ checkNullUtxosForTokenStatus(mockTxDataResultsWithEtoken),
+ ).toStrictEqual([]);
+ });
+ it(`Changes isValid from 'null' to 'false' for confirmed nonEtokenUtxos`, () => {
+ expect(
+ confirmNonEtokenUtxos(
+ mockHydratedUtxosWithNullValues,
+ mockNonEtokenUtxos,
+ ),
+ ).toStrictEqual(mockHydratedUtxosWithNullValuesSetToFalse);
+ });
+ it(`Recognizes a wallet with missing Path1889 is a Legacy Wallet and requires migration`, () => {
+ expect(isLegacyMigrationRequired(missingPath1899Wallet)).toBe(true);
+ });
+ it(`Recognizes a wallet with missing PublicKey in Path1889 is a Legacy Wallet and requires migration`, () => {
+ expect(
+ isLegacyMigrationRequired(missingPublicKeyInPath1899Wallet),
+ ).toBe(true);
+ });
+ it(`Recognizes a wallet with missing PublicKey in Path145 is a Legacy Wallet and requires migration`, () => {
+ expect(isLegacyMigrationRequired(missingPublicKeyInPath145Wallet)).toBe(
+ true,
+ );
+ });
+ it(`Recognizes a wallet with missing PublicKey in Path245 is a Legacy Wallet and requires migration`, () => {
+ expect(isLegacyMigrationRequired(missingPublicKeyInPath245Wallet)).toBe(
+ true,
+ );
+ });
+ it(`Recognizes a latest, current wallet that does not require migration`, () => {
+ expect(isLegacyMigrationRequired(notLegacyWallet)).toBe(false);
+ });
+
+ test('toLegacyCash() converts a valid ecash: prefix address to a valid bitcoincash: prefix address', async () => {
+ const result = toLegacyCash(
+ 'ecash:qqd3qn4zazjhygk5a2vzw2gvqgqwempr4gtfza25mc',
+ );
+ expect(result).toStrictEqual(
+ 'bitcoincash:qqd3qn4zazjhygk5a2vzw2gvqgqwempr4gjykk3wa0',
+ );
+ });
+
+ test('toLegacyCash() converts a valid ecash: prefixless address to a valid bitcoincash: prefix address', async () => {
+ const result = toLegacyCash(
+ 'qqd3qn4zazjhygk5a2vzw2gvqgqwempr4gtfza25mc',
+ );
+ expect(result).toStrictEqual(
+ 'bitcoincash:qqd3qn4zazjhygk5a2vzw2gvqgqwempr4gjykk3wa0',
+ );
+ });
+
+ test('toLegacyCash throws error if input address has invalid checksum', async () => {
+ const result = toLegacyCash(
+ 'ecash:qqd3qn4zazjhygk5a2vzw2gvqgqwempr4gtfza25m',
+ );
+ expect(result).toStrictEqual(
+ new Error(
+ 'ecash:qqd3qn4zazjhygk5a2vzw2gvqgqwempr4gtfza25m is not a valid ecash address',
+ ),
+ );
+ });
+
+ test('toLegacyCash() throws error with input of etoken: address', async () => {
+ const result = toLegacyCash(
+ 'etoken:qqd3qn4zazjhygk5a2vzw2gvqgqwempr4g9htlunl0',
+ );
+ expect(result).toStrictEqual(
+ new Error(
+ 'etoken:qqd3qn4zazjhygk5a2vzw2gvqgqwempr4g9htlunl0 is not a valid ecash address',
+ ),
+ );
+ });
+
+ test('toLegacyCash() throws error with input of legacy address', async () => {
+ const result = toLegacyCash('13U6nDrkRsC3Eb1pxPhNY8XJ5W9zdp6rNk');
+ expect(result).toStrictEqual(
+ new Error(
+ '13U6nDrkRsC3Eb1pxPhNY8XJ5W9zdp6rNk is not a valid ecash address',
+ ),
+ );
+ });
+
+ test('toLegacyCash() throws error with input of bitcoincash: address', async () => {
+ const result = toLegacyCash(
+ 'bitcoincash:qqd3qn4zazjhygk5a2vzw2gvqgqwempr4gjykk3wa0',
+ );
+ expect(result).toStrictEqual(
+ new Error(
+ 'bitcoincash:qqd3qn4zazjhygk5a2vzw2gvqgqwempr4gjykk3wa0 is not a valid ecash address',
+ ),
+ );
+ });
+
+ test('toLegacyCashArray throws error if the addressArray input is null', async () => {
+ const result = toLegacyCashArray(null);
+
+ expect(result).toStrictEqual(new Error('Invalid addressArray input'));
+ });
+
+ test('toLegacyCashArray throws error if the addressArray input is empty', async () => {
+ const result = toLegacyCashArray([]);
+
+ expect(result).toStrictEqual(new Error('Invalid addressArray input'));
+ });
+
+ test('toLegacyCashArray throws error if the addressArray input is a number', async () => {
+ const result = toLegacyCashArray(12345);
+
+ expect(result).toStrictEqual(new Error('Invalid addressArray input'));
+ });
+
+ test('toLegacyCashArray throws error if the addressArray input is undefined', async () => {
+ const result = toLegacyCashArray(undefined);
+
+ expect(result).toStrictEqual(new Error('Invalid addressArray input'));
+ });
+
+ test('toLegacyCashArray successfully converts a standard sized valid addressArray input', async () => {
+ const result = toLegacyCashArray(validAddressArrayInput);
+
+ expect(result).toStrictEqual(validAddressArrayOutput);
+ });
+
+ test('toLegacyCashArray successfully converts a standard sized valid addressArray input including prefixless ecash addresses', async () => {
+ const result = toLegacyCashArray(validAddressArrayInputMixedPrefixes);
+
+ expect(result).toStrictEqual(validAddressArrayOutput);
+ });
+
+ test('toLegacyCashArray successfully converts a large valid addressArray input', async () => {
+ const result = toLegacyCashArray(validLargeAddressArrayInput);
+
+ expect(result).toStrictEqual(validLargeAddressArrayOutput);
+ });
+
+ test('toLegacyCashArray throws an error on an addressArray with invalid addresses', async () => {
+ const result = toLegacyCashArray(invalidAddressArrayInput);
+
+ expect(result).toStrictEqual(
+ new Error(
+ 'ecash:qrqgwxrrrrrrrrrrrrrrrrrrrrrrrrr7zsvk is not a valid ecash address',
+ ),
+ );
+ });
+
+ test('parseOpReturn() successfully parses a short cashtab message', async () => {
+ const result = parseOpReturn(shortCashtabMessageInputHex);
+ expect(result).toStrictEqual(mockParsedShortCashtabMessageArray);
+ });
+
+ test('parseOpReturn() successfully parses a long cashtab message where an additional PUSHDATA1 is present', async () => {
+ const result = parseOpReturn(longCashtabMessageInputHex);
+ expect(result).toStrictEqual(mockParsedLongCashtabMessageArray);
+ });
+
+ test('parseOpReturn() successfully parses a short external message', async () => {
+ const result = parseOpReturn(shortExternalMessageInputHex);
+ expect(result).toStrictEqual(mockParsedShortExternalMessageArray);
+ });
+
+ test('parseOpReturn() successfully parses a long external message where an additional PUSHDATA1 is present', async () => {
+ const result = parseOpReturn(longExternalMessageInputHex);
+ expect(result).toStrictEqual(mockParsedLongExternalMessageArray);
+ });
+
+ test('parseOpReturn() successfully parses an external message that is segmented into separate short parts', async () => {
+ const result = parseOpReturn(shortSegmentedExternalMessageInputHex);
+ expect(result).toStrictEqual(
+ mockParsedShortSegmentedExternalMessageArray,
+ );
+ });
+
+ test('parseOpReturn() successfully parses an external message that is segmented into separate long parts', async () => {
+ const result = parseOpReturn(longSegmentedExternalMessageInputHex);
+ expect(result).toStrictEqual(
+ mockParsedLongSegmentedExternalMessageArray,
+ );
+ });
+
+ test('parseOpReturn() successfully parses an external message that is segmented into separate long and short parts', async () => {
+ const result = parseOpReturn(mixedSegmentedExternalMessageInputHex);
+ expect(result).toStrictEqual(
+ mockParsedMixedSegmentedExternalMessageArray,
+ );
+ });
+
+ test('parseOpReturn() successfully parses an eToken output', async () => {
+ const result = parseOpReturn(eTokenInputHex);
+ expect(result).toStrictEqual(mockParsedETokenOutputArray);
+ });
+
+ test('isExcludedUtxo returns true for a utxo with different tx_pos and same txid as an existing utxo in the set', async () => {
+ expect(
+ isExcludedUtxo(excludedUtxoAlpha, previousUtxosObjUtxoArray),
+ ).toBe(true);
+ });
+ test('isExcludedUtxo returns true for a utxo with different value and same txid as an existing utxo in the set', async () => {
+ expect(
+ isExcludedUtxo(excludedUtxoBeta, previousUtxosObjUtxoArray),
+ ).toBe(true);
+ });
+ test('isExcludedUtxo returns false for a utxo with different tx_pos and same txid', async () => {
+ expect(
+ isExcludedUtxo(includedUtxoAlpha, previousUtxosObjUtxoArray),
+ ).toBe(false);
+ });
+ test('isExcludedUtxo returns false for a utxo with different value and same txid', async () => {
+ expect(
+ isExcludedUtxo(includedUtxoBeta, previousUtxosObjUtxoArray),
+ ).toBe(false);
+ });
+ test('whichUtxosWereAdded correctly identifies a single added utxo after a received XEC tx [template]', async () => {
+ expect(
+ whichUtxosWereAdded(
+ previousUtxosTemplate,
+ currentUtxosAfterSingleXecReceiveTxTemplate,
+ ),
+ ).toStrictEqual(utxosAddedBySingleXecReceiveTxTemplate);
+ });
+ test('whichUtxosWereAdded correctly identifies a single added utxo after a received XEC tx', async () => {
+ expect(
+ whichUtxosWereAdded(
+ previousUtxosBeforeSingleXecReceiveTx,
+ currentUtxosAfterSingleXecReceiveTx,
+ ),
+ ).toStrictEqual(utxosAddedBySingleXecReceiveTx);
+ });
+ test('whichUtxosWereAdded correctly identifies multiple added utxos with the same txid [template]', async () => {
+ expect(
+ whichUtxosWereAdded(
+ previousUtxosTemplate,
+ currentUtxosAfterMultiXecReceiveTxTemplate,
+ ),
+ ).toStrictEqual(utxosAddedByMultiXecReceiveTxTemplate);
+ });
+ test('whichUtxosWereAdded correctly identifies multiple added utxos with the same txid', async () => {
+ expect(
+ whichUtxosWereAdded(
+ previousUtxosBeforeMultiXecReceiveTx,
+ currentUtxosAfterMultiXecReceiveTx,
+ ),
+ ).toStrictEqual(utxosAddedByMultiXecReceiveTx);
+ });
+ test('whichUtxosWereAdded correctly identifies an added utxos from received eToken tx [template]', async () => {
+ expect(
+ whichUtxosWereAdded(
+ previousUtxosTemplate,
+ currentUtxosAfterEtokenReceiveTxTemplate,
+ ),
+ ).toStrictEqual(utxosAddedByEtokenReceiveTxTemplate);
+ });
+ test('whichUtxosWereAdded correctly identifies an added utxos from received eToken tx', async () => {
+ expect(
+ whichUtxosWereAdded(
+ previousUtxosBeforeEtokenReceiveTx,
+ currentUtxosAfterEtokenReceiveTx,
+ ),
+ ).toStrictEqual(utxosAddedByEtokenReceiveTx);
+ });
+ test('whichUtxosWereAdded correctly identifies no utxos were added in a send all XEC tx (no change) [template]', async () => {
+ expect(
+ whichUtxosWereAdded(
+ previousUtxosBeforeSendAllTxTemplate,
+ currentUtxosAfterSendAllTxTemplate,
+ ),
+ ).toStrictEqual(false);
+ });
+ test('whichUtxosWereAdded correctly identifies no utxos were added in a send all XEC tx (no change)', async () => {
+ expect(
+ whichUtxosWereAdded(
+ previousUtxosBeforeSendAllTx,
+ currentUtxosAfterSendAllTx,
+ ),
+ ).toStrictEqual(false);
+ });
+ test('whichUtxosWereAdded correctly identifies an added utxo from a single send XEC tx', async () => {
+ expect(
+ whichUtxosWereAdded(
+ previousUtxosBeforeSingleXecSendTx,
+ currentUtxosAfterSingleXecSendTx,
+ ),
+ ).toStrictEqual(utxosAddedBySingleXecSendTx);
+ });
+ test('whichUtxosWereAdded correctly identifies an added utxo from a single send XEC tx [template]', async () => {
+ expect(
+ whichUtxosWereAdded(
+ previousUtxosTemplate,
+ currentUtxosAfterSingleXecSendTxTemplate,
+ ),
+ ).toStrictEqual(utxosAddedBySingleXecSendTxTemplate);
+ });
+ test('whichUtxosWereAdded correctly identifies added change utxos from a send eToken tx [template]', async () => {
+ expect(
+ whichUtxosWereAdded(
+ previousUtxosTemplate,
+ currentUtxosAfterEtokenSendTxTemplate,
+ ),
+ ).toStrictEqual(utxosAddedByEtokenSendTxTemplate);
+ });
+ test('whichUtxosWereAdded correctly identifies added change utxos from a send eToken tx', async () => {
+ expect(
+ whichUtxosWereAdded(
+ previousUtxosBeforeEtokenSendTx,
+ currentUtxosAfterEtokenSendTx,
+ ),
+ ).toStrictEqual(utxosAddedByEtokenSendTx);
+ });
+ test('whichUtxosWereConsumed correctly identifies no utxos consumed after a received XEC tx [template]', async () => {
+ expect(
+ whichUtxosWereConsumed(
+ previousUtxosTemplate,
+ currentUtxosAfterSingleXecReceiveTxTemplate,
+ ),
+ ).toStrictEqual(false);
+ });
+ test('whichUtxosWereConsumed correctly identifies no utxos consumed a received XEC tx', async () => {
+ expect(
+ whichUtxosWereConsumed(
+ previousUtxosBeforeSingleXecReceiveTx,
+ currentUtxosAfterSingleXecReceiveTx,
+ ),
+ ).toStrictEqual(false);
+ });
+ test('whichUtxosWereConsumed correctly identifies no consumed utxos after receiving an XEC multi-send tx [template]', async () => {
+ expect(
+ whichUtxosWereConsumed(
+ previousUtxosTemplate,
+ currentUtxosAfterMultiXecReceiveTxTemplate,
+ ),
+ ).toStrictEqual(false);
+ });
+ test('whichUtxosWereConsumed correctly identifies no consumed utxos after receiving an XEC multi-send tx', async () => {
+ expect(
+ whichUtxosWereConsumed(
+ previousUtxosBeforeMultiXecReceiveTx,
+ currentUtxosAfterMultiXecReceiveTx,
+ ),
+ ).toStrictEqual(false);
+ });
+ test('whichUtxosWereConsumed correctly identifies consumed utxos from a single send XEC tx', async () => {
+ expect(
+ whichUtxosWereConsumed(
+ previousUtxosBeforeSingleXecSendTx,
+ currentUtxosAfterSingleXecSendTx,
+ ),
+ ).toStrictEqual(utxosConsumedBySingleXecSendTx);
+ });
+ test('whichUtxosWereConsumed correctly identifies consumed utxos from a send all XEC tx [template]', async () => {
+ expect(
+ whichUtxosWereConsumed(
+ previousUtxosBeforeSendAllTxTemplate,
+ currentUtxosAfterSendAllTxTemplate,
+ ),
+ ).toStrictEqual(utxosConsumedBySendAllTxTemplate);
+ });
+ test('whichUtxosWereConsumed correctly identifies consumed utxos from a send all XEC tx', async () => {
+ expect(
+ whichUtxosWereConsumed(
+ previousUtxosBeforeSendAllTx,
+ currentUtxosAfterSendAllTx,
+ ),
+ ).toStrictEqual(utxosConsumedBySendAllTx);
+ });
+ test('whichUtxosWereConsumed correctly identifies consumed utxos from a single send XEC tx [template]', async () => {
+ expect(
+ whichUtxosWereConsumed(
+ previousUtxosTemplate,
+ currentUtxosAfterSingleXecSendTxTemplate,
+ ),
+ ).toStrictEqual(utxosConsumedBySingleXecSendTxTemplate);
+ });
+ test('whichUtxosWereConsumed correctly identifies consumed utxos from a send eToken tx [template]', async () => {
+ expect(
+ whichUtxosWereConsumed(
+ previousUtxosTemplate,
+ currentUtxosAfterEtokenSendTxTemplate,
+ ),
+ ).toStrictEqual(utxosConsumedByEtokenSendTxTemplate);
+ });
+ test('whichUtxosWereConsumed correctly identifies consumed utxos from a send eToken tx', async () => {
+ expect(
+ whichUtxosWereConsumed(
+ previousUtxosBeforeEtokenSendTx,
+ currentUtxosAfterEtokenSendTx,
+ ),
+ ).toStrictEqual(utxosConsumedByEtokenSendTx);
+ });
+ test('addNewHydratedUtxos correctly adds new utxos object to existing hydratedUtxoDetails object', async () => {
+ expect(
+ addNewHydratedUtxos(
+ newHydratedUtxosSingleTemplate,
+ hydratedUtxoDetailsBeforeAddingTemplate,
+ ),
+ ).toStrictEqual(hydratedUtxoDetailsAfterAddingSingleUtxoTemplate);
+ });
+ test('addNewHydratedUtxos correctly adds more than 20 new hydrated utxos to existing hydratedUtxoDetails object', async () => {
+ expect(
+ addNewHydratedUtxos(
+ addedHydratedUtxosOverTwenty,
+ existingHydratedUtxoDetails,
+ ),
+ ).toStrictEqual(existingHydratedUtxoDetailsAfterAdd);
+ });
+ test('removeConsumedUtxos correctly removes a single utxo from hydratedUtxoDetails - template', async () => {
+ expect(
+ removeConsumedUtxos(
+ consumedUtxoTemplate,
+ hydratedUtxoDetailsBeforeConsumedTemplate,
+ ),
+ ).toStrictEqual(hydratedUtxoDetailsAfterRemovingConsumedUtxoTemplate);
+ });
+ test('removeConsumedUtxos correctly removes a single utxo from hydratedUtxoDetails', async () => {
+ expect(
+ removeConsumedUtxos(
+ consumedUtxos,
+ hydratedUtxoDetailsBeforeRemovingConsumedUtxos,
+ ),
+ ).toStrictEqual(hydratedUtxoDetailsAfterRemovingConsumedUtxos);
+ });
+ test('removeConsumedUtxos correctly removes more than twenty utxos from hydratedUtxoDetails', async () => {
+ expect(
+ removeConsumedUtxos(
+ consumedUtxosMoreThanTwenty,
+ hydratedUtxoDetailsBeforeRemovingConsumedUtxos,
+ ),
+ ).toStrictEqual(
+ hydratedUtxoDetailsAfterRemovingMoreThanTwentyConsumedUtxos,
+ );
+ });
+ test('removeConsumedUtxos correctly removes more than twenty utxos from multiple utxo objects from hydratedUtxoDetails', async () => {
+ expect(
+ removeConsumedUtxos(
+ consumedUtxosMoreThanTwentyInRandomObjects,
+ hydratedUtxoDetailsBeforeRemovingConsumedUtxos,
+ ),
+ ).toStrictEqual(
+ hydratedUtxoDetailsAfterRemovingMoreThanTwentyConsumedUtxos,
+ );
+ });
+ test('getUtxoCount correctly calculates the total for a utxo object with empty addresses [template]', async () => {
+ expect(getUtxoCount(utxoCountSingleTemplate)).toStrictEqual(1);
+ });
+ test('getUtxoCount correctly calculates the total for multiple utxos [template]', async () => {
+ expect(getUtxoCount(utxoCountMultiTemplate)).toStrictEqual(12);
+ });
+ test('areAllUtxosIncludedInIncrementallyHydratedUtxos correctly identifies all utxos are in incrementally hydrated utxos [template]', async () => {
+ expect(
+ areAllUtxosIncludedInIncrementallyHydratedUtxos(
+ incrementalUtxosTemplate,
+ incrementallyHydratedUtxosTemplate,
+ ),
+ ).toBe(true);
+ });
+ test('areAllUtxosIncludedInIncrementallyHydratedUtxos returns false if a utxo in the utxo set is not in incrementally hydrated utxos [template]', async () => {
+ expect(
+ areAllUtxosIncludedInIncrementallyHydratedUtxos(
+ incrementalUtxosTemplate,
+ incrementallyHydratedUtxosTemplateMissing,
+ ),
+ ).toBe(false);
+ });
+ test('areAllUtxosIncludedInIncrementallyHydratedUtxos correctly identifies all utxos are in incrementally hydrated utxos', async () => {
+ expect(
+ areAllUtxosIncludedInIncrementallyHydratedUtxos(
+ utxosAfterSentTxIncremental,
+ incrementallyHydratedUtxosAfterProcessing,
+ ),
+ ).toBe(true);
+ });
+ test('areAllUtxosIncludedInIncrementallyHydratedUtxos returns false if a utxo in the utxo set is not in incrementally hydrated utxos', async () => {
+ expect(
+ areAllUtxosIncludedInIncrementallyHydratedUtxos(
+ utxosAfterSentTxIncremental,
+ incrementallyHydratedUtxosAfterProcessingOneMissing,
+ ),
+ ).toBe(false);
+ });
+ test('areAllUtxosIncludedInIncrementallyHydratedUtxos returns false if utxo set is invalid', async () => {
+ expect(
+ areAllUtxosIncludedInIncrementallyHydratedUtxos(
+ {},
+ incrementallyHydratedUtxosAfterProcessing,
+ ),
+ ).toBe(false);
+ });
+ test('convertEtokenToEcashAddr successfully converts a valid eToken address to eCash', async () => {
+ const result = convertEtokenToEcashAddr(
+ 'etoken:qpatql05s9jfavnu0tv6lkjjk25n6tmj9gcldpffcs',
+ );
+ expect(result).toStrictEqual(
+ 'ecash:qpatql05s9jfavnu0tv6lkjjk25n6tmj9gkpyrlwu8',
+ );
+ });
+
+ test('convertEtokenToEcashAddr successfully converts prefixless eToken address as input', async () => {
+ const result = convertEtokenToEcashAddr(
+ 'qpatql05s9jfavnu0tv6lkjjk25n6tmj9gcldpffcs',
+ );
+ expect(result).toStrictEqual(
+ 'ecash:qpatql05s9jfavnu0tv6lkjjk25n6tmj9gkpyrlwu8',
+ );
+ });
+
+ test('convertEtokenToEcashAddr throws error with an invalid eToken address as input', async () => {
+ const result = convertEtokenToEcashAddr('etoken:qpj9gcldpffcs');
+ expect(result).toStrictEqual(
+ new Error(
+ 'cashMethods.convertToEcashAddr() error: etoken:qpj9gcldpffcs is not a valid etoken address',
+ ),
+ );
+ });
+
+ test('convertEtokenToEcashAddr throws error with an ecash address as input', async () => {
+ const result = convertEtokenToEcashAddr(
+ 'ecash:qpatql05s9jfavnu0tv6lkjjk25n6tmj9gkpyrlwu8',
+ );
+ expect(result).toStrictEqual(
+ new Error(
+ 'cashMethods.convertToEcashAddr() error: ecash:qpatql05s9jfavnu0tv6lkjjk25n6tmj9gkpyrlwu8 is not a valid etoken address',
+ ),
+ );
+ });
+
+ test('convertEtokenToEcashAddr throws error with null input', async () => {
+ const result = convertEtokenToEcashAddr(null);
+ expect(result).toStrictEqual(
+ new Error(
+ 'cashMethods.convertToEcashAddr() error: No etoken address provided',
+ ),
+ );
+ });
+
+ test('convertEtokenToEcashAddr throws error with empty string input', async () => {
+ const result = convertEtokenToEcashAddr('');
+ expect(result).toStrictEqual(
+ new Error(
+ 'cashMethods.convertToEcashAddr() error: No etoken address provided',
+ ),
+ );
+ });
+});
diff --git a/web/cashtab-v2/src/utils/__tests__/formatting.test.js b/web/cashtab-v2/src/utils/__tests__/formatting.test.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/__tests__/formatting.test.js
@@ -0,0 +1,140 @@
+import {
+ formatDate,
+ formatFiatBalance,
+ formatSavedBalance,
+ formatBalance,
+} from '@utils/formatting';
+
+describe('Correctly executes formatting functions', () => {
+ it(`test formatBalance with an input of 0`, () => {
+ expect(formatBalance('0')).toBe('0');
+ });
+ it(`test formatBalance with zero XEC balance input`, () => {
+ expect(formatBalance('0', 'en-US')).toBe('0');
+ });
+ it(`test formatBalance with a small XEC balance input with 2+ decimal figures`, () => {
+ expect(formatBalance('1574.5445', 'en-US')).toBe('1,574.54');
+ });
+ it(`test formatBalance with 1 Million XEC balance input`, () => {
+ expect(formatBalance('1000000', 'en-US')).toBe('1,000,000');
+ });
+ it(`test formatBalance with 1 Billion XEC balance input`, () => {
+ expect(formatBalance('1000000000', 'en-US')).toBe('1,000,000,000');
+ });
+ it(`test formatBalance with total supply as XEC balance input`, () => {
+ expect(formatBalance('21000000000000', 'en-US')).toBe(
+ '21,000,000,000,000',
+ );
+ });
+ it(`test formatBalance with > total supply as XEC balance input`, () => {
+ expect(formatBalance('31000000000000', 'en-US')).toBe(
+ '31,000,000,000,000',
+ );
+ });
+ it(`test formatBalance with no balance`, () => {
+ expect(formatBalance('', 'en-US')).toBe('0');
+ });
+ it(`test formatBalance with null input`, () => {
+ expect(formatBalance(null, 'en-US')).toBe('0');
+ });
+ it(`test formatBalance with undefined as input`, () => {
+ expect(formatBalance(undefined, 'en-US')).toBe('NaN');
+ });
+ it(`test formatBalance with non-numeric input`, () => {
+ expect(formatBalance('CainBCHA', 'en-US')).toBe('NaN');
+ });
+ it(`Accepts a valid unix timestamp`, () => {
+ expect(formatDate('1639679649', 'fr')).toBe('16 déc. 2021');
+ });
+
+ it(`Accepts an empty string and generates a new timestamp`, () => {
+ expect(formatDate('', 'en-US')).toBe(
+ new Date().toLocaleDateString('en-US', {
+ month: 'short',
+ day: 'numeric',
+ year: 'numeric',
+ }),
+ );
+ });
+
+ it(`Accepts no parameter and generates a new timestamp`, () => {
+ expect(formatDate(null, 'en-US')).toBe(
+ new Date().toLocaleDateString('en-US', {
+ month: 'short',
+ day: 'numeric',
+ year: 'numeric',
+ }),
+ );
+ });
+
+ it(`Accepts 'undefined' as a parameter and generates a new date`, () => {
+ expect(formatDate(undefined, 'en-US')).toBe(
+ new Date().toLocaleDateString('en-US', {
+ month: 'short',
+ day: 'numeric',
+ year: 'numeric',
+ }),
+ );
+ });
+ it(`Rejects an invalid string containing letters.`, () => {
+ expect(formatDate('f', 'en-US')).toBe('Invalid Date');
+ });
+ it(`Rejects an invalid string containing numbers.`, () => {
+ expect(formatDate('10000000000000000', 'en-US')).toBe('Invalid Date');
+ });
+
+ it(`test formatSavedBalance with zero XEC balance input`, () => {
+ expect(formatSavedBalance('0', 'en-US')).toBe('0');
+ });
+ it(`test formatSavedBalance with a small XEC balance input with 2+ decimal figures`, () => {
+ expect(formatSavedBalance('1574.5445', 'en-US')).toBe('1,574.54');
+ });
+ it(`test formatSavedBalance with 1 Million XEC balance input`, () => {
+ expect(formatSavedBalance('1000000', 'en-US')).toBe('1,000,000');
+ });
+ it(`test formatSavedBalance with 1 Billion XEC balance input`, () => {
+ expect(formatSavedBalance('1000000000', 'en-US')).toBe('1,000,000,000');
+ });
+ it(`test formatSavedBalance with total supply as XEC balance input`, () => {
+ expect(formatSavedBalance('21000000000000', 'en-US')).toBe(
+ '21,000,000,000,000',
+ );
+ });
+ it(`test formatSavedBalance with > total supply as XEC balance input`, () => {
+ expect(formatSavedBalance('31000000000000', 'en-US')).toBe(
+ '31,000,000,000,000',
+ );
+ });
+ it(`test formatSavedBalance with no balance`, () => {
+ expect(formatSavedBalance('', 'en-US')).toBe('0');
+ });
+ it(`test formatSavedBalance with null input`, () => {
+ expect(formatSavedBalance(null, 'en-US')).toBe('0');
+ });
+ it(`test formatSavedBalance with undefined sw.state.balance or sw.state.balance.totalBalance as input`, () => {
+ expect(formatSavedBalance(undefined, 'en-US')).toBe('N/A');
+ });
+ it(`test formatSavedBalance with non-numeric input`, () => {
+ expect(formatSavedBalance('CainBCHA', 'en-US')).toBe('NaN');
+ });
+ it(`test formatFiatBalance with zero XEC balance input`, () => {
+ expect(formatFiatBalance(Number('0'), 'en-US')).toBe('0.00');
+ });
+ it(`test formatFiatBalance with a small XEC balance input with 2+ decimal figures`, () => {
+ expect(formatFiatBalance(Number('565.54111'), 'en-US')).toBe('565.54');
+ });
+ it(`test formatFiatBalance with a large XEC balance input with 2+ decimal figures`, () => {
+ expect(formatFiatBalance(Number('131646565.54111'), 'en-US')).toBe(
+ '131,646,565.54',
+ );
+ });
+ it(`test formatFiatBalance with no balance`, () => {
+ expect(formatFiatBalance('', 'en-US')).toBe('');
+ });
+ it(`test formatFiatBalance with null input`, () => {
+ expect(formatFiatBalance(null, 'en-US')).toBe(null);
+ });
+ it(`test formatFiatBalance with undefined input`, () => {
+ expect(formatFiatBalance(undefined, 'en-US')).toBe(undefined);
+ });
+});
diff --git a/web/cashtab-v2/src/utils/__tests__/tokenMethods.test.js b/web/cashtab-v2/src/utils/__tests__/tokenMethods.test.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/__tests__/tokenMethods.test.js
@@ -0,0 +1,16 @@
+import { checkForTokenById } from '../tokenMethods';
+import { mockTokens } from '../__mocks__/mockTokenList';
+
+describe('Correctly executes token parsing methods', () => {
+ it(`checkForTokenById returns 'false' if token ID is not found in wallet token list`, () => {
+ expect(checkForTokenById(mockTokens, 'not there')).toBe(false);
+ });
+ it(`checkForTokenById returns 'true' if token ID is found in wallet token list`, () => {
+ expect(
+ checkForTokenById(
+ mockTokens,
+ '50d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e',
+ ),
+ ).toBe(true);
+ });
+});
diff --git a/web/cashtab-v2/src/utils/__tests__/validation.test.js b/web/cashtab-v2/src/utils/__tests__/validation.test.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/__tests__/validation.test.js
@@ -0,0 +1,596 @@
+import {
+ shouldRejectAmountInput,
+ fiatToCrypto,
+ isValidTokenName,
+ isValidTokenTicker,
+ isValidTokenDecimals,
+ isValidTokenInitialQty,
+ isValidTokenDocumentUrl,
+ isValidTokenStats,
+ isValidCashtabSettings,
+ isValidXecAddress,
+ isValidEtokenAddress,
+ isValidXecSendAmount,
+ isValidSendToMany,
+ isValidUtxo,
+ isValidBchApiUtxoObject,
+ isValidEtokenBurnAmount,
+ isValidTokenId,
+ isValidXecAirdrop,
+ isValidAirdropOutputsArray,
+} from '../validation';
+import { currency } from '@components/Common/Ticker.js';
+import { fromSmallestDenomination } from '@utils/cashMethods';
+import {
+ stStatsValid,
+ noCovidStatsValid,
+ noCovidStatsInvalid,
+ cGenStatsValid,
+} from '../__mocks__/mockTokenStats';
+import {
+ validXecAirdropList,
+ invalidXecAirdropList,
+ invalidXecAirdropListMultipleInvalidValues,
+ invalidXecAirdropListMultipleValidValues,
+} from '../__mocks__/mockXecAirdropRecipients';
+
+import {
+ validUtxo,
+ invalidUtxoMissingHeight,
+ invalidUtxoTxidUndefined,
+ hydratedUtxoDetailsAfterRemovingConsumedUtxos,
+ utxosAfterSentTxIncremental,
+} from '../__mocks__/incrementalUtxoMocks';
+
+describe('Validation utils', () => {
+ it(`Returns 'false' if ${currency.ticker} send amount is a valid send amount`, () => {
+ expect(shouldRejectAmountInput('10', currency.ticker, 20.0, 300)).toBe(
+ false,
+ );
+ });
+ it(`Returns 'false' if ${currency.ticker} send amount is a valid send amount in USD`, () => {
+ // Here, user is trying to send $170 USD, where 1 BCHA = $20 USD, and the user has a balance of 15 BCHA or $300
+ expect(shouldRejectAmountInput('170', 'USD', 20.0, 15)).toBe(false);
+ });
+ it(`Returns not a number if ${currency.ticker} send amount is not a number`, () => {
+ const expectedValidationError = `Amount must be a number`;
+ expect(
+ shouldRejectAmountInput('Not a number', currency.ticker, 20.0, 3),
+ ).toBe(expectedValidationError);
+ });
+ it(`Returns amount must be greater than 0 if ${currency.ticker} send amount is 0`, () => {
+ const expectedValidationError = `Amount must be greater than 0`;
+ expect(shouldRejectAmountInput('0', currency.ticker, 20.0, 3)).toBe(
+ expectedValidationError,
+ );
+ });
+ it(`Returns amount must be greater than 0 if ${currency.ticker} send amount is less than 0`, () => {
+ const expectedValidationError = `Amount must be greater than 0`;
+ expect(
+ shouldRejectAmountInput('-0.031', currency.ticker, 20.0, 3),
+ ).toBe(expectedValidationError);
+ });
+ it(`Returns balance error if ${currency.ticker} send amount is greater than user balance`, () => {
+ const expectedValidationError = `Amount cannot exceed your ${currency.ticker} balance`;
+ expect(shouldRejectAmountInput('17', currency.ticker, 20.0, 3)).toBe(
+ expectedValidationError,
+ );
+ });
+ it(`Returns balance error if ${currency.ticker} send amount is greater than user balance`, () => {
+ const expectedValidationError = `Amount cannot exceed your ${currency.ticker} balance`;
+ expect(shouldRejectAmountInput('17', currency.ticker, 20.0, 3)).toBe(
+ expectedValidationError,
+ );
+ });
+ it(`Returns error if ${
+ currency.ticker
+ } send amount is less than ${fromSmallestDenomination(
+ currency.dustSats,
+ ).toString()} minimum`, () => {
+ const expectedValidationError = `Send amount must be at least ${fromSmallestDenomination(
+ currency.dustSats,
+ ).toString()} ${currency.ticker}`;
+ expect(
+ shouldRejectAmountInput(
+ (
+ fromSmallestDenomination(currency.dustSats).toString() -
+ 0.00000001
+ ).toString(),
+ currency.ticker,
+ 20.0,
+ 3,
+ ),
+ ).toBe(expectedValidationError);
+ });
+ it(`Returns error if ${
+ currency.ticker
+ } send amount is less than ${fromSmallestDenomination(
+ currency.dustSats,
+ ).toString()} minimum in fiat currency`, () => {
+ const expectedValidationError = `Send amount must be at least ${fromSmallestDenomination(
+ currency.dustSats,
+ ).toString()} ${currency.ticker}`;
+ expect(
+ shouldRejectAmountInput('0.0000005', 'USD', 0.00005, 1000000),
+ ).toBe(expectedValidationError);
+ });
+ it(`Returns balance error if ${currency.ticker} send amount is greater than user balance with fiat currency selected`, () => {
+ const expectedValidationError = `Amount cannot exceed your ${currency.ticker} balance`;
+ // Here, user is trying to send $170 USD, where 1 BCHA = $20 USD, and the user has a balance of 5 BCHA or $100
+ expect(shouldRejectAmountInput('170', 'USD', 20.0, 5)).toBe(
+ expectedValidationError,
+ );
+ });
+ it(`Returns precision error if ${currency.ticker} send amount has more than ${currency.cashDecimals} decimal places`, () => {
+ const expectedValidationError = `${currency.ticker} transactions do not support more than ${currency.cashDecimals} decimal places`;
+ expect(
+ shouldRejectAmountInput('17.123456789', currency.ticker, 20.0, 35),
+ ).toBe(expectedValidationError);
+ });
+ it(`Returns expected crypto amount with ${currency.cashDecimals} decimals of precision even if inputs have higher precision`, () => {
+ expect(fiatToCrypto('10.97231694823432', 20.3231342349234234, 8)).toBe(
+ '0.53989295',
+ );
+ });
+ it(`Returns expected crypto amount with ${currency.cashDecimals} decimals of precision even if inputs have higher precision`, () => {
+ expect(fiatToCrypto('10.97231694823432', 20.3231342349234234, 2)).toBe(
+ '0.54',
+ );
+ });
+ it(`Returns expected crypto amount with ${currency.cashDecimals} decimals of precision even if inputs have lower precision`, () => {
+ expect(fiatToCrypto('10.94', 10, 8)).toBe('1.09400000');
+ });
+ it(`Accepts a valid ${currency.tokenTicker} token name`, () => {
+ expect(isValidTokenName('Valid token name')).toBe(true);
+ });
+ it(`Accepts a valid ${currency.tokenTicker} token name that is a stringified number`, () => {
+ expect(isValidTokenName('123456789')).toBe(true);
+ });
+ it(`Rejects ${currency.tokenTicker} token name if longer than 68 characters`, () => {
+ expect(
+ isValidTokenName(
+ 'This token name is not valid because it is longer than 68 characters which is really pretty long for a token name when you think about it and all',
+ ),
+ ).toBe(false);
+ });
+ it(`Rejects ${currency.tokenTicker} token name if empty string`, () => {
+ expect(isValidTokenName('')).toBe(false);
+ });
+ it(`Accepts a 4-char ${currency.tokenTicker} token ticker`, () => {
+ expect(isValidTokenTicker('DOGE')).toBe(true);
+ });
+ it(`Accepts a 12-char ${currency.tokenTicker} token ticker`, () => {
+ expect(isValidTokenTicker('123456789123')).toBe(true);
+ });
+ it(`Rejects ${currency.tokenTicker} token ticker if empty string`, () => {
+ expect(isValidTokenTicker('')).toBe(false);
+ });
+ it(`Rejects ${currency.tokenTicker} token ticker if > 12 chars`, () => {
+ expect(isValidTokenTicker('1234567891234')).toBe(false);
+ });
+ it(`Accepts ${currency.tokenDecimals} if zero`, () => {
+ expect(isValidTokenDecimals('0')).toBe(true);
+ });
+ it(`Accepts ${currency.tokenDecimals} if between 0 and 9 inclusive`, () => {
+ expect(isValidTokenDecimals('9')).toBe(true);
+ });
+ it(`Rejects ${currency.tokenDecimals} if empty string`, () => {
+ expect(isValidTokenDecimals('')).toBe(false);
+ });
+ it(`Rejects ${currency.tokenDecimals} if non-integer`, () => {
+ expect(isValidTokenDecimals('1.7')).toBe(false);
+ });
+ it(`Accepts ${currency.tokenDecimals} initial genesis quantity at minimum amount for 3 decimal places`, () => {
+ expect(isValidTokenInitialQty('0.001', '3')).toBe(true);
+ });
+ it(`Accepts ${currency.tokenDecimals} initial genesis quantity at minimum amount for 9 decimal places`, () => {
+ expect(isValidTokenInitialQty('0.000000001', '9')).toBe(true);
+ });
+ it(`Accepts ${currency.tokenDecimals} initial genesis quantity at amount below 100 billion`, () => {
+ expect(isValidTokenInitialQty('1000', '0')).toBe(true);
+ });
+ it(`Accepts highest possible ${currency.tokenDecimals} initial genesis quantity at amount below 100 billion`, () => {
+ expect(isValidTokenInitialQty('99999999999.999999999', '9')).toBe(true);
+ });
+ it(`Accepts ${currency.tokenDecimals} initial genesis quantity if decimal places equal tokenDecimals`, () => {
+ expect(isValidTokenInitialQty('0.123', '3')).toBe(true);
+ });
+ it(`Accepts ${currency.tokenDecimals} initial genesis quantity if decimal places are less than tokenDecimals`, () => {
+ expect(isValidTokenInitialQty('0.12345', '9')).toBe(true);
+ });
+ it(`Rejects ${currency.tokenDecimals} initial genesis quantity of zero`, () => {
+ expect(isValidTokenInitialQty('0', '9')).toBe(false);
+ });
+ it(`Rejects ${currency.tokenDecimals} initial genesis quantity if tokenDecimals is not valid`, () => {
+ expect(isValidTokenInitialQty('0', '')).toBe(false);
+ });
+ it(`Rejects ${currency.tokenDecimals} initial genesis quantity if 100 billion or higher`, () => {
+ expect(isValidTokenInitialQty('100000000000', '0')).toBe(false);
+ });
+ it(`Rejects ${currency.tokenDecimals} initial genesis quantity if it has more decimal places than tokenDecimals`, () => {
+ expect(isValidTokenInitialQty('1.5', '0')).toBe(false);
+ });
+ it(`Accepts a valid ${currency.tokenTicker} token document URL`, () => {
+ expect(isValidTokenDocumentUrl('cashtabapp.com')).toBe(true);
+ });
+ it(`Accepts a valid ${currency.tokenTicker} token document URL including special URL characters`, () => {
+ expect(isValidTokenDocumentUrl('https://cashtabapp.com/')).toBe(true);
+ });
+ it(`Accepts a blank string as a valid ${currency.tokenTicker} token document URL`, () => {
+ expect(isValidTokenDocumentUrl('')).toBe(true);
+ });
+ it(`Rejects ${currency.tokenTicker} token name if longer than 68 characters`, () => {
+ expect(
+ isValidTokenDocumentUrl(
+ 'http://www.ThisTokenDocumentUrlIsActuallyMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchTooLong.com/',
+ ),
+ ).toBe(false);
+ });
+ it(`Accepts a domain input with https protocol as ${currency.tokenTicker} token document URL`, () => {
+ expect(isValidTokenDocumentUrl('https://google.com')).toBe(true);
+ });
+ it(`Accepts a domain input with http protocol as ${currency.tokenTicker} token document URL`, () => {
+ expect(isValidTokenDocumentUrl('http://test.com')).toBe(true);
+ });
+ it(`Accepts a domain input with a primary and secondary top level domain as ${currency.tokenTicker} token document URL`, () => {
+ expect(isValidTokenDocumentUrl('http://test.co.uk')).toBe(true);
+ });
+ it(`Accepts a domain input with just a subdomain as ${currency.tokenTicker} token document URL`, () => {
+ expect(isValidTokenDocumentUrl('www.test.co.uk')).toBe(true);
+ });
+ it(`Rejects a domain input with no top level domain, protocol or subdomain ${currency.tokenTicker} token document URL`, () => {
+ expect(isValidTokenDocumentUrl('mywebsite')).toBe(false);
+ });
+ it(`Rejects a domain input as numbers ${currency.tokenTicker} token document URL`, () => {
+ expect(isValidTokenDocumentUrl(12345)).toBe(false);
+ });
+ it(`Correctly validates token stats for token created before the ${currency.ticker} fork`, () => {
+ expect(isValidTokenStats(stStatsValid)).toBe(true);
+ });
+ it(`Correctly validates token stats for token created after the ${currency.ticker} fork`, () => {
+ expect(isValidTokenStats(noCovidStatsValid)).toBe(true);
+ });
+ it(`Correctly validates token stats for token with no minting baton`, () => {
+ expect(isValidTokenStats(cGenStatsValid)).toBe(true);
+ });
+ it(`Recognizes a token stats object with missing required keys as invalid`, () => {
+ expect(isValidTokenStats(noCovidStatsInvalid)).toBe(false);
+ });
+ it(`Recognizes a valid cashtab settings object`, () => {
+ expect(
+ isValidCashtabSettings({ fiatCurrency: 'usd', sendModal: false }),
+ ).toBe(true);
+ });
+ it(`Rejects a cashtab settings object for an unsupported currency`, () => {
+ expect(
+ isValidCashtabSettings({ fiatCurrency: 'xau', sendModal: false }),
+ ).toBe(false);
+ });
+ it(`Rejects a corrupted cashtab settings object for an unsupported currency`, () => {
+ expect(
+ isValidCashtabSettings({
+ fiatCurrencyWrongLabel: 'usd',
+ sendModal: false,
+ }),
+ ).toBe(false);
+ });
+ it(`Rejects a valid fiatCurrency setting but undefined sendModal setting`, () => {
+ expect(isValidCashtabSettings({ fiatCurrency: 'usd' })).toBe(false);
+ });
+ it(`Rejects a valid fiatCurrency setting but invalid sendModal setting`, () => {
+ expect(
+ isValidCashtabSettings({
+ fiatCurrency: 'usd',
+ sendModal: 'NOTVALID',
+ }),
+ ).toBe(false);
+ });
+ it(`isValidXecAddress correctly validates a valid XEC address with ecash: prefix`, () => {
+ const addr = 'ecash:qz2708636snqhsxu8wnlka78h6fdp77ar59jrf5035';
+ expect(isValidXecAddress(addr)).toBe(true);
+ });
+ it(`isValidXecAddress correctly validates a valid XEC address without ecash: prefix`, () => {
+ const addr = 'qz2708636snqhsxu8wnlka78h6fdp77ar59jrf5035';
+ expect(isValidXecAddress(addr)).toBe(true);
+ });
+ it(`isValidXecAddress rejects a valid legacy address`, () => {
+ const addr = '1Efd9z9GRVJK2r73nUpFmBnsKUmfXNm2y2';
+ expect(isValidXecAddress(addr)).toBe(false);
+ });
+ it(`isValidXecAddress rejects a valid bitcoincash: address`, () => {
+ const addr = 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr';
+ expect(isValidXecAddress(addr)).toBe(false);
+ });
+ it(`isValidXecAddress rejects a valid etoken: address with prefix`, () => {
+ const addr = 'etoken:qz2708636snqhsxu8wnlka78h6fdp77ar5tv2tzg4r';
+ expect(isValidXecAddress(addr)).toBe(false);
+ });
+ it(`isValidXecAddress rejects a valid etoken: address without prefix`, () => {
+ const addr = 'qz2708636snqhsxu8wnlka78h6fdp77ar5tv2tzg4r';
+ expect(isValidXecAddress(addr)).toBe(false);
+ });
+ it(`isValidXecAddress rejects a valid simpleledger: address with prefix`, () => {
+ const addr = 'simpleledger:qrujw0wrzncyxw8q3d0xkfet4jafrqhk6csev0v6y3';
+ expect(isValidXecAddress(addr)).toBe(false);
+ });
+ it(`isValidXecAddress rejects a valid simpleledger: address without prefix`, () => {
+ const addr = 'qrujw0wrzncyxw8q3d0xkfet4jafrqhk6csev0v6y3';
+ expect(isValidXecAddress(addr)).toBe(false);
+ });
+ it(`isValidXecAddress rejects an invalid address`, () => {
+ const addr = 'wtf is this definitely not an address';
+ expect(isValidXecAddress(addr)).toBe(false);
+ });
+ it(`isValidXecAddress rejects a null input`, () => {
+ const addr = null;
+ expect(isValidXecAddress(addr)).toBe(false);
+ });
+ it(`isValidXecAddress rejects an empty string input`, () => {
+ const addr = '';
+ expect(isValidXecAddress(addr)).toBe(false);
+ });
+ it(`isValidEtokenAddress rejects a valid XEC address with ecash: prefix`, () => {
+ const addr = 'ecash:qz2708636snqhsxu8wnlka78h6fdp77ar59jrf5035';
+ expect(isValidEtokenAddress(addr)).toBe(false);
+ });
+ it(`isValidEtokenAddress rejects a valid XEC address without ecash: prefix`, () => {
+ const addr = 'qz2708636snqhsxu8wnlka78h6fdp77ar59jrf5035';
+ expect(isValidEtokenAddress(addr)).toBe(false);
+ });
+ it(`isValidEtokenAddress rejects a valid legacy address`, () => {
+ const addr = '1Efd9z9GRVJK2r73nUpFmBnsKUmfXNm2y2';
+ expect(isValidEtokenAddress(addr)).toBe(false);
+ });
+ it(`isValidEtokenAddress rejects a valid bitcoincash: address`, () => {
+ const addr = 'bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr';
+ expect(isValidEtokenAddress(addr)).toBe(false);
+ });
+ it(`isValidEtokenAddress correctly validates a valid etoken: address with prefix`, () => {
+ const addr = 'etoken:qz2708636snqhsxu8wnlka78h6fdp77ar5tv2tzg4r';
+ expect(isValidEtokenAddress(addr)).toBe(true);
+ });
+ it(`isValidEtokenAddress correctly validates a valid etoken: address without prefix`, () => {
+ const addr = 'qz2708636snqhsxu8wnlka78h6fdp77ar5tv2tzg4r';
+ expect(isValidEtokenAddress(addr)).toBe(true);
+ });
+ it(`isValidEtokenAddress rejects a valid simpleledger: address with prefix`, () => {
+ const addr = 'simpleledger:qrujw0wrzncyxw8q3d0xkfet4jafrqhk6csev0v6y3';
+ expect(isValidEtokenAddress(addr)).toBe(false);
+ });
+ it(`isValidEtokenAddress rejects a valid simpleledger: address without prefix`, () => {
+ const addr = 'qrujw0wrzncyxw8q3d0xkfet4jafrqhk6csev0v6y3';
+ expect(isValidEtokenAddress(addr)).toBe(false);
+ });
+ it(`isValidEtokenAddress rejects an invalid address`, () => {
+ const addr = 'wtf is this definitely not an address';
+ expect(isValidEtokenAddress(addr)).toBe(false);
+ });
+ it(`isValidEtokenAddress rejects a null input`, () => {
+ const addr = null;
+ expect(isValidEtokenAddress(addr)).toBe(false);
+ });
+ it(`isValidEtokenAddress rejects an empty string input`, () => {
+ const addr = '';
+ expect(isValidEtokenAddress(addr)).toBe(false);
+ });
+ it(`isValidXecSendAmount accepts the dust minimum`, () => {
+ const testXecSendAmount = fromSmallestDenomination(currency.dustSats);
+ expect(isValidXecSendAmount(testXecSendAmount)).toBe(true);
+ });
+ it(`isValidXecSendAmount accepts arbitrary number above dust minimum`, () => {
+ const testXecSendAmount =
+ fromSmallestDenomination(currency.dustSats) + 1.75;
+ expect(isValidXecSendAmount(testXecSendAmount)).toBe(true);
+ });
+ it(`isValidXecSendAmount rejects zero`, () => {
+ const testXecSendAmount = 0;
+ expect(isValidXecSendAmount(testXecSendAmount)).toBe(false);
+ });
+ it(`isValidXecSendAmount rejects a non-number string`, () => {
+ const testXecSendAmount = 'not a number';
+ expect(isValidXecSendAmount(testXecSendAmount)).toBe(false);
+ });
+ it(`isValidXecSendAmount accepts arbitrary number above dust minimum as a string`, () => {
+ const testXecSendAmount = `${
+ fromSmallestDenomination(currency.dustSats) + 1.75
+ }`;
+ expect(isValidXecSendAmount(testXecSendAmount)).toBe(true);
+ });
+ it(`isValidXecSendAmount rejects null`, () => {
+ const testXecSendAmount = null;
+ expect(isValidXecSendAmount(testXecSendAmount)).toBe(false);
+ });
+ it(`isValidXecSendAmount rejects undefined`, () => {
+ const testXecSendAmount = undefined;
+ expect(isValidXecSendAmount(testXecSendAmount)).toBe(false);
+ });
+ it(`isValidUtxo returns true for a valid utxo`, () => {
+ expect(isValidUtxo(validUtxo)).toBe(true);
+ });
+ it(`isValidUtxo returns false for missing height`, () => {
+ expect(isValidUtxo(invalidUtxoMissingHeight)).toBe(false);
+ });
+ it(`isValidUtxo returns false for undefined tx_hash`, () => {
+ expect(isValidUtxo(invalidUtxoTxidUndefined)).toBe(false);
+ });
+ it(`isValidUtxo returns false for null`, () => {
+ expect(isValidUtxo(null)).toBe(false);
+ });
+ it(`isValidUtxo returns false for undefined`, () => {
+ expect(isValidUtxo()).toBe(false);
+ });
+ it(`isValidUtxo returns false for empty object`, () => {
+ expect(isValidUtxo({})).toBe(false);
+ });
+ it(`isValidBchApiUtxoObject returns false for object`, () => {
+ expect(isValidBchApiUtxoObject({})).toBe(false);
+ });
+ it(`isValidBchApiUtxoObject returns false for empty array`, () => {
+ expect(isValidBchApiUtxoObject([])).toBe(false);
+ });
+ it(`isValidBchApiUtxoObject returns false for null`, () => {
+ expect(isValidBchApiUtxoObject(null)).toBe(false);
+ });
+ it(`isValidBchApiUtxoObject returns false for undefined`, () => {
+ expect(isValidBchApiUtxoObject(undefined)).toBe(false);
+ });
+ it(`isValidBchApiUtxoObject returns false for hydratedUtxoDetails type object`, () => {
+ expect(
+ isValidBchApiUtxoObject(
+ hydratedUtxoDetailsAfterRemovingConsumedUtxos,
+ ),
+ ).toBe(false);
+ });
+ it(`isValidBchApiUtxoObject returns true for hydratedUtxoDetails.slpUtxos`, () => {
+ expect(
+ isValidBchApiUtxoObject(
+ hydratedUtxoDetailsAfterRemovingConsumedUtxos.slpUtxos,
+ ),
+ ).toBe(true);
+ });
+ it(`isValidBchApiUtxoObject returns true for valid bch-api utxos object`, () => {
+ expect(isValidBchApiUtxoObject(utxosAfterSentTxIncremental)).toBe(true);
+ });
+ it(`isValidEtokenBurnAmount rejects null`, () => {
+ const testEtokenBurnAmount = null;
+ expect(isValidEtokenBurnAmount(testEtokenBurnAmount)).toBe(false);
+ });
+ it(`isValidEtokenBurnAmount rejects undefined`, () => {
+ const testEtokenBurnAmount = undefined;
+ expect(isValidEtokenBurnAmount(testEtokenBurnAmount)).toBe(false);
+ });
+ it(`isValidEtokenBurnAmount rejects a burn amount that is 0`, () => {
+ const testEtokenBurnAmount = 0;
+ expect(isValidEtokenBurnAmount(testEtokenBurnAmount, 100)).toBe(false);
+ });
+ it(`isValidEtokenBurnAmount rejects a burn amount that is negative`, () => {
+ const testEtokenBurnAmount = -50;
+ expect(isValidEtokenBurnAmount(testEtokenBurnAmount, 100)).toBe(false);
+ });
+ it(`isValidEtokenBurnAmount rejects a burn amount that is more than the maxAmount param`, () => {
+ const testEtokenBurnAmount = 1000;
+ expect(isValidEtokenBurnAmount(testEtokenBurnAmount, 100)).toBe(false);
+ });
+ it(`isValidEtokenBurnAmount accepts a valid burn amount`, () => {
+ const testEtokenBurnAmount = 50;
+ expect(isValidEtokenBurnAmount(testEtokenBurnAmount, 100)).toBe(true);
+ });
+ it(`isValidEtokenBurnAmount accepts a valid burn amount with decimal points`, () => {
+ const testEtokenBurnAmount = 10.545454;
+ expect(isValidEtokenBurnAmount(testEtokenBurnAmount, 100)).toBe(true);
+ });
+ it(`isValidEtokenBurnAmount accepts a valid burn amount that is the same as the maxAmount`, () => {
+ const testEtokenBurnAmount = 100;
+ expect(isValidEtokenBurnAmount(testEtokenBurnAmount, 100)).toBe(true);
+ });
+ it(`isValidTokenId accepts valid token ID that is 64 chars in length`, () => {
+ const testValidTokenId =
+ '1c6c9c64d70b285befe733f175d0f384538576876bd280b10587df81279d3f5e';
+ expect(isValidTokenId(testValidTokenId)).toBe(true);
+ });
+ it(`isValidTokenId rejects a token ID that is less than 64 chars in length`, () => {
+ const testValidTokenId = '111111thisisaninvalidtokenid';
+ expect(isValidTokenId(testValidTokenId)).toBe(false);
+ });
+ it(`isValidTokenId rejects a token ID that is more than 64 chars in length`, () => {
+ const testValidTokenId =
+ '111111111c6c9c64d70b285befe733f175d0f384538576876bd280b10587df81279d3f5e';
+ expect(isValidTokenId(testValidTokenId)).toBe(false);
+ });
+ it(`isValidTokenId rejects a token ID number that is 64 digits in length`, () => {
+ const testValidTokenId = 8912345678912345678912345678912345678912345678912345678912345679;
+ expect(isValidTokenId(testValidTokenId)).toBe(false);
+ });
+ it(`isValidTokenId rejects null`, () => {
+ const testValidTokenId = null;
+ expect(isValidTokenId(testValidTokenId)).toBe(false);
+ });
+ it(`isValidTokenId rejects undefined`, () => {
+ const testValidTokenId = undefined;
+ expect(isValidTokenId(testValidTokenId)).toBe(false);
+ });
+ it(`isValidTokenId rejects empty string`, () => {
+ const testValidTokenId = '';
+ expect(isValidTokenId(testValidTokenId)).toBe(false);
+ });
+ it(`isValidTokenId rejects special character input`, () => {
+ const testValidTokenId = '^&$%@&^$@&%$!';
+ expect(isValidTokenId(testValidTokenId)).toBe(false);
+ });
+ it(`isValidTokenId rejects non-alphanumeric input`, () => {
+ const testValidTokenId = 99999999999;
+ expect(isValidTokenId(testValidTokenId)).toBe(false);
+ });
+ it(`isValidXecAirdrop accepts valid Total Airdrop Amount`, () => {
+ const testAirdropTotal = '1000000';
+ expect(isValidXecAirdrop(testAirdropTotal)).toBe(true);
+ });
+ it(`isValidXecAirdrop rejects null`, () => {
+ const testAirdropTotal = null;
+ expect(isValidXecAirdrop(testAirdropTotal)).toBe(false);
+ });
+ it(`isValidXecAirdrop rejects undefined`, () => {
+ const testAirdropTotal = undefined;
+ expect(isValidXecAirdrop(testAirdropTotal)).toBe(false);
+ });
+ it(`isValidXecAirdrop rejects empty string`, () => {
+ const testAirdropTotal = '';
+ expect(isValidXecAirdrop(testAirdropTotal)).toBe(false);
+ });
+ it(`isValidTokenId rejects an alphanumeric input`, () => {
+ const testAirdropTotal = 'a73hsyujs3737';
+ expect(isValidXecAirdrop(testAirdropTotal)).toBe(false);
+ });
+ it(`isValidTokenId rejects a number !> 0 in string format`, () => {
+ const testAirdropTotal = '0';
+ expect(isValidXecAirdrop(testAirdropTotal)).toBe(false);
+ });
+ it(`isValidAirdropOutputsArray accepts an airdrop list with valid XEC values`, () => {
+ // Tools.js logic removes the EOF newline before validation
+ const outputArray = validXecAirdropList.substring(
+ 0,
+ validXecAirdropList.length - 1,
+ );
+ expect(isValidAirdropOutputsArray(outputArray)).toBe(true);
+ });
+ it(`isValidAirdropOutputsArray rejects an airdrop list with invalid XEC values`, () => {
+ // Tools.js logic removes the EOF newline before validation
+ const outputArray = invalidXecAirdropList.substring(
+ 0,
+ invalidXecAirdropList.length - 1,
+ );
+ expect(isValidAirdropOutputsArray(outputArray)).toBe(false);
+ });
+ it(`isValidAirdropOutputsArray rejects null`, () => {
+ const testAirdropListValues = null;
+ expect(isValidAirdropOutputsArray(testAirdropListValues)).toBe(false);
+ });
+ it(`isValidAirdropOutputsArray rejects undefined`, () => {
+ const testAirdropListValues = undefined;
+ expect(isValidAirdropOutputsArray(testAirdropListValues)).toBe(false);
+ });
+ it(`isValidAirdropOutputsArray rejects empty string`, () => {
+ const testAirdropListValues = '';
+ expect(isValidAirdropOutputsArray(testAirdropListValues)).toBe(false);
+ });
+ it(`isValidAirdropOutputsArray rejects an airdrop list with multiple invalid XEC values per row`, () => {
+ // Tools.js logic removes the EOF newline before validation
+ const addressStringArray =
+ invalidXecAirdropListMultipleInvalidValues.substring(
+ 0,
+ invalidXecAirdropListMultipleInvalidValues.length - 1,
+ );
+
+ expect(isValidAirdropOutputsArray(addressStringArray)).toBe(false);
+ });
+ it(`isValidAirdropOutputsArray rejects an airdrop list with multiple valid XEC values per row`, () => {
+ // Tools.js logic removes the EOF newline before validation
+ const addressStringArray =
+ invalidXecAirdropListMultipleValidValues.substring(
+ 0,
+ invalidXecAirdropListMultipleValidValues.length - 1,
+ );
+
+ expect(isValidAirdropOutputsArray(addressStringArray)).toBe(false);
+ });
+});
diff --git a/web/cashtab-v2/src/utils/cashMethods.js b/web/cashtab-v2/src/utils/cashMethods.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/cashMethods.js
@@ -0,0 +1,930 @@
+import { currency } from '@components/Common/Ticker';
+import {
+ isValidXecAddress,
+ isValidEtokenAddress,
+ isValidUtxo,
+ isValidBchApiUtxoObject,
+} from '@utils/validation';
+import BigNumber from 'bignumber.js';
+import cashaddr from 'ecashaddrjs';
+
+export function parseOpReturn(hexStr) {
+ if (
+ !hexStr ||
+ typeof hexStr !== 'string' ||
+ hexStr.substring(0, 2) !== currency.opReturn.opReturnPrefixHex
+ ) {
+ return false;
+ }
+
+ hexStr = hexStr.slice(2); // remove the first byte i.e. 6a
+
+ /*
+ * @Return: resultArray is structured as follows:
+ * resultArray[0] is the transaction type i.e. eToken prefix, cashtab prefix, external message itself if unrecognized prefix
+ * resultArray[1] is the actual cashtab message or the 2nd part of an external message
+ * resultArray[2 - n] are the additional messages for future protcols
+ */
+ let resultArray = [];
+ let message = '';
+ let hexStrLength = hexStr.length;
+
+ for (let i = 0; hexStrLength !== 0; i++) {
+ // part 1: check the preceding byte value for the subsequent message
+ let byteValue = hexStr.substring(0, 2);
+ let msgByteSize = 0;
+ if (byteValue === currency.opReturn.opPushDataOne) {
+ // if this byte is 4c then the next byte is the message byte size - retrieve the message byte size only
+ msgByteSize = parseInt(hexStr.substring(2, 4), 16); // hex base 16 to decimal base 10
+ hexStr = hexStr.slice(4); // strip the 4c + message byte size info
+ } else {
+ // take the byte as the message byte size
+ msgByteSize = parseInt(hexStr.substring(0, 2), 16); // hex base 16 to decimal base 10
+ hexStr = hexStr.slice(2); // strip the message byte size info
+ }
+
+ // part 2: parse the subsequent message based on bytesize
+ const msgCharLength = 2 * msgByteSize;
+ message = hexStr.substring(0, msgCharLength);
+ if (i === 0 && message === currency.opReturn.appPrefixesHex.eToken) {
+ // add the extracted eToken prefix to array then exit loop
+ resultArray[i] = currency.opReturn.appPrefixesHex.eToken;
+ break;
+ } else if (
+ i === 0 &&
+ message === currency.opReturn.appPrefixesHex.cashtab
+ ) {
+ // add the extracted Cashtab prefix to array
+ resultArray[i] = currency.opReturn.appPrefixesHex.cashtab;
+ } else if (
+ i === 0 &&
+ message === currency.opReturn.appPrefixesHex.cashtabEncrypted
+ ) {
+ // add the Cashtab encryption prefix to array
+ resultArray[i] = currency.opReturn.appPrefixesHex.cashtabEncrypted;
+ } else {
+ // this is either an external message or a subsequent cashtab message loop to extract the message
+ resultArray[i] = message;
+ }
+
+ // strip out the parsed message
+ hexStr = hexStr.slice(msgCharLength);
+ hexStrLength = hexStr.length;
+ }
+ return resultArray;
+}
+
+export const fromLegacyDecimals = (
+ amount,
+ cashDecimals = currency.cashDecimals,
+) => {
+ // Input 0.00000546 BCH
+ // Output 5.46 XEC or 0.00000546 BCH, depending on currency.cashDecimals
+ const amountBig = new BigNumber(amount);
+ const conversionFactor = new BigNumber(10 ** (8 - cashDecimals));
+ const amountSmallestDenomination = amountBig
+ .times(conversionFactor)
+ .toNumber();
+ return amountSmallestDenomination;
+};
+
+export const fromSmallestDenomination = (
+ amount,
+ cashDecimals = currency.cashDecimals,
+) => {
+ const amountBig = new BigNumber(amount);
+ const multiplier = new BigNumber(10 ** (-1 * cashDecimals));
+ const amountInBaseUnits = amountBig.times(multiplier);
+ return amountInBaseUnits.toNumber();
+};
+
+export const toSmallestDenomination = (
+ sendAmount,
+ cashDecimals = currency.cashDecimals,
+) => {
+ // Replace the BCH.toSatoshi method with an equivalent function that works for arbitrary decimal places
+ // Example, for an 8 decimal place currency like Bitcoin
+ // Input: a BigNumber of the amount of Bitcoin to be sent
+ // Output: a BigNumber of the amount of satoshis to be sent, or false if input is invalid
+
+ // Validate
+ // Input should be a BigNumber with no more decimal places than cashDecimals
+ const isValidSendAmount =
+ BigNumber.isBigNumber(sendAmount) && sendAmount.dp() <= cashDecimals;
+ if (!isValidSendAmount) {
+ return false;
+ }
+ const conversionFactor = new BigNumber(10 ** cashDecimals);
+ const sendAmountSmallestDenomination = sendAmount.times(conversionFactor);
+ return sendAmountSmallestDenomination;
+};
+
+export const batchArray = (inputArray, batchSize) => {
+ // take an array of n elements, return an array of arrays each of length batchSize
+
+ const batchedArray = [];
+ for (let i = 0; i < inputArray.length; i += batchSize) {
+ const tempArray = inputArray.slice(i, i + batchSize);
+ batchedArray.push(tempArray);
+ }
+ return batchedArray;
+};
+
+export const flattenBatchedHydratedUtxos = batchedHydratedUtxoDetails => {
+ // Return same result as if only the bulk API call were made
+ // to do this, just need to move all utxos under one slpUtxos
+ /*
+ given
+ [
+ {
+ slpUtxos: [
+ {
+ utxos: [],
+ address: '',
+ }
+ ],
+ },
+ {
+ slpUtxos: [
+ {
+ utxos: [],
+ address: '',
+ }
+ ],
+ }
+ ]
+ return [
+ {
+ slpUtxos: [
+ {
+ utxos: [],
+ address: ''
+ },
+ {
+ utxos: [],
+ address: ''
+ },
+ ]
+ }
+ */
+ const flattenedBatchedHydratedUtxos = { slpUtxos: [] };
+ for (let i = 0; i < batchedHydratedUtxoDetails.length; i += 1) {
+ const theseSlpUtxos = batchedHydratedUtxoDetails[i].slpUtxos[0];
+ flattenedBatchedHydratedUtxos.slpUtxos.push(theseSlpUtxos);
+ }
+ return flattenedBatchedHydratedUtxos;
+};
+
+export const loadStoredWallet = walletStateFromStorage => {
+ // Accept cached tokens array that does not save BigNumber type of BigNumbers
+ // Return array with BigNumbers converted
+ // See BigNumber.js api for how to create a BigNumber object from an object
+ // https://mikemcl.github.io/bignumber.js/
+ const liveWalletState = walletStateFromStorage;
+ const { slpBalancesAndUtxos, tokens } = liveWalletState;
+ for (let i = 0; i < tokens.length; i += 1) {
+ const thisTokenBalance = tokens[i].balance;
+ thisTokenBalance._isBigNumber = true;
+ tokens[i].balance = new BigNumber(thisTokenBalance);
+ }
+
+ // Also confirm balance is correct
+ // Necessary step in case currency.decimals changed since last startup
+ const balancesRebased = normalizeBalance(slpBalancesAndUtxos);
+ liveWalletState.balances = balancesRebased;
+ return liveWalletState;
+};
+
+export const normalizeBalance = slpBalancesAndUtxos => {
+ const totalBalanceInSatoshis = slpBalancesAndUtxos.nonSlpUtxos.reduce(
+ (previousBalance, utxo) => previousBalance + utxo.value,
+ 0,
+ );
+ return {
+ totalBalanceInSatoshis,
+ totalBalance: fromSmallestDenomination(totalBalanceInSatoshis),
+ };
+};
+
+export const isValidStoredWallet = walletStateFromStorage => {
+ return (
+ typeof walletStateFromStorage === 'object' &&
+ 'state' in walletStateFromStorage &&
+ typeof walletStateFromStorage.state === 'object' &&
+ 'balances' in walletStateFromStorage.state &&
+ 'utxos' in walletStateFromStorage.state &&
+ 'hydratedUtxoDetails' in walletStateFromStorage.state &&
+ 'slpBalancesAndUtxos' in walletStateFromStorage.state &&
+ 'tokens' in walletStateFromStorage.state
+ );
+};
+
+export const getWalletState = wallet => {
+ if (!wallet || !wallet.state) {
+ return {
+ balances: { totalBalance: 0, totalBalanceInSatoshis: 0 },
+ hydratedUtxoDetails: {},
+ tokens: [],
+ slpBalancesAndUtxos: {},
+ parsedTxHistory: [],
+ utxos: [],
+ };
+ }
+
+ return wallet.state;
+};
+
+export function convertEtokenToEcashAddr(eTokenAddress) {
+ if (!eTokenAddress) {
+ return new Error(
+ `cashMethods.convertToEcashAddr() error: No etoken address provided`,
+ );
+ }
+
+ // Confirm input is a valid eToken address
+ const isValidInput = isValidEtokenAddress(eTokenAddress);
+ if (!isValidInput) {
+ return new Error(
+ `cashMethods.convertToEcashAddr() error: ${eTokenAddress} is not a valid etoken address`,
+ );
+ }
+
+ // Check for etoken: prefix
+ const isPrefixedEtokenAddress = eTokenAddress.slice(0, 7) === 'etoken:';
+
+ // If no prefix, assume it is checksummed for an etoken: prefix
+ const testedEtokenAddr = isPrefixedEtokenAddress
+ ? eTokenAddress
+ : `etoken:${eTokenAddress}`;
+
+ let ecashAddress;
+ try {
+ const { type, hash } = cashaddr.decode(testedEtokenAddr);
+ ecashAddress = cashaddr.encode('ecash', type, hash);
+ } catch (err) {
+ return err;
+ }
+
+ return ecashAddress;
+}
+
+export function convertToEcashPrefix(bitcoincashPrefixedAddress) {
+ // Prefix-less addresses may be valid, but the cashaddr.decode function used below
+ // will throw an error without a prefix. Hence, must ensure prefix to use that function.
+ const hasPrefix = bitcoincashPrefixedAddress.includes(':');
+ if (hasPrefix) {
+ // Is it bitcoincash: or simpleledger:
+ const { type, hash, prefix } = cashaddr.decode(
+ bitcoincashPrefixedAddress,
+ );
+
+ let newPrefix;
+ if (prefix === 'bitcoincash') {
+ newPrefix = 'ecash';
+ } else if (prefix === 'simpleledger') {
+ newPrefix = 'etoken';
+ } else {
+ return bitcoincashPrefixedAddress;
+ }
+
+ const convertedAddress = cashaddr.encode(newPrefix, type, hash);
+
+ return convertedAddress;
+ } else {
+ return bitcoincashPrefixedAddress;
+ }
+}
+
+export function toLegacyCash(addr) {
+ // Confirm input is a valid ecash address
+ const isValidInput = isValidXecAddress(addr);
+ if (!isValidInput) {
+ return new Error(`${addr} is not a valid ecash address`);
+ }
+
+ // Check for ecash: prefix
+ const isPrefixedXecAddress = addr.slice(0, 6) === 'ecash:';
+
+ // If no prefix, assume it is checksummed for an ecash: prefix
+ const testedXecAddr = isPrefixedXecAddress ? addr : `ecash:${addr}`;
+
+ let legacyCashAddress;
+ try {
+ const { type, hash } = cashaddr.decode(testedXecAddr);
+ legacyCashAddress = cashaddr.encode(currency.legacyPrefix, type, hash);
+ } catch (err) {
+ return err;
+ }
+ return legacyCashAddress;
+}
+
+export function toLegacyCashArray(addressArray) {
+ let cleanArray = []; // array of bch converted addresses to be returned
+
+ if (
+ addressArray === null ||
+ addressArray === undefined ||
+ !addressArray.length ||
+ addressArray === ''
+ ) {
+ return new Error('Invalid addressArray input');
+ }
+
+ const arrayLength = addressArray.length;
+
+ for (let i = 0; i < arrayLength; i++) {
+ let addressValueArr = addressArray[i].split(',');
+ let address = addressValueArr[0];
+ let value = addressValueArr[1];
+
+ // NB that toLegacyCash() includes address validation; will throw error for invalid address input
+ const legacyAddress = toLegacyCash(address);
+ if (legacyAddress instanceof Error) {
+ return legacyAddress;
+ }
+ let convertedArrayData = legacyAddress + ',' + value + '\n';
+ cleanArray.push(convertedArrayData);
+ }
+
+ return cleanArray;
+}
+
+export function toLegacyToken(addr) {
+ // Confirm input is a valid ecash address
+ const isValidInput = isValidEtokenAddress(addr);
+ if (!isValidInput) {
+ return new Error(`${addr} is not a valid etoken address`);
+ }
+
+ // Check for ecash: prefix
+ const isPrefixedEtokenAddress = addr.slice(0, 7) === 'etoken:';
+
+ // If no prefix, assume it is checksummed for an ecash: prefix
+ const testedEtokenAddr = isPrefixedEtokenAddress ? addr : `etoken:${addr}`;
+
+ let legacyTokenAddress;
+ try {
+ const { type, hash } = cashaddr.decode(testedEtokenAddr);
+ legacyTokenAddress = cashaddr.encode('simpleledger', type, hash);
+ } catch (err) {
+ return err;
+ }
+ return legacyTokenAddress;
+}
+
+export const confirmNonEtokenUtxos = (hydratedUtxos, nonEtokenUtxos) => {
+ // scan through hydratedUtxoDetails
+ for (let i = 0; i < hydratedUtxos.length; i += 1) {
+ // Find utxos with txids matching nonEtokenUtxos
+ if (nonEtokenUtxos.includes(hydratedUtxos[i].txid)) {
+ // Confirm that such utxos are not eToken utxos
+ hydratedUtxos[i].isValid = false;
+ }
+ }
+ return hydratedUtxos;
+};
+
+export const checkNullUtxosForTokenStatus = txDataResults => {
+ const nonEtokenUtxos = [];
+ for (let j = 0; j < txDataResults.length; j += 1) {
+ const thisUtxoTxid = txDataResults[j].txid;
+ const thisUtxoVout = txDataResults[j].details.vout;
+ // Iterate over outputs
+ for (let k = 0; k < thisUtxoVout.length; k += 1) {
+ const thisOutput = thisUtxoVout[k];
+ if (thisOutput.scriptPubKey.type === 'nulldata') {
+ const asmOutput = thisOutput.scriptPubKey.asm;
+ if (asmOutput.includes('OP_RETURN 5262419')) {
+ // then it's an eToken tx that has not been properly validated
+ // Do not include it in nonEtokenUtxos
+ // App will ignore it until SLPDB is able to validate it
+ /*
+ console.log(
+ `utxo ${thisUtxoTxid} requires further eToken validation, ignoring`,
+ );*/
+ } else {
+ // Otherwise it's just an OP_RETURN tx that SLPDB has some issue with
+ // It should still be in the user's utxo set
+ // Include it in nonEtokenUtxos
+ /*
+ console.log(
+ `utxo ${thisUtxoTxid} is not an eToken tx, adding to nonSlpUtxos`,
+ );
+ */
+ nonEtokenUtxos.push(thisUtxoTxid);
+ }
+ }
+ }
+ }
+ return nonEtokenUtxos;
+};
+
+/* Converts a serialized buffer containing encrypted data into an object
+ * that can be interpreted by the ecies-lite library.
+ *
+ * For reference on the parsing logic in this function refer to the link below on the segment of
+ * ecies-lite's encryption function where the encKey, macKey, iv and cipher are sliced and concatenated
+ * https://github.com/tibetty/ecies-lite/blob/8fd97e80b443422269d0223ead55802378521679/index.js#L46-L55
+ *
+ * A similar PSF implmentation can also be found at:
+ * https://github.com/Permissionless-Software-Foundation/bch-encrypt-lib/blob/master/lib/encryption.js
+ *
+ * For more detailed overview on the ecies encryption scheme, see https://cryptobook.nakov.com/asymmetric-key-ciphers/ecies-public-key-encryption
+ */
+export const convertToEncryptStruct = encryptionBuffer => {
+ // based on ecies-lite's encryption logic, the encryption buffer is concatenated as follows:
+ // [ epk + iv + ct + mac ] whereby:
+ // - The first 32 or 64 chars of the encryptionBuffer is the epk
+ // - Both iv and ct params are 16 chars each, hence their combined substring is 32 chars from the end of the epk string
+ // - within this combined iv/ct substring, the first 16 chars is the iv param, and ct param being the later half
+ // - The mac param is appended to the end of the encryption buffer
+
+ // validate input buffer
+ if (!encryptionBuffer) {
+ throw new Error(
+ 'cashmethods.convertToEncryptStruct() error: input must be a buffer',
+ );
+ }
+
+ try {
+ // variable tracking the starting char position for string extraction purposes
+ let startOfBuf = 0;
+
+ // *** epk param extraction ***
+ // The first char of the encryptionBuffer indicates the type of the public key
+ // If the first char is 4, then the public key is 64 chars
+ // If the first char is 3 or 2, then the public key is 32 chars
+ // Otherwise this is not a valid encryption buffer compatible with the ecies-lite library
+ let publicKey;
+ switch (encryptionBuffer[0]) {
+ case 4:
+ publicKey = encryptionBuffer.slice(0, 65); // extract first 64 chars as public key
+ break;
+ case 3:
+ case 2:
+ publicKey = encryptionBuffer.slice(0, 33); // extract first 32 chars as public key
+ break;
+ default:
+ throw new Error(`Invalid type: ${encryptionBuffer[0]}`);
+ }
+
+ // *** iv and ct param extraction ***
+ startOfBuf += publicKey.length; // sets the starting char position to the end of the public key (epk) in order to extract subsequent iv and ct substrings
+ const encryptionTagLength = 32; // the length of the encryption tag (i.e. mac param) computed from each block of ciphertext, and is used to verify no one has tampered with the encrypted data
+ const ivCtSubstring = encryptionBuffer.slice(
+ startOfBuf,
+ encryptionBuffer.length - encryptionTagLength,
+ ); // extract the substring containing both iv and ct params, which is after the public key but before the mac param i.e. the 'encryption tag'
+ const ivbufParam = ivCtSubstring.slice(0, 16); // extract the first 16 chars of substring as the iv param
+ const ctbufParam = ivCtSubstring.slice(16); // extract the last 16 chars as substring the ct param
+
+ // *** mac param extraction ***
+ const macParam = encryptionBuffer.slice(
+ encryptionBuffer.length - encryptionTagLength,
+ encryptionBuffer.length,
+ ); // extract the mac param appended to the end of the buffer
+
+ return {
+ iv: ivbufParam,
+ epk: publicKey,
+ ct: ctbufParam,
+ mac: macParam,
+ };
+ } catch (err) {
+ console.error(`useBCH.convertToEncryptStruct() error: `, err);
+ throw err;
+ }
+};
+
+export const getPublicKey = async (BCH, address) => {
+ try {
+ const publicKey = await BCH.encryption.getPubKey(address);
+ return publicKey.publicKey;
+ } catch (err) {
+ if (err['error'] === 'No transaction history.') {
+ throw new Error(
+ 'Cannot send an encrypted message to a wallet with no outgoing transactions',
+ );
+ } else {
+ throw err;
+ }
+ }
+};
+
+export const isLegacyMigrationRequired = wallet => {
+ // If the wallet does not have Path1899,
+ // Or each Path1899, Path145, Path245 does not have a public key
+ // Then it requires migration
+ if (
+ !wallet.Path1899 ||
+ !wallet.Path1899.publicKey ||
+ !wallet.Path145.publicKey ||
+ !wallet.Path245.publicKey
+ ) {
+ return true;
+ }
+
+ return false;
+};
+
+export const isExcludedUtxo = (utxo, utxoArray) => {
+ /*
+ utxo is a single utxo of model
+ {
+ height: 724992
+ tx_hash: "8d4bdedb7c4443412e0c2f316a330863aef54d9ba73560ca60cca6408527b247"
+ tx_pos: 0
+ value: 10200
+ }
+
+ utxoArray is an array of utxos
+ */
+ let isExcludedUtxo = true;
+ const { tx_hash, tx_pos, value } = utxo;
+ for (let i = 0; i < utxoArray.length; i += 1) {
+ const thisUtxo = utxoArray[i];
+ // NOTE
+ // You can't match height, as this changes from 0 to blockheight after confirmation
+ //const thisUtxoHeight = thisUtxo.height;
+ const thisUtxoTxid = thisUtxo.tx_hash;
+ const thisUtxoTxPos = thisUtxo.tx_pos;
+ const thisUtxoValue = thisUtxo.value;
+ // If you find a utxo such that each object key is identical
+ if (
+ tx_hash === thisUtxoTxid &&
+ tx_pos === thisUtxoTxPos &&
+ value === thisUtxoValue
+ ) {
+ // Then this utxo is not excluded from the array
+ isExcludedUtxo = false;
+ }
+ }
+
+ return isExcludedUtxo;
+};
+
+export const whichUtxosWereAdded = (previousUtxos, currentUtxos) => {
+ let utxosAddedFlag = false;
+ const utxosAdded = [];
+
+ // Iterate over currentUtxos
+ // For each currentUtxo -- does it exist in previousUtxos?
+ // If no, it's added
+
+ // Note that the inputs are arrays of arrays, model
+ /*
+ previousUtxos = [{address: 'string', utxos: []}, ...]
+ */
+
+ // Iterate over the currentUtxos array of {address: 'string', utxos: []} objects
+ for (let i = 0; i < currentUtxos.length; i += 1) {
+ // Take the first object
+ const thisCurrentUtxoObject = currentUtxos[i];
+ const thisCurrentUtxoObjectAddress = thisCurrentUtxoObject.address;
+ const thisCurrentUtxoObjectUtxos = thisCurrentUtxoObject.utxos;
+ // Iterate over the previousUtxos array of {address: 'string', utxos: []} objects
+ for (let j = 0; j < previousUtxos.length; j += 1) {
+ const thisPreviousUtxoObject = previousUtxos[j];
+ const thisPreviousUtxoObjectAddress =
+ thisPreviousUtxoObject.address;
+ // When you find the utxos object at the same address
+ if (
+ thisCurrentUtxoObjectAddress === thisPreviousUtxoObjectAddress
+ ) {
+ // Create a utxosAddedObject with the address
+ const utxosAddedObject = {
+ address: thisCurrentUtxoObjectAddress,
+ utxos: [],
+ };
+ utxosAdded.push(utxosAddedObject);
+
+ // Grab the previousUtxoObject utxos array. thisCurrentUtxoObjectUtxos has changed compared to thisPreviousUtxoObjectUtxos
+ const thisPreviousUtxoObjectUtxos =
+ thisPreviousUtxoObject.utxos;
+ // To see if any utxos exist in thisCurrentUtxoObjectUtxos that do not exist in thisPreviousUtxoObjectUtxos
+ // iterate over thisPreviousUtxoObjectUtxos for each utxo in thisCurrentUtxoObjectUtxos
+ for (let k = 0; k < thisCurrentUtxoObjectUtxos.length; k += 1) {
+ const thisCurrentUtxo = thisCurrentUtxoObjectUtxos[k];
+
+ if (
+ isExcludedUtxo(
+ thisCurrentUtxo,
+ thisPreviousUtxoObjectUtxos,
+ )
+ ) {
+ // If thisCurrentUtxo was not in the corresponding previous utxos
+ // Then it was added
+ utxosAdded[j].utxos.push(thisCurrentUtxo);
+ utxosAddedFlag = true;
+ }
+ }
+ }
+ }
+ }
+ // If utxos were added, return them
+ if (utxosAddedFlag) {
+ return utxosAdded;
+ }
+ // Else return false
+ return utxosAddedFlag;
+};
+
+export const whichUtxosWereConsumed = (previousUtxos, currentUtxos) => {
+ let utxosConsumedFlag = false;
+ const utxosConsumed = [];
+ // Iterate over previousUtxos
+ // For each previousUtxo -- does it exist in currentUtxos?
+ // If no, it's consumed
+
+ // Note that the inputs are arrays of arrays, model
+ /*
+ previousUtxos = [{address: 'string', utxos: []}, ...]
+ */
+
+ // Iterate over the previousUtxos array of {address: 'string', utxos: []} objects
+ for (let i = 0; i < previousUtxos.length; i += 1) {
+ // Take the first object
+ const thisPreviousUtxoObject = previousUtxos[i];
+ const thisPreviousUtxoObjectAddress = thisPreviousUtxoObject.address;
+ const thisPreviousUtxoObjectUtxos = thisPreviousUtxoObject.utxos;
+ // Iterate over the currentUtxos array of {address: 'string', utxos: []} objects
+ for (let j = 0; j < currentUtxos.length; j += 1) {
+ const thisCurrentUtxoObject = currentUtxos[j];
+ const thisCurrentUtxoObjectAddress = thisCurrentUtxoObject.address;
+ // When you find the utxos object at the same address
+ if (
+ thisCurrentUtxoObjectAddress === thisPreviousUtxoObjectAddress
+ ) {
+ // Create a utxosConsumedObject with the address
+ const utxosConsumedObject = {
+ address: thisCurrentUtxoObjectAddress,
+ utxos: [],
+ };
+ utxosConsumed.push(utxosConsumedObject);
+ // Grab the currentUtxoObject utxos array. thisCurrentUtxoObjectUtxos has changed compared to thisPreviousUtxoObjectUtxos
+ const thisCurrentUtxoObjectUtxos = thisCurrentUtxoObject.utxos;
+ // To see if any utxos exist in thisPreviousUtxoObjectUtxos that do not exist in thisCurrentUtxoObjectUtxos
+ // iterate over thisCurrentUtxoObjectUtxos for each utxo in thisPreviousUtxoObjectUtxos
+ for (
+ let k = 0;
+ k < thisPreviousUtxoObjectUtxos.length;
+ k += 1
+ ) {
+ const thisPreviousUtxo = thisPreviousUtxoObjectUtxos[k];
+ // If thisPreviousUtxo was not in the corresponding current utxos
+
+ if (
+ isExcludedUtxo(
+ thisPreviousUtxo,
+ thisCurrentUtxoObjectUtxos,
+ )
+ ) {
+ // Then it was consumed
+ utxosConsumed[j].utxos.push(thisPreviousUtxo);
+ utxosConsumedFlag = true;
+ }
+ }
+ }
+ }
+ }
+ // If utxos were consumed, return them
+ if (utxosConsumedFlag) {
+ return utxosConsumed;
+ }
+ // Else return false
+ return utxosConsumedFlag;
+};
+
+export const addNewHydratedUtxos = (
+ addedHydratedUtxos,
+ hydratedUtxoDetails,
+) => {
+ const theseAdditionalHydratedUtxos = addedHydratedUtxos.slpUtxos;
+ for (let i = 0; i < theseAdditionalHydratedUtxos.length; i += 1) {
+ const thisHydratedUtxoObj = theseAdditionalHydratedUtxos[i];
+ hydratedUtxoDetails.slpUtxos.push(thisHydratedUtxoObj);
+ }
+ return hydratedUtxoDetails;
+ // Add hydrateUtxos(addedUtxos) to hydratedUtxoDetails
+ /*
+ e.g. add this
+ {
+ "slpUtxos":
+ [
+ {
+ "utxos": [
+ {
+ "height": 725886,
+ "tx_hash": "29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78",
+ "tx_pos": 0,
+ "value": 3300,
+ "txid": "29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78",
+ "vout": 0,
+ "isValid": false
+ }
+ ],
+ "address": "bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr"
+ }
+ ]
+ }
+
+to this
+
+{
+ "slpUtxos":
+ [
+ {
+ "utxos": [
+ {
+ "height": 725886,
+ "tx_hash": "29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78",
+ "tx_pos": 0,
+ "value": 3300,
+ "txid": "29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78",
+ "vout": 0,
+ "isValid": false
+ }
+ ... up to 20
+ ],
+ "address": "bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr"
+ },
+ {
+ "utxos": [
+ {
+ "height": 725886,
+ "tx_hash": "29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78",
+ "tx_pos": 0,
+ "value": 3300,
+ "txid": "29985c01444bf80ade764e5d40d7ec2c12317e03301243170139c75f20c51f78",
+ "vout": 0,
+ "isValid": false
+ }
+ ... up to 20
+ ],
+ "address": "bitcoincash:qz2708636snqhsxu8wnlka78h6fdp77ar5ulhz04hr"
+ }
+ ,
+ ... a bunch of these in batches of 20
+ ]
+ }
+ */
+};
+
+export const removeConsumedUtxos = (consumedUtxos, hydratedUtxoDetails) => {
+ let hydratedUtxoDetailsWithConsumedUtxosRemoved = hydratedUtxoDetails;
+ const slpUtxosArray = hydratedUtxoDetails.slpUtxos;
+ // Iterate over consumedUtxos
+ // Every utxo in consumedUtxos must be removed from hydratedUtxoDetails
+ for (let i = 0; i < consumedUtxos.length; i += 1) {
+ const thisConsumedUtxoObject = consumedUtxos[i]; // {address: 'string', utxos: [{},{},...{}]}
+ const thisConsumedUtxoObjectAddr = thisConsumedUtxoObject.address;
+ const thisConsumedUtxoObjectUtxoArray = thisConsumedUtxoObject.utxos;
+ for (let j = 0; j < thisConsumedUtxoObjectUtxoArray.length; j += 1) {
+ const thisConsumedUtxo = thisConsumedUtxoObjectUtxoArray[j];
+ // Iterate through slpUtxosArray to find thisConsumedUtxo
+ slpUtxosArrayLoop: for (
+ let k = 0;
+ k < slpUtxosArray.length;
+ k += 1
+ ) {
+ const thisSlpUtxosArrayUtxoObject = slpUtxosArray[k]; // {address: 'string', utxos: [{},{},...{}]}
+ const thisSlpUtxosArrayUtxoObjectAddr =
+ thisSlpUtxosArrayUtxoObject.address;
+ // If this address matches the address of the consumed utxo, check for a consumedUtxo match
+ // Note, slpUtxos may have many utxo objects with the same address, need to check them all until you find and remove this consumed utxo
+ if (
+ thisConsumedUtxoObjectAddr ===
+ thisSlpUtxosArrayUtxoObjectAddr
+ ) {
+ const thisSlpUtxosArrayUtxoObjectUtxoArray =
+ thisSlpUtxosArrayUtxoObject.utxos;
+
+ // Iterate to find it and remove it
+ for (
+ let m = 0;
+ m < thisSlpUtxosArrayUtxoObjectUtxoArray.length;
+ m += 1
+ ) {
+ const thisHydratedUtxo =
+ thisSlpUtxosArrayUtxoObjectUtxoArray[m];
+ if (
+ thisConsumedUtxo.tx_hash ===
+ thisHydratedUtxo.tx_hash &&
+ thisConsumedUtxo.tx_pos ===
+ thisHydratedUtxo.tx_pos &&
+ thisConsumedUtxo.value === thisHydratedUtxo.value
+ ) {
+ // remove it
+ hydratedUtxoDetailsWithConsumedUtxosRemoved.slpUtxos[
+ k
+ ].utxos.splice(m, 1);
+ // go to the next consumedUtxo
+ break slpUtxosArrayLoop;
+ }
+ }
+ }
+ }
+ }
+ }
+ return hydratedUtxoDetailsWithConsumedUtxosRemoved;
+};
+
+export const getUtxoCount = utxos => {
+ // return how many utxos
+ // return false if input is invalid
+ /*
+ Both utxos and hydratedUtxoDetails.slpUtxos are build like so
+ [
+ {
+ address: 'string',
+ utxos: [{}, {}, {}...{}]
+ },
+ {
+ address: 'string',
+ utxos: [{}, {}, {}...{}]
+ },
+ {
+ address: 'string',
+ utxos: [{}, {}, {}...{}]
+ },
+ ]
+
+ We want a function that quickly determines how many utxos are here
+ */
+
+ // First, validate that you are getting a valid bch-api utxo set
+ // if you are not, then return false -- which would cause areAllUtxosIncludedInIncrementallyHydratedUtxos to return false and calculate utxo set the legacy way
+ const isValidUtxoObject = isValidBchApiUtxoObject(utxos);
+ if (!isValidUtxoObject) {
+ return false;
+ }
+
+ let utxoCount = 0;
+ for (let i = 0; i < utxos.length; i += 1) {
+ const thisUtxoArrLength = utxos[i].utxos.length;
+ utxoCount += thisUtxoArrLength;
+ }
+ return utxoCount;
+};
+
+export const areAllUtxosIncludedInIncrementallyHydratedUtxos = (
+ utxos,
+ incrementallyHydratedUtxos,
+) => {
+ let incrementallyHydratedUtxosIncludesAllUtxosInLatestUtxoApiFetch = false;
+ // check
+ const { slpUtxos } = incrementallyHydratedUtxos;
+
+ // Iterate over utxos array
+ for (let i = 0; i < utxos.length; i += 1) {
+ const thisUtxoObject = utxos[i];
+ const thisUtxoObjectAddr = thisUtxoObject.address;
+ const thisUtxoObjectUtxos = thisUtxoObject.utxos;
+ let utxoFound;
+ for (let j = 0; j < thisUtxoObjectUtxos.length; j += 1) {
+ const thisUtxo = thisUtxoObjectUtxos[j];
+ utxoFound = false;
+ // Now iterate over slpUtxos to find it
+ slpUtxosLoop: for (let k = 0; k < slpUtxos.length; k += 1) {
+ const thisSlpUtxosObject = slpUtxos[k];
+ const thisSlpUtxosObjectAddr = thisSlpUtxosObject.address;
+ if (thisUtxoObjectAddr === thisSlpUtxosObjectAddr) {
+ const thisSlpUtxosObjectUtxos = thisSlpUtxosObject.utxos;
+ for (
+ let m = 0;
+ m < thisSlpUtxosObjectUtxos.length;
+ m += 1
+ ) {
+ const thisSlpUtxo = thisSlpUtxosObjectUtxos[m];
+ if (
+ thisUtxo.tx_hash === thisSlpUtxo.tx_hash &&
+ thisUtxo.tx_pos === thisSlpUtxo.tx_pos &&
+ thisUtxo.value === thisSlpUtxo.value
+ ) {
+ utxoFound = true;
+ // goto next utxo
+ break slpUtxosLoop;
+ }
+ }
+ }
+ if (k === slpUtxos.length - 1 && !utxoFound) {
+ // return false
+ return incrementallyHydratedUtxosIncludesAllUtxosInLatestUtxoApiFetch;
+ }
+ }
+ }
+ }
+ // It's possible that hydratedUtxoDetails includes every utxo from the utxos array, but for some reason also includes additional utxos
+ const utxosInUtxos = getUtxoCount(utxos);
+ const utxosInIncrementallyHydratedUtxos = getUtxoCount(slpUtxos);
+ if (
+ !utxosInUtxos ||
+ !utxosInIncrementallyHydratedUtxos ||
+ utxosInUtxos !== utxosInIncrementallyHydratedUtxos
+ ) {
+ return incrementallyHydratedUtxosIncludesAllUtxosInLatestUtxoApiFetch;
+ }
+ // If you make it here, good to go
+ incrementallyHydratedUtxosIncludesAllUtxosInLatestUtxoApiFetch = true;
+ return incrementallyHydratedUtxosIncludesAllUtxosInLatestUtxoApiFetch;
+};
diff --git a/web/cashtab-v2/src/utils/context.js b/web/cashtab-v2/src/utils/context.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/context.js
@@ -0,0 +1,26 @@
+import React from 'react';
+import useWallet from '../hooks/useWallet';
+export const WalletContext = React.createContext();
+
+export const WalletProvider = ({ children }) => {
+ const wallet = useWallet();
+ return (
+ <WalletContext.Provider value={wallet}>
+ {children}
+ </WalletContext.Provider>
+ );
+};
+
+// Authentication Context
+import useWebAuthentication from '../hooks/useWebAuthentication';
+export const AuthenticationContext = React.createContext();
+export const AuthenticationProvider = ({ children }) => {
+ // useWebAuthentication returns null if Web Authn is not supported
+ const authentication = useWebAuthentication();
+
+ return (
+ <AuthenticationContext.Provider value={authentication}>
+ {children}
+ </AuthenticationContext.Provider>
+ );
+};
diff --git a/web/cashtab-v2/src/utils/convertArrBuffBase64.js b/web/cashtab-v2/src/utils/convertArrBuffBase64.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/convertArrBuffBase64.js
@@ -0,0 +1,19 @@
+export const convertArrayBufferToBase64 = buffer => {
+ // convert the buffer from ArrayBuffer to Array of 8-bit unsigned integers
+ const dataView = new Uint8Array(buffer);
+ // convert the Array of 8-bit unsigned integers to a String
+ const dataStr = dataView.reduce(
+ (str, cur) => str + String.fromCharCode(cur),
+ '',
+ );
+ // convert String to base64
+ return window.btoa(dataStr);
+};
+
+export const convertBase64ToArrayBuffer = base64Str => {
+ // convert base64 String to normal String
+ const dataStr = window.atob(base64Str);
+ // convert the String to an Array of 8-bit unsigned integers
+ const dataView = Uint8Array.from(dataStr, char => char.charCodeAt(0));
+ return dataView.buffer;
+};
diff --git a/web/cashtab-v2/src/utils/debounce.js b/web/cashtab-v2/src/utils/debounce.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/debounce.js
@@ -0,0 +1,13 @@
+export default (routine, timeout = 500) => {
+ let timeoutId;
+
+ return (...args) => {
+ return new Promise((resolve, reject) => {
+ clearTimeout(timeoutId);
+ timeoutId = setTimeout(
+ () => Promise.resolve(routine(...args)).then(resolve, reject),
+ timeout,
+ );
+ });
+ };
+};
diff --git a/web/cashtab-v2/src/utils/formatting.js b/web/cashtab-v2/src/utils/formatting.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/formatting.js
@@ -0,0 +1,72 @@
+import { currency } from '@components/Common/Ticker.js';
+
+export const formatDate = (dateString, userLocale = 'en') => {
+ const options = { month: 'short', day: 'numeric', year: 'numeric' };
+ const dateFormattingError = 'Unable to format date.';
+ try {
+ if (dateString) {
+ return new Date(dateString * 1000).toLocaleDateString(
+ userLocale,
+ options,
+ );
+ }
+ return new Date().toLocaleDateString(userLocale, options);
+ } catch (error) {
+ return dateFormattingError;
+ }
+};
+
+export const formatFiatBalance = (fiatBalance, optionalLocale) => {
+ try {
+ if (fiatBalance === 0) {
+ return Number(fiatBalance).toFixed(currency.cashDecimals);
+ }
+ if (optionalLocale === undefined) {
+ return fiatBalance.toLocaleString({
+ maximumFractionDigits: currency.cashDecimals,
+ });
+ }
+ return fiatBalance.toLocaleString(optionalLocale, {
+ maximumFractionDigits: currency.cashDecimals,
+ });
+ } catch (err) {
+ return fiatBalance;
+ }
+};
+
+export const formatSavedBalance = (swBalance, optionalLocale) => {
+ try {
+ if (swBalance === undefined) {
+ return 'N/A';
+ } else {
+ if (optionalLocale === undefined) {
+ return new Number(swBalance).toLocaleString({
+ maximumFractionDigits: currency.cashDecimals,
+ });
+ } else {
+ return new Number(swBalance).toLocaleString(optionalLocale, {
+ maximumFractionDigits: currency.cashDecimals,
+ });
+ }
+ }
+ } catch (err) {
+ return 'N/A';
+ }
+};
+
+export const formatBalance = (unformattedBalance, optionalLocale) => {
+ try {
+ if (optionalLocale === undefined) {
+ return new Number(unformattedBalance).toLocaleString({
+ maximumFractionDigits: currency.cashDecimals,
+ });
+ }
+ return new Number(unformattedBalance).toLocaleString(optionalLocale, {
+ maximumFractionDigits: currency.cashDecimals,
+ });
+ } catch (err) {
+ console.log(`Error in formatBalance for ${unformattedBalance}`);
+ console.log(err);
+ return unformattedBalance;
+ }
+};
diff --git a/web/cashtab-v2/src/utils/icons/cropImage.js b/web/cashtab-v2/src/utils/icons/cropImage.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/icons/cropImage.js
@@ -0,0 +1,85 @@
+const createImage = url =>
+ new Promise((resolve, reject) => {
+ const image = new Image();
+ image.addEventListener('load', () => resolve(image));
+ image.addEventListener('error', error => reject(error));
+ image.setAttribute('crossOrigin', 'anonymous');
+ image.src = url;
+ });
+
+function getRadianAngle(degreeValue) {
+ return (degreeValue * Math.PI) / 180;
+}
+
+export default async function getCroppedImg(
+ imageSrc,
+ pixelCrop,
+ rotation = 0,
+ fileName,
+) {
+ const image = await createImage(imageSrc);
+ console.log('image :', image);
+ const canvas = document.createElement('canvas');
+ const ctx = canvas.getContext('2d');
+
+ const maxSize = Math.max(image.width, image.height);
+ const safeArea = 2 * ((maxSize / 2) * Math.sqrt(2));
+
+ canvas.width = safeArea;
+ canvas.height = safeArea;
+
+ ctx.translate(safeArea / 2, safeArea / 2);
+ ctx.rotate(getRadianAngle(rotation));
+ ctx.translate(-safeArea / 2, -safeArea / 2);
+
+ ctx.drawImage(
+ image,
+ safeArea / 2 - image.width * 0.5,
+ safeArea / 2 - image.height * 0.5,
+ );
+ const data = ctx.getImageData(0, 0, safeArea, safeArea);
+
+ canvas.width = pixelCrop.width;
+ canvas.height = pixelCrop.height;
+
+ ctx.putImageData(
+ data,
+ 0 - safeArea / 2 + image.width * 0.5 - pixelCrop.x,
+ 0 - safeArea / 2 + image.height * 0.5 - pixelCrop.y,
+ );
+
+ if (!HTMLCanvasElement.prototype.toBlob) {
+ Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {
+ value: function (callback, type, quality) {
+ var dataURL = this.toDataURL(type, quality).split(',')[1];
+ setTimeout(function () {
+ var binStr = atob(dataURL),
+ len = binStr.length,
+ arr = new Uint8Array(len);
+ for (var i = 0; i < len; i++) {
+ arr[i] = binStr.charCodeAt(i);
+ }
+ callback(new Blob([arr], { type: type || 'image/png' }));
+ });
+ },
+ });
+ }
+ return new Promise(resolve => {
+ ctx.canvas.toBlob(
+ blob => {
+ const file = new File([blob], fileName, {
+ type: 'image/png',
+ });
+ const resultReader = new FileReader();
+
+ resultReader.readAsDataURL(file);
+
+ resultReader.addEventListener('load', () =>
+ resolve({ file, url: resultReader.result }),
+ );
+ },
+ 'image/png',
+ 1,
+ );
+ });
+}
diff --git a/web/cashtab-v2/src/utils/icons/resizeImage.js b/web/cashtab-v2/src/utils/icons/resizeImage.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/icons/resizeImage.js
@@ -0,0 +1,57 @@
+const createImage = url =>
+ new Promise((resolve, reject) => {
+ const image = new Image();
+ image.addEventListener('load', () => resolve(image));
+ image.addEventListener('error', error => reject(error));
+ image.setAttribute('crossOrigin', 'anonymous');
+ image.src = url;
+ });
+
+export default async function getResizedImg(imageSrc, callback, fileName) {
+ const image = await createImage(imageSrc);
+
+ const width = 512;
+ const height = 512;
+ const canvas = document.createElement('canvas');
+ canvas.width = width;
+ canvas.height = height;
+ const ctx = canvas.getContext('2d');
+
+ ctx.drawImage(image, 0, 0, width, height);
+ if (!HTMLCanvasElement.prototype.toBlob) {
+ Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {
+ value: function (callback, type, quality) {
+ var dataURL = this.toDataURL(type, quality).split(',')[1];
+ setTimeout(function () {
+ var binStr = atob(dataURL),
+ len = binStr.length,
+ arr = new Uint8Array(len);
+ for (var i = 0; i < len; i++) {
+ arr[i] = binStr.charCodeAt(i);
+ }
+ callback(new Blob([arr], { type: type || 'image/png' }));
+ });
+ },
+ });
+ }
+
+ return new Promise(resolve => {
+ ctx.canvas.toBlob(
+ blob => {
+ const file = new File([blob], fileName, {
+ type: 'image/png',
+ });
+ const resultReader = new FileReader();
+
+ resultReader.readAsDataURL(file);
+
+ resultReader.addEventListener('load', () =>
+ callback({ file, url: resultReader.result }),
+ );
+ resolve();
+ },
+ 'image/png',
+ 1,
+ );
+ });
+}
diff --git a/web/cashtab-v2/src/utils/icons/roundImage.js b/web/cashtab-v2/src/utils/icons/roundImage.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/icons/roundImage.js
@@ -0,0 +1,64 @@
+const createImage = url =>
+ new Promise((resolve, reject) => {
+ const image = new Image();
+ image.addEventListener('load', () => resolve(image));
+ image.addEventListener('error', error => reject(error));
+ image.setAttribute('crossOrigin', 'anonymous');
+ image.src = url;
+ });
+
+export default async function getRoundImg(imageSrc, fileName) {
+ const image = await createImage(imageSrc);
+ console.log('image :', image);
+ const canvas = document.createElement('canvas');
+ canvas.width = image.width;
+ canvas.height = image.height;
+ const ctx = canvas.getContext('2d');
+
+ ctx.drawImage(image, 0, 0);
+ ctx.globalCompositeOperation = 'destination-in';
+ ctx.beginPath();
+ ctx.arc(
+ image.width / 2,
+ image.height / 2,
+ image.height / 2,
+ 0,
+ Math.PI * 2,
+ );
+ ctx.closePath();
+ ctx.fill();
+ if (!HTMLCanvasElement.prototype.toBlob) {
+ Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {
+ value: function (callback, type, quality) {
+ var dataURL = this.toDataURL(type, quality).split(',')[1];
+ setTimeout(function () {
+ var binStr = atob(dataURL),
+ len = binStr.length,
+ arr = new Uint8Array(len);
+ for (var i = 0; i < len; i++) {
+ arr[i] = binStr.charCodeAt(i);
+ }
+ callback(new Blob([arr], { type: type || 'image/png' }));
+ });
+ },
+ });
+ }
+ return new Promise(resolve => {
+ ctx.canvas.toBlob(
+ blob => {
+ const file = new File([blob], fileName, {
+ type: 'image/png',
+ });
+ const resultReader = new FileReader();
+
+ resultReader.readAsDataURL(file);
+
+ resultReader.addEventListener('load', () =>
+ resolve({ file, url: resultReader.result }),
+ );
+ },
+ 'image/png',
+ 1,
+ );
+ });
+}
diff --git a/web/cashtab-v2/src/utils/retry.js b/web/cashtab-v2/src/utils/retry.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/retry.js
@@ -0,0 +1,12 @@
+export const retry = async (func, { delay = 100, tries = 3 } = {}) => {
+ try {
+ return await Promise.resolve(func());
+ } catch (error) {
+ if (tries === 0) {
+ throw error;
+ }
+ return await retry(func, { delay: delay * 2, tries: tries - 1 });
+ }
+};
+
+export default retry;
diff --git a/web/cashtab-v2/src/utils/tokenMethods.js b/web/cashtab-v2/src/utils/tokenMethods.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/tokenMethods.js
@@ -0,0 +1,8 @@
+export const checkForTokenById = (tokenList, specifiedTokenId) => {
+ for (const t of tokenList) {
+ if (t.tokenId === specifiedTokenId) {
+ return true;
+ }
+ }
+ return false;
+};
diff --git a/web/cashtab-v2/src/utils/validation.js b/web/cashtab-v2/src/utils/validation.js
new file mode 100644
--- /dev/null
+++ b/web/cashtab-v2/src/utils/validation.js
@@ -0,0 +1,367 @@
+import BigNumber from 'bignumber.js';
+import { currency } from '@components/Common/Ticker.js';
+import { fromSmallestDenomination } from '@utils/cashMethods';
+import cashaddr from 'ecashaddrjs';
+
+// Validate cash amount
+export const shouldRejectAmountInput = (
+ cashAmount,
+ selectedCurrency,
+ fiatPrice,
+ totalCashBalance,
+) => {
+ // Take cashAmount as input, a string from form input
+ let error = false;
+ let testedAmount = new BigNumber(cashAmount);
+
+ if (selectedCurrency !== currency.ticker) {
+ // Ensure no more than currency.cashDecimals decimal places
+ testedAmount = new BigNumber(fiatToCrypto(cashAmount, fiatPrice));
+ }
+
+ // Validate value for > 0
+ if (isNaN(testedAmount)) {
+ error = 'Amount must be a number';
+ } else if (testedAmount.lte(0)) {
+ error = 'Amount must be greater than 0';
+ } else if (
+ testedAmount.lt(fromSmallestDenomination(currency.dustSats).toString())
+ ) {
+ error = `Send amount must be at least ${fromSmallestDenomination(
+ currency.dustSats,
+ ).toString()} ${currency.ticker}`;
+ } else if (testedAmount.gt(totalCashBalance)) {
+ error = `Amount cannot exceed your ${currency.ticker} balance`;
+ } else if (!isNaN(testedAmount) && testedAmount.toString().includes('.')) {
+ if (
+ testedAmount.toString().split('.')[1].length > currency.cashDecimals
+ ) {
+ error = `${currency.ticker} transactions do not support more than ${currency.cashDecimals} decimal places`;
+ }
+ }
+ // return false if no error, or string error msg if error
+ return error;
+};
+
+export const fiatToCrypto = (
+ fiatAmount,
+ fiatPrice,
+ cashDecimals = currency.cashDecimals,
+) => {
+ let cryptoAmount = new BigNumber(fiatAmount)
+ .div(new BigNumber(fiatPrice))
+ .toFixed(cashDecimals);
+ return cryptoAmount;
+};
+
+export const isValidTokenName = tokenName => {
+ return (
+ typeof tokenName === 'string' &&
+ tokenName.length > 0 &&
+ tokenName.length < 68
+ );
+};
+
+export const isValidTokenTicker = tokenTicker => {
+ return (
+ typeof tokenTicker === 'string' &&
+ tokenTicker.length > 0 &&
+ tokenTicker.length < 13
+ );
+};
+
+export const isValidTokenDecimals = tokenDecimals => {
+ return ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'].includes(
+ tokenDecimals,
+ );
+};
+
+export const isValidTokenInitialQty = (tokenInitialQty, tokenDecimals) => {
+ const minimumQty = new BigNumber(1 / 10 ** tokenDecimals);
+ const tokenIntialQtyBig = new BigNumber(tokenInitialQty);
+ return (
+ tokenIntialQtyBig.gte(minimumQty) &&
+ tokenIntialQtyBig.lt(100000000000) &&
+ tokenIntialQtyBig.dp() <= tokenDecimals
+ );
+};
+
+export const isValidTokenDocumentUrl = tokenDocumentUrl => {
+ const urlPattern = new RegExp(
+ '^(https?:\\/\\/)?' + // protocol
+ '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // domain name
+ '((\\d{1,3}\\.){3}\\d{1,3}))' + // OR ip (v4) address
+ '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // port and path
+ '(\\?[;&a-z\\d%_.~+=-]*)?' + // query string
+ '(\\#[-a-z\\d_]*)?$',
+ 'i',
+ ); // fragment locator
+
+ const urlTestResult = urlPattern.test(tokenDocumentUrl);
+ return (
+ tokenDocumentUrl === '' ||
+ (typeof tokenDocumentUrl === 'string' &&
+ tokenDocumentUrl.length >= 0 &&
+ tokenDocumentUrl.length < 68 &&
+ urlTestResult)
+ );
+};
+
+export const isValidTokenStats = tokenStats => {
+ return (
+ typeof tokenStats === 'object' &&
+ 'timestampUnix' in tokenStats &&
+ 'documentUri' in tokenStats &&
+ 'containsBaton' in tokenStats &&
+ 'initialTokenQty' in tokenStats &&
+ 'totalMinted' in tokenStats &&
+ 'totalBurned' in tokenStats &&
+ 'circulatingSupply' in tokenStats
+ );
+};
+
+export const isValidCashtabSettings = settings => {
+ try {
+ let isValidSettingParams = true;
+ for (let param in currency.defaultSettings) {
+ if (
+ !Object.prototype.hasOwnProperty.call(settings, param) ||
+ !currency.settingsValidation[param].includes(settings[param])
+ ) {
+ isValidSettingParams = false;
+ break;
+ }
+ }
+ const isValid = typeof settings === 'object' && isValidSettingParams;
+
+ return isValid;
+ } catch (err) {
+ return false;
+ }
+};
+
+export const isValidXecAddress = addr => {
+ /*
+ Returns true for a valid XEC address
+
+ Valid XEC address:
+ - May or may not have prefix `ecash:`
+ - Checksum must validate for prefix `ecash:`
+
+ An eToken address is not considered a valid XEC address
+ */
+
+ if (!addr) {
+ return false;
+ }
+
+ let isValidXecAddress;
+ let isPrefixedXecAddress;
+
+ // Check for possible prefix
+ if (addr.includes(':')) {
+ // Test for 'ecash:' prefix
+ isPrefixedXecAddress = addr.slice(0, 6) === 'ecash:';
+ // Any address including ':' that doesn't start explicitly with 'ecash:' is invalid
+ if (!isPrefixedXecAddress) {
+ isValidXecAddress = false;
+ return isValidXecAddress;
+ }
+ } else {
+ isPrefixedXecAddress = false;
+ }
+
+ // If no prefix, assume it is checksummed for an ecash: prefix
+ const testedXecAddr = isPrefixedXecAddress ? addr : `ecash:${addr}`;
+
+ try {
+ const decoded = cashaddr.decode(testedXecAddr);
+ if (decoded.prefix === 'ecash') {
+ isValidXecAddress = true;
+ }
+ } catch (err) {
+ isValidXecAddress = false;
+ }
+ return isValidXecAddress;
+};
+
+export const isValidEtokenAddress = addr => {
+ /*
+ Returns true for a valid eToken address
+
+ Valid eToken address:
+ - May or may not have prefix `etoken:`
+ - Checksum must validate for prefix `etoken:`
+
+ An XEC address is not considered a valid eToken address
+ */
+
+ if (!addr) {
+ return false;
+ }
+
+ let isValidEtokenAddress;
+ let isPrefixedEtokenAddress;
+
+ // Check for possible prefix
+ if (addr.includes(':')) {
+ // Test for 'etoken:' prefix
+ isPrefixedEtokenAddress = addr.slice(0, 7) === 'etoken:';
+ // Any token address including ':' that doesn't start explicitly with 'etoken:' is invalid
+ if (!isPrefixedEtokenAddress) {
+ isValidEtokenAddress = false;
+ return isValidEtokenAddress;
+ }
+ } else {
+ isPrefixedEtokenAddress = false;
+ }
+
+ // If no prefix, assume it is checksummed for an etoken: prefix
+ const testedEtokenAddr = isPrefixedEtokenAddress ? addr : `etoken:${addr}`;
+
+ try {
+ const decoded = cashaddr.decode(testedEtokenAddr);
+ if (decoded.prefix === 'etoken') {
+ isValidEtokenAddress = true;
+ }
+ } catch (err) {
+ isValidEtokenAddress = false;
+ }
+ return isValidEtokenAddress;
+};
+
+export const isValidXecSendAmount = xecSendAmount => {
+ // A valid XEC send amount must be a number higher than the app dust limit
+ return (
+ xecSendAmount !== null &&
+ typeof xecSendAmount !== 'undefined' &&
+ !isNaN(parseFloat(xecSendAmount)) &&
+ parseFloat(xecSendAmount) >= fromSmallestDenomination(currency.dustSats)
+ );
+};
+
+export const isValidUtxo = utxo => {
+ let isValidUtxo = false;
+ try {
+ isValidUtxo =
+ 'height' in utxo &&
+ typeof utxo.height === 'number' &&
+ 'tx_hash' in utxo &&
+ typeof utxo.tx_hash === 'string' &&
+ 'tx_pos' in utxo &&
+ typeof utxo.tx_pos === 'number' &&
+ 'value' in utxo &&
+ typeof utxo.value === 'number';
+ } catch (err) {
+ return false;
+ }
+ return isValidUtxo;
+};
+
+export const isValidBchApiUtxoObject = bchApiUtxoObject => {
+ /*
+ [
+ {
+ address: 'string',
+ utxos: [{}, {}, {}...{}]
+ },
+ {
+ address: 'string',
+ utxos: [{}, {}, {}...{}]
+ },
+ {
+ address: 'string',
+ utxos: [{}, {}, {}...{}]
+ },
+ ]
+ */
+ let isValidBchApiUtxoObject = false;
+ // Must be an array
+ if (!Array.isArray(bchApiUtxoObject)) {
+ return isValidBchApiUtxoObject;
+ }
+ // Do not accept an empty array
+ if (bchApiUtxoObject.length < 1) {
+ return isValidBchApiUtxoObject;
+ }
+
+ for (let i = 0; i < bchApiUtxoObject.length; i += 1) {
+ let thisUtxoObject = bchApiUtxoObject[i];
+ if ('address' in thisUtxoObject && 'utxos' in thisUtxoObject) {
+ const thisUtxoArray = thisUtxoObject.utxos;
+ if (Array.isArray(thisUtxoArray)) {
+ // do not validate each individual utxo in the array
+ // we are only validating the object structure here
+ continue;
+ } else {
+ return isValidBchApiUtxoObject;
+ }
+ } else {
+ return isValidBchApiUtxoObject;
+ }
+ }
+ isValidBchApiUtxoObject = true;
+
+ return isValidBchApiUtxoObject;
+};
+
+export const isValidEtokenBurnAmount = (tokenBurnAmount, maxAmount) => {
+ // A valid eToken burn amount must be between 1 and the wallet's token balance
+ return (
+ tokenBurnAmount !== null &&
+ maxAmount !== null &&
+ typeof tokenBurnAmount !== 'undefined' &&
+ typeof maxAmount !== 'undefined' &&
+ new BigNumber(tokenBurnAmount).gt(0) &&
+ new BigNumber(tokenBurnAmount).lte(maxAmount)
+ );
+};
+
+// XEC airdrop field validations
+export const isValidTokenId = tokenId => {
+ const format = /[ `!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?~]/;
+ const specialCharCheck = format.test(tokenId);
+
+ return (
+ typeof tokenId === 'string' &&
+ tokenId.length === 64 &&
+ tokenId.trim() != '' &&
+ !specialCharCheck
+ );
+};
+
+export const isValidXecAirdrop = xecAirdrop => {
+ return (
+ typeof xecAirdrop === 'string' &&
+ xecAirdrop.length > 0 &&
+ xecAirdrop.trim() != '' &&
+ new BigNumber(xecAirdrop).gt(0)
+ );
+};
+
+export const isValidAirdropOutputsArray = airdropOutputsArray => {
+ if (!airdropOutputsArray) {
+ return false;
+ }
+
+ let isValid = true;
+
+ // split by individual rows
+ const addressStringArray = airdropOutputsArray.split('\n');
+
+ for (let i = 0; i < addressStringArray.length; i++) {
+ const substring = addressStringArray[i].split(',');
+ let valueString = substring[1];
+ // if the XEC being sent is less than dust sats or contains extra values per line
+ if (
+ new BigNumber(valueString).lt(
+ fromSmallestDenomination(currency.dustSats),
+ ) ||
+ substring.length !== 2
+ ) {
+ isValid = false;
+ }
+ }
+
+ return isValid;
+};

File Metadata

Mime Type
text/plain
Expires
Sat, Apr 26, 09:59 (1 h, 14 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5572826
Default Alt Text
D11246.id32913.diff (2 MB)

Event Timeline