diff --git a/.env.example b/.env.example index 5d9d73148..8d65d2944 100644 --- a/.env.example +++ b/.env.example @@ -4,3 +4,4 @@ MOON_PAY_API_KEY= # Analytics MIX_PANEL_TOKEN= +MIX_PANEL_EXPLORE_APP_TOKEN= \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json index 5f3531fda..4af13d6ea 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -23,6 +23,7 @@ "plugins": ["react", "prettier", "eslint-plugin-no-inline-styles", "@tanstack/query"], "rules": { "consistent-return": "off", + "no-await-in-loop": "off", "import/prefer-default-export": 1, "no-restricted-imports": [ "warn", @@ -50,8 +51,19 @@ } ], "no-plusplus": "off", - "@tanstack/query/exhaustive-deps": 1 + "@tanstack/query/exhaustive-deps": 1, + "import/order": 0 }, + "overrides": [ + { + "files": ["tests/**/*.{js,jsx,ts,tsx}"], + "plugins": ["playwright"], + "extends": ["plugin:playwright/playwright-test"], + "rules": { + "playwright/expect-expect": "off" + } + } + ], "settings": { "import/resolver": { "node": { diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..2b1e0903d --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @secretkeylabs/reviewers-web-extension diff --git a/.github/workflows/build-rc.yml b/.github/workflows/build-rc.yml index 1412ae734..d7ae94a6c 100644 --- a/.github/workflows/build-rc.yml +++ b/.github/workflows/build-rc.yml @@ -12,12 +12,13 @@ on: - main - develop jobs: - test: + build: if: ${{ startsWith(github.head_ref, 'release/') }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - name: Use Node.js + uses: actions/setup-node@v4 with: always-auth: true node-version: 18 @@ -33,10 +34,100 @@ jobs: npx eslint . npx tsc --noEmit npm test + - name: Build + env: + TRANSAC_API_KEY: ${{ secrets.TRANSAC_API_KEY }} + MOON_PAY_API_KEY: ${{ secrets.MOON_PAY_API_KEY }} + MIX_PANEL_TOKEN: ${{ secrets.MIX_PANEL_TOKEN }} + MIX_PANEL_EXPLORE_APP_TOKEN: ${{ secrets.MIX_PANEL_EXPLORE_APP_TOKEN }} + run: npm run build + - name: Upload Archive + uses: actions/upload-artifact@v3 + with: + name: web-extension1 + path: ./build + retention-days: 5 + if-no-files-found: error + UItest: + needs: [build] + name: UI Test ${{ matrix.shardIndex }} of ${{ matrix.shardTotal }} + timeout-minutes: 10 + runs-on: ubuntu-20.04 + strategy: + fail-fast: false + matrix: + shardIndex: [1, 2, 3, 4, 5, 6] + shardTotal: [6] + steps: + - uses: actions/checkout@v4 + - name: Download build artifact + uses: actions/download-artifact@v3 + with: + name: web-extension1 + path: ./build + - name: Use Node.js + uses: actions/setup-node@v4 + with: + always-auth: true + node-version: 18 + registry-url: https://npm.pkg.github.com + scope: '@secretkeylabs' + cache: npm + - name: Install dependencies + env: + NODE_AUTH_TOKEN: ${{ secrets.GH_PACKAGE_REGISTRY_TOKEN }} + run: npm install playwright + - name: Install Playwright Browsers + run: npx playwright install chromium --with-deps + - name: Run UI test suite + run: xvfb-run --auto-servernum --server-args="-screen 0 360x360x24" npx playwright test --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} + - name: Upload Playwright report + if: ${{ !cancelled() }} + uses: actions/upload-artifact@v3 + with: + name: all-blob-reports + path: blob-report + retention-days: 1 + + merge-reports: + # Merge reports after playwright-tests, even if some shards have failed but not if the job was skipped + if: ${{ always() && needs.UItest.result != 'skipped' }} + needs: [UItest] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + always-auth: true + node-version: 18 + registry-url: https://npm.pkg.github.com + scope: '@secretkeylabs' + cache: npm + - name: Install dependencies + env: + NODE_AUTH_TOKEN: ${{ secrets.GH_PACKAGE_REGISTRY_TOKEN }} + run: npm install playwright + + - name: Download blob reports from GitHub Actions Artifacts + uses: actions/download-artifact@v3 + with: + name: all-blob-reports + path: all-blob-reports + + - name: Merge into HTML Report + run: npx playwright merge-reports --reporter html ./all-blob-reports + + - name: Upload HTML report + uses: actions/upload-artifact@v3 + with: + name: html-report--attempt-${{ github.run_attempt }} + path: playwright-report + retention-days: 5 + publish-rc: # TODO also keep the develop PR description up to date if: ${{ github.base_ref == 'main' }} - needs: test + needs: [UItest] runs-on: ubuntu-latest permissions: contents: write @@ -101,25 +192,14 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - name: Download build artifact + uses: actions/download-artifact@v3 with: - always-auth: true - node-version: 18 - registry-url: https://npm.pkg.github.com - scope: '@secretkeylabs' - cache: npm - - name: Install dependencies - env: - NODE_AUTH_TOKEN: ${{ secrets.GH_PACKAGE_REGISTRY_TOKEN }} - run: npm ci - - name: Build & zip - env: - TRANSAC_API_KEY: ${{ secrets.TRANSAC_API_KEY }} - MOON_PAY_API_KEY: ${{ secrets.MOON_PAY_API_KEY }} - MIX_PANEL_TOKEN: ${{ secrets.MIX_PANEL_TOKEN }} - run: | - npm run build - zip -rj build.zip ./build + name: web-extension1 + path: ./build + - uses: actions/setup-node@v4 + - name: zip + run: zip -rj build.zip ./build - name: Upload release asset uses: actions/upload-release-asset@v1 env: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 694746aa6..e49e8343c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,7 +11,7 @@ on: jobs: build: if: ${{ !startsWith(github.head_ref, 'release/') }} - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v4 - name: Use Node.js @@ -36,7 +36,19 @@ jobs: TRANSAC_API_KEY: ${{ secrets.TRANSAC_API_KEY }} MOON_PAY_API_KEY: ${{ secrets.MOON_PAY_API_KEY }} MIX_PANEL_TOKEN: ${{ secrets.MIX_PANEL_TOKEN }} + MIX_PANEL_EXPLORE_APP_TOKEN: ${{ secrets.MIX_PANEL_EXPLORE_APP_TOKEN }} run: npm run build --if-present + - name: Install Playwright Browsers + run: npx playwright install chromium --with-deps + - name: Run UI test suite + run: xvfb-run --auto-servernum --server-args="-screen 0 360x360x24" npx playwright test --grep "#smoketest" --reporter=html + - name: Upload Playwright report + if: always() + uses: actions/upload-artifact@v3 + with: + name: playwright-report + path: playwright-report/ + retention-days: 30 - name: Save Filename run: | BRANCH_NAME=$(echo ${{ github.head_ref }} | sed 's/\//-/g') diff --git a/.github/workflows/merge-repos.yml b/.github/workflows/merge-repos.yml new file mode 100644 index 000000000..17da4684f --- /dev/null +++ b/.github/workflows/merge-repos.yml @@ -0,0 +1,34 @@ +name: Merge branch to remote + +on: + workflow_dispatch: + inputs: + branch: + description: 'Merge branch' + required: true + default: develop + type: choice + options: + - develop + - main + +jobs: + merge-branch-to-remote: + runs-on: ubuntu-latest + permissions: + pull-requests: write + contents: write + steps: + - uses: actions/checkout@v4 + - id: run-merge-script + env: + ORIGIN_BRANCH: ${{ inputs.branch }} + REMOTE_REPO: ${{ secrets.REMOTE_REPO }} + GH_TOKEN: ${{ secrets.GH_REPOS_RW_PAT }} + run: | + # git config + git config user.name "GitHub Actions Bot" + git config user.email "<>" + # run shell script + cd scripts + ORIGIN_BRANCH=$ORIGIN_BRANCH REMOTE_REPO=$REMOTE_REPO ./merge-to-remote.sh diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml new file mode 100644 index 000000000..be856c7d4 --- /dev/null +++ b/.github/workflows/playwright.yml @@ -0,0 +1,119 @@ +name: UI Test Suite +on: + pull_request: + branches: + - develop + workflow_dispatch: + +jobs: + build: + if: ${{ startsWith(github.head_ref, 'e2etest/') || github.event_name == 'workflow_dispatch' }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Use Node.js + uses: actions/setup-node@v4 + with: + always-auth: true + node-version: 18 + registry-url: https://npm.pkg.github.com + scope: '@secretkeylabs' + cache: npm + - name: Install dependencies + env: + NODE_AUTH_TOKEN: ${{ secrets.GH_PACKAGE_REGISTRY_TOKEN }} + run: npm ci + - name: Test + run: | + npx eslint . + npx tsc --noEmit + npm test + - name: Build + env: + TRANSAC_API_KEY: ${{ secrets.TRANSAC_API_KEY }} + MOON_PAY_API_KEY: ${{ secrets.MOON_PAY_API_KEY }} + MIX_PANEL_TOKEN: ${{ secrets.MIX_PANEL_TOKEN }} + MIX_PANEL_EXPLORE_APP_TOKEN: ${{ secrets.MIX_PANEL_EXPLORE_APP_TOKEN }} + run: npm run build --if-present + - name: Upload Archive + uses: actions/upload-artifact@v3 + with: + name: web-extension1 + path: ./build + retention-days: 5 + if-no-files-found: error + UItest: + needs: [build] + name: UI Test ${{ matrix.shardIndex }} of ${{ matrix.shardTotal }} + timeout-minutes: 10 + runs-on: ubuntu-20.04 + strategy: + fail-fast: false + matrix: + shardIndex: [1, 2, 3, 4, 5] + shardTotal: [5] + steps: + - uses: actions/checkout@v4 + - name: Download build artifact + uses: actions/download-artifact@v3 + with: + name: web-extension1 + path: ./build + - name: Use Node.js + uses: actions/setup-node@v4 + with: + always-auth: true + node-version: 18 + registry-url: https://npm.pkg.github.com + scope: '@secretkeylabs' + cache: npm + - name: Install dependencies + env: + NODE_AUTH_TOKEN: ${{ secrets.GH_PACKAGE_REGISTRY_TOKEN }} + run: npm install playwright + - name: Install Playwright Browsers + run: npx playwright install chromium --with-deps + - name: Run UI test suite + run: xvfb-run --auto-servernum --server-args="-screen 0 360x360x24" npx playwright test --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} + - name: Upload Playwright report + if: ${{ !cancelled() }} + uses: actions/upload-artifact@v3 + with: + name: all-blob-reports + path: blob-report + retention-days: 1 + + merge-reports: + # Merge reports after playwright-tests, even if some shards have failed + if: ${{ always() && needs.UItest.result != 'skipped' }} + needs: [UItest] + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + always-auth: true + node-version: 18 + registry-url: https://npm.pkg.github.com + scope: '@secretkeylabs' + cache: npm + - name: Install dependencies + env: + NODE_AUTH_TOKEN: ${{ secrets.GH_PACKAGE_REGISTRY_TOKEN }} + run: npm install playwright + + - name: Download blob reports from GitHub Actions Artifacts + uses: actions/download-artifact@v3 + with: + name: all-blob-reports + path: all-blob-reports + + - name: Merge into HTML Report + run: npx playwright merge-reports --reporter html ./all-blob-reports + + - name: Upload HTML report + uses: actions/upload-artifact@v3 + with: + name: html-report--attempt-${{ github.run_attempt }} + path: playwright-report + retention-days: 5 diff --git a/.github/workflows/release-develop.yml b/.github/workflows/release-develop.yml new file mode 100644 index 000000000..0d4765211 --- /dev/null +++ b/.github/workflows/release-develop.yml @@ -0,0 +1,33 @@ +name: Merge release to develop +## +# This workflow triggers on merge of release branch back to develop +# +# It should push to public repo +# +on: + pull_request: + branches: + - develop + types: + - closed +jobs: + publish-latest: + if: ${{ github.event.pull_request.merged == true && startsWith(github.head_ref, 'release/')}} + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + env: + GH_TOKEN: ${{ github.token }} + steps: + - uses: actions/checkout@v4 + - id: push-to-public + name: Push to public remote + if: ${{ contains(github.repositoryUrl, 'private') }} + run: | + # git config + git config user.name "GitHub Actions Bot" + git config user.email "<>" + # run shell script + cd scripts + ORIGIN_BRANCH=develop REMOTE_REPO=xverse-web-extension ./merge-to-remote.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9401e3cdc..a062aa7d6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,6 +29,7 @@ jobs: env: SOURCE_BRANCH: ${{ github.head_ref }} run: | + cd scripts # find the target commitish of the latest release matching our tag TAG=$(echo $SOURCE_BRANCH | sed 's/release\/\(.*\)/\1/') gh api \ @@ -48,6 +49,8 @@ jobs: -f name="$TAG" \ -F generate_release_notes=true > release.json # save env for upload + echo "TAG=$TAG" >> $GITHUB_ENV + echo "TARGET_COMMITISH=$TARGET_COMMITISH" >> $GITHUB_ENV echo "TAG_RC=$TAG_RC" >> $GITHUB_ENV echo "FILENAME=xverse-web-extension.$TAG.zip" >> $GITHUB_ENV echo "UPLOAD_URL=$(cat release.json | jq -r .upload_url)" >> $GITHUB_ENV @@ -68,11 +71,11 @@ jobs: - id: download-latest-asset name: Download latest asset from rc run: | - RELEASE_ID=$(cat releases.json | jq -r ".[] | select(.tag_name==\"$TAG_RC\") | .id") + ASSET_ID=$(cat releases.json | jq -r ".[] | select(.tag_name==\"$TAG_RC\") | .assets[0].id") gh api \ -H "Accept: application/octet-stream" \ -H "X-GitHub-Api-Version: 2022-11-28" \ - /repos/{owner}/{repo}/releases/assets/$RELEASE_ID > build.zip + /repos/{owner}/{repo}/releases/assets/$ASSET_ID > build.zip - id: upload-latest-asset name: Upload latest asset to latest release uses: actions/upload-release-asset@v1 @@ -83,3 +86,41 @@ jobs: asset_path: build.zip asset_name: ${{ env.FILENAME }} asset_content_type: application/zip + - id: push-to-public + name: Push to public remote + if: ${{ contains(github.repositoryUrl, 'private') }} + env: + REMOTE_REPO: xverse-web-extension + run: | + # git config + git config user.name "GitHub Actions Bot" + git config user.email "<>" + # run shell script + ./merge-to-remote.sh + - id: copy-release-to-public + name: Copy release to public remote + env: + REMOTE_REPO: xverse-web-extension + run: | + # publish the latest release on remote + cat release.json | jq -r .body > public-body.md + gh api \ + --method POST \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + /repos/{owner}/$REMOTE_REPO/releases \ + -f tag_name="$TAG" \ + -f target_commitish="$TARGET_COMMITISH" \ + -f name="$TAG" \ + -F 'body=@public-body.md' > public-release.json + echo "PUBLIC_UPLOAD_URL=$(cat public-release.json | jq -r .upload_url)" >> $GITHUB_ENV + - id: upload-latest-asset-to-public + name: Upload latest asset to latest release on public remote + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ env.PUBLIC_UPLOAD_URL}} + asset_path: build.zip + asset_name: ${{ env.FILENAME }} + asset_content_type: application/zip diff --git a/.gitignore b/.gitignore index eb565e1fc..6ca20681c 100644 --- a/.gitignore +++ b/.gitignore @@ -131,3 +131,12 @@ yarn-error.log* #editors .idea .vscode +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ +tests/specs/seedWords.json +tests/specs/addresses.json + +# multiple wallets +prebuilt-wallets diff --git a/README.md b/README.md index 7797cffe6..898e17c34 100644 --- a/README.md +++ b/README.md @@ -7,14 +7,15 @@ 1. Check if your [Node.js](https://nodejs.org/) version is >= **14**. 2. Clone this repository. 3. Make sure you're logged in to the @secretkeylabs scope on the GitHub NPM package registry. See the [Guide](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry#authenticating-with-a-personal-access-token) - 1. Create a GitHub personal access token (classic) + 1. Create a GitHub personal access token (classic) 2. Run `npm login --scope=@secretkeylabs --registry=https://npm.pkg.github.com` 3. Username: GITHUB USERNAME Password: PERSONAL_ACCESS_TOKEN Email: PUBLIC-EMAIL-ADDRESS -4. Run `npm install` to install the dependencies. -5. Run `npm start` -6. Load your extension on Chrome following: +4. Add .env file (example: .env.example) +5. Run `npm install` to install the dependencies. +6. Run `npm start` +7. Load your extension on Chrome following: 1. Access `chrome://extensions/` 2. Check `Developer mode` 3. Click on `Load unpacked extension` @@ -31,3 +32,14 @@ make or pull your local changes to xverse-core, then: cd ../xverse-core && npm i && npm run build:esm && \ cd $OLDPWD && npm i --legacy-peer-deps @secretkeylabs/xverse-core@../xverse-core && npm start ``` + +### Run UI Tests +To run ui tests, run: +``` +npm run uitest +``` + +To generate test report, run: +``` +npm run uitest:report +``` diff --git a/package-lock.json b/package-lock.json index 549a1c52d..870b6e25c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,19 @@ { "name": "xverse-web-extension", - "version": "0.32.3", + "version": "0.34.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "xverse-web-extension", - "version": "0.32.3", + "version": "0.34.1", "dependencies": { "@ledgerhq/hw-transport-webusb": "^6.27.13", "@phosphor-icons/react": "^2.0.10", + "@playwright/test": "^1.43.1", "@react-spring/web": "^9.6.1", "@scure/btc-signer": "1.2.1", - "@secretkeylabs/xverse-core": "13.0.0", + "@secretkeylabs/xverse-core": "13.4.0", "@stacks/connect": "7.4.1", "@stacks/stacks-blockchain-api-types": "6.1.1", "@stacks/transactions": "6.9.0", @@ -23,7 +24,7 @@ "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", - "alex-sdk": "^0.1.18", + "alex-sdk": "0.1.26", "argon2-browser": "^1.18.0", "axios": "^1.1.3", "bignumber.js": "^9.1.0", @@ -33,6 +34,7 @@ "classnames": "^2.3.2", "crypto-browserify": "^3.12.0", "date-fns": "^2.29.3", + "dotenv": "^16.4.5", "i": "0.3.7", "i18next": "^21.9.1", "js-sha256": "^0.10.1", @@ -65,13 +67,16 @@ "redux": "^4.0.5", "redux-persist": "^6.0.0", "redux-state-sync": "^3.1.4", - "sats-connect": "1.4.0", + "sats-connect": "2.1.0", "stream-browserify": "^3.0.0", "string-to-color": "^2.2.2", "styled-components": "^5.3.5", + "superjson": "2.2.1", "swiper": "11.0.6", + "ts-transformer-keys": "0.4.4", "valid-url": "^1.0.9", "webextension-polyfill": "^0.10.0", + "zod": "3.22.4", "zxcvbn": "^4.4.2" }, "devDependencies": { @@ -79,6 +84,8 @@ "@tanstack/eslint-plugin-query": "^4.29.4", "@types/argon2-browser": "^1.18.1", "@types/chrome": "^0.0.237", + "@types/mixpanel-browser": "^2.49.0", + "@types/node": "^20.11.30", "@types/react": "^18.0.20", "@types/react-dom": "^18.0.6", "@types/react-lottie": "^1.2.10", @@ -94,13 +101,14 @@ "copy-webpack-plugin": "^11.0.0", "css-loader": "^6.7.1", "dotenv-webpack": "^8.0.1", - "eslint": "8.22.0", + "eslint": "8.40.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-airbnb-typescript": "^17.0.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.6.1", "eslint-plugin-no-inline-styles": "^1.0.5", + "eslint-plugin-playwright": "^1.5.4", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-react": "^7.31.8", "eslint-plugin-react-hooks": "^4.6.0", @@ -134,6 +142,82 @@ "node": "^18.18.2" } }, + "../xverse-core": { + "name": "@secretkeylabs/xverse-core", + "version": "11.2.0", + "extraneous": true, + "license": "ISC", + "dependencies": { + "@bitcoinerlab/secp256k1": "^1.0.2", + "@noble/curves": "^1.2.0", + "@noble/secp256k1": "^1.7.1", + "@scure/base": "^1.1.1", + "@scure/btc-signer": "1.2.1", + "@stacks/auth": "^6.9.0", + "@stacks/connect": "^7.4.1", + "@stacks/encryption": "6.9.0", + "@stacks/network": "6.8.1", + "@stacks/stacking": "^6.12.0", + "@stacks/storage": "^6.9.0", + "@stacks/transactions": "6.9.0", + "@stacks/wallet-sdk": "^6.9.0", + "@tanstack/react-query": "^4.29.3", + "@zondax/ledger-stacks": "^1.0.4", + "async-mutex": "^0.4.0", + "axios": "1.6.2", + "base64url": "^3.0.1", + "bip32": "^4.0.0", + "bip39": "3.0.3", + "bitcoin-address-validation": "^2.2.1", + "bitcoinjs-lib": "^6.1.3", + "bitcoinjs-message": "^2.2.0", + "bn.js": "^5.1.3", + "bs58": "^5.0.0", + "bs58check": "^3.0.1", + "buffer": "6.0.3", + "c32check": "^2.0.0", + "ecdsa-sig-formatter": "^1.0.11", + "ecpair": "^2.1.0", + "jsontokens": "^4.0.1", + "ledger-bitcoin": "^0.2.1", + "process": "^0.11.10", + "util": "^0.12.4", + "uuidv4": "^6.2.13", + "varuint-bitcoin": "^1.1.2" + }, + "devDependencies": { + "@types/react": "^18.2.18", + "@typescript-eslint/eslint-plugin": "^5.58.0", + "@typescript-eslint/parser": "^5.58.0", + "@vitest/coverage-c8": "^0.31.1", + "airbnb": "^0.0.2", + "axios-mock-adapter": "^1.22.0", + "bip322-js": "^1.1.0", + "eslint": "^8.38.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-airbnb-typescript": "^17.0.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-prettier": "^4.2.1", + "husky": "^8.0.3", + "lint-staged": "^13.2.3", + "mockdate": "^3.0.5", + "prettier": "^2.8.7", + "rimraf": "^3.0.2", + "ts-loader": "^9.4.1", + "typescript": "^4.8.3", + "vitest": "^0.31.1", + "webpack": "^5.74.0", + "webpack-cli": "^4.10.0" + }, + "engines": { + "node": "^18.18.2" + }, + "peerDependencies": { + "bignumber.js": "^9.0.0", + "react": ">18.0.0" + } + }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", @@ -666,246 +750,6 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.8.tgz", - "integrity": "sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz", - "integrity": "sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.8.tgz", - "integrity": "sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.8.tgz", - "integrity": "sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.8.tgz", - "integrity": "sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.8.tgz", - "integrity": "sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.8.tgz", - "integrity": "sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.8.tgz", - "integrity": "sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.8.tgz", - "integrity": "sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.8.tgz", - "integrity": "sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.8.tgz", - "integrity": "sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.8.tgz", - "integrity": "sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.8.tgz", - "integrity": "sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.8.tgz", - "integrity": "sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.8.tgz", - "integrity": "sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/linux-x64": { "version": "0.19.8", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.8.tgz", @@ -922,102 +766,6 @@ "node": ">=12" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.8.tgz", - "integrity": "sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.8.tgz", - "integrity": "sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.8.tgz", - "integrity": "sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.8.tgz", - "integrity": "sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.8.tgz", - "integrity": "sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.8.tgz", - "integrity": "sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -1043,14 +791,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -1066,9 +814,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -1092,6 +840,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/js": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", + "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@floating-ui/core": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", @@ -1115,33 +872,36 @@ "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" }, "node_modules/@humanwhocodes/config-array": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", - "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "engines": { + "node": ">=12.22" + }, "funding": { "type": "github", "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "node_modules/@jest/schemas": { @@ -1372,6 +1132,20 @@ "react-dom": ">= 16.8" } }, + "node_modules/@playwright/test": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.43.1.tgz", + "integrity": "sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==", + "dependencies": { + "playwright": "1.43.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.10", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", @@ -1507,97 +1281,6 @@ "node": ">=14" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.6.0.tgz", - "integrity": "sha512-keHkkWAe7OtdALGoutLY3utvthkGF+Y17ws9LYT8pxMBYXaCoH/8dXS2uzo6e8+sEhY7y/zi5RFo22Dy2lFpDw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.6.0.tgz", - "integrity": "sha512-y3Kt+34smKQNWilicPbBz/MXEY7QwDzMFNgwEWeYiOhUt9MTWKjHqe3EVkXwT2fR7izOvHpDWZ0o2IyD9SWX7A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.6.0.tgz", - "integrity": "sha512-oLzzxcUIHltHxOCmaXl+pkIlU+uhSxef5HfntW7RsLh1eHm+vJzjD9Oo4oUKso4YuP4PpbFJNlZjJuOrxo8dPg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.6.0.tgz", - "integrity": "sha512-+ANnmjkcOBaV25n0+M0Bere3roeVAnwlKW65qagtuAfIxXF9YxUneRyAn/RDcIdRa7QrjRNJL3jR7T43ObGe8Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.6.0.tgz", - "integrity": "sha512-tBTSIkjSVUyrekddpkAqKOosnj1Fc0ZY0rJL2bIEWPKqlEQk0paORL9pUIlt7lcGJi3LzMIlUGXvtNi1Z6MOCQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.6.0.tgz", - "integrity": "sha512-Ed8uJI3kM11de9S0j67wAV07JUNhbAqIrDYhQBrQW42jGopgheyk/cdcshgGO4fW5Wjq97COCY/BHogdGvKVNQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.6.0.tgz", - "integrity": "sha512-mZoNQ/qK4D7SSY8v6kEsAAyDgznzLLuSFCA3aBHZTmf3HP/dW4tNLTtWh9+LfyO0Z1aUn+ecpT7IQ3WtIg3ViQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.6.0.tgz", @@ -1624,45 +1307,6 @@ "linux" ] }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.6.0.tgz", - "integrity": "sha512-+MRMcyx9L2kTrTUzYmR61+XVsliMG4odFb5UmqtiT8xOfEicfYAGEuF/D1Pww1+uZkYhBqAHpvju7VN+GnC3ng==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.6.0.tgz", - "integrity": "sha512-rxfeE6K6s/Xl2HGeK6cO8SiQq3k/3BYpw7cfhW5Bk2euXNEpuzi2cc7llxx1si1QgwfjNtdRNTGqdBzGlFZGFw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.6.0.tgz", - "integrity": "sha512-QqmCsydHS172Y0Kc13bkMXvipbJSvzeglBncJG3LsYJSiPlxYACz7MmJBs4A8l1oU+jfhYEIC/+AUSlvjmiX/g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@scure/base": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz", @@ -1739,10 +1383,9 @@ } }, "node_modules/@secretkeylabs/xverse-core": { - "version": "13.0.0", - "resolved": "https://npm.pkg.github.com/download/@secretkeylabs/xverse-core/13.0.0/229e41ba151b7499225f931de267d800f7e98909", - "integrity": "sha512-M2r3u8UcS7jKjUsDVJRQgAaUYoHmjel0EdbDj0gqL1nZeWZaZZ0zH8/HP8isVMsITWmK0ml/1r7vc72vhDinvQ==", - "license": "ISC", + "version": "13.4.0", + "resolved": "https://npm.pkg.github.com/download/@secretkeylabs/xverse-core/13.4.0/f38348f7f27a5d9cce1f5d506f50d33fe942b0a4", + "integrity": "sha512-NqCOWRkAzOuy4WSrY1ysFwXPfTyyWOJ28vu4kGV4Z3PfLSToqmFapDN10JFnNBO8i64G/6K1TRh5sypb9By10Q==", "dependencies": { "@bitcoinerlab/secp256k1": "^1.0.2", "@noble/curves": "^1.2.0", @@ -1814,14 +1457,14 @@ "dev": true }, "node_modules/@stacks/auth": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/auth/-/auth-6.12.0.tgz", - "integrity": "sha512-ViSpeWNw1MJBtvykcPTcn9vTy9v8pK8jiQFjfOkiFQ0q+oEhIDQrtpN5OYtTh5HvoZk8du+43nIoUYUECNahHQ==", - "dependencies": { - "@stacks/common": "^6.10.0", - "@stacks/encryption": "^6.12.0", - "@stacks/network": "^6.11.3", - "@stacks/profile": "^6.12.0", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/auth/-/auth-6.13.0.tgz", + "integrity": "sha512-3a6FwP5yNngQfalu78MltQzCROL4l+MNngnCxFKo52EJfIdJp8TWKuwkzHN/jLzrvdUoq1lQjKlxoINCiUP03g==", + "dependencies": { + "@stacks/common": "^6.13.0", + "@stacks/encryption": "^6.13.0", + "@stacks/network": "^6.13.0", + "@stacks/profile": "^6.13.0", "cross-fetch": "^3.1.5", "jsontokens": "^4.0.1" } @@ -1838,14 +1481,14 @@ ] }, "node_modules/@stacks/auth/node_modules/@stacks/encryption": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/encryption/-/encryption-6.12.0.tgz", - "integrity": "sha512-CubE51pHrcxx3yA+xapevPgA9UDleIoEaUZ06/9uD91B42yvTg37HyS8t06rzukU9q+X7Cv2I/+vbuf4nJIo8g==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/encryption/-/encryption-6.13.0.tgz", + "integrity": "sha512-CsacBxY1XBVXBuJ5erJPjB5FmQ8KGJ/ft02/pIM6WrJ31ZcBdkn2BPV1AsPSD5qsIkiMdHAe14WKIwm8M2SWtQ==", "dependencies": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", "@scure/bip39": "1.1.0", - "@stacks/common": "^6.10.0", + "@stacks/common": "^6.13.0", "@types/node": "^18.0.4", "base64-js": "^1.5.1", "bs58": "^5.0.0", @@ -1854,23 +1497,39 @@ } }, "node_modules/@stacks/auth/node_modules/@stacks/network": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.11.3.tgz", - "integrity": "sha512-c4ClCU/QUwuu8NbHtDKPJNa0M5YxauLN3vYaR0+S4awbhVIKFQSxirm9Q9ckV1WBh7FtD6u2S0x+tDQGAODjNg==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.13.0.tgz", + "integrity": "sha512-Ss/Da4BNyPBBj1OieM981fJ7SkevKqLPkzoI1+Yo7cYR2df+0FipIN++Z4RfpJpc8ne60vgcx7nJZXQsiGhKBQ==", "dependencies": { - "@stacks/common": "^6.10.0", + "@stacks/common": "^6.13.0", "cross-fetch": "^3.1.5" } }, + "node_modules/@stacks/auth/node_modules/@types/node": { + "version": "18.19.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.26.tgz", + "integrity": "sha512-+wiMJsIwLOYCvUqSdKTrfkS8mpTp+MPINe6+Np4TAGFWWRWiBQ5kSq9nZGCSPkzx9mvT+uEukzpX4MOSCydcvw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@stacks/common": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@stacks/common/-/common-6.10.0.tgz", - "integrity": "sha512-6x5Z7AKd9/kj3+DYE9xIDIkFLHihBH614i2wqrZIjN02WxVo063hWSjIlUxlx8P4gl6olVzlOy5LzhLJD9OP0A==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/common/-/common-6.13.0.tgz", + "integrity": "sha512-wwzyihjaSdmL6NxKvDeayy3dqM0L0Q2sawmdNtzJDi0FnXuJGm5PeapJj7bEfcI9XwI7Bw5jZoC6mCn9nc5YIw==", "dependencies": { "@types/bn.js": "^5.1.0", "@types/node": "^18.0.4" } }, + "node_modules/@stacks/common/node_modules/@types/node": { + "version": "18.19.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.26.tgz", + "integrity": "sha512-+wiMJsIwLOYCvUqSdKTrfkS8mpTp+MPINe6+Np4TAGFWWRWiBQ5kSq9nZGCSPkzx9mvT+uEukzpX4MOSCydcvw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@stacks/connect": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/@stacks/connect/-/connect-7.4.1.tgz", @@ -1919,6 +1578,14 @@ } ] }, + "node_modules/@stacks/encryption/node_modules/@types/node": { + "version": "18.19.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.29.tgz", + "integrity": "sha512-5pAX7ggTmWZdhUrhRWLPf+5oM7F80bcKVCBbr0zwEkTNzTJL2CWQjznpFgHYy6GrzkYi2Yjy7DHKoynFxqPV8g==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@stacks/network": { "version": "6.8.1", "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.8.1.tgz", @@ -1929,13 +1596,13 @@ } }, "node_modules/@stacks/profile": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/profile/-/profile-6.12.0.tgz", - "integrity": "sha512-eY5IpX+GGHIcYLkivDmf3mkxDIgTQ+LhU8UG4jvOqDi+e1DvF9cIi3+reG5KVo0pQzqyT1OS7+16AwVcgp7/og==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/profile/-/profile-6.13.0.tgz", + "integrity": "sha512-IIOPtP+bHu53j426UTFn+JFgv9G3JyybtJ6TDcc4zxoMvs8sLKEVTyjZNFrP38DjkoAGo1qWNWqoJhURfL55Uw==", "dependencies": { - "@stacks/common": "^6.10.0", - "@stacks/network": "^6.11.3", - "@stacks/transactions": "^6.12.0", + "@stacks/common": "^6.13.0", + "@stacks/network": "^6.13.0", + "@stacks/transactions": "^6.13.0", "jsontokens": "^4.0.1", "schema-inspector": "^2.0.2", "zone-file": "^2.0.0-beta.3" @@ -1953,38 +1620,39 @@ ] }, "node_modules/@stacks/profile/node_modules/@stacks/network": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.11.3.tgz", - "integrity": "sha512-c4ClCU/QUwuu8NbHtDKPJNa0M5YxauLN3vYaR0+S4awbhVIKFQSxirm9Q9ckV1WBh7FtD6u2S0x+tDQGAODjNg==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.13.0.tgz", + "integrity": "sha512-Ss/Da4BNyPBBj1OieM981fJ7SkevKqLPkzoI1+Yo7cYR2df+0FipIN++Z4RfpJpc8ne60vgcx7nJZXQsiGhKBQ==", "dependencies": { - "@stacks/common": "^6.10.0", + "@stacks/common": "^6.13.0", "cross-fetch": "^3.1.5" } }, "node_modules/@stacks/profile/node_modules/@stacks/transactions": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/transactions/-/transactions-6.12.0.tgz", - "integrity": "sha512-gRP3SfTaAIoTdjMvOiLrMZb/senqB8JQlT5Y4C3/CiHhiprYwTx7TbOCSa7WsNOU99H4aNfHvatmymuggXQVkA==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/transactions/-/transactions-6.13.0.tgz", + "integrity": "sha512-xrx09qsXL/tWCkvAArzsFQqtZKDXyedjdVB9uX8xw+cQCi3xZ7r5MHMKzvEsTgJz3EO+MkQBXcvI1uzfuoqhcA==", "dependencies": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", - "@stacks/common": "^6.10.0", - "@stacks/network": "^6.11.3", + "@stacks/common": "^6.13.0", + "@stacks/network": "^6.13.0", "c32check": "^2.0.0", "lodash.clonedeep": "^4.5.0" } }, "node_modules/@stacks/stacking": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/stacking/-/stacking-6.12.0.tgz", - "integrity": "sha512-XBxwbaCGRPnjpjspb3CBXrlZl6xR+gghLMz9PQNPdpuIbBDFa0SGeHgqjtpVU+2DVL4UyBx8PVsAWtlssyVGng==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/stacking/-/stacking-6.13.0.tgz", + "integrity": "sha512-ivzFZkVpqzneJ71T1eZTW8Rr5oVYrs4HkwZqGHxDEySb1I6p96hojH5gEguj9g7szQiyeYLj1dreCvhLh6ET6A==", "dependencies": { + "@noble/hashes": "1.1.5", "@scure/base": "1.1.1", - "@stacks/common": "^6.10.0", - "@stacks/encryption": "^6.12.0", - "@stacks/network": "^6.11.3", + "@stacks/common": "^6.13.0", + "@stacks/encryption": "^6.13.0", + "@stacks/network": "^6.13.0", "@stacks/stacks-blockchain-api-types": "^0.61.0", - "@stacks/transactions": "^6.12.0", + "@stacks/transactions": "^6.13.0", "bs58": "^5.0.0" } }, @@ -2011,14 +1679,14 @@ ] }, "node_modules/@stacks/stacking/node_modules/@stacks/encryption": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/encryption/-/encryption-6.12.0.tgz", - "integrity": "sha512-CubE51pHrcxx3yA+xapevPgA9UDleIoEaUZ06/9uD91B42yvTg37HyS8t06rzukU9q+X7Cv2I/+vbuf4nJIo8g==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/encryption/-/encryption-6.13.0.tgz", + "integrity": "sha512-CsacBxY1XBVXBuJ5erJPjB5FmQ8KGJ/ft02/pIM6WrJ31ZcBdkn2BPV1AsPSD5qsIkiMdHAe14WKIwm8M2SWtQ==", "dependencies": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", "@scure/bip39": "1.1.0", - "@stacks/common": "^6.10.0", + "@stacks/common": "^6.13.0", "@types/node": "^18.0.4", "base64-js": "^1.5.1", "bs58": "^5.0.0", @@ -2027,11 +1695,11 @@ } }, "node_modules/@stacks/stacking/node_modules/@stacks/network": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.11.3.tgz", - "integrity": "sha512-c4ClCU/QUwuu8NbHtDKPJNa0M5YxauLN3vYaR0+S4awbhVIKFQSxirm9Q9ckV1WBh7FtD6u2S0x+tDQGAODjNg==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.13.0.tgz", + "integrity": "sha512-Ss/Da4BNyPBBj1OieM981fJ7SkevKqLPkzoI1+Yo7cYR2df+0FipIN++Z4RfpJpc8ne60vgcx7nJZXQsiGhKBQ==", "dependencies": { - "@stacks/common": "^6.10.0", + "@stacks/common": "^6.13.0", "cross-fetch": "^3.1.5" } }, @@ -2041,32 +1709,40 @@ "integrity": "sha512-yPOfTUboo5eA9BZL/hqMcM71GstrFs9YWzOrJFPeP4cOO1wgYvAcckgBRbgiE3NqeX0A7SLZLDAXLZbATuRq9w==" }, "node_modules/@stacks/stacking/node_modules/@stacks/transactions": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/transactions/-/transactions-6.12.0.tgz", - "integrity": "sha512-gRP3SfTaAIoTdjMvOiLrMZb/senqB8JQlT5Y4C3/CiHhiprYwTx7TbOCSa7WsNOU99H4aNfHvatmymuggXQVkA==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/transactions/-/transactions-6.13.0.tgz", + "integrity": "sha512-xrx09qsXL/tWCkvAArzsFQqtZKDXyedjdVB9uX8xw+cQCi3xZ7r5MHMKzvEsTgJz3EO+MkQBXcvI1uzfuoqhcA==", "dependencies": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", - "@stacks/common": "^6.10.0", - "@stacks/network": "^6.11.3", + "@stacks/common": "^6.13.0", + "@stacks/network": "^6.13.0", "c32check": "^2.0.0", "lodash.clonedeep": "^4.5.0" } }, + "node_modules/@stacks/stacking/node_modules/@types/node": { + "version": "18.19.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.29.tgz", + "integrity": "sha512-5pAX7ggTmWZdhUrhRWLPf+5oM7F80bcKVCBbr0zwEkTNzTJL2CWQjznpFgHYy6GrzkYi2Yjy7DHKoynFxqPV8g==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@stacks/stacks-blockchain-api-types": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/@stacks/stacks-blockchain-api-types/-/stacks-blockchain-api-types-6.1.1.tgz", "integrity": "sha512-Mw5dBPx3DySPupwaq0iBdm1WdEVXIfhjUVaTjI2iSyzWz4Fgs3U7JCaAezLbgNu7Q69c/ZN4JUDWuo9FVjy7oA==" }, "node_modules/@stacks/storage": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/storage/-/storage-6.12.0.tgz", - "integrity": "sha512-RiB8cfWKCm4LrDLXdjtRj4syzvpwmJ/6WKcF+1RHQBTyJerPgxoBn1NoKzjOcydQvVj1jpR/ccaS78xVxlMsTQ==", - "dependencies": { - "@stacks/auth": "^6.12.0", - "@stacks/common": "^6.10.0", - "@stacks/encryption": "^6.12.0", - "@stacks/network": "^6.11.3", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/storage/-/storage-6.13.0.tgz", + "integrity": "sha512-BDgGBysgoo756SUGQ7vTtJKPBhZLBbl9UrO7YoAoVO8vfB569X7PiQbUxwE8R7iLutnlBgP+mnpGDhV9UQo1vA==", + "dependencies": { + "@stacks/auth": "^6.13.0", + "@stacks/common": "^6.13.0", + "@stacks/encryption": "^6.13.0", + "@stacks/network": "^6.13.0", "base64-js": "^1.5.1", "jsontokens": "^4.0.1" } @@ -2083,14 +1759,14 @@ ] }, "node_modules/@stacks/storage/node_modules/@stacks/encryption": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/encryption/-/encryption-6.12.0.tgz", - "integrity": "sha512-CubE51pHrcxx3yA+xapevPgA9UDleIoEaUZ06/9uD91B42yvTg37HyS8t06rzukU9q+X7Cv2I/+vbuf4nJIo8g==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/encryption/-/encryption-6.13.0.tgz", + "integrity": "sha512-CsacBxY1XBVXBuJ5erJPjB5FmQ8KGJ/ft02/pIM6WrJ31ZcBdkn2BPV1AsPSD5qsIkiMdHAe14WKIwm8M2SWtQ==", "dependencies": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", "@scure/bip39": "1.1.0", - "@stacks/common": "^6.10.0", + "@stacks/common": "^6.13.0", "@types/node": "^18.0.4", "base64-js": "^1.5.1", "bs58": "^5.0.0", @@ -2098,13 +1774,21 @@ "varuint-bitcoin": "^1.1.2" } }, - "node_modules/@stacks/storage/node_modules/@stacks/network": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.11.3.tgz", - "integrity": "sha512-c4ClCU/QUwuu8NbHtDKPJNa0M5YxauLN3vYaR0+S4awbhVIKFQSxirm9Q9ckV1WBh7FtD6u2S0x+tDQGAODjNg==", + "node_modules/@stacks/storage/node_modules/@stacks/network": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.13.0.tgz", + "integrity": "sha512-Ss/Da4BNyPBBj1OieM981fJ7SkevKqLPkzoI1+Yo7cYR2df+0FipIN++Z4RfpJpc8ne60vgcx7nJZXQsiGhKBQ==", + "dependencies": { + "@stacks/common": "^6.13.0", + "cross-fetch": "^3.1.5" + } + }, + "node_modules/@stacks/storage/node_modules/@types/node": { + "version": "18.19.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.29.tgz", + "integrity": "sha512-5pAX7ggTmWZdhUrhRWLPf+5oM7F80bcKVCBbr0zwEkTNzTJL2CWQjznpFgHYy6GrzkYi2Yjy7DHKoynFxqPV8g==", "dependencies": { - "@stacks/common": "^6.10.0", - "cross-fetch": "^3.1.5" + "undici-types": "~5.26.4" } }, "node_modules/@stacks/transactions": { @@ -2132,19 +1816,19 @@ ] }, "node_modules/@stacks/wallet-sdk": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/wallet-sdk/-/wallet-sdk-6.12.0.tgz", - "integrity": "sha512-FhTjkDsuikAQ5VGhnqXG1DhncnX1TVO4rfJmbE/rJgkJw+6OJBJF7DrjIs6SCahVeY8FQloYxAQw+slnbddLBQ==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/wallet-sdk/-/wallet-sdk-6.13.0.tgz", + "integrity": "sha512-2+jJ3SWrhPVLc4mokFekwqPLU8tP6ffDC379A4I2xrKWwPk3zjx3/SlqtUnf8CJkwgmsBozRS6SBqd7obIvQAg==", "dependencies": { "@scure/bip32": "1.1.3", "@scure/bip39": "1.1.0", - "@stacks/auth": "^6.12.0", - "@stacks/common": "^6.10.0", - "@stacks/encryption": "^6.12.0", - "@stacks/network": "^6.11.3", - "@stacks/profile": "^6.12.0", - "@stacks/storage": "^6.12.0", - "@stacks/transactions": "^6.12.0", + "@stacks/auth": "^6.13.0", + "@stacks/common": "^6.13.0", + "@stacks/encryption": "^6.13.0", + "@stacks/network": "^6.13.0", + "@stacks/profile": "^6.13.0", + "@stacks/storage": "^6.13.0", + "@stacks/transactions": "^6.13.0", "buffer": "^6.0.3", "c32check": "^2.0.0", "jsontokens": "^4.0.1", @@ -2164,14 +1848,14 @@ ] }, "node_modules/@stacks/wallet-sdk/node_modules/@stacks/encryption": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/encryption/-/encryption-6.12.0.tgz", - "integrity": "sha512-CubE51pHrcxx3yA+xapevPgA9UDleIoEaUZ06/9uD91B42yvTg37HyS8t06rzukU9q+X7Cv2I/+vbuf4nJIo8g==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/encryption/-/encryption-6.13.0.tgz", + "integrity": "sha512-CsacBxY1XBVXBuJ5erJPjB5FmQ8KGJ/ft02/pIM6WrJ31ZcBdkn2BPV1AsPSD5qsIkiMdHAe14WKIwm8M2SWtQ==", "dependencies": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", "@scure/bip39": "1.1.0", - "@stacks/common": "^6.10.0", + "@stacks/common": "^6.13.0", "@types/node": "^18.0.4", "base64-js": "^1.5.1", "bs58": "^5.0.0", @@ -2180,27 +1864,35 @@ } }, "node_modules/@stacks/wallet-sdk/node_modules/@stacks/network": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.11.3.tgz", - "integrity": "sha512-c4ClCU/QUwuu8NbHtDKPJNa0M5YxauLN3vYaR0+S4awbhVIKFQSxirm9Q9ckV1WBh7FtD6u2S0x+tDQGAODjNg==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.13.0.tgz", + "integrity": "sha512-Ss/Da4BNyPBBj1OieM981fJ7SkevKqLPkzoI1+Yo7cYR2df+0FipIN++Z4RfpJpc8ne60vgcx7nJZXQsiGhKBQ==", "dependencies": { - "@stacks/common": "^6.10.0", + "@stacks/common": "^6.13.0", "cross-fetch": "^3.1.5" } }, "node_modules/@stacks/wallet-sdk/node_modules/@stacks/transactions": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/transactions/-/transactions-6.12.0.tgz", - "integrity": "sha512-gRP3SfTaAIoTdjMvOiLrMZb/senqB8JQlT5Y4C3/CiHhiprYwTx7TbOCSa7WsNOU99H4aNfHvatmymuggXQVkA==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/transactions/-/transactions-6.13.0.tgz", + "integrity": "sha512-xrx09qsXL/tWCkvAArzsFQqtZKDXyedjdVB9uX8xw+cQCi3xZ7r5MHMKzvEsTgJz3EO+MkQBXcvI1uzfuoqhcA==", "dependencies": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", - "@stacks/common": "^6.10.0", - "@stacks/network": "^6.11.3", + "@stacks/common": "^6.13.0", + "@stacks/network": "^6.13.0", "c32check": "^2.0.0", "lodash.clonedeep": "^4.5.0" } }, + "node_modules/@stacks/wallet-sdk/node_modules/@types/node": { + "version": "18.19.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.29.tgz", + "integrity": "sha512-5pAX7ggTmWZdhUrhRWLPf+5oM7F80bcKVCBbr0zwEkTNzTJL2CWQjznpFgHYy6GrzkYi2Yjy7DHKoynFxqPV8g==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@stencil/core": { "version": "2.22.3", "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.22.3.tgz", @@ -2316,6 +2008,17 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/@tanstack/react-query-devtools/node_modules/superjson": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-1.13.3.tgz", + "integrity": "sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@tanstack/react-query-persist-client": { "version": "4.32.1", "resolved": "https://registry.npmjs.org/@tanstack/react-query-persist-client/-/react-query-persist-client-4.32.1.tgz", @@ -2842,10 +2545,19 @@ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true }, + "node_modules/@types/mixpanel-browser": { + "version": "2.49.0", + "resolved": "https://registry.npmjs.org/@types/mixpanel-browser/-/mixpanel-browser-2.49.0.tgz", + "integrity": "sha512-StmgUnS58d44DmIAEX9Kk8qwisAYCl6E2qulIjYyHXUPuJCPOuyUMTTKBp+aU2F2do+kxAzCxiBtsB4fnBT9Fg==", + "dev": true + }, "node_modules/@types/node": { - "version": "18.17.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.1.tgz", - "integrity": "sha512-xlR1jahfizdplZYRU59JlUx9uzF1ARa8jbhM11ccpCJya8kvos5jwdm2ZAgxSCwOl0fq21svP18EVwPBXMQudw==" + "version": "20.11.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", + "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -3728,6 +3440,14 @@ "smart-buffer": "^4.1.0" } }, + "node_modules/@zondax/ledger-stacks/node_modules/@types/node": { + "version": "18.19.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.29.tgz", + "integrity": "sha512-5pAX7ggTmWZdhUrhRWLPf+5oM7F80bcKVCBbr0zwEkTNzTJL2CWQjznpFgHYy6GrzkYi2Yjy7DHKoynFxqPV8g==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@zondax/ledger-stacks/node_modules/base-x": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", @@ -3885,11 +3605,11 @@ } }, "node_modules/alex-sdk": { - "version": "0.1.18", - "resolved": "https://registry.npmjs.org/alex-sdk/-/alex-sdk-0.1.18.tgz", - "integrity": "sha512-TEBlO9Xiw/LRBZMM98o6eUqZv6q/qlkDOHQACc0kFGCdqfspcVhE1X83vMVpZYbjKlXnko6mFW6bi+RyMx2L3g==", + "version": "0.1.26", + "resolved": "https://registry.npmjs.org/alex-sdk/-/alex-sdk-0.1.26.tgz", + "integrity": "sha512-uUjbONoAit6htxZGLOFev8v2h59kE31fM1X9efH0Yi1eLXYSSXojj+iFPTlQTQvIysyseXGxkX4VVTc9aQ13sg==", "dependencies": { - "clarity-codegen": "^0.2.0" + "clarity-codegen": "^0.3.5" }, "engines": { "node": ">=10" @@ -4994,12 +4714,12 @@ } }, "node_modules/clarity-codegen": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/clarity-codegen/-/clarity-codegen-0.2.2.tgz", - "integrity": "sha512-sCy14oP701Y5pmFPsO+1r9VD7lRWvmQ/89+1x30y0ITKLnBALAmBepIBAY1NTfr6SuYlFBrLMAH46P019pBQHg==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/clarity-codegen/-/clarity-codegen-0.3.6.tgz", + "integrity": "sha512-Be1J8RFtPFGfWtQ/7enl3xkU1j2KkIS9W7RbuofIVYfKp11MCZSGQeNV+Gh0dQOQIs3O0WQLLg03ikyNaWtYzQ==", "dependencies": { "@stacks/stacks-blockchain-api-types": "^7.1.10", - "axios": "^1.4.0", + "axios": "^1.5.0", "lodash": "^4.17.21", "yargs": "^17.7.2", "yqueue": "^1.0.1" @@ -5012,9 +4732,9 @@ } }, "node_modules/clarity-codegen/node_modules/@stacks/stacks-blockchain-api-types": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@stacks/stacks-blockchain-api-types/-/stacks-blockchain-api-types-7.3.0.tgz", - "integrity": "sha512-kpv9UlOmgTdWjzBdv8WYpYLpR0A9shl7pAae25iP0RqtNKE0FZti/I3k7zkXxpxoNTVjb9ys9iEf0AFtfhSmPQ==" + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@stacks/stacks-blockchain-api-types/-/stacks-blockchain-api-types-7.9.0.tgz", + "integrity": "sha512-29tcIOxEj0jIAVrMLH2hDuTM0wWtOT4z9EnNgOCEQvipEDPyvoaPjbYJmQUTxzvVjfoLjZAQsvTlJw7fnbkkrg==" }, "node_modules/classnames": { "version": "2.3.2", @@ -6111,12 +5831,14 @@ } }, "node_modules/dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "dev": true, + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, "node_modules/dotenv-defaults": { @@ -6128,6 +5850,15 @@ "dotenv": "^8.2.0" } }, + "node_modules/dotenv-defaults/node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/dotenv-webpack": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-8.0.1.tgz", @@ -6469,38 +6200,41 @@ } }, "node_modules/eslint": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz", - "integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.40.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.3", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -6508,11 +6242,9 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" @@ -6729,6 +6461,54 @@ "lodash.get": "^4.4.2" } }, + "node_modules/eslint-plugin-playwright": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-1.5.4.tgz", + "integrity": "sha512-J38Wy3Vc2f9y73J+KRmgXgbYI8TZ3zbz6qBbTj3PhpFndUS572jZ7kqQ3rJ9si5BaMHT7lmZzraO+3UjwIDV4Q==", + "dev": true, + "dependencies": { + "globals": "^13.23.0" + }, + "engines": { + "node": ">=16.6.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0", + "eslint-plugin-jest": ">=25" + }, + "peerDependenciesMeta": { + "eslint-plugin-jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-playwright/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-playwright/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint-plugin-prettier": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", @@ -6842,33 +6622,6 @@ "node": ">=4.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-visitor-keys": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", @@ -6982,6 +6735,15 @@ "node": ">=8" } }, + "node_modules/eslint/node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -7635,20 +7397,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -7672,12 +7420,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -9130,6 +8872,16 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/js-sdsl": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", + "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/js-sha256": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.10.1.tgz", @@ -13462,6 +13214,47 @@ "pathe": "^1.1.0" } }, + "node_modules/playwright": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.43.1.tgz", + "integrity": "sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==", + "dependencies": { + "playwright-core": "1.43.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.43.1.tgz", + "integrity": "sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -14372,18 +14165,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -14680,9 +14461,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sats-connect": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sats-connect/-/sats-connect-1.4.0.tgz", - "integrity": "sha512-jXc9sFdFp9iDDXF4ptSiiWEjHiJUyhvPh2h37QI6IrfhH00Awxjqjhq8PXmfum2ODMzYKDEzI1gXo/UUaToCCA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sats-connect/-/sats-connect-2.1.0.tgz", + "integrity": "sha512-HCPG3L0GModbC2g4uk+ezpSUr8kfCw1y5kv6LC9N8ZNNSRFTTK/CX9eSStV7bBGk5po+euaLsRy4YlLihRcnnw==", "dependencies": { "jsontokens": "^4.0.1", "process": "^0.11.10", @@ -15437,14 +15218,14 @@ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, "node_modules/superjson": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-1.13.1.tgz", - "integrity": "sha512-AVH2eknm9DEd3qvxM4Sq+LTCkSXE2ssfh1t11MHMXyYXFQyQ1HLgVvV+guLTsaQnJU3gnaVo34TohHPulY/wLg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", + "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", "dependencies": { "copy-anything": "^3.0.2" }, "engines": { - "node": ">=10" + "node": ">=16" } }, "node_modules/supports-color": { @@ -15780,6 +15561,14 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/ts-transformer-keys": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/ts-transformer-keys/-/ts-transformer-keys-0.4.4.tgz", + "integrity": "sha512-LrqgvaFvar01/5mbunRyeLTSIkqoC2xfcpL/90aDY6vR07DGyH+UaYGdIEsUudnlAw2Sr0pxFgdZvE0QIyI4qA==", + "peerDependencies": { + "typescript": ">=2.4.1" + } + }, "node_modules/tsc-files": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/tsc-files/-/tsc-files-1.1.4.tgz", @@ -16078,7 +15867,6 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -16128,6 +15916,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "node_modules/unload": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", @@ -16254,12 +16047,6 @@ "uuid": "8.3.2" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "node_modules/valid-url": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", @@ -17072,6 +16859,14 @@ "node": ">=12" } }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -17098,14 +16893,6 @@ "node": ">=8" } }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -17123,6 +16910,14 @@ "resolved": "https://registry.npmjs.org/yqueue/-/yqueue-1.0.1.tgz", "integrity": "sha512-DBxJZBRafFLA/tCc5uO8ZTGFr+sQgn1FRJkZ4cVrIQIk6bv2bInraE3mbpLAJw9z93JGrLkqDoyTLrrZaCNq5w==" }, + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/zone-file": { "version": "2.0.0-beta.3", "resolved": "https://registry.npmjs.org/zone-file/-/zone-file-2.0.0-beta.3.tgz", @@ -17514,146 +17309,41 @@ "requires": { "@emotion/hash": "^0.9.1", "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", - "csstype": "^3.0.2" - } - }, - "@emotion/sheet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", - "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" - }, - "@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" - }, - "@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" - }, - "@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", - "requires": {} - }, - "@emotion/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" - }, - "@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" - }, - "@esbuild/android-arm": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.8.tgz", - "integrity": "sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz", - "integrity": "sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.8.tgz", - "integrity": "sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.8.tgz", - "integrity": "sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.8.tgz", - "integrity": "sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.8.tgz", - "integrity": "sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.8.tgz", - "integrity": "sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.8.tgz", - "integrity": "sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.8.tgz", - "integrity": "sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==", - "dev": true, - "optional": true + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } }, - "@esbuild/linux-ia32": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.8.tgz", - "integrity": "sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==", - "dev": true, - "optional": true + "@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" }, - "@esbuild/linux-loong64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.8.tgz", - "integrity": "sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==", - "dev": true, - "optional": true + "@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" }, - "@esbuild/linux-mips64el": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.8.tgz", - "integrity": "sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==", - "dev": true, - "optional": true + "@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" }, - "@esbuild/linux-ppc64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.8.tgz", - "integrity": "sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==", - "dev": true, - "optional": true + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "requires": {} }, - "@esbuild/linux-riscv64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.8.tgz", - "integrity": "sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==", - "dev": true, - "optional": true + "@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" }, - "@esbuild/linux-s390x": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.8.tgz", - "integrity": "sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==", - "dev": true, - "optional": true + "@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "@esbuild/linux-x64": { "version": "0.19.8", @@ -17662,48 +17352,6 @@ "dev": true, "optional": true }, - "@esbuild/netbsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.8.tgz", - "integrity": "sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.8.tgz", - "integrity": "sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.8.tgz", - "integrity": "sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.8.tgz", - "integrity": "sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.8.tgz", - "integrity": "sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.8.tgz", - "integrity": "sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==", - "dev": true, - "optional": true - }, "@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -17720,14 +17368,14 @@ "dev": true }, "@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -17737,9 +17385,9 @@ }, "dependencies": { "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -17753,6 +17401,12 @@ } } }, + "@eslint/js": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", + "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", + "dev": true + }, "@floating-ui/core": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", @@ -17776,26 +17430,26 @@ "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" }, "@humanwhocodes/config-array": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", - "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" } }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true }, "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "@jest/schemas": { @@ -17979,6 +17633,14 @@ "integrity": "sha512-q5ITPNFhmEiYZLZOvEhjo2phlfxoOmit7vE1tBYMxcMqnZX2vdbMw3deDE7wCegpBKM/q/p39BJmhhoPcjZyCg==", "requires": {} }, + "@playwright/test": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.43.1.tgz", + "integrity": "sha512-HgtQzFgNEEo4TE22K/X7sYTYNqEMMTZmFS8kTq6m8hXj+m1D8TgwgIbumHddJa9h4yl4GkKb8/bgAl2+g7eDgA==", + "requires": { + "playwright": "1.43.1" + } + }, "@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.10", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", @@ -18054,55 +17716,6 @@ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.7.2.tgz", "integrity": "sha512-7Lcn7IqGMV+vizMPoEl5F0XDshcdDYtMI6uJLQdQz5CfZAwy3vvGKYSUk789qndt5dEC4HfSjviSYlSoHGL2+A==" }, - "@rollup/rollup-android-arm-eabi": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.6.0.tgz", - "integrity": "sha512-keHkkWAe7OtdALGoutLY3utvthkGF+Y17ws9LYT8pxMBYXaCoH/8dXS2uzo6e8+sEhY7y/zi5RFo22Dy2lFpDw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-android-arm64": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.6.0.tgz", - "integrity": "sha512-y3Kt+34smKQNWilicPbBz/MXEY7QwDzMFNgwEWeYiOhUt9MTWKjHqe3EVkXwT2fR7izOvHpDWZ0o2IyD9SWX7A==", - "dev": true, - "optional": true - }, - "@rollup/rollup-darwin-arm64": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.6.0.tgz", - "integrity": "sha512-oLzzxcUIHltHxOCmaXl+pkIlU+uhSxef5HfntW7RsLh1eHm+vJzjD9Oo4oUKso4YuP4PpbFJNlZjJuOrxo8dPg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-darwin-x64": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.6.0.tgz", - "integrity": "sha512-+ANnmjkcOBaV25n0+M0Bere3roeVAnwlKW65qagtuAfIxXF9YxUneRyAn/RDcIdRa7QrjRNJL3jR7T43ObGe8Q==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.6.0.tgz", - "integrity": "sha512-tBTSIkjSVUyrekddpkAqKOosnj1Fc0ZY0rJL2bIEWPKqlEQk0paORL9pUIlt7lcGJi3LzMIlUGXvtNi1Z6MOCQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm64-gnu": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.6.0.tgz", - "integrity": "sha512-Ed8uJI3kM11de9S0j67wAV07JUNhbAqIrDYhQBrQW42jGopgheyk/cdcshgGO4fW5Wjq97COCY/BHogdGvKVNQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm64-musl": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.6.0.tgz", - "integrity": "sha512-mZoNQ/qK4D7SSY8v6kEsAAyDgznzLLuSFCA3aBHZTmf3HP/dW4tNLTtWh9+LfyO0Z1aUn+ecpT7IQ3WtIg3ViQ==", - "dev": true, - "optional": true - }, "@rollup/rollup-linux-x64-gnu": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.6.0.tgz", @@ -18117,27 +17730,6 @@ "dev": true, "optional": true }, - "@rollup/rollup-win32-arm64-msvc": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.6.0.tgz", - "integrity": "sha512-+MRMcyx9L2kTrTUzYmR61+XVsliMG4odFb5UmqtiT8xOfEicfYAGEuF/D1Pww1+uZkYhBqAHpvju7VN+GnC3ng==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-ia32-msvc": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.6.0.tgz", - "integrity": "sha512-rxfeE6K6s/Xl2HGeK6cO8SiQq3k/3BYpw7cfhW5Bk2euXNEpuzi2cc7llxx1si1QgwfjNtdRNTGqdBzGlFZGFw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-x64-msvc": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.6.0.tgz", - "integrity": "sha512-QqmCsydHS172Y0Kc13bkMXvipbJSvzeglBncJG3LsYJSiPlxYACz7MmJBs4A8l1oU+jfhYEIC/+AUSlvjmiX/g==", - "dev": true, - "optional": true - }, "@scure/base": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz", @@ -18188,9 +17780,9 @@ } }, "@secretkeylabs/xverse-core": { - "version": "13.0.0", - "resolved": "https://npm.pkg.github.com/download/@secretkeylabs/xverse-core/13.0.0/229e41ba151b7499225f931de267d800f7e98909", - "integrity": "sha512-M2r3u8UcS7jKjUsDVJRQgAaUYoHmjel0EdbDj0gqL1nZeWZaZZ0zH8/HP8isVMsITWmK0ml/1r7vc72vhDinvQ==", + "version": "13.4.0", + "resolved": "https://npm.pkg.github.com/download/@secretkeylabs/xverse-core/13.4.0/f38348f7f27a5d9cce1f5d506f50d33fe942b0a4", + "integrity": "sha512-NqCOWRkAzOuy4WSrY1ysFwXPfTyyWOJ28vu4kGV4Z3PfLSToqmFapDN10JFnNBO8i64G/6K1TRh5sypb9By10Q==", "requires": { "@bitcoinerlab/secp256k1": "^1.0.2", "@noble/curves": "^1.2.0", @@ -18256,14 +17848,14 @@ "dev": true }, "@stacks/auth": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/auth/-/auth-6.12.0.tgz", - "integrity": "sha512-ViSpeWNw1MJBtvykcPTcn9vTy9v8pK8jiQFjfOkiFQ0q+oEhIDQrtpN5OYtTh5HvoZk8du+43nIoUYUECNahHQ==", - "requires": { - "@stacks/common": "^6.10.0", - "@stacks/encryption": "^6.12.0", - "@stacks/network": "^6.11.3", - "@stacks/profile": "^6.12.0", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/auth/-/auth-6.13.0.tgz", + "integrity": "sha512-3a6FwP5yNngQfalu78MltQzCROL4l+MNngnCxFKo52EJfIdJp8TWKuwkzHN/jLzrvdUoq1lQjKlxoINCiUP03g==", + "requires": { + "@stacks/common": "^6.13.0", + "@stacks/encryption": "^6.13.0", + "@stacks/network": "^6.13.0", + "@stacks/profile": "^6.13.0", "cross-fetch": "^3.1.5", "jsontokens": "^4.0.1" }, @@ -18274,14 +17866,14 @@ "integrity": "sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ==" }, "@stacks/encryption": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/encryption/-/encryption-6.12.0.tgz", - "integrity": "sha512-CubE51pHrcxx3yA+xapevPgA9UDleIoEaUZ06/9uD91B42yvTg37HyS8t06rzukU9q+X7Cv2I/+vbuf4nJIo8g==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/encryption/-/encryption-6.13.0.tgz", + "integrity": "sha512-CsacBxY1XBVXBuJ5erJPjB5FmQ8KGJ/ft02/pIM6WrJ31ZcBdkn2BPV1AsPSD5qsIkiMdHAe14WKIwm8M2SWtQ==", "requires": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", "@scure/bip39": "1.1.0", - "@stacks/common": "^6.10.0", + "@stacks/common": "^6.13.0", "@types/node": "^18.0.4", "base64-js": "^1.5.1", "bs58": "^5.0.0", @@ -18290,23 +17882,41 @@ } }, "@stacks/network": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.11.3.tgz", - "integrity": "sha512-c4ClCU/QUwuu8NbHtDKPJNa0M5YxauLN3vYaR0+S4awbhVIKFQSxirm9Q9ckV1WBh7FtD6u2S0x+tDQGAODjNg==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.13.0.tgz", + "integrity": "sha512-Ss/Da4BNyPBBj1OieM981fJ7SkevKqLPkzoI1+Yo7cYR2df+0FipIN++Z4RfpJpc8ne60vgcx7nJZXQsiGhKBQ==", "requires": { - "@stacks/common": "^6.10.0", + "@stacks/common": "^6.13.0", "cross-fetch": "^3.1.5" } + }, + "@types/node": { + "version": "18.19.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.26.tgz", + "integrity": "sha512-+wiMJsIwLOYCvUqSdKTrfkS8mpTp+MPINe6+Np4TAGFWWRWiBQ5kSq9nZGCSPkzx9mvT+uEukzpX4MOSCydcvw==", + "requires": { + "undici-types": "~5.26.4" + } } } }, "@stacks/common": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@stacks/common/-/common-6.10.0.tgz", - "integrity": "sha512-6x5Z7AKd9/kj3+DYE9xIDIkFLHihBH614i2wqrZIjN02WxVo063hWSjIlUxlx8P4gl6olVzlOy5LzhLJD9OP0A==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/common/-/common-6.13.0.tgz", + "integrity": "sha512-wwzyihjaSdmL6NxKvDeayy3dqM0L0Q2sawmdNtzJDi0FnXuJGm5PeapJj7bEfcI9XwI7Bw5jZoC6mCn9nc5YIw==", "requires": { "@types/bn.js": "^5.1.0", "@types/node": "^18.0.4" + }, + "dependencies": { + "@types/node": { + "version": "18.19.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.26.tgz", + "integrity": "sha512-+wiMJsIwLOYCvUqSdKTrfkS8mpTp+MPINe6+Np4TAGFWWRWiBQ5kSq9nZGCSPkzx9mvT+uEukzpX4MOSCydcvw==", + "requires": { + "undici-types": "~5.26.4" + } + } } }, "@stacks/connect": { @@ -18350,6 +17960,14 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.5.tgz", "integrity": "sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ==" + }, + "@types/node": { + "version": "18.19.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.29.tgz", + "integrity": "sha512-5pAX7ggTmWZdhUrhRWLPf+5oM7F80bcKVCBbr0zwEkTNzTJL2CWQjznpFgHYy6GrzkYi2Yjy7DHKoynFxqPV8g==", + "requires": { + "undici-types": "~5.26.4" + } } } }, @@ -18363,13 +17981,13 @@ } }, "@stacks/profile": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/profile/-/profile-6.12.0.tgz", - "integrity": "sha512-eY5IpX+GGHIcYLkivDmf3mkxDIgTQ+LhU8UG4jvOqDi+e1DvF9cIi3+reG5KVo0pQzqyT1OS7+16AwVcgp7/og==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/profile/-/profile-6.13.0.tgz", + "integrity": "sha512-IIOPtP+bHu53j426UTFn+JFgv9G3JyybtJ6TDcc4zxoMvs8sLKEVTyjZNFrP38DjkoAGo1qWNWqoJhURfL55Uw==", "requires": { - "@stacks/common": "^6.10.0", - "@stacks/network": "^6.11.3", - "@stacks/transactions": "^6.12.0", + "@stacks/common": "^6.13.0", + "@stacks/network": "^6.13.0", + "@stacks/transactions": "^6.13.0", "jsontokens": "^4.0.1", "schema-inspector": "^2.0.2", "zone-file": "^2.0.0-beta.3" @@ -18381,23 +17999,23 @@ "integrity": "sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ==" }, "@stacks/network": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.11.3.tgz", - "integrity": "sha512-c4ClCU/QUwuu8NbHtDKPJNa0M5YxauLN3vYaR0+S4awbhVIKFQSxirm9Q9ckV1WBh7FtD6u2S0x+tDQGAODjNg==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.13.0.tgz", + "integrity": "sha512-Ss/Da4BNyPBBj1OieM981fJ7SkevKqLPkzoI1+Yo7cYR2df+0FipIN++Z4RfpJpc8ne60vgcx7nJZXQsiGhKBQ==", "requires": { - "@stacks/common": "^6.10.0", + "@stacks/common": "^6.13.0", "cross-fetch": "^3.1.5" } }, "@stacks/transactions": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/transactions/-/transactions-6.12.0.tgz", - "integrity": "sha512-gRP3SfTaAIoTdjMvOiLrMZb/senqB8JQlT5Y4C3/CiHhiprYwTx7TbOCSa7WsNOU99H4aNfHvatmymuggXQVkA==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/transactions/-/transactions-6.13.0.tgz", + "integrity": "sha512-xrx09qsXL/tWCkvAArzsFQqtZKDXyedjdVB9uX8xw+cQCi3xZ7r5MHMKzvEsTgJz3EO+MkQBXcvI1uzfuoqhcA==", "requires": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", - "@stacks/common": "^6.10.0", - "@stacks/network": "^6.11.3", + "@stacks/common": "^6.13.0", + "@stacks/network": "^6.13.0", "c32check": "^2.0.0", "lodash.clonedeep": "^4.5.0" } @@ -18405,16 +18023,17 @@ } }, "@stacks/stacking": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/stacking/-/stacking-6.12.0.tgz", - "integrity": "sha512-XBxwbaCGRPnjpjspb3CBXrlZl6xR+gghLMz9PQNPdpuIbBDFa0SGeHgqjtpVU+2DVL4UyBx8PVsAWtlssyVGng==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/stacking/-/stacking-6.13.0.tgz", + "integrity": "sha512-ivzFZkVpqzneJ71T1eZTW8Rr5oVYrs4HkwZqGHxDEySb1I6p96hojH5gEguj9g7szQiyeYLj1dreCvhLh6ET6A==", "requires": { + "@noble/hashes": "1.1.5", "@scure/base": "1.1.1", - "@stacks/common": "^6.10.0", - "@stacks/encryption": "^6.12.0", - "@stacks/network": "^6.11.3", + "@stacks/common": "^6.13.0", + "@stacks/encryption": "^6.13.0", + "@stacks/network": "^6.13.0", "@stacks/stacks-blockchain-api-types": "^0.61.0", - "@stacks/transactions": "^6.12.0", + "@stacks/transactions": "^6.13.0", "bs58": "^5.0.0" }, "dependencies": { @@ -18429,14 +18048,14 @@ "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==" }, "@stacks/encryption": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/encryption/-/encryption-6.12.0.tgz", - "integrity": "sha512-CubE51pHrcxx3yA+xapevPgA9UDleIoEaUZ06/9uD91B42yvTg37HyS8t06rzukU9q+X7Cv2I/+vbuf4nJIo8g==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/encryption/-/encryption-6.13.0.tgz", + "integrity": "sha512-CsacBxY1XBVXBuJ5erJPjB5FmQ8KGJ/ft02/pIM6WrJ31ZcBdkn2BPV1AsPSD5qsIkiMdHAe14WKIwm8M2SWtQ==", "requires": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", "@scure/bip39": "1.1.0", - "@stacks/common": "^6.10.0", + "@stacks/common": "^6.13.0", "@types/node": "^18.0.4", "base64-js": "^1.5.1", "bs58": "^5.0.0", @@ -18445,11 +18064,11 @@ } }, "@stacks/network": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.11.3.tgz", - "integrity": "sha512-c4ClCU/QUwuu8NbHtDKPJNa0M5YxauLN3vYaR0+S4awbhVIKFQSxirm9Q9ckV1WBh7FtD6u2S0x+tDQGAODjNg==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.13.0.tgz", + "integrity": "sha512-Ss/Da4BNyPBBj1OieM981fJ7SkevKqLPkzoI1+Yo7cYR2df+0FipIN++Z4RfpJpc8ne60vgcx7nJZXQsiGhKBQ==", "requires": { - "@stacks/common": "^6.10.0", + "@stacks/common": "^6.13.0", "cross-fetch": "^3.1.5" } }, @@ -18459,17 +18078,25 @@ "integrity": "sha512-yPOfTUboo5eA9BZL/hqMcM71GstrFs9YWzOrJFPeP4cOO1wgYvAcckgBRbgiE3NqeX0A7SLZLDAXLZbATuRq9w==" }, "@stacks/transactions": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/transactions/-/transactions-6.12.0.tgz", - "integrity": "sha512-gRP3SfTaAIoTdjMvOiLrMZb/senqB8JQlT5Y4C3/CiHhiprYwTx7TbOCSa7WsNOU99H4aNfHvatmymuggXQVkA==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/transactions/-/transactions-6.13.0.tgz", + "integrity": "sha512-xrx09qsXL/tWCkvAArzsFQqtZKDXyedjdVB9uX8xw+cQCi3xZ7r5MHMKzvEsTgJz3EO+MkQBXcvI1uzfuoqhcA==", "requires": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", - "@stacks/common": "^6.10.0", - "@stacks/network": "^6.11.3", + "@stacks/common": "^6.13.0", + "@stacks/network": "^6.13.0", "c32check": "^2.0.0", "lodash.clonedeep": "^4.5.0" } + }, + "@types/node": { + "version": "18.19.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.29.tgz", + "integrity": "sha512-5pAX7ggTmWZdhUrhRWLPf+5oM7F80bcKVCBbr0zwEkTNzTJL2CWQjznpFgHYy6GrzkYi2Yjy7DHKoynFxqPV8g==", + "requires": { + "undici-types": "~5.26.4" + } } } }, @@ -18479,14 +18106,14 @@ "integrity": "sha512-Mw5dBPx3DySPupwaq0iBdm1WdEVXIfhjUVaTjI2iSyzWz4Fgs3U7JCaAezLbgNu7Q69c/ZN4JUDWuo9FVjy7oA==" }, "@stacks/storage": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/storage/-/storage-6.12.0.tgz", - "integrity": "sha512-RiB8cfWKCm4LrDLXdjtRj4syzvpwmJ/6WKcF+1RHQBTyJerPgxoBn1NoKzjOcydQvVj1jpR/ccaS78xVxlMsTQ==", - "requires": { - "@stacks/auth": "^6.12.0", - "@stacks/common": "^6.10.0", - "@stacks/encryption": "^6.12.0", - "@stacks/network": "^6.11.3", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/storage/-/storage-6.13.0.tgz", + "integrity": "sha512-BDgGBysgoo756SUGQ7vTtJKPBhZLBbl9UrO7YoAoVO8vfB569X7PiQbUxwE8R7iLutnlBgP+mnpGDhV9UQo1vA==", + "requires": { + "@stacks/auth": "^6.13.0", + "@stacks/common": "^6.13.0", + "@stacks/encryption": "^6.13.0", + "@stacks/network": "^6.13.0", "base64-js": "^1.5.1", "jsontokens": "^4.0.1" }, @@ -18497,14 +18124,14 @@ "integrity": "sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ==" }, "@stacks/encryption": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/encryption/-/encryption-6.12.0.tgz", - "integrity": "sha512-CubE51pHrcxx3yA+xapevPgA9UDleIoEaUZ06/9uD91B42yvTg37HyS8t06rzukU9q+X7Cv2I/+vbuf4nJIo8g==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/encryption/-/encryption-6.13.0.tgz", + "integrity": "sha512-CsacBxY1XBVXBuJ5erJPjB5FmQ8KGJ/ft02/pIM6WrJ31ZcBdkn2BPV1AsPSD5qsIkiMdHAe14WKIwm8M2SWtQ==", "requires": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", "@scure/bip39": "1.1.0", - "@stacks/common": "^6.10.0", + "@stacks/common": "^6.13.0", "@types/node": "^18.0.4", "base64-js": "^1.5.1", "bs58": "^5.0.0", @@ -18513,13 +18140,21 @@ } }, "@stacks/network": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.11.3.tgz", - "integrity": "sha512-c4ClCU/QUwuu8NbHtDKPJNa0M5YxauLN3vYaR0+S4awbhVIKFQSxirm9Q9ckV1WBh7FtD6u2S0x+tDQGAODjNg==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.13.0.tgz", + "integrity": "sha512-Ss/Da4BNyPBBj1OieM981fJ7SkevKqLPkzoI1+Yo7cYR2df+0FipIN++Z4RfpJpc8ne60vgcx7nJZXQsiGhKBQ==", "requires": { - "@stacks/common": "^6.10.0", + "@stacks/common": "^6.13.0", "cross-fetch": "^3.1.5" } + }, + "@types/node": { + "version": "18.19.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.29.tgz", + "integrity": "sha512-5pAX7ggTmWZdhUrhRWLPf+5oM7F80bcKVCBbr0zwEkTNzTJL2CWQjznpFgHYy6GrzkYi2Yjy7DHKoynFxqPV8g==", + "requires": { + "undici-types": "~5.26.4" + } } } }, @@ -18544,19 +18179,19 @@ } }, "@stacks/wallet-sdk": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/wallet-sdk/-/wallet-sdk-6.12.0.tgz", - "integrity": "sha512-FhTjkDsuikAQ5VGhnqXG1DhncnX1TVO4rfJmbE/rJgkJw+6OJBJF7DrjIs6SCahVeY8FQloYxAQw+slnbddLBQ==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/wallet-sdk/-/wallet-sdk-6.13.0.tgz", + "integrity": "sha512-2+jJ3SWrhPVLc4mokFekwqPLU8tP6ffDC379A4I2xrKWwPk3zjx3/SlqtUnf8CJkwgmsBozRS6SBqd7obIvQAg==", "requires": { "@scure/bip32": "1.1.3", "@scure/bip39": "1.1.0", - "@stacks/auth": "^6.12.0", - "@stacks/common": "^6.10.0", - "@stacks/encryption": "^6.12.0", - "@stacks/network": "^6.11.3", - "@stacks/profile": "^6.12.0", - "@stacks/storage": "^6.12.0", - "@stacks/transactions": "^6.12.0", + "@stacks/auth": "^6.13.0", + "@stacks/common": "^6.13.0", + "@stacks/encryption": "^6.13.0", + "@stacks/network": "^6.13.0", + "@stacks/profile": "^6.13.0", + "@stacks/storage": "^6.13.0", + "@stacks/transactions": "^6.13.0", "buffer": "6.0.3", "c32check": "^2.0.0", "jsontokens": "^4.0.1", @@ -18570,14 +18205,14 @@ "integrity": "sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ==" }, "@stacks/encryption": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/encryption/-/encryption-6.12.0.tgz", - "integrity": "sha512-CubE51pHrcxx3yA+xapevPgA9UDleIoEaUZ06/9uD91B42yvTg37HyS8t06rzukU9q+X7Cv2I/+vbuf4nJIo8g==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/encryption/-/encryption-6.13.0.tgz", + "integrity": "sha512-CsacBxY1XBVXBuJ5erJPjB5FmQ8KGJ/ft02/pIM6WrJ31ZcBdkn2BPV1AsPSD5qsIkiMdHAe14WKIwm8M2SWtQ==", "requires": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", "@scure/bip39": "1.1.0", - "@stacks/common": "^6.10.0", + "@stacks/common": "^6.13.0", "@types/node": "^18.0.4", "base64-js": "^1.5.1", "bs58": "^5.0.0", @@ -18586,26 +18221,34 @@ } }, "@stacks/network": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.11.3.tgz", - "integrity": "sha512-c4ClCU/QUwuu8NbHtDKPJNa0M5YxauLN3vYaR0+S4awbhVIKFQSxirm9Q9ckV1WBh7FtD6u2S0x+tDQGAODjNg==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.13.0.tgz", + "integrity": "sha512-Ss/Da4BNyPBBj1OieM981fJ7SkevKqLPkzoI1+Yo7cYR2df+0FipIN++Z4RfpJpc8ne60vgcx7nJZXQsiGhKBQ==", "requires": { - "@stacks/common": "^6.10.0", + "@stacks/common": "^6.13.0", "cross-fetch": "^3.1.5" } }, "@stacks/transactions": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@stacks/transactions/-/transactions-6.12.0.tgz", - "integrity": "sha512-gRP3SfTaAIoTdjMvOiLrMZb/senqB8JQlT5Y4C3/CiHhiprYwTx7TbOCSa7WsNOU99H4aNfHvatmymuggXQVkA==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/@stacks/transactions/-/transactions-6.13.0.tgz", + "integrity": "sha512-xrx09qsXL/tWCkvAArzsFQqtZKDXyedjdVB9uX8xw+cQCi3xZ7r5MHMKzvEsTgJz3EO+MkQBXcvI1uzfuoqhcA==", "requires": { "@noble/hashes": "1.1.5", "@noble/secp256k1": "1.7.1", - "@stacks/common": "^6.10.0", - "@stacks/network": "^6.11.3", + "@stacks/common": "^6.13.0", + "@stacks/network": "^6.13.0", "c32check": "^2.0.0", "lodash.clonedeep": "^4.5.0" } + }, + "@types/node": { + "version": "18.19.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.29.tgz", + "integrity": "sha512-5pAX7ggTmWZdhUrhRWLPf+5oM7F80bcKVCBbr0zwEkTNzTJL2CWQjznpFgHYy6GrzkYi2Yjy7DHKoynFxqPV8g==", + "requires": { + "undici-types": "~5.26.4" + } } } }, @@ -18666,6 +18309,16 @@ "@tanstack/match-sorter-utils": "^8.7.0", "superjson": "^1.10.0", "use-sync-external-store": "^1.2.0" + }, + "dependencies": { + "superjson": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-1.13.3.tgz", + "integrity": "sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==", + "requires": { + "copy-anything": "^3.0.2" + } + } } }, "@tanstack/react-query-persist-client": { @@ -19108,10 +18761,19 @@ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true }, + "@types/mixpanel-browser": { + "version": "2.49.0", + "resolved": "https://registry.npmjs.org/@types/mixpanel-browser/-/mixpanel-browser-2.49.0.tgz", + "integrity": "sha512-StmgUnS58d44DmIAEX9Kk8qwisAYCl6E2qulIjYyHXUPuJCPOuyUMTTKBp+aU2F2do+kxAzCxiBtsB4fnBT9Fg==", + "dev": true + }, "@types/node": { - "version": "18.17.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.1.tgz", - "integrity": "sha512-xlR1jahfizdplZYRU59JlUx9uzF1ARa8jbhM11ccpCJya8kvos5jwdm2ZAgxSCwOl0fq21svP18EVwPBXMQudw==" + "version": "20.11.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", + "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "requires": { + "undici-types": "~5.26.4" + } }, "@types/parse-json": { "version": "4.0.0", @@ -19829,6 +19491,14 @@ "smart-buffer": "^4.1.0" } }, + "@types/node": { + "version": "18.19.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.29.tgz", + "integrity": "sha512-5pAX7ggTmWZdhUrhRWLPf+5oM7F80bcKVCBbr0zwEkTNzTJL2CWQjznpFgHYy6GrzkYi2Yjy7DHKoynFxqPV8g==", + "requires": { + "undici-types": "~5.26.4" + } + }, "base-x": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", @@ -19950,11 +19620,11 @@ "requires": {} }, "alex-sdk": { - "version": "0.1.18", - "resolved": "https://registry.npmjs.org/alex-sdk/-/alex-sdk-0.1.18.tgz", - "integrity": "sha512-TEBlO9Xiw/LRBZMM98o6eUqZv6q/qlkDOHQACc0kFGCdqfspcVhE1X83vMVpZYbjKlXnko6mFW6bi+RyMx2L3g==", + "version": "0.1.26", + "resolved": "https://registry.npmjs.org/alex-sdk/-/alex-sdk-0.1.26.tgz", + "integrity": "sha512-uUjbONoAit6htxZGLOFev8v2h59kE31fM1X9efH0Yi1eLXYSSXojj+iFPTlQTQvIysyseXGxkX4VVTc9aQ13sg==", "requires": { - "clarity-codegen": "^0.2.0" + "clarity-codegen": "^0.3.5" } }, "ansi-escapes": { @@ -20811,21 +20481,21 @@ } }, "clarity-codegen": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/clarity-codegen/-/clarity-codegen-0.2.2.tgz", - "integrity": "sha512-sCy14oP701Y5pmFPsO+1r9VD7lRWvmQ/89+1x30y0ITKLnBALAmBepIBAY1NTfr6SuYlFBrLMAH46P019pBQHg==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/clarity-codegen/-/clarity-codegen-0.3.6.tgz", + "integrity": "sha512-Be1J8RFtPFGfWtQ/7enl3xkU1j2KkIS9W7RbuofIVYfKp11MCZSGQeNV+Gh0dQOQIs3O0WQLLg03ikyNaWtYzQ==", "requires": { "@stacks/stacks-blockchain-api-types": "^7.1.10", - "axios": "^1.4.0", + "axios": "^1.5.0", "lodash": "^4.17.21", "yargs": "^17.7.2", "yqueue": "^1.0.1" }, "dependencies": { "@stacks/stacks-blockchain-api-types": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@stacks/stacks-blockchain-api-types/-/stacks-blockchain-api-types-7.3.0.tgz", - "integrity": "sha512-kpv9UlOmgTdWjzBdv8WYpYLpR0A9shl7pAae25iP0RqtNKE0FZti/I3k7zkXxpxoNTVjb9ys9iEf0AFtfhSmPQ==" + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@stacks/stacks-blockchain-api-types/-/stacks-blockchain-api-types-7.9.0.tgz", + "integrity": "sha512-29tcIOxEj0jIAVrMLH2hDuTM0wWtOT4z9EnNgOCEQvipEDPyvoaPjbYJmQUTxzvVjfoLjZAQsvTlJw7fnbkkrg==" } } }, @@ -21688,10 +21358,9 @@ } }, "dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "dev": true + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==" }, "dotenv-defaults": { "version": "2.0.2", @@ -21700,6 +21369,14 @@ "dev": true, "requires": { "dotenv": "^8.2.0" + }, + "dependencies": { + "dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true + } } }, "dotenv-webpack": { @@ -21981,38 +21658,41 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, "eslint": { - "version": "8.22.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz", - "integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.40.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.3", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -22020,11 +21700,9 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "dependencies": { "ansi-styles": { @@ -22092,6 +21770,12 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -22269,6 +21953,32 @@ "lodash.get": "^4.4.2" } }, + "eslint-plugin-playwright": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-1.5.4.tgz", + "integrity": "sha512-J38Wy3Vc2f9y73J+KRmgXgbYI8TZ3zbz6qBbTj3PhpFndUS572jZ7kqQ3rJ9si5BaMHT7lmZzraO+3UjwIDV4Q==", + "dev": true, + "requires": { + "globals": "^13.23.0" + }, + "dependencies": { + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, "eslint-plugin-prettier": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", @@ -22348,23 +22058,6 @@ } } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, "eslint-visitor-keys": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", @@ -22860,13 +22553,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -22884,12 +22570,6 @@ "functions-have-names": "^1.2.2" } }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -23883,6 +23563,12 @@ } } }, + "js-sdsl": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", + "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==", + "dev": true + }, "js-sha256": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.10.1.tgz", @@ -26880,6 +26566,28 @@ "pathe": "^1.1.0" } }, + "playwright": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.43.1.tgz", + "integrity": "sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==", + "requires": { + "fsevents": "2.3.2", + "playwright-core": "1.43.1" + }, + "dependencies": { + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + } + } + }, + "playwright-core": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.43.1.tgz", + "integrity": "sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==" + }, "postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -27523,12 +27231,6 @@ "functions-have-names": "^1.2.3" } }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -27736,9 +27438,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sats-connect": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sats-connect/-/sats-connect-1.4.0.tgz", - "integrity": "sha512-jXc9sFdFp9iDDXF4ptSiiWEjHiJUyhvPh2h37QI6IrfhH00Awxjqjhq8PXmfum2ODMzYKDEzI1gXo/UUaToCCA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sats-connect/-/sats-connect-2.1.0.tgz", + "integrity": "sha512-HCPG3L0GModbC2g4uk+ezpSUr8kfCw1y5kv6LC9N8ZNNSRFTTK/CX9eSStV7bBGk5po+euaLsRy4YlLihRcnnw==", "requires": { "jsontokens": "^4.0.1", "process": "^0.11.10", @@ -28335,9 +28037,9 @@ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, "superjson": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-1.13.1.tgz", - "integrity": "sha512-AVH2eknm9DEd3qvxM4Sq+LTCkSXE2ssfh1t11MHMXyYXFQyQ1HLgVvV+guLTsaQnJU3gnaVo34TohHPulY/wLg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", + "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", "requires": { "copy-anything": "^3.0.2" } @@ -28572,6 +28274,12 @@ } } }, + "ts-transformer-keys": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/ts-transformer-keys/-/ts-transformer-keys-0.4.4.tgz", + "integrity": "sha512-LrqgvaFvar01/5mbunRyeLTSIkqoC2xfcpL/90aDY6vR07DGyH+UaYGdIEsUudnlAw2Sr0pxFgdZvE0QIyI4qA==", + "requires": {} + }, "tsc-files": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/tsc-files/-/tsc-files-1.1.4.tgz", @@ -28795,8 +28503,7 @@ "typescript": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==" }, "typescript-plugin-styled-components": { "version": "3.0.0", @@ -28828,6 +28535,11 @@ "which-boxed-primitive": "^1.0.2" } }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "unload": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", @@ -28916,12 +28628,6 @@ "uuid": "8.3.2" } }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "valid-url": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", @@ -29473,14 +29179,14 @@ "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" } } }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -29492,6 +29198,11 @@ "resolved": "https://registry.npmjs.org/yqueue/-/yqueue-1.0.1.tgz", "integrity": "sha512-DBxJZBRafFLA/tCc5uO8ZTGFr+sQgn1FRJkZ4cVrIQIk6bv2bInraE3mbpLAJw9z93JGrLkqDoyTLrrZaCNq5w==" }, + "zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==" + }, "zone-file": { "version": "2.0.0-beta.3", "resolved": "https://registry.npmjs.org/zone-file/-/zone-file-2.0.0-beta.3.tgz", diff --git a/package.json b/package.json index dc03e4314..0c9685245 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "xverse-web-extension", "description": "A Bitcoin wallet for Web3", - "version": "0.32.3", + "version": "0.34.1", "private": true, "engines": { "node": "^18.18.2" @@ -9,9 +9,10 @@ "dependencies": { "@ledgerhq/hw-transport-webusb": "^6.27.13", "@phosphor-icons/react": "^2.0.10", + "@playwright/test": "^1.43.1", "@react-spring/web": "^9.6.1", "@scure/btc-signer": "1.2.1", - "@secretkeylabs/xverse-core": "13.0.0", + "@secretkeylabs/xverse-core": "13.4.0", "@stacks/connect": "7.4.1", "@stacks/stacks-blockchain-api-types": "6.1.1", "@stacks/transactions": "6.9.0", @@ -22,7 +23,7 @@ "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", - "alex-sdk": "^0.1.18", + "alex-sdk": "0.1.26", "argon2-browser": "^1.18.0", "axios": "^1.1.3", "bignumber.js": "^9.1.0", @@ -32,6 +33,7 @@ "classnames": "^2.3.2", "crypto-browserify": "^3.12.0", "date-fns": "^2.29.3", + "dotenv": "^16.4.5", "i": "0.3.7", "i18next": "^21.9.1", "js-sha256": "^0.10.1", @@ -64,22 +66,28 @@ "redux": "^4.0.5", "redux-persist": "^6.0.0", "redux-state-sync": "^3.1.4", - "sats-connect": "1.4.0", + "sats-connect": "2.1.0", "stream-browserify": "^3.0.0", "string-to-color": "^2.2.2", "styled-components": "^5.3.5", + "superjson": "2.2.1", "swiper": "11.0.6", + "ts-transformer-keys": "0.4.4", "valid-url": "^1.0.9", "webextension-polyfill": "^0.10.0", + "zod": "3.22.4", "zxcvbn": "^4.4.2" }, "scripts": { "build": "npm run clean && NODE_ENV=production npx node webpack/utils/build.js", + "build-named": "npm run clean && NODE_ENV=production node scripts/build-named.js", "start": "npx node webpack/utils/devServer.js", "clean": "rimraf build", "test": "vitest ./src", "style": "prettier --write \"src/**/*.{ts,tsx}\"", - "prepare": "husky install" + "prepare": "husky install", + "uitest": "npx playwright test", + "uitest:report": "playwright show-report" }, "overrides": { "buffer": "6.0.3" @@ -99,6 +107,8 @@ "@tanstack/eslint-plugin-query": "^4.29.4", "@types/argon2-browser": "^1.18.1", "@types/chrome": "^0.0.237", + "@types/mixpanel-browser": "^2.49.0", + "@types/node": "^20.11.30", "@types/react": "^18.0.20", "@types/react-dom": "^18.0.6", "@types/react-lottie": "^1.2.10", @@ -114,13 +124,14 @@ "copy-webpack-plugin": "^11.0.0", "css-loader": "^6.7.1", "dotenv-webpack": "^8.0.1", - "eslint": "8.22.0", + "eslint": "8.40.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-airbnb-typescript": "^17.0.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jsx-a11y": "^6.6.1", "eslint-plugin-no-inline-styles": "^1.0.5", + "eslint-plugin-playwright": "^1.5.4", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-react": "^7.31.8", "eslint-plugin-react-hooks": "^4.6.0", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 000000000..36533c558 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,44 @@ +import { defineConfig } from '@playwright/test'; +import 'dotenv/config'; + +export default defineConfig({ + testDir: './tests', + /* Maximum time one test can run for. */ + timeout: process.env.CI ? 60 * 1000 : 60 * 1000, + expect: { + /** + * Maximum time expect() should wait for the condition to be met. + * For example in `await expect(locator).toHaveText();` + */ + timeout: 10 * 1000, + }, + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 1 : 0, + /* Opt out of 2 tests parallel on CI. */ + workers: process.env.CI ? 2 : 1, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: process.env.CI ? 'blob' : 'html', + snapshotDir: './playwright-snapshots', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'retain-on-failure', + /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */ + actionTimeout: 30 * 1000, + /* Run browser in headless mode. */ + headless: false, + /* Capture screenshot after each test failure. */ + screenshot: 'only-on-failure', + }, + /* Configure projects for major browsers */ + // projects: [ + // { + // name: 'chromium', + // use: { ...devices['Desktop Chrome'] }, + // }, + // ], +}); diff --git a/scripts/.gitignore b/scripts/.gitignore index 3f4dae6b5..c1ddfd3d5 100644 --- a/scripts/.gitignore +++ b/scripts/.gitignore @@ -1,4 +1,4 @@ release.json -pr-*.json +pr*.json body.md releases.json diff --git a/scripts/build-named.js b/scripts/build-named.js new file mode 100644 index 000000000..6a203187d --- /dev/null +++ b/scripts/build-named.js @@ -0,0 +1,40 @@ +process.env.BABEL_ENV = 'production'; +process.env.NODE_ENV = 'production'; +process.env.ASSET_PATH = '/'; + +const path = require('path'); +const webpack = require('webpack'); +const { makeConfig } = require('../webpack/makeConfig'); + +if (process.argv.length < 3) { + console.error(`Missing wallet label(s). Usage: + + # Create a single wallet labeled "my-wallet" + npm run build-named my-wallet + + # Create several wallets + npm run build-named w1 w2 w3`); + process.exit(1); +} + +const labels = process.argv.slice(2); + +for (const label of labels) { + process.env.WALLET_LABEL = label; + const buildRootPath = path.join(__dirname, '../', `prebuilt-wallets/${label}`); + + const config = makeConfig({ buildRootPath }); + config.mode = 'production'; // Is this necessary? + + webpack(config, function (err, stats) { + if (err) throw err; + console.log( + stats.toString({ + preset: 'minimal', + colors: true, + outputPath: true, + env: true, + }), + ); + }); +} diff --git a/scripts/create-release-pr.sh b/scripts/create-release-pr.sh index 267c41b0d..c9d7a9b07 100755 --- a/scripts/create-release-pr.sh +++ b/scripts/create-release-pr.sh @@ -7,6 +7,8 @@ # Alternatively trigger it from the github action # +set -e + if [[ -z "$BUMP" ]]; then echo "BUMP is required. major|minor|patch" exit 1 @@ -26,7 +28,7 @@ TITLE="release: $TAG" git checkout -B $BRANCH git commit -am "$TITLE" -git merge origin/main -s ours +git merge --allow-unrelated-histories origin/main -s ours git push --set-upstream origin $BRANCH diff --git a/scripts/merge-to-remote.sh b/scripts/merge-to-remote.sh new file mode 100755 index 000000000..3ac55242b --- /dev/null +++ b/scripts/merge-to-remote.sh @@ -0,0 +1,70 @@ +#! /bin/bash + +## +# merge-to-remote.sh +# +# to be run locally from downstream repo, or from GitHub Actions + +set -e + +if [[ -z $(git status --porcelain) ]]; then + echo "Working directory clean. Proceeding with merge." +else + echo "Working directory not clean. Please commit or stash your changes before proceeding." + exit 1 +fi + +ORIGIN_BRANCH=${ORIGIN_BRANCH:-main} # defaults to main +REMOTE_REPO=${REMOTE_REPO:-xverse-web-extension} # defaults to xverse-web-extension + +echo "Merging $ORIGIN_BRANCH to $REMOTE_REPO" + +ORIGIN_NAME="origin" +REMOTE_URL="git@github.com:secretkeylabs/$REMOTE_REPO.git" +if [[ $GITHUB_ACTIONS == "true" ]]; then + echo "Running in GitHub Actions. Using GitHub token for authentication." + REMOTE_URL="https://${GH_TOKEN}@github.com/secretkeylabs/$REMOTE_REPO" +fi +REMOTE_NAME="public" + + +## add or set remote +git remote | grep -w $REMOTE_NAME || git remote add $REMOTE_NAME $REMOTE_URL +git remote set-url $REMOTE_NAME $REMOTE_URL +git remote set-url --push $REMOTE_NAME $REMOTE_URL +git remote -v + +## fetch from all remotes including tags +git fetch $ORIGIN_NAME $ORIGIN_BRANCH --tags || true # TODO remove || true after fixing tag conflicts +git fetch $REMOTE_NAME $ORIGIN_BRANCH --tags || true # TODO remove || true after fixing tag conflicts + +PR_TITLE="merge-$ORIGIN_BRANCH-to-$REMOTE_NAME" +REMOTE_BRANCH="chore/$PR_TITLE-$(date +%s)" +REMOTE_BASE=$ORIGIN_BRANCH + +## checkout origin branch and push to remote +echo "Checking out $ORIGIN_NAME/$ORIGIN_BRANCH and pushing to $REMOTE_NAME/$REMOTE_BRANCH" +git checkout $ORIGIN_NAME/$ORIGIN_BRANCH +git checkout -B $REMOTE_BRANCH +git push -v $REMOTE_NAME $REMOTE_BRANCH + +if command -v gh >/dev/null 2>&1; then + echo "gh cli installed. Proceeding with PR creation." +else + echo "gh cli not installed. Please install gh cli or create the PR manually." + exit 1 +fi + +## create PR +gh api \ + --method POST \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + /repos/{owner}/$REMOTE_REPO/pulls \ + -f title="$PR_TITLE" \ + -f head="$REMOTE_BRANCH" \ + -f base="$REMOTE_BASE" \ + -f body="Created by merge-to-remote.sh" > pr.json + +## push tags +git push $REMOTE_NAME --tags || true # TODO remove || true after fixing tag conflicts diff --git a/src/app/App.tsx b/src/app/App.tsx index a1c386790..41443c348 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -1,12 +1,10 @@ import LoadingScreen from '@components/loadingScreen'; import { CheckCircle, XCircle } from '@phosphor-icons/react'; +import { setXClientVersion } from '@secretkeylabs/xverse-core'; import rootStore from '@stores/index'; import { QueryClientProvider } from '@tanstack/react-query'; import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; -import { MIX_PANEL_TOKEN } from '@utils/constants'; import { queryClient } from '@utils/query'; -import mixpanel from 'mixpanel-browser'; -import { useEffect } from 'react'; import { Toaster } from 'react-hot-toast'; import { Provider } from 'react-redux'; import { RouterProvider } from 'react-router-dom'; @@ -18,6 +16,11 @@ import GlobalStyle from '../theme/global'; import SessionGuard from './components/guards/session'; import router from './routes'; +declare const VERSION: string; + +// set the X-Client-Version header for core api requests +setXClientVersion(VERSION); + // needed to keep the svg icon scale for toasts over multiple lines const StyledIcon = styled.div` display: flex; @@ -26,18 +29,6 @@ const StyledIcon = styled.div` `; function App(): JSX.Element { - useEffect(() => { - if (!MIX_PANEL_TOKEN) { - return; - } - - mixpanel.init(MIX_PANEL_TOKEN, { - debug: process.env.NODE_ENV === 'development', - ip: false, - persistence: 'localStorage', - }); - }, []); - return ( <> diff --git a/src/app/components/accountHeader/index.tsx b/src/app/components/accountHeader/index.tsx index 1a95d033b..5143b8a3b 100644 --- a/src/app/components/accountHeader/index.tsx +++ b/src/app/components/accountHeader/index.tsx @@ -176,7 +176,7 @@ function AccountHeaderComponent({ disabledAccountSelect={disableAccountSwitch} /> {!disableMenuOption && ( - + )} diff --git a/src/app/components/accountRow/index.tsx b/src/app/components/accountRow/index.tsx index e493646b7..ea4072125 100644 --- a/src/app/components/accountRow/index.tsx +++ b/src/app/components/accountRow/index.tsx @@ -45,7 +45,7 @@ const AccountInfoContainer = styled.div({ alignItems: 'center', }); -const CurrentAcountContainer = styled.div((props) => ({ +const CurrentAccountContainer = styled.div((props) => ({ display: 'flex', flexDirection: 'column', paddingLeft: props.theme.space.s, @@ -331,11 +331,13 @@ function AccountRow({ thirdGradient={gradient[2]} isBig={isAccountListView} /> - + {account && ( - {getName()} + + {getName()} + {isLedgerAccount(account) && Ledger icon} {isSelected && !disabledAccountSelect && !isAccountListView && ( @@ -347,7 +349,11 @@ function AccountRow({ displayType="text" prefix={`${currencySymbolMap[fiatCurrency]}`} thousandSeparator - renderText={(value: string) => {value}} + renderText={(value: string) => ( + + {value} + + )} /> )} {isAccountListView && !totalBalance && ( @@ -365,11 +371,11 @@ function AccountRow({ )} - + {isAccountListView && ( - + )} diff --git a/src/app/components/confirmBtcTransaction/burnSection.tsx b/src/app/components/confirmBtcTransaction/burnSection.tsx new file mode 100644 index 000000000..70ac3437f --- /dev/null +++ b/src/app/components/confirmBtcTransaction/burnSection.tsx @@ -0,0 +1,60 @@ +import RuneAmount from '@components/confirmBtcTransaction/itemRow/runeAmount'; +import { RuneSummary } from '@secretkeylabs/xverse-core'; +import InputFeedback from '@ui-library/inputFeedback'; +import { useTranslation } from 'react-i18next'; +import styled from 'styled-components'; + +const Container = styled.div((props) => ({ + display: 'flex', + flexDirection: 'column', + background: props.theme.colors.elevation1, + borderRadius: 12, + padding: `${props.theme.space.m} 0`, + justifyContent: 'center', + marginBottom: props.theme.space.s, +})); + +const RowContainer = styled.div((props) => ({ + padding: `0 ${props.theme.space.m}`, + marginTop: `${props.theme.space.m}`, +})); + +const RowCenter = styled.div<{ spaceBetween?: boolean }>((props) => ({ + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + justifyContent: props.spaceBetween ? 'space-between' : 'initial', +})); + +const Header = styled(RowCenter)((props) => ({ + padding: `0 ${props.theme.space.m}`, +})); + +type Props = { + burns?: RuneSummary['burns']; +}; + +function BurnSection({ burns }: Props) { + const { t } = useTranslation('translation', { keyPrefix: 'CONFIRM_TRANSACTION' }); + + if (!burns?.length) return null; + + return ( + +
+ +
+ {burns.map((burn) => ( + + + + ))} +
+ ); +} + +export default BurnSection; diff --git a/src/app/components/confirmBtcTransaction/delegateSection.tsx b/src/app/components/confirmBtcTransaction/delegateSection.tsx new file mode 100644 index 000000000..2415e0da2 --- /dev/null +++ b/src/app/components/confirmBtcTransaction/delegateSection.tsx @@ -0,0 +1,114 @@ +import DropDownIcon from '@assets/img/transactions/dropDownIcon.svg'; +import RuneAmount from '@components/confirmBtcTransaction/itemRow/runeAmount'; +import { WarningOctagon } from '@phosphor-icons/react'; +import { animated, config, useSpring } from '@react-spring/web'; +import { RuneSummary } from '@secretkeylabs/xverse-core'; +import { StyledP } from '@ui-library/common.styled'; +import { useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import styled from 'styled-components'; +import Theme from 'theme'; + +const Container = styled.div((props) => ({ + display: 'flex', + flexDirection: 'column', + background: props.theme.colors.elevation1, + borderRadius: 12, + padding: `${props.theme.space.m} 0`, + justifyContent: 'center', + marginBottom: props.theme.space.s, +})); + +const RowContainer = styled.div((props) => ({ + padding: `0 ${props.theme.space.m}`, + marginTop: `${props.theme.space.m}`, +})); + +const RowCenter = styled.div<{ spaceBetween?: boolean }>((props) => ({ + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + justifyContent: props.spaceBetween ? 'space-between' : 'initial', +})); + +const Header = styled(RowCenter)((props) => ({ + padding: `0 ${props.theme.space.m}`, +})); + +const WarningButton = styled.button` + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + background-color: ${(props) => props.theme.colors.elevation1}; + padding: ${(props) => props.theme.space.m}; + padding-bottom: 0; +`; + +const DelegationDescription = styled(StyledP)` + padding: ${(props) => props.theme.space.s} ${(props) => props.theme.space.m}; + padding-bottom: ${(props) => props.theme.space.xs}; +`; + +const Title = styled(StyledP)` + margin-left: ${(props) => props.theme.space.xxs}; +`; + +type Props = { + delegations?: RuneSummary['burns']; +}; + +function DelegateSection({ delegations }: Props) { + const { t } = useTranslation('translation', { keyPrefix: 'CONFIRM_TRANSACTION' }); + + const [showDelegationInfo, setShowDelegationInfo] = useState(false); + + const slideInStyles = useSpring({ + config: { ...config.gentle, duration: 200 }, + from: { opacity: 0, maxHeight: 0 }, + to: { opacity: 1, maxHeight: 100 }, + reverse: !showDelegationInfo, + }); + + const arrowRotation = useSpring({ + transform: showDelegationInfo ? 'rotate(180deg)' : 'rotate(0deg)', + config: { ...config.stiff }, + }); + + if (!delegations?.length) return null; + + return ( + +
+ + {t('YOU_WILL_DELEGATE')} + +
+ {delegations.map((delegation) => ( + + + + ))} + setShowDelegationInfo((prevState) => !prevState)}> + + + + {t('UNKNOWN_RUNE_RECIPIENTS')} + + + + + + + {t('RUNE_DELEGATION_DESCRIPTION')} + + +
+ ); +} + +export default DelegateSection; diff --git a/src/app/components/confirmBtcTransaction/index.tsx b/src/app/components/confirmBtcTransaction/index.tsx index e47231d02..3a316abcd 100644 --- a/src/app/components/confirmBtcTransaction/index.tsx +++ b/src/app/components/confirmBtcTransaction/index.tsx @@ -1,12 +1,10 @@ -import ledgerConnectDefaultIcon from '@assets/img/ledger/ledger_connect_default.svg'; -import ledgerConnectBtcIcon from '@assets/img/ledger/ledger_import_connect_btc.svg'; import { delay } from '@common/utils/ledger'; import BottomModal from '@components/bottomModal'; import ActionButton from '@components/button'; -import LedgerConnectionView from '@components/ledger/connectLedgerView'; +import { Tab } from '@components/tabBar'; import useWalletSelector from '@hooks/useWalletSelector'; import TransportFactory from '@ledgerhq/hw-transport-webusb'; -import { btcTransaction, FungibleToken, Transport } from '@secretkeylabs/xverse-core'; +import { RuneSummary, Transport, btcTransaction } from '@secretkeylabs/xverse-core'; import Callout from '@ui-library/callout'; import { StickyHorizontalSplitButtonContainer, StyledP } from '@ui-library/common.styled'; import Spinner from '@ui-library/spinner'; @@ -15,6 +13,7 @@ import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import styled from 'styled-components'; import SendLayout from '../../layouts/sendLayout'; +import LedgerStepView, { Steps } from './ledgerStepView'; import TransactionSummary from './transactionSummary'; const LoaderContainer = styled.div(() => ({ @@ -29,7 +28,7 @@ const ReviewTransactionText = styled(StyledP)` margin-bottom: ${(props) => props.theme.space.l}; `; -const BroadcastCallout = styled(Callout)` +const SpacedCallout = styled(Callout)` margin-bottom: ${(props) => props.theme.space.m}; `; @@ -48,13 +47,12 @@ type Props = { inputs: btcTransaction.EnhancedInput[]; outputs: btcTransaction.EnhancedOutput[]; feeOutput?: btcTransaction.TransactionFeeOutput; + runeSummary?: RuneSummary; + showCenotaphCallout: boolean; isLoading: boolean; isSubmitting: boolean; isBroadcast?: boolean; isError?: boolean; - token?: FungibleToken; - amountToSend?: string; - recipientAddress?: string; showAccountHeader?: boolean; hideBottomBar?: boolean; cancelText: string; @@ -69,19 +67,21 @@ type Props = { ) => Promise; onFeeRateSet?: (feeRate: number) => void; feeRate?: number; + hasSigHashNone?: boolean; + title?: string; + selectedBottomTab?: Tab; }; function ConfirmBtcTransaction({ inputs, outputs, feeOutput, + runeSummary, + showCenotaphCallout, isLoading, isSubmitting, isBroadcast, isError = false, - token, - amountToSend, - recipientAddress, cancelText, confirmText, onConfirm, @@ -93,9 +93,12 @@ function ConfirmBtcTransaction({ getFeeForFeeRate, onFeeRateSet, feeRate, + hasSigHashNone = false, + title, + selectedBottomTab, }: Props) { const [isModalVisible, setIsModalVisible] = useState(false); - const [currentStepIndex, setCurrentStepIndex] = useState(0); + const [currentStep, setCurrentStep] = useState(Steps.ConnectLedger); const [isButtonDisabled, setIsButtonDisabled] = useState(false); const [isConnectSuccess, setIsConnectSuccess] = useState(false); const [isConnectFailed, setIsConnectFailed] = useState(false); @@ -108,6 +111,11 @@ function ConfirmBtcTransaction({ const { selectedAccount } = useWalletSelector(); const hideBackButton = !onBackClick; + const hasInsufficientRunes = + runeSummary?.transfers?.some((transfer) => !transfer.hasSufficientBalance) ?? false; + const validMintingRune = + !runeSummary?.mint || + (runeSummary?.mint && runeSummary.mint.runeIsOpen && runeSummary.mint.runeIsMintable); const onConfirmPress = async () => { if (!isLedgerAccount(selectedAccount)) { @@ -136,7 +144,15 @@ function ConfirmBtcTransaction({ setIsConnectSuccess(true); await delay(1500); - setCurrentStepIndex(1); + + if (currentStep !== Steps.ExternalInputs && currentStep !== Steps.ConfirmTransaction) { + setCurrentStep(Steps.ExternalInputs); + return; + } + + if (currentStep !== Steps.ConfirmTransaction) { + setCurrentStep(Steps.ConfirmTransaction); + } try { onConfirm(transport); @@ -146,10 +162,16 @@ function ConfirmBtcTransaction({ } }; + const goToConfirmationStep = () => { + setCurrentStep(Steps.ConfirmTransaction); + + handleConnectAndConfirm(); + }; + const handleRetry = async () => { setIsTxRejected(false); setIsConnectSuccess(false); - setCurrentStepIndex(0); + setCurrentStep(Steps.ConnectLedger); }; // TODO: this is a bit naive, but should be correct. We may want to look at the sig hash types of the inputs instead @@ -162,24 +184,30 @@ function ConfirmBtcTransaction({ ) : ( <> - {t('REVIEW_TRANSACTION')} + {title || t('REVIEW_TRANSACTION')} - {!isBroadcast && } + {hasSigHashNone && ( + + )} + {!isBroadcast && } )} setIsModalVisible(false)}> - {currentStepIndex === 0 && ( - - )} - {currentStepIndex === 1 && ( - - )} + - - + {currentStep === Steps.ExternalInputs && !isTxRejected && !isConnectFailed ? ( + + ) : ( + <> + + + + )} diff --git a/src/app/components/confirmBtcTransaction/itemRow/runeAmount.tsx b/src/app/components/confirmBtcTransaction/itemRow/runeAmount.tsx index cf01aa076..75e315477 100644 --- a/src/app/components/confirmBtcTransaction/itemRow/runeAmount.tsx +++ b/src/app/components/confirmBtcTransaction/itemRow/runeAmount.tsx @@ -1,18 +1,12 @@ +import { mapRuneNameToPlaceholder } from '@components/confirmBtcTransaction/utils'; import TokenImage from '@components/tokenImage'; -import { FungibleToken } from '@secretkeylabs/xverse-core'; import Avatar from '@ui-library/avatar'; import { StyledP } from '@ui-library/common.styled'; -import { getFtTicker } from '@utils/tokens'; +import { ftDecimals, getTicker } from '@utils/helper'; import { useTranslation } from 'react-i18next'; import { NumericFormat } from 'react-number-format'; import styled from 'styled-components'; -type Props = { - amountSats: number; - token: FungibleToken; - amountToSend: string; -}; - const Container = styled.div({ width: '100%', display: 'flex', @@ -24,31 +18,42 @@ const AvatarContainer = styled.div` margin-right: ${(props) => props.theme.space.xs}; `; -const ColumnContainer = styled.div({ +const Row = styled.div({ width: '100%', display: 'flex', flexDirection: 'row', justifyContent: 'space-between', - alignItems: 'center', gap: '24px', - whiteSpace: 'nowrap', - overflow: 'hidden', }); -const NumberTypeContainer = styled.div` - text-align: right; +const Column = styled.div` + width: 100%; + display: flex; + flex-direction: column; + gap: 2px; overflow: hidden; `; -const EllipsisStyledP = styled(StyledP)` - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; +const StyledPRight = styled(StyledP)` + word-break: break-all; + text-align: end; `; -export default function RuneAmount({ amountSats, token, amountToSend }: Props) { - const { t } = useTranslation('translation', { keyPrefix: 'CONFIRM_TRANSACTION' }); +type Props = { + tokenName: string; + amount: string; + divisibility: number; + hasSufficientBalance?: boolean; +}; +export default function RuneAmount({ + tokenName, + amount, + divisibility, + hasSufficientBalance = true, +}: Props) { + const { t } = useTranslation('translation', { keyPrefix: 'CONFIRM_TRANSACTION' }); + const amountWithDecimals = ftDecimals(amount, divisibility); return ( @@ -56,7 +61,7 @@ export default function RuneAmount({ amountSats, token, amountToSend }: Props) { src={ - -
+ + {t('AMOUNT')} - - {t('BITCOIN_VALUE')} - -
- ( - {value} + + {value} + )} /> - - {`${amountSats} ${t('SATS')}`} - - -
+ + + {tokenName} + +
); } diff --git a/src/app/components/confirmBtcTransaction/ledgerStepView.tsx b/src/app/components/confirmBtcTransaction/ledgerStepView.tsx new file mode 100644 index 000000000..93791ef5c --- /dev/null +++ b/src/app/components/confirmBtcTransaction/ledgerStepView.tsx @@ -0,0 +1,87 @@ +import InfoIcon from '@assets/img/info.svg'; +import ledgerConnectDefaultIcon from '@assets/img/ledger/ledger_connect_default.svg'; +import ledgerConnectBtcIcon from '@assets/img/ledger/ledger_import_connect_btc.svg'; +import LedgerConnectionView, { + ConnectLedgerContainer, + ConnectLedgerText, +} from '@components/ledger/connectLedgerView'; +import LedgerFailView from '@components/ledger/failLedgerView'; +import { + ConnectLedgerTitle, + InfoImage, +} from '@screens/ledger/confirmLedgerTransaction/index.styled'; +import { TFunction } from 'react-i18next'; + +export enum Steps { + ConnectLedger = 0, + ExternalInputs = 1, + ConfirmTransaction = 2, +} + +type Props = { + currentStep: Steps; + isConnectSuccess: boolean; + isConnectFailed: boolean; + isTxRejected: boolean; + t: TFunction<'translation', 'CONFIRM_TRANSACTION'>; + signatureRequestTranslate: TFunction<'translation', 'SIGNATURE_REQUEST'>; +}; + +function LedgerStepView({ + currentStep, + isConnectSuccess, + isConnectFailed, + isTxRejected, + t, + signatureRequestTranslate, +}: Props) { + switch (currentStep) { + case Steps.ConnectLedger: + return ( + + ); + case Steps.ExternalInputs: + if (isTxRejected || isConnectFailed) { + return ( + + ); + } + + return ( +
+ + + + {t('LEDGER.INPUTS_WARNING.EXTERNAL_INPUTS')} /
+ {t('LEDGER.INPUTS_WARNING.NON_DEFAULT_SIGHASH')} +
+ {t('LEDGER.INPUTS_WARNING.SUBTITLE')} +
+
+ ); + case Steps.ConfirmTransaction: + return ( + + ); + default: + return null; + } +} + +export default LedgerStepView; diff --git a/src/app/components/confirmBtcTransaction/mintSection.tsx b/src/app/components/confirmBtcTransaction/mintSection.tsx new file mode 100644 index 000000000..1edcedcc5 --- /dev/null +++ b/src/app/components/confirmBtcTransaction/mintSection.tsx @@ -0,0 +1,100 @@ +import { ArrowRight } from '@phosphor-icons/react'; +import { RuneSummary } from '@secretkeylabs/xverse-core'; +import { StyledP } from '@ui-library/common.styled'; +import { ftDecimals } from '@utils/helper'; +import { useTranslation } from 'react-i18next'; +import { NumericFormat } from 'react-number-format'; +import styled from 'styled-components'; +import Theme from '../../../theme'; + +const Container = styled.div((props) => ({ + display: 'flex', + flexDirection: 'column', + background: props.theme.colors.elevation1, + borderRadius: 12, + paddingTop: props.theme.space.m, + justifyContent: 'center', + marginBottom: props.theme.space.s, +})); + +const RowCenter = styled.div({ + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', +}); + +const AddressLabel = styled(StyledP)((props) => ({ + marginLeft: props.theme.space.xxs, +})); + +const Header = styled(RowCenter)((props) => ({ + marginBottom: props.theme.space.m, + padding: `0 ${props.theme.space.m}`, +})); + +type Props = { + mints?: RuneSummary['mint'][]; +}; + +function MintSection({ mints }: Props) { + const { t } = useTranslation('translation', { keyPrefix: 'CONFIRM_TRANSACTION' }); + + if (!mints) return null; + + return ( + <> + {mints.map( + (mint) => + mint && ( + +
+ + {t('YOU_WILL_MINT')} + + + + + {t('YOUR_ORDINAL_ADDRESS')} + + +
+
+ + {t('NAME')} + + + {mint?.runeName} + +
+
+ + {t('SYMBOL')} + + + {mint?.symbol} + +
+
+ + {t('AMOUNT')} + + ( + + {value} + + )} + /> +
+
+ ), + )} + + ); +} + +export default MintSection; diff --git a/src/app/components/confirmBtcTransaction/receiveSection.tsx b/src/app/components/confirmBtcTransaction/receiveSection.tsx index 404f3c351..a73fd2f52 100644 --- a/src/app/components/confirmBtcTransaction/receiveSection.tsx +++ b/src/app/components/confirmBtcTransaction/receiveSection.tsx @@ -1,6 +1,7 @@ +import RuneAmount from '@components/confirmBtcTransaction/itemRow/runeAmount'; import useWalletSelector from '@hooks/useWalletSelector'; import { ArrowRight } from '@phosphor-icons/react'; -import { btcTransaction } from '@secretkeylabs/xverse-core'; +import { btcTransaction, RuneSummary } from '@secretkeylabs/xverse-core'; import { StyledP } from '@ui-library/common.styled'; import { useTranslation } from 'react-i18next'; import styled from 'styled-components'; @@ -27,13 +28,14 @@ const RowCenter = styled.div<{ spaceBetween?: boolean }>((props) => ({ })); const Header = styled(RowCenter)((props) => ({ - marginBottom: props.theme.space.m, padding: `0 ${props.theme.space.m}`, })); -const RowContainer = styled.div((props) => ({ - padding: `0 ${props.theme.space.m}`, +const RowContainer = styled.div<{ noPadding?: boolean; noMargin?: boolean }>((props) => ({ + padding: props.noPadding ? 0 : `0 ${props.theme.space.m}`, + marginTop: props.noMargin ? 0 : `${props.theme.space.m}`, })); + const AddressLabel = styled(StyledP)((props) => ({ marginLeft: props.theme.space.xxs, })); @@ -42,9 +44,10 @@ type Props = { outputs: btcTransaction.EnhancedOutput[]; netAmount: number; onShowInscription: (inscription: btcTransaction.IOInscription) => void; + runeReceipts?: RuneSummary['receipts']; }; -function ReceiveSection({ outputs, netAmount, onShowInscription }: Props) { - const { btcAddress, ordinalsAddress } = useWalletSelector(); +function ReceiveSection({ outputs, netAmount, onShowInscription, runeReceipts }: Props) { + const { btcAddress, ordinalsAddress, hasActivatedRareSatsKey } = useWalletSelector(); const { t } = useTranslation('translation', { keyPrefix: 'CONFIRM_TRANSACTION' }); const { outputsToPayment, outputsToOrdinal } = getOutputsWithAssetsToUserAddress({ @@ -53,16 +56,41 @@ function ReceiveSection({ outputs, netAmount, onShowInscription }: Props) { ordinalsAddress, }); + // if receiving runes from own addresses, hide it because it is change, unless it swap addresses (recover runes) + const filteredRuneReceipts = + runeReceipts?.filter( + (receipt) => + !receipt.sourceAddresses.some( + (address) => + (address === ordinalsAddress && receipt.destinationAddress === ordinalsAddress) || + (address === btcAddress && receipt.destinationAddress === btcAddress), + ), + ) ?? []; + const ordinalRuneReceipts = filteredRuneReceipts.filter( + (receipt) => receipt.destinationAddress === ordinalsAddress, + ); + const paymentRuneReceipts = filteredRuneReceipts.filter( + (receipt) => receipt.destinationAddress === btcAddress, + ); + const inscriptionsRareSatsInPayment = outputsToPayment.filter( - (output) => output.inscriptions.length > 0 || output.satributes.length > 0, + (output) => + output.inscriptions.length > 0 || (hasActivatedRareSatsKey && output.satributes.length > 0), ); const areInscriptionsRareSatsInPayment = inscriptionsRareSatsInPayment.length > 0; + const areInscriptionRareSatsInOrdinal = outputsToOrdinal.length > 0; const amountIsBiggerThanZero = netAmount > 0; - const showPaymentSection = areInscriptionsRareSatsInPayment || amountIsBiggerThanZero; + + const showOrdinalSection = !!(ordinalRuneReceipts.length || areInscriptionRareSatsInOrdinal); + const showPaymentSection = !!( + amountIsBiggerThanZero || + paymentRuneReceipts.length || + areInscriptionsRareSatsInPayment + ); return ( <> - {!!outputsToOrdinal.length && ( + {showOrdinalSection && (
@@ -73,19 +101,33 @@ function ReceiveSection({ outputs, netAmount, onShowInscription }: Props) { {t('YOUR_ORDINAL_ADDRESS')}
- {outputsToOrdinal - .sort((a, b) => b.inscriptions.length - a.inscriptions.length) - .map((output, index) => ( - index + 1} + {ordinalRuneReceipts.map((receipt) => ( + + - ))} + + ))} + {areInscriptionRareSatsInOrdinal && ( + + {outputsToOrdinal + .sort((a, b) => b.inscriptions.length - a.inscriptions.length) + .map((output, index) => ( + index + 1} + /> + ))} + + )}
)} {showPaymentSection && ( @@ -99,25 +141,43 @@ function ReceiveSection({ outputs, netAmount, onShowInscription }: Props) { {t('YOUR_PAYMENT_ADDRESS')} + {paymentRuneReceipts.map((receipt) => ( + + + + ))} {amountIsBiggerThanZero && ( )} - {inscriptionsRareSatsInPayment - .sort((a, b) => b.inscriptions.length - a.inscriptions.length) - .map((output, index) => ( - index + 1} - /> - ))} + {areInscriptionsRareSatsInPayment && ( + + {inscriptionsRareSatsInPayment + .sort((a, b) => b.inscriptions.length - a.inscriptions.length) + .map((output, index) => ( + index + 1} + /> + ))} + + )} )} diff --git a/src/app/components/confirmBtcTransaction/transactionSummary.tsx b/src/app/components/confirmBtcTransaction/transactionSummary.tsx index d49a5cc3a..b54f3c913 100644 --- a/src/app/components/confirmBtcTransaction/transactionSummary.tsx +++ b/src/app/components/confirmBtcTransaction/transactionSummary.tsx @@ -2,9 +2,11 @@ import TransactionDetailComponent from '@components/transactionDetailComponent'; import useWalletSelector from '@hooks/useWalletSelector'; import AssetModal from '@components/assetModal'; +import BurnSection from '@components/confirmBtcTransaction/burnSection'; +import MintSection from '@components/confirmBtcTransaction/mintSection'; import TransferFeeView from '@components/transferFeeView'; import useBtcFeeRate from '@hooks/useBtcFeeRate'; -import { btcTransaction, FungibleToken, getBtcFiatEquivalent } from '@secretkeylabs/xverse-core'; +import { btcTransaction, getBtcFiatEquivalent, RuneSummary } from '@secretkeylabs/xverse-core'; import SelectFeeRate from '@ui-components/selectFeeRate'; import Callout from '@ui-library/callout'; import { BLOG_LINK } from '@utils/constants'; @@ -12,6 +14,7 @@ import BigNumber from 'bignumber.js'; import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import styled from 'styled-components'; +import DelegateSection from './delegateSection'; import AmountWithInscriptionSatribute from './itemRow/amountWithInscriptionSatribute'; import ReceiveSection from './receiveSection'; import TransferSection from './transferSection'; @@ -25,25 +28,17 @@ const Container = styled.div((props) => ({ marginBottom: 12, })); -const ScriptCallout = styled(Callout)` - margin-bottom: ${(props) => props.theme.space.s}; -`; -const InscribedRareSatWarning = styled(Callout)` - margin-bottom: ${(props) => props.theme.space.m}; -`; - -const UnconfirmedInputCallout = styled(Callout)` +const WarningCallout = styled(Callout)` margin-bottom: ${(props) => props.theme.space.m}; `; type Props = { isPartialTransaction: boolean; + showCenotaphCallout: boolean; inputs: btcTransaction.EnhancedInput[]; outputs: btcTransaction.EnhancedOutput[]; feeOutput?: btcTransaction.TransactionFeeOutput; - token?: FungibleToken; - amountToSend?: string; - recipientAddress?: string; + runeSummary?: RuneSummary; getFeeForFeeRate?: ( feeRate: number, useEffectiveFeeRate?: boolean, @@ -55,12 +50,11 @@ type Props = { function TransactionSummary({ isPartialTransaction, + showCenotaphCallout, inputs, outputs, feeOutput, - token, - amountToSend, - recipientAddress, + runeSummary, isSubmitting, getFeeForFeeRate, onFeeRateSet, @@ -109,8 +103,7 @@ function TransactionSummary({ const showFeeSelector = !!(feeRate && getFeeForFeeRate && onFeeRateSet); - // TODO - TEMP SOLUTION - we should detect this via the txContext (input/outputs) for proper PSBT support (v2) - const isRuneTransaction = token && token.protocol === 'runes' && amountToSend && recipientAddress; + const hasRuneDelegation = (runeSummary?.burns.length ?? 0) > 0 && isPartialTransaction; return ( <> @@ -126,7 +119,7 @@ function TransactionSummary({ )} {!!showInscribeRareSatWarning && ( - )} {isUnConfirmedInput && ( - + + )} + {showCenotaphCallout && ( + + )} + {runeSummary?.mint && !runeSummary?.mint?.runeIsOpen && ( + + )} + {runeSummary?.mint && !runeSummary?.mint?.runeIsMintable && ( + )} + {hasRuneDelegation && } @@ -150,9 +151,12 @@ function TransactionSummary({ outputs={outputs} onShowInscription={setInscriptionToShow} netAmount={netAmount} + runeReceipts={runeSummary?.receipts} /> + {!hasRuneDelegation && } + - {!isRuneTransaction && hasOutputScript && } + {hasOutputScript && !runeSummary && } {feeOutput && !showFeeSelector && ( ({ marginBottom: props.theme.space.s, })); -const RowContainer = styled.div((props) => ({ - padding: `0 ${props.theme.space.m}`, +const RowContainer = styled.div<{ noPadding?: boolean; noMargin?: boolean }>((props) => ({ + padding: props.noPadding ? 0 : `0 ${props.theme.space.m}`, + marginTop: props.noMargin ? 0 : `${props.theme.space.m}`, })); const RowCenter = styled.div<{ spaceBetween?: boolean }>((props) => ({ @@ -34,28 +32,16 @@ const RowCenter = styled.div<{ spaceBetween?: boolean }>((props) => ({ })); const Header = styled(RowCenter)((props) => ({ - marginBottom: props.theme.space.m, padding: `0 ${props.theme.space.m}`, })); -const StyledStyledP = styled(StyledP)` - display: flex; - align-items: center; -`; - -const StyledArrowRight = styled(ArrowRight)({ - marginRight: 4, -}); - type Props = { outputs: btcTransaction.EnhancedOutput[]; inputs: btcTransaction.EnhancedInput[]; isPartialTransaction: boolean; + runeTransfers?: RuneSummary['transfers']; netAmount: number; onShowInscription: (inscription: btcTransaction.IOInscription) => void; - token?: FungibleToken; - amountToSend?: string; - recipientAddress?: string; }; // if isPartialTransaction, we use inputs instead of outputs @@ -63,11 +49,9 @@ function TransferSection({ outputs, inputs, isPartialTransaction, + runeTransfers, netAmount, onShowInscription, - token, - amountToSend, - recipientAddress, }: Props) { const { btcAddress, ordinalsAddress } = useWalletSelector(); const { t } = useTranslation('translation', { keyPrefix: 'CONFIRM_TRANSACTION' }); @@ -91,35 +75,34 @@ function TransferSection({ inscriptionsFromPayment.push(...item.inscriptions); satributesFromPayment.push(...item.satributes); }); + const hasRuneTransfers = (runeTransfers ?? []).length > 0; + const hasInscriptionsRareSatsInOrdinal = + (isPartialTransaction && inputFromOrdinal.length > 0) || outputsFromOrdinal.length > 0; - const hasData = - showAmount || - (isPartialTransaction && inputFromOrdinal.length > 0) || - outputsFromOrdinal.length > 0; + const hasData = showAmount || hasRuneTransfers || hasInscriptionsRareSatsInOrdinal; if (!hasData) return null; - const isRuneTransaction = token && amountToSend && recipientAddress; - return (
{t('YOU_WILL_TRANSFER')} - {isRuneTransaction && ( - - - {getTruncatedAddress(recipientAddress, 6)} - - )}
+ {runeTransfers?.map((transfer) => ( + + + + ))} {showAmount && ( - {isRuneTransaction && ( - - )} - {!isRuneTransaction && } + )} - {isPartialTransaction - ? inputFromOrdinal.map((input, index) => ( - index + 1} - /> - )) - : outputsFromOrdinal.map((output, index) => ( - index + 1} - /> - ))} + {hasInscriptionsRareSatsInOrdinal && ( + + {isPartialTransaction + ? inputFromOrdinal.map((input, index) => ( + index + 1} + /> + )) + : outputsFromOrdinal.map((output, index) => ( + index + 1} + /> + ))} + + )}
); } diff --git a/src/app/components/confirmBtcTransaction/txInOutput/txInOutput.tsx b/src/app/components/confirmBtcTransaction/txInOutput/txInOutput.tsx index 2ff4e71f0..59fbdf898 100644 --- a/src/app/components/confirmBtcTransaction/txInOutput/txInOutput.tsx +++ b/src/app/components/confirmBtcTransaction/txInOutput/txInOutput.tsx @@ -36,11 +36,11 @@ const OutputTitleText = styled(StyledP)((props) => ({ marginBottom: props.theme.space.s, })); -const ExpandedContainer = styled(animated.div)({ +const ExpandedContainer = styled(animated.div)((props) => ({ display: 'flex', flexDirection: 'column', - marginTop: 16, -}); + marginTop: props.theme.space.m, +})); type Props = { inputs: btcTransaction.EnhancedInput[]; @@ -76,7 +76,7 @@ function TxInOutput({ inputs, outputs }: Props) { {isExpanded ? t('INPUT') : t('INPUT_AND_OUTPUT')} - + {isExpanded && ( diff --git a/src/app/components/confirmBtcTransaction/utils.ts b/src/app/components/confirmBtcTransaction/utils.ts index ededa2dbb..0e6668a74 100644 --- a/src/app/components/confirmBtcTransaction/utils.ts +++ b/src/app/components/confirmBtcTransaction/utils.ts @@ -1,4 +1,4 @@ -import { btcTransaction, BundleSatRange } from '@secretkeylabs/xverse-core'; +import { btcTransaction, BundleSatRange, FungibleToken } from '@secretkeylabs/xverse-core'; export type SatRangeTx = { totalSats: number; @@ -267,3 +267,13 @@ export const getSatRangesWithInscriptions = ({ return { satRanges: satRangesArray, totalExoticSats }; }; + +export const mapRuneNameToPlaceholder = (runeName: string): FungibleToken => ({ + protocol: 'runes', + name: runeName, + assetName: '', + balance: '', + principal: '', + total_received: '', + total_sent: '', +}); diff --git a/src/app/components/confirmStxTransactionComponent/index.tsx b/src/app/components/confirmStxTransactionComponent/index.tsx index 7b23effcb..2b5de848e 100644 --- a/src/app/components/confirmStxTransactionComponent/index.tsx +++ b/src/app/components/confirmStxTransactionComponent/index.tsx @@ -130,6 +130,7 @@ interface Props { title?: string; subTitle?: string; hasSignatures?: boolean; + onFeeChange?: (fee: BigNumber) => void; } function ConfirmStxTransactionComponent({ @@ -144,6 +145,7 @@ function ConfirmStxTransactionComponent({ onCancelClick, skipModal = false, hasSignatures = false, + onFeeChange, }: Props) { const { t } = useTranslation('translation', { keyPrefix: 'CONFIRM_TRANSACTION' }); const { t: signatureRequestTranslate } = useTranslation('translation', { @@ -249,6 +251,7 @@ function ConfirmStxTransactionComponent({ } setFee(initialStxTransactions[0], BigInt(fee.toString())); + onFeeChange?.(fee); if (nonce && nonce !== '') { setNonce(initialStxTransactions[0], BigInt(nonce)); } diff --git a/src/app/components/copyButton/index.tsx b/src/app/components/copyButton/index.tsx index 179b12ae9..012d19c88 100644 --- a/src/app/components/copyButton/index.tsx +++ b/src/app/components/copyButton/index.tsx @@ -47,7 +47,7 @@ function CopyButton({ text }: Props) { if (isCopied) { setTimeout(() => { setIsCopied(false); - }, 5000); + }, 2000); } }, [isCopied]); @@ -62,6 +62,7 @@ function CopyButton({ text }: Props) { content={t('COPIED')} events={['click']} place="top" + hidden={!isCopied} /> ); diff --git a/src/app/components/explore/FeaturedCard.tsx b/src/app/components/explore/FeaturedCard.tsx index 9c875a946..dc0a72ab2 100644 --- a/src/app/components/explore/FeaturedCard.tsx +++ b/src/app/components/explore/FeaturedCard.tsx @@ -1,13 +1,23 @@ -import { Link } from 'react-router-dom'; +import { trackMixPanel } from '@utils/mixpanel'; import styled from 'styled-components'; -const Card = styled(Link)` +const Card = styled.div` + cursor: pointer; display: block; border-radius: 12px; background-color: ${({ theme }) => theme.colors.elevation2}; height: 182px; width: 212px; color: ${({ theme }) => theme.colors.white_0}; + transition: opacity 0.1s ease; + + &:hover { + opacity: 0.8; + } + + &:active { + opacity: 0.6; + } `; const CardImage = styled.img` @@ -35,7 +45,23 @@ export interface FeaturedCardProps { function FeaturedCard({ url, banner, description }: FeaturedCardProps) { return ( - + { + trackMixPanel( + 'click_app', + { + link: url, + section: 'featured', + source: 'web-extension', + }, + { send_immediately: true }, + () => { + window.open(url, '_blank'); + }, + 'explore-app', + ); + }} + > {description} diff --git a/src/app/components/explore/FeaturedCarousel.tsx b/src/app/components/explore/FeaturedCarousel.tsx index 092b2668c..d831da56e 100644 --- a/src/app/components/explore/FeaturedCarousel.tsx +++ b/src/app/components/explore/FeaturedCarousel.tsx @@ -37,7 +37,7 @@ type FeaturedCardCarouselProps = { function FeaturedCardCarousel({ items }: FeaturedCardCarouselProps) { return ( - + {items.map((item) => ( - + ))} diff --git a/src/app/components/explore/RecommendedApps.tsx b/src/app/components/explore/RecommendedApps.tsx index 09939ab44..f7e2cdd5e 100644 --- a/src/app/components/explore/RecommendedApps.tsx +++ b/src/app/components/explore/RecommendedApps.tsx @@ -1,4 +1,4 @@ -import { Link } from 'react-router-dom'; +import { trackMixPanel } from '@utils/mixpanel'; import styled from 'styled-components'; const Container = styled.div` @@ -9,13 +9,22 @@ const Container = styled.div` width: 100%; `; -const Card = styled(Link)` +const Card = styled.div` + cursor: pointer; display: flex; align-items: center; column-gap: ${({ theme }) => theme.space.m}; width: 100%; - max-width: 282px; color: ${({ theme }) => theme.colors.white_0}; + transition: opacity 0.1s ease; + + &:hover { + opacity: 0.8; + } + + &:active { + opacity: 0.6; + } `; const CardImage = styled.img` @@ -43,10 +52,29 @@ function RecommendedApps({ items }: Props) { return ( {items.map((item) => ( - + { + trackMixPanel( + 'click_app', + { + title: item.name, + link: item.url, + section: 'recommended', + source: 'web-extension', + }, + { send_immediately: true }, + () => { + window.open(item.url, '_blank'); + }, + 'explore-app', + ); + }} + >
- {item.name} + {item.name} {item.description}
diff --git a/src/app/components/ledger/ledgerAddressComponent/index.tsx b/src/app/components/ledger/ledgerAddressComponent/index.tsx index 3d94f7f0e..5bedfd15b 100644 --- a/src/app/components/ledger/ledgerAddressComponent/index.tsx +++ b/src/app/components/ledger/ledgerAddressComponent/index.tsx @@ -87,6 +87,7 @@ function LedgerAddressComponent({ title, address }: Props) { content={isCopied ? 'Copied' : title} events={['hover']} place="bottom" + hidden={!isCopied} /> diff --git a/src/app/components/passwordInput/index.tsx b/src/app/components/passwordInput/index.tsx index 81c86763a..6e406da31 100644 --- a/src/app/components/passwordInput/index.tsx +++ b/src/app/components/passwordInput/index.tsx @@ -3,6 +3,7 @@ import EyeSlash from '@assets/img/createPassword/EyeSlash.svg'; import PasswordIcon from '@assets/img/createPassword/Password.svg'; import ActionButton from '@components/button'; import { animated, useTransition } from '@react-spring/web'; +import Button from '@ui-library/button'; import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import styled, { useTheme } from 'styled-components'; @@ -20,11 +21,12 @@ interface PasswordInputProps { stackButtonAlignment?: boolean; loading?: boolean; createPasswordFlow?: boolean; + autoFocus?: boolean; } interface StrengthBarProps { - strengthColor: string; - strengthWidth: string; + $strengthColor: string; + $strengthWidth: string; } const Container = styled.div({ @@ -90,9 +92,13 @@ const ButtonsContainer = styled.div((props) => ({ marginBottom: props.theme.spacing(8), })); -const Button = styled.button({ +const StyledButton = styled.button({ background: 'none', display: 'flex', + transition: 'opacity 0.1s ease', + '&:hover, &:focus': { + opacity: 0.8, + }, }); const ErrorMessage = styled.h2((props) => ({ @@ -125,9 +131,9 @@ const StrengthBar = styled(animated.div)((props) => ({ borderRadius: props.theme.radius(1), width: '50%', div: { - width: props.strengthWidth, + width: props.$strengthWidth, height: 4, - backgroundColor: props.strengthColor, + backgroundColor: props.$strengthColor, borderRadius: props.theme.radius(1), }, })); @@ -166,6 +172,7 @@ function PasswordInput(props: PasswordInputProps): JSX.Element { stackButtonAlignment = false, loading, createPasswordFlow, + autoFocus = false, } = props; const { t } = useTranslation('translation', { keyPrefix: 'CREATE_PASSWORD_SCREEN' }); @@ -243,7 +250,7 @@ function PasswordInput(props: PasswordInputProps): JSX.Element { return ( {t('PASSWORD_STRENGTH_LABEL')} - + {transition((style) => ( ))} @@ -258,7 +265,7 @@ function PasswordInput(props: PasswordInputProps): JSX.Element { {t('PASSWORD_STRENGTH_LABEL')} {transition((style) => ( - + ))} @@ -271,7 +278,7 @@ function PasswordInput(props: PasswordInputProps): JSX.Element { {t('PASSWORD_STRENGTH_LABEL')} {transition((style) => ( - + ))} @@ -282,7 +289,7 @@ function PasswordInput(props: PasswordInputProps): JSX.Element { return ( {t('PASSWORD_STRENGTH_LABEL')} - + {transition((style) => ( ))} @@ -310,25 +317,26 @@ function PasswordInput(props: PasswordInputProps): JSX.Element { type={isPasswordVisible ? 'text' : 'password'} value={enteredPassword} onChange={handlePasswordChange} + autoFocus={autoFocus} /> - + {error && {error}} {checkPasswordStrength ? renderStrengthBar() : null} - + - - - -