Page MenuHomePhabricator

add the ability to lock / unlock the wallet with user's device platform autheticator
ClosedPublic

Authored by hungsam on Nov 9 2021, 12:33.

Details

Reviewers
bytesofman
Group Reviewers
Restricted Owners Package(Owns No Changed Paths)
Restricted Project
Commits
rABC4f64348f48b9: add the ability to lock / unlock the wallet with user's device platform…
Summary

Allow user to enable / disable wallet lock on device that has a platform authenticator
A locked wallet will require user to authenticate in order to access it.

Test Plan

cd web/cashtab
npm start

On device without Platform Authenticator (FaceID, TouchID, Windows Hello)

  • make sure everything works as before
  • make sure under Settings / General Settings / Lock App - "not support" is shown

On device with Platform Authenticator

  • make sure that "Wallet Lock" page is shown
  • click "Skip"
  • make sure everything works as before
  • make sure under Settings / General Settings / Lock App - a Toggle Switch is shown
  • click on the switch to bring up the Platform Authenticator
  • follow the instruction (scan your fingerprint, face id, or enter pin)
  • upon successfully authenticate yourself, the Toggle Switch will be "ON"
  • navigate away from the wallet (minimize the browser, or switch to another tab)
  • navigate back to the wallet
  • make sure the Platform Authenticator prompt apprears. (on PC, it may take a few seconds) + on platform that requires user gesture to invoke the Platform Authenticator (iOS, iPadOS), 'Wallet Unlock' page is shown instead + click "Unlock" button to bring up the Platform Authentictor
  • follow the instruction on the authenticator prompt
  • upon successfully authenticate yourself, make sure everything works as usual

On device with Platform Authenticator

  • delete the authenticationConfig from IndexedDB
  • make sure that "Wallet Lock" page is shown
  • click "Enable Lock" to bring up the Platform Authenticator
  • follow the instruction on the authenticator prompt
  • upon successfully authenticate yourself, make sure everything works as before
  • make sure that Settings / General Settings / Lock App - Toggle Switch in "ON"
  • navigate away from the wallet (minimized the browser)
  • navigate back to the wallet
  • make sure the Platform Authenticator prompt appears + on platform that requires user gesture to invoke the Platform Authenticator (iOS, iPadOS), 'Wallet Unlock' page is shown instead + click "Unlock" button to bring up the Platform Authentictor
  • follow the instruction on the authenticator prompt
  • upon successfully authenticate yourself, make sure everything works as usual
  • turn off the Settings / Geneneral Settings / Lock App - Toggle switch
  • navigate away from the wallet, wait 1 to 2 seconds and navigate back to the wallet
  • make sure that authentication is no longer required

Connect mobile device to your PC and run the same test
Or deploy to Netlify and test on different mobile devices

Diff Detail

Repository
rABC Bitcoin ABC
Branch
app-lock
Lint
Lint Passed
Unit
No Test Coverage
Build Status
Buildable 17426
Build 34680: Build Diffcashtab-tests
Build 34679: arc lint + arc unit

Event Timeline

Owners added a reviewer: Restricted Owners Package.Nov 9 2021, 12:33
hungsam requested review of this revision.Nov 9 2021, 12:33

Failed tests logs:

====== CashTab Unit Tests:  Configure without a wallet ======
Error: expect(received).toMatchSnapshot()

Snapshot name: `Configure without a wallet 1`

- Snapshot  -  8
+ Received  + 96

@@ -1,7 +1,7 @@
  <div
-   className="sc-iAyFgw hatKtw"
+   className="sc-eHgmQL dUpMKn"
  >
    <h2>
      <span
        aria-label="copy"
        className="anticon anticon-copy sc-bdVaJa loPqmo"
@@ -67,11 +67,11 @@
          Your seed phrase is the only way to restore your wallet. Write it down. Keep it safe.
        </div>
      </div>
    </div>
    <div
-     className="sc-hSdWYo iEyugW"
+     className="sc-cvbbAY JVsRj"
    />
    <h2>
      <span
        aria-label="wallet"
        className="anticon anticon-wallet sc-htpNat fLtATP"
@@ -92,11 +92,11 @@
        </svg>
      </span>
       Manage Wallets
    </h2>
    <button
-     className="sc-jTzLTM iVNQiK"
+     className="sc-jzJRlG fiDUki"
      onClick={[Function]}
    >
      <span
        aria-label="plus-square"
        className="anticon anticon-plus-square"
@@ -120,11 +120,11 @@
        </svg>
      </span>
       New Wallet
    </button>
    <button
-     className="sc-fjdhpX eXuEIC"
+     className="sc-cSHVUG eNOONn"
      onClick={[Function]}
    >
      <span
        aria-label="import"
        className="anticon anticon-import"
@@ -145,11 +145,11 @@
        </svg>
      </span>
       Import Wallet
    </button>
    <div
-     className="sc-hSdWYo iEyugW"
+     className="sc-cvbbAY JVsRj"
    />
    <h2>
      <span
        aria-label="dollar"
        className="anticon anticon-dollar sc-bwzfXH iTQEyo"
@@ -170,11 +170,11 @@
        </svg>
      </span>
       Fiat Currency
    </h2>
    <div
-     className="sc-gZMcBi iFeyXx"
+     className="sc-VigVT ktfrOp"
    >
      <div
        className="ant-select select-after ant-select-single ant-select-show-arrow"
        onBlur={[Function]}
        onFocus={[Function]}
@@ -262,15 +262,103 @@
          </span>
        </span>
      </div>
    </div>
    <div
-     className="sc-hSdWYo iEyugW"
+     className="sc-cvbbAY JVsRj"
+   />
+   <h2>
+     <span
+       aria-label="setting"
+       className="anticon anticon-setting sc-ifAKCX cYbSut"
+       role="img"
+     >
+       <svg
+         aria-hidden="true"
+         data-icon="setting"
+         fill="currentColor"
+         focusable="false"
+         height="1em"
+         viewBox="64 64 896 896"
+         width="1em"
+       >
+         <path
+           d="M924.8 625.7l-65.5-56c3.1-19 4.7-38.4 4.7-57.8s-1.6-38.8-4.7-57.8l65.5-56a32.03 32.03 0 009.3-35.2l-.9-2.6a443.74 443.74 0 00-79.7-137.9l-1.8-2.1a32.12 32.12 0 00-35.1-9.5l-81.3 28.9c-30-24.6-63.5-44-99.7-57.6l-15.7-85a32.05 32.05 0 00-25.8-25.7l-2.7-.5c-52.1-9.4-106.9-9.4-159 0l-2.7.5a32.05 32.05 0 00-25.8 25.7l-15.8 85.4a351.86 351.86 0 00-99 57.4l-81.9-29.1a32 32 0 00-35.1 9.5l-1.8 2.1a446.02 446.02 0 00-79.7 137.9l-.9 2.6c-4.5 12.5-.8 26.5 9.3 35.2l66.3 56.6c-3.1 18.8-4.6 38-4.6 57.1 0 19.2 1.5 38.4 4.6 57.1L99 625.5a32.03 32.03 0 00-9.3 35.2l.9 2.6c18.1 50.4 44.9 96.9 79.7 137.9l1.8 2.1a32.12 32.12 0 0035.1 9.5l81.9-29.1c29.8 24.5 63.1 43.9 99 57.4l15.8 85.4a32.05 32.05 0 0025.8 25.7l2.7.5a449.4 449.4 0 00159 0l2.7-.5a32.05 32.05 0 0025.8-25.7l15.7-85a350 350 0 0099.7-57.6l81.3 28.9a32 32 0 0035.1-9.5l1.8-2.1c34.8-41.1 61.6-87.5 79.7-137.9l.9-2.6c4.5-12.3.8-26.3-9.3-35zM788.3 465.9c2.5 15.1 3.8 30.6 3.8 46.1s-1.3 31-3.8 46.1l-6.6 40.1 74.7 63.9a370.03 370.03 0 01-42.6 73.6L721 702.8l-31.4 25.8c-23.9 19.6-50.5 35-79.3 45.8l-38.1 14.3-17.9 97a377.5 377.5 0 01-85 0l-17.9-97.2-37.8-14.5c-28.5-10.8-55-26.2-78.7-45.7l-31.4-25.9-93.4 33.2c-17-22.9-31.2-47.6-42.6-73.6l75.5-64.5-6.5-40c-2.4-14.9-3.7-30.3-3.7-45.5 0-15.3 1.2-30.6 3.7-45.5l6.5-40-75.5-64.5c11.3-26.1 25.6-50.7 42.6-73.6l93.4 33.2 31.4-25.9c23.7-19.5 50.2-34.9 78.7-45.7l37.9-14.3 17.9-97.2c28.1-3.2 56.8-3.2 85 0l17.9 97 38.1 14.3c28.7 10.8 55.4 26.2 79.3 45.8l31.4 25.8 92.8-32.9c17 22.9 31.2 47.6 42.6 73.6L781.8 426l6.5 39.9zM512 326c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm79.2 255.2A111.6 111.6 0 01512 614c-29.9 0-58-11.7-79.2-32.8A111.6 111.6 0 01400 502c0-29.9 11.7-58 32.8-79.2C454 401.6 482.1 390 512 390c29.9 0 58 11.6 79.2 32.8A111.6 111.6 0 01624 502c0 29.9-11.7 58-32.8 79.2z"
+         />
+       </svg>
+     </span>
+      General Settings
+   </h2>
+   <div
+     className="sc-jWBwVP ibcxAa"
+   >
+     <div
+       className="title"
+     >
+       <span
+         aria-label="lock"
+         className="anticon anticon-lock"
+         role="img"
+       >
+         <svg
+           aria-hidden="true"
+           data-icon="lock"
+           fill="currentColor"
+           focusable="false"
+           height="1em"
+           viewBox="64 64 896 896"
+           width="1em"
+         >
+           <path
+             d="M832 464h-68V240c0-70.7-57.3-128-128-128H388c-70.7 0-128 57.3-128 128v224h-68c-17.7 0-32 14.3-32 32v384c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V496c0-17.7-14.3-32-32-32zM540 701v53c0 4.4-3.6 8-8 8h-40c-4.4 0-8-3.6-8-8v-53a48.01 48.01 0 1156 0zm152-237H332V240c0-30.9 25.1-56 56-56h248c30.9 0 56 25.1 56 56v224z"
            />
+         </svg>
+       </span>
+        Lock App
+     </div>
+     <button
+       aria-checked={false}
+       className="ant-switch ant-switch-small"
+       onClick={[Function]}
+       onKeyDown={[Function]}
+       role="switch"
+       type="button"
+     >
+       <div
+         className="ant-switch-handle"
+       />
+       <span
+         className="ant-switch-inner"
+       >
+         <span
+           aria-label="close"
+           className="anticon anticon-close"
+           role="img"
+         >
+           <svg
+             aria-hidden="true"
+             data-icon="close"
+             fill="currentColor"
+             focusable="false"
+             height="1em"
+             viewBox="64 64 896 896"
+             width="1em"
+           >
+             <path
+               d="M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z"
+             />
+           </svg>
+         </span>
+       </span>
+     </button>
+   </div>
+   <div
+     className="sc-cvbbAY JVsRj"
+   />
    [
    <a
-     className="sc-ckVGcZ bhwAJY"
+     className="sc-eNQAEJ jpqDcE"
      href="https://docs.cashtab.com/docs/"
      rel="noreferrer"
      target="_blank"
      type="link"
    >
    at Object.<anonymous> (/work/web/cashtab/src/components/Configure/__tests__/Configure.test.js:24:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)
====== CashTab Unit Tests:  Configure with a wallet ======
Error: expect(received).toMatchSnapshot()

Snapshot name: `Configure with a wallet 1`

- Snapshot  -  9
+ Received  + 97

@@ -1,7 +1,7 @@
  <div
-   className="sc-iAyFgw hatKtw"
+   className="sc-eHgmQL dUpMKn"
  >
    <h2>
      <span
        aria-label="copy"
        className="anticon anticon-copy sc-bdVaJa loPqmo"
@@ -67,11 +67,11 @@
          Your seed phrase is the only way to restore your wallet. Write it down. Keep it safe.
        </div>
      </div>
    </div>
    <div
-     className="ant-collapse ant-collapse-icon-position-left sc-EHOje iPpwBT"
+     className="ant-collapse ant-collapse-icon-position-left sc-gzVnrw IJTYA"
      role={null}
    >
      <div
        className="ant-collapse-item"
      >
@@ -105,11 +105,11 @@
          Click to reveal seed phrase
        </div>
      </div>
    </div>
    <div
-     className="sc-hSdWYo iEyugW"
+     className="sc-cvbbAY JVsRj"
    />
    <h2>
      <span
        aria-label="wallet"
        className="anticon anticon-wallet sc-htpNat fLtATP"
@@ -130,11 +130,11 @@
        </svg>
      </span>
       Manage Wallets
    </h2>
    <button
-     className="sc-jTzLTM iVNQiK"
+     className="sc-jzJRlG fiDUki"
      onClick={[Function]}
    >
      <span
        aria-label="plus-square"
        className="anticon anticon-plus-square"
@@ -158,11 +158,11 @@
        </svg>
      </span>
       New Wallet
    </button>
    <button
-     className="sc-fjdhpX eXuEIC"
+     className="sc-cSHVUG eNOONn"
      onClick={[Function]}
    >
      <span
        aria-label="import"
        className="anticon anticon-import"
@@ -183,11 +183,11 @@
        </svg>
      </span>
       Import Wallet
    </button>
    <div
-     className="sc-hSdWYo iEyugW"
+     className="sc-cvbbAY JVsRj"
    />
    <h2>
      <span
        aria-label="dollar"
        className="anticon anticon-dollar sc-bwzfXH iTQEyo"
@@ -208,11 +208,11 @@
        </svg>
      </span>
       Fiat Currency
    </h2>
    <div
-     className="sc-gZMcBi iFeyXx"
+     className="sc-VigVT ktfrOp"
    >
      <div
        className="ant-select select-after ant-select-single ant-select-show-arrow"
        onBlur={[Function]}
        onFocus={[Function]}
@@ -300,15 +300,103 @@
          </span>
        </span>
      </div>
    </div>
    <div
-     className="sc-hSdWYo iEyugW"
+     className="sc-cvbbAY JVsRj"
+   />
+   <h2>
+     <span
+       aria-label="setting"
+       className="anticon anticon-setting sc-ifAKCX cYbSut"
+       role="img"
+     >
+       <svg
+         aria-hidden="true"
+         data-icon="setting"
+         fill="currentColor"
+         focusable="false"
+         height="1em"
+         viewBox="64 64 896 896"
+         width="1em"
+       >
+         <path
+           d="M924.8 625.7l-65.5-56c3.1-19 4.7-38.4 4.7-57.8s-1.6-38.8-4.7-57.8l65.5-56a32.03 32.03 0 009.3-35.2l-.9-2.6a443.74 443.74 0 00-79.7-137.9l-1.8-2.1a32.12 32.12 0 00-35.1-9.5l-81.3 28.9c-30-24.6-63.5-44-99.7-57.6l-15.7-85a32.05 32.05 0 00-25.8-25.7l-2.7-.5c-52.1-9.4-106.9-9.4-159 0l-2.7.5a32.05 32.05 0 00-25.8 25.7l-15.8 85.4a351.86 351.86 0 00-99 57.4l-81.9-29.1a32 32 0 00-35.1 9.5l-1.8 2.1a446.02 446.02 0 00-79.7 137.9l-.9 2.6c-4.5 12.5-.8 26.5 9.3 35.2l66.3 56.6c-3.1 18.8-4.6 38-4.6 57.1 0 19.2 1.5 38.4 4.6 57.1L99 625.5a32.03 32.03 0 00-9.3 35.2l.9 2.6c18.1 50.4 44.9 96.9 79.7 137.9l1.8 2.1a32.12 32.12 0 0035.1 9.5l81.9-29.1c29.8 24.5 63.1 43.9 99 57.4l15.8 85.4a32.05 32.05 0 0025.8 25.7l2.7.5a449.4 449.4 0 00159 0l2.7-.5a32.05 32.05 0 0025.8-25.7l15.7-85a350 350 0 0099.7-57.6l81.3 28.9a32 32 0 0035.1-9.5l1.8-2.1c34.8-41.1 61.6-87.5 79.7-137.9l.9-2.6c4.5-12.3.8-26.3-9.3-35zM788.3 465.9c2.5 15.1 3.8 30.6 3.8 46.1s-1.3 31-3.8 46.1l-6.6 40.1 74.7 63.9a370.03 370.03 0 01-42.6 73.6L721 702.8l-31.4 25.8c-23.9 19.6-50.5 35-79.3 45.8l-38.1 14.3-17.9 97a377.5 377.5 0 01-85 0l-17.9-97.2-37.8-14.5c-28.5-10.8-55-26.2-78.7-45.7l-31.4-25.9-93.4 33.2c-17-22.9-31.2-47.6-42.6-73.6l75.5-64.5-6.5-40c-2.4-14.9-3.7-30.3-3.7-45.5 0-15.3 1.2-30.6 3.7-45.5l6.5-40-75.5-64.5c11.3-26.1 25.6-50.7 42.6-73.6l93.4 33.2 31.4-25.9c23.7-19.5 50.2-34.9 78.7-45.7l37.9-14.3 17.9-97.2c28.1-3.2 56.8-3.2 85 0l17.9 97 38.1 14.3c28.7 10.8 55.4 26.2 79.3 45.8l31.4 25.8 92.8-32.9c17 22.9 31.2 47.6 42.6 73.6L781.8 426l6.5 39.9zM512 326c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm79.2 255.2A111.6 111.6 0 01512 614c-29.9 0-58-11.7-79.2-32.8A111.6 111.6 0 01400 502c0-29.9 11.7-58 32.8-79.2C454 401.6 482.1 390 512 390c29.9 0 58 11.6 79.2 32.8A111.6 111.6 0 01624 502c0 29.9-11.7 58-32.8 79.2z"
+         />
+       </svg>
+     </span>
+      General Settings
+   </h2>
+   <div
+     className="sc-jWBwVP ibcxAa"
+   >
+     <div
+       className="title"
+     >
+       <span
+         aria-label="lock"
+         className="anticon anticon-lock"
+         role="img"
+       >
+         <svg
+           aria-hidden="true"
+           data-icon="lock"
+           fill="currentColor"
+           focusable="false"
+           height="1em"
+           viewBox="64 64 896 896"
+           width="1em"
+         >
+           <path
+             d="M832 464h-68V240c0-70.7-57.3-128-128-128H388c-70.7 0-128 57.3-128 128v224h-68c-17.7 0-32 14.3-32 32v384c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V496c0-17.7-14.3-32-32-32zM540 701v53c0 4.4-3.6 8-8 8h-40c-4.4 0-8-3.6-8-8v-53a48.01 48.01 0 1156 0zm152-237H332V240c0-30.9 25.1-56 56-56h248c30.9 0 56 25.1 56 56v224z"
+           />
+         </svg>
+       </span>
+        Lock App
+     </div>
+     <button
+       aria-checked={false}
+       className="ant-switch ant-switch-small"
+       onClick={[Function]}
+       onKeyDown={[Function]}
+       role="switch"
+       type="button"
+     >
+       <div
+         className="ant-switch-handle"
+       />
+       <span
+         className="ant-switch-inner"
+       >
+         <span
+           aria-label="close"
+           className="anticon anticon-close"
+           role="img"
+         >
+           <svg
+             aria-hidden="true"
+             data-icon="close"
+             fill="currentColor"
+             focusable="false"
+             height="1em"
+             viewBox="64 64 896 896"
+             width="1em"
+           >
+             <path
+               d="M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z"
+             />
+           </svg>
+         </span>
+       </span>
+     </button>
+   </div>
+   <div
+     className="sc-cvbbAY JVsRj"
    />
    [
    <a
-     className="sc-ckVGcZ bhwAJY"
+     className="sc-eNQAEJ jpqDcE"
      href="https://docs.cashtab.com/docs/"
      rel="noreferrer"
      target="_blank"
      type="link"
    >
    at Object.<anonymous> (/work/web/cashtab/src/components/Configure/__tests__/Configure.test.js:35:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)
====== CashTab Unit Tests:  Wallet with BCH balances and tokens and state field ======
Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet with BCH balances and tokens and state field 1`

- Snapshot  - 1
+ Received  + 1

@@ -1,7 +1,7 @@
  <div
-   className="ant-collapse ant-collapse-icon-position-left sc-gqjmRU fLjHet"
+   className="ant-collapse ant-collapse-icon-position-left sc-jTzLTM RrYKP"
    role={null}
    style={
      Object {
        "marginBottom": "24px",
      }
    at Object.<anonymous> (/work/web/cashtab/src/components/Tokens/__tests__/CreateTokenForm.test.js:57:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet with BCH balances and tokens and state field 1`

- Snapshot  - 6
+ Received  + 6

@@ -1,23 +1,23 @@
  Array [
    <div
-     className="sc-kAzzGY kdOdTZ"
+     className="sc-kgoBCf kfjVlq"
    >
      0.06
       
      XEC
    </div>,
    <div
-     className="sc-chPdSV elAazB"
+     className="sc-kGXeez kiHoFA"
    >
      $ 
      NaN
       
      USD
    </div>,
    <div
-     className="ant-collapse ant-collapse-icon-position-left sc-gqjmRU fLjHet"
+     className="ant-collapse ant-collapse-icon-position-left sc-jTzLTM RrYKP"
      role={null}
      style={
        Object {
          "marginBottom": "24px",
        }
@@ -61,14 +61,14 @@
      <a
        href="/send-token/bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba"
        onClick={[Function]}
      >
        <div
-         className="sc-eNQAEJ jnzudA"
+         className="sc-kEYyzF RTiPg"
        >
          <div
-           className="sc-ckVGcZ ealBRQ"
+           className="sc-eNQAEJ iEWhkj"
          >
            <img
              alt="identicon of tokenId bd1acc4c986de57af8d6d2a64aecad8c30ee80f37ae9d066d758923732ddc9ba "
              height="32"
              src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAACVBMVEXI65c+X5zhzy2mkXStAAAAA3RSTlP////6yOLMAABAi0lEQVR42gGAQH+/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgIBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAgICAgICAgICAgICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBSNwyASrq/tAAAAAASUVORK5CYII="
@@ -79,11 +79,11 @@
              }
              width="32"
            />
          </div>
          <div
-           className="sc-jKJlTe bUCZgB"
+           className="sc-hMqMXs jcgLFh"
          >
            6.001
             
            <strong>
              TBS
    at Object.<anonymous> (/work/web/cashtab/src/components/Tokens/__tests__/Tokens.test.js:96:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet with BCH balances and tokens and state field 1`

- Snapshot  - 11
+ Received  + 11

@@ -1,15 +1,15 @@
  Array [
    <div
-     className="sc-jlyJG gVikkG"
+     className="sc-csuQGl jRtcTV"
    >
      0.06
       
      XEC
    </div>,
    <div
-     className="sc-gipzik kUSpAS"
+     className="sc-Rmtcm dYZmDW"
    >
      $ 
      NaN
       
      USD
@@ -23,11 +23,11 @@
          "width": "100%",
        }
      }
    >
      <div
-       className="sc-cSHVUG ckubWs"
+       className="sc-chPdSV iDFVZe"
        style={
          Object {
            "display": "none",
          }
        }
@@ -43,11 +43,11 @@
        >
          ecash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7ccxkrr6zd
        </span>
      </div>
      <svg
-       className="sc-jzJRlG dYsuyj"
+       className="sc-kAzzGY lanDwf"
        height={210}
        id="borderedQRCode"
        shapeRendering="crispEdges"
        viewBox="0 0 37 37"
        width={210}
@@ -69,47 +69,47 @@
          xlinkHref="logo_primary.png"
          y={16.385714285714286}
        />
      </svg>
      <div
-       className="sc-kgoBCf iYHBff notranslate"
+       className="sc-kpOJdX eicPsf notranslate"
      >
        <input
          readOnly={true}
          spellCheck="false"
          type="text"
          value="ecash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7ccxkrr6zd"
        />
        <span
-         className="sc-kAzzGY bGeWfk"
+         className="sc-kgoBCf bHwLKM"
        >
          ecash:
        </span>
        <span
-         className="sc-chPdSV jcbRDb"
+         className="sc-kGXeez jNbIFN"
        >
          qzagy47m
        </span>
        vh6qxkvcn3acjnz73rkhkc6y7c
        <span
-         className="sc-chPdSV jcbRDb"
+         className="sc-kGXeez jNbIFN"
        >
          cxkrr6zd
        </span>
      </div>
    </div>,
    <div
-     className="sc-eqIVtm dcINvv"
+     className="sc-caSCKo cwfYcU"
    >
      <div
-       className="sc-fAjcbJ jmyMQN"
+       className="sc-gisBJw EQkzY"
        onClick={[Function]}
      >
        XEC
      </div>
      <div
-       className="sc-fAjcbJ jmyMQN nonactiveBtn"
+       className="sc-gisBJw EQkzY nonactiveBtn"
        onClick={[Function]}
      >
        eToken
      </div>
    </div>,
    at Object.<anonymous> (/work/web/cashtab/src/components/Wallet/__tests__/Wallet.test.js:75:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet with BCH balances and tokens and state field 1`

- Snapshot  - 6
+ Received  + 6

@@ -1,8 +1,8 @@
  Array [
    <div
-     className="sc-fjdhpX llHaIR"
+     className="sc-cSHVUG lalYdv"
    >
      6.001
       
      TBS
    </div>,
@@ -24,11 +24,11 @@
              "width": "auto",
            }
          }
        >
          <div
-           className="sc-gZMcBi iFeyXx"
+           className="sc-VigVT ktfrOp"
          >
            <div
              className="ant-row ant-form-item"
              style={Object {}}
            >
@@ -93,11 +93,11 @@
                        </span>
                        <span
                          className="ant-input-group-addon"
                        >
                          <span
-                           className="sc-htoDjs clindv"
+                           className="sc-iwsKbI cVxKUE"
                            onClick={[Function]}
                          >
                            <span
                              aria-label="qrcode"
                              className="anticon anticon-qrcode sc-bxivhb ctLIog"
@@ -134,11 +134,11 @@
                </div>
              </div>
            </div>
          </div>
          <div
-           className="sc-gZMcBi iFeyXx"
+           className="sc-VigVT ktfrOp"
          >
            <div
              className="ant-row ant-form-item"
              style={Object {}}
            >
@@ -200,11 +200,11 @@
                        </span>
                        <span
                          className="ant-input-group-addon"
                        >
                          <span
-                           className="sc-gqjmRU dcHtfz"
+                           className="sc-jTzLTM PEluH"
                            disabled={false}
                            onClick={[Function]}
                          >
                            max
                          </span>
@@ -231,11 +231,11 @@
                "paddingTop": "12px",
              }
            }
          >
            <button
-             className="sc-EHOje bfWfmf"
+             className="sc-gzVnrw wXhZP"
              onClick={[Function]}
            >
              Send 
              TestBits
            </button>
    at Object.<anonymous> (/work/web/cashtab/src/components/Send/__tests__/SendToken.test.js:76:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet with BCH balances and tokens and state field 1`

- Snapshot  - 10
+ Received  + 10

@@ -1,15 +1,15 @@
  Array [
    <div
-     className="sc-kAzzGY kdOdTZ"
+     className="sc-kgoBCf kfjVlq"
    >
      0.06
       
      XEC
    </div>,
    <div
-     className="sc-chPdSV elAazB"
+     className="sc-kGXeez kiHoFA"
    >
      $ 
      NaN
       
      USD
@@ -32,11 +32,11 @@
              "width": "auto",
            }
          }
        >
          <div
-           className="sc-jTzLTM fKDsMv"
+           className="sc-jzJRlG dEmeOv"
          >
            <div
              className="ant-row ant-form-item"
              style={Object {}}
            >
@@ -101,11 +101,11 @@
                        </span>
                        <span
                          className="ant-input-group-addon"
                        >
                          <span
-                           className="sc-gZMcBi kJTcOr"
+                           className="sc-VigVT jPrdqZ"
                            onClick={[Function]}
                          >
                            <span
                              aria-label="qrcode"
                              className="anticon anticon-qrcode sc-bxivhb ctLIog"
@@ -142,11 +142,11 @@
                </div>
              </div>
            </div>
          </div>
          <div
-           className="sc-jTzLTM fKDsMv"
+           className="sc-jzJRlG dEmeOv"
          >
            <div
              className="ant-row ant-form-item"
              style={Object {}}
            >
@@ -287,11 +287,11 @@
                            </svg>
                          </span>
                        </span>
                      </div>
                      <span
-                       className="sc-jzJRlG kQuQkS"
+                       className="sc-kAzzGY jWcEkN"
                        disabled={false}
                        onClick={[Function]}
                        style={
                          Object {
                            "height": "60px",
@@ -316,11 +316,11 @@
                </div>
              </div>
            </div>
          </div>
          <div
-           className="sc-dxgOiQ kbCOBL"
+           className="sc-jKJlTe hccxef"
          >
            =
             
            $  NaN USD
          </div>
@@ -330,11 +330,11 @@
                "paddingTop": "12px",
              }
            }
          >
            <button
-             className="sc-htoDjs jyAknT"
+             className="sc-iwsKbI jScjBa"
              onClick={[Function]}
            >
              Send
            </button>
          </div>
@@ -342,14 +342,14 @@
      </div>
    </div>,
    <br />,
    <br />,
    <div
-     className="sc-ksYbfQ fUkkAB"
+     className="sc-frDJqD bxmZEQ"
    />,
    <div
-     className="ant-collapse ant-collapse-icon-position-left sc-gzVnrw fYpbQV"
+     className="ant-collapse ant-collapse-icon-position-left sc-dnqmqq jGALww"
      role={null}
      style={
        Object {
          "marginBottom": "24px",
        }
    at Object.<anonymous> (/work/web/cashtab/src/components/Send/__tests__/Send.test.js:96:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)
====== CashTab Unit Tests:  Wallet without BCH balance ======
Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet without BCH balance 1`

- Snapshot  - 4
+ Received  + 4

@@ -1,22 +1,22 @@
  Array [
    <div
-     className="sc-kgoBCf fswuXg"
+     className="sc-kpOJdX GoEyB"
    >
      You need some 
      XEC
       in your wallet to create tokens.
    </div>,
    <div
-     className="sc-kAzzGY kdOdTZ"
+     className="sc-kgoBCf kfjVlq"
    >
      0
       
      XEC
    </div>,
    <div
-     className="ant-collapse ant-collapse-icon-position-left sc-gqjmRU eryBsW"
+     className="ant-collapse ant-collapse-icon-position-left sc-jTzLTM fDvaHF"
      role={null}
      style={
        Object {
          "marginBottom": "24px",
        }
@@ -55,11 +55,11 @@
          Create eToken
        </div>
      </div>
    </div>,
    <p
-     className="sc-kpOJdX bjUfnF"
+     className="sc-ckVGcZ eEJdrC"
    >
      You need at least
       
      5.5
       
    at Object.<anonymous> (/work/web/cashtab/src/components/Tokens/__tests__/Tokens.test.js:54:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet without BCH balance 1`

- Snapshot  - 11
+ Received  + 11

@@ -1,8 +1,8 @@
  Array [
    <div
-     className="sc-csuQGl EOfLl"
+     className="sc-bRBYWo beDMbu"
    >
      <span
        aria-label="party emoji"
        role="img"
      >
@@ -24,11 +24,11 @@
       
      XEC
       to send to others
    </div>,
    <div
-     className="sc-jlyJG gVikkG"
+     className="sc-csuQGl jRtcTV"
    >
      0
       
      XEC
    </div>,
@@ -41,11 +41,11 @@
          "width": "100%",
        }
      }
    >
      <div
-       className="sc-cSHVUG ckubWs"
+       className="sc-chPdSV iDFVZe"
        style={
          Object {
            "display": "none",
          }
        }
@@ -61,11 +61,11 @@
        >
          ecash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7ccxkrr6zd
        </span>
      </div>
      <svg
-       className="sc-jzJRlG dYsuyj"
+       className="sc-kAzzGY lanDwf"
        height={210}
        id="borderedQRCode"
        shapeRendering="crispEdges"
        viewBox="0 0 37 37"
        width={210}
@@ -87,47 +87,47 @@
          xlinkHref="logo_primary.png"
          y={16.385714285714286}
        />
      </svg>
      <div
-       className="sc-kgoBCf iYHBff notranslate"
+       className="sc-kpOJdX eicPsf notranslate"
      >
        <input
          readOnly={true}
          spellCheck="false"
          type="text"
          value="ecash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7ccxkrr6zd"
        />
        <span
-         className="sc-kAzzGY bGeWfk"
+         className="sc-kgoBCf bHwLKM"
        >
          ecash:
        </span>
        <span
-         className="sc-chPdSV jcbRDb"
+         className="sc-kGXeez jNbIFN"
        >
          qzagy47m
        </span>
        vh6qxkvcn3acjnz73rkhkc6y7c
        <span
-         className="sc-chPdSV jcbRDb"
+         className="sc-kGXeez jNbIFN"
        >
          cxkrr6zd
        </span>
      </div>
    </div>,
    <div
-     className="sc-eqIVtm dcINvv"
+     className="sc-caSCKo cwfYcU"
    >
      <div
-       className="sc-fAjcbJ jmyMQN"
+       className="sc-gisBJw EQkzY"
        onClick={[Function]}
      >
        XEC
      </div>
      <div
-       className="sc-fAjcbJ jmyMQN nonactiveBtn"
+       className="sc-gisBJw EQkzY nonactiveBtn"
        onClick={[Function]}
      >
        eToken
      </div>
    </div>,
    at Object.<anonymous> (/work/web/cashtab/src/components/Wallet/__tests__/Wallet.test.js:36:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet without BCH balance 1`

- Snapshot  - 9
+ Received  + 9

@@ -1,8 +1,8 @@
  Array [
    <div
-     className="sc-kgoBCf fswuXg"
+     className="sc-kpOJdX GoEyB"
    >
      You currently have 0 
      XEC
      <br />
      Deposit some funds to use this feature
@@ -25,11 +25,11 @@
              "width": "auto",
            }
          }
        >
          <div
-           className="sc-jTzLTM fKDsMv"
+           className="sc-jzJRlG dEmeOv"
          >
            <div
              className="ant-row ant-form-item"
              style={Object {}}
            >
@@ -94,11 +94,11 @@
                        </span>
                        <span
                          className="ant-input-group-addon"
                        >
                          <span
-                           className="sc-gZMcBi kJTcOr"
+                           className="sc-VigVT jPrdqZ"
                            onClick={[Function]}
                          >
                            <span
                              aria-label="qrcode"
                              className="anticon anticon-qrcode sc-bxivhb ctLIog"
@@ -135,11 +135,11 @@
                </div>
              </div>
            </div>
          </div>
          <div
-           className="sc-jTzLTM fKDsMv"
+           className="sc-jzJRlG dEmeOv"
          >
            <div
              className="ant-row ant-form-item"
              style={Object {}}
            >
@@ -280,11 +280,11 @@
                            </svg>
                          </span>
                        </span>
                      </div>
                      <span
-                       className="sc-jzJRlG kQuQkS"
+                       className="sc-kAzzGY jWcEkN"
                        disabled={false}
                        onClick={[Function]}
                        style={
                          Object {
                            "height": "60px",
@@ -309,11 +309,11 @@
                </div>
              </div>
            </div>
          </div>
          <div
-           className="sc-dxgOiQ kbCOBL"
+           className="sc-jKJlTe hccxef"
          >
            =
             
            $  NaN USD
          </div>
@@ -323,25 +323,25 @@
                "paddingTop": "12px",
              }
            }
          >
            <button
-             className="sc-dnqmqq fryMgW"
+             className="sc-gZMcBi eUcbgv"
            >
              Send
            </button>
          </div>
        </form>
      </div>
    </div>,
    <br />,
    <br />,
    <div
-     className="sc-ksYbfQ fUkkAB"
+     className="sc-frDJqD bxmZEQ"
    />,
    <div
-     className="ant-collapse ant-collapse-icon-position-left sc-gzVnrw fYpbQV"
+     className="ant-collapse ant-collapse-icon-position-left sc-dnqmqq jGALww"
      role={null}
      style={
        Object {
          "marginBottom": "24px",
        }
    at Object.<anonymous> (/work/web/cashtab/src/components/Send/__tests__/Send.test.js:54:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)
====== CashTab Unit Tests:  Wallet with BCH balances ======
Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet with BCH balances 1`

- Snapshot  - 4
+ Received  + 4

@@ -1,22 +1,22 @@
  Array [
    <div
-     className="sc-kgoBCf fswuXg"
+     className="sc-kpOJdX GoEyB"
    >
      You need some 
      XEC
       in your wallet to create tokens.
    </div>,
    <div
-     className="sc-kAzzGY kdOdTZ"
+     className="sc-kgoBCf kfjVlq"
    >
      0
       
      XEC
    </div>,
    <div
-     className="ant-collapse ant-collapse-icon-position-left sc-gqjmRU eryBsW"
+     className="ant-collapse ant-collapse-icon-position-left sc-jTzLTM fDvaHF"
      role={null}
      style={
        Object {
          "marginBottom": "24px",
        }
@@ -55,11 +55,11 @@
          Create eToken
        </div>
      </div>
    </div>,
    <p
-     className="sc-kpOJdX bjUfnF"
+     className="sc-ckVGcZ eEJdrC"
    >
      You need at least
       
      5.5
       
    at Object.<anonymous> (/work/web/cashtab/src/components/Tokens/__tests__/Tokens.test.js:68:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet with BCH balances 1`

- Snapshot  - 11
+ Received  + 11

@@ -1,8 +1,8 @@
  Array [
    <div
-     className="sc-csuQGl EOfLl"
+     className="sc-bRBYWo beDMbu"
    >
      <span
        aria-label="party emoji"
        role="img"
      >
@@ -24,11 +24,11 @@
       
      XEC
       to send to others
    </div>,
    <div
-     className="sc-jlyJG gVikkG"
+     className="sc-csuQGl jRtcTV"
    >
      0
       
      XEC
    </div>,
@@ -41,11 +41,11 @@
          "width": "100%",
        }
      }
    >
      <div
-       className="sc-cSHVUG ckubWs"
+       className="sc-chPdSV iDFVZe"
        style={
          Object {
            "display": "none",
          }
        }
@@ -61,11 +61,11 @@
        >
          ecash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7ccxkrr6zd
        </span>
      </div>
      <svg
-       className="sc-jzJRlG dYsuyj"
+       className="sc-kAzzGY lanDwf"
        height={210}
        id="borderedQRCode"
        shapeRendering="crispEdges"
        viewBox="0 0 37 37"
        width={210}
@@ -87,47 +87,47 @@
          xlinkHref="logo_primary.png"
          y={16.385714285714286}
        />
      </svg>
      <div
-       className="sc-kgoBCf iYHBff notranslate"
+       className="sc-kpOJdX eicPsf notranslate"
      >
        <input
          readOnly={true}
          spellCheck="false"
          type="text"
          value="ecash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7ccxkrr6zd"
        />
        <span
-         className="sc-kAzzGY bGeWfk"
+         className="sc-kgoBCf bHwLKM"
        >
          ecash:
        </span>
        <span
-         className="sc-chPdSV jcbRDb"
+         className="sc-kGXeez jNbIFN"
        >
          qzagy47m
        </span>
        vh6qxkvcn3acjnz73rkhkc6y7c
        <span
-         className="sc-chPdSV jcbRDb"
+         className="sc-kGXeez jNbIFN"
        >
          cxkrr6zd
        </span>
      </div>
    </div>,
    <div
-     className="sc-eqIVtm dcINvv"
+     className="sc-caSCKo cwfYcU"
    >
      <div
-       className="sc-fAjcbJ jmyMQN"
+       className="sc-gisBJw EQkzY"
        onClick={[Function]}
      >
        XEC
      </div>
      <div
-       className="sc-fAjcbJ jmyMQN nonactiveBtn"
+       className="sc-gisBJw EQkzY nonactiveBtn"
        onClick={[Function]}
      >
        eToken
      </div>
    </div>,
    at Object.<anonymous> (/work/web/cashtab/src/components/Wallet/__tests__/Wallet.test.js:49:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet with BCH balances 1`

- Snapshot  - 9
+ Received  + 9

@@ -1,8 +1,8 @@
  Array [
    <div
-     className="sc-kgoBCf fswuXg"
+     className="sc-kpOJdX GoEyB"
    >
      You currently have 0 
      XEC
      <br />
      Deposit some funds to use this feature
@@ -25,11 +25,11 @@
              "width": "auto",
            }
          }
        >
          <div
-           className="sc-jTzLTM fKDsMv"
+           className="sc-jzJRlG dEmeOv"
          >
            <div
              className="ant-row ant-form-item"
              style={Object {}}
            >
@@ -94,11 +94,11 @@
                        </span>
                        <span
                          className="ant-input-group-addon"
                        >
                          <span
-                           className="sc-gZMcBi kJTcOr"
+                           className="sc-VigVT jPrdqZ"
                            onClick={[Function]}
                          >
                            <span
                              aria-label="qrcode"
                              className="anticon anticon-qrcode sc-bxivhb ctLIog"
@@ -135,11 +135,11 @@
                </div>
              </div>
            </div>
          </div>
          <div
-           className="sc-jTzLTM fKDsMv"
+           className="sc-jzJRlG dEmeOv"
          >
            <div
              className="ant-row ant-form-item"
              style={Object {}}
            >
@@ -280,11 +280,11 @@
                            </svg>
                          </span>
                        </span>
                      </div>
                      <span
-                       className="sc-jzJRlG kQuQkS"
+                       className="sc-kAzzGY jWcEkN"
                        disabled={false}
                        onClick={[Function]}
                        style={
                          Object {
                            "height": "60px",
@@ -309,11 +309,11 @@
                </div>
              </div>
            </div>
          </div>
          <div
-           className="sc-dxgOiQ kbCOBL"
+           className="sc-jKJlTe hccxef"
          >
            =
             
            $  NaN USD
          </div>
@@ -323,25 +323,25 @@
                "paddingTop": "12px",
              }
            }
          >
            <button
-             className="sc-dnqmqq fryMgW"
+             className="sc-gZMcBi eUcbgv"
            >
              Send
            </button>
          </div>
        </form>
      </div>
    </div>,
    <br />,
    <br />,
    <div
-     className="sc-ksYbfQ fUkkAB"
+     className="sc-frDJqD bxmZEQ"
    />,
    <div
-     className="ant-collapse ant-collapse-icon-position-left sc-gzVnrw fYpbQV"
+     className="ant-collapse ant-collapse-icon-position-left sc-dnqmqq jGALww"
      role={null}
      style={
        Object {
          "marginBottom": "24px",
        }
    at Object.<anonymous> (/work/web/cashtab/src/components/Send/__tests__/Send.test.js:68:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)
====== CashTab Unit Tests:  Wallet with BCH balances and tokens ======
Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet with BCH balances and tokens 1`

- Snapshot  - 4
+ Received  + 4

@@ -1,22 +1,22 @@
  Array [
    <div
-     className="sc-kgoBCf fswuXg"
+     className="sc-kpOJdX GoEyB"
    >
      You need some 
      XEC
       in your wallet to create tokens.
    </div>,
    <div
-     className="sc-kAzzGY kdOdTZ"
+     className="sc-kgoBCf kfjVlq"
    >
      0
       
      XEC
    </div>,
    <div
-     className="ant-collapse ant-collapse-icon-position-left sc-gqjmRU eryBsW"
+     className="ant-collapse ant-collapse-icon-position-left sc-jTzLTM fDvaHF"
      role={null}
      style={
        Object {
          "marginBottom": "24px",
        }
@@ -55,11 +55,11 @@
          Create eToken
        </div>
      </div>
    </div>,
    <p
-     className="sc-kpOJdX bjUfnF"
+     className="sc-ckVGcZ eEJdrC"
    >
      You need at least
       
      5.5
       
    at Object.<anonymous> (/work/web/cashtab/src/components/Tokens/__tests__/Tokens.test.js:82:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet with BCH balances and tokens 1`

- Snapshot  - 11
+ Received  + 11

@@ -1,8 +1,8 @@
  Array [
    <div
-     className="sc-csuQGl EOfLl"
+     className="sc-bRBYWo beDMbu"
    >
      <span
        aria-label="party emoji"
        role="img"
      >
@@ -24,11 +24,11 @@
       
      XEC
       to send to others
    </div>,
    <div
-     className="sc-jlyJG gVikkG"
+     className="sc-csuQGl jRtcTV"
    >
      0
       
      XEC
    </div>,
@@ -41,11 +41,11 @@
          "width": "100%",
        }
      }
    >
      <div
-       className="sc-cSHVUG ckubWs"
+       className="sc-chPdSV iDFVZe"
        style={
          Object {
            "display": "none",
          }
        }
@@ -61,11 +61,11 @@
        >
          ecash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7ccxkrr6zd
        </span>
      </div>
      <svg
-       className="sc-jzJRlG dYsuyj"
+       className="sc-kAzzGY lanDwf"
        height={210}
        id="borderedQRCode"
        shapeRendering="crispEdges"
        viewBox="0 0 37 37"
        width={210}
@@ -87,47 +87,47 @@
          xlinkHref="logo_primary.png"
          y={16.385714285714286}
        />
      </svg>
      <div
-       className="sc-kgoBCf iYHBff notranslate"
+       className="sc-kpOJdX eicPsf notranslate"
      >
        <input
          readOnly={true}
          spellCheck="false"
          type="text"
          value="ecash:qzagy47mvh6qxkvcn3acjnz73rkhkc6y7ccxkrr6zd"
        />
        <span
-         className="sc-kAzzGY bGeWfk"
+         className="sc-kgoBCf bHwLKM"
        >
          ecash:
        </span>
        <span
-         className="sc-chPdSV jcbRDb"
+         className="sc-kGXeez jNbIFN"
        >
          qzagy47m
        </span>
        vh6qxkvcn3acjnz73rkhkc6y7c
        <span
-         className="sc-chPdSV jcbRDb"
+         className="sc-kGXeez jNbIFN"
        >
          cxkrr6zd
        </span>
      </div>
    </div>,
    <div
-     className="sc-eqIVtm dcINvv"
+     className="sc-caSCKo cwfYcU"
    >
      <div
-       className="sc-fAjcbJ jmyMQN"
+       className="sc-gisBJw EQkzY"
        onClick={[Function]}
      >
        XEC
      </div>
      <div
-       className="sc-fAjcbJ jmyMQN nonactiveBtn"
+       className="sc-gisBJw EQkzY nonactiveBtn"
        onClick={[Function]}
      >
        eToken
      </div>
    </div>,
    at Object.<anonymous> (/work/web/cashtab/src/components/Wallet/__tests__/Wallet.test.js:62:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet with BCH balances and tokens 1`

- Snapshot  - 9
+ Received  + 9

@@ -1,8 +1,8 @@
  Array [
    <div
-     className="sc-kgoBCf fswuXg"
+     className="sc-kpOJdX GoEyB"
    >
      You currently have 0 
      XEC
      <br />
      Deposit some funds to use this feature
@@ -25,11 +25,11 @@
              "width": "auto",
            }
          }
        >
          <div
-           className="sc-jTzLTM fKDsMv"
+           className="sc-jzJRlG dEmeOv"
          >
            <div
              className="ant-row ant-form-item"
              style={Object {}}
            >
@@ -94,11 +94,11 @@
                        </span>
                        <span
                          className="ant-input-group-addon"
                        >
                          <span
-                           className="sc-gZMcBi kJTcOr"
+                           className="sc-VigVT jPrdqZ"
                            onClick={[Function]}
                          >
                            <span
                              aria-label="qrcode"
                              className="anticon anticon-qrcode sc-bxivhb ctLIog"
@@ -135,11 +135,11 @@
                </div>
              </div>
            </div>
          </div>
          <div
-           className="sc-jTzLTM fKDsMv"
+           className="sc-jzJRlG dEmeOv"
          >
            <div
              className="ant-row ant-form-item"
              style={Object {}}
            >
@@ -280,11 +280,11 @@
                            </svg>
                          </span>
                        </span>
                      </div>
                      <span
-                       className="sc-jzJRlG kQuQkS"
+                       className="sc-kAzzGY jWcEkN"
                        disabled={false}
                        onClick={[Function]}
                        style={
                          Object {
                            "height": "60px",
@@ -309,11 +309,11 @@
                </div>
              </div>
            </div>
          </div>
          <div
-           className="sc-dxgOiQ kbCOBL"
+           className="sc-jKJlTe hccxef"
          >
            =
             
            $  NaN USD
          </div>
@@ -323,25 +323,25 @@
                "paddingTop": "12px",
              }
            }
          >
            <button
-             className="sc-dnqmqq fryMgW"
+             className="sc-gZMcBi eUcbgv"
            >
              Send
            </button>
          </div>
        </form>
      </div>
    </div>,
    <br />,
    <br />,
    <div
-     className="sc-ksYbfQ fUkkAB"
+     className="sc-frDJqD bxmZEQ"
    />,
    <div
-     className="ant-collapse ant-collapse-icon-position-left sc-gzVnrw fYpbQV"
+     className="ant-collapse ant-collapse-icon-position-left sc-dnqmqq jGALww"
      role={null}
      style={
        Object {
          "marginBottom": "24px",
        }
    at Object.<anonymous> (/work/web/cashtab/src/components/Send/__tests__/Send.test.js:82:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)
====== CashTab Unit Tests:  Without wallet defined ======
Error: expect(received).toMatchSnapshot()

Snapshot name: `Without wallet defined 1`

- Snapshot  - 4
+ Received  + 4

@@ -1,22 +1,22 @@
  Array [
    <div
-     className="sc-kgoBCf fswuXg"
+     className="sc-kpOJdX GoEyB"
    >
      You need some 
      XEC
       in your wallet to create tokens.
    </div>,
    <div
-     className="sc-kAzzGY kdOdTZ"
+     className="sc-kgoBCf kfjVlq"
    >
      0
       
      XEC
    </div>,
    <div
-     className="ant-collapse ant-collapse-icon-position-left sc-gqjmRU eryBsW"
+     className="ant-collapse ant-collapse-icon-position-left sc-jTzLTM fDvaHF"
      role={null}
      style={
        Object {
          "marginBottom": "24px",
        }
@@ -55,11 +55,11 @@
          Create eToken
        </div>
      </div>
    </div>,
    <p
-     className="sc-kpOJdX bjUfnF"
+     className="sc-ckVGcZ eEJdrC"
    >
      You need at least
       
      5.5
       
    at Object.<anonymous> (/work/web/cashtab/src/components/Tokens/__tests__/Tokens.test.js:114:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)Error: expect(received).toMatchSnapshot()

Snapshot name: `Without wallet defined 1`

- Snapshot  - 5
+ Received  + 5

@@ -1,16 +1,16 @@
  Array [
    <h2>
      Welcome to Cashtab!
    </h2>,
    <p
-     className="sc-jTzLTM iZNmqq"
+     className="sc-jzJRlG leTPdT"
    >
      Cashtab is an
       
      <a
-       className="sc-fjdhpX cfxeWn"
+       className="sc-cSHVUG dlQkwn"
        href="https://github.com/bitcoin-abc/bitcoin-abc"
        rel="noreferrer"
        target="_blank"
      >
        open source,
@@ -22,20 +22,20 @@
      <br />
      <br />
      Want to learn more?
       
      <a
-       className="sc-fjdhpX cfxeWn"
+       className="sc-cSHVUG dlQkwn"
        href="https://docs.cashtabapp.com/docs/"
        rel="noreferrer"
        target="_blank"
      >
        Check out the Cashtab documentation.
      </a>
    </p>,
    <button
-     className="sc-gZMcBi JUqLQ"
+     className="sc-VigVT RpRhe"
      onClick={[Function]}
    >
      <span
        aria-label="plus-square"
        className="anticon anticon-plus-square"
@@ -59,11 +59,11 @@
        </svg>
      </span>
       New Wallet
    </button>,
    <button
-     className="sc-gqjmRU eEPviq"
+     className="sc-jTzLTM bLkbAy"
      onClick={[Function]}
    >
      <span
        aria-label="import"
        className="anticon anticon-import"
    at Object.<anonymous> (/work/web/cashtab/src/components/Wallet/__tests__/Wallet.test.js:91:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)Error: expect(received).toMatchSnapshot()

Snapshot name: `Without wallet defined 1`

- Snapshot  - 9
+ Received  + 9

@@ -1,8 +1,8 @@
  Array [
    <div
-     className="sc-kgoBCf fswuXg"
+     className="sc-kpOJdX GoEyB"
    >
      You currently have 0 
      XEC
      <br />
      Deposit some funds to use this feature
@@ -25,11 +25,11 @@
              "width": "auto",
            }
          }
        >
          <div
-           className="sc-jTzLTM fKDsMv"
+           className="sc-jzJRlG dEmeOv"
          >
            <div
              className="ant-row ant-form-item"
              style={Object {}}
            >
@@ -94,11 +94,11 @@
                        </span>
                        <span
                          className="ant-input-group-addon"
                        >
                          <span
-                           className="sc-gZMcBi kJTcOr"
+                           className="sc-VigVT jPrdqZ"
                            onClick={[Function]}
                          >
                            <span
                              aria-label="qrcode"
                              className="anticon anticon-qrcode sc-bxivhb ctLIog"
@@ -135,11 +135,11 @@
                </div>
              </div>
            </div>
          </div>
          <div
-           className="sc-jTzLTM fKDsMv"
+           className="sc-jzJRlG dEmeOv"
          >
            <div
              className="ant-row ant-form-item"
              style={Object {}}
            >
@@ -280,11 +280,11 @@
                            </svg>
                          </span>
                        </span>
                      </div>
                      <span
-                       className="sc-jzJRlG kQuQkS"
+                       className="sc-kAzzGY jWcEkN"
                        disabled={false}
                        onClick={[Function]}
                        style={
                          Object {
                            "height": "60px",
@@ -309,11 +309,11 @@
                </div>
              </div>
            </div>
          </div>
          <div
-           className="sc-dxgOiQ kbCOBL"
+           className="sc-jKJlTe hccxef"
          >
            =
             
            $  NaN USD
          </div>
@@ -323,25 +323,25 @@
                "paddingTop": "12px",
              }
            }
          >
            <button
-             className="sc-dnqmqq fryMgW"
+             className="sc-gZMcBi eUcbgv"
            >
              Send
            </button>
          </div>
        </form>
      </div>
    </div>,
    <br />,
    <br />,
    <div
-     className="sc-ksYbfQ fUkkAB"
+     className="sc-frDJqD bxmZEQ"
    />,
    <div
-     className="ant-collapse ant-collapse-icon-position-left sc-gzVnrw fYpbQV"
+     className="ant-collapse ant-collapse-icon-position-left sc-dnqmqq jGALww"
      role={null}
      style={
        Object {
          "marginBottom": "24px",
        }
    at Object.<anonymous> (/work/web/cashtab/src/components/Send/__tests__/Send.test.js:114:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)

Each failure log is accessible here:
CashTab Unit Tests: Configure without a wallet
CashTab Unit Tests: Configure with a wallet
CashTab Unit Tests: Wallet with BCH balances and tokens and state field
CashTab Unit Tests: Wallet without BCH balance
CashTab Unit Tests: Wallet with BCH balances
CashTab Unit Tests: Wallet with BCH balances and tokens
CashTab Unit Tests: Without wallet defined

Thank you for this high quality diff + useful feature add. User choice and maximum possible security are both important dev priorities. So, I'd like to get this in.

It's a big diff to review and it does add some complications to the codebase. I'm not able to get this to work on my mobile device (Pixel 5) -- is Platform Authenticator not in android? What are some example devices you used in testing?

Also, please note the unit test failures. You can run npm test locally to see why they are breaking, and patch accordingly. It may also be appropriate to add some new unit tests for any introduced functions.

This revision now requires changes to proceed.Nov 11 2021, 00:25
  • Tested on Samsung S20 FE, Samsung J7 Prime, Iphone SE, Ipad, Surface 5, Surface Pro 5, Desktop with Windows 10, Laptop with Windows 11
  • I did notice the test failures and working the address that.
  • About the New unit tests for this feature, should it be included in this diff? should it be another diff after this?

update snapshots (now have @generated added to the end of first line)

bytesofman added a subscriber: emack.

From @emack

"D10443 biometric tests on mobile, I'm getting error on 1st time load on both android and iOS mobiles. Both mobiles have biometrics enabled. Unpatched master branch loads fine on these two devices."

"Tested on:

  1. Samsung Galaxy S21 - Android 11 - Chrome 95.0.4638.74
  2. iPhone SE - iOS 14.8.1 - Safari 14.8.1"

image.png (1×734 px, 558 KB)

image.png (1×576 px, 465 KB)

This revision now requires changes to proceed.Nov 18 2021, 00:25

fix error when PublicKeyCredential is undefined. PublicKeyCredential requires https.

Can verify the PublicKeyCredential error is now fixed.

However on both android and iOS devices the feature is showing up as not supported

2021-11-18 iphone Safari test.jpeg (1×589 px, 29 KB)

2021-11-18 Android Chrome test.jpg (2×1 px, 222 KB)

Devices used:

  • Samsung Galaxy S21 - Android 11 - Chrome 95.0.4638.74
  • iPhone SE - iOS 14.8.1 - Safari 14.8.1"

I notice that you are accessing the app through a LAN IP, make sure that it support HTTPS, (or you can accessing it through localhost,). Web Authentication requires HTTPS.
Alternatively, you can build and deploy it to Netlify or Heroku. Here is a link to my Netlify deployment cashtab.netlify.app

Yup you're right, accessing it via the local LAN confused the authenticator. Deploying to netlify got it going. Great UX!

@bytesofman - tested ok across iOS and Android via netlify

OK looks good in testing.

I'm ready to approve and land this feature -- @hungsam could you please contact me on Telegram (@bytesofman) to coordinate? Would like you to be available to help monitor the deployment, thanks.

This revision now requires changes to proceed.Nov 26 2021, 18:43

rebase to the latest master

bytesofman added inline comments.
web/cashtab/src/components/Send/__tests__/__snapshots__/Send.test.js.snap
1

Please run npm test locally to add the @generated at the end of this file, which will hide it from review

This is a best practice for all Cashtab dev, thanks!

This revision now requires changes to proceed.Nov 27 2021, 01:13

add @generated to the first line of updated snapshots

rebase to the latest master branch

Failed tests logs:

====== CashTab Unit Tests:  Wallet without BCH balance ======
Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet without BCH balance 1`

- Snapshot  - 5
+ Received  + 5

@@ -1,8 +1,8 @@
  Array [
    <div
-     className="sc-hzDkRC cnnkkE"
+     className="sc-fBuWsC dWuyYQ"
    >
      <span
        aria-label="party emoji"
        role="img"
      >
@@ -24,11 +24,11 @@
       
      XEC
       to send to others
    </div>,
    <div
-     className="sc-Rmtcm doZmKW"
+     className="sc-hzDkRC lmPOKb"
    >
      0
       
      XEC
    </div>,
@@ -114,20 +114,20 @@
          cxkrr6zd
        </span>
      </div>
    </div>,
    <div
-     className="sc-gisBJw bgeSVQ"
+     className="sc-cHGsZl hAuusT"
    >
      <div
-       className="sc-kjoXOD bocqe"
+       className="sc-TOsTZ gBqYyX"
        onClick={[Function]}
      >
        XEC
      </div>
      <div
-       className="sc-kjoXOD bocqe nonactiveBtn"
+       className="sc-TOsTZ gBqYyX nonactiveBtn"
        onClick={[Function]}
      >
        eToken
      </div>
    </div>,
    at Object.<anonymous> (/work/web/cashtab/src/components/Wallet/__tests__/Wallet.test.js:36:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet without BCH balance 1`

- Snapshot  - 1
+ Received  + 1

@@ -383,11 +383,11 @@
          </div>
        </form>
      </div>
    </div>,
    <div
-     className="sc-kvZOFW crFufP"
+     className="sc-jbKcbu dudaer"
    >
      Signatures
    </div>,
    <div
      className="ant-collapse ant-collapse-icon-position-left sc-fjdhpX ddFLEP"
    at Object.<anonymous> (/work/web/cashtab/src/components/Send/__tests__/Send.test.js:54:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)
====== CashTab Unit Tests:  Wallet with BCH balances ======
Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet with BCH balances 1`

- Snapshot  - 5
+ Received  + 5

@@ -1,8 +1,8 @@
  Array [
    <div
-     className="sc-hzDkRC cnnkkE"
+     className="sc-fBuWsC dWuyYQ"
    >
      <span
        aria-label="party emoji"
        role="img"
      >
@@ -24,11 +24,11 @@
       
      XEC
       to send to others
    </div>,
    <div
-     className="sc-Rmtcm doZmKW"
+     className="sc-hzDkRC lmPOKb"
    >
      0
       
      XEC
    </div>,
@@ -114,20 +114,20 @@
          cxkrr6zd
        </span>
      </div>
    </div>,
    <div
-     className="sc-gisBJw bgeSVQ"
+     className="sc-cHGsZl hAuusT"
    >
      <div
-       className="sc-kjoXOD bocqe"
+       className="sc-TOsTZ gBqYyX"
        onClick={[Function]}
      >
        XEC
      </div>
      <div
-       className="sc-kjoXOD bocqe nonactiveBtn"
+       className="sc-TOsTZ gBqYyX nonactiveBtn"
        onClick={[Function]}
      >
        eToken
      </div>
    </div>,
    at Object.<anonymous> (/work/web/cashtab/src/components/Wallet/__tests__/Wallet.test.js:49:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet with BCH balances 1`

- Snapshot  - 1
+ Received  + 1

@@ -383,11 +383,11 @@
          </div>
        </form>
      </div>
    </div>,
    <div
-     className="sc-kvZOFW crFufP"
+     className="sc-jbKcbu dudaer"
    >
      Signatures
    </div>,
    <div
      className="ant-collapse ant-collapse-icon-position-left sc-fjdhpX ddFLEP"
    at Object.<anonymous> (/work/web/cashtab/src/components/Send/__tests__/Send.test.js:68:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)
====== CashTab Unit Tests:  Wallet with BCH balances and tokens ======
Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet with BCH balances and tokens 1`

- Snapshot  - 5
+ Received  + 5

@@ -1,8 +1,8 @@
  Array [
    <div
-     className="sc-hzDkRC cnnkkE"
+     className="sc-fBuWsC dWuyYQ"
    >
      <span
        aria-label="party emoji"
        role="img"
      >
@@ -24,11 +24,11 @@
       
      XEC
       to send to others
    </div>,
    <div
-     className="sc-Rmtcm doZmKW"
+     className="sc-hzDkRC lmPOKb"
    >
      0
       
      XEC
    </div>,
@@ -114,20 +114,20 @@
          cxkrr6zd
        </span>
      </div>
    </div>,
    <div
-     className="sc-gisBJw bgeSVQ"
+     className="sc-cHGsZl hAuusT"
    >
      <div
-       className="sc-kjoXOD bocqe"
+       className="sc-TOsTZ gBqYyX"
        onClick={[Function]}
      >
        XEC
      </div>
      <div
-       className="sc-kjoXOD bocqe nonactiveBtn"
+       className="sc-TOsTZ gBqYyX nonactiveBtn"
        onClick={[Function]}
      >
        eToken
      </div>
    </div>,
    at Object.<anonymous> (/work/web/cashtab/src/components/Wallet/__tests__/Wallet.test.js:62:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet with BCH balances and tokens 1`

- Snapshot  - 1
+ Received  + 1

@@ -383,11 +383,11 @@
          </div>
        </form>
      </div>
    </div>,
    <div
-     className="sc-kvZOFW crFufP"
+     className="sc-jbKcbu dudaer"
    >
      Signatures
    </div>,
    <div
      className="ant-collapse ant-collapse-icon-position-left sc-fjdhpX ddFLEP"
    at Object.<anonymous> (/work/web/cashtab/src/components/Send/__tests__/Send.test.js:82:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)
====== CashTab Unit Tests:  Wallet with BCH balances and tokens and state field ======
Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet with BCH balances and tokens and state field 1`

- Snapshot  - 5
+ Received  + 5

@@ -1,15 +1,15 @@
  Array [
    <div
-     className="sc-Rmtcm doZmKW"
+     className="sc-hzDkRC lmPOKb"
    >
      0.06
       
      XEC
    </div>,
    <div
-     className="sc-bRBYWo itMbWO"
+     className="sc-jhAzac fkirzc"
    >
      $ 
      NaN
       
      USD
@@ -96,20 +96,20 @@
          cxkrr6zd
        </span>
      </div>
    </div>,
    <div
-     className="sc-gisBJw bgeSVQ"
+     className="sc-cHGsZl hAuusT"
    >
      <div
-       className="sc-kjoXOD bocqe"
+       className="sc-TOsTZ gBqYyX"
        onClick={[Function]}
      >
        XEC
      </div>
      <div
-       className="sc-kjoXOD bocqe nonactiveBtn"
+       className="sc-TOsTZ gBqYyX nonactiveBtn"
        onClick={[Function]}
      >
        eToken
      </div>
    </div>,
    at Object.<anonymous> (/work/web/cashtab/src/components/Wallet/__tests__/Wallet.test.js:75:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)Error: expect(received).toMatchSnapshot()

Snapshot name: `Wallet with BCH balances and tokens and state field 1`

- Snapshot  - 1
+ Received  + 1

@@ -391,11 +391,11 @@
          </div>
        </form>
      </div>
    </div>,
    <div
-     className="sc-kvZOFW crFufP"
+     className="sc-jbKcbu dudaer"
    >
      Signatures
    </div>,
    <div
      className="ant-collapse ant-collapse-icon-position-left sc-fjdhpX ddFLEP"
    at Object.<anonymous> (/work/web/cashtab/src/components/Send/__tests__/Send.test.js:96:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)
====== CashTab Unit Tests:  Without wallet defined ======
Error: expect(received).toMatchSnapshot()

Snapshot name: `Without wallet defined 1`

- Snapshot  - 1
+ Received  + 1

@@ -383,11 +383,11 @@
          </div>
        </form>
      </div>
    </div>,
    <div
-     className="sc-kvZOFW crFufP"
+     className="sc-jbKcbu dudaer"
    >
      Signatures
    </div>,
    <div
      className="ant-collapse ant-collapse-icon-position-left sc-fjdhpX ddFLEP"
    at Object.<anonymous> (/work/web/cashtab/src/components/Send/__tests__/Send.test.js:114:18)
    at Object.asyncJestTest (/work/web/cashtab/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:106:37)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:45:12
    at new Promise (<anonymous>)
    at mapper (/work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:28:19)
    at /work/web/cashtab/node_modules/jest-jasmine2/build/queueRunner.js:75:41
    at processTicksAndRejections (node:internal/process/task_queues:94:5)

Each failure log is accessible here:
CashTab Unit Tests: Wallet without BCH balance
CashTab Unit Tests: Wallet with BCH balances
CashTab Unit Tests: Wallet with BCH balances and tokens
CashTab Unit Tests: Wallet with BCH balances and tokens and state field
CashTab Unit Tests: Without wallet defined

This revision is now accepted and ready to land.Nov 29 2021, 22:44