Page MenuHomePhabricator

[Cashtab] Refactor script generating functions to use ecash-lib Script
ClosedPublic

Authored by bytesofman on Jun 13 2024, 23:18.

Details

Summary

T3582

Stop using Buffer type and replace with ecash-lib's native Script

Background

Target outputs are currently created with script key as Buffer types, which utxo-lib used to build transactions.

ecash-lib uses its own Script class, which is much better.

  • Build OP_RETURN scripts using ecash-lib instead of utxo-lib script compiler
  • Build SLP1 OP_RETURN scripts with ecash-lib methods and not slp-mdm methods

While it would be nice to split out these cases, it is imo a better practice to keep one generalized tx building/signing/broadcasting function for Cashtab vs distinct functions for distinct use cases. This approach simplifies unit testing, makes it more clear what logic should move to ecash-lib, and helps in figuring out other tx types since it is clear what problem needs to be isolated (e.g. input selection, output script building).

Note
We still cannot (yet) deprecate slp-mdm or utxo-lib, as Cashtab uses BN from slp-mdm in other places (to be deprecated), and utxo-lib is still used to sign and verify msgs (to be replaced by ecash-lib).

This diff is necessary before we add new tx types to Cashtab, i.e. NFT trading with ecash-agora

Test Plan

npm test

Diff Detail

Repository
rABC Bitcoin ABC
Branch
ecash-lib-scripts
Lint
Lint Passed
Unit
No Test Coverage
Build Status
Buildable 29309
Build 58154: Build Diffcashtab-tests · ecash-lib-tests
Build 58153: arc lint + arc unit

Event Timeline

Failed tests logs:

====== 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 ======
Error: expect(received).toStrictEqual(expected) // deep equality

- Expected  - 4
+ Received  + 2

  Object {
-   "hex": "0200000001c31d0b990c5a707dca806648fe5036dbb3f9590b3e22e026392912edeef154680000000064412344401941ff34548502ce5c4a68a58a2904fdf3c0098a0955b1db1b7fe61126ecafae490f57cfd4f46fa9ab69f4caa4b62ca45731c3c3106d1934e9f20b2e614121031d4603bdc23aca9432f903e3cf5975a3f655cc3fa5057c61d00dfc1ca5dfd02dffffffff03e8030000000000001976a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88ac00000000000000000b6a04007461620474657374d15c0000000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac00000000",
-   "response": Object {
-     "txid": "c3133cad336c6c36c4efa65be65f708e199745c8a0e4d2dffe04d88e5e0d6bf0",
-   },
+   "hex": "0200000001c31d0b990c5a707dca806648fe5036dbb3f9590b3e22e026392912edeef1546800000000644113bbf6b7023fd7ee702637e4b3be1494be13e19fae2e0387836c39da74d7a70286fdc1a1358352cadd2c62aa26778a46e19f8394b0b7c3791a0447bc9f7014554121031d4603bdc23aca9432f903e3cf5975a3f655cc3fa5057c61d00dfc1ca5dfd02dffffffff03e8030000000000001976a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88ac000000000000000000dc5c0000000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac00000000",
+   "response": undefined,
  }
    at Object.toStrictEqual (/work/cashtab/src/transactions/__tests__/index.test.js:66:19)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
====== 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 ======
Error: expect(received).toStrictEqual(expected) // deep equality

- Expected  - 4
+ Received  + 2

  Object {
-   "hex": "0200000001c31d0b990c5a707dca806648fe5036dbb3f9590b3e22e026392912edeef154680000000064413d261c7c3d123de27819765b9fc1636fc4f52d9090cddd5943f5b6e27a03ff04e45ac8064bf42b02aa54d5e84f00c758d43f3e1b5c9b14abfd9c1bd3eab0a2f74121031d4603bdc23aca9432f903e3cf5975a3f655cc3fa5057c61d00dfc1ca5dfd02dffffffff0300000000000000000b6a04007461620474657374e8030000000000001976a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88acd15c0000000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac00000000",
-   "response": Object {
-     "txid": "6728c6beaa67701ddf0c4d22907ef2dd154abc2f2f0369de80e9aa6a725d4634",
-   },
+   "hex": "0200000001c31d0b990c5a707dca806648fe5036dbb3f9590b3e22e026392912edeef15468000000006441711925d25c068f28837f546852e86d4b012ceec30168b971c370a5d20e3519ad0e05d4cccb48fb402500bae96c985c7411cd97632af3c4fccb757980125868e64121031d4603bdc23aca9432f903e3cf5975a3f655cc3fa5057c61d00dfc1ca5dfd02dffffffff03000000000000000000e8030000000000001976a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88acdc5c0000000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac00000000",
+   "response": undefined,
  }
    at Object.toStrictEqual (/work/cashtab/src/transactions/__tests__/index.test.js:66:19)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
====== CashTab Unit Tests: <SendXec /> We can calculate max send amount with and without a cashtab msg, and send a max sat tx with a cashtab msg ======
Error: expect(element).toHaveValue(9508.97)

Expected the element to have value:
  9508.97
Received:
  9509.22
    at Object.toHaveValue (/work/cashtab/src/components/Send/__tests__/SendXec.test.js:1354:31)
====== CashTab Unit Tests: <SendXec /> If we type a Cashtab msg, then disable the switch, we send a tx without our typed Cashtab message ======
Error: expect(element).toHaveValue(9508.97)

Expected the element to have value:
  9508.97
Received:
  9509.22
    at Object.toHaveValue (/work/cashtab/src/components/Send/__tests__/SendXec.test.js:1726:31)

Each failure log is accessible here:
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: <SendXec /> We can calculate max send amount with and without a cashtab msg, and send a max sat tx with a cashtab msg
CashTab Unit Tests: <SendXec /> If we type a Cashtab msg, then disable the switch, we send a tx without our typed Cashtab message

Tail of the build log:

   Compiling sha2 v0.10.8
   Compiling ripemd v0.1.3
   Compiling wasm-bindgen-backend v0.2.92
   Compiling secp256k1-abc v0.20.3 (https://github.com/raipay/secp256k1-abc?rev=b23e742#b23e7421)
   Compiling thiserror-impl v1.0.58
   Compiling wasm-bindgen-macro-support v0.2.92
   Compiling wasm-bindgen-macro v0.2.92
   Compiling ecash-lib-wasm v0.1.0 (/work/modules/ecash-lib-wasm)
    Finished release-wasm [optimized] target(s) in 5.64s
/work/modules/ecash-lib /work/modules/ecash-lib-wasm /work/modules/ecash-script /work/modules/chronik-client /work/modules/mock-chronik-client /work/modules/ecashaddrjs /work/abc-ci-builds/cashtab-tests

added 362 packages, and audited 364 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.

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

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

added 1641 packages, and audited 2458 packages in 31s

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

4 vulnerabilities (3 moderate, 1 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

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

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

[eslint] 
src/opreturn/index.js
  Line 272:5:   'script' is not defined  no-undef
  Line 278:5:   'script' is not defined  no-undef
  Line 281:5:   'script' is not defined  no-undef
  Line 306:5:   'script' is not defined  no-undef
  Line 308:5:   'script' is not defined  no-undef
  Line 308:37:  'script' is not defined  no-undef
  Line 311:24:  'script' is not defined  no-undef

Search for the keywords to learn more about each error.


Build cashtab-tests failed with exit code 1

Support for some SLP, update transactions function to expect Script types as input

Failed tests logs:

====== CashTab Unit Tests: <CreateTokenForm /> User can input valid token parameters, generate a token, and view a success notification ======
Error: Unable to find an element with the text: Token created!. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-cZBZkQ dmqzpG"
    >
      <div
        class="Toastify"
      >
        <div
          class="Toastify__toast-container Toastify__toast-container--top-right sc-hRmvpr hPqicN"
        >
          <div
            class="Toastify__toast Toastify__toast-theme--light Toastify__toast--error Toastify__toast--close-on-click Toastify--animate Toastify__bounce-enter--top-right"
            data-in="true"
            id="1"
          >
            <div
              class="Toastify__toast-body"
              role="alert"
            >
              <div
                class="Toastify__toast-icon Toastify--animate-icon Toastify__zoom-enter"
              >
                <svg
                  fill="var(--toastify-icon-color-error)"
                  height="100%"
                  viewBox="0 0 24 24"
                  width="100%"
                >
                  <path
                    d="M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z"
                  />
                </svg>
              </div>
              <div>
                Error: decimals must be an integer
              </div>
            </div>
            <button
              aria-label="close"
              class="Toastify__close-button Toastify__close-button--light"
              type="button"
            >
              <svg
                aria-hidden="true"
                viewBox="0 0 14 16"
              >
                <path
                  d="M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z"
                  fill-rule="evenodd"
                />
              </svg>
            </button>
            <div
              class="Toastify__progress-bar--wrp"
              data-hidden="false"
            >
              <div
                class="Toastify__progress-bar--bg Toastify__progress-bar-theme--light Toastify__progress-bar--error"
              />
              <div
                aria-hidden="false"
                aria-label="notification timer"
                class="Toastify__progress-bar Toastify__progress-bar--animated Toastify__progress-bar-theme--light Toastify__progress-bar--error"
                role="progressbar"
                style="animation-duration: 5000ms; animation-play-state: paused;"
              />
            </div>
          </div>
        </div>
      </div>
      <div
        class="sc-ecaExY iQOLFd"
      >
        <div
          class="sc-gbzWSY kJQVXT"
        >
          <div
            class="sc-jUpvKA hWBhJE"
          >
            <img
              alt="cashtab"
              class="sc-jdfcpN fMsqkO"
              src="test-file-stub"
            />
          </div>
          <div
            class="sc-ccSCjj bRwaaF"
          >
            <select
              class="sc-jKmXuR ghsHAA"
              id="wallets"
              name="wallets"
            >
              <option
                class="sc-elNKlv lejcCI"
                value="Transaction Fixtures"
              >
                Transaction Fixtures
              </option>
            </select>
            <div
              class="sc-cJOK fzhzzA"
            >
              <button
                aria-label="Copy ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g"
                class="sc-epnACN gliRiA"
              >
                <svg
                  title="copy-paste"
                />
              </button>
              <div
                class="sc-eilVRo kNDvpj"
              >
                <div
                  class="sc-eerKOB VCLyQ"
                >
                  <input
                    checked=""
                    class="sc-bnXvFD clpqCe"
                    id="show-hide-balance"
                    name="show-hide-balance"
                    title="show-hide-balance"
                    type="checkbox"
                  />
                  <label
                    class="sc-emmjRN bKoUpK"
                    for="show-hide-balance"
                  >
                    <span
                      class="sc-cpmLhU prmji"
                      data-off=""
                      data-on=""
                    />
                    <span
                      class="sc-dymIpo kCLFY"
                    />
                  </label>
                </div>
              </div>
            </div>
          </div>
          <div
            class="sc-eopZyb fXQpgT"
            title="Wallet Info"
          >
            <div
              class="sc-hUMlYv bzwofi"
              title="Balance in XEC"
            >
              9,513.12
               
              XEC
               
            </div>
            <div
              class="sc-ESoVU bepyIT"
              title="Balance in Local Currency"
            >
              $
              0.29
               
              USD
            </div>
            <p
              class="sc-kkbgRg hBKjWJ"
              title="Price in Local Currency"
            >
              1 
              XEC
               = 
              0.00003000
               
              USD
            </p>
          </div>
          <div
            class="sc-fkyLDJ tVOMB"
          >
            <h3
              class="sc-TFwJa jOuJNx"
            >
              Create 
              Token
            </h3>
            <div
              class="sc-gFaPwZ lisNYs"
            >
              <div
                class="sc-gGBfsJ bcyGFW"
              >
                <div
                  class="sc-jnlKLf iMOzHB"
                >
                  <input
                    class="sc-fYxtnH klrORb"
                    name="name"
                    placeholder="Enter a name for your token"
                    value="test token"
                  />
                </div>
                <div
                  class="sc-btzYZH cBIGTs"
                />
              </div>
              <div
                class="sc-gGBfsJ bcyGFW"
              >
                <div
                  class="sc-jnlKLf iMOzHB"
                >
                  <input
                    class="sc-fYxtnH klrORb"
                    name="ticker"
                    placeholder="Enter a ticker for your token"
                    value="TKE"
                  />
                </div>
                <div
                  class="sc-btzYZH cBIGTs"
                />
              </div>
              <div
                class="sc-gGBfsJ bcyGFW"
              >
                <div
                  class="sc-jnlKLf iMOzHB"
                >
                  <input
                    class="sc-fYxtnH klrORb"
                    name="decimals"
                    placeholder="Enter number of decimal places"
                    value="2"
                  />
                </div>
                <div
                  class="sc-btzYZH cBIGTs"
                />
              </div>
              <div
                class="sc-gGBfsJ bcyGFW"
              >
                <div
                  class="sc-jnlKLf iMOzHB"
                >
                  <input
                    class="sc-fYxtnH sc-ktHwxA ekzRpS"
                    name="genesisQty"
                    placeholder="Enter initial token supply"
                    step="0.01"
                    type="number"
                    value="600000"
                  />
                  <button
                    class="sc-cIShpX sc-kafWEX bMKAaj"
                  >
                    max
                  </button>
                </div>
                <div
                  class="sc-btzYZH cBIGTs"
                />
              </div>
              <div
                class="sc-gGBfsJ bcyGFW"
              >
                <div
                  class="sc-jnlKLf iMOzHB"
                >
                  <input
                    class="sc-fYxtnH klrORb"
                    name="url"
                    placeholder="Enter a website for your token"
                    value="https://www.cashtab.com"
                  />
                </div>
                <div
                  class="sc-btzYZH cBIGTs"
                />
              </div>
              <div
                class="sc-fhYwyz OHTJW"
              >
                <div
                  class="sc-eilVRo kNDvpj"
                >
                  <div
                    class="sc-eerKOB kmWaKQ"
                  >
                    <input
                      class="sc-bnXvFD clpqCe"
                      id="Toggle Mint Baton"
                      name="Toggle Mint Baton"
                      title="Toggle Mint Baton"
                      type="checkbox"
                    />
                    <label
                      class="sc-emmjRN bKoUpK"
                      for="Toggle Mint Baton"
                    >
                      <span
                        class="sc-cpmLhU bOTgFW"
                        data-off="Fixed"
                        data-on="Variable"
                      />
                      <span
                        class="sc-dymIpo kkkpuN"
                      />
                    </label>
                  </div>
                </div>
                <div
                  class="sc-jzgbtB gcTAXe"
                >
                  Token supply
                </div>
              </div>
              <form
                class="sc-dfVpRl bPSjMp"
                id="form-file-upload"
              >
                <input
                  class="sc-gxMtzJ Iiibh"
                  id="input-file-upload"
                  name="Cashtab Dragger"
                  type="file"
                />
                <label
                  class="sc-gzOgki gRIslG"
                  for="input-file-upload"
                  id="label-file-upload"
                >
                  <div
                    class="sc-kPVwWT bqsfkj"
                  >
                    <p
                      class="sc-hwwEjo kIFSBP"
                    >
                      Drag and drop a png or jpg for your
                       
                      token icon
                    </p>
                    <div
                      class="sc-iyvyFf ljJZHQ"
                    >
                      or click to upload
                    </div>
                  </div>
                </label>
              </form>
              <button
                class="sc-iQKALj sc-hrWEMg cTCrTT"
                style="margin-top: 30px; margin-bottom: 0px;"
              >
                Create eToken
              </button>
            </div>
          </div>
        </div>
        <div
          class="sc-jqIZGH liMLhn"
        >
          <button
            class="sc-iCwjlJ iBRJBY"
          >
            <svg />
          </button>
          <button
            aria-label="Send Screen"
            class="sc-iCwjlJ iBRJBY"
            style="padding-bottom: 10px;"
          >
            <div
              class="sc-iwsKbI cuDgAv"
            >
              <svg
                title="tx-sent"
              />
            </div>
          </button>
          <button
            aria-label="Tokens"
            class="sc-iCwjlJ iBRJBY"
          >
            <svg
              title="Tokens"
            />
          </button>
          <button
            aria-label="Receive"
            class="sc-iCwjlJ iBRJBY"
          >
            <svg
              title="tx-received"
            />
          </button>
          <div
            class="sc-jMMfwr fjefLk"
            title="Show Other Screens"
          >
            <span
              class="sc-jGxEUC cdEtIo"
            />
            <div
              class="sc-jdeSqf sDdDy"
              title="Other Screens"
            >
              <button
                class="sc-cBrjTV kjRyCE"
              >
                 
                <p>
                  Wallet Backup
                </p>
                <svg
                  title="wallet"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                 
                <p>
                  Wallets
                </p>
                <svg
                  title="wallets"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                 
                <p>
                  Contacts
                </p>
                <svg
                  title="Contact List"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                 
                <p>
                  Airdrop
                </p>
                <svg
                  title="tx-airdrop"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                 
                <p>
                  Rewards
                </p>
                <svg
                  title="Cashtab Rewards"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                 
                <p>
                  Swap
                </p>
                <svg
                  title="swap"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                <p>
                  Sign & Verify
                </p>
                <svg
                  class="sc-htpNat bPFBeM"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                <p>
                  Settings
                </p>
                <svg
                  title="settings"
                />
              </button>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</body>
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findByText (/work/cashtab/src/components/Etokens/__tests__/CreateTokenForm.test.js:151:29)
====== CashTab Unit Tests: <CreateTokenForm /> User can create a token with a mint baton ======
Error: Unable to find an element with the text: Token created!. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-cZBZkQ dmqzpG"
    >
      <div
        class="Toastify"
      >
        <div
          class="Toastify__toast-container Toastify__toast-container--top-right sc-hRmvpr hPqicN"
        >
          <div
            class="Toastify__toast Toastify__toast-theme--light Toastify__toast--error Toastify__toast--close-on-click Toastify--animate Toastify__bounce-enter--top-right"
            data-in="true"
            id="2"
          >
            <div
              class="Toastify__toast-body"
              role="alert"
            >
              <div
                class="Toastify__toast-icon Toastify--animate-icon Toastify__zoom-enter"
              >
                <svg
                  fill="var(--toastify-icon-color-error)"
                  height="100%"
                  viewBox="0 0 24 24"
                  width="100%"
                >
                  <path
                    d="M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z"
                  />
                </svg>
              </div>
              <div>
                Error: decimals must be an integer
              </div>
            </div>
            <button
              aria-label="close"
              class="Toastify__close-button Toastify__close-button--light"
              type="button"
            >
              <svg
                aria-hidden="true"
                viewBox="0 0 14 16"
              >
                <path
                  d="M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z"
                  fill-rule="evenodd"
                />
              </svg>
            </button>
            <div
              class="Toastify__progress-bar--wrp"
              data-hidden="false"
            >
              <div
                class="Toastify__progress-bar--bg Toastify__progress-bar-theme--light Toastify__progress-bar--error"
              />
              <div
                aria-hidden="false"
                aria-label="notification timer"
                class="Toastify__progress-bar Toastify__progress-bar--animated Toastify__progress-bar-theme--light Toastify__progress-bar--error"
                role="progressbar"
                style="animation-duration: 5000ms; animation-play-state: paused;"
              />
            </div>
          </div>
        </div>
      </div>
      <div
        class="sc-ecaExY iQOLFd"
      >
        <div
          class="sc-gbzWSY kJQVXT"
        >
          <div
            class="sc-jUpvKA hWBhJE"
          >
            <img
              alt="cashtab"
              class="sc-jdfcpN fMsqkO"
              src="test-file-stub"
            />
          </div>
          <div
            class="sc-ccSCjj bRwaaF"
          >
            <select
              class="sc-jKmXuR ghsHAA"
              id="wallets"
              name="wallets"
            >
              <option
                class="sc-elNKlv lejcCI"
                value="Transaction Fixtures"
              >
                Transaction Fixtures
              </option>
            </select>
            <div
              class="sc-cJOK fzhzzA"
            >
              <button
                aria-label="Copy ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g"
                class="sc-epnACN gliRiA"
              >
                <svg
                  title="copy-paste"
                />
              </button>
              <div
                class="sc-eilVRo kNDvpj"
              >
                <div
                  class="sc-eerKOB VCLyQ"
                >
                  <input
                    checked=""
                    class="sc-bnXvFD clpqCe"
                    id="show-hide-balance"
                    name="show-hide-balance"
                    title="show-hide-balance"
                    type="checkbox"
                  />
                  <label
                    class="sc-emmjRN bKoUpK"
                    for="show-hide-balance"
                  >
                    <span
                      class="sc-cpmLhU prmji"
                      data-off=""
                      data-on=""
                    />
                    <span
                      class="sc-dymIpo kCLFY"
                    />
                  </label>
                </div>
              </div>
            </div>
          </div>
          <div
            class="sc-eopZyb fXQpgT"
            title="Wallet Info"
          >
            <div
              class="sc-hUMlYv bzwofi"
              title="Balance in XEC"
            >
              9,513.12
               
              XEC
               
            </div>
            <div
              class="sc-ESoVU bepyIT"
              title="Balance in Local Currency"
            >
              $
              0.29
               
              USD
            </div>
            <p
              class="sc-kkbgRg hBKjWJ"
              title="Price in Local Currency"
            >
              1 
              XEC
               = 
              0.00003000
               
              USD
            </p>
          </div>
          <div
            class="sc-fkyLDJ tVOMB"
          >
            <h3
              class="sc-TFwJa jOuJNx"
            >
              Create 
              Token
            </h3>
            <div
              class="sc-gFaPwZ lisNYs"
            >
              <div
                class="sc-gGBfsJ bcyGFW"
              >
                <div
                  class="sc-jnlKLf iMOzHB"
                >
                  <input
                    class="sc-fYxtnH klrORb"
                    name="name"
                    placeholder="Enter a name for your token"
                    value="test token"
                  />
                </div>
                <div
                  class="sc-btzYZH cBIGTs"
                />
              </div>
              <div
                class="sc-gGBfsJ bcyGFW"
              >
                <div
                  class="sc-jnlKLf iMOzHB"
                >
                  <input
                    class="sc-fYxtnH klrORb"
                    name="ticker"
                    placeholder="Enter a ticker for your token"
                    value="TKE"
                  />
                </div>
                <div
                  class="sc-btzYZH cBIGTs"
                />
              </div>
              <div
                class="sc-gGBfsJ bcyGFW"
              >
                <div
                  class="sc-jnlKLf iMOzHB"
                >
                  <input
                    class="sc-fYxtnH klrORb"
                    name="decimals"
                    placeholder="Enter number of decimal places"
                    value="2"
                  />
                </div>
                <div
                  class="sc-btzYZH cBIGTs"
                />
              </div>
              <div
                class="sc-gGBfsJ bcyGFW"
              >
                <div
                  class="sc-jnlKLf iMOzHB"
                >
                  <input
                    class="sc-fYxtnH sc-ktHwxA ekzRpS"
                    name="genesisQty"
                    placeholder="Enter initial token supply"
                    step="0.01"
                    type="number"
                    value="600000"
                  />
                  <button
                    class="sc-cIShpX sc-kafWEX bMKAaj"
                  >
                    max
                  </button>
                </div>
                <div
                  class="sc-btzYZH cBIGTs"
                />
              </div>
              <div
                class="sc-gGBfsJ bcyGFW"
              >
                <div
                  class="sc-jnlKLf iMOzHB"
                >
                  <input
                    class="sc-fYxtnH klrORb"
                    name="url"
                    placeholder="Enter a website for your token"
                    value="https://www.cashtab.com"
                  />
                </div>
                <div
                  class="sc-btzYZH cBIGTs"
                />
              </div>
              <div
                class="sc-fhYwyz OHTJW"
              >
                <div
                  class="sc-eilVRo kNDvpj"
                >
                  <div
                    class="sc-eerKOB kmWaKQ"
                  >
                    <input
                      class="sc-bnXvFD clpqCe"
                      id="Toggle Mint Baton"
                      name="Toggle Mint Baton"
                      title="Toggle Mint Baton"
                      type="checkbox"
                    />
                    <label
                      class="sc-emmjRN bKoUpK"
                      for="Toggle Mint Baton"
                    >
                      <span
                        class="sc-cpmLhU bOTgFW"
                        data-off="Fixed"
                        data-on="Variable"
                      />
                      <span
                        class="sc-dymIpo kkkpuN"
                      />
                    </label>
                  </div>
                </div>
                <div
                  class="sc-jzgbtB gcTAXe"
                >
                  Token supply
                </div>
              </div>
              <form
                class="sc-dfVpRl bPSjMp"
                id="form-file-upload"
              >
                <input
                  class="sc-gxMtzJ Iiibh"
                  id="input-file-upload"
                  name="Cashtab Dragger"
                  type="file"
                />
                <label
                  class="sc-gzOgki gRIslG"
                  for="input-file-upload"
                  id="label-file-upload"
                >
                  <div
                    class="sc-kPVwWT bqsfkj"
                  >
                    <p
                      class="sc-hwwEjo kIFSBP"
                    >
                      Drag and drop a png or jpg for your
                       
                      token icon
                    </p>
                    <div
                      class="sc-iyvyFf ljJZHQ"
                    >
                      or click to upload
                    </div>
                  </div>
                </label>
              </form>
              <button
                class="sc-iQKALj sc-hrWEMg cTCrTT"
                style="margin-top: 30px; margin-bottom: 0px;"
              >
                Create eToken
              </button>
            </div>
          </div>
        </div>
        <div
          class="sc-jqIZGH liMLhn"
        >
          <button
            class="sc-iCwjlJ iBRJBY"
          >
            <svg />
          </button>
          <button
            aria-label="Send Screen"
            class="sc-iCwjlJ iBRJBY"
            style="padding-bottom: 10px;"
          >
            <div
              class="sc-iwsKbI cuDgAv"
            >
              <svg
                title="tx-sent"
              />
            </div>
          </button>
          <button
            aria-label="Tokens"
            class="sc-iCwjlJ iBRJBY"
          >
            <svg
              title="Tokens"
            />
          </button>
          <button
            aria-label="Receive"
            class="sc-iCwjlJ iBRJBY"
          >
            <svg
              title="tx-received"
            />
          </button>
          <div
            class="sc-jMMfwr fjefLk"
            title="Show Other Screens"
          >
            <span
              class="sc-jGxEUC cdEtIo"
            />
            <div
              class="sc-jdeSqf sDdDy"
              title="Other Screens"
            >
              <button
                class="sc-cBrjTV kjRyCE"
              >
                 
                <p>
                  Wallet Backup
                </p>
                <svg
                  title="wallet"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                 
                <p>
                  Wallets
                </p>
                <svg
                  title="wallets"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                 
                <p>
                  Contacts
                </p>
                <svg
                  title="Contact List"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                 
                <p>
                  Airdrop
                </p>
                <svg
                  title="tx-airdrop"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                 
                <p>
                  Rewards
                </p>
                <svg
                  title="Cashtab Rewards"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                 
                <p>
                  Swap
                </p>
                <svg
                  title="swap"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                <p>
                  Sign & Verify
                </p>
                <svg
                  class="sc-htpNat bPFBeM"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                <p>
                  Settings
                </p>
                <svg
                  title="settings"
                />
              </button>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</body>
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findByText (/work/cashtab/src/components/Etokens/__tests__/CreateTokenForm.test.js:256:29)
====== CashTab Unit Tests: <CreateTokenForm /> User can create an NFT collection ======
Error: Unable to find an element with the text: NFT Collection created!. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-cZBZkQ dmqzpG"
    >
      <div
        class="Toastify"
      >
        <div
          class="Toastify__toast-container Toastify__toast-container--top-right sc-hRmvpr hPqicN"
        >
          <div
            class="Toastify__toast Toastify__toast-theme--light Toastify__toast--error Toastify__toast--close-on-click Toastify--animate Toastify__bounce-enter--top-right"
            data-in="true"
            id="3"
          >
            <div
              class="Toastify__toast-body"
              role="alert"
            >
              <div
                class="Toastify__toast-icon Toastify--animate-icon Toastify__zoom-enter"
              >
                <svg
                  fill="var(--toastify-icon-color-error)"
                  height="100%"
                  viewBox="0 0 24 24"
                  width="100%"
                >
                  <path
                    d="M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z"
                  />
                </svg>
              </div>
              <div>
                Error: Cashtab only supports slpv1 genesis txs for fixed supply tokens or tokens with mint baton at index 2
              </div>
            </div>
            <button
              aria-label="close"
              class="Toastify__close-button Toastify__close-button--light"
              type="button"
            >
              <svg
                aria-hidden="true"
                viewBox="0 0 14 16"
              >
                <path
                  d="M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z"
                  fill-rule="evenodd"
                />
              </svg>
            </button>
            <div
              class="Toastify__progress-bar--wrp"
              data-hidden="false"
            >
              <div
                class="Toastify__progress-bar--bg Toastify__progress-bar-theme--light Toastify__progress-bar--error"
              />
              <div
                aria-hidden="false"
                aria-label="notification timer"
                class="Toastify__progress-bar Toastify__progress-bar--animated Toastify__progress-bar-theme--light Toastify__progress-bar--error"
                role="progressbar"
                style="animation-duration: 5000ms; animation-play-state: paused;"
              />
            </div>
          </div>
        </div>
      </div>
      <div
        class="sc-ecaExY iQOLFd"
      >
        <div
          class="sc-gbzWSY kJQVXT"
        >
          <div
            class="sc-jUpvKA hWBhJE"
          >
            <img
              alt="cashtab"
              class="sc-jdfcpN fMsqkO"
              src="test-file-stub"
            />
          </div>
          <div
            class="sc-ccSCjj bRwaaF"
          >
            <select
              class="sc-jKmXuR ghsHAA"
              id="wallets"
              name="wallets"
            >
              <option
                class="sc-elNKlv lejcCI"
                value="Transaction Fixtures"
              >
                Transaction Fixtures
              </option>
            </select>
            <div
              class="sc-cJOK fzhzzA"
            >
              <button
                aria-label="Copy ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g"
                class="sc-epnACN gliRiA"
              >
                <svg
                  title="copy-paste"
                />
              </button>
              <div
                class="sc-eilVRo kNDvpj"
              >
                <div
                  class="sc-eerKOB VCLyQ"
                >
                  <input
                    checked=""
                    class="sc-bnXvFD clpqCe"
                    id="show-hide-balance"
                    name="show-hide-balance"
                    title="show-hide-balance"
                    type="checkbox"
                  />
                  <label
                    class="sc-emmjRN bKoUpK"
                    for="show-hide-balance"
                  >
                    <span
                      class="sc-cpmLhU prmji"
                      data-off=""
                      data-on=""
                    />
                    <span
                      class="sc-dymIpo kCLFY"
                    />
                  </label>
                </div>
              </div>
            </div>
          </div>
          <div
            class="sc-eopZyb fXQpgT"
            title="Wallet Info"
          >
            <div
              class="sc-hUMlYv bzwofi"
              title="Balance in XEC"
            >
              9,513.12
               
              XEC
               
            </div>
            <div
              class="sc-ESoVU bepyIT"
              title="Balance in Local Currency"
            >
              $
              0.29
               
              USD
            </div>
            <p
              class="sc-kkbgRg hBKjWJ"
              title="Price in Local Currency"
            >
              1 
              XEC
               = 
              0.00003000
               
              USD
            </p>
          </div>
          <div
            class="sc-fkyLDJ tVOMB"
          >
            <h3
              class="sc-TFwJa jOuJNx"
            >
              Create 
              NFT Collection
            </h3>
            <div
              class="sc-gFaPwZ lisNYs"
            >
              <div
                class="sc-gGBfsJ bcyGFW"
              >
                <div
                  class="sc-jnlKLf iMOzHB"
                >
                  <input
                    class="sc-fYxtnH klrORb"
                    name="name"
                    placeholder="Enter a name for your NFT collection"
                    value="The Four Half-Coins of Jin-qua (4HC)"
                  />
                </div>
                <div
                  class="sc-btzYZH cBIGTs"
                />
              </div>
              <div
                class="sc-gGBfsJ bcyGFW"
              >
                <div
                  class="sc-jnlKLf iMOzHB"
                >
                  <input
                    class="sc-fYxtnH klrORb"
                    name="ticker"
                    placeholder="Enter a ticker for your NFT collection"
                    value="4HC"
                  />
                </div>
                <div
                  class="sc-btzYZH cBIGTs"
                />
              </div>
              <div
                class="sc-gGBfsJ bcyGFW"
              >
                <div
                  class="sc-jnlKLf iMOzHB"
                >
                  <input
                    class="sc-fYxtnH gIgQWR"
                    disabled=""
                    name="decimals"
                    placeholder="Enter number of decimal places"
                    value="0"
                  />
                </div>
                <div
                  class="sc-btzYZH cBIGTs"
                />
              </div>
              <div
                class="sc-gGBfsJ bcyGFW"
              >
                <div
                  class="sc-jnlKLf iMOzHB"
                >
                  <input
                    class="sc-fYxtnH sc-ktHwxA ekzRpS"
                    name="genesisQty"
                    placeholder="Enter NFT collection size"
                    step="1"
                    type="number"
                    value="4"
                  />
                  <button
                    class="sc-cIShpX sc-kafWEX bMKAaj"
                  >
                    max
                  </button>
                </div>
                <div
                  class="sc-btzYZH cBIGTs"
                />
              </div>
              <div
                class="sc-gGBfsJ bcyGFW"
              >
                <div
                  class="sc-jnlKLf iMOzHB"
                >
                  <input
                    class="sc-fYxtnH klrORb"
                    name="url"
                    placeholder="Enter a website for your NFT collection"
                    value="en.wikipedia.org/wiki/Tai-Pan_(novel)"
                  />
                </div>
                <div
                  class="sc-btzYZH cBIGTs"
                />
              </div>
              <div
                class="sc-fhYwyz OHTJW"
              >
                <div
                  class="sc-eilVRo kNDvpj"
                >
                  <div
                    class="sc-eerKOB kmWaKQ"
                  >
                    <input
                      class="sc-bnXvFD clpqCe"
                      id="Toggle Mint Baton"
                      name="Toggle Mint Baton"
                      title="Toggle Mint Baton"
                      type="checkbox"
                    />
                    <label
                      class="sc-emmjRN bKoUpK"
                      for="Toggle Mint Baton"
                    >
                      <span
                        class="sc-cpmLhU bOTgFW"
                        data-off="Fixed"
                        data-on="Variable"
                      />
                      <span
                        class="sc-dymIpo kkkpuN"
                      />
                    </label>
                  </div>
                </div>
                <div
                  class="sc-jzgbtB gcTAXe"
                >
                  NFT Collection Size
                </div>
              </div>
              <form
                class="sc-dfVpRl bPSjMp"
                id="form-file-upload"
              >
                <input
                  class="sc-gxMtzJ Iiibh"
                  id="input-file-upload"
                  name="Cashtab Dragger"
                  type="file"
                />
                <label
                  class="sc-gzOgki gRIslG"
                  for="input-file-upload"
                  id="label-file-upload"
                >
                  <div
                    class="sc-kPVwWT bqsfkj"
                  >
                    <p
                      class="sc-hwwEjo kIFSBP"
                    >
                      Drag and drop a png or jpg for your
                       
                      token icon
                    </p>
                    <div
                      class="sc-iyvyFf ljJZHQ"
                    >
                      or click to upload
                    </div>
                  </div>
                </label>
              </form>
              <button
                class="sc-iQKALj sc-hrWEMg cTCrTT"
                style="margin-top: 30px; margin-bottom: 0px;"
              >
                Create NFT Collection
              </button>
            </div>
          </div>
        </div>
        <div
          class="sc-jqIZGH liMLhn"
        >
          <button
            class="sc-iCwjlJ iBRJBY"
          >
            <svg />
          </button>
          <button
            aria-label="Send Screen"
            class="sc-iCwjlJ iBRJBY"
            style="padding-bottom: 10px;"
          >
            <div
              class="sc-iwsKbI cuDgAv"
            >
              <svg
                title="tx-sent"
              />
            </div>
          </button>
          <button
            aria-label="Tokens"
            class="sc-iCwjlJ iBRJBY"
          >
            <svg
              title="Tokens"
            />
          </button>
          <button
            aria-label="Receive"
            class="sc-iCwjlJ iBRJBY"
          >
            <svg
              title="tx-received"
            />
          </button>
          <div
            class="sc-jMMfwr fjefLk"
            title="Show Other Screens"
          >
            <span
              class="sc-jGxEUC cdEtIo"
            />
            <div
              class="sc-jdeSqf sDdDy"
              title="Other Screens"
            >
              <button
                class="sc-cBrjTV kjRyCE"
              >
                 
                <p>
                  Wallet Backup
                </p>
                <svg
                  title="wallet"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                 
                <p>
                  Wallets
                </p>
                <svg
                  title="wallets"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                 
                <p>
                  Contacts
                </p>
                <svg
                  title="Contact List"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                 
                <p>
                  Airdrop
                </p>
                <svg
                  title="tx-airdrop"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                 
                <p>
                  Rewards
                </p>
                <svg
                  title="Cashtab Rewards"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                 
                <p>
                  Swap
                </p>
                <svg
                  title="swap"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                <p>
                  Sign & Verify
                </p>
                <svg
                  class="sc-htpNat bPFBeM"
                />
              </button>
              <button
                class="sc-cBrjTV kjRyCE"
              >
                <p>
                  Settings
                </p>
                <svg
                  title="settings"
                />
              </button>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</body>
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findByText (/work/cashtab/src/components/Etokens/__tests__/CreateTokenForm.test.js:338:26)
====== CashTab Unit Tests: <Token /> available actions rendered We can correctly render an SLP1 NFT Parent token with no NFT Mint inputs, then create some NFT Mint inputs ======
Error: Unable to find an element with the text: NFT Mint inputs created. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-cZBZkQ dmqzpG"
    >
      <div
        class="Toastify"
      >
        <div
          class="Toastify__toast-container Toastify__toast-container--top-right sc-hRmvpr hPqicN"
        >
          <div
            class="Toastify__toast Toastify__toast-theme--light Toastify__toast--error Toastify__toast--close-on-click Toastify--animate Toastify__bounce-enter--top-right"
            data-in="true"
            id="1"
          >
            <div
              class="Toastify__toast-body"
              role="alert"
            >
              <div
                class="Toastify__toast-icon Toastify--animate-icon Toastify__zoom-enter"
              >
                <svg
                  fill="var(--toastify-icon-color-error)"
                  height="100%"
                  viewBox="0 0 24 24"
                  width="100%"
                >
                  <path
                    d="M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z"
                  />
                </svg>
              </div>
              <div>
                TypeError: Cannot read properties of undefined (reading 'txid')
              </div>
            </div>
            <button
              aria-label="close"
              class="Toastify__close-button Toastify__close-button--light"
              type="button"
            >
              <svg
                aria-hidden="true"
                viewBox="0 0 14 16"
              >
                <path
                  d="M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z"
                  fill-rule="evenodd"
                />
              </svg>
            </button>
            <div
              class="Toastify__progress-bar--wrp"
              data-hidden="false"
            >
              <div
                class="Toastify__progress-bar--bg Toastify__progress-bar-theme--light Toastify__progress-bar--error"
              />
              <div
                aria-hidden="false"
                aria-label="notification timer"
                class="Toastify__progress-bar Toastify__progress-bar--animated Toastify__progress-bar-theme--light Toastify__progress-bar--error"
                role="progressbar"
                style="animation-duration: 5000ms; animation-play-state: paused;"
              />
            </div>
          </div>
        </div>
      </div>
      <div
        class="sc-ecaExY iQOLFd"
      >
        <div
          class="sc-gbzWSY kJQVXT"
        >
          <div
            class="sc-jUpvKA hWBhJE"
          >
            <img
              alt="cashtab"
              class="sc-jdfcpN fMsqkO"
              src="test-file-stub"
            />
          </div>
          <div
            class="sc-ccSCjj bRwaaF"
          >
            <select
              class="sc-jKmXuR ghsHAA"
              id="wallets"
              name="wallets"
            >
              <option
                class="sc-elNKlv lejcCI"
                value="Token Test"
              >
                Token Test
              </option>
            </select>
            <div
              class="sc-cJOK fzhzzA"
            >
              <button
                aria-label="Copy ecash:qqq9f9z3uhpzkxrgdjkd7dxuuey7tmpmugpmnw0kue"
                class="sc-epnACN gliRiA"
              >
                <svg
                  title="copy-paste"
                />
              </button>
              <div
                class="sc-eilVRo kNDvpj"
              >
                <div
                  class="sc-eerKOB VCLyQ"
                >
                  <input
                    checked=""
                    class="sc-bnXvFD clpqCe"
                    id="show-hide-balance"
                    name="show-hide-balance"
                    title="show-hide-balance"
                    type="checkbox"
                  />
                  <label
                    class="sc-emmjRN bKoUpK"
                    for="show-hide-balance"
                  >
                    <span
                      class="sc-cpmLhU prmji"
                      data-off=""
                      data-on=""
                    />
                    <span
                      class="sc-dymIpo kCLFY"
                    />
                  </label>
                </div>
              </div>
            </div>
          </div>
          <div
            class="sc-eopZyb fXQpgT"
            title="Wallet Info"
          >
            <div
              class="sc-hUMlYv bzwofi"
              title=...
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findByText (/work/cashtab/src/components/Etokens/__tests__/TokenActions.test.js:318:26)
====== CashTab Unit Tests: <Token /> available actions rendered We can correctly render an SLP1 NFT Parent token with NFT Mint inputs, then mint an NFT ======
Error: Unable to find an element with the text: NFT Minted!. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-cZBZkQ dmqzpG"
    >
      <div
        class="Toastify"
      >
        <div
          class="Toastify__toast-container Toastify__toast-container--top-right sc-hRmvpr hPqicN"
        >
          <div
            class="Toastify__toast Toastify__toast-theme--light Toastify__toast--error Toastify__toast--close-on-click Toastify--animate Toastify__bounce-enter--top-right"
            data-in="true"
            id="2"
          >
            <div
              class="Toastify__toast-body"
              role="alert"
            >
              <div
                class="Toastify__toast-icon Toastify--animate-icon Toastify__zoom-enter"
              >
                <svg
                  fill="var(--toastify-icon-color-error)"
                  height="100%"
                  viewBox="0 0 24 24"
                  width="100%"
                >
                  <path
                    d="M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z"
                  />
                </svg>
              </div>
              <div>
                TypeError: Cannot read properties of undefined (reading 'length')
              </div>
            </div>
            <button
              aria-label="close"
              class="Toastify__close-button Toastify__close-button--light"
              type="button"
            >
              <svg
                aria-hidden="true"
                viewBox="0 0 14 16"
              >
                <path
                  d="M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z"
                  fill-rule="evenodd"
                />
              </svg>
            </button>
            <div
              class="Toastify__progress-bar--wrp"
              data-hidden="false"
            >
              <div
                class="Toastify__progress-bar--bg Toastify__progress-bar-theme--light Toastify__progress-bar--error"
              />
              <div
                aria-hidden="false"
                aria-label="notification timer"
                class="Toastify__progress-bar Toastify__progress-bar--animated Toastify__progress-bar-theme--light Toastify__progress-bar--error"
                role="progressbar"
                style="animation-duration: 5000ms; animation-play-state: paused;"
              />
            </div>
          </div>
        </div>
      </div>
      <div
        class="sc-ecaExY iQOLFd"
      >
        <div
          class="sc-gbzWSY kJQVXT"
        >
          <div
            class="sc-jUpvKA hWBhJE"
          >
            <img
              alt="cashtab"
              class="sc-jdfcpN fMsqkO"
              src="test-file-stub"
            />
          </div>
          <div
            class="sc-ccSCjj bRwaaF"
          >
            <select
              class="sc-jKmXuR ghsHAA"
              id="wallets"
              name="wallets"
            >
              <option
                class="sc-elNKlv lejcCI"
                value="Token Test"
              >
                Token Test
              </option>
            </select>
            <div
              class="sc-cJOK fzhzzA"
            >
              <button
                aria-label="Copy ecash:qqq9f9z3uhpzkxrgdjkd7dxuuey7tmpmugpmnw0kue"
                class="sc-epnACN gliRiA"
              >
                <svg
                  title="copy-paste"
                />
              </button>
              <div
                class="sc-eilVRo kNDvpj"
              >
                <div
                  class="sc-eerKOB VCLyQ"
                >
                  <input
                    checked=""
                    class="sc-bnXvFD clpqCe"
                    id="show-hide-balance"
                    name="show-hide-balance"
                    title="show-hide-balance"
                    type="checkbox"
                  />
                  <label
                    class="sc-emmjRN bKoUpK"
                    for="show-hide-balance"
                  >
                    <span
                      class="sc-cpmLhU prmji"
                      data-off=""
                      data-on=""
                    />
                    <span
                      class="sc-dymIpo kCLFY"
                    />
                  </label>
                </div>
              </div>
            </div>
          </div>
          <div
            class="sc-eopZyb fXQpgT"
            title="Wallet Info"
          >
            <div
              class="sc-hUMlYv bzwofi"
              title=...
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findByText (/work/cashtab/src/components/Etokens/__tests__/TokenActions.test.js:477:29)
====== CashTab Unit Tests: <Token /> available actions rendered SLP1 NFT ======
Error: Unable to find an element with the text: NFT sent. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-cZBZkQ dmqzpG"
    >
      <div
        class="Toastify"
      >
        <div
          class="Toastify__toast-container Toastify__toast-container--top-right sc-hRmvpr hPqicN"
        >
          <div
            class="Toastify__toast Toastify__toast-theme--light Toastify__toast--error Toastify__toast--close-on-click Toastify--animate Toastify__bounce-enter--top-right"
            data-in="true"
            id="3"
          >
            <div
              class="Toastify__toast-body"
              role="alert"
            >
              <div
                class="Toastify__toast-icon Toastify--animate-icon Toastify__zoom-enter"
              >
                <svg
                  fill="var(--toastify-icon-color-error)"
                  height="100%"
                  viewBox="0 0 24 24"
                  width="100%"
                >
                  <path
                    d="M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z"
                  />
                </svg>
              </div>
              <div>
                TypeError: Cannot read properties of undefined (reading 'txid')
              </div>
            </div>
            <button
              aria-label="close"
              class="Toastify__close-button Toastify__close-button--light"
              type="button"
            >
              <svg
                aria-hidden="true"
                viewBox="0 0 14 16"
              >
                <path
                  d="M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z"
                  fill-rule="evenodd"
                />
              </svg>
            </button>
            <div
              class="Toastify__progress-bar--wrp"
              data-hidden="false"
            >
              <div
                class="Toastify__progress-bar--bg Toastify__progress-bar-theme--light Toastify__progress-bar--error"
              />
              <div
                aria-hidden="false"
                aria-label="notification timer"
                class="Toastify__progress-bar Toastify__progress-bar--animated Toastify__progress-bar-theme--light Toastify__progress-bar--error"
                role="progressbar"
                style="animation-duration: 5000ms; animation-play-state: paused;"
              />
            </div>
          </div>
        </div>
      </div>
      <div
        class="sc-ecaExY iQOLFd"
      >
        <div
          class="sc-gbzWSY kJQVXT"
        >
          <div
            class="sc-jUpvKA hWBhJE"
          >
            <img
              alt="cashtab"
              class="sc-jdfcpN fMsqkO"
              src="test-file-stub"
            />
          </div>
          <div
            class="sc-ccSCjj bRwaaF"
          >
            <select
              class="sc-jKmXuR ghsHAA"
              id="wallets"
              name="wallets"
            >
              <option
                class="sc-elNKlv lejcCI"
                value="Token Test"
              >
                Token Test
              </option>
            </select>
            <div
              class="sc-cJOK fzhzzA"
            >
              <button
                aria-label="Copy ecash:qqq9f9z3uhpzkxrgdjkd7dxuuey7tmpmugpmnw0kue"
                class="sc-epnACN gliRiA"
              >
                <svg
                  title="copy-paste"
                />
              </button>
              <div
                class="sc-eilVRo kNDvpj"
              >
                <div
                  class="sc-eerKOB VCLyQ"
                >
                  <input
                    checked=""
                    class="sc-bnXvFD clpqCe"
                    id="show-hide-balance"
                    name="show-hide-balance"
                    title="show-hide-balance"
                    type="checkbox"
                  />
                  <label
                    class="sc-emmjRN bKoUpK"
                    for="show-hide-balance"
                  >
                    <span
                      class="sc-cpmLhU prmji"
                      data-off=""
                      data-on=""
                    />
                    <span
                      class="sc-dymIpo kCLFY"
                    />
                  </label>
                </div>
              </div>
            </div>
          </div>
          <div
            class="sc-eopZyb fXQpgT"
            title="Wallet Info"
          >
            <div
              class="sc-hUMlYv bzwofi"
              title=...
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findByText (/work/cashtab/src/components/Etokens/__tests__/TokenActions.test.js:700:29)
====== CashTab Unit Tests: <Token /> Renders the send token notification upon successful broadcast ======
Error: Unable to find an element with the text: eToken sent. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-cZBZkQ dmqzpG"
    >
      <div
        class="Toastify"
      >
        <div
          class="Toastify__toast-container Toastify__toast-container--top-right sc-hRmvpr hPqicN"
        >
          <div
            class="Toastify__toast Toastify__toast-theme--light Toastify__toast--error Toastify__toast--close-on-click Toastify--animate Toastify__bounce-enter--top-right"
            data-in="true"
            id="1"
          >
            <div
              class="Toastify__toast-body"
              role="alert"
            >
              <div
                class="Toastify__toast-icon Toastify--animate-icon Toastify__zoom-enter"
              >
                <svg
                  fill="var(--toastify-icon-color-error)"
                  height="100%"
                  viewBox="0 0 24 24"
                  width="100%"
                >
                  <path
                    d="M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z"
                  />
                </svg>
              </div>
              <div>
                TypeError: Cannot read properties of undefined (reading 'txid')
              </div>
            </div>
            <button
              aria-label="close"
              class="Toastify__close-button Toastify__close-button--light"
              type="button"
            >
              <svg
                aria-hidden="true"
                viewBox="0 0 14 16"
              >
                <path
                  d="M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z"
                  fill-rule="evenodd"
                />
              </svg>
            </button>
            <div
              class="Toastify__progress-bar--wrp"
              data-hidden="false"
            >
              <div
                class="Toastify__progress-bar--bg Toastify__progress-bar-theme--light Toastify__progress-bar--error"
              />
              <div
                aria-hidden="false"
                aria-label="notification timer"
                class="Toastify__progress-bar Toastify__progress-bar--animated Toastify__progress-bar-theme--light Toastify__progress-bar--error"
                role="progressbar"
                style="animation-duration: 5000ms; animation-play-state: paused;"
              />
            </div>
          </div>
        </div>
      </div>
      <div
        class="sc-ecaExY iQOLFd"
      >
        <div
          class="sc-gbzWSY kJQVXT"
        >
          <div
            class="sc-jUpvKA hWBhJE"
          >
            <img
              alt="cashtab"
              class="sc-jdfcpN fMsqkO"
              src="test-file-stub"
            />
          </div>
          <div
            class="sc-ccSCjj bRwaaF"
          >
            <select
              class="sc-jKmXuR ghsHAA"
              id="wallets"
              name="wallets"
            >
              <option
                class="sc-elNKlv lejcCI"
                value="Transaction Fixtures"
              >
                Transaction Fixtures
              </option>
            </select>
            <div
              class="sc-cJOK fzhzzA"
            >
              <button
                aria-label="Copy ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g"
                class="sc-epnACN gliRiA"
              >
                <svg
                  title="copy-paste"
                />
              </button>
              <div
                class="sc-eilVRo kNDvpj"
              >
                <div
                  class="sc-eerKOB VCLyQ"
                >
                  <input
                    checked=""
                    class="sc-bnXvFD clpqCe"
                    id="show-hide-balance"
                    name="show-hide-balance"
                    title="show-hide-balance"
                    type="checkbox"
                  />
                  <label
                    class="sc-emmjRN bKoUpK"
                    for="show-hide-balance"
                  >
                    <span
                      class="sc-cpmLhU prmji"
                      data-off=""
                      data-on=""
                    />
                    <span
                      class="sc-dymIpo kCLFY"
                    />
                  </label>
                </div>
              </div>
            </div>
          </div>
          <div
            class="sc-eopZyb fXQpgT"
            title="Wallet Info"
          >
            <div
              class="sc-hUMlYv bzwofi"
             ...
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findByText (/work/cashtab/src/components/Etokens/__tests__/Token.test.js:539:59)
====== CashTab Unit Tests: <Token /> Renders the burn token success notification upon successful burn tx broadcast ======
Error: Unable to find an element with the text:    Burn successful. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-cZBZkQ dmqzpG"
    >
      <div
        class="Toastify"
      >
        <div
          class="Toastify__toast-container Toastify__toast-container--top-right sc-hRmvpr hPqicN"
        >
          <div
            class="Toastify__toast Toastify__toast-theme--light Toastify__toast--error Toastify__toast--close-on-click Toastify--animate Toastify__bounce-enter--top-right"
            data-in="true"
            id="2"
          >
            <div
              class="Toastify__toast-body"
              role="alert"
            >
              <div
                class="Toastify__toast-icon Toastify--animate-icon Toastify__zoom-enter"
              >
                <svg
                  fill="var(--toastify-icon-color-error)"
                  height="100%"
                  viewBox="0 0 24 24"
                  width="100%"
                >
                  <path
                    d="M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z"
                  />
                </svg>
              </div>
              <div>
                TypeError: Cannot read properties of undefined (reading 'txid')
              </div>
            </div>
            <button
              aria-label="close"
              class="Toastify__close-button Toastify__close-button--light"
              type="button"
            >
              <svg
                aria-hidden="true"
                viewBox="0 0 14 16"
              >
                <path
                  d="M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z"
                  fill-rule="evenodd"
                />
              </svg>
            </button>
            <div
              class="Toastify__progress-bar--wrp"
              data-hidden="false"
            >
              <div
                class="Toastify__progress-bar--bg Toastify__progress-bar-theme--light Toastify__progress-bar--error"
              />
              <div
                aria-hidden="false"
                aria-label="notification timer"
                class="Toastify__progress-bar Toastify__progress-bar--animated Toastify__progress-bar-theme--light Toastify__progress-bar--error"
                role="progressbar"
                style="animation-duration: 5000ms; animation-play-state: paused;"
              />
            </div>
          </div>
        </div>
      </div>
      <div
        class="sc-ecaExY iQOLFd"
      >
        <div
          class="sc-gbzWSY kJQVXT"
        >
          <div
            class="sc-jUpvKA hWBhJE"
          >
            <img
              alt="cashtab"
              class="sc-jdfcpN fMsqkO"
              src="test-file-stub"
            />
          </div>
          <div
            class="sc-ccSCjj bRwaaF"
          >
            <select
              class="sc-jKmXuR ghsHAA"
              id="wallets"
              name="wallets"
            >
              <option
                class="sc-elNKlv lejcCI"
                value="Transaction Fixtures"
              >
                Transaction Fixtures
              </option>
            </select>
            <div
              class="sc-cJOK fzhzzA"
            >
              <button
                aria-label="Copy ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g"
                class="sc-epnACN gliRiA"
              >
                <svg
                  title="copy-paste"
                />
              </button>
              <div
                class="sc-eilVRo kNDvpj"
              >
                <div
                  class="sc-eerKOB VCLyQ"
                >
                  <input
                    checked=""
                    class="sc-bnXvFD clpqCe"
                    id="show-hide-balance"
                    name="show-hide-balance"
                    title="show-hide-balance"
                    type="checkbox"
                  />
                  <label
                    class="sc-emmjRN bKoUpK"
                    for="show-hide-balance"
                  >
                    <span
                      class="sc-cpmLhU prmji"
                      data-off=""
                      data-on=""
                    />
                    <span
                      class="sc-dymIpo kCLFY"
                    />
                  </label>
                </div>
              </div>
            </div>
          </div>
          <div
            class="sc-eopZyb fXQpgT"
            title="Wallet Info"
          >
            <div
              class="sc-hUMlYv bzwofi"
             ...
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findByText (/work/cashtab/src/components/Etokens/__tests__/Token.test.js:618:59)
====== CashTab Unit Tests: <Token /> We can mint an slpv1 token if we have a mint baton ======
Error: Unable to find an element with the text: ⚗️ Minted 100.33 CACHET. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-cZBZkQ dmqzpG"
    >
      <div
        class="Toastify"
      >
        <div
          class="Toastify__toast-container Toastify__toast-container--top-right sc-hRmvpr hPqicN"
        >
          <div
            class="Toastify__toast Toastify__toast-theme--light Toastify__toast--error Toastify__toast--close-on-click Toastify--animate Toastify__bounce-enter--top-right"
            data-in="true"
            id="3"
          >
            <div
              class="Toastify__toast-body"
              role="alert"
            >
              <div
                class="Toastify__toast-icon Toastify--animate-icon Toastify__zoom-enter"
              >
                <svg
                  fill="var(--toastify-icon-color-error)"
                  height="100%"
                  viewBox="0 0 24 24"
                  width="100%"
                >
                  <path
                    d="M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z"
                  />
                </svg>
              </div>
              <div>
                TypeError: Cannot read properties of undefined (reading 'txid')
              </div>
            </div>
            <button
              aria-label="close"
              class="Toastify__close-button Toastify__close-button--light"
              type="button"
            >
              <svg
                aria-hidden="true"
                viewBox="0 0 14 16"
              >
                <path
                  d="M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z"
                  fill-rule="evenodd"
                />
              </svg>
            </button>
            <div
              class="Toastify__progress-bar--wrp"
              data-hidden="false"
            >
              <div
                class="Toastify__progress-bar--bg Toastify__progress-bar-theme--light Toastify__progress-bar--error"
              />
              <div
                aria-hidden="false"
                aria-label="notification timer"
                class="Toastify__progress-bar Toastify__progress-bar--animated Toastify__progress-bar-theme--light Toastify__progress-bar--error"
                role="progressbar"
                style="animation-duration: 5000ms; animation-play-state: paused;"
              />
            </div>
          </div>
        </div>
      </div>
      <div
        class="sc-ecaExY iQOLFd"
      >
        <div
          class="sc-gbzWSY kJQVXT"
        >
          <div
            class="sc-jUpvKA hWBhJE"
          >
            <img
              alt="cashtab"
              class="sc-jdfcpN fMsqkO"
              src="test-file-stub"
            />
          </div>
          <div
            class="sc-ccSCjj bRwaaF"
          >
            <select
              class="sc-jKmXuR ghsHAA"
              id="wallets"
              name="wallets"
            >
              <option
                class="sc-elNKlv lejcCI"
                value="Transaction Fixtures"
              >
                Transaction Fixtures
              </option>
            </select>
            <div
              class="sc-cJOK fzhzzA"
            >
              <button
                aria-label="Copy ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g"
                class="sc-epnACN gliRiA"
              >
                <svg
                  title="copy-paste"
                />
              </button>
              <div
                class="sc-eilVRo kNDvpj"
              >
                <div
                  class="sc-eerKOB VCLyQ"
                >
                  <input
                    checked=""
                    class="sc-bnXvFD clpqCe"
                    id="show-hide-balance"
                    name="show-hide-balance"
                    title="show-hide-balance"
                    type="checkbox"
                  />
                  <label
                    class="sc-emmjRN bKoUpK"
                    for="show-hide-balance"
                  >
                    <span
                      class="sc-cpmLhU prmji"
                      data-off=""
                      data-on=""
                    />
                    <span
                      class="sc-dymIpo kCLFY"
                    />
                  </label>
                </div>
              </div>
            </div>
          </div>
          <div
            class="sc-eopZyb fXQpgT"
            title="Wallet Info"
          >
            <div
              class="sc-hUMlYv bzwofi"
             ...
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findByText (/work/cashtab/src/components/Etokens/__tests__/Token.test.js:765:59)
====== CashTab Unit Tests: <Configure /> Setting "ABSOLUTE MINIMUM fees" settings will reduce fees to absolute min ======
Error: Unable to find an element with the text: eToken sent. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-cZBZkQ dmqzpG"
    >
      <div
        class="Toastify"
      >
        <div
          class="Toastify__toast-container Toastify__toast-container--top-right sc-hRmvpr hPqicN"
        >
          <div
            class="Toastify__toast Toastify__toast-theme--light Toastify__toast--error Toastify__toast--close-on-click Toastify--animate Toastify__bounce-enter--top-right"
            data-in="true"
            id="4"
          >
            <div
              class="Toastify__toast-body"
              role="alert"
            >
              <div
                class="Toastify__toast-icon Toastify--animate-icon Toastify__zoom-enter"
              >
                <svg
                  fill="var(--toastify-icon-color-error)"
                  height="100%"
                  viewBox="0 0 24 24"
                  width="100%"
                >
                  <path
                    d="M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z"
                  />
                </svg>
              </div>
              <div>
                TypeError: Cannot read properties of undefined (reading 'txid')
              </div>
            </div>
            <button
              aria-label="close"
              class="Toastify__close-button Toastify__close-button--light"
              type="button"
            >
              <svg
                aria-hidden="true"
                viewBox="0 0 14 16"
              >
                <path
                  d="M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z"
                  fill-rule="evenodd"
                />
              </svg>
            </button>
            <div
              class="Toastify__progress-bar--wrp"
              data-hidden="false"
            >
              <div
                class="Toastify__progress-bar--bg Toastify__progress-bar-theme--light Toastify__progress-bar--error"
              />
              <div
                aria-hidden="false"
                aria-label="notification timer"
                class="Toastify__progress-bar Toastify__progress-bar--animated Toastify__progress-bar-theme--light Toastify__progress-bar--error"
                role="progressbar"
                style="animation-duration: 5000ms; animation-play-state: paused;"
              />
            </div>
          </div>
          <div
            class="Toastify__toast Toastify__toast-theme--light Toastify__toast--default Toastify__toast--close-on-click Toastify--animate Toastify__bounce-enter--top-right"
            data-in="true"
            id="3"
          >
            <div
              class="Toastify__toast-body"
              role="alert"
            >
              <div
                class="Toastify__toast-icon Toastify--animate-icon Toastify__zoom-enter"
              >
                <img
                  height="24px"
                  src="test-file-stub"
                  width="24px"
                />
              </div>
              <div>
                <a
                  class="sc-giadOv haNfQn"
                  href="https://explorer.e.cash/tx/c16de907537369994417459369faad6595842d569b7b4a9544288ac8a4c81dbb"
                  rel="noopener noreferrer"
                  target="_blank"
                >
                  eCash sent
                </a>
              </div>
            </div>
            <button
              aria-label="close"
              class="Toastify__close-button Toastify__close-button--light"
              type="button"
            >
              <svg
                aria-hidden="true"
                viewBox="0 0 14 16"
              >
                <path
                  d="M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z"
                  fill-rule="evenodd"
                />
              </svg>
            </button>
            <div
              class="Toastify__progress-bar--wrp"
              data-hidden="false"
            >
              <div
                class="Toastify__progress-bar--bg Toastify__progress-bar-theme--light Toastify__progress-bar--default"
              />
              <div
                aria-hidden="false"
                aria-label="notification timer"
                class="Toastify__progress-bar Toastify__progress-bar--animated Toastify__progress-bar-theme--light Toastify__progress-bar--default"
                role="progressbar"
                style="animation-duration: 5000ms; animation-play-state: paused;"
              />
            </div>
          </div>
        </div>
      </div>
      <div
        class="sc-ecaExY iQOLFd"
      >
        <div
          class=...
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findByText (/work/cashtab/src/components/Configure/__tests__/Configure.test.js:542:59)
====== CashTab Unit Tests: <SendXec /> Clicking "Send" will send a valid tx with op_return_raw after entry of a valid address and bip21 query string with valid amount and op_return_raw params to Send To field ======
Error: Unable to find an element with the text: eCash sent. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-cZBZkQ dmqzpG"
    >
      <div
        class="Toastify"
      >
        <div
          class="Toastify__toast-container Toastify__toast-container--top-right sc-hRmvpr hPqicN"
        >
          <div
            class="Toastify__toast Toastify__toast-theme--light Toastify__toast--error Toastify__toast--close-on-click Toastify--animate Toastify__bounce-enter--top-right"
            data-in="true"
            id="1"
          >
            <div
              class="Toastify__toast-body"
              role="alert"
            >
              <div
                class="Toastify__toast-icon Toastify--animate-icon Toastify__zoom-enter"
              >
                <svg
                  fill="var(--toastify-icon-color-error)"
                  height="100%"
                  viewBox="0 0 24 24"
                  width="100%"
                >
                  <path
                    d="M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z"
                  />
                </svg>
              </div>
              <div>
                Cannot read properties of undefined (reading 'txid')
              </div>
            </div>
            <button
              aria-label="close"
              class="Toastify__close-button Toastify__close-button--light"
              type="button"
            >
              <svg
                aria-hidden="true"
                viewBox="0 0 14 16"
              >
                <path
                  d="M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z"
                  fill-rule="evenodd"
                />
              </svg>
            </button>
            <div
              class="Toastify__progress-bar--wrp"
              data-hidden="false"
            >
              <div
                class="Toastify__progress-bar--bg Toastify__progress-bar-theme--light Toastify__progress-bar--error"
              />
              <div
                aria-hidden="false"
                aria-label="notification timer"
                class="Toastify__progress-bar Toastify__progress-bar--animated Toastify__progress-bar-theme--light Toastify__progress-bar--error"
                role="progressbar"
                style="animation-duration: 5000ms; animation-play-state: paused;"
              />
            </div>
          </div>
        </div>
      </div>
      <div
        class="sc-ecaExY iQOLFd"
      >
        <div
          class="sc-gbzWSY kJQVXT"
        >
          <div
            class="sc-jUpvKA hWBhJE"
          >
            <img
              alt="cashtab"
              class="sc-jdfcpN fMsqkO"
              src="test-file-stub"
            />
          </div>
          <div
            class="sc-ccSCjj bRwaaF"
          >
            <select
              class="sc-jKmXuR ghsHAA"
              id="wallets"
              name="wallets"
            >
              <option
                class="sc-elNKlv lejcCI"
                value="Transaction Fixtures"
              >
                Transaction Fixtures
              </option>
            </select>
            <div
              class="sc-cJOK fzhzzA"
            >
              <button
                aria-label="Copy ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g"
                class="sc-epnACN gliRiA"
              >
                <svg
                  title="copy-paste"
                />
              </button>
              <div
                class="sc-eilVRo kNDvpj"
              >
                <div
                  class="sc-eerKOB VCLyQ"
                >
                  <input
                    checked=""
                    class="sc-bnXvFD clpqCe"
                    id="show-hide-balance"
                    name="show-hide-balance"
                    title="show-hide-balance"
                    type="checkbox"
                  />
                  <label
                    class="sc-emmjRN bKoUpK"
                    for="show-hide-balance"
                  >
                    <span
                      class="sc-cpmLhU prmji"
                      data-off=""
                      data-on=""
                    />
                    <span
                      class="sc-dymIpo kCLFY"
                    />
                  </label>
                </div>
              </div>
            </div>
          </div>
          <div
            class="sc-eopZyb fXQpgT"
            title="Wallet Info"
          >
            <div
              class="sc-hUMlYv bzwofi"
              title...
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findByText (/work/cashtab/src/components/Send/__tests__/SendXec.test.js:1256:52)
====== CashTab Unit Tests: <SendXec /> We can calculate max send amount with and without a cashtab msg, and send a max sat tx with a cashtab msg ======
Error: expect(element).toHaveValue(9508.97)

Expected the element to have value:
  9508.97
Received:
  9509.22
    at Object.toHaveValue (/work/cashtab/src/components/Send/__tests__/SendXec.test.js:1354:31)
====== CashTab Unit Tests: <SendXec /> If the user has minFeeSends set to true but no longer has the right token amount, the feature is disabled ======
Error: Unable to find an element with the text: eCash sent. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

Ignored nodes: comments, script, style
<body>
  <div>
    <div
      class="sc-cZBZkQ dmqzpG"
    >
      <div
        class="Toastify"
      >
        <div
          class="Toastify__toast-container Toastify__toast-container--top-right sc-hRmvpr hPqicN"
        >
          <div
            class="Toastify__toast Toastify__toast-theme--light Toastify__toast--error Toastify__toast--close-on-click Toastify--animate Toastify__bounce-enter--top-right"
            data-in="true"
            id="2"
          >
            <div
              class="Toastify__toast-body"
              role="alert"
            >
              <div
                class="Toastify__toast-icon Toastify--animate-icon Toastify__zoom-enter"
              >
                <svg
                  fill="var(--toastify-icon-color-error)"
                  height="100%"
                  viewBox="0 0 24 24"
                  width="100%"
                >
                  <path
                    d="M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z"
                  />
                </svg>
              </div>
              <div>
                Cannot read properties of undefined (reading 'txid')
              </div>
            </div>
            <button
              aria-label="close"
              class="Toastify__close-button Toastify__close-button--light"
              type="button"
            >
              <svg
                aria-hidden="true"
                viewBox="0 0 14 16"
              >
                <path
                  d="M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z"
                  fill-rule="evenodd"
                />
              </svg>
            </button>
            <div
              class="Toastify__progress-bar--wrp"
              data-hidden="false"
            >
              <div
                class="Toastify__progress-bar--bg Toastify__progress-bar-theme--light Toastify__progress-bar--error"
              />
              <div
                aria-hidden="false"
                aria-label="notification timer"
                class="Toastify__progress-bar Toastify__progress-bar--animated Toastify__progress-bar-theme--light Toastify__progress-bar--error"
                role="progressbar"
                style="animation-duration: 5000ms; animation-play-state: paused;"
              />
            </div>
          </div>
        </div>
      </div>
      <div
        class="sc-ecaExY iQOLFd"
      >
        <div
          class="sc-gbzWSY kJQVXT"
        >
          <div
            class="sc-jUpvKA hWBhJE"
          >
            <img
              alt="cashtab"
              class="sc-jdfcpN fMsqkO"
              src="test-file-stub"
            />
          </div>
          <div
            class="sc-ccSCjj bRwaaF"
          >
            <select
              class="sc-jKmXuR ghsHAA"
              id="wallets"
              name="wallets"
            >
              <option
                class="sc-elNKlv lejcCI"
                value="Transaction Fixtures"
              >
                Transaction Fixtures
              </option>
            </select>
            <div
              class="sc-cJOK fzhzzA"
            >
              <button
                aria-label="Copy ecash:qqa9lv3kjd8vq7952p7rq0f6lkpqvlu0cydvxtd70g"
                class="sc-epnACN gliRiA"
              >
                <svg
                  title="copy-paste"
                />
              </button>
              <div
                class="sc-eilVRo kNDvpj"
              >
                <div
                  class="sc-eerKOB VCLyQ"
                >
                  <input
                    checked=""
                    class="sc-bnXvFD clpqCe"
                    id="show-hide-balance"
                    name="show-hide-balance"
                    title="show-hide-balance"
                    type="checkbox"
                  />
                  <label
                    class="sc-emmjRN bKoUpK"
                    for="show-hide-balance"
                  >
                    <span
                      class="sc-cpmLhU prmji"
                      data-off=""
                      data-on=""
                    />
                    <span
                      class="sc-dymIpo kCLFY"
                    />
                  </label>
                </div>
              </div>
            </div>
          </div>
          <div
            class="sc-eopZyb fXQpgT"
            title="Wallet Info"
          >
            <div
              class="sc-hUMlYv bzwofi"
              title...
    at waitForWrapper (/work/cashtab/node_modules/@testing-library/dom/dist/wait-for.js:163:27)
    at /work/cashtab/node_modules/@testing-library/dom/dist/query-helpers.js:86:33
    at Object.findByText (/work/cashtab/src/components/Send/__tests__/SendXec.test.js:1499:52)
====== CashTab Unit Tests: <SendXec /> If we type a Cashtab msg, then disable the switch, we send a tx without our typed Cashtab message ======
Error: expect(element).toHaveValue(9508.97)

Expected the element to have value:
  9508.97
Received:
  9509.22
    at Object.toHaveValue (/work/cashtab/src/components/Send/__tests__/SendXec.test.js:1726:31)

Each failure log is accessible here:
CashTab Unit Tests: <CreateTokenForm /> User can input valid token parameters, generate a token, and view a success notification
CashTab Unit Tests: <CreateTokenForm /> User can create a token with a mint baton
CashTab Unit Tests: <CreateTokenForm /> User can create an NFT collection
CashTab Unit Tests: <Token /> available actions rendered We can correctly render an SLP1 NFT Parent token with no NFT Mint inputs, then create some NFT Mint inputs
CashTab Unit Tests: <Token /> available actions rendered We can correctly render an SLP1 NFT Parent token with NFT Mint inputs, then mint an NFT
CashTab Unit Tests: <Token /> available actions rendered SLP1 NFT
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 /> We can mint an slpv1 token if we have a mint baton
CashTab Unit Tests: <Configure /> Setting "ABSOLUTE MINIMUM fees" settings will reduce fees to absolute min
CashTab Unit Tests: <SendXec /> Clicking "Send" will send a valid tx with op_return_raw after entry of a valid address and bip21 query string with valid amount and op_return_raw params to Send To field
CashTab Unit Tests: <SendXec /> We can calculate max send amount with and without a cashtab msg, and send a max sat tx with a cashtab msg
CashTab Unit Tests: <SendXec /> If the user has minFeeSends set to true but no longer has the right token amount, the feature is disabled
CashTab Unit Tests: <SendXec /> If we type a Cashtab msg, then disable the switch, we send a tx without our typed Cashtab message

implementing ecash-lib for generating slp target outputs

Tail of the build log:

   Compiling sha2 v0.10.8
   Compiling ripemd v0.1.3
   Compiling wasm-bindgen-backend v0.2.92
   Compiling secp256k1-abc v0.20.3 (https://github.com/raipay/secp256k1-abc?rev=b23e742#b23e7421)
   Compiling thiserror-impl v1.0.58
   Compiling wasm-bindgen-macro-support v0.2.92
   Compiling wasm-bindgen-macro v0.2.92
   Compiling ecash-lib-wasm v0.1.0 (/work/modules/ecash-lib-wasm)
    Finished release-wasm [optimized] target(s) in 5.58s
/work/modules/ecash-lib /work/modules/ecash-lib-wasm /work/modules/ecash-script /work/modules/chronik-client /work/modules/mock-chronik-client /work/modules/ecashaddrjs /work/abc-ci-builds/cashtab-tests

added 362 packages, and audited 364 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.

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

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

added 1641 packages, and audited 2458 packages in 23s

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

4 vulnerabilities (3 moderate, 1 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

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

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

[eslint] 
src/slpv1/index.js
  Line 5:10:  'BN' is defined but never used                             no-unused-vars
  Line 5:14:  'TokenType1' is defined but never used                     no-unused-vars
  Line 5:26:  'NFT1' is defined but never used                           no-unused-vars
  Line 7:10:  'initializeScript' is defined but never used               no-unused-vars
  Line 8:10:  'opReturn' is defined but never used                       no-unused-vars
  Line 9:13:  'utxolib' is defined but never used                        no-unused-vars
  Line 29:7:  'NFT1_PARENT_DECIMALS' is assigned a value but never used  no-unused-vars

Search for the keywords to learn more about each error.


Build cashtab-tests failed with exit code 1

remove explicit burn function (was never implemented)

Failed tests logs:

====== CashTab Unit Tests: slpv1 methods Generating explicit etoken burn tx target output from in-node utxos getExplicitBurnTargetOutputs: Burn a single token utxo ======
TypeError: (0 , _slpv.getExplicitBurnTargetOutputs) is not a function
    at Object.<anonymous> (/work/cashtab/src/slpv1/__tests__/index.test.js:178:67)
    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: slpv1 methods Generating explicit etoken burn tx target output from in-node utxos getExplicitBurnTargetOutputs: Burns multiple token utxos ======
TypeError: (0 , _slpv.getExplicitBurnTargetOutputs) is not a function
    at Object.<anonymous> (/work/cashtab/src/slpv1/__tests__/index.test.js:178:67)
    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: slpv1 methods Generating explicit etoken burn tx target output from in-node utxos getExplicitBurnTargetOutputs: Burns max slp quantity for 9 decimals ======
TypeError: (0 , _slpv.getExplicitBurnTargetOutputs) is not a function
    at Object.<anonymous> (/work/cashtab/src/slpv1/__tests__/index.test.js:178:67)
    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: slpv1 methods Generating explicit etoken burn tx target output from in-node utxos getExplicitBurnTargetOutputs throws error if called with in-node utxos and no specified decimals ======
Error: expect(received).toThrow(expected)

Expected substring: "Invalid decimals -1 for tokenId 3333333333333333333333333333333333333333333333333333333333333333. Decimals must be an integer 0-9."
Received message:   "(0 , _slpv.getExplicitBurnTargetOutputs) is not a function"

      194 |         it(`getExplicitBurnTargetOutputs throws error if called with in-node utxos and no specified decimals`, () => {
      195 |             expect(() =>
    > 196 |                 getExplicitBurnTargetOutputs([
          |                                             ^
      197 |                     {
      198 |                         value: 546,
      199 |                         token: {

      at src/slpv1/__tests__/index.test.js:196:45
      at Object.<anonymous> (node_modules/expect/build/toThrowMatchers.js:74:11)
      at Object.throwingMatcher [as toThrow] (node_modules/expect/build/index.js:320:21)
      at Object.toThrow (src/slpv1/__tests__/index.test.js:206:15)
    at Object.toThrow (/work/cashtab/src/slpv1/__tests__/index.test.js:206:15)
    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 get the max amount of XEC that a wallet can send We can also determine the max send amount if the user includes a Cashtab Msg ======
TypeError: The "target" argument must be an instance of Buffer or Uint8Array. Received undefined
    at _copy (node:buffer:206:11)
    at Buffer.copy (node:buffer:804:12)
    at copy (/work/modules/ecash-lib/src/tx.ts:178:31)
    at TxBuilder.prepareOutputs (/work/modules/ecash-lib/src/txBuilder.ts:113:44)
    at TxBuilder.prepareOutputs [as sign] (/work/modules/ecash-lib/src/txBuilder.ts:121:63)
    at sign (/work/cashtab/src/transactions/index.js:261:26)
    at Object.<anonymous> (/work/cashtab/src/transactions/__tests__/index.test.js:281:41)
    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)

Each failure log is accessible here:
CashTab Unit Tests: slpv1 methods Generating explicit etoken burn tx target output from in-node utxos getExplicitBurnTargetOutputs: Burn a single token utxo
CashTab Unit Tests: slpv1 methods Generating explicit etoken burn tx target output from in-node utxos getExplicitBurnTargetOutputs: Burns multiple token utxos
CashTab Unit Tests: slpv1 methods Generating explicit etoken burn tx target output from in-node utxos getExplicitBurnTargetOutputs: Burns max slp quantity for 9 decimals
CashTab Unit Tests: slpv1 methods Generating explicit etoken burn tx target output from in-node utxos getExplicitBurnTargetOutputs throws error if called with in-node utxos and no specified decimals
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can get the max amount of XEC that a wallet can send We can also determine the max send amount if the user includes a Cashtab Msg

Failed tests logs:

====== CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can get the max amount of XEC that a wallet can send We can also determine the max send amount if the user includes a Cashtab Msg ======
TypeError: The "target" argument must be an instance of Buffer or Uint8Array. Received undefined
    at _copy (node:buffer:206:11)
    at Buffer.copy (node:buffer:804:12)
    at copy (/work/modules/ecash-lib/src/tx.ts:178:31)
    at TxBuilder.prepareOutputs (/work/modules/ecash-lib/src/txBuilder.ts:113:44)
    at TxBuilder.prepareOutputs [as sign] (/work/modules/ecash-lib/src/txBuilder.ts:121:63)
    at sign (/work/cashtab/src/transactions/index.js:261:26)
    at Object.<anonymous> (/work/cashtab/src/transactions/__tests__/index.test.js:281:41)
    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)

Each failure log is accessible here:
CashTab Unit Tests: Cashtab functions that build and broadcast rawtxs We can get the max amount of XEC that a wallet can send We can also determine the max send amount if the user includes a Cashtab Msg

bytesofman added inline comments.
cashtab/src/components/Etokens/CreateTokenForm/index.js
513 ↗(On Diff #48252)

ecash-lib names its input param for slp 1 genesis functions genesisInfo

This param is used for genesis txs of type 1 tokens, type 1 nft parent, and type 1 nft child

521 ↗(On Diff #48252)

genesisQty is not a param inside genesisInfo for ecash-lib, but is a separate param initialQuantity

524 ↗(On Diff #48252)

mintBatonVout is not a param inside genesisInfo for ecash-lib, but is a separate param mintBatonOutIdx

cashtab/src/opreturn/__tests__/index.test.js
27 ↗(On Diff #48252)

improve the test by simply matching the expected result.

the "can't store buffers in mocks" thing is not really an issue. You can still make the buffers from a hex string in mocks -- or, what we do now as ecash-lib expects it -- we make the Script object in the mocks (from the expected hex string of the OP_RETURN)

cashtab/src/opreturn/fixtures/vectors.js
20 ↗(On Diff #48252)

note that in this diff, we do not expect any OP_RETURN hex to change. Only the type.

cashtab/src/slpv1/__tests__/index.test.js
45 ↗(On Diff #48252)

this test was poorly designed to start with, as I had not figured out a good way to test mock matching (not realizing I could just create the Buffer types in fixtures

Correct this in this diff, since we are not creating the Script types in fixtures

simplifies and improves tests

91 ↗(On Diff #48252)

This used to be "from NNG chronik-client"

During the migration to in-node, I updated to point to in-node mocks.

Didn't realize that we also already had in-node mocks. So, this test is just doing the same thing as the one immediately below it.

Get rid of this one.

309 ↗(On Diff #48252)

I deprecate the getExplicitBurnTargetOutputs function in this diff rather than refactor it with all the other ones.

This is because Cashtab never ended up implementing this function, because explicit burns can only burn whole utxos.

So, to use this function, need to either restrict the amounts a user can burn, or only use explicit burns when the user happens to want to burn an amount that matches utxos, or "prepare" the correct burn amount with a pre-burn tx. Imo all of these are too complicated to justify when "the old way" of SLP1 burning achieves the same result.

cashtab/src/slpv1/fixtures/vectors.js
33 ↗(On Diff #48252)

important to note that initialQuantity must be a BigInt in units of "token satoshis", i.e. the lowest base value of this token.

95 ↗(On Diff #48252)

annoying to review that phab is showin this hex as "new" --- the actual hex is not changing, just the type

before and after:
6a04534c500001010747454e455349530354424307746162636173681768747470733a2f2f636173687461626170702e636f6d2f4c0001000102080000000000000064
6a04534c500001010747454e455349530354424307746162636173681768747470733a2f2f636173687461626170702e636f6d2f4c0001000102080000000000000064

can test quickly enough with ctrl+f

132 ↗(On Diff #48252)

artifact missed in past refactors due to the complicated way the tests used to work (matching length of the targetOutputs array to different values, matching expected keys at expected indices).

157 ↗(On Diff #48252)

we are testing variable supply i.e. we expect a mint baton dust output and a mint qty dust output.

missed in past tests as they were not matching the returned array.

179 ↗(On Diff #48252)

ecash-lib does not throw an error here but instead assumes decimals of 0

Cashtab already handles decimals validation at the UI form level

192 ↗(On Diff #48252)

ecash-lib does not throw an error here. Cashtab already handles this validation at the user entry level.

675 ↗(On Diff #48252)

similar case to what happened above

this test should have 2 dust outputs for tokens, as it has change. Missed before as past tests were not directly testing function output vs mock.

807 ↗(On Diff #48252)

function, tests, and mocks deprecated as not implemented and no plans to implement

cashtab/src/slpv1/index.js
279 ↗(On Diff #48252)

this was never implemented in Cashtab due to user complication of not being able to explicitly burn an amount that does not exactly equal utxo amount(s)

377 ↗(On Diff #48252)

oversight but at the moment low priority. this should have been implemented when NFTs launched.

547 ↗(On Diff #48252)

ecash-lib will accept bigint or number

Fabien requested changes to this revision.Jun 17 2024, 07:18
Fabien added a subscriber: Fabien.

According to your own comments on these changes, there are several parts that can be moved to their own diff to make the review easier. It's already big enough.

This revision now requires changes to proceed.Jun 17 2024, 07:18

can also split out the opreturn tests

Failed tests logs:

====== CashTab Unit Tests: slpv1 methods Generating etoken burn tx target outputs getSlpBurnTargetOutputs: Burn a fraction of balance ======
Error: expect(received).toStrictEqual(expected) // deep equality

Expected: undefined
Received: [{"script": {"bytecode": [106, 4, 83, 76, 80, 0, 1, 1, 4, 83, …]}, "value": 0}, {"value": 546}]
    at Object.toStrictEqual (/work/cashtab/src/slpv1/__tests__/index.test.js:166:19)
    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: slpv1 methods Generating etoken burn tx target outputs getSlpBurnTargetOutputs: Burn all balance ======
Error: expect(received).toStrictEqual(expected) // deep equality

Expected: undefined
Received: [{"script": {"bytecode": [106, 4, 83, 76, 80, 0, 1, 1, 4, 83, …]}, "value": 0}, {"value": 546}]
    at Object.toStrictEqual (/work/cashtab/src/slpv1/__tests__/index.test.js:166:19)
    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)

Each failure log is accessible here:
CashTab Unit Tests: slpv1 methods Generating etoken burn tx target outputs getSlpBurnTargetOutputs: Burn a fraction of balance
CashTab Unit Tests: slpv1 methods Generating etoken burn tx target outputs getSlpBurnTargetOutputs: Burn all balance

rebase, patch test var names

OK -- still a large diff. I do not think additional impact is available by making it smaller.

It is useful to have all tx building and signing handled by one function. Since we are changing this function to make better use of ecash-lib in this diff, we also need to change every helper function at the same time. These changes are all thematically similar:

  • Stop using Buffer type and replace with ecash-lib's native Script

For token txs, we stop using slp-mdm script-building function (which created a Buffer) and instead use ecash-lib script-building function.

This revision is now accepted and ready to land.Jun 18 2024, 08:08