Page MenuHomePhabricator

[Cashtab] Better validation functions for token send or burn amounts
ClosedPublic

Authored by bytesofman on Mar 30 2024, 22:09.

Details

Summary

T3496

Use a standardized and tested validation function for token send or burn amounts.

Currently, Cashtab uses a custom send validation function, and a bad burn validation function (does not check decimals). Use a better function for both since they have the same rules.

Test Plan

npm test

Diff Detail

Repository
rABC Bitcoin ABC
Branch
better-send-validation
Lint
Lint Passed
Unit
No Test Coverage
Build Status
Buildable 28202
Build 55949: Build Diffcashtab-tests
Build 55948: arc lint + arc unit

Event Timeline

Failed tests logs:

====== CashTab Unit Tests: <SendToken /> 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="ant-spin-nested-loading css-dev-only-do-not-override-1rqnfsa"
    >
      <div
        class="ant-spin-container"
      >
        <div
          class="sc-kcDeIU kgKfDI"
        >
          <div
            class="Toastify"
          />
          <div
            class="sc-cmjSyW jwpsva"
          >
            <div
              class="sc-sdtwF ijCnPZ"
            >
              <div
                class="sc-bFADNz cZpbyk"
              >
                <div
                  class="sc-iYUSvU MWsTz"
                >
                  <img
                    alt="cashtab"
                    class="sc-cHSUfg jyjdjN"
                    src="test-file-stub"
                  />
                </div>
                <div
                  class="sc-bbmXgH fLVOGg"
                  data-testid="wallet-info-ctn"
                >
                  <div
                    class="sc-iomxrj dYTJKM"
                  >
                    <select
                      class="sc-dvCyap dfxYvF"
                      id="wallets"
                      name="wallets"
                    >
                      <option
                        class="sc-iFMziU fiPrpy"
                        value="Transaction Fixtures"
                      >
                        Transaction Fixtures
                      </option>
                    </select>
                    <div
                      class="sc-hMqMXs cAbGIb"
                    >
                      <svg
                        class="sc-htoDjs dHRdfz"
                        style="margin-top: 8px;"
                      />
                    </div>
                    <div
                      class="sc-eLExRp icFLqc"
                    >
                      <input
                        checked=""
                        class="sc-fOKMvo cmysrp"
                        data-testid="show-hide-balance"
                        id="show-hide-balance"
                        name="show-hide-balance"
                        type="checkbox"
                      />
                      <label
                        class="sc-cbkKFq kCEdvn"
                        for="show-hide-balance"
                      >
                        <span
                          class="sc-krvtoX cOEecR"
                          data-off=""
                          data-on=""
                        />
                        <span
                          class="sc-fYiAbW ehbNtR"
                        />
                      </label>
                    </div>
                  </div>
                  <div
                    class="sc-keVrkP bVZapW"
                    data-testid="balance-xec"
                  >
                    9,513.12
                     
                    XEC
                     
                  </div>
                  <div
                    class="sc-gVLVqr cpEyGe"
                    data-testid="balance-fiat"
                  >
                    $
                    0.29
                     
                    USD
                  </div>
                  <p
                    class="sc-cBdUnI fWqlMo"
                    data-testid="ecash-price"
                  >
                    1 
                    XEC
                     = 
                    0.00003000
                     
                    USD
                  </p>
                </div>
              </div>
              <div
                class="sc-jqCOkK dpFugr"
              >
                <div
                  class="sc-hmXxxW fkVZQE"
                >
                  1
                   
                  BEAR
                </div>
                <div
                  class="sc-cqCuEk elJtl"
                  title="Token info for \"BearNip\""
                >
                  <div
                    class="sc-dliRfk jZcTsb"
                  >
                    <div
                      class="sc-kLIISr bYcVtm"
                      colspan="2"
                    >
                      <div
                        class="sc-hMqMXs cAbGIb"
                      >
                        <img
                          height="128"
                          src="https://icons.etokens.cash/128/3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109.png"
                          width="128"
                        />
                      </div>
                    </div>
                  </div>
                  <div
                    class="sc-dliRfk jZcTsb"
                  >
                    <div
                      class="sc-kLIISr bYcVtm"
                    >
                      Token Id: 
                      3fe
                      ...
                      109
                    </div>
                    <div
                      class="sc-kLIISr bYcVtm"
                    >
                      <div
                        class="sc-hMqMXs cAbGIb"
                      >
                        <svg
                          class="sc-htoDjs dHRdfz"
                        />
                      </div>
                    </div>
                  </div>
                  <div
                    class="sc-dliRfk jZcTsb"
                  >
                    <div
                      class="sc-kLIISr bYcVtm"
                    >
                      0
                       decimal places
                    </div>
                  </div>
                  <div
                    class="sc-dliRfk jZcTsb"
                  />
                  <div
                    class="sc-dliRfk jZcTsb"
                  >
                    Minted
                     
                    Mar 30, 2024
                  </div>
                  <div
                    class="sc-dliRfk jZcTsb"
                  >
                    Genesis Supply:
                     
                    4,444
                  </div>
                  <div
                    class="sc-dliRfk jZcTsb"
                  >
                    Fixed Supply
                  </div>
                </div>
                <div
                  class="sc-iQNlJl gSDyLy"
                >
                  <div
                    class="sc-bsbRJL gVlzfi"
                  >
                    <input
                      class="sc-hZSUBg sc-esOvli bxcKZR"
                      name="address"
                      placeholder="Address"
                      value="ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6"
                    />
                    <button
                      class="sc-gwVKww iuRbCt"
                      data-testid="scan-qr-code"
                    >
                      <svg />
                    </button>
                  </div>
                  <div
                    class="sc-hORach fnZTRV"
                  />
                </div>
                <div
                  class="sc-iqzUVk giZKtF"
                >
                  <a
                    class="sc-dNLxif idXNLy"
                    href="https://explorer.e.cash/address/false"
                    rel="noreferrer"
                    target="_blank"
                  />
                </div>
                <br />
                <div
                  class="sc-iQNlJl gSDyLy"
                >
                  <div
                    class="sc-bsbRJL gVlzfi"
                  >
                    <input
                      class="sc-hZSUBg sc-esOvli bxcKZR"
                      name="amount"
                      placeholder="Amount"
                      step="1"
                      type="number"
                      value="1"
                    />
                    <button
                      class="sc-cmthru sc-hMFtBS jmuqrV"
                    >
                      max
                    </button>
                  </div>
                  <div
                    class="sc-hORach fnZTRV"
                  />
                </div>
                <button
                  class="sc-ibxdXY sc-hrWEMg dCUaFy"
                  disabled=""
                  style="margin-top: 24px;"
                >
                  Send 
                  BearNip
                </button>
                <div
                  class="sc-cqCuEk elJtl"
                  title="Token info for \"BearNip\""
                >
                  <div
                    class="sc-dliRfk jZcTsb"
                  >
                    <a
                      href="/airdrop"
                      style="width: 100%;"
                    >
                      <button
                        class="sc-ibxdXY sc-iQKALj krPYXi"
                        style="margin-top: 12px;"
                      >
                        Airdrop
                      </button>
                    </a>
                  </div>
                  <div
                    class="sc-dliRfk jZcTsb"
                  >
                    <div
                      class="sc-bMVAic hxyVPp"
                    >
                      <div
                        class="sc-iQNlJl gSDyLy"
                      >
                        <div
                          class="sc-bsbRJL gVlzfi"
                        >
                          <input
                            class="sc-hZSUBg sc-esOvli bxcKZR"
                            name="burnAmount"
                            placeholder="Burn Amount"
                            step="1"
                            type="number"
                            value=""
                          />
                          <button
                            class="sc-cmthru sc-hMFtBS jmuqrV"
                          >
                            max
                          </button>
                        </div>
                        <div
                          class="sc-hORach fnZTRV"
                        />
                      </div>
                      <button
                        class="ant-btn css-dev-only-do-not-override-1rqnfsa ant-btn-primary ant-btn-dangerous"
                        type="button"
                      >
                        <span>
                          Burn BEAR
                        </span>
                      </button>
                    </div>
                  </div>
                </div>
              </div>
            </div>
            <div
              class="sc-BngTV dCDCyP"
            >
              <button
                class="sc-gRnDUn bgTXzO"
              >
                <svg />
              </button>
              <button
                class="sc-gRnDUn bgTXzO"
                data-testid="nav-btn-send"
              >
                <svg
                  class="sc-jKJlTe fTQyTm"
                  style="margin-top: -9px;"
                />
              </button>
              <button
                class="sc-gRnDUn bgTXzO"
                data-testid="nav-btn-etokens"
              >
                <span
                  aria-label="appstore-add"
                  class="anticon anticon-appstore-add"
                  role="img"
                  style="font-size: 24px;"
                >
                  <svg
                    aria-hidden="true"
                    data-icon="appstore-add"
                    fill="currentColor"
                    focusable="false"
                    height="1em"
                    viewBox="64 64 896 896"
                    width="1em"
                  >
                    <defs />
                    <path
                      d="M464 144H160c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm-52 268H212V212h200v200zm452-268H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm-52 268H612V212h200v200zm52 132H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16zm-52 268H612V612h200v200zM424 712H296V584c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v128H104c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h128v128c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V776h128c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z"
                    />
                  </svg>
                </span>
              </button>
              <button
                class="sc-gRnDUn bgTXzO"
                data-testid="nav-btn-receive"
              >
                <svg />
              </button>
              <div
                class="sc-cqpYsc dcCFkQ"
                data-testid="hamburger"
              >
                <span
                  class="sc-hBbWxd gyoWfB"
                />
                <div
                  class="sc-dyGzUR iWnlwd"
                  data-testid="hamburger-menu"
                >
                  <button
                    class="sc-drKuOJ cFmRbo"
                    data-testid="nav-btn-airdrop"
                  >
                     
                    <p>
                      Airdrop
                    </p>
                    <svg
                      height="33px"
                      width="30px"
                    />
                  </button>
                  <button
                    class="sc-drKuOJ cFmRbo"
                    data-testid="nav-btn-swap"
                  >
                     
                    <p>
                      Swap
                    </p>
                    <span
                      aria-label="swap"
                      class="anticon anticon-swap"
                      role="img"
                      style="font-size: 24px;"
                    >
                      <svg
                        aria-hidden="true"
                        data-icon="swap"
                        fill="currentColor"
                        focusable="false"
                        height="1em"
                        viewBox="64 64 896 896"
                        width="1em"
                      >
                        <path
                          d="M847.9 592H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h605.2L612.9 851c-4.1 5.2-.4 13 6.3 13h72.5c4.9 0 9.5-2.2 12.6-6.1l168.8-214.1c16.5-21 1.6-51.8-25.2-51.8zM872 356H266.8l144.3-183c4.1-5.2.4-13-6.3-13h-72.5c-4.9 0-9.5 2.2-12.6 6.1L150.9 380.2c-16.5 21-1.6 51.8 25.1 51.8h696c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8z"
                        />
                      </svg>
                    </span>
                  </button>
                  <button
                    class="sc-drKuOJ cFmRbo"
                    data-testid="nav-btn-signverifymsg"
                  >
                    <p>
                      Sign & Verify
                    </p>
                    <svg
                      class="sc-jzJRlG kclOxT"
                    />
                  </button>
                  <button
                    class="sc-drKuOJ cFmRbo"
                    data-testid="nav-btn-configure"
                  >
                    <p>
                      Settings
                    </p>
                    <svg
                      height="33px"
                      width="30px"
                    />
                  </button>
                </div>
              </div>
            </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/Send/__tests__/SendToken.test.js:465:59)
====== CashTab Unit Tests: <App /> 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="ant-spin-nested-loading css-dev-only-do-not-override-1rqnfsa"
    >
      <div
        class="ant-spin-container"
      >
        <div
          class="sc-kcDeIU kgKfDI"
        >
          <div
            class="Toastify"
          >
            <div
              class="Toastify__toast-container Toastify__toast-container--top-right sc-exkUMo bQfCal"
            >
              <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="4"
              >
                <div
                  class="Toastify__toast-body"
                  role="alert"
                >
                  <div
                    class="Toastify__toast-icon Toastify--animate-icon Toastify__zoom-enter"
                  >
                    <div
                      class="ant-image css-dev-only-do-not-override-1rqnfsa"
                      style="width: 24px; height: 24px;"
                    >
                      <img
                        class="ant-image-img css-dev-only-do-not-override-1rqnfsa"
                        height="24px"
                        src="test-file-stub"
                        style="height: 24px;"
                        width="24px"
                      />
                    </div>
                  </div>
                  <div>
                    <a
                      class="sc-krDsej bDQWZX"
                      href="https://explorer.e.cash/tx/6d2e157e2e2b1fa47cc63ede548375213942e29c090f5d9cbc2722258f720c08"
                      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: running;"
                  />
                </div>
              </div>
            </div>
          </div>
          <div
            class="sc-cmjSyW jwpsva"
          >
            <div
              class="sc-sdtwF ijCnPZ"
            >
              <div
                class="sc-bFADNz cZpbyk"
              >
                <div
                  class="sc-iYUSvU MWsTz"
                >
                  <img
                    alt="cashtab"
                    class="sc-cHSUfg jyjdjN"
                    src="test-file-stub"
                  />
                </div>
                <div
                  class="sc-bbmXgH fLVOGg"
                  data-testid="wallet-info-ctn"
                >
                  <div
                    class="sc-iomxrj dYTJKM"
                  >
                    <select
                      class="sc-dvCyap dfxYvF"
                      id="wallets"
                      name="wallets"
                    >
                      <option
                        class="sc-iFMziU fiPrpy"
                        value="Transaction Fixtures"
                      >
                        Transaction Fixtures
                      </option>
                    </select>
                    <div
                      class="sc-hMqMXs cAbGIb"
                    >
                      <svg
                        class="sc-htoDjs dHRdfz"
                        style="margin-top: 8px;"
                      />
                    </div>
                    <div
                      class="sc-eLExRp icFLqc"
                    >
                      <input
                        checked=""
                        class="sc-fOKMvo cmysrp"
                        data-testid="show-hide-balance"
                        id="show-hide-balance"
                        ...
    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/__tests__/App.test.js:710:59)

Each failure log is accessible here:
CashTab Unit Tests: <SendToken /> Renders the send token notification upon successful broadcast
CashTab Unit Tests: <App /> Setting "ABSOLUTE MINIMUM fees" settings will reduce fees to absolute min

Failed tests logs:

====== CashTab Unit Tests: <SendToken /> 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="ant-spin-nested-loading css-dev-only-do-not-override-1rqnfsa"
    >
      <div
        class="ant-spin-container"
      >
        <div
          class="sc-kcDeIU kgKfDI"
        >
          <div
            class="Toastify"
          />
          <div
            class="sc-cmjSyW jwpsva"
          >
            <div
              class="sc-sdtwF ijCnPZ"
            >
              <div
                class="sc-bFADNz cZpbyk"
              >
                <div
                  class="sc-iYUSvU MWsTz"
                >
                  <img
                    alt="cashtab"
                    class="sc-cHSUfg jyjdjN"
                    src="test-file-stub"
                  />
                </div>
                <div
                  class="sc-bbmXgH fLVOGg"
                  data-testid="wallet-info-ctn"
                >
                  <div
                    class="sc-iomxrj dYTJKM"
                  >
                    <select
                      class="sc-dvCyap dfxYvF"
                      id="wallets"
                      name="wallets"
                    >
                      <option
                        class="sc-iFMziU fiPrpy"
                        value="Transaction Fixtures"
                      >
                        Transaction Fixtures
                      </option>
                    </select>
                    <div
                      class="sc-hMqMXs cAbGIb"
                    >
                      <svg
                        class="sc-htoDjs dHRdfz"
                        style="margin-top: 8px;"
                      />
                    </div>
                    <div
                      class="sc-eLExRp icFLqc"
                    >
                      <input
                        checked=""
                        class="sc-fOKMvo cmysrp"
                        data-testid="show-hide-balance"
                        id="show-hide-balance"
                        name="show-hide-balance"
                        type="checkbox"
                      />
                      <label
                        class="sc-cbkKFq kCEdvn"
                        for="show-hide-balance"
                      >
                        <span
                          class="sc-krvtoX cOEecR"
                          data-off=""
                          data-on=""
                        />
                        <span
                          class="sc-fYiAbW ehbNtR"
                        />
                      </label>
                    </div>
                  </div>
                  <div
                    class="sc-keVrkP bVZapW"
                    data-testid="balance-xec"
                  >
                    9,513.12
                     
                    XEC
                     
                  </div>
                  <div
                    class="sc-gVLVqr cpEyGe"
                    data-testid="balance-fiat"
                  >
                    $
                    0.29
                     
                    USD
                  </div>
                  <p
                    class="sc-cBdUnI fWqlMo"
                    data-testid="ecash-price"
                  >
                    1 
                    XEC
                     = 
                    0.00003000
                     
                    USD
                  </p>
                </div>
              </div>
              <div
                class="sc-jqCOkK dpFugr"
              >
                <div
                  class="sc-hmXxxW fkVZQE"
                >
                  1
                   
                  BEAR
                </div>
                <div
                  class="sc-cqCuEk elJtl"
                  title="Token info for \"BearNip\""
                >
                  <div
                    class="sc-dliRfk jZcTsb"
                  >
                    <div
                      class="sc-kLIISr bYcVtm"
                      colspan="2"
                    >
                      <div
                        class="sc-hMqMXs cAbGIb"
                      >
                        <img
                          height="128"
                          src="https://icons.etokens.cash/128/3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109.png"
                          width="128"
                        />
                      </div>
                    </div>
                  </div>
                  <div
                    class="sc-dliRfk jZcTsb"
                  >
                    <div
                      class="sc-kLIISr bYcVtm"
                    >
                      Token Id: 
                      3fe
                      ...
                      109
                    </div>
                    <div
                      class="sc-kLIISr bYcVtm"
                    >
                      <div
                        class="sc-hMqMXs cAbGIb"
                      >
                        <svg
                          class="sc-htoDjs dHRdfz"
                        />
                      </div>
                    </div>
                  </div>
                  <div
                    class="sc-dliRfk jZcTsb"
                  >
                    <div
                      class="sc-kLIISr bYcVtm"
                    >
                      0
                       decimal places
                    </div>
                  </div>
                  <div
                    class="sc-dliRfk jZcTsb"
                  />
                  <div
                    class="sc-dliRfk jZcTsb"
                  >
                    Minted
                     
                    Mar 30, 2024
                  </div>
                  <div
                    class="sc-dliRfk jZcTsb"
                  >
                    Genesis Supply:
                     
                    4,444
                  </div>
                  <div
                    class="sc-dliRfk jZcTsb"
                  >
                    Fixed Supply
                  </div>
                </div>
                <div
                  class="sc-iQNlJl gSDyLy"
                >
                  <div
                    class="sc-bsbRJL gVlzfi"
                  >
                    <input
                      class="sc-hZSUBg sc-esOvli bxcKZR"
                      name="address"
                      placeholder="Address"
                      value="ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6"
                    />
                    <button
                      class="sc-gwVKww iuRbCt"
                      data-testid="scan-qr-code"
                    >
                      <svg />
                    </button>
                  </div>
                  <div
                    class="sc-hORach fnZTRV"
                  />
                </div>
                <div
                  class="sc-iqzUVk giZKtF"
                >
                  <a
                    class="sc-dNLxif idXNLy"
                    href="https://explorer.e.cash/address/false"
                    rel="noreferrer"
                    target="_blank"
                  />
                </div>
                <br />
                <div
                  class="sc-iQNlJl gSDyLy"
                >
                  <div
                    class="sc-bsbRJL gVlzfi"
                  >
                    <input
                      class="sc-hZSUBg sc-esOvli bxcKZR"
                      name="amount"
                      placeholder="Amount"
                      step="1"
                      type="number"
                      value="1"
                    />
                    <button
                      class="sc-cmthru sc-hMFtBS jmuqrV"
                    >
                      max
                    </button>
                  </div>
                  <div
                    class="sc-hORach fnZTRV"
                  />
                </div>
                <button
                  class="sc-ibxdXY sc-hrWEMg dCUaFy"
                  disabled=""
                  style="margin-top: 24px;"
                >
                  Send 
                  BearNip
                </button>
                <div
                  class="sc-cqCuEk elJtl"
                  title="Token info for \"BearNip\""
                >
                  <div
                    class="sc-dliRfk jZcTsb"
                  >
                    <a
                      href="/airdrop"
                      style="width: 100%;"
                    >
                      <button
                        class="sc-ibxdXY sc-iQKALj krPYXi"
                        style="margin-top: 12px;"
                      >
                        Airdrop
                      </button>
                    </a>
                  </div>
                  <div
                    class="sc-dliRfk jZcTsb"
                  >
                    <div
                      class="sc-bMVAic hxyVPp"
                    >
                      <div
                        class="sc-iQNlJl gSDyLy"
                      >
                        <div
                          class="sc-bsbRJL gVlzfi"
                        >
                          <input
                            class="sc-hZSUBg sc-esOvli bxcKZR"
                            name="burnAmount"
                            placeholder="Burn Amount"
                            step="1"
                            type="number"
                            value=""
                          />
                          <button
                            class="sc-cmthru sc-hMFtBS jmuqrV"
                          >
                            max
                          </button>
                        </div>
                        <div
                          class="sc-hORach fnZTRV"
                        />
                      </div>
                      <button
                        class="ant-btn css-dev-only-do-not-override-1rqnfsa ant-btn-primary ant-btn-dangerous"
                        type="button"
                      >
                        <span>
                          Burn BEAR
                        </span>
                      </button>
                    </div>
                  </div>
                </div>
              </div>
            </div>
            <div
              class="sc-BngTV dCDCyP"
            >
              <button
                class="sc-gRnDUn bgTXzO"
              >
                <svg />
              </button>
              <button
                class="sc-gRnDUn bgTXzO"
                data-testid="nav-btn-send"
              >
                <svg
                  class="sc-jKJlTe fTQyTm"
                  style="margin-top: -9px;"
                />
              </button>
              <button
                class="sc-gRnDUn bgTXzO"
                data-testid="nav-btn-etokens"
              >
                <span
                  aria-label="appstore-add"
                  class="anticon anticon-appstore-add"
                  role="img"
                  style="font-size: 24px;"
                >
                  <svg
                    aria-hidden="true"
                    data-icon="appstore-add"
                    fill="currentColor"
                    focusable="false"
                    height="1em"
                    viewBox="64 64 896 896"
                    width="1em"
                  >
                    <defs />
                    <path
                      d="M464 144H160c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm-52 268H212V212h200v200zm452-268H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm-52 268H612V212h200v200zm52 132H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16zm-52 268H612V612h200v200zM424 712H296V584c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v128H104c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h128v128c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V776h128c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z"
                    />
                  </svg>
                </span>
              </button>
              <button
                class="sc-gRnDUn bgTXzO"
                data-testid="nav-btn-receive"
              >
                <svg />
              </button>
              <div
                class="sc-cqpYsc dcCFkQ"
                data-testid="hamburger"
              >
                <span
                  class="sc-hBbWxd gyoWfB"
                />
                <div
                  class="sc-dyGzUR iWnlwd"
                  data-testid="hamburger-menu"
                >
                  <button
                    class="sc-drKuOJ cFmRbo"
                    data-testid="nav-btn-airdrop"
                  >
                     
                    <p>
                      Airdrop
                    </p>
                    <svg
                      height="33px"
                      width="30px"
                    />
                  </button>
                  <button
                    class="sc-drKuOJ cFmRbo"
                    data-testid="nav-btn-swap"
                  >
                     
                    <p>
                      Swap
                    </p>
                    <span
                      aria-label="swap"
                      class="anticon anticon-swap"
                      role="img"
                      style="font-size: 24px;"
                    >
                      <svg
                        aria-hidden="true"
                        data-icon="swap"
                        fill="currentColor"
                        focusable="false"
                        height="1em"
                        viewBox="64 64 896 896"
                        width="1em"
                      >
                        <path
                          d="M847.9 592H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h605.2L612.9 851c-4.1 5.2-.4 13 6.3 13h72.5c4.9 0 9.5-2.2 12.6-6.1l168.8-214.1c16.5-21 1.6-51.8-25.2-51.8zM872 356H266.8l144.3-183c4.1-5.2.4-13-6.3-13h-72.5c-4.9 0-9.5 2.2-12.6 6.1L150.9 380.2c-16.5 21-1.6 51.8 25.1 51.8h696c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8z"
                        />
                      </svg>
                    </span>
                  </button>
                  <button
                    class="sc-drKuOJ cFmRbo"
                    data-testid="nav-btn-signverifymsg"
                  >
                    <p>
                      Sign & Verify
                    </p>
                    <svg
                      class="sc-jzJRlG kclOxT"
                    />
                  </button>
                  <button
                    class="sc-drKuOJ cFmRbo"
                    data-testid="nav-btn-configure"
                  >
                    <p>
                      Settings
                    </p>
                    <svg
                      height="33px"
                      width="30px"
                    />
                  </button>
                </div>
              </div>
            </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/Send/__tests__/SendToken.test.js:465:59)
====== CashTab Unit Tests: <App /> 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="ant-spin-nested-loading css-dev-only-do-not-override-1rqnfsa"
    >
      <div
        class="ant-spin-container"
      >
        <div
          class="sc-kcDeIU kgKfDI"
        >
          <div
            class="Toastify"
          >
            <div
              class="Toastify__toast-container Toastify__toast-container--top-right sc-exkUMo bQfCal"
            >
              <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="4"
              >
                <div
                  class="Toastify__toast-body"
                  role="alert"
                >
                  <div
                    class="Toastify__toast-icon Toastify--animate-icon Toastify__zoom-enter"
                  >
                    <div
                      class="ant-image css-dev-only-do-not-override-1rqnfsa"
                      style="width: 24px; height: 24px;"
                    >
                      <img
                        class="ant-image-img css-dev-only-do-not-override-1rqnfsa"
                        height="24px"
                        src="test-file-stub"
                        style="height: 24px;"
                        width="24px"
                      />
                    </div>
                  </div>
                  <div>
                    <a
                      class="sc-krDsej bDQWZX"
                      href="https://explorer.e.cash/tx/6d2e157e2e2b1fa47cc63ede548375213942e29c090f5d9cbc2722258f720c08"
                      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: running;"
                  />
                </div>
              </div>
            </div>
          </div>
          <div
            class="sc-cmjSyW jwpsva"
          >
            <div
              class="sc-sdtwF ijCnPZ"
            >
              <div
                class="sc-bFADNz cZpbyk"
              >
                <div
                  class="sc-iYUSvU MWsTz"
                >
                  <img
                    alt="cashtab"
                    class="sc-cHSUfg jyjdjN"
                    src="test-file-stub"
                  />
                </div>
                <div
                  class="sc-bbmXgH fLVOGg"
                  data-testid="wallet-info-ctn"
                >
                  <div
                    class="sc-iomxrj dYTJKM"
                  >
                    <select
                      class="sc-dvCyap dfxYvF"
                      id="wallets"
                      name="wallets"
                    >
                      <option
                        class="sc-iFMziU fiPrpy"
                        value="Transaction Fixtures"
                      >
                        Transaction Fixtures
                      </option>
                    </select>
                    <div
                      class="sc-hMqMXs cAbGIb"
                    >
                      <svg
                        class="sc-htoDjs dHRdfz"
                        style="margin-top: 8px;"
                      />
                    </div>
                    <div
                      class="sc-eLExRp icFLqc"
                    >
                      <input
                        checked=""
                        class="sc-fOKMvo cmysrp"
                        data-testid="show-hide-balance"
                        id="show-hide-balance"
                        ...
    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/__tests__/App.test.js:710:59)

Each failure log is accessible here:
CashTab Unit Tests: <SendToken /> Renders the send token notification upon successful broadcast
CashTab Unit Tests: <App /> Setting "ABSOLUTE MINIMUM fees" settings will reduce fees to absolute min

Implement function correctly

bytesofman added inline comments.
cashtab/src/validation/index.js
807

I tested with the fr-FR locale and the input form still only accepts a '.' decimal place. If anyone asks, I can probably figure out a way to support arbitrary locale decimal places. But seems like the input form is only using '.'

emack added a subscriber: emack.

Subject to some material rebases

This revision is now accepted and ready to land.Mar 31 2024, 00:40