Page MenuHomePhabricator

[Cashtab] Migrate to new wallet shape that includes ecash-lib-ready sk and pk
ClosedPublic

Authored by bytesofman on Wed, Nov 20, 13:39.

Details

Summary

We have been calculating sk and pk from wif every time we need them for ecash-lib txs. This was not particularly complicated when we were still using sendXec for all txs in Cashtab. However, with advanced tx construction methods provided by ecash-agora, we now to to calculate sk and pk in many places throughout Cashtab.

These values should be calculated when Cashtab first loads its wallets, not recalculated for every tx.

Migrate wallets to include these values.

This ends up being a large diff. Here is a summary of the changes:

  1. In wallet/index.ts, update type so that sk and pk are required ("the one change" of this diff)
  2. Update isValidCashtabWallet so that only this newest type is valid
  3. Update cashtabWalletToJSON and cashtabWalletFromJSON to deal with storing / reviving Uint8Array
  4. Update wallet types (now we have a new legacy type, and a new stored type)
  5. Update all wallets used by tests to be the valid format (only the migration tests should use invalid wallets)
  6. Add tests to confirm migration

Now that we have monorepo-confirmed type stability with chronik in the node, CashtabWallet should really be a class. Perhaps even in a separate library so other developers could more easily work with chronik utxo sets and avoid burns.

We're getting there. But Cashtab is the place to get it right first.

Test Plan

npm test

Diff Detail

Repository
rABC Bitcoin ABC
Branch
wallet-pubkey-back
Lint
Lint Passed
Unit
No Test Coverage
Build Status
Buildable 31274
Build 62046: Build Diffcashtab-tests
Build 62045: arc lint + arc unit

Event Timeline

Tail of the build log:

Run `npm audit` for details.

> ecash-lib@0.2.1 build
> tsc && tsc -p ./tsconfig.build.json && cp -r ./src/ffi ./dist

Installing ecash-agora dependencies...
/work/modules/ecash-agora /work/modules/ecash-lib /work/modules/ecash-lib-wasm /work/modules/ecash-script /work/modules/chronik-client /work/modules/mock-chronik-client /work/modules/ecashaddrjs /work/abc-ci-builds/cashtab-tests

added 364 packages, and audited 367 packages in 2s

60 packages are looking for funding
  run `npm fund` for details

2 vulnerabilities (1 moderate, 1 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

> ecash-agora@0.1.1 build
> tsc && tsc -p ./tsconfig.build.json

/work/cashtab /work/modules/ecash-agora /work/modules/ecash-lib /work/modules/ecash-lib-wasm /work/modules/ecash-script /work/modules/chronik-client /work/modules/mock-chronik-client /work/modules/ecashaddrjs /work/abc-ci-builds/cashtab-tests

added 1483 packages, and audited 3329 packages in 25s

323 packages are looking for funding
  run `npm fund` for details

4 vulnerabilities (2 moderate, 2 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

> cashtab@2.54.1 build
> node scripts/build.js

Creating an optimized production build...
Failed to compile.

TS2554: Expected 3 arguments, but got 2.
    343 |
    344 |             // If wallet is invalid, rebuild to latest Cashtab schema
  > 345 |             let newWallet = await createCashtabWallet(
        |                                   ^^^^^^^^^^^^^^^^^^^^
  > 346 |                 storedWallet.mnemonic,
        | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  > 347 |                 extraPathsToMigrate,
        | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  > 348 |             );
        | ^^^^^^^^^^^^^^
    349 |
    350 |             // Keep original name
    351 |             newWallet = { ...newWallet, name: storedWallet.name };


Build cashtab-tests failed with exit code 1

More type info, get migrations to work, update App.test.js to pass ecc and pass

Tail of the build log:

  npm audit fix

Run `npm audit` for details.

> ecash-lib@0.2.1 build
> tsc && tsc -p ./tsconfig.build.json && cp -r ./src/ffi ./dist

Installing ecash-agora dependencies...
/work/modules/ecash-agora /work/modules/ecash-lib /work/modules/ecash-lib-wasm /work/modules/ecash-script /work/modules/chronik-client /work/modules/mock-chronik-client /work/modules/ecashaddrjs /work/abc-ci-builds/cashtab-tests

added 364 packages, and audited 367 packages in 1s

60 packages are looking for funding
  run `npm fund` for details

2 vulnerabilities (1 moderate, 1 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

> ecash-agora@0.1.1 build
> tsc && tsc -p ./tsconfig.build.json

/work/cashtab /work/modules/ecash-agora /work/modules/ecash-lib /work/modules/ecash-lib-wasm /work/modules/ecash-script /work/modules/chronik-client /work/modules/mock-chronik-client /work/modules/ecashaddrjs /work/abc-ci-builds/cashtab-tests
npm warn deprecated @humanwhocodes/config-array@0.11.14: Use @eslint/config-array instead
npm warn deprecated @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema instead
npm warn deprecated eslint@8.56.0: This version is no longer supported. Please see https://eslint.org/version-support for other options.

added 1483 packages, and audited 3329 packages in 24s

323 packages are looking for funding
  run `npm fund` for details

3 vulnerabilities (2 moderate, 1 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

> cashtab@2.54.2 build
> node scripts/build.js

Creating an optimized production build...
Failed to compile.

TS2322: Type 'Map<number, { address: string; hash: string; wif: string; sk: Uint8Array; pk: Uint8Array; }>' is not assignable to type 'CashtabWalletPaths'.
  Property '1899' is missing in type 'Map<number, { address: string; hash: string; wif: string; sk: Uint8Array; pk: Uint8Array; }>' but required in type 'RequiredCashtabPathInfo'.
    1471 |     mnemonic: 'some words that would give it all away',
    1472 |     name: '[Burned] useWallet Mock',
  > 1473 |     paths: new Map([
         |     ^^^^^
    1474 |         [
    1475 |             1899,
    1476 |             {


Build cashtab-tests failed with exit code 1

remove debug statement, ts lint

Failed tests logs:

====== CashTab Unit Tests: Cashtab wallet methods Creates a wallet from valid bip39 mnemonic createCashtabWallet: Creates a Cashtab wallet from a valid bip39 mnemonic ======
TypeError: ecc.derivePubkey is not a function
    at derivePubkey (/work/cashtab/src/wallet/index.ts:289:20)
    at getPathInfo (/work/cashtab/src/wallet/index.ts:252:26)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/wallet/__tests__/index.test.js:104:24)
====== CashTab Unit Tests: useWallet hook rendering in different localforage states XEC price is set in state on successful API fetch ======
Error: expect(received).toBe(expected) // Object.is equality

Expected: 0.00003
Received: null

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div />
  </body>
</html>
    at toBe (/work/cashtab/src/wallet/__tests__/useWallet.test.js:89:46)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: useWallet hook rendering in different localforage states XEC price remains null in state on API error ======
TypeError: Cannot read properties of undefined (reading 'derivePubkey')
    at derivePubkey (/work/cashtab/src/wallet/index.ts:289:20)
    at getPathInfo (/work/cashtab/src/wallet/index.ts:252:26)
    at loadCashtabState (/work/cashtab/src/wallet/useWallet.ts:475:29)
    at cashtabBootup (/work/cashtab/src/wallet/useWallet.ts:970:9)
====== CashTab Unit Tests: useWallet hook rendering in different localforage states XEC price is set in state to fiat currency of user settings on successful API fetch ======
Error: expect(received).toBe(expected) // Object.is equality

Expected: 0.00003132
Received: null

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div />
  </body>
</html>
    at toBe (/work/cashtab/src/wallet/__tests__/useWallet.test.js:145:46)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: useWallet hook rendering in different localforage states Cashtab loads wallet, settings, cache, and contactlist from localforage to context if they are present ======
Error: expect(received).toEqual(expected) // deep equality

- Expected  - 25
+ Received  +  0

@@ -46,32 +46,7 @@
          "number": 1,
          "protocol": "SLP",
          "type": "SLP_TOKEN_TYPE_FUNGIBLE",
        },
      },
-     "3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109" => Object {
-       "block": Object {
-         "hash": "00000000000000001239831f90580c859ec174316e91961cf0e8cde57c0d3acb",
-         "height": 782665,
-         "timestamp": 1678408305,
-       },
-       "genesisInfo": Object {
-         "decimals": 0,
-         "hash": "",
-         "tokenName": "BearNip",
-         "tokenTicker": "BEAR",
-         "url": "https://cashtab.com/",
-       },
-       "genesisMintBatons": 0,
-       "genesisOutputScripts": Array [
-         "76a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88ac",
-       ],
-       "genesisSupply": "4444",
-       "timeFirstSeen": 0,
-       "tokenType": Object {
-         "number": 1,
-         "protocol": "SLP",
-         "type": "SLP_TOKEN_TYPE_FUNGIBLE",
-       },
-     },
    },
  }

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div />
  </body>
</html>
    at toEqual (/work/cashtab/src/wallet/__tests__/useWallet.test.js:184:62)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: useWallet hook rendering in different localforage states processChronikWsMsg() refreshes alias prices when aliasPrices is null ======
Error: expect(received).toStrictEqual(expected) // deep equality

Expected: {"mnemonic": "beauty shoe decline spend still weird slot snack coach flee between paper", "name": "Transaction Fixtures", "paths": Map {1899 => {"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "hash": "3a5fb236934ec078b4507c303d3afd82067f8fc1", "pk": [3, 29, 70, 3, 189, 194, 58, 202, 148, 50, …], "sk": [81, 45, 52, 211, 184, 244, 210, 105, 33, 159, …], "wif": "KywWPgaLDwvW1tWUtUvs13jgqaaWMoNANLVYoKcK9Ddbpnch7Cmw"}, 145 => {"address": "ecash:qz3glzzjlp503rn3a3nxccedd7rwj78sgczljhvzv3", "hash": "a28f8852f868f88e71ec666c632d6f86e978f046", "pk": [3, 147, 154, 41, 253, 103, 250, 96, 41, 38, …], "sk": [151, 71, 192, 198, 166, 180, 161, 2, 91, 34, …], "wif": "L2HnC8ZT5JuwVFjrAjJUBs2tmmBoxdVa1MVCJccqV8S9YPoR1NuZ"}, 245 => {"address": "ecash:qpsqa7cj5mup8mx0zvt34z7xyp2jztvdds67wajntk", "hash": "600efb12a6f813eccf13171a8bc62055212d8d6c", "pk": [3, 247, 63, 226, 99, 29, 169, 115, 47, 36, …], "sk": [195, 246, 55, 186, 30, 60, 221, 16, 202, 206, …], "wif": "L3ndnMkn4574McqhPujguusu48NrmeLUgWYMkRpYQGLXDGAwGmPq"}}, "state": {"balanceSats": 951312, "nonSlpUtxos": [{"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "blockHeight": 815549, "isCoinbase": false, "isFinal": true, "outpoint": {"outIdx": 2, "txid": "218a1e058ed0fda76573eabf43ad3ded7e7192e42621893a60aaa152ba7f66fe"}, "path": 1899, "value": 951312}], "parsedTxHistory": [{"inputs": [[Object], [Object], [Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 546, "stackArray": [Array], "xecTxType": "Received"}, "size": 627, "timeFirstSeen": 0, "tokenEntries": [[Object]], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NORMAL", "txid": "3b0760858b0b20ff50d0db67793892d29d2466b86a0116f7e232792da0c22330", "version": 2}, {"block": {"hash": "00000000000000000ea3601057ba423805f91d9d813a41a91ae908b68ff6cbce", "height": 815549, "timestamp": 1698187386}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 553, "stackArray": [Array], "xecTxType": "Sent"}, "size": 268, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "218a1e058ed0fda76573eabf43ad3ded7e7192e42621893a60aaa152ba7f66fe", "version": 2}, {"block": {"hash": "000000000000000009004fa50065ef6deb091f0d075cf1ef01811d0706c9a8c2", "height": 814357, "timestamp": 1697463218}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 551, "stackArray": [Array], "xecTxType": "Sent"}, "size": 275, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "9f25f4e161472920f624ed6579ccdaf8d096263ab31e157deaa9c987269ead8a", "version": 2}, {"block": {"hash": "00000000000000001533643253107df49b2291beb9d5cd5c7f4f51bf26572e53", "height": 813934, "timestamp": 1697216026}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 551, "stackArray": [Array], "xecTxType": "Sent"}, "size": 270, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "42c39baded510db31aebaf9172d307afa199dd734a6189ea4bc3530438d715ca", "version": 2}, {"block": {"hash": "0000000000000000166ee88a29775a1098813f4316a5afbe835d21e0d74fda24", "height": 813923, "timestamp": 1697211295}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "5aa64624e493502d083089f5a58069887bc99a6d5569b27df7c7570e024bbf20", "version": 2}, {"block": {"hash": "00000000000000000a1807a17ebcda93947db968e9a112b54ec70237d1a76288", "height": 813922, "timestamp": 1697211196}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 555, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "b26c42ba0cc48f0d3af442b445f19c267189f84dbeb7e366ec7c921f5195aca7", "version": 2}, {"block": {"hash": "00000000000000000a1807a17ebcda93947db968e9a112b54ec70237d1a76288", "height": 813922, "timestamp": 1697211196}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 555, "stackArray": [Array], "xecTxType": "Sent"}, "size": 266, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "f86f20336955bca4e15588d81d029ad2c0dfa498b8be6aced2b63ba3bea1be0a", "version": 2}, {"block": {"hash": "000000000000000006b8990c77dd7a0d3a850a052b6f0bd60b82d44d1ffa7a55", "height": 813615, "timestamp": 1697025138}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 268, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "f17814a75dad000557f19a3a3f6fcc124ab7880292c9fad4c64dc034d5e46551", "version": 2}, {"block": {"hash": "000000000000000006b8990c77dd7a0d3a850a052b6f0bd60b82d44d1ffa7a55", "height": 813615, "timestamp": 1697025138}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "7eacd3b752003fe761e359cac3d98b1faf4f1dd411150eabc89da8208a312b0e", "version": 2}, {"block": {"hash": "00000000000000000b2dfec91630d335b0233fb323a7acbb297b586d1d0d0678", "height": 812408, "timestamp": 1696282475}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 2200, "stackArray": [Array], "xecTxType": "Sent"}, "size": 252, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "8b3cb0e6c38ee01f9e1e98d611895ff2cd09ad9b4fea73f76f951be815278c26", "version": 2}], "slpUtxos": [{"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "blockHeight": -1, "isCoinbase": false, "isFinal": true, "outpoint": {"outIdx": 1, "txid": "3b0760858b0b20ff50d0db67793892d29d2466b86a0116f7e232792da0c22330"}, "path": 1899, "token": {"amount": "1", "isMintBaton": false, "tokenId": "3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109", "tokenType": [Object]}, "tokenId": "3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109", "value": 546}], "tokens": Map {"3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109" => "1"}}}
Received: undefined

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div />
  </body>
</html>
    at toStrictEqual (/work/cashtab/src/wallet/__tests__/useWallet.test.js:254:60)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: useWallet hook rendering in different localforage states processChronikWsMsg() refreshes alias prices when aliasPrices exists, server and cashtab prices array length do not match ======
Error: expect(received).toStrictEqual(expected) // deep equality

Expected: {"mnemonic": "beauty shoe decline spend still weird slot snack coach flee between paper", "name": "Transaction Fixtures", "paths": Map {1899 => {"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "hash": "3a5fb236934ec078b4507c303d3afd82067f8fc1", "pk": [3, 29, 70, 3, 189, 194, 58, 202, 148, 50, …], "sk": [81, 45, 52, 211, 184, 244, 210, 105, 33, 159, …], "wif": "KywWPgaLDwvW1tWUtUvs13jgqaaWMoNANLVYoKcK9Ddbpnch7Cmw"}, 145 => {"address": "ecash:qz3glzzjlp503rn3a3nxccedd7rwj78sgczljhvzv3", "hash": "a28f8852f868f88e71ec666c632d6f86e978f046", "pk": [3, 147, 154, 41, 253, 103, 250, 96, 41, 38, …], "sk": [151, 71, 192, 198, 166, 180, 161, 2, 91, 34, …], "wif": "L2HnC8ZT5JuwVFjrAjJUBs2tmmBoxdVa1MVCJccqV8S9YPoR1NuZ"}, 245 => {"address": "ecash:qpsqa7cj5mup8mx0zvt34z7xyp2jztvdds67wajntk", "hash": "600efb12a6f813eccf13171a8bc62055212d8d6c", "pk": [3, 247, 63, 226, 99, 29, 169, 115, 47, 36, …], "sk": [195, 246, 55, 186, 30, 60, 221, 16, 202, 206, …], "wif": "L3ndnMkn4574McqhPujguusu48NrmeLUgWYMkRpYQGLXDGAwGmPq"}}, "state": {"balanceSats": 951312, "nonSlpUtxos": [{"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "blockHeight": 815549, "isCoinbase": false, "isFinal": true, "outpoint": {"outIdx": 2, "txid": "218a1e058ed0fda76573eabf43ad3ded7e7192e42621893a60aaa152ba7f66fe"}, "path": 1899, "value": 951312}], "parsedTxHistory": [{"inputs": [[Object], [Object], [Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 546, "stackArray": [Array], "xecTxType": "Received"}, "size": 627, "timeFirstSeen": 0, "tokenEntries": [[Object]], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NORMAL", "txid": "3b0760858b0b20ff50d0db67793892d29d2466b86a0116f7e232792da0c22330", "version": 2}, {"block": {"hash": "00000000000000000ea3601057ba423805f91d9d813a41a91ae908b68ff6cbce", "height": 815549, "timestamp": 1698187386}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 553, "stackArray": [Array], "xecTxType": "Sent"}, "size": 268, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "218a1e058ed0fda76573eabf43ad3ded7e7192e42621893a60aaa152ba7f66fe", "version": 2}, {"block": {"hash": "000000000000000009004fa50065ef6deb091f0d075cf1ef01811d0706c9a8c2", "height": 814357, "timestamp": 1697463218}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 551, "stackArray": [Array], "xecTxType": "Sent"}, "size": 275, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "9f25f4e161472920f624ed6579ccdaf8d096263ab31e157deaa9c987269ead8a", "version": 2}, {"block": {"hash": "00000000000000001533643253107df49b2291beb9d5cd5c7f4f51bf26572e53", "height": 813934, "timestamp": 1697216026}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 551, "stackArray": [Array], "xecTxType": "Sent"}, "size": 270, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "42c39baded510db31aebaf9172d307afa199dd734a6189ea4bc3530438d715ca", "version": 2}, {"block": {"hash": "0000000000000000166ee88a29775a1098813f4316a5afbe835d21e0d74fda24", "height": 813923, "timestamp": 1697211295}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "5aa64624e493502d083089f5a58069887bc99a6d5569b27df7c7570e024bbf20", "version": 2}, {"block": {"hash": "00000000000000000a1807a17ebcda93947db968e9a112b54ec70237d1a76288", "height": 813922, "timestamp": 1697211196}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 555, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "b26c42ba0cc48f0d3af442b445f19c267189f84dbeb7e366ec7c921f5195aca7", "version": 2}, {"block": {"hash": "00000000000000000a1807a17ebcda93947db968e9a112b54ec70237d1a76288", "height": 813922, "timestamp": 1697211196}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 555, "stackArray": [Array], "xecTxType": "Sent"}, "size": 266, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "f86f20336955bca4e15588d81d029ad2c0dfa498b8be6aced2b63ba3bea1be0a", "version": 2}, {"block": {"hash": "000000000000000006b8990c77dd7a0d3a850a052b6f0bd60b82d44d1ffa7a55", "height": 813615, "timestamp": 1697025138}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 268, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "f17814a75dad000557f19a3a3f6fcc124ab7880292c9fad4c64dc034d5e46551", "version": 2}, {"block": {"hash": "000000000000000006b8990c77dd7a0d3a850a052b6f0bd60b82d44d1ffa7a55", "height": 813615, "timestamp": 1697025138}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "7eacd3b752003fe761e359cac3d98b1faf4f1dd411150eabc89da8208a312b0e", "version": 2}, {"block": {"hash": "00000000000000000b2dfec91630d335b0233fb323a7acbb297b586d1d0d0678", "height": 812408, "timestamp": 1696282475}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 2200, "stackArray": [Array], "xecTxType": "Sent"}, "size": 252, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "8b3cb0e6c38ee01f9e1e98d611895ff2cd09ad9b4fea73f76f951be815278c26", "version": 2}], "slpUtxos": [{"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "blockHeight": -1, "isCoinbase": false, "isFinal": true, "outpoint": {"outIdx": 1, "txid": "3b0760858b0b20ff50d0db67793892d29d2466b86a0116f7e232792da0c22330"}, "path": 1899, "token": {"amount": "1", "isMintBaton": false, "tokenId": "3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109", "tokenType": [Object]}, "tokenId": "3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109", "value": 546}], "tokens": Map {"3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109" => "1"}}}
Received: undefined

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div />
  </body>
</html>
    at toStrictEqual (/work/cashtab/src/wallet/__tests__/useWallet.test.js:389:60)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: useWallet hook rendering in different localforage states processChronikWsMsg() does not refresh alias prices when aliasPrices exists, server and cashtab array length do match ======
Error: expect(received).toStrictEqual(expected) // deep equality

Expected: {"mnemonic": "beauty shoe decline spend still weird slot snack coach flee between paper", "name": "Transaction Fixtures", "paths": Map {1899 => {"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "hash": "3a5fb236934ec078b4507c303d3afd82067f8fc1", "pk": [3, 29, 70, 3, 189, 194, 58, 202, 148, 50, …], "sk": [81, 45, 52, 211, 184, 244, 210, 105, 33, 159, …], "wif": "KywWPgaLDwvW1tWUtUvs13jgqaaWMoNANLVYoKcK9Ddbpnch7Cmw"}, 145 => {"address": "ecash:qz3glzzjlp503rn3a3nxccedd7rwj78sgczljhvzv3", "hash": "a28f8852f868f88e71ec666c632d6f86e978f046", "pk": [3, 147, 154, 41, 253, 103, 250, 96, 41, 38, …], "sk": [151, 71, 192, 198, 166, 180, 161, 2, 91, 34, …], "wif": "L2HnC8ZT5JuwVFjrAjJUBs2tmmBoxdVa1MVCJccqV8S9YPoR1NuZ"}, 245 => {"address": "ecash:qpsqa7cj5mup8mx0zvt34z7xyp2jztvdds67wajntk", "hash": "600efb12a6f813eccf13171a8bc62055212d8d6c", "pk": [3, 247, 63, 226, 99, 29, 169, 115, 47, 36, …], "sk": [195, 246, 55, 186, 30, 60, 221, 16, 202, 206, …], "wif": "L3ndnMkn4574McqhPujguusu48NrmeLUgWYMkRpYQGLXDGAwGmPq"}}, "state": {"balanceSats": 951312, "nonSlpUtxos": [{"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "blockHeight": 815549, "isCoinbase": false, "isFinal": true, "outpoint": {"outIdx": 2, "txid": "218a1e058ed0fda76573eabf43ad3ded7e7192e42621893a60aaa152ba7f66fe"}, "path": 1899, "value": 951312}], "parsedTxHistory": [{"inputs": [[Object], [Object], [Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 546, "stackArray": [Array], "xecTxType": "Received"}, "size": 627, "timeFirstSeen": 0, "tokenEntries": [[Object]], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NORMAL", "txid": "3b0760858b0b20ff50d0db67793892d29d2466b86a0116f7e232792da0c22330", "version": 2}, {"block": {"hash": "00000000000000000ea3601057ba423805f91d9d813a41a91ae908b68ff6cbce", "height": 815549, "timestamp": 1698187386}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 553, "stackArray": [Array], "xecTxType": "Sent"}, "size": 268, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "218a1e058ed0fda76573eabf43ad3ded7e7192e42621893a60aaa152ba7f66fe", "version": 2}, {"block": {"hash": "000000000000000009004fa50065ef6deb091f0d075cf1ef01811d0706c9a8c2", "height": 814357, "timestamp": 1697463218}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 551, "stackArray": [Array], "xecTxType": "Sent"}, "size": 275, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "9f25f4e161472920f624ed6579ccdaf8d096263ab31e157deaa9c987269ead8a", "version": 2}, {"block": {"hash": "00000000000000001533643253107df49b2291beb9d5cd5c7f4f51bf26572e53", "height": 813934, "timestamp": 1697216026}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 551, "stackArray": [Array], "xecTxType": "Sent"}, "size": 270, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "42c39baded510db31aebaf9172d307afa199dd734a6189ea4bc3530438d715ca", "version": 2}, {"block": {"hash": "0000000000000000166ee88a29775a1098813f4316a5afbe835d21e0d74fda24", "height": 813923, "timestamp": 1697211295}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "5aa64624e493502d083089f5a58069887bc99a6d5569b27df7c7570e024bbf20", "version": 2}, {"block": {"hash": "00000000000000000a1807a17ebcda93947db968e9a112b54ec70237d1a76288", "height": 813922, "timestamp": 1697211196}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 555, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "b26c42ba0cc48f0d3af442b445f19c267189f84dbeb7e366ec7c921f5195aca7", "version": 2}, {"block": {"hash": "00000000000000000a1807a17ebcda93947db968e9a112b54ec70237d1a76288", "height": 813922, "timestamp": 1697211196}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 555, "stackArray": [Array], "xecTxType": "Sent"}, "size": 266, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "f86f20336955bca4e15588d81d029ad2c0dfa498b8be6aced2b63ba3bea1be0a", "version": 2}, {"block": {"hash": "000000000000000006b8990c77dd7a0d3a850a052b6f0bd60b82d44d1ffa7a55", "height": 813615, "timestamp": 1697025138}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 268, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "f17814a75dad000557f19a3a3f6fcc124ab7880292c9fad4c64dc034d5e46551", "version": 2}, {"block": {"hash": "000000000000000006b8990c77dd7a0d3a850a052b6f0bd60b82d44d1ffa7a55", "height": 813615, "timestamp": 1697025138}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "7eacd3b752003fe761e359cac3d98b1faf4f1dd411150eabc89da8208a312b0e", "version": 2}, {"block": {"hash": "00000000000000000b2dfec91630d335b0233fb323a7acbb297b586d1d0d0678", "height": 812408, "timestamp": 1696282475}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 2200, "stackArray": [Array], "xecTxType": "Sent"}, "size": 252, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "8b3cb0e6c38ee01f9e1e98d611895ff2cd09ad9b4fea73f76f951be815278c26", "version": 2}], "slpUtxos": [{"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "blockHeight": -1, "isCoinbase": false, "isFinal": true, "outpoint": {"outIdx": 1, "txid": "3b0760858b0b20ff50d0db67793892d29d2466b86a0116f7e232792da0c22330"}, "path": 1899, "token": {"amount": "1", "isMintBaton": false, "tokenId": "3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109", "tokenType": [Object]}, "tokenId": "3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109", "value": 546}], "tokens": Map {"3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109" => "1"}}}
Received: undefined

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div />
  </body>
</html>
    at toStrictEqual (/work/cashtab/src/wallet/__tests__/useWallet.test.js:540:60)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: useWallet hook rendering in different localforage states Verify a processChronikWsMsg() new block event updates the `aliasServerError` state var upon a /prices/ endpoint error ======
Error: expect(received).toStrictEqual(expected) // deep equality

Expected: {"mnemonic": "beauty shoe decline spend still weird slot snack coach flee between paper", "name": "Transaction Fixtures", "paths": Map {1899 => {"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "hash": "3a5fb236934ec078b4507c303d3afd82067f8fc1", "pk": [3, 29, 70, 3, 189, 194, 58, 202, 148, 50, …], "sk": [81, 45, 52, 211, 184, 244, 210, 105, 33, 159, …], "wif": "KywWPgaLDwvW1tWUtUvs13jgqaaWMoNANLVYoKcK9Ddbpnch7Cmw"}, 145 => {"address": "ecash:qz3glzzjlp503rn3a3nxccedd7rwj78sgczljhvzv3", "hash": "a28f8852f868f88e71ec666c632d6f86e978f046", "pk": [3, 147, 154, 41, 253, 103, 250, 96, 41, 38, …], "sk": [151, 71, 192, 198, 166, 180, 161, 2, 91, 34, …], "wif": "L2HnC8ZT5JuwVFjrAjJUBs2tmmBoxdVa1MVCJccqV8S9YPoR1NuZ"}, 245 => {"address": "ecash:qpsqa7cj5mup8mx0zvt34z7xyp2jztvdds67wajntk", "hash": "600efb12a6f813eccf13171a8bc62055212d8d6c", "pk": [3, 247, 63, 226, 99, 29, 169, 115, 47, 36, …], "sk": [195, 246, 55, 186, 30, 60, 221, 16, 202, 206, …], "wif": "L3ndnMkn4574McqhPujguusu48NrmeLUgWYMkRpYQGLXDGAwGmPq"}}, "state": {"balanceSats": 951312, "nonSlpUtxos": [{"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "blockHeight": 815549, "isCoinbase": false, "isFinal": true, "outpoint": {"outIdx": 2, "txid": "218a1e058ed0fda76573eabf43ad3ded7e7192e42621893a60aaa152ba7f66fe"}, "path": 1899, "value": 951312}], "parsedTxHistory": [{"inputs": [[Object], [Object], [Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 546, "stackArray": [Array], "xecTxType": "Received"}, "size": 627, "timeFirstSeen": 0, "tokenEntries": [[Object]], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NORMAL", "txid": "3b0760858b0b20ff50d0db67793892d29d2466b86a0116f7e232792da0c22330", "version": 2}, {"block": {"hash": "00000000000000000ea3601057ba423805f91d9d813a41a91ae908b68ff6cbce", "height": 815549, "timestamp": 1698187386}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 553, "stackArray": [Array], "xecTxType": "Sent"}, "size": 268, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "218a1e058ed0fda76573eabf43ad3ded7e7192e42621893a60aaa152ba7f66fe", "version": 2}, {"block": {"hash": "000000000000000009004fa50065ef6deb091f0d075cf1ef01811d0706c9a8c2", "height": 814357, "timestamp": 1697463218}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 551, "stackArray": [Array], "xecTxType": "Sent"}, "size": 275, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "9f25f4e161472920f624ed6579ccdaf8d096263ab31e157deaa9c987269ead8a", "version": 2}, {"block": {"hash": "00000000000000001533643253107df49b2291beb9d5cd5c7f4f51bf26572e53", "height": 813934, "timestamp": 1697216026}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 551, "stackArray": [Array], "xecTxType": "Sent"}, "size": 270, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "42c39baded510db31aebaf9172d307afa199dd734a6189ea4bc3530438d715ca", "version": 2}, {"block": {"hash": "0000000000000000166ee88a29775a1098813f4316a5afbe835d21e0d74fda24", "height": 813923, "timestamp": 1697211295}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "5aa64624e493502d083089f5a58069887bc99a6d5569b27df7c7570e024bbf20", "version": 2}, {"block": {"hash": "00000000000000000a1807a17ebcda93947db968e9a112b54ec70237d1a76288", "height": 813922, "timestamp": 1697211196}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 555, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "b26c42ba0cc48f0d3af442b445f19c267189f84dbeb7e366ec7c921f5195aca7", "version": 2}, {"block": {"hash": "00000000000000000a1807a17ebcda93947db968e9a112b54ec70237d1a76288", "height": 813922, "timestamp": 1697211196}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 555, "stackArray": [Array], "xecTxType": "Sent"}, "size": 266, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "f86f20336955bca4e15588d81d029ad2c0dfa498b8be6aced2b63ba3bea1be0a", "version": 2}, {"block": {"hash": "000000000000000006b8990c77dd7a0d3a850a052b6f0bd60b82d44d1ffa7a55", "height": 813615, "timestamp": 1697025138}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 268, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "f17814a75dad000557f19a3a3f6fcc124ab7880292c9fad4c64dc034d5e46551", "version": 2}, {"block": {"hash": "000000000000000006b8990c77dd7a0d3a850a052b6f0bd60b82d44d1ffa7a55", "height": 813615, "timestamp": 1697025138}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "7eacd3b752003fe761e359cac3d98b1faf4f1dd411150eabc89da8208a312b0e", "version": 2}, {"block": {"hash": "00000000000000000b2dfec91630d335b0233fb323a7acbb297b586d1d0d0678", "height": 812408, "timestamp": 1696282475}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 2200, "stackArray": [Array], "xecTxType": "Sent"}, "size": 252, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "8b3cb0e6c38ee01f9e1e98d611895ff2cd09ad9b4fea73f76f951be815278c26", "version": 2}], "slpUtxos": [{"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "blockHeight": -1, "isCoinbase": false, "isFinal": true, "outpoint": {"outIdx": 1, "txid": "3b0760858b0b20ff50d0db67793892d29d2466b86a0116f7e232792da0c22330"}, "path": 1899, "token": {"amount": "1", "isMintBaton": false, "tokenId": "3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109", "tokenType": [Object]}, "tokenId": "3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109", "value": 546}], "tokens": Map {"3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109" => "1"}}}
Received: undefined

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div />
  </body>
</html>
    at toStrictEqual (/work/cashtab/src/wallet/__tests__/useWallet.test.js:599:60)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: useWallet hook rendering in different localforage states Verify refreshAliases() updates the `aliases` state variable on a successful /address/ endpoint response ======
Error: expect(received).toStrictEqual(expected) // deep equality

Expected: {"mnemonic": "beauty shoe decline spend still weird slot snack coach flee between paper", "name": "Transaction Fixtures", "paths": Map {1899 => {"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "hash": "3a5fb236934ec078b4507c303d3afd82067f8fc1", "pk": [3, 29, 70, 3, 189, 194, 58, 202, 148, 50, …], "sk": [81, 45, 52, 211, 184, 244, 210, 105, 33, 159, …], "wif": "KywWPgaLDwvW1tWUtUvs13jgqaaWMoNANLVYoKcK9Ddbpnch7Cmw"}, 145 => {"address": "ecash:qz3glzzjlp503rn3a3nxccedd7rwj78sgczljhvzv3", "hash": "a28f8852f868f88e71ec666c632d6f86e978f046", "pk": [3, 147, 154, 41, 253, 103, 250, 96, 41, 38, …], "sk": [151, 71, 192, 198, 166, 180, 161, 2, 91, 34, …], "wif": "L2HnC8ZT5JuwVFjrAjJUBs2tmmBoxdVa1MVCJccqV8S9YPoR1NuZ"}, 245 => {"address": "ecash:qpsqa7cj5mup8mx0zvt34z7xyp2jztvdds67wajntk", "hash": "600efb12a6f813eccf13171a8bc62055212d8d6c", "pk": [3, 247, 63, 226, 99, 29, 169, 115, 47, 36, …], "sk": [195, 246, 55, 186, 30, 60, 221, 16, 202, 206, …], "wif": "L3ndnMkn4574McqhPujguusu48NrmeLUgWYMkRpYQGLXDGAwGmPq"}}, "state": {"balanceSats": 951312, "nonSlpUtxos": [{"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "blockHeight": 815549, "isCoinbase": false, "isFinal": true, "outpoint": {"outIdx": 2, "txid": "218a1e058ed0fda76573eabf43ad3ded7e7192e42621893a60aaa152ba7f66fe"}, "path": 1899, "value": 951312}], "parsedTxHistory": [{"inputs": [[Object], [Object], [Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 546, "stackArray": [Array], "xecTxType": "Received"}, "size": 627, "timeFirstSeen": 0, "tokenEntries": [[Object]], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NORMAL", "txid": "3b0760858b0b20ff50d0db67793892d29d2466b86a0116f7e232792da0c22330", "version": 2}, {"block": {"hash": "00000000000000000ea3601057ba423805f91d9d813a41a91ae908b68ff6cbce", "height": 815549, "timestamp": 1698187386}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 553, "stackArray": [Array], "xecTxType": "Sent"}, "size": 268, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "218a1e058ed0fda76573eabf43ad3ded7e7192e42621893a60aaa152ba7f66fe", "version": 2}, {"block": {"hash": "000000000000000009004fa50065ef6deb091f0d075cf1ef01811d0706c9a8c2", "height": 814357, "timestamp": 1697463218}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 551, "stackArray": [Array], "xecTxType": "Sent"}, "size": 275, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "9f25f4e161472920f624ed6579ccdaf8d096263ab31e157deaa9c987269ead8a", "version": 2}, {"block": {"hash": "00000000000000001533643253107df49b2291beb9d5cd5c7f4f51bf26572e53", "height": 813934, "timestamp": 1697216026}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 551, "stackArray": [Array], "xecTxType": "Sent"}, "size": 270, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "42c39baded510db31aebaf9172d307afa199dd734a6189ea4bc3530438d715ca", "version": 2}, {"block": {"hash": "0000000000000000166ee88a29775a1098813f4316a5afbe835d21e0d74fda24", "height": 813923, "timestamp": 1697211295}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "5aa64624e493502d083089f5a58069887bc99a6d5569b27df7c7570e024bbf20", "version": 2}, {"block": {"hash": "00000000000000000a1807a17ebcda93947db968e9a112b54ec70237d1a76288", "height": 813922, "timestamp": 1697211196}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 555, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "b26c42ba0cc48f0d3af442b445f19c267189f84dbeb7e366ec7c921f5195aca7", "version": 2}, {"block": {"hash": "00000000000000000a1807a17ebcda93947db968e9a112b54ec70237d1a76288", "height": 813922, "timestamp": 1697211196}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 555, "stackArray": [Array], "xecTxType": "Sent"}, "size": 266, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "f86f20336955bca4e15588d81d029ad2c0dfa498b8be6aced2b63ba3bea1be0a", "version": 2}, {"block": {"hash": "000000000000000006b8990c77dd7a0d3a850a052b6f0bd60b82d44d1ffa7a55", "height": 813615, "timestamp": 1697025138}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 268, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "f17814a75dad000557f19a3a3f6fcc124ab7880292c9fad4c64dc034d5e46551", "version": 2}, {"block": {"hash": "000000000000000006b8990c77dd7a0d3a850a052b6f0bd60b82d44d1ffa7a55", "height": 813615, "timestamp": 1697025138}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "7eacd3b752003fe761e359cac3d98b1faf4f1dd411150eabc89da8208a312b0e", "version": 2}, {"block": {"hash": "00000000000000000b2dfec91630d335b0233fb323a7acbb297b586d1d0d0678", "height": 812408, "timestamp": 1696282475}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 2200, "stackArray": [Array], "xecTxType": "Sent"}, "size": 252, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "8b3cb0e6c38ee01f9e1e98d611895ff2cd09ad9b4fea73f76f951be815278c26", "version": 2}], "slpUtxos": [{"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "blockHeight": -1, "isCoinbase": false, "isFinal": true, "outpoint": {"outIdx": 1, "txid": "3b0760858b0b20ff50d0db67793892d29d2466b86a0116f7e232792da0c22330"}, "path": 1899, "token": {"amount": "1", "isMintBaton": false, "tokenId": "3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109", "tokenType": [Object]}, "tokenId": "3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109", "value": 546}], "tokens": Map {"3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109" => "1"}}}
Received: undefined

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div />
  </body>
</html>
    at toStrictEqual (/work/cashtab/src/wallet/__tests__/useWallet.test.js:656:60)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: useWallet hook rendering in different localforage states Verify refreshAliases() updates the `aliasServerError` state variable upon an /address/ endpoint error ======
Error: expect(received).toStrictEqual(expected) // deep equality

Expected: {"mnemonic": "beauty shoe decline spend still weird slot snack coach flee between paper", "name": "Transaction Fixtures", "paths": Map {1899 => {"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "hash": "3a5fb236934ec078b4507c303d3afd82067f8fc1", "pk": [3, 29, 70, 3, 189, 194, 58, 202, 148, 50, …], "sk": [81, 45, 52, 211, 184, 244, 210, 105, 33, 159, …], "wif": "KywWPgaLDwvW1tWUtUvs13jgqaaWMoNANLVYoKcK9Ddbpnch7Cmw"}, 145 => {"address": "ecash:qz3glzzjlp503rn3a3nxccedd7rwj78sgczljhvzv3", "hash": "a28f8852f868f88e71ec666c632d6f86e978f046", "pk": [3, 147, 154, 41, 253, 103, 250, 96, 41, 38, …], "sk": [151, 71, 192, 198, 166, 180, 161, 2, 91, 34, …], "wif": "L2HnC8ZT5JuwVFjrAjJUBs2tmmBoxdVa1MVCJccqV8S9YPoR1NuZ"}, 245 => {"address": "ecash:qpsqa7cj5mup8mx0zvt34z7xyp2jztvdds67wajntk", "hash": "600efb12a6f813eccf13171a8bc62055212d8d6c", "pk": [3, 247, 63, 226, 99, 29, 169, 115, 47, 36, …], "sk": [195, 246, 55, 186, 30, 60, 221, 16, 202, 206, …], "wif": "L3ndnMkn4574McqhPujguusu48NrmeLUgWYMkRpYQGLXDGAwGmPq"}}, "state": {"balanceSats": 951312, "nonSlpUtxos": [{"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "blockHeight": 815549, "isCoinbase": false, "isFinal": true, "outpoint": {"outIdx": 2, "txid": "218a1e058ed0fda76573eabf43ad3ded7e7192e42621893a60aaa152ba7f66fe"}, "path": 1899, "value": 951312}], "parsedTxHistory": [{"inputs": [[Object], [Object], [Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 546, "stackArray": [Array], "xecTxType": "Received"}, "size": 627, "timeFirstSeen": 0, "tokenEntries": [[Object]], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NORMAL", "txid": "3b0760858b0b20ff50d0db67793892d29d2466b86a0116f7e232792da0c22330", "version": 2}, {"block": {"hash": "00000000000000000ea3601057ba423805f91d9d813a41a91ae908b68ff6cbce", "height": 815549, "timestamp": 1698187386}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 553, "stackArray": [Array], "xecTxType": "Sent"}, "size": 268, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "218a1e058ed0fda76573eabf43ad3ded7e7192e42621893a60aaa152ba7f66fe", "version": 2}, {"block": {"hash": "000000000000000009004fa50065ef6deb091f0d075cf1ef01811d0706c9a8c2", "height": 814357, "timestamp": 1697463218}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 551, "stackArray": [Array], "xecTxType": "Sent"}, "size": 275, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "9f25f4e161472920f624ed6579ccdaf8d096263ab31e157deaa9c987269ead8a", "version": 2}, {"block": {"hash": "00000000000000001533643253107df49b2291beb9d5cd5c7f4f51bf26572e53", "height": 813934, "timestamp": 1697216026}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 551, "stackArray": [Array], "xecTxType": "Sent"}, "size": 270, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "42c39baded510db31aebaf9172d307afa199dd734a6189ea4bc3530438d715ca", "version": 2}, {"block": {"hash": "0000000000000000166ee88a29775a1098813f4316a5afbe835d21e0d74fda24", "height": 813923, "timestamp": 1697211295}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "5aa64624e493502d083089f5a58069887bc99a6d5569b27df7c7570e024bbf20", "version": 2}, {"block": {"hash": "00000000000000000a1807a17ebcda93947db968e9a112b54ec70237d1a76288", "height": 813922, "timestamp": 1697211196}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 555, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "b26c42ba0cc48f0d3af442b445f19c267189f84dbeb7e366ec7c921f5195aca7", "version": 2}, {"block": {"hash": "00000000000000000a1807a17ebcda93947db968e9a112b54ec70237d1a76288", "height": 813922, "timestamp": 1697211196}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 555, "stackArray": [Array], "xecTxType": "Sent"}, "size": 266, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "f86f20336955bca4e15588d81d029ad2c0dfa498b8be6aced2b63ba3bea1be0a", "version": 2}, {"block": {"hash": "000000000000000006b8990c77dd7a0d3a850a052b6f0bd60b82d44d1ffa7a55", "height": 813615, "timestamp": 1697025138}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 268, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "f17814a75dad000557f19a3a3f6fcc124ab7880292c9fad4c64dc034d5e46551", "version": 2}, {"block": {"hash": "000000000000000006b8990c77dd7a0d3a850a052b6f0bd60b82d44d1ffa7a55", "height": 813615, "timestamp": 1697025138}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "7eacd3b752003fe761e359cac3d98b1faf4f1dd411150eabc89da8208a312b0e", "version": 2}, {"block": {"hash": "00000000000000000b2dfec91630d335b0233fb323a7acbb297b586d1d0d0678", "height": 812408, "timestamp": 1696282475}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 2200, "stackArray": [Array], "xecTxType": "Sent"}, "size": 252, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "8b3cb0e6c38ee01f9e1e98d611895ff2cd09ad9b4fea73f76f951be815278c26", "version": 2}], "slpUtxos": [{"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "blockHeight": -1, "isCoinbase": false, "isFinal": true, "outpoint": {"outIdx": 1, "txid": "3b0760858b0b20ff50d0db67793892d29d2466b86a0116f7e232792da0c22330"}, "path": 1899, "token": {"amount": "1", "isMintBaton": false, "tokenId": "3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109", "tokenType": [Object]}, "tokenId": "3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109", "value": 546}], "tokens": Map {"3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109" => "1"}}}
Received: undefined

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div />
  </body>
</html>
    at toStrictEqual (/work/cashtab/src/wallet/__tests__/useWallet.test.js:693:60)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: useWallet hook rendering in different localforage states An incoming tx message from the websocket causes the wallet to update ======
Error: expect(received).toStrictEqual(expected) // deep equality

Expected: {"mnemonic": "beauty shoe decline spend still weird slot snack coach flee between paper", "name": "Transaction Fixtures", "paths": Map {1899 => {"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "hash": "3a5fb236934ec078b4507c303d3afd82067f8fc1", "pk": [3, 29, 70, 3, 189, 194, 58, 202, 148, 50, …], "sk": [81, 45, 52, 211, 184, 244, 210, 105, 33, 159, …], "wif": "KywWPgaLDwvW1tWUtUvs13jgqaaWMoNANLVYoKcK9Ddbpnch7Cmw"}, 145 => {"address": "ecash:qz3glzzjlp503rn3a3nxccedd7rwj78sgczljhvzv3", "hash": "a28f8852f868f88e71ec666c632d6f86e978f046", "pk": [3, 147, 154, 41, 253, 103, 250, 96, 41, 38, …], "sk": [151, 71, 192, 198, 166, 180, 161, 2, 91, 34, …], "wif": "L2HnC8ZT5JuwVFjrAjJUBs2tmmBoxdVa1MVCJccqV8S9YPoR1NuZ"}, 245 => {"address": "ecash:qpsqa7cj5mup8mx0zvt34z7xyp2jztvdds67wajntk", "hash": "600efb12a6f813eccf13171a8bc62055212d8d6c", "pk": [3, 247, 63, 226, 99, 29, 169, 115, 47, 36, …], "sk": [195, 246, 55, 186, 30, 60, 221, 16, 202, 206, …], "wif": "L3ndnMkn4574McqhPujguusu48NrmeLUgWYMkRpYQGLXDGAwGmPq"}}, "state": {"balanceSats": 951312, "nonSlpUtxos": [{"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "blockHeight": 815549, "isCoinbase": false, "isFinal": true, "outpoint": {"outIdx": 2, "txid": "218a1e058ed0fda76573eabf43ad3ded7e7192e42621893a60aaa152ba7f66fe"}, "path": 1899, "value": 951312}], "parsedTxHistory": [{"inputs": [[Object], [Object], [Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 546, "stackArray": [Array], "xecTxType": "Received"}, "size": 627, "timeFirstSeen": 0, "tokenEntries": [[Object]], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NORMAL", "txid": "3b0760858b0b20ff50d0db67793892d29d2466b86a0116f7e232792da0c22330", "version": 2}, {"block": {"hash": "00000000000000000ea3601057ba423805f91d9d813a41a91ae908b68ff6cbce", "height": 815549, "timestamp": 1698187386}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 553, "stackArray": [Array], "xecTxType": "Sent"}, "size": 268, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "218a1e058ed0fda76573eabf43ad3ded7e7192e42621893a60aaa152ba7f66fe", "version": 2}, {"block": {"hash": "000000000000000009004fa50065ef6deb091f0d075cf1ef01811d0706c9a8c2", "height": 814357, "timestamp": 1697463218}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 551, "stackArray": [Array], "xecTxType": "Sent"}, "size": 275, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "9f25f4e161472920f624ed6579ccdaf8d096263ab31e157deaa9c987269ead8a", "version": 2}, {"block": {"hash": "00000000000000001533643253107df49b2291beb9d5cd5c7f4f51bf26572e53", "height": 813934, "timestamp": 1697216026}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 551, "stackArray": [Array], "xecTxType": "Sent"}, "size": 270, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "42c39baded510db31aebaf9172d307afa199dd734a6189ea4bc3530438d715ca", "version": 2}, {"block": {"hash": "0000000000000000166ee88a29775a1098813f4316a5afbe835d21e0d74fda24", "height": 813923, "timestamp": 1697211295}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "5aa64624e493502d083089f5a58069887bc99a6d5569b27df7c7570e024bbf20", "version": 2}, {"block": {"hash": "00000000000000000a1807a17ebcda93947db968e9a112b54ec70237d1a76288", "height": 813922, "timestamp": 1697211196}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 555, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "b26c42ba0cc48f0d3af442b445f19c267189f84dbeb7e366ec7c921f5195aca7", "version": 2}, {"block": {"hash": "00000000000000000a1807a17ebcda93947db968e9a112b54ec70237d1a76288", "height": 813922, "timestamp": 1697211196}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 555, "stackArray": [Array], "xecTxType": "Sent"}, "size": 266, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "f86f20336955bca4e15588d81d029ad2c0dfa498b8be6aced2b63ba3bea1be0a", "version": 2}, {"block": {"hash": "000000000000000006b8990c77dd7a0d3a850a052b6f0bd60b82d44d1ffa7a55", "height": 813615, "timestamp": 1697025138}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 268, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "f17814a75dad000557f19a3a3f6fcc124ab7880292c9fad4c64dc034d5e46551", "version": 2}, {"block": {"hash": "000000000000000006b8990c77dd7a0d3a850a052b6f0bd60b82d44d1ffa7a55", "height": 813615, "timestamp": 1697025138}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 554, "stackArray": [Array], "xecTxType": "Sent"}, "size": 267, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "7eacd3b752003fe761e359cac3d98b1faf4f1dd411150eabc89da8208a312b0e", "version": 2}, {"block": {"hash": "00000000000000000b2dfec91630d335b0233fb323a7acbb297b586d1d0d0678", "height": 812408, "timestamp": 1696282475}, "inputs": [[Object]], "isCoinbase": false, "lockTime": 0, "outputs": [[Object], [Object], [Object]], "parsed": {"recipients": [Array], "satoshisSent": 2200, "stackArray": [Array], "xecTxType": "Sent"}, "size": 252, "timeFirstSeen": 0, "tokenEntries": [], "tokenFailedParsings": [], "tokenStatus": "TOKEN_STATUS_NON_TOKEN", "txid": "8b3cb0e6c38ee01f9e1e98d611895ff2cd09ad9b4fea73f76f951be815278c26", "version": 2}], "slpUtxos": [{"address": "ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g", "blockHeight": -1, "isCoinbase": false, "isFinal": true, "outpoint": {"outIdx": 1, "txid": "3b0760858b0b20ff50d0db67793892d29d2466b86a0116f7e232792da0c22330"}, "path": 1899, "token": {"amount": "1", "isMintBaton": false, "tokenId": "3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109", "tokenType": [Object]}, "tokenId": "3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109", "value": 546}], "tokens": Map {"3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109" => "1"}}}
Received: undefined

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div />
  </body>
</html>
    at toStrictEqual (/work/cashtab/src/wallet/__tests__/useWallet.test.js:724:60)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: <Home /> Renders backup warning, token rewards button, and QR Code if user loads with a new wallet that is not the only wallet ======
Error: expect(element).not.toBeInTheDocument()

expected document not to contain element, found <div class="sc-dNLxif eIcRKG" title="Cashtab Loading" /> instead

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div>
      <div
        class="sc-dTLGrV kEpXyh"
      >
        <div
          class="Toastify"
        />
        <div
          class="sc-ivVeuv kOEcVo"
        >
          <div
            class="sc-cCbXAZ jedupL"
          >
            <div
              class="sc-dNLxif eIcRKG"
              title="Cashtab Loading"
            />
          </div>
        </div>
      </div>
    </div>
  </body>
</html>...
    at toBeInTheDocument (/work/cashtab/src/components/Home/__tests__/Home.test.js:139:19)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: <Home /> Renders backup warning, Airdrop button, and QR Code if user loads with a new wallet that is the only created wallet ======
Error: expect(element).not.toBeInTheDocument()

expected document not to contain element, found <div class="sc-dNLxif eIcRKG" title="Cashtab Loading" /> instead

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div>
      <div
        class="sc-dTLGrV kEpXyh"
      >
        <div
          class="Toastify"
        />
        <div
          class="sc-ivVeuv kOEcVo"
        >
          <div
            class="sc-cCbXAZ jedupL"
          >
            <div
              class="sc-dNLxif eIcRKG"
              title="Cashtab Loading"
            />
          </div>
        </div>
      </div>
    </div>
  </body>
</html>...
    at toBeInTheDocument (/work/cashtab/src/components/Home/__tests__/Home.test.js:219:19)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: <Home /> Home screen suggests some ideas for using eCash if user has a non-zero balance and 3 or less txs in history ======
Error: expect(element).not.toBeInTheDocument()

expected document not to contain element, found <div class="sc-dNLxif eIcRKG" title="Cashtab Loading" /> instead

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div>
      <div
        class="sc-dTLGrV kEpXyh"
      >
        <div
          class="Toastify"
        />
        <div
          class="sc-ivVeuv kOEcVo"
        >
          <div
            class="sc-cCbXAZ jedupL"
          >
            <div
              class="sc-dNLxif eIcRKG"
              title="Cashtab Loading"
            />
          </div>
        </div>
      </div>
    </div>
  </body>
</html>...
    at toBeInTheDocument (/work/cashtab/src/components/Home/__tests__/Home.test.js:353:19)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: <Wallets /> We can rename the active wallet or a saved wallet, we can add a wallet, we can import a wallet, we can delete a wallet ======
Error: Unable to find an element with the text: New wallet "qrj4p" added to wallets. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-dTLGrV kEpXyh"
    >
      <div
        class="Toastify"
      >
        <div
          class="Toastify__toast-container Toastify__toast-container--top-right sc-chAAoq bhfztd"
        >
          <div
            class="Toastify__toast Toastify__toast-theme--light Toastify__toast--success Toastify__toast--close-on-click Toastify--animate Toastify__bounce-enter--top-right"
            data-in="true"
            id="3"
          >
            <div
              class="Toastify__toast-body"
              role="alert"
            >
              <div
                class="Toastify__toast-icon Toastify--animate-icon Toastify__zoom-enter"
              >
                <svg
                  fill="var(--toastify-icon-color-success)"
                  height="100%"
                  viewBox="0 0 24 24"
                  width="100%"
                >
                  <path
                    d="M12 0a12 12 0 1012 12A12.014 12.014 0 0012 0zm6.927 8.2l-6.845 9.289a1.011 1.011 0 01-1.43.188l-4.888-3.908a1 1 0 111.25-1.562l4.076 3.261 6.227-8.451a1 1 0 111.61 1.183z"
                  />
                </svg>
              </div>
              <div>
                "alpha" renamed to "ALPHA PRIME"
              </div>
            </div>
            <button
              aria-label="close"
              class="Toastify__close-button Toastify__close-button--light"
              type="button"
            >
              <svg
                aria-hidden="true"
                viewBox="0 0 14 16"
              >
                <path
                  d="M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z"
                  fill-rule="evenodd"
                />
              </svg>
            </button>
            <div
              class="Toastify__progress-bar--wrp"
              data-hidden="false"
            >
              <div
                class="Toastify__progress-bar--bg Toastify__progress-bar-theme--light Toastify__progress-bar--success"
              />
              <div
                aria-hidden="false"
                aria-label="notification timer"
                class="Toastify__progress-bar Toastify__progress-bar--animated Toastify__progress-bar-theme--light Toastify__progress-bar--success"
                role="progressbar"
                style="animation-duration: 5000ms; animation-play-state: paused;"
              />
            </div>
          </div>
          <div
            class="Toastify__toast Toastify__toast-theme--light Toastify__toast--success Toastify__toast--close-on-click Toastify--animate Toastify__bounce-enter--top-right"
            data-in="true"
            id="4"
          >
            <div
              class="Toastify__toast-body"
              role="alert"
            >
              <div
                class="Toastify__toast-icon Toastify--animate-icon Toastify__zoom-enter"
              >
                <svg
                  fill="var(--toastify-icon-color-success)"
                  height="100%"
                  viewBox="0 0 24 24"
                  width="100%"
                >
                  <path
                    d="M12 0a12 12 0 1012 12A12.014 12.014 0 0012 0zm6.927 8.2l-6.845 9.289a1.011 1.011 0 01-1.43.188l-4.888-3.908a1 1 0 111.25-1.562l4.076 3.261 6.227-8.451a1 1 0 111.61 1.183z"
                  />
                </svg>
              </div>
              <div>
                "Transaction Fixtures" renamed to "ACTIVE WALLET"
              </div>
            </div>
            <button
              aria-label="close"
              class="Toastify__close-button Toastify__close-button--light"
              type="button"
            >
              <svg
                aria-hidden="true"
                viewBox="0 0 14 16"
              >
                <path
                  d="M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z"
                  fill-rule="evenodd"
                />
              </svg>
            </button>
            <div
              class="Toastify__progress-bar--wrp"
              data-hidden="false"
            >
              <div
                class="Toastify__progress-bar--bg Toastify__progress-bar-theme--light Toastify__progress-bar--success"
              />
              <div
                aria-hidden="false"
                aria-label="notification timer"
                class="Toastify__progress-bar Toastify__progress-bar--animated Toastify__progress-bar-theme--light Toastify__progress-bar--success"
                role="progressbar"
                style="animation-duration: 5000ms; animation-play-state: paused;"
              />
            </div>
          </div>
          <div
            class="Toastify__toast Toastify__toast-theme--light Toastify__toast--success Toastify__toast--close-on-click Toastify--animate Toastify__bounce-enter--top-right"
            data-in="true"
            id="5"
          >
            <di...
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findByText (/work/cashtab/src/components/Wallets/__tests__/index.test.js:331:26)
====== CashTab Unit Tests: <Etokens /> Large token list is rendered and searchable ======
Error: Unable to find an element with the title: Wallet Tokens.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-dTLGrV kEpXyh"
    >
      <div
        class="Toastify"
      />
      <div
        class="sc-ivVeuv kOEcVo"
      >
        <div
          class="sc-cCbXAZ jedupL"
        >
          <div
            class="sc-dNLxif eIcRKG"
            title="Cashtab Loading"
          />
        </div>
      </div>
    </div>
  </div>
</body>
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findByTitle (/work/cashtab/src/components/Etokens/__tests__/Etokens.test.js:60:29)
====== CashTab Unit Tests: <OnBoarding /> We can create a new wallet ======
Error: Unable to find an element with the text: Backup your wallet. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-dTLGrV kEpXyh"
    >
      <div
        class="Toastify"
      />
      <div
        class="sc-ivVeuv kOEcVo"
      >
        <div
          class="sc-cCbXAZ jedupL"
        >
          <div
            class="sc-cqPOvA aesgG"
          >
            <h2>
              Welcome to Cashtab!
            </h2>
            <p
              class="sc-gNJABI ZcGXt"
            >
              Cashtab is an
               
              <a
                class="sc-yZwTr eRUmkb"
                href="https://github.com/bitcoin-abc/bitcoin-abc"
                rel="noreferrer"
                target="_blank"
              >
                open source,
              </a>
               
              non-custodial web wallet for 
              eCash
              .
            </p>
            <button
              class="sc-TOsTZ sc-cJSrbW hwIugW"
            >
              New Wallet
            </button>
            <button
              class="sc-TOsTZ sc-hmzhuo kfdflF"
            >
              Import Wallet
            </button>
          </div>
        </div>
      </div>
    </div>
  </div>
</body>
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findByText (/work/cashtab/src/components/OnBoarding/__tests__/index.test.js:70:26)
====== CashTab Unit Tests: <OnBoarding /> We can import a wallet ======
TypeError: Cannot read properties of null (reading 'length')
    at Object.length (/work/cashtab/src/components/OnBoarding/__tests__/index.test.js:144:54)
====== CashTab Unit Tests: <Token /> available actions rendered SLP1 fixed supply token ======
Error: Unable to find an element with the text: /Vespene Gas/. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-dTLGrV kEpXyh"
    >
      <div
        class="Toastify"
      />
      <div
        class="sc-ivVeuv kOEcVo"
      >
        <div
          class="sc-cCbXAZ jedupL"
        >
          <div
            class="sc-dNLxif eIcRKG"
            title="Cashtab Loading"
          />
        </div>
      </div>
    </div>
  </div>
</body>
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findAllByText (/work/cashtab/src/components/Etokens/__tests__/TokenActions.test.js:112:27)
    at Promise.then.completed (/work/cashtab/node_modules/jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (/work/cashtab/node_modules/jest-circus/build/utils.js:231:10)
    at _callCircusTest (/work/cashtab/node_modules/jest-circus/build/run.js:316:40)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at _runTest (/work/cashtab/node_modules/jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (/work/cashtab/node_modules/jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (/work/cashtab/node_modules/jest-circus/build/run.js:121:9)
    at run (/work/cashtab/node_modules/jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (/work/cashtab/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (/work/cashtab/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (/work/cashtab/node_modules/jest-runner/build/runTest.js:367:16)
    at runTest (/work/cashtab/node_modules/jest-runner/build/runTest.js:444:34)
    at Object.worker (/work/cashtab/node_modules/jest-runner/build/testWorker.js:106:12)
====== CashTab Unit Tests: <Token /> available actions rendered SLP1 variable supply token with mint baton ======
Error: Unable to find an element with the text: /Mint Send Burn/. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-dTLGrV kEpXyh"
    >
      <div
        class="Toastify"
      />
      <div
        class="sc-ivVeuv kOEcVo"
      >
        <div
          class="sc-cCbXAZ jedupL"
        >
          <div
            class="sc-dNLxif eIcRKG"
            title="Cashtab Loading"
          />
        </div>
      </div>
    </div>
  </div>
</body>
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findAllByText (/work/cashtab/src/components/Etokens/__tests__/TokenActions.test.js:170:27)
    at Promise.then.completed (/work/cashtab/node_modules/jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (/work/cashtab/node_modules/jest-circus/build/utils.js:231:10)
    at _callCircusTest (/work/cashtab/node_modules/jest-circus/build/run.js:316:40)
    at _runTest (/work/cashtab/node_modules/jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (/work/cashtab/node_modules/jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (/work/cashtab/node_modules/jest-circus/build/run.js:121:9)
    at run (/work/cashtab/node_modules/jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (/work/cashtab/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (/work/cashtab/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (/work/cashtab/node_modules/jest-runner/build/runTest.js:367:16)
    at runTest (/work/cashtab/node_modules/jest-runner/build/runTest.js:444:34)
    at Object.worker (/work/cashtab/node_modules/jest-runner/build/testWorker.js:106:12)
====== CashTab Unit Tests: <Token /> available actions rendered We can list an SLP1 fungible token ======
Error: Unable to find an element with the text: /Vespene Gas/. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-dTLGrV kEpXyh"
    >
      <div
        class="Toastify"
      />
      <div
        class="sc-ivVeuv kOEcVo"
      >
        <div
          class="sc-cCbXAZ jedupL"
        >
          <div
            class="sc-dNLxif eIcRKG"
            title="Cashtab Loading"
          />
        </div>
      </div>
    </div>
  </div>
</body>
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findAllByText (/work/cashtab/src/components/Etokens/__tests__/TokenActions.test.js:274:27)
    at Promise.then.completed (/work/cashtab/node_modules/jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (/work/cashtab/node_modules/jest-circus/build/utils.js:231:10)
    at _callCircusTest (/work/cashtab/node_modules/jest-circus/build/run.js:316:40)
    at _runTest (/work/cashtab/node_modules/jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (/work/cashtab/node_modules/jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (/work/cashtab/node_modules/jest-circus/build/run.js:121:9)
    at run (/work/cashtab/node_modules/jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (/work/cashtab/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (/work/cashtab/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (/work/cashtab/node_modules/jest-runner/build/runTest.js:367:16)
    at runTest (/work/cashtab/node_modules/jest-runner/build/runTest.js:444:34)
    at Object.worker (/work/cashtab/node_modules/jest-runner/build/testWorker.js:106:12)
====== CashTab Unit Tests: <Token /> available actions rendered We can correctly render an SLP1 NFT Parent token with no NFT Mint inputs, then create some NFT Mint inputs ======
Error: expect(element).not.toBeInTheDocument()

expected document not to contain element, found <div class="sc-dNLxif eIcRKG" title="Cashtab Loading" /> instead

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div>
      <div
        class="sc-dTLGrV kEpXyh"
      >
        <div
          class="Toastify"
        />
        <div
          class="sc-ivVeuv kOEcVo"
        >
          <div
            class="sc-cCbXAZ jedupL"
          >
            <div
              class="sc-dNLxif eIcRKG"
              title="Cashtab Loading"
            />
          </div>
        </div>
      </div>
    </div>
  </body>
</html>...
    at toBeInTheDocument (/work/cashtab/src/components/Etokens/__tests__/TokenActions.test.js:435:19)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: <Token /> available actions rendered We can correctly render an SLP1 NFT Parent token with NFT Mint inputs, then mint an NFT ======
Error: expect(element).not.toBeInTheDocument()

expected document not to contain element, found <div class="sc-dNLxif eIcRKG" title="Cashtab Loading" /> instead

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div>
      <div
        class="sc-dTLGrV kEpXyh"
      >
        <div
          class="Toastify"
        />
        <div
          class="sc-ivVeuv kOEcVo"
        >
          <div
            class="sc-cCbXAZ jedupL"
          >
            <div
              class="sc-dNLxif eIcRKG"
              title="Cashtab Loading"
            />
          </div>
        </div>
      </div>
    </div>
  </body>
</html>...
    at toBeInTheDocument (/work/cashtab/src/components/Etokens/__tests__/TokenActions.test.js:584:19)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: <Token /> available actions rendered We can render an SLP1 NFT Parent token with a minted NFT in its collection ======
Error: expect(element).not.toBeInTheDocument()

expected document not to contain element, found <div class="sc-dNLxif eIcRKG" title="Cashtab Loading" /> instead

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div>
      <div
        class="sc-dTLGrV kEpXyh"
      >
        <div
          class="Toastify"
        />
        <div
          class="sc-ivVeuv kOEcVo"
        >
          <div
            class="sc-cCbXAZ jedupL"
          >
            <div
              class="sc-dNLxif eIcRKG"
              title="Cashtab Loading"
            />
          </div>
        </div>
      </div>
    </div>
  </body>
</html>...
    at toBeInTheDocument (/work/cashtab/src/components/Etokens/__tests__/TokenActions.test.js:751:19)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: <Token /> available actions rendered We can list an SLP1 NFT ======
Error: Unable to find an element with the text: /Gordon Chen/. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-dTLGrV kEpXyh"
    >
      <div
        class="Toastify"
      />
      <div
        class="sc-ivVeuv kOEcVo"
      >
        <div
          class="sc-cCbXAZ jedupL"
        >
          <div
            class="sc-dNLxif eIcRKG"
            title="Cashtab Loading"
          />
        </div>
      </div>
    </div>
  </div>
</body>
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findAllByText (/work/cashtab/src/components/Etokens/__tests__/TokenActions.test.js:888:27)
    at Promise.then.completed (/work/cashtab/node_modules/jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (/work/cashtab/node_modules/jest-circus/build/utils.js:231:10)
    at _callCircusTest (/work/cashtab/node_modules/jest-circus/build/run.js:316:40)
    at _runTest (/work/cashtab/node_modules/jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (/work/cashtab/node_modules/jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (/work/cashtab/node_modules/jest-circus/build/run.js:121:9)
    at run (/work/cashtab/node_modules/jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (/work/cashtab/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (/work/cashtab/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (/work/cashtab/node_modules/jest-runner/build/runTest.js:367:16)
    at runTest (/work/cashtab/node_modules/jest-runner/build/runTest.js:444:34)
    at Object.worker (/work/cashtab/node_modules/jest-runner/build/testWorker.js:106:12)
====== CashTab Unit Tests: <Token /> available actions rendered We can send an SLP1 NFT ======
Error: Unable to find an element with the text: /Gordon Chen/. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-dTLGrV kEpXyh"
    >
      <div
        class="Toastify"
      />
      <div
        class="sc-ivVeuv kOEcVo"
      >
        <div
          class="sc-cCbXAZ jedupL"
        >
          <div
            class="sc-dNLxif eIcRKG"
            title="Cashtab Loading"
          />
        </div>
      </div>
    </div>
  </div>
</body>
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findAllByText (/work/cashtab/src/components/Etokens/__tests__/TokenActions.test.js:1039:27)
    at Promise.then.completed (/work/cashtab/node_modules/jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (/work/cashtab/node_modules/jest-circus/build/utils.js:231:10)
    at _callCircusTest (/work/cashtab/node_modules/jest-circus/build/run.js:316:40)
    at _runTest (/work/cashtab/node_modules/jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (/work/cashtab/node_modules/jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (/work/cashtab/node_modules/jest-circus/build/run.js:121:9)
    at run (/work/cashtab/node_modules/jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (/work/cashtab/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (/work/cashtab/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (/work/cashtab/node_modules/jest-runner/build/runTest.js:367:16)
    at runTest (/work/cashtab/node_modules/jest-runner/build/runTest.js:444:34)
    at Object.worker (/work/cashtab/node_modules/jest-runner/build/testWorker.js:106:12)
====== CashTab Unit Tests: <Token /> available actions rendered SLP1 NFT page will update cashtab token cache for the NFT if it does not include groupTokenId, and for its parent if it is not in cache ======
Error: Unable to find an element with the text: /Gordon Chen/. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-dTLGrV kEpXyh"
    >
      <div
        class="Toastify"
      />
      <div
        class="sc-ivVeuv kOEcVo"
      >
        <div
          class="sc-cCbXAZ jedupL"
        >
          <div
            class="sc-dNLxif eIcRKG"
            title="Cashtab Loading"
          />
        </div>
      </div>
    </div>
  </div>
</body>
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findAllByText (/work/cashtab/src/components/Etokens/__tests__/TokenActions.test.js:1168:27)
====== CashTab Unit Tests: <Token /> available actions rendered We show an agora query error if we cannot get active offers for an NFT token id ======
Error: Unable to find an element with the text: /Larry Kelley/. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-dTLGrV kEpXyh"
    >
      <div
        class="Toastify"
      />
      <div
        class="sc-ivVeuv kOEcVo"
      >
        <div
          class="sc-cCbXAZ jedupL"
        >
          <div
            class="sc-dNLxif eIcRKG"
            title="Cashtab Loading"
          />
        </div>
      </div>
    </div>
  </div>
</body>
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findAllByText (/work/cashtab/src/components/Etokens/__tests__/TokenActions.test.js:1254:27)
    at Promise.then.completed (/work/cashtab/node_modules/jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (/work/cashtab/node_modules/jest-circus/build/utils.js:231:10)
    at _callCircusTest (/work/cashtab/node_modules/jest-circus/build/run.js:316:40)
    at _runTest (/work/cashtab/node_modules/jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (/work/cashtab/node_modules/jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (/work/cashtab/node_modules/jest-circus/build/run.js:121:9)
    at run (/work/cashtab/node_modules/jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (/work/cashtab/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (/work/cashtab/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (/work/cashtab/node_modules/jest-runner/build/runTest.js:367:16)
    at runTest (/work/cashtab/node_modules/jest-runner/build/runTest.js:444:34)
    at Object.worker (/work/cashtab/node_modules/jest-runner/build/testWorker.js:106:12)
====== CashTab Unit Tests: <Token /> available actions rendered We show an agora oneshot listing for an SLP1 NFT if it is for sale ======
Error: Unable to find an element with the text: /Larry Kelley/. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-dTLGrV kEpXyh"
    >
      <div
        class="Toastify"
      />
      <div
        class="sc-ivVeuv kOEcVo"
      >
        <div
          class="sc-cCbXAZ jedupL"
        >
          <div
            class="sc-dNLxif eIcRKG"
            title="Cashtab Loading"
          />
        </div>
      </div>
    </div>
  </div>
</body>
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findAllByText (/work/cashtab/src/components/Etokens/__tests__/TokenActions.test.js:1305:27)
    at Promise.then.completed (/work/cashtab/node_modules/jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (/work/cashtab/node_modules/jest-circus/build/utils.js:231:10)
    at _callCircusTest (/work/cashtab/node_modules/jest-circus/build/run.js:316:40)
    at _runTest (/work/cashtab/node_modules/jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (/work/cashtab/node_modules/jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (/work/cashtab/node_modules/jest-circus/build/run.js:121:9)
    at run (/work/cashtab/node_modules/jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (/work/cashtab/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (/work/cashtab/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (/work/cashtab/node_modules/jest-runner/build/runTest.js:367:16)
    at runTest (/work/cashtab/node_modules/jest-runner/build/runTest.js:444:34)
    at Object.worker (/work/cashtab/node_modules/jest-runner/build/testWorker.js:106:12)
====== CashTab Unit Tests: <Token /> available actions rendered ALP token ======
Error: Unable to find an element with the text: /Test CRD/. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-dTLGrV kEpXyh"
    >
      <div
        class="Toastify"
      />
      <div
        class="sc-ivVeuv kOEcVo"
      >
        <div
          class="sc-cCbXAZ jedupL"
        >
          <div
            class="sc-dNLxif eIcRKG"
            title="Cashtab Loading"
          />
        </div>
      </div>
    </div>
  </div>
</body>
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findAllByText (/work/cashtab/src/components/Etokens/__tests__/TokenActions.test.js:1326:27)
    at Promise.then.completed (/work/cashtab/node_modules/jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (/work/cashtab/node_modules/jest-circus/build/utils.js:231:10)
    at _callCircusTest (/work/cashtab/node_modules/jest-circus/build/run.js:316:40)
    at _runTest (/work/cashtab/node_modules/jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (/work/cashtab/node_modules/jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (/work/cashtab/node_modules/jest-circus/build/run.js:121:9)
    at run (/work/cashtab/node_modules/jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (/work/cashtab/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (/work/cashtab/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (/work/cashtab/node_modules/jest-runner/build/runTest.js:367:16)
    at runTest (/work/cashtab/node_modules/jest-runner/build/runTest.js:444:34)
    at Object.worker (/work/cashtab/node_modules/jest-runner/build/testWorker.js:106:12)
====== CashTab Unit Tests: <Agora /> Screen loads as expected if there are no agora partial listings ======
Error: expect(element).not.toBeInTheDocument()

expected document not to contain element, found <div class="sc-dNLxif eIcRKG" title="Cashtab Loading" /> instead

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div>
      <div
        class="sc-dTLGrV kEpXyh"
      >
        <div
          class="Toastify"
        />
        <div
          class="sc-ivVeuv kOEcVo"
        >
          <div
            class="sc-cCbXAZ jedupL"
          >
            <div
              class="sc-dNLxif eIcRKG"
              title="Cashtab Loading"
            />
          </div>
        </div>
      </div>
    </div>
  </body>
</html>...
    at toBeInTheDocument (/work/cashtab/src/components/Agora/__tests__/index.test.js:126:19)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: <Agora /> A chronik error notice is rendered if there is some error in querying listings ======
Error: expect(element).not.toBeInTheDocument()

expected document not to contain element, found <div class="sc-dNLxif eIcRKG" title="Cashtab Loading" /> instead

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div>
      <div
        class="sc-dTLGrV kEpXyh"
      >
        <div
          class="Toastify"
        />
        <div
          class="sc-ivVeuv kOEcVo"
        >
          <div
            class="sc-cCbXAZ jedupL"
          >
            <div
              class="sc-dNLxif eIcRKG"
              title="Cashtab Loading"
            />
          </div>
        </div>
      </div>
    </div>
  </body>
</html>...
    at toBeInTheDocument (/work/cashtab/src/components/Agora/__tests__/index.test.js:184:19)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: <Agora /> We can see a rendered offer ======
Error: expect(element).not.toBeInTheDocument()

expected document not to contain element, found <div class="sc-dNLxif eIcRKG" title="Cashtab Loading" /> instead

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div>
      <div
        class="sc-dTLGrV kEpXyh"
      >
        <div
          class="Toastify"
        />
        <div
          class="sc-ivVeuv kOEcVo"
        >
          <div
            class="sc-cCbXAZ jedupL"
          >
            <div
              class="sc-dNLxif eIcRKG"
              title="Cashtab Loading"
            />
          </div>
        </div>
      </div>
    </div>
  </body>
</html>...
    at toBeInTheDocument (/work/cashtab/src/components/Agora/__tests__/index.test.js:231:19)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: <Agora /> We can fetch and use the blacklist from token server ======
Error: expect(element).not.toBeInTheDocument()

expected document not to contain element, found <div class="sc-dNLxif eIcRKG" title="Cashtab Loading" /> instead

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div>
      <div
        class="sc-dTLGrV kEpXyh"
      >
        <div
          class="Toastify"
        />
        <div
          class="sc-ivVeuv kOEcVo"
        >
          <div
            class="sc-cCbXAZ jedupL"
          >
            <div
              class="sc-dNLxif eIcRKG"
              title="Cashtab Loading"
            />
          </div>
        </div>
      </div>
    </div>
  </body>
</html>...
    at toBeInTheDocument (/work/cashtab/src/components/Agora/__tests__/index.test.js:289:19)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: <Agora /> On token server API fail, we fall back to locally maintained blacklist. A blacklisted offer does not render in all offers, but will render in My offers ======
Error: expect(element).not.toBeInTheDocument()

expected document not to contain element, found <div class="sc-dNLxif eIcRKG" title="Cashtab Loading" /> instead

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div>
      <div
        class="sc-dTLGrV kEpXyh"
      >
        <div
          class="Toastify"
        />
        <div
          class="sc-ivVeuv kOEcVo"
        >
          <div
            class="sc-cCbXAZ jedupL"
          >
            <div
              class="sc-dNLxif eIcRKG"
              title="Cashtab Loading"
            />
          </div>
        </div>
      </div>
    </div>
  </body>
</html>...
    at toBeInTheDocument (/work/cashtab/src/components/Agora/__tests__/index.test.js:360:19)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: <Agora /> We can buy an offer ======
Error: expect(element).not.toBeInTheDocument()

expected document not to contain element, found <div class="sc-dNLxif eIcRKG" title="Cashtab Loading" /> instead

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div>
      <div
        class="sc-dTLGrV kEpXyh"
      >
        <div
          class="Toastify"
        />
        <div
          class="sc-ivVeuv kOEcVo"
        >
          <div
            class="sc-cCbXAZ jedupL"
          >
            <div
              class="sc-dNLxif eIcRKG"
              title="Cashtab Loading"
            />
          </div>
        </div>
      </div>
    </div>
  </body>
</html>...
    at toBeInTheDocument (/work/cashtab/src/components/Agora/__tests__/index.test.js:747:19)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)
====== CashTab Unit Tests: <Agora /> We get expected error if we try to buy an offer we cannot afford ======
Error: expect(element).not.toBeInTheDocument()

expected document not to contain element, found <div class="sc-dNLxif eIcRKG" title="Cashtab Loading" /> instead

Ignored nodes: comments, script, style
<html>
  <head />
  <body>
    <div>
      <div
        class="sc-dTLGrV kEpXyh"
      >
        <div
          class="Toastify"
        />
        <div
          class="sc-ivVeuv kOEcVo"
        >
          <div
            class="sc-cCbXAZ jedupL"
          >
            <div
              class="sc-dNLxif eIcRKG"
              title="Cashtab Loading"
            />
          </div>
        </div>
      </div>
    </div>
  </body>
</html>...
    at toBeInTheDocument (/work/cashtab/src/components/Agora/__tests__/index.test.js:904:19)
    at runWithExpensiveErrorDiagnosticsDisabled (/work/cashtab/node_modules/@testing-library/dom/dist/config.js:47:12)
    at checkCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:124:77)
    at checkRealTimersCallback (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:118:16)
    at Timeout.task [as _onTimeout] (/work/cashtab/node_modules/jsdom/lib/jsdom/browser/Window.js:520:19)
    at listOnTimeout (node:internal/timers:581:17)
    at processTimers (node:internal/timers:519:7)

Each failure log is accessible here:
CashTab Unit Tests: Cashtab wallet methods Creates a wallet from valid bip39 mnemonic createCashtabWallet: Creates a Cashtab wallet from a valid bip39 mnemonic
CashTab Unit Tests: useWallet hook rendering in different localforage states XEC price is set in state on successful API fetch
CashTab Unit Tests: useWallet hook rendering in different localforage states XEC price remains null in state on API error
CashTab Unit Tests: useWallet hook rendering in different localforage states XEC price is set in state to fiat currency of user settings on successful API fetch
CashTab Unit Tests: useWallet hook rendering in different localforage states Cashtab loads wallet, settings, cache, and contactlist from localforage to context if they are present
CashTab Unit Tests: useWallet hook rendering in different localforage states processChronikWsMsg() refreshes alias prices when aliasPrices is null
CashTab Unit Tests: useWallet hook rendering in different localforage states processChronikWsMsg() refreshes alias prices when aliasPrices exists, server and cashtab prices array length do not match
CashTab Unit Tests: useWallet hook rendering in different localforage states processChronikWsMsg() does not refresh alias prices when aliasPrices exists, server and cashtab array length do match
[[https://build.bitcoinabc.org/viewLog.html?tab=buildLog&logTab=tree&filter=debug&expand=all&buildId=855620&_focus=855620&guest=1 | CashTab Unit Tests: useWallet hook rendering in different localforage states Verify a processChronikWsMsg() new block event updates the aliasServerError state var upon a /prices/ endpoint error]]
[[https://build.bitcoinabc.org/viewLog.html?tab=buildLog&logTab=tree&filter=debug&expand=all&buildId=855620&_focus=855620&guest=1 | CashTab Unit Tests: useWallet hook rendering in different localforage states Verify refreshAliases() updates the aliases state variable on a successful /address/ endpoint response]]
[[https://build.bitcoinabc.org/viewLog.html?tab=buildLog&logTab=tree&filter=debug&expand=all&buildId=855620&_focus=855620&guest=1 | CashTab Unit Tests: useWallet hook rendering in different localforage states Verify refreshAliases() updates the aliasServerError state variable upon an /address/ endpoint error]]
CashTab Unit Tests: useWallet hook rendering in different localforage states An incoming tx message from the websocket causes the wallet to update
CashTab Unit Tests: <Home /> Renders backup warning, token rewards button, and QR Code if user loads with a new wallet that is not the only wallet
CashTab Unit Tests: <Home /> Renders backup warning, Airdrop button, and QR Code if user loads with a new wallet that is the only created wallet
CashTab Unit Tests: <Home /> Home screen suggests some ideas for using eCash if user has a non-zero balance and 3 or less txs in history
CashTab Unit Tests: <Wallets /> We can rename the active wallet or a saved wallet, we can add a wallet, we can import a wallet, we can delete a wallet
CashTab Unit Tests: <Etokens /> Large token list is rendered and searchable
CashTab Unit Tests: <OnBoarding /> We can create a new wallet
CashTab Unit Tests: <OnBoarding /> We can import a wallet
CashTab Unit Tests: <Token /> available actions rendered SLP1 fixed supply token
CashTab Unit Tests: <Token /> available actions rendered SLP1 variable supply token with mint baton
CashTab Unit Tests: <Token /> available actions rendered We can list an SLP1 fungible token
CashTab Unit Tests: <Token /> available actions rendered We can correctly render an SLP1 NFT Parent token with no NFT Mint inputs, then create some NFT Mint inputs
CashTab Unit Tests: <Token /> available actions rendered We can correctly render an SLP1 NFT Parent token with NFT Mint inputs, then mint an NFT
CashTab Unit Tests: <Token /> available actions rendered We can render an SLP1 NFT Parent token with a minted NFT in its collection
CashTab Unit Tests: <Token /> available actions rendered We can list an SLP1 NFT
CashTab Unit Tests: <Token /> available actions rendered We can send an SLP1 NFT
CashTab Unit Tests: <Token /> available actions rendered SLP1 NFT page will update cashtab token cache for the NFT if it does not include groupTokenId, and for its parent if it is not in cache
CashTab Unit Tests: <Token /> available actions rendered We show an agora query error if we cannot get active offers for an NFT token id
CashTab Unit Tests: <Token /> available actions rendered We show an agora oneshot listing for an SLP1 NFT if it is for sale
CashTab Unit Tests: <Token /> available actions rendered ALP token
CashTab Unit Tests: <Agora /> Screen loads as expected if there are no agora partial listings
CashTab Unit Tests: <Agora /> A chronik error notice is rendered if there is some error in querying listings
CashTab Unit Tests: <Agora /> We can see a rendered offer
CashTab Unit Tests: <Agora /> We can fetch and use the blacklist from token server
CashTab Unit Tests: <Agora /> On token server API fail, we fall back to locally maintained blacklist. A blacklisted offer does not render in all offers, but will render in My offers
CashTab Unit Tests: <Agora /> We can buy an offer
CashTab Unit Tests: <Agora /> We get expected error if we try to buy an offer we cannot afford

update storage json prep methods, update wallets used in tests, add ecc where needed in tests

remove deb logs from useWallet hook

bytesofman edited the summary of this revision. (Show Details)
emack requested changes to this revision.Thu, Nov 21, 23:53
emack added a subscriber: emack.
emack added inline comments.
cashtab/src/wallet/index.ts
235 ↗(On Diff #51023)

is this necessary? Looks like a test log to verify they're all using the same ecc from context

306 ↗(On Diff #51023)
This revision now requires changes to proceed.Thu, Nov 21, 23:53
bytesofman added inline comments.
cashtab/src/wallet/index.ts
235 ↗(On Diff #51023)

good catch this is a debug log, removed

bytesofman marked an inline comment as done.
bytesofman edited the summary of this revision. (Show Details)

remove debug logs

This revision is now accepted and ready to land.Fri, Nov 22, 09:34