Page MenuHomePhabricator

[mock-chronik-client] implement ts
Needs ReviewPublic

Authored by bytesofman on Tue, Dec 10, 06:20.

Details

Reviewers
emack
Group Reviewers
Restricted Project
Summary

Need TS to keep up with Agora and Chronik methods

Ended up being more involved than I originally planned.

I've been putting this off because I wasn't sure how useful this lib would be. But, it's become insdispensable for any app that uses ChronikClient and is can't or won't support integrated regtest.

This is a breaking change. CI confirms that everything it breaks in the monorepo is fixed.

This module is much more effective and useful for tests now.

Test Plan

npm test, npm run build

Event Timeline

Tail of the build log:

1 high severity vulnerability

To address all issues, run:
  npm audit fix

Run `npm audit` for details.
CI not configured to test build.

> mock-chronik-client@1.12.3 test
> mocha --reporter mocha-junit-reporter --reporter-options mochaFile=test_results/mock-chronik-client-junit.xml --reporter-options testsuitesTitle=Mock Chronik Client Unit Tests --reporter-options rootSuiteTitle=Mock Chronik Client


/work/modules/mock-chronik-client/index.ts:5
import*as cashaddr from'ecashaddrjs';const CHRONIK_DEFAULT_PAGESIZE=(cov_1vkmpecvo1().s[0]++,25);// TODO interfaces, types, lint, etc
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at wrapSafe (node:internal/modules/cjs/loader:1378:20)
    at Module._compile (node:internal/modules/cjs/loader:1428:41)
    at Module.replacementCompile (/usr/lib/node_modules/nyc/node_modules/append-transform/index.js:60:13)
    at module.exports (/usr/lib/node_modules/nyc/node_modules/default-require-extensions/js.js:7:9)
    at Object.<anonymous> (/usr/lib/node_modules/nyc/node_modules/append-transform/index.js:64:4)
    at Module.load (node:internal/modules/cjs/loader:1288:32)
    at Module._load (node:internal/modules/cjs/loader:1104:12)
    at Module.require (node:internal/modules/cjs/loader:1311:19)
    at require (node:internal/modules/helpers:179:18)
    at Object.<anonymous> (/work/modules/mock-chronik-client/test/index.test.js:7:42)
    at Module._compile (node:internal/modules/cjs/loader:1469:14)
    at Module.replacementCompile (/usr/lib/node_modules/nyc/node_modules/append-transform/index.js:60:13)
    at Module._extensions..js (node:internal/modules/cjs/loader:1548:10)
    at Object.<anonymous> (/usr/lib/node_modules/nyc/node_modules/append-transform/index.js:64:4)
    at Module.load (node:internal/modules/cjs/loader:1288:32)
    at Module._load (node:internal/modules/cjs/loader:1104:12)
    at cjsLoader (node:internal/modules/esm/translators:346:17)
    at ModuleWrap.<anonymous> (node:internal/modules/esm/translators:286:7)
    at ModuleJob.run (node:internal/modules/esm/module_job:234:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:473:24)
    at async formattedImport (/work/modules/mock-chronik-client/node_modules/mocha/lib/nodejs/esm-utils.js:9:14)
    at async exports.requireOrImport (/work/modules/mock-chronik-client/node_modules/mocha/lib/nodejs/esm-utils.js:42:28)
    at async exports.loadFilesAsync (/work/modules/mock-chronik-client/node_modules/mocha/lib/nodejs/esm-utils.js:100:20)
    at async singleRun (/work/modules/mock-chronik-client/node_modules/mocha/lib/cli/run-helpers.js:125:3)
    at async exports.handler (/work/modules/mock-chronik-client/node_modules/mocha/lib/cli/run.js:370:5)
----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |       0 |        0 |       0 |       0 |                   
----------|---------|----------|---------|---------|-------------------

##teamcity[blockOpened name='Code Coverage Summary']
##teamcity[buildStatisticValue key='CodeCoverageAbsBCovered' value='0']
##teamcity[buildStatisticValue key='CodeCoverageAbsBTotal' value='0']
##teamcity[buildStatisticValue key='CodeCoverageAbsRCovered' value='0']
##teamcity[buildStatisticValue key='CodeCoverageAbsRTotal' value='0']
##teamcity[buildStatisticValue key='CodeCoverageAbsMCovered' value='0']
##teamcity[buildStatisticValue key='CodeCoverageAbsMTotal' value='0']
##teamcity[buildStatisticValue key='CodeCoverageAbsLCovered' value='0']
##teamcity[buildStatisticValue key='CodeCoverageAbsLTotal' value='0']
##teamcity[blockClosed name='Code Coverage Summary']
mv: cannot stat 'test_results/mock-chronik-client-junit.xml': No such file or directory
Build mock-chronik-client-tests failed with exit code 1

Tail of the build log:

test/chronik.test.ts(191,17): error TS2345: Argument of type 'MockChronikClient' is not assignable to parameter of type 'ChronikClient'.
  Type 'MockChronikClient' is missing the following properties from type 'ChronikClient': _proxyInterface, proxyInterface, broadcastTx, broadcastTxs, and 14 more.
test/chronik.test.ts(207,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(223,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(230,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(235,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(242,17): error TS2345: Argument of type 'MockChronikClient' is not assignable to parameter of type 'ChronikClient'.
  Type 'MockChronikClient' is missing the following properties from type 'ChronikClient': _proxyInterface, proxyInterface, broadcastTx, broadcastTxs, and 14 more.
test/chronik.test.ts(258,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(274,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(280,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(287,17): error TS2345: Argument of type 'MockChronikClient' is not assignable to parameter of type 'ChronikClient'.
  Type 'MockChronikClient' is missing the following properties from type 'ChronikClient': _proxyInterface, proxyInterface, broadcastTx, broadcastTxs, and 14 more.
test/chronik.test.ts(303,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(319,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(326,27): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(335,21): error TS2345: Argument of type 'MockChronikClient' is not assignable to parameter of type 'ChronikClient'.
  Type 'MockChronikClient' is missing the following properties from type 'ChronikClient': _proxyInterface, proxyInterface, broadcastTx, broadcastTxs, and 14 more.
test/chronik.test.ts(352,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(368,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(375,27): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(384,21): error TS2345: Argument of type 'MockChronikClient' is not assignable to parameter of type 'ChronikClient'.
  Type 'MockChronikClient' is missing the following properties from type 'ChronikClient': _proxyInterface, proxyInterface, broadcastTx, broadcastTxs, and 14 more.

    at createTSError (/work/apps/ecash-herald/node_modules/ts-node/src/index.ts:859:12)
    at reportTSError (/work/apps/ecash-herald/node_modules/ts-node/src/index.ts:863:19)
    at getOutput (/work/apps/ecash-herald/node_modules/ts-node/src/index.ts:1077:36)
    at Object.compile (/work/apps/ecash-herald/node_modules/ts-node/src/index.ts:1433:41)
    at Module.m._compile (/work/apps/ecash-herald/node_modules/ts-node/src/index.ts:1617:30)
    at module.exports (/usr/lib/node_modules/nyc/node_modules/default-require-extensions/js.js:7:9)
    at /usr/lib/node_modules/nyc/node_modules/append-transform/index.js:64:4
    at require.extensions.<computed> (/work/apps/ecash-herald/node_modules/ts-node/src/index.ts:1621:12)
    at Object.<anonymous> (/usr/lib/node_modules/nyc/node_modules/append-transform/index.js:64:4)
    at Module.load (node:internal/modules/cjs/loader:1288:32)
    at Function.Module._load (node:internal/modules/cjs/loader:1104:12)
    at Module.require (node:internal/modules/cjs/loader:1311:19)
    at require (node:internal/modules/helpers:179:18)
    at Object.exports.requireOrImport (/work/apps/ecash-herald/node_modules/mocha/lib/nodejs/esm-utils.js:53:16)
    at async Object.exports.loadFilesAsync (/work/apps/ecash-herald/node_modules/mocha/lib/nodejs/esm-utils.js:100:20)
    at async singleRun (/work/apps/ecash-herald/node_modules/mocha/lib/cli/run-helpers.js:125:3)
    at async Object.exports.handler (/work/apps/ecash-herald/node_modules/mocha/lib/cli/run.js:370:5)
----------------|---------|----------|---------|---------|-------------------
File            | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------------|---------|----------|---------|---------|-------------------
All files       |      80 |       50 |     100 |      80 |                   
 prepSecrets.ts |      80 |       50 |     100 |      80 | 15                
----------------|---------|----------|---------|---------|-------------------

##teamcity[blockOpened name='Code Coverage Summary']
##teamcity[buildStatisticValue key='CodeCoverageAbsBCovered' value='4']
##teamcity[buildStatisticValue key='CodeCoverageAbsBTotal' value='5']
##teamcity[buildStatisticValue key='CodeCoverageAbsRCovered' value='1']
##teamcity[buildStatisticValue key='CodeCoverageAbsRTotal' value='2']
##teamcity[buildStatisticValue key='CodeCoverageAbsMCovered' value='0']
##teamcity[buildStatisticValue key='CodeCoverageAbsMTotal' value='0']
##teamcity[buildStatisticValue key='CodeCoverageAbsLCovered' value='4']
##teamcity[buildStatisticValue key='CodeCoverageAbsLTotal' value='5']
##teamcity[blockClosed name='Code Coverage Summary']
mv: cannot stat 'test_results/ecash-herald-junit.xml': No such file or directory
Build ecash-herald-tests failed with exit code 1

Tail of the build log:

secrets.ts does not exist, copying secrets.sample.ts...

> token-server@0.0.0 build
> tsc -p ./tsconfig.build.json


> token-server@0.0.0 pretest
> ts-node scripts/prepSecrets.ts

secrets.ts exists, proceeding to build...

> token-server@0.0.0 test
> mocha --reporter mocha-junit-reporter --reporter-options mochaFile=test_results/token-server-junit.xml --reporter-options testsuitesTitle=Token Server Unit Tests --reporter-options rootSuiteTitle=Token Server


TSError: ⨯ Unable to compile TypeScript:
src/chronik/clientHandler.test.ts(26,27): error TS2339: Property 'setAddress' does not exist on type 'MockChronikClient'.
src/chronik/clientHandler.test.ts(27,27): error TS2339: Property 'setTxHistoryByAddress' does not exist on type 'MockChronikClient'.
src/chronik/clientHandler.test.ts(31,25): error TS2345: Argument of type 'MockChronikClient' is not assignable to parameter of type 'ChronikClient'.
  Type 'MockChronikClient' is missing the following properties from type 'ChronikClient': _proxyInterface, proxyInterface, broadcastTx, broadcastTxs, and 14 more.
src/chronik/clientHandler.test.ts(47,27): error TS2339: Property 'setAddress' does not exist on type 'MockChronikClient'.
src/chronik/clientHandler.test.ts(48,27): error TS2339: Property 'setTxHistoryByAddress' does not exist on type 'MockChronikClient'.
src/chronik/clientHandler.test.ts(53,25): error TS2345: Argument of type 'MockChronikClient' is not assignable to parameter of type 'ChronikClient'.

    at createTSError (/work/apps/token-server/node_modules/ts-node/src/index.ts:859:12)
    at reportTSError (/work/apps/token-server/node_modules/ts-node/src/index.ts:863:19)
    at getOutput (/work/apps/token-server/node_modules/ts-node/src/index.ts:1077:36)
    at Object.compile (/work/apps/token-server/node_modules/ts-node/src/index.ts:1433:41)
    at Module.m._compile (/work/apps/token-server/node_modules/ts-node/src/index.ts:1617:30)
    at module.exports (/usr/lib/node_modules/nyc/node_modules/default-require-extensions/js.js:7:9)
    at /usr/lib/node_modules/nyc/node_modules/append-transform/index.js:64:4
    at require.extensions.<computed> (/work/apps/token-server/node_modules/ts-node/src/index.ts:1621:12)
    at Object.<anonymous> (/usr/lib/node_modules/nyc/node_modules/append-transform/index.js:64:4)
    at Module.load (node:internal/modules/cjs/loader:1288:32)
    at Function.Module._load (node:internal/modules/cjs/loader:1104:12)
    at Module.require (node:internal/modules/cjs/loader:1311:19)
    at require (node:internal/modules/helpers:179:18)
    at Object.exports.requireOrImport (/work/apps/token-server/node_modules/mocha/lib/nodejs/esm-utils.js:53:16)
    at async Object.exports.loadFilesAsync (/work/apps/token-server/node_modules/mocha/lib/nodejs/esm-utils.js:100:20)
    at async singleRun (/work/apps/token-server/node_modules/mocha/lib/cli/run-helpers.js:125:3)
    at async Object.exports.handler (/work/apps/token-server/node_modules/mocha/lib/cli/run.js:370:5)
----------------|---------|----------|---------|---------|-------------------
File            | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------------|---------|----------|---------|---------|-------------------
All files       |      60 |       50 |     100 |      60 |                   
 prepSecrets.ts |      60 |       50 |     100 |      60 | 17-18             
----------------|---------|----------|---------|---------|-------------------

##teamcity[blockOpened name='Code Coverage Summary']
##teamcity[buildStatisticValue key='CodeCoverageAbsBCovered' value='3']
##teamcity[buildStatisticValue key='CodeCoverageAbsBTotal' value='5']
##teamcity[buildStatisticValue key='CodeCoverageAbsRCovered' value='1']
##teamcity[buildStatisticValue key='CodeCoverageAbsRTotal' value='2']
##teamcity[buildStatisticValue key='CodeCoverageAbsMCovered' value='0']
##teamcity[buildStatisticValue key='CodeCoverageAbsMTotal' value='0']
##teamcity[buildStatisticValue key='CodeCoverageAbsLCovered' value='3']
##teamcity[buildStatisticValue key='CodeCoverageAbsLTotal' value='5']
##teamcity[blockClosed name='Code Coverage Summary']
mv: cannot stat 'test_results/token-server-junit.xml': No such file or directory
Build token-server-tests failed with exit code 1

Tail of the build log:


/work/modules/mock-chronik-client/index.ts:4
import * as cashaddr from 'ecashaddrjs';
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at wrapSafe (node:internal/modules/cjs/loader:1378:20)
    at Module._compile (node:internal/modules/cjs/loader:1428:41)
    at Module.replacementCompile (/usr/lib/node_modules/nyc/node_modules/append-transform/index.js:60:13)
    at module.exports (/usr/lib/node_modules/nyc/node_modules/default-require-extensions/js.js:7:9)
    at Object.<anonymous> (/usr/lib/node_modules/nyc/node_modules/append-transform/index.js:64:4)
    at Module.load (node:internal/modules/cjs/loader:1288:32)
    at Module._load (node:internal/modules/cjs/loader:1104:12)
    at Module.require (node:internal/modules/cjs/loader:1311:19)
    at require (node:internal/modules/helpers:179:18)
    at Object.<anonymous> (/work/apps/alias-server/test/chronik.test.js:16:31)
    at Module._compile (node:internal/modules/cjs/loader:1469:14)
    at Module.replacementCompile (/usr/lib/node_modules/nyc/node_modules/append-transform/index.js:60:13)
    at Module._extensions..js (node:internal/modules/cjs/loader:1548:10)
    at Object.<anonymous> (/usr/lib/node_modules/nyc/node_modules/append-transform/index.js:64:4)
    at Module.load (node:internal/modules/cjs/loader:1288:32)
    at Module._load (node:internal/modules/cjs/loader:1104:12)
    at cjsLoader (node:internal/modules/esm/translators:346:17)
    at ModuleWrap.<anonymous> (node:internal/modules/esm/translators:286:7)
    at ModuleJob.run (node:internal/modules/esm/module_job:234:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:473:24)
    at async formattedImport (/work/apps/alias-server/node_modules/mocha/lib/nodejs/esm-utils.js:9:14)
    at async exports.requireOrImport (/work/apps/alias-server/node_modules/mocha/lib/nodejs/esm-utils.js:42:28)
    at async exports.loadFilesAsync (/work/apps/alias-server/node_modules/mocha/lib/nodejs/esm-utils.js:100:20)
    at async singleRun (/work/apps/alias-server/node_modules/mocha/lib/cli/run-helpers.js:125:3)
    at async exports.handler (/work/apps/alias-server/node_modules/mocha/lib/cli/run.js:370:5)
------------------------|---------|----------|---------|---------|-------------------
File                    | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
------------------------|---------|----------|---------|---------|-------------------
All files               |    7.81 |        0 |       0 |    8.01 |                   
 alias-server           |     100 |      100 |     100 |     100 |                   
  config.js             |     100 |      100 |     100 |     100 |                   
 alias-server/constants |     100 |      100 |     100 |     100 |                   
  alias.js              |     100 |      100 |     100 |     100 |                   
 alias-server/src       |    7.31 |        0 |       0 |     7.5 |                   
  alias.js              |    5.88 |        0 |       0 |    6.06 | 23-369            
  app.js                |   16.66 |        0 |       0 |   16.66 | 23-183            
  chronik.js            |    4.47 |        0 |       0 |    4.76 | 12-196            
  db.js                 |    6.09 |        0 |       0 |    6.09 | 17-308            
  utils.js              |    5.17 |        0 |       0 |    5.35 | 12-157            
------------------------|---------|----------|---------|---------|-------------------

##teamcity[blockOpened name='Code Coverage Summary']
##teamcity[buildStatisticValue key='CodeCoverageAbsBCovered' value='29']
##teamcity[buildStatisticValue key='CodeCoverageAbsBTotal' value='371']
##teamcity[buildStatisticValue key='CodeCoverageAbsRCovered' value='0']
##teamcity[buildStatisticValue key='CodeCoverageAbsRTotal' value='140']
##teamcity[buildStatisticValue key='CodeCoverageAbsMCovered' value='0']
##teamcity[buildStatisticValue key='CodeCoverageAbsMTotal' value='38']
##teamcity[buildStatisticValue key='CodeCoverageAbsLCovered' value='29']
##teamcity[buildStatisticValue key='CodeCoverageAbsLTotal' value='362']
##teamcity[blockClosed name='Code Coverage Summary']
mv: cannot stat 'test_results/alias-server-junit.xml': No such file or directory
Build alias-server-tests failed with exit code 1

finish conversion, locally tested, monorepo implementation tbd

Tail of the build log:


/work/modules/mock-chronik-client/index.ts:4
import * as cashaddr from 'ecashaddrjs';
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at wrapSafe (node:internal/modules/cjs/loader:1378:20)
    at Module._compile (node:internal/modules/cjs/loader:1428:41)
    at Module.replacementCompile (/usr/lib/node_modules/nyc/node_modules/append-transform/index.js:60:13)
    at module.exports (/usr/lib/node_modules/nyc/node_modules/default-require-extensions/js.js:7:9)
    at Object.<anonymous> (/usr/lib/node_modules/nyc/node_modules/append-transform/index.js:64:4)
    at Module.load (node:internal/modules/cjs/loader:1288:32)
    at Module._load (node:internal/modules/cjs/loader:1104:12)
    at Module.require (node:internal/modules/cjs/loader:1311:19)
    at require (node:internal/modules/helpers:179:18)
    at Object.<anonymous> (/work/apps/alias-server/test/chronik.test.js:16:31)
    at Module._compile (node:internal/modules/cjs/loader:1469:14)
    at Module.replacementCompile (/usr/lib/node_modules/nyc/node_modules/append-transform/index.js:60:13)
    at Module._extensions..js (node:internal/modules/cjs/loader:1548:10)
    at Object.<anonymous> (/usr/lib/node_modules/nyc/node_modules/append-transform/index.js:64:4)
    at Module.load (node:internal/modules/cjs/loader:1288:32)
    at Module._load (node:internal/modules/cjs/loader:1104:12)
    at cjsLoader (node:internal/modules/esm/translators:346:17)
    at ModuleWrap.<anonymous> (node:internal/modules/esm/translators:286:7)
    at ModuleJob.run (node:internal/modules/esm/module_job:234:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:473:24)
    at async formattedImport (/work/apps/alias-server/node_modules/mocha/lib/nodejs/esm-utils.js:9:14)
    at async exports.requireOrImport (/work/apps/alias-server/node_modules/mocha/lib/nodejs/esm-utils.js:42:28)
    at async exports.loadFilesAsync (/work/apps/alias-server/node_modules/mocha/lib/nodejs/esm-utils.js:100:20)
    at async singleRun (/work/apps/alias-server/node_modules/mocha/lib/cli/run-helpers.js:125:3)
    at async exports.handler (/work/apps/alias-server/node_modules/mocha/lib/cli/run.js:370:5)
------------------------|---------|----------|---------|---------|-------------------
File                    | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
------------------------|---------|----------|---------|---------|-------------------
All files               |    7.81 |        0 |       0 |    8.01 |                   
 alias-server           |     100 |      100 |     100 |     100 |                   
  config.js             |     100 |      100 |     100 |     100 |                   
 alias-server/constants |     100 |      100 |     100 |     100 |                   
  alias.js              |     100 |      100 |     100 |     100 |                   
 alias-server/src       |    7.31 |        0 |       0 |     7.5 |                   
  alias.js              |    5.88 |        0 |       0 |    6.06 | 23-369            
  app.js                |   16.66 |        0 |       0 |   16.66 | 23-183            
  chronik.js            |    4.47 |        0 |       0 |    4.76 | 12-196            
  db.js                 |    6.09 |        0 |       0 |    6.09 | 17-308            
  utils.js              |    5.17 |        0 |       0 |    5.35 | 12-157            
------------------------|---------|----------|---------|---------|-------------------

##teamcity[blockOpened name='Code Coverage Summary']
##teamcity[buildStatisticValue key='CodeCoverageAbsBCovered' value='29']
##teamcity[buildStatisticValue key='CodeCoverageAbsBTotal' value='371']
##teamcity[buildStatisticValue key='CodeCoverageAbsRCovered' value='0']
##teamcity[buildStatisticValue key='CodeCoverageAbsRTotal' value='140']
##teamcity[buildStatisticValue key='CodeCoverageAbsMCovered' value='0']
##teamcity[buildStatisticValue key='CodeCoverageAbsMTotal' value='38']
##teamcity[buildStatisticValue key='CodeCoverageAbsLCovered' value='29']
##teamcity[buildStatisticValue key='CodeCoverageAbsLTotal' value='362']
##teamcity[blockClosed name='Code Coverage Summary']
mv: cannot stat 'test_results/alias-server-junit.xml': No such file or directory
Build alias-server-tests failed with exit code 1

Tail of the build log:

> ts-node scripts/prepSecrets.ts

secrets.ts does not exist, copying secrets.sample.ts...

> token-server@0.0.0 build
> tsc -p ./tsconfig.build.json


> token-server@0.0.0 pretest
> ts-node scripts/prepSecrets.ts

secrets.ts exists, proceeding to build...

> token-server@0.0.0 test
> mocha --reporter mocha-junit-reporter --reporter-options mochaFile=test_results/token-server-junit.xml --reporter-options testsuitesTitle=Token Server Unit Tests --reporter-options rootSuiteTitle=Token Server


TSError: ⨯ Unable to compile TypeScript:
src/chronik/clientHandler.test.ts(26,27): error TS2551: Property 'setAddress' does not exist on type 'MockChronikClient'. Did you mean 'address'?
src/chronik/clientHandler.test.ts(31,25): error TS2345: Argument of type 'MockChronikClient' is not assignable to parameter of type 'ChronikClient'.
  Type 'MockChronikClient' is missing the following properties from type 'ChronikClient': _proxyInterface, proxyInterface, broadcastTxs, chronikInfo, and 2 more.
src/chronik/clientHandler.test.ts(47,27): error TS2551: Property 'setAddress' does not exist on type 'MockChronikClient'. Did you mean 'address'?
src/chronik/clientHandler.test.ts(53,25): error TS2345: Argument of type 'MockChronikClient' is not assignable to parameter of type 'ChronikClient'.

    at createTSError (/work/apps/token-server/node_modules/ts-node/src/index.ts:859:12)
    at reportTSError (/work/apps/token-server/node_modules/ts-node/src/index.ts:863:19)
    at getOutput (/work/apps/token-server/node_modules/ts-node/src/index.ts:1077:36)
    at Object.compile (/work/apps/token-server/node_modules/ts-node/src/index.ts:1433:41)
    at Module.m._compile (/work/apps/token-server/node_modules/ts-node/src/index.ts:1617:30)
    at module.exports (/usr/lib/node_modules/nyc/node_modules/default-require-extensions/js.js:7:9)
    at /usr/lib/node_modules/nyc/node_modules/append-transform/index.js:64:4
    at require.extensions.<computed> (/work/apps/token-server/node_modules/ts-node/src/index.ts:1621:12)
    at Object.<anonymous> (/usr/lib/node_modules/nyc/node_modules/append-transform/index.js:64:4)
    at Module.load (node:internal/modules/cjs/loader:1288:32)
    at Function.Module._load (node:internal/modules/cjs/loader:1104:12)
    at Module.require (node:internal/modules/cjs/loader:1311:19)
    at require (node:internal/modules/helpers:179:18)
    at Object.exports.requireOrImport (/work/apps/token-server/node_modules/mocha/lib/nodejs/esm-utils.js:53:16)
    at async Object.exports.loadFilesAsync (/work/apps/token-server/node_modules/mocha/lib/nodejs/esm-utils.js:100:20)
    at async singleRun (/work/apps/token-server/node_modules/mocha/lib/cli/run-helpers.js:125:3)
    at async Object.exports.handler (/work/apps/token-server/node_modules/mocha/lib/cli/run.js:370:5)
----------------|---------|----------|---------|---------|-------------------
File            | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------------|---------|----------|---------|---------|-------------------
All files       |      60 |       50 |     100 |      60 |                   
 prepSecrets.ts |      60 |       50 |     100 |      60 | 17-18             
----------------|---------|----------|---------|---------|-------------------

##teamcity[blockOpened name='Code Coverage Summary']
##teamcity[buildStatisticValue key='CodeCoverageAbsBCovered' value='3']
##teamcity[buildStatisticValue key='CodeCoverageAbsBTotal' value='5']
##teamcity[buildStatisticValue key='CodeCoverageAbsRCovered' value='1']
##teamcity[buildStatisticValue key='CodeCoverageAbsRTotal' value='2']
##teamcity[buildStatisticValue key='CodeCoverageAbsMCovered' value='0']
##teamcity[buildStatisticValue key='CodeCoverageAbsMTotal' value='0']
##teamcity[buildStatisticValue key='CodeCoverageAbsLCovered' value='3']
##teamcity[buildStatisticValue key='CodeCoverageAbsLTotal' value='5']
##teamcity[blockClosed name='Code Coverage Summary']
mv: cannot stat 'test_results/token-server-junit.xml': No such file or directory
Build token-server-tests failed with exit code 1

Tail of the build log:

test/chronik.test.ts(191,17): error TS2345: Argument of type 'MockChronikClient' is not assignable to parameter of type 'ChronikClient'.
  Type 'MockChronikClient' is missing the following properties from type 'ChronikClient': _proxyInterface, proxyInterface, broadcastTxs, chronikInfo, and 2 more.
test/chronik.test.ts(207,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(223,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(230,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(235,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(242,17): error TS2345: Argument of type 'MockChronikClient' is not assignable to parameter of type 'ChronikClient'.
  Type 'MockChronikClient' is missing the following properties from type 'ChronikClient': _proxyInterface, proxyInterface, broadcastTxs, chronikInfo, and 2 more.
test/chronik.test.ts(258,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(274,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(280,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(287,17): error TS2345: Argument of type 'MockChronikClient' is not assignable to parameter of type 'ChronikClient'.
  Type 'MockChronikClient' is missing the following properties from type 'ChronikClient': _proxyInterface, proxyInterface, broadcastTxs, chronikInfo, and 2 more.
test/chronik.test.ts(303,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(319,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(326,27): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(335,21): error TS2345: Argument of type 'MockChronikClient' is not assignable to parameter of type 'ChronikClient'.
  Type 'MockChronikClient' is missing the following properties from type 'ChronikClient': _proxyInterface, proxyInterface, broadcastTxs, chronikInfo, and 2 more.
test/chronik.test.ts(352,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(368,23): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(375,27): error TS2339: Property 'setMock' does not exist on type 'MockChronikClient'.
test/chronik.test.ts(384,21): error TS2345: Argument of type 'MockChronikClient' is not assignable to parameter of type 'ChronikClient'.
  Type 'MockChronikClient' is missing the following properties from type 'ChronikClient': _proxyInterface, proxyInterface, broadcastTxs, chronikInfo, and 2 more.

    at createTSError (/work/apps/ecash-herald/node_modules/ts-node/src/index.ts:859:12)
    at reportTSError (/work/apps/ecash-herald/node_modules/ts-node/src/index.ts:863:19)
    at getOutput (/work/apps/ecash-herald/node_modules/ts-node/src/index.ts:1077:36)
    at Object.compile (/work/apps/ecash-herald/node_modules/ts-node/src/index.ts:1433:41)
    at Module.m._compile (/work/apps/ecash-herald/node_modules/ts-node/src/index.ts:1617:30)
    at module.exports (/usr/lib/node_modules/nyc/node_modules/default-require-extensions/js.js:7:9)
    at /usr/lib/node_modules/nyc/node_modules/append-transform/index.js:64:4
    at require.extensions.<computed> (/work/apps/ecash-herald/node_modules/ts-node/src/index.ts:1621:12)
    at Object.<anonymous> (/usr/lib/node_modules/nyc/node_modules/append-transform/index.js:64:4)
    at Module.load (node:internal/modules/cjs/loader:1288:32)
    at Function.Module._load (node:internal/modules/cjs/loader:1104:12)
    at Module.require (node:internal/modules/cjs/loader:1311:19)
    at require (node:internal/modules/helpers:179:18)
    at Object.exports.requireOrImport (/work/apps/ecash-herald/node_modules/mocha/lib/nodejs/esm-utils.js:53:16)
    at async Object.exports.loadFilesAsync (/work/apps/ecash-herald/node_modules/mocha/lib/nodejs/esm-utils.js:100:20)
    at async singleRun (/work/apps/ecash-herald/node_modules/mocha/lib/cli/run-helpers.js:125:3)
    at async Object.exports.handler (/work/apps/ecash-herald/node_modules/mocha/lib/cli/run.js:370:5)
----------------|---------|----------|---------|---------|-------------------
File            | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------------|---------|----------|---------|---------|-------------------
All files       |      80 |       50 |     100 |      80 |                   
 prepSecrets.ts |      80 |       50 |     100 |      80 | 15                
----------------|---------|----------|---------|---------|-------------------

##teamcity[blockOpened name='Code Coverage Summary']
##teamcity[buildStatisticValue key='CodeCoverageAbsBCovered' value='4']
##teamcity[buildStatisticValue key='CodeCoverageAbsBTotal' value='5']
##teamcity[buildStatisticValue key='CodeCoverageAbsRCovered' value='1']
##teamcity[buildStatisticValue key='CodeCoverageAbsRTotal' value='2']
##teamcity[buildStatisticValue key='CodeCoverageAbsMCovered' value='0']
##teamcity[buildStatisticValue key='CodeCoverageAbsMTotal' value='0']
##teamcity[buildStatisticValue key='CodeCoverageAbsLCovered' value='4']
##teamcity[buildStatisticValue key='CodeCoverageAbsLTotal' value='5']
##teamcity[blockClosed name='Code Coverage Summary']
mv: cannot stat 'test_results/ecash-herald-junit.xml': No such file or directory
Build ecash-herald-tests failed with exit code 1

Failed tests logs:

====== CashTab Unit Tests: useWallet hook rendering in different localforage states XEC price is set in state on successful API fetch ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/wallet/__tests__/useWallet.test.js:83:31)
====== CashTab Unit Tests: useWallet hook rendering in different localforage states XEC price remains null in state on API error ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/wallet/__tests__/useWallet.test.js:93:31)
====== 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 ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/wallet/__tests__/useWallet.test.js:135:31)
====== 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 ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/wallet/__tests__/useWallet.test.js:149:31)
====== CashTab Unit Tests: useWallet hook rendering in different localforage states processChronikWsMsg() refreshes alias prices when aliasPrices is null ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/wallet/__tests__/useWallet.test.js:200:31)
====== 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 ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/wallet/__tests__/useWallet.test.js:275:31)
====== 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 ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/wallet/__tests__/useWallet.test.js:408:31)
====== 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 ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/wallet/__tests__/useWallet.test.js:574:31)
====== CashTab Unit Tests: useWallet hook rendering in different localforage states Verify refreshAliases() updates the `aliases` state variable on a successful /address/ endpoint response ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/wallet/__tests__/useWallet.test.js:620:31)
====== CashTab Unit Tests: useWallet hook rendering in different localforage states Verify refreshAliases() updates the `aliasServerError` state variable upon an /address/ endpoint error ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/wallet/__tests__/useWallet.test.js:671:31)
====== CashTab Unit Tests: useWallet hook rendering in different localforage states An incoming tx message from the websocket causes the wallet to update ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/wallet/__tests__/useWallet.test.js:709:31)
====== CashTab Unit Tests: <Collection /> We can cache and render a collection and offered NFT in that collection ======
TypeError: mockedChronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/components/Agora/Collection/index.test.js:155: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: <Collection /> We DO NOT cache and render offered NFTs until user clicks, if loadOnClick prop is set ======
TypeError: mockedChronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/components/Agora/Collection/index.test.js:242: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: <Collection /> We can render and cancel our own listing ======
TypeError: mockedChronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/components/Agora/Collection/index.test.js:330:23)
    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: <Collection /> We can render and buy a listing ======
TypeError: mockedChronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/components/Agora/Collection/index.test.js:421:23)
    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: <OrderBook /> We can see multiple offers, some we made, others we did not, and we can cancel an offer ======
TypeError: mockedChronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/components/Agora/OrderBook/__tests__/index.test.js:283:23)
    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: <OrderBook /> We can buy an offer ======
TypeError: mockedChronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/components/Agora/OrderBook/__tests__/index.test.js:430:23)
    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: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 1000 satoshis with 1 change output at 1 sat/byte to p2pkh address ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:54:25)
    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 _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: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 1000 satoshis with 1 change output at 1 sat/byte to p2pkh address if all utxos are mature coinbase utxos ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:54:25)
    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 _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: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 1000 satoshis with 1 change output at 1 sat/byte to p2pkh address with an OP_RETURN output ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:54:25)
    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 _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: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 1000 satoshis with 1 change output at 1 sat/byte to p2pkh address with an OP_RETURN output at index 0 ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:54:25)
    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 _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: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 1000 satoshis with 1 change output at 1 sat/byte to p2sh address ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:54:25)
    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 _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: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 1000 satoshis with 1 change output at 10 sat/byte ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:54:25)
    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 _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: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 1 satoshi per byte tx with no change outputs ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:54:25)
    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 _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: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 1 satoshi per byte tx with no change outputs from a wallet with utxos at many addresses ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:54:25)
    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 _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: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 1 satoshi per byte tx broadcast actually broadcast with this function ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:54:25)
    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 _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: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: No precision error using JS Number on utxo with highest theoretically possible value ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:54:25)
    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 _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: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 15000 satoshis with 1 change output at 1 sat/byte to 5 p2pkh addresses ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:54:25)
    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 _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: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 15000 satoshis with 1 change output at 1 sat/byte to 5 p2sh outputs ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:54:25)
    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 _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: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: throws broadcast error from the node ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:82:29)
    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 _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: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: Insufficient balance due to immature coinbase utxos ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:82:29)
    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 _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: Cashtab functions that build and broadcast rawtxs We can build a tx to get the exact fee, then add another utxo if necessary ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:108:17)
    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: Cashtab functions that build and broadcast rawtxs We can create and broadcast SLP v1 SEND and BURN txs from utxos of nng or in-node chronik shape Build and broadcast an SLP V1 SEND and BURN tx from in-node chronik-client utxos: SLP send and burn with token change ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:306:25)
    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 _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: Cashtab functions that build and broadcast rawtxs We can create and broadcast SLP v1 SEND and BURN txs from utxos of nng or in-node chronik shape Build and broadcast an SLP V1 SEND and BURN tx from in-node chronik-client utxos: SLP send and BURN with no token change ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:306:25)
    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 _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: Cashtab functions that build and broadcast rawtxs We can create and broadcast SLP v1 SEND and BURN txs from utxos of nng or in-node chronik shape Build and broadcast an SLP V1 SEND and BURN tx from in-node chronik-client utxos: SLP max send tx using all available input utxos ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:306:25)
    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 _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: Cashtab functions that build and broadcast rawtxs We can build and broadcast NFT1 parent fan-out txs sendXec: Gets 19 fan outputs for an NFT1 parent fan tx for max outputs and no change ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:380:25)
    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 _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: Cashtab functions that build and broadcast rawtxs We can build and broadcast NFT1 parent fan-out txs sendXec: Gets 18 fan outputs for an NFT1 parent fan tx for max outputs if we have change ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:380:25)
    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 _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: Cashtab functions that build and broadcast rawtxs We can build and broadcast NFT1 parent fan-out txs sendXec: Gets token amount fan outputs for an NFT1 parent fan tx if user has less than 19 of this token left ======
TypeError: chronik.setMock is not a function
    at Object.setMock (/work/cashtab/src/transactions/__tests__/index.test.js:380:25)
    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 _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: Correctly prepares Cashtab mocked chronik client and localforage environment for Cashtab pre 1.7.* for unit tests initializeCashtabStateAtLegacyWalletKeysForTests mocks a new Cashtab user or incognito visitor ======
Error: expect(received).toEqual(expected) // deep equality

- Expected  - 1
+ Received  + 4

- Object {}
+ Object {
+   "tipHash": "mock is unset",
+   "tipHeight": 0,
+ }
    at Object.toEqual (/work/cashtab/src/components/App/fixtures/__tests__/index.test.js:30:66)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
====== CashTab Unit Tests: Correctly prepares Cashtab mocked chronik client and localforage environment for Cashtab pre 1.7.* for unit tests initializeCashtabStateAtLegacyWalletKeysForTests: Wallet with xec and tokens ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:155:5)
    at Object.<anonymous> (/work/cashtab/src/components/App/fixtures/__tests__/index.test.js:48:17)
====== CashTab Unit Tests: Correctly prepares Cashtab mocked chronik client and localforage environment for unit tests initializeCashtabStateForTests mocks a new Cashtab user or incognito visitor ======
Error: expect(received).toEqual(expected) // deep equality

- Expected  - 1
+ Received  + 4

- Object {}
+ Object {
+   "tipHash": "mock is unset",
+   "tipHeight": 0,
+ }
    at Object.toEqual (/work/cashtab/src/components/App/fixtures/__tests__/index.test.js:193:66)
====== CashTab Unit Tests: Correctly prepares Cashtab mocked chronik client and localforage environment for unit tests initializeCashtabStateForTests: Wallet with xec and tokens ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/App/fixtures/__tests__/index.test.js:209:39)
====== CashTab Unit Tests: Correctly prepares Cashtab mocked chronik client and localforage environment for unit tests initializeCashtabStateForTests: Multiple wallets ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/App/fixtures/__tests__/index.test.js:209:39)
====== CashTab Unit Tests: <Home /> Renders the loading component while loading, then the Home screen ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Home/__tests__/Home.test.js:59:31)
====== CashTab Unit Tests: <Home /> Renders the Home screen with API error ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Home/__tests__/Home.test.js:93:31)
====== 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 ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Home/__tests__/Home.test.js:114:31)
====== 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 ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Home/__tests__/Home.test.js:189:31)
====== 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 ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Home/__tests__/Home.test.js:273:31)
====== CashTab Unit Tests: <Wallets /> We can add a savedWallet as a contact ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Wallets/__tests__/index.test.js:63:31)
====== CashTab Unit Tests: <Wallets /> We can copy the address of a savedWallet to the clipboard ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Wallets/__tests__/index.test.js:119:31)
====== 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 ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Wallets/__tests__/index.test.js:166:31)
====== CashTab Unit Tests: <CreateTokenForm /> User can create an SLP1 token with no mint baton ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/CreateTokenForm.test.js:60:31)
====== CashTab Unit Tests: <CreateTokenForm /> User can create an SLP1 token with a mint baton ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/CreateTokenForm.test.js:149:31)
====== CashTab Unit Tests: <CreateTokenForm /> User can create an NFT collection ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/CreateTokenForm.test.js:265:31)
====== CashTab Unit Tests: <CreateTokenForm /> User can create an ALP token ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/CreateTokenForm.test.js:361:31)
====== CashTab Unit Tests: <Agora /> Screen loads as expected if there are no agora partial listings ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Agora/__tests__/index.test.js:51:25)
====== CashTab Unit Tests: <Agora /> A chronik error notice is rendered if there is some error in querying listings ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Agora/__tests__/index.test.js:51:25)
====== CashTab Unit Tests: <Agora /> We can see a rendered offer ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Agora/__tests__/index.test.js:51:25)
====== CashTab Unit Tests: <Agora /> We can fetch and use the blacklist from token server ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Agora/__tests__/index.test.js:51:25)
====== 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 ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Agora/__tests__/index.test.js:51:25)
====== CashTab Unit Tests: <Agora /> We can see multiple offers, some we made, others we did not, and we can cancel an offer ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Agora/__tests__/index.test.js:51:25)
====== CashTab Unit Tests: <Agora /> We can buy an offer ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Agora/__tests__/index.test.js:51:25)
====== CashTab Unit Tests: <Agora /> We get expected error if we try to buy an offer we cannot afford ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Agora/__tests__/index.test.js:51:25)
====== CashTab Unit Tests: <SendXec /> rendered with params in URL Legacy params. Address and value keys are set and valid. ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Send/__tests__/SendByUrlParams.test.js:69:31)
====== CashTab Unit Tests: <SendXec /> rendered with params in URL Legacy params. Address and value keys are set and valid. Invalid bip21 string is ignored. ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Send/__tests__/SendByUrlParams.test.js:137:31)
====== CashTab Unit Tests: <SendXec /> rendered with params in URL Legacy params. Address field is populated + disabled while value field is empty + enabled if legacy url params have address defined and value present as undefined ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Send/__tests__/SendByUrlParams.test.js:200:31)
====== CashTab Unit Tests: <SendXec /> rendered with params in URL Legacy params. Address field is populated + disabled while value field is empty + enabled if legacy url params have address defined and no value key present ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Send/__tests__/SendByUrlParams.test.js:263:31)
====== CashTab Unit Tests: <SendXec /> rendered with params in URL Legacy params. Params are ignored if only value param is present ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Send/__tests__/SendByUrlParams.test.js:324:31)
====== CashTab Unit Tests: <SendXec /> rendered with params in URL Legacy params. Params are ignored if param is duplicated ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Send/__tests__/SendByUrlParams.test.js:382:31)
====== CashTab Unit Tests: <SendXec /> rendered with params in URL Legacy params are not parsed as bip21 even if the bip21 param appears in the string ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Send/__tests__/SendByUrlParams.test.js:441:31)
====== CashTab Unit Tests: <SendXec /> rendered with params in URL bip21 param - valid bip21 param with amount and op_return_raw is parsed as expected ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Send/__tests__/SendByUrlParams.test.js:508:31)
====== CashTab Unit Tests: <SendXec /> rendered with params in URL bip21 param - an invalid bip21 param shows validation errors but cannot be changed ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Send/__tests__/SendByUrlParams.test.js:617:31)
====== CashTab Unit Tests: <SendXec /> rendered with params in URL No params. Send screen loads normally with no rendered input. ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Send/__tests__/SendByUrlParams.test.js:689:31)
====== CashTab Unit Tests: <SendXec /> rendered with params in URL bip21 param - valid bip21 param with amount, op_return_raw, and additional output with amount is parsed as expected ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Send/__tests__/SendByUrlParams.test.js:754:31)
====== CashTab Unit Tests: <SendXec /> rendered with params in URL bip21 param - valid bip21 token send ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Send/__tests__/SendByUrlParams.test.js:870:31)
====== CashTab Unit Tests: <Token /> For a fungible SLP token, renders the Token screen with sale by default and expected inputs ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/Token.test.js:62:25)
====== CashTab Unit Tests: <Token /> We show an alert and do not render the Orderbook for a blacklisted token ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/Token.test.js:62:25)
====== CashTab Unit Tests: <Token /> Accepts a valid ecash: prefixed address ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/Token.test.js:62:25)
====== CashTab Unit Tests: <Token /> Accepts a valid etoken: prefixed address ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/Token.test.js:62:25)
====== CashTab Unit Tests: <Token /> Accepts a valid alias ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/Token.test.js:62:25)
====== CashTab Unit Tests: <Token /> Displays a validation error for an invalid address ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/Token.test.js:62:25)
====== CashTab Unit Tests: <Token /> Displays a validation error for an alias without .xec suffix ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/Token.test.js:62:25)
====== CashTab Unit Tests: <Token /> Displays a validation error for valid alias that has not yet been registered ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/Token.test.js:62:25)
====== CashTab Unit Tests: <Token /> Displays expected error if alias server gives a bad response ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/Token.test.js:62:25)
====== CashTab Unit Tests: <Token /> Displays a validation error if the user includes any query string ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/Token.test.js:62:25)
====== CashTab Unit Tests: <Token /> Renders the send token notification upon successful broadcast ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/Token.test.js:62:25)
====== CashTab Unit Tests: <Token /> Renders the burn token success notification upon successful burn tx broadcast ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/Token.test.js:62:25)
====== CashTab Unit Tests: <Token /> Mint switch is disabled if no mint batons for this token in the wallet ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/Token.test.js:62:25)
====== CashTab Unit Tests: <Token /> We can mint an slpv1 token if we have a mint baton ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/Token.test.js:62:25)
====== CashTab Unit Tests: <Token /> For an uncached token with no balance, we show a spinner while loading the token info, then show an info screen and open agora offers ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/Token.test.js:62:25)
====== CashTab Unit Tests: <Token /> For an uncached token with no balance, we show a chronik query error if we are unable to fetch the token info ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/Token.test.js:62:25)
====== CashTab Unit Tests: <Token /> For an invalid tokenId, we do not query chronik, and we show an invalid tokenId notice ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/Token.test.js:62:25)
====== CashTab Unit Tests: <Configure /> We do not see the camera auto-open setting in the config screen on a desktop device ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Configure/__tests__/Configure.test.js:78:31)
====== CashTab Unit Tests: <Configure /> We do see the camera auto-open setting in the config screen on a mobile device ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Configure/__tests__/Configure.test.js:108:31)
====== CashTab Unit Tests: <Configure /> Setting "Send Confirmations" settings will show send confirmations ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Configure/__tests__/Configure.test.js:138:31)
====== CashTab Unit Tests: <Configure /> "ABSOLUTE MINIMUM fees" setting is unavailable if wallet holds 0.01 less than required balance of Cachet ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Configure/__tests__/Configure.test.js:236:31)
====== CashTab Unit Tests: <Configure /> "ABSOLUTE MINIMUM fees" setting is available and effective if wallet holds exactly required balance of Cachet ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Configure/__tests__/Configure.test.js:302:31)
====== CashTab Unit Tests: <Configure /> Setting "ABSOLUTE MINIMUM fees" settings will reduce fees to absolute min ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Configure/__tests__/Configure.test.js:400:31)
====== CashTab Unit Tests: <Configure /> We can choose a new fiat currency ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at Object.<anonymous> (/work/cashtab/src/components/Configure/__tests__/Configure.test.js:536:31)
====== CashTab Unit Tests: <Token /> available actions rendered SLP1 fixed supply token ======
TypeError: chronikClient.setMock is not a function
    at setMock (/work/cashtab/src/components/App/fixtures/helpers.js:307:19)
    at prepareMockedChronikCallsForWallet (/work/cashtab/src/components/App/fixtures/helpers.js:67:9)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at Object.<anonymous> (/work/cashtab/src/components/Etokens/__tests__/TokenActions.test.js:53:25)

Each failure log is accessible here:
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=868374&_focus=868374&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=868374&_focus=868374&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=868374&_focus=868374&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: <Collection /> We can cache and render a collection and offered NFT in that collection
CashTab Unit Tests: <Collection /> We DO NOT cache and render offered NFTs until user clicks, if loadOnClick prop is set
CashTab Unit Tests: <Collection /> We can render and cancel our own listing
CashTab Unit Tests: <Collection /> We can render and buy a listing
CashTab Unit Tests: <OrderBook /> We can see multiple offers, some we made, others we did not, and we can cancel an offer
CashTab Unit Tests: <OrderBook /> We can buy an offer
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 1000 satoshis with 1 change output at 1 sat/byte to p2pkh address
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 1000 satoshis with 1 change output at 1 sat/byte to p2pkh address if all utxos are mature coinbase utxos
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 1000 satoshis with 1 change output at 1 sat/byte to p2pkh address with an OP_RETURN output
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 1000 satoshis with 1 change output at 1 sat/byte to p2pkh address with an OP_RETURN output at index 0
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 1000 satoshis with 1 change output at 1 sat/byte to p2sh address
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 1000 satoshis with 1 change output at 10 sat/byte
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 1 satoshi per byte tx with no change outputs
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 1 satoshi per byte tx with no change outputs from a wallet with utxos at many addresses
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 1 satoshi per byte tx broadcast actually broadcast with this function
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: No precision error using JS Number on utxo with highest theoretically possible value
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 15000 satoshis with 1 change output at 1 sat/byte to 5 p2pkh addresses
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: 15000 satoshis with 1 change output at 1 sat/byte to 5 p2sh outputs
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: throws broadcast error from the node
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can broadcast XEC transactions sendXec: Insufficient balance due to immature coinbase utxos
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can build a tx to get the exact fee, then add another utxo if necessary
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can create and broadcast SLP v1 SEND and BURN txs from utxos of nng or in-node chronik shape Build and broadcast an SLP V1 SEND and BURN tx from in-node chronik-client utxos: SLP send and burn with token change
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can create and broadcast SLP v1 SEND and BURN txs from utxos of nng or in-node chronik shape Build and broadcast an SLP V1 SEND and BURN tx from in-node chronik-client utxos: SLP send and BURN with no token change
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can create and broadcast SLP v1 SEND and BURN txs from utxos of nng or in-node chronik shape Build and broadcast an SLP V1 SEND and BURN tx from in-node chronik-client utxos: SLP max send tx using all available input utxos
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can build and broadcast NFT1 parent fan-out txs sendXec: Gets 19 fan outputs for an NFT1 parent fan tx for max outputs and no change
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can build and broadcast NFT1 parent fan-out txs sendXec: Gets 18 fan outputs for an NFT1 parent fan tx for max outputs if we have change
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can build and broadcast NFT1 parent fan-out txs sendXec: Gets token amount fan outputs for an NFT1 parent fan tx if user has less than 19 of this token left
CashTab Unit Tests: Correctly prepares Cashtab mocked chronik client and localforage environment for Cashtab pre 1.7.* for unit tests initializeCashtabStateAtLegacyWalletKeysForTests mocks a new Cashtab user or incognito visitor
CashTab Unit Tests: Correctly prepares Cashtab mocked chronik client and localforage environment for Cashtab pre 1.7.* for unit tests initializeCashtabStateAtLegacyWalletKeysForTests: Wallet with xec and tokens
CashTab Unit Tests: Correctly prepares Cashtab mocked chronik client and localforage environment for unit tests initializeCashtabStateForTests mocks a new Cashtab user or incognito visitor
CashTab Unit Tests: Correctly prepares Cashtab mocked chronik client and localforage environment for unit tests initializeCashtabStateForTests: Wallet with xec and tokens
CashTab Unit Tests: Correctly prepares Cashtab mocked chronik client and localforage environment for unit tests initializeCashtabStateForTests: Multiple wallets
CashTab Unit Tests: <Home /> Renders the loading component while loading, then the Home screen
CashTab Unit Tests: <Home /> Renders the Home screen with API error
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 add a savedWallet as a contact
CashTab Unit Tests: <Wallets /> We can copy the address of a savedWallet to the clipboard
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: <CreateTokenForm /> User can create an SLP1 token with no mint baton
CashTab Unit Tests: <CreateTokenForm /> User can create an SLP1 token with a mint baton
CashTab Unit Tests: <CreateTokenForm /> User can create an NFT collection
CashTab Unit Tests: <CreateTokenForm /> User can create an 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 see multiple offers, some we made, others we did not, and we can cancel an offer
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
CashTab Unit Tests: <SendXec /> rendered with params in URL Legacy params. Address and value keys are set and valid.
CashTab Unit Tests: <SendXec /> rendered with params in URL Legacy params. Address and value keys are set and valid. Invalid bip21 string is ignored.
CashTab Unit Tests: <SendXec /> rendered with params in URL Legacy params. Address field is populated + disabled while value field is empty + enabled if legacy url params have address defined and value present as undefined
CashTab Unit Tests: <SendXec /> rendered with params in URL Legacy params. Address field is populated + disabled while value field is empty + enabled if legacy url params have address defined and no value key present
CashTab Unit Tests: <SendXec /> rendered with params in URL Legacy params. Params are ignored if only value param is present
CashTab Unit Tests: <SendXec /> rendered with params in URL Legacy params. Params are ignored if param is duplicated
CashTab Unit Tests: <SendXec /> rendered with params in URL Legacy params are not parsed as bip21 even if the bip21 param appears in the string
CashTab Unit Tests: <SendXec /> rendered with params in URL bip21 param - valid bip21 param with amount and op_return_raw is parsed as expected
CashTab Unit Tests: <SendXec /> rendered with params in URL bip21 param - an invalid bip21 param shows validation errors but cannot be changed
CashTab Unit Tests: <SendXec /> rendered with params in URL No params. Send screen loads normally with no rendered input.
CashTab Unit Tests: <SendXec /> rendered with params in URL bip21 param - valid bip21 param with amount, op_return_raw, and additional output with amount is parsed as expected
CashTab Unit Tests: <SendXec /> rendered with params in URL bip21 param - valid bip21 token send
CashTab Unit Tests: <Token /> For a fungible SLP token, renders the Token screen with sale by default and expected inputs
CashTab Unit Tests: <Token /> We show an alert and do not render the Orderbook for a blacklisted token
CashTab Unit Tests: <Token /> Accepts a valid ecash: prefixed address
CashTab Unit Tests: <Token /> Accepts a valid etoken: prefixed address
CashTab Unit Tests: <Token /> Accepts a valid alias
CashTab Unit Tests: <Token /> Displays a validation error for an invalid address
CashTab Unit Tests: <Token /> Displays a validation error for an alias without .xec suffix
CashTab Unit Tests: <Token /> Displays a validation error for valid alias that has not yet been registered
CashTab Unit Tests: <Token /> Displays expected error if alias server gives a bad response
CashTab Unit Tests: <Token /> Displays a validation error if the user includes any query string
CashTab Unit Tests: <Token /> Renders the send token notification upon successful broadcast
CashTab Unit Tests: <Token /> Renders the burn token success notification upon successful burn tx broadcast
CashTab Unit Tests: <Token /> Mint switch is disabled if no mint batons for this token in the wallet
CashTab Unit Tests: <Token /> We can mint an slpv1 token if we have a mint baton
CashTab Unit Tests: <Token /> For an uncached token with no balance, we show a spinner while loading the token info, then show an info screen and open agora offers
CashTab Unit Tests: <Token /> For an uncached token with no balance, we show a chronik query error if we are unable to fetch the token info
CashTab Unit Tests: <Token /> For an invalid tokenId, we do not query chronik, and we show an invalid tokenId notice
CashTab Unit Tests: <Configure /> We do not see the camera auto-open setting in the config screen on a desktop device
CashTab Unit Tests: <Configure /> We do see the camera auto-open setting in the config screen on a mobile device
CashTab Unit Tests: <Configure /> Setting "Send Confirmations" settings will show send confirmations
CashTab Unit Tests: <Configure /> "ABSOLUTE MINIMUM fees" setting is unavailable if wallet holds 0.01 less than required balance of Cachet
CashTab Unit Tests: <Configure /> "ABSOLUTE MINIMUM fees" setting is available and effective if wallet holds exactly required balance of Cachet
CashTab Unit Tests: <Configure /> Setting "ABSOLUTE MINIMUM fees" settings will reduce fees to absolute min
CashTab Unit Tests: <Configure /> We can choose a new fiat currency
CashTab Unit Tests: <Token /> available actions rendered SLP1 fixed supply token

update mcc 2.0.0 in all impacted repos, update CI to include build step

Tail of the build log:

npm warn deprecated eslint@8.57.1: This version is no longer supported. Please see https://eslint.org/version-support for other options.

> ecashaddrjs@1.6.2 prepublish
> npm run build


> ecashaddrjs@1.6.2 build
> tsc


added 579 packages, and audited 580 packages in 5s

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

4 vulnerabilities (2 low, 1 moderate, 1 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

> ecashaddrjs@1.6.2 build
> tsc

Test depends on mock-chronik-client. Installing mock-chronik-client dependencies...
/work/modules/mock-chronik-client /work/modules/ecashaddrjs /work/abc-ci-builds/ecash-herald-tests
npm warn deprecated @humanwhocodes/config-array@0.13.0: Use @eslint/config-array instead
npm warn deprecated @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema instead
npm warn deprecated glob@8.1.0: Glob versions prior to v9 are no longer supported
npm warn deprecated eslint@8.57.1: This version is no longer supported. Please see https://eslint.org/version-support for other options.

added 349 packages, and audited 352 packages in 2s

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

1 high severity vulnerability

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

> mock-chronik-client@2.0.0 build
> tsc

../chronik-client/proto/chronik.ts(2,18): error TS2307: Cannot find module 'long' or its corresponding type declarations.
../chronik-client/proto/chronik.ts(3,17): error TS2307: Cannot find module 'protobufjs/minimal' or its corresponding type declarations.
../chronik-client/src/ChronikClient.ts(5,22): error TS2307: Cannot find module 'ecashaddrjs' or its corresponding type declarations.
../chronik-client/src/ChronikClient.ts(6,23): error TS2307: Cannot find module 'isomorphic-ws' or its corresponding type declarations.
../chronik-client/src/ChronikClient.ts(7,21): error TS2307: Cannot find module 'ws' or its corresponding type declarations.
../chronik-client/src/failoverProxy.ts(5,38): error TS2307: Cannot find module 'axios' or its corresponding type declarations.
../chronik-client/src/failoverProxy.ts(6,23): error TS2307: Cannot find module 'isomorphic-ws' or its corresponding type declarations.
../chronik-client/src/failoverProxy.ts(7,21): error TS2307: Cannot find module 'ws' or its corresponding type declarations.
../chronik-client/src/failoverProxy.ts(186,35): error TS7006: Parameter 'x' implicitly has an 'any' type.
../chronik-client/src/failoverProxy.ts(270,32): error TS7006: Parameter 'e' implicitly has an 'any' type.
../chronik-client/src/failoverProxy.ts(276,30): error TS7006: Parameter 'e' implicitly has an 'any' type.
../chronik-client/src/failoverProxy.ts(294,33): error TS7006: Parameter 'msg' implicitly has an 'any' type.
Build ecash-herald-tests failed with exit code 2

Tail of the build log:

npm warn deprecated eslint@8.57.1: This version is no longer supported. Please see https://eslint.org/version-support for other options.

> ecashaddrjs@1.6.2 prepublish
> npm run build


> ecashaddrjs@1.6.2 build
> tsc


added 579 packages, and audited 580 packages in 4s

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

4 vulnerabilities (2 low, 1 moderate, 1 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

> ecashaddrjs@1.6.2 build
> tsc

Test depends on mock-chronik-client. Installing mock-chronik-client dependencies...
/work/modules/mock-chronik-client /work/modules/ecashaddrjs /work/abc-ci-builds/alias-server-tests
npm warn deprecated @humanwhocodes/config-array@0.13.0: Use @eslint/config-array instead
npm warn deprecated @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema instead
npm warn deprecated glob@8.1.0: Glob versions prior to v9 are no longer supported
npm warn deprecated eslint@8.57.1: This version is no longer supported. Please see https://eslint.org/version-support for other options.

added 349 packages, and audited 352 packages in 2s

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

1 high severity vulnerability

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

> mock-chronik-client@2.0.0 build
> tsc

../chronik-client/proto/chronik.ts(2,18): error TS2307: Cannot find module 'long' or its corresponding type declarations.
../chronik-client/proto/chronik.ts(3,17): error TS2307: Cannot find module 'protobufjs/minimal' or its corresponding type declarations.
../chronik-client/src/ChronikClient.ts(5,22): error TS2307: Cannot find module 'ecashaddrjs' or its corresponding type declarations.
../chronik-client/src/ChronikClient.ts(6,23): error TS2307: Cannot find module 'isomorphic-ws' or its corresponding type declarations.
../chronik-client/src/ChronikClient.ts(7,21): error TS2307: Cannot find module 'ws' or its corresponding type declarations.
../chronik-client/src/failoverProxy.ts(5,38): error TS2307: Cannot find module 'axios' or its corresponding type declarations.
../chronik-client/src/failoverProxy.ts(6,23): error TS2307: Cannot find module 'isomorphic-ws' or its corresponding type declarations.
../chronik-client/src/failoverProxy.ts(7,21): error TS2307: Cannot find module 'ws' or its corresponding type declarations.
../chronik-client/src/failoverProxy.ts(186,35): error TS7006: Parameter 'x' implicitly has an 'any' type.
../chronik-client/src/failoverProxy.ts(270,32): error TS7006: Parameter 'e' implicitly has an 'any' type.
../chronik-client/src/failoverProxy.ts(276,30): error TS7006: Parameter 'e' implicitly has an 'any' type.
../chronik-client/src/failoverProxy.ts(294,33): error TS7006: Parameter 'msg' implicitly has an 'any' type.
Build alias-server-tests failed with exit code 2

Tail of the build log:

npm warn deprecated eslint@8.57.1: This version is no longer supported. Please see https://eslint.org/version-support for other options.

> ecashaddrjs@1.6.2 prepublish
> npm run build


> ecashaddrjs@1.6.2 build
> tsc


added 579 packages, and audited 580 packages in 4s

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

4 vulnerabilities (2 low, 1 moderate, 1 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

> ecashaddrjs@1.6.2 build
> tsc

Test depends on mock-chronik-client. Installing mock-chronik-client dependencies...
/work/modules/mock-chronik-client /work/modules/ecashaddrjs /work/abc-ci-builds/token-server-tests
npm warn deprecated @humanwhocodes/config-array@0.13.0: Use @eslint/config-array instead
npm warn deprecated @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema instead
npm warn deprecated glob@8.1.0: Glob versions prior to v9 are no longer supported
npm warn deprecated eslint@8.57.1: This version is no longer supported. Please see https://eslint.org/version-support for other options.

added 349 packages, and audited 352 packages in 2s

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

1 high severity vulnerability

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

> mock-chronik-client@2.0.0 build
> tsc

../chronik-client/proto/chronik.ts(2,18): error TS2307: Cannot find module 'long' or its corresponding type declarations.
../chronik-client/proto/chronik.ts(3,17): error TS2307: Cannot find module 'protobufjs/minimal' or its corresponding type declarations.
../chronik-client/src/ChronikClient.ts(5,22): error TS2307: Cannot find module 'ecashaddrjs' or its corresponding type declarations.
../chronik-client/src/ChronikClient.ts(6,23): error TS2307: Cannot find module 'isomorphic-ws' or its corresponding type declarations.
../chronik-client/src/ChronikClient.ts(7,21): error TS2307: Cannot find module 'ws' or its corresponding type declarations.
../chronik-client/src/failoverProxy.ts(5,38): error TS2307: Cannot find module 'axios' or its corresponding type declarations.
../chronik-client/src/failoverProxy.ts(6,23): error TS2307: Cannot find module 'isomorphic-ws' or its corresponding type declarations.
../chronik-client/src/failoverProxy.ts(7,21): error TS2307: Cannot find module 'ws' or its corresponding type declarations.
../chronik-client/src/failoverProxy.ts(186,35): error TS7006: Parameter 'x' implicitly has an 'any' type.
../chronik-client/src/failoverProxy.ts(270,32): error TS7006: Parameter 'e' implicitly has an 'any' type.
../chronik-client/src/failoverProxy.ts(276,30): error TS7006: Parameter 'e' implicitly has an 'any' type.
../chronik-client/src/failoverProxy.ts(294,33): error TS7006: Parameter 'msg' implicitly has an 'any' type.
Build token-server-tests failed with exit code 2

in CI, build chronik-client before building mock-chronik-client, now that chronik-client is a dep

bytesofman edited the summary of this revision. (Show Details)

Better comments on classes in mock-chronik-client

contrib/teamcity/build-configurations.yml
108 ↗(On Diff #51534)

Now that chronik-client is a dep of mock-chronik-client, we need to build chronik-client before we build mock-chronik-client

emack requested changes to this revision.Wed, Dec 11, 10:27
emack added a subscriber: emack.
emack added inline comments.
cashtab/src/components/App/fixtures/helpers.js
174–177 ↗(On Diff #51534)

why is the error handling logic here rather than at the callsite where prepareMockedChronikCallsForLegacyWallet was originally called?

183 ↗(On Diff #51534)

should group the logic for if (apiError) into the same block followed by the else condition.

This revision now requires changes to proceed.Wed, Dec 11, 10:27
bytesofman added inline comments.
cashtab/src/components/App/fixtures/helpers.js
174–177 ↗(On Diff #51534)

In this case, it's not really error handling. apiError is a param set by the dev when making unit tests to test the behavior of a Cashtab screen when chronik throws an error.

So here, we are setting a mocked error response in mockedChronik, to be used in alter Cashtab tests.

All the functions in this file are test supporting functions. In general, the quality of these functions is not great and should be improved. But in this diff, it's more about duplicating the existing functionality while implementing an improved mocked-chronik-client

183 ↗(On Diff #51534)

yup this is better, cleaned it up.

bytesofman marked 2 inline comments as done.

improve cashtab test mock prep implementation