diff --git a/.github/workflows/ci-playwright.yaml b/.github/workflows/ci-playwright.yaml new file mode 100644 index 00000000..3011af13 --- /dev/null +++ b/.github/workflows/ci-playwright.yaml @@ -0,0 +1,79 @@ +name: playwright-test +on: + push: + branches: + - main + pull_request: + branches: + - main +jobs: + playwright-test: + runs-on: ubuntu-latest + services: + sapphire-localnet-ci: + image: ghcr.io/oasisprotocol/sapphire-localnet:latest + ports: + - 8545:8545 + - 8546:8546 + env: + OASIS_DEPOSIT_BINARY: /oasis-deposit -test-mnemonic -n 5 + options: >- + --rm + --health-cmd="test -f /CONTAINER_READY" + --health-start-period=90s + env: + SAPPHIRE_LOCALNET_HTTP_PROXY_PORT: 3001 + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 18 + - uses: pnpm/action-setup@v4 + name: Install pnpm + id: pnpm-install + with: + version: 8 + run_install: false + - name: Get pnpm store directory + id: pnpm-cache + run: | + echo "pnpm_cache_dir=$(pnpm store path)" >> $GITHUB_OUTPUT + - uses: actions/cache@v4 + name: Setup pnpm cache + with: + path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + - name: Install dependencies + run: pnpm install + - name: Build JS client + run: make -C clients/js build + - name: Build Integrations + run: make -C integrations build + - uses: JarvusInnovations/background-action@v1 + name: RPC proxy will error if non-encrypted calls are made + with: + run: pnpm run proxy & + wait-on: http://127.0.0.1:${{ env.SAPPHIRE_LOCALNET_HTTP_PROXY_PORT }} + tail: true + log-output-resume: true + wait-for: 31sec + log-output: true + log-output-if: true + working-directory: clients/js + - name: Install Playwright dependencies + run: pnpm install && pnpm test:setup + working-directory: examples/wagmi-v2 + - name: Run playwright tests (with xvfb-run to support headed extension test) + working-directory: examples/wagmi-v2 + run: xvfb-run pnpm test + - name: 'Upload playwright test-results' + if: ${{ failure() }} + uses: actions/upload-artifact@v4 + with: + name: playwright-test-results + path: examples/wagmi-v2/test-results + retention-days: 5 diff --git a/README.md b/README.md index 56e4e19a..0d42d411 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ [![ci-lint](https://github.com/oasisprotocol/sapphire-paratime/actions/workflows/ci-lint.yaml/badge.svg)](https://github.com/oasisprotocol/sapphire-paratime/actions/workflows/ci-lint.yaml) [![ci-test](https://github.com/oasisprotocol/sapphire-paratime/actions/workflows/ci-test.yaml/badge.svg)](https://github.com/oasisprotocol/sapphire-paratime/actions/workflows/ci-test.yaml) [![ci-test](https://github.com/oasisprotocol/sapphire-paratime/actions/workflows/contracts-test.yaml/badge.svg)](https://github.com/oasisprotocol/sapphire-paratime/actions/workflows/contracts-test.yaml) +[![ci-test](https://github.com/oasisprotocol/sapphire-paratime/actions/workflows/ci-playwright.yaml/badge.svg)](https://github.com/oasisprotocol/sapphire-paratime/actions/workflows/ci-playwright.yaml) The Sapphire ParaTime is the official confidential EVM Compatible ParaTime providing a smart contract development environment with EVM compatibility diff --git a/examples/wagmi-v2/.gitignore b/examples/wagmi-v2/.gitignore index 30779123..d6a51648 100644 --- a/examples/wagmi-v2/.gitignore +++ b/examples/wagmi-v2/.gitignore @@ -13,6 +13,8 @@ node_modules dist dist-ssr *.local +playwright-report +test-results # Editor directories and files .vscode/* diff --git a/examples/wagmi-v2/package.json b/examples/wagmi-v2/package.json index 2e9628ec..050823af 100644 --- a/examples/wagmi-v2/package.json +++ b/examples/wagmi-v2/package.json @@ -10,12 +10,16 @@ "lint": "biome check .", "format": "biome format --write .", "preview": "vite preview", + "test": "playwright test", + "test:setup": "playwright install --with-deps", "start:server": "vite --port 3000" }, "dependencies": { - "@oasisprotocol/sapphire-wagmi-v2": "workspace:^", "@oasisprotocol/sapphire-paratime": "workspace:^", + "@oasisprotocol/sapphire-wagmi-v2": "workspace:^", + "@playwright/test": "^1.48.2", "@tanstack/react-query": "5.0.5", + "@tenkeylabs/dappwright": "^2.8.6", "abitype": "^1.0.2", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/examples/wagmi-v2/playwright.config.ts b/examples/wagmi-v2/playwright.config.ts new file mode 100644 index 00000000..b1b69d5d --- /dev/null +++ b/examples/wagmi-v2/playwright.config.ts @@ -0,0 +1,46 @@ +import { defineConfig, devices } from "@playwright/test"; + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + timeout: 2 * 60 * 1000, + testDir: "./test/", + 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 parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: [["html"], ["list", { printSteps: true }]], + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + baseURL: process.env.FRONTEND_URL || "http://localhost:3000/", + trace: "on-first-retry", + headless: false, + screenshot: { + mode: "only-on-failure", + fullPage: true, + }, + }, + /* Configure projects for major browsers */ + projects: [ + { + name: 'main', + testDir: './test/', + use: { + ...devices['Desktop Chrome'], + }, + }, + ], + /* Run your local dev server before starting the tests */ + webServer: { + command: 'pnpm run start:server', + url: process.env.FRONTEND_URL || "http://localhost:3000/", + reuseExistingServer: !process.env.CI, + stdout: 'pipe', + stderr: 'pipe', + }, +}); diff --git a/examples/wagmi-v2/src/App.tsx b/examples/wagmi-v2/src/App.tsx index ddaa74e8..1774e7b5 100644 --- a/examples/wagmi-v2/src/App.tsx +++ b/examples/wagmi-v2/src/App.tsx @@ -186,7 +186,7 @@ function App() {
Write Tx Calldata:  - + {isCalldataEnveloped(writeTxInfo?.input) ? 'encrypted' : 'plaintext'} @@ -199,7 +199,7 @@ function App() { {readResult !== undefined && ( <> - {readResult.toString()} + {readResult.toString()} )}
diff --git a/examples/wagmi-v2/test/e2e.spec.ts b/examples/wagmi-v2/test/e2e.spec.ts new file mode 100644 index 00000000..f4859930 --- /dev/null +++ b/examples/wagmi-v2/test/e2e.spec.ts @@ -0,0 +1,60 @@ +import { BrowserContext, expect, test as baseTest } from "@playwright/test"; +import dappwright, { Dappwright, MetaMaskWallet } from "@tenkeylabs/dappwright"; + +export const test = baseTest.extend<{ + context: BrowserContext; + wallet: Dappwright; +}>({ + context: async ({}, use) => { + // Launch context with extension + const [wallet, _, context] = await dappwright.bootstrap("", { + wallet: "metamask", + version: MetaMaskWallet.recommendedVersion, + seed: "test test test test test test test test test test test junk", // Hardhat's default https://hardhat.org/hardhat-network/docs/reference#accounts + headless: false, + }); + + // Add Sapphire Localnet as a custom network + await wallet.addNetwork({ + networkName: "Sapphire Localnet", + rpc: "http://localhost:8545", + chainId: 23293, + symbol: "ROSE", + }); + + await use(context); + }, + + wallet: async ({ context }, use) => { + const metamask = await dappwright.getWallet("metamask", context); + + await use(metamask); + }, +}); + +test.beforeEach(async ({ wallet, page }) => { + // Use first account from seed. dAppwright adds two accounts by default. + await wallet.switchAccount(1); // Selector queries as a string + await page.bringToFront(); +}); + +test("deploy contract and send encrypted transaction", async ({ wallet, page }) => { + await page.goto("http://localhost:3000"); + + // Use address of first account + await page.getByText("Injected (Sapphire)").click(); + await wallet.approve(); + await expect(page.getByText("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266")).toBeVisible(); + + await page.getByText("Deploy").click(); + await wallet.confirmTransaction(); + await expect(page.getByText("Contract:")).toBeVisible(); + + await page.getByText("Write").click(); + await wallet.confirmTransaction(); + await expect(page.getByText("Contract:")).toBeVisible(); + await expect(page.getByTestId('is-write-enveloped')).toHaveText('encrypted'); + + await page.getByText("Read").click(); + await expect(page.getByTestId("read-result")).not.toBeEmpty(); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 31eb261d..5ae75bf6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -67,6 +67,9 @@ importers: specifier: ^5.0.2 version: 5.0.2 devDependencies: + '@noble/hashes': + specifier: 1.3.2 + version: 1.3.2 '@nomicfoundation/hardhat-chai-matchers': specifier: ^2.0.0 version: 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.54)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.3(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.12(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.54)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10)) @@ -236,7 +239,7 @@ importers: devDependencies: react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.25.7(@babel/core@7.25.7))(@babel/plugin-transform-react-jsx@7.25.7(@babel/core@7.25.7))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(typescript@5.6.2))(type-fest@0.21.3)(typescript@5.6.2)(utf-8-validate@5.0.10)(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(webpack-dev-server@4.15.2)(webpack@5.95.0)) + version: 5.0.1(@babel/plugin-syntax-flow@7.25.7(@babel/core@7.25.7))(@babel/plugin-transform-react-jsx@7.25.7(@babel/core@7.25.7))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2))(type-fest@0.21.3)(typescript@5.6.2)(utf-8-validate@5.0.10)(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(webpack-dev-server@4.15.2)(webpack@5.95.0)) webpack-bundle-analyzer: specifier: ^4.10.2 version: 4.10.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -374,7 +377,7 @@ importers: version: 2.9.19(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10) wagmi: specifier: 1.4.13 - version: 1.4.13(@types/react@18.3.11)(bufferutil@4.0.8)(immer@10.0.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)) + version: 1.4.13(@types/react@18.3.11)(bufferutil@4.0.8)(immer@10.0.2)(react-dom@18.3.1(react@18.3.1))(react-native@0.75.4(@babel/core@7.25.7)(@babel/preset-env@7.25.7(@babel/core@7.25.7))(@types/react@18.3.11)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)) devDependencies: '@biomejs/biome': specifier: ^1.7.0 @@ -409,9 +412,15 @@ importers: '@oasisprotocol/sapphire-wagmi-v2': specifier: workspace:^ version: link:../../integrations/wagmi-v2 + '@playwright/test': + specifier: ^1.48.2 + version: 1.48.2 '@tanstack/react-query': specifier: 5.0.5 version: 5.0.5(react-dom@18.3.1(react@18.3.1))(react-native@0.75.4(@babel/core@7.25.7)(@babel/preset-env@7.25.7(@babel/core@7.25.7))(@types/react@18.3.11)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10))(react@18.3.1) + '@tenkeylabs/dappwright': + specifier: ^2.8.6 + version: 2.8.6(playwright-core@1.48.2) abitype: specifier: ^1.0.2 version: 1.0.6(typescript@5.6.2) @@ -2686,6 +2695,11 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@playwright/test@1.48.2': + resolution: {integrity: sha512-54w1xCWfXuax7dz4W2M9uw0gDyh+ti/0K/MxcCUxChFh37kkdxPdfZDw5QBbuPUJHr1CiHJ1hXgSs+GgeQc5Zw==} + engines: {node: '>=18'} + hasBin: true + '@pmmmwh/react-refresh-webpack-plugin@0.5.15': resolution: {integrity: sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==} engines: {node: '>= 10.13'} @@ -3232,6 +3246,12 @@ packages: react-native: optional: true + '@tenkeylabs/dappwright@2.8.6': + resolution: {integrity: sha512-V5rWXCbln7Kigu+VdYvpxUWlgyOmpcyYom8udSsngpkCgGKJ/DOMNEvhvi5xP2Rtv0IA22WRu1wiRpiaGOpJaw==} + engines: {node: '>=16'} + peerDependencies: + playwright-core: '>1.0' + '@tootallnate/once@1.1.2': resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} @@ -5425,6 +5445,7 @@ packages: eciesjs@0.3.20: resolution: {integrity: sha512-Rz5AB8v9+xmMdS/R7RzWPe/R8DP5QfyrkA6ce4umJopoB5su2H2aDy/GcgIfwhmCwxnBkqGf/PbGzmKcGtIgGA==} + deprecated: Please upgrade to v0.4+ ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -5738,6 +5759,7 @@ packages: eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true esniff@2.0.1: @@ -6155,6 +6177,11 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -8389,6 +8416,16 @@ packages: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} + playwright-core@1.48.2: + resolution: {integrity: sha512-sjjw+qrLFlriJo64du+EK0kJgZzoQPsabGF4lBvsid+3CNIZIYLgnMj9V6JY5VhM2Peh20DJWIVpVljLLnlawA==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.48.2: + resolution: {integrity: sha512-NjYvYgp4BPmiwfe31j4gHLa3J7bD2WiBz8Lk2RoSsmX38SVIARZ18VYjxLjAcDsAhA+F4iSEXTSGgjua0rrlgQ==} + engines: {node: '>=18'} + hasBin: true + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -11068,6 +11105,7 @@ packages: workbox-google-analytics@6.6.0: resolution: {integrity: sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==} + deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained workbox-navigation-preload@6.6.0: resolution: {integrity: sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==} @@ -13001,7 +13039,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(typescript@5.6.2))(utf-8-validate@5.0.10)': + '@jest/core@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2))(utf-8-validate@5.0.10)': dependencies: '@jest/console': 27.5.1 '@jest/reporters': 27.5.1 @@ -13015,7 +13053,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 27.5.1 - jest-config: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-config: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-haste-map: 27.5.1 jest-message-util: 27.5.1 jest-regex-util: 27.5.1 @@ -14085,6 +14123,10 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@playwright/test@1.48.2': + dependencies: + playwright: 1.48.2 + '@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.11.0)(type-fest@0.21.3)(webpack-dev-server@4.15.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack-cli@5.1.4)(webpack@5.95.0))(webpack@5.95.0(webpack-cli@5.1.4))': dependencies: ansi-html: 0.0.9 @@ -14822,18 +14864,19 @@ snapshots: dependencies: '@tanstack/query-persist-client-core': 4.36.1 - '@tanstack/react-query-persist-client@4.36.1(@tanstack/react-query@4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@tanstack/react-query-persist-client@4.36.1(@tanstack/react-query@4.36.1(react-dom@18.3.1(react@18.3.1))(react-native@0.75.4(@babel/core@7.25.7)(@babel/preset-env@7.25.7(@babel/core@7.25.7))(@types/react@18.3.11)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10))(react@18.3.1))': dependencies: '@tanstack/query-persist-client-core': 4.36.1 - '@tanstack/react-query': 4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-query': 4.36.1(react-dom@18.3.1(react@18.3.1))(react-native@0.75.4(@babel/core@7.25.7)(@babel/preset-env@7.25.7(@babel/core@7.25.7))(@types/react@18.3.11)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10))(react@18.3.1) - '@tanstack/react-query@4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-query@4.36.1(react-dom@18.3.1(react@18.3.1))(react-native@0.75.4(@babel/core@7.25.7)(@babel/preset-env@7.25.7(@babel/core@7.25.7))(@types/react@18.3.11)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10))(react@18.3.1)': dependencies: '@tanstack/query-core': 4.36.1 react: 18.3.1 use-sync-external-store: 1.2.2(react@18.3.1) optionalDependencies: react-dom: 18.3.1(react@18.3.1) + react-native: 0.75.4(@babel/core@7.25.7)(@babel/preset-env@7.25.7(@babel/core@7.25.7))(@types/react@18.3.11)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10) '@tanstack/react-query@5.0.5(react-dom@18.3.1(react@18.3.1))(react-native@0.75.4(@babel/core@7.25.7)(@babel/preset-env@7.25.7(@babel/core@7.25.7))(@types/react@18.3.11)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10))(react@18.3.1)': dependencies: @@ -14843,6 +14886,11 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-native: 0.75.4(@babel/core@7.25.7)(@babel/preset-env@7.25.7(@babel/core@7.25.7))(@types/react@18.3.11)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10) + '@tenkeylabs/dappwright@2.8.6(playwright-core@1.48.2)': + dependencies: + node-stream-zip: 1.15.0 + playwright-core: 1.48.2 + '@tootallnate/once@1.1.2': {} '@truffle/error@0.1.1': {} @@ -18222,7 +18270,7 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.25.7(@babel/core@7.25.7))(@babel/plugin-transform-react-jsx@7.25.7(@babel/core@7.25.7))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.25.7(@babel/core@7.25.7))(@babel/plugin-transform-react-jsx@7.25.7(@babel/core@7.25.7))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@babel/core': 7.25.7 '@babel/eslint-parser': 7.25.7(@babel/core@7.25.7)(eslint@8.57.1) @@ -18234,7 +18282,7 @@ snapshots: eslint: 8.57.1 eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.25.7(@babel/core@7.25.7))(@babel/plugin-transform-react-jsx@7.25.7(@babel/core@7.25.7))(eslint@8.57.1) eslint-plugin-import: 2.30.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1) eslint-plugin-react: 7.37.1(eslint@8.57.1) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) @@ -18303,13 +18351,13 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2): dependencies: '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.1)(typescript@5.6.2) eslint: 8.57.1 optionalDependencies: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) - jest: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(typescript@5.6.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2))(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - typescript @@ -19037,6 +19085,9 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -20140,16 +20191,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(typescript@5.6.2))(utf-8-validate@5.0.10): + jest-cli@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: - '@jest/core': 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(typescript@5.6.2))(utf-8-validate@5.0.10) + '@jest/core': 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2))(utf-8-validate@5.0.10) '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.2.0 - jest-config: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-config: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-util: 27.5.1 jest-validate: 27.5.1 prompts: 2.4.2 @@ -20180,7 +20231,7 @@ snapshots: - supports-color - ts-node - jest-config@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(typescript@5.6.2))(utf-8-validate@5.0.10): + jest-config@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.25.7 '@jest/test-sequencer': 27.5.1 @@ -20711,11 +20762,11 @@ snapshots: leven: 3.1.0 pretty-format: 29.7.0 - jest-watch-typeahead@1.1.0(jest@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(typescript@5.6.2))(utf-8-validate@5.0.10)): + jest-watch-typeahead@1.1.0(jest@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2))(utf-8-validate@5.0.10)): dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 - jest: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(typescript@5.6.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-regex-util: 28.0.2 jest-watcher: 28.1.3 slash: 4.0.0 @@ -20779,11 +20830,11 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(typescript@5.6.2))(utf-8-validate@5.0.10): + jest@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2))(utf-8-validate@5.0.10): dependencies: - '@jest/core': 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(typescript@5.6.2))(utf-8-validate@5.0.10) + '@jest/core': 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2))(utf-8-validate@5.0.10) import-local: 3.2.0 - jest-cli: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(typescript@5.6.2))(utf-8-validate@5.0.10) + jest-cli: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2))(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - canvas @@ -22081,6 +22132,14 @@ snapshots: dependencies: find-up: 3.0.0 + playwright-core@1.48.2: {} + + playwright@1.48.2: + dependencies: + playwright-core: 1.48.2 + optionalDependencies: + fsevents: 2.3.2 + pluralize@8.0.0: {} pngjs@5.0.0: {} @@ -22237,7 +22296,7 @@ snapshots: postcss: 8.4.47 postcss-value-parser: 4.2.0 - postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(typescript@5.6.2)): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2)): dependencies: lilconfig: 3.1.2 yaml: 2.5.1 @@ -22858,7 +22917,7 @@ snapshots: react-refresh@0.14.2: {} - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.25.7(@babel/core@7.25.7))(@babel/plugin-transform-react-jsx@7.25.7(@babel/core@7.25.7))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(typescript@5.6.2))(type-fest@0.21.3)(typescript@5.6.2)(utf-8-validate@5.0.10)(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(webpack-dev-server@4.15.2)(webpack@5.95.0)): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.25.7(@babel/core@7.25.7))(@babel/plugin-transform-react-jsx@7.25.7(@babel/core@7.25.7))(@types/babel__core@7.20.5)(bufferutil@4.0.8)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2))(type-fest@0.21.3)(typescript@5.6.2)(utf-8-validate@5.0.10)(webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(webpack-dev-server@4.15.2)(webpack@5.95.0)): dependencies: '@babel/core': 7.25.7 '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.11.0)(type-fest@0.21.3)(webpack-dev-server@4.15.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack-cli@5.1.4)(webpack@5.95.0))(webpack@5.95.0(webpack-cli@5.1.4)) @@ -22876,15 +22935,15 @@ snapshots: dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.57.1 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.25.7(@babel/core@7.25.7))(@babel/plugin-transform-react-jsx@7.25.7(@babel/core@7.25.7))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.25.7(@babel/core@7.25.7))(@babel/plugin-transform-react-jsx@7.25.7(@babel/core@7.25.7))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2))(utf-8-validate@5.0.10))(typescript@5.6.2) eslint-webpack-plugin: 3.2.0(eslint@8.57.1)(webpack@5.95.0(webpack-cli@5.1.4)) file-loader: 6.2.0(webpack@5.95.0(webpack-cli@5.1.4)) fs-extra: 10.1.0 html-webpack-plugin: 5.6.0(webpack@5.95.0(webpack-cli@5.1.4)) identity-obj-proxy: 3.0.0 - jest: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(typescript@5.6.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2))(utf-8-validate@5.0.10) jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(typescript@5.6.2))(utf-8-validate@5.0.10)) + jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2))(utf-8-validate@5.0.10)) mini-css-extract-plugin: 2.9.1(webpack@5.95.0(webpack-cli@5.1.4)) postcss: 8.4.47 postcss-flexbugs-fixes: 5.0.2(postcss@8.4.47) @@ -22902,7 +22961,7 @@ snapshots: semver: 7.6.3 source-map-loader: 3.0.2(webpack@5.95.0(webpack-cli@5.1.4)) style-loader: 3.3.4(webpack@5.95.0(webpack-cli@5.1.4)) - tailwindcss: 3.4.13(ts-node@10.9.2(typescript@5.6.2)) + tailwindcss: 3.4.13(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2)) terser-webpack-plugin: 5.3.10(webpack@5.95.0(webpack-cli@5.1.4)) webpack: 5.95.0(webpack-cli@5.1.4) webpack-dev-server: 4.15.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)(webpack-cli@5.1.4)(webpack@5.95.0) @@ -24074,7 +24133,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tailwindcss@3.4.13(ts-node@10.9.2(typescript@5.6.2)): + tailwindcss@3.4.13(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -24093,7 +24152,7 @@ snapshots: postcss: 8.4.47 postcss-import: 15.1.0(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(typescript@5.6.2)) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@18.19.54)(typescript@5.6.2)) postcss-nested: 6.2.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -24807,11 +24866,11 @@ snapshots: dependencies: xml-name-validator: 3.0.0 - wagmi@1.4.13(@types/react@18.3.11)(bufferutil@4.0.8)(immer@10.0.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)): + wagmi@1.4.13(@types/react@18.3.11)(bufferutil@4.0.8)(immer@10.0.2)(react-dom@18.3.1(react@18.3.1))(react-native@0.75.4(@babel/core@7.25.7)(@babel/preset-env@7.25.7(@babel/core@7.25.7))(@types/react@18.3.11)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)): dependencies: '@tanstack/query-sync-storage-persister': 4.36.1 - '@tanstack/react-query': 4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/react-query-persist-client': 4.36.1(@tanstack/react-query@4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@tanstack/react-query': 4.36.1(react-dom@18.3.1(react@18.3.1))(react-native@0.75.4(@babel/core@7.25.7)(@babel/preset-env@7.25.7(@babel/core@7.25.7))(@types/react@18.3.11)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10))(react@18.3.1) + '@tanstack/react-query-persist-client': 4.36.1(@tanstack/react-query@4.36.1(react-dom@18.3.1(react@18.3.1))(react-native@0.75.4(@babel/core@7.25.7)(@babel/preset-env@7.25.7(@babel/core@7.25.7))(@types/react@18.3.11)(bufferutil@4.0.8)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10))(react@18.3.1)) '@wagmi/core': 1.4.13(@types/react@18.3.11)(bufferutil@4.0.8)(immer@10.0.2)(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.9.19(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)) abitype: 0.8.7(typescript@5.6.2) react: 18.3.1