From 3fbddf9e0261b73650747ec153f8b5d917c0ef03 Mon Sep 17 00:00:00 2001 From: Matthew Lilley Date: Wed, 10 Apr 2024 06:34:29 +0100 Subject: [PATCH] chore: compile --- .eslintrc | 16 - .github/ISSUE_TEMPLATE/bug_report.yml | 63 --- .github/dependabot.yml | 26 - .github/workflows/check-pr-title.yaml | 17 - .github/workflows/e2e.yaml | 48 -- .github/workflows/lint.yml | 61 --- .github/workflows/nodejs.yml | 145 ----- .husky/.gitignore | 1 - .husky/commit-msg | 5 - .husky/common.sh | 8 - .husky/pre-commit | 8 - .vscode/extensions.json | 8 - .vscode/launch.json | 47 -- .vscode/settings.json | 30 +- docs/CONTRIBUTION_GUIDELINES.md | 13 - docs/DATA_FETCHING.md | 3 - docs/DATA_SOURCES.md | 11 - docs/DESIGN.md | 0 docs/DEVELOPMENT.md | 3 - docs/INTRODUCTION.md | 1 - docs/ORACLES.md | 52 -- docs/PROJECT_STRUCTURE.md | 3 - jest.config.ts | 36 -- next.config.js | 42 +- package.json | 17 +- pnpm-lock.yaml | 228 ++++---- sentry.client.config.js | 15 - sentry.properties | 5 - sentry.server.config.js | 15 - src/bootstrap.ts | 18 +- .../trident/migrate/SelectPoolsAndConfirm.tsx | 2 +- src/hooks/useContract.ts | 2 +- test/e2e/addliquidity.test.ts | 500 ------------------ test/e2e/constants/Index.ts | 24 - test/e2e/enums/SwapType.ts | 5 - test/e2e/helpers/ApprovalHelper.ts | 28 - test/e2e/helpers/BentoHelper.ts | 34 -- test/e2e/helpers/TestHelper.ts | 97 ---- test/e2e/interfaces/ILiquidityInfo.ts | 7 - test/e2e/pages/App.ts | 27 - test/e2e/pages/AppPage.ts | 184 ------- test/e2e/pages/AppPageComponent.ts | 23 - .../pages/balances/AssetBalancesComponent.ts | 34 -- test/e2e/pages/balances/MyBentoBoxPage.ts | 20 - test/e2e/pages/balances/MyWalletPage.ts | 20 - test/e2e/pages/pools/AddLiquidityPage.ts | 193 ------- test/e2e/pages/pools/CreatePoolPage.ts | 145 ----- test/e2e/pages/pools/LiquidityPoolsPage.ts | 24 - test/e2e/pages/pools/PoolPage.ts | 62 --- test/e2e/pages/pools/RemoveLiquidityPage.ts | 132 ----- .../pages/shared/CurrencySelectComponent.ts | 22 - test/e2e/pages/swap/SwapPage.ts | 426 --------------- test/e2e/portfolio.test.ts | 76 --- test/e2e/removeLiquidity.test.ts | 103 ---- test/e2e/swap.test.ts | 430 --------------- test/e2e/tridentSwap.test.ts | 228 -------- 56 files changed, 140 insertions(+), 3653 deletions(-) delete mode 100644 .eslintrc delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml delete mode 100644 .github/dependabot.yml delete mode 100644 .github/workflows/check-pr-title.yaml delete mode 100644 .github/workflows/e2e.yaml delete mode 100644 .github/workflows/lint.yml delete mode 100644 .github/workflows/nodejs.yml delete mode 100644 .husky/.gitignore delete mode 100755 .husky/commit-msg delete mode 100755 .husky/common.sh delete mode 100755 .husky/pre-commit delete mode 100644 .vscode/extensions.json delete mode 100644 .vscode/launch.json delete mode 100644 docs/CONTRIBUTION_GUIDELINES.md delete mode 100644 docs/DATA_FETCHING.md delete mode 100644 docs/DATA_SOURCES.md delete mode 100644 docs/DESIGN.md delete mode 100644 docs/DEVELOPMENT.md delete mode 100644 docs/INTRODUCTION.md delete mode 100644 docs/ORACLES.md delete mode 100644 docs/PROJECT_STRUCTURE.md delete mode 100644 jest.config.ts delete mode 100644 sentry.client.config.js delete mode 100644 sentry.properties delete mode 100644 sentry.server.config.js delete mode 100644 test/e2e/addliquidity.test.ts delete mode 100644 test/e2e/constants/Index.ts delete mode 100644 test/e2e/enums/SwapType.ts delete mode 100644 test/e2e/helpers/ApprovalHelper.ts delete mode 100644 test/e2e/helpers/BentoHelper.ts delete mode 100644 test/e2e/helpers/TestHelper.ts delete mode 100644 test/e2e/interfaces/ILiquidityInfo.ts delete mode 100644 test/e2e/pages/App.ts delete mode 100644 test/e2e/pages/AppPage.ts delete mode 100644 test/e2e/pages/AppPageComponent.ts delete mode 100644 test/e2e/pages/balances/AssetBalancesComponent.ts delete mode 100644 test/e2e/pages/balances/MyBentoBoxPage.ts delete mode 100644 test/e2e/pages/balances/MyWalletPage.ts delete mode 100644 test/e2e/pages/pools/AddLiquidityPage.ts delete mode 100644 test/e2e/pages/pools/CreatePoolPage.ts delete mode 100644 test/e2e/pages/pools/LiquidityPoolsPage.ts delete mode 100644 test/e2e/pages/pools/PoolPage.ts delete mode 100644 test/e2e/pages/pools/RemoveLiquidityPage.ts delete mode 100644 test/e2e/pages/shared/CurrencySelectComponent.ts delete mode 100644 test/e2e/pages/swap/SwapPage.ts delete mode 100644 test/e2e/portfolio.test.ts delete mode 100644 test/e2e/removeLiquidity.test.ts delete mode 100644 test/e2e/swap.test.ts delete mode 100644 test/e2e/tridentSwap.test.ts diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 956e9e6282..0000000000 --- a/.eslintrc +++ /dev/null @@ -1,16 +0,0 @@ -{ - "extends": ["next", "next/core-web-vitals"], - "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint", "simple-import-sort", "unused-imports"], - "rules": { - "react/display-name": "off", - "react-hooks/exhaustive-deps": [ - "warn" - ], - "@typescript-eslint/no-unused-vars": "off", - "simple-import-sort/exports": "error", - "simple-import-sort/imports": "error", - "unused-imports/no-unused-imports": "error", - "unused-imports/no-unused-vars": "off" - } -} diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml deleted file mode 100644 index 628382a77b..0000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ /dev/null @@ -1,63 +0,0 @@ -name: Bug Report -description: File a bug/issue -title: '[bug] ' -body: - - type: markdown - attributes: - value: | - 🍣 Thanks for taking the time to fill out this bug report! The more info you provide, the more we can help you. - - type: checkboxes - attributes: - label: Is there an existing issue for this? - description: Please search to see if an issue already exists for the bug you encountered. - options: - - label: I have searched the existing issues - required: true - - - type: input - attributes: - label: 🖥 Browser Version - description: What Browser and version are you using? - placeholder: Chrome 99 - validations: - required: true - - - type: textarea - attributes: - label: 🚧 Current Behavior - description: A concise description of what you're experiencing. - validations: - required: false - - - type: textarea - attributes: - label: ✅ Expected Behavior - description: A concise description of what you expected to happen. - validations: - required: false - - - type: textarea - attributes: - label: 🛠 Steps To Reproduce - description: Steps or code snippets to reproduce the behavior. - validations: - required: false - - - type: input - attributes: - label: 🌐 Link to Minimal Reproducible Example or URL - description: | - This makes investigating issues and helping you out significantly easier! For most issues, you will likely get asked to provide one so why not add one now :) - placeholder: https://app.sushi.com/swap?inputCurrency=0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2&outputCurrency=0x6B3595068778DD592e39A122f4f5a5cF09C90fE2 - validations: - required: false - - - type: textarea - attributes: - label: Anything else? - description: | - Browser info? Screenshots? Anything that will give us more context about the issue you are encountering! - - 💡 Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. - validations: - required: false diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index c98490842d..0000000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,26 +0,0 @@ -version: 2 -updates: - - package-ecosystem: 'npm' - directory: '/' - schedule: - interval: 'daily' - commit-message: - # Prefix all commit messages with "npm" - prefix: 'token list' - include: 'scope' - labels: - - 'tokenlist' - # Add default Kodiak `merge.automerge_label` - #- 'automerge' - allow: - - dependency-name: '@sushiswap/bentobox-sdk' - - dependency-name: '@sushiswap/chainlink-whitelist' - - dependency-name: '@sushiswap/core' - - dependency-name: '@sushiswap/core-sdk' - - dependency-name: '@sushiswap/default-token-list' - - dependency-name: '@sushiswap/kashi-sdk' - - dependency-name: '@sushiswap/limit-order-pair-list' - - dependency-name: '@sushiswap/limit-order-sdk' - - dependency-name: '@sushiswap/tines' - - dependency-name: '@sushiswap/trident' - - dependency-name: '@sushiswap/trident-sdk' diff --git a/.github/workflows/check-pr-title.yaml b/.github/workflows/check-pr-title.yaml deleted file mode 100644 index b741f571ec..0000000000 --- a/.github/workflows/check-pr-title.yaml +++ /dev/null @@ -1,17 +0,0 @@ -name: "Check PR Title" - -on: - pull_request_target: - types: - - opened - - edited - - synchronize - -jobs: - check-pr-title: - name: Check PR Title - runs-on: ubuntu-latest - steps: - - uses: amannn/action-semantic-pull-request@v3.4.0 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml deleted file mode 100644 index 11b0fa96e4..0000000000 --- a/.github/workflows/e2e.yaml +++ /dev/null @@ -1,48 +0,0 @@ -name: E2E Tests - -on: - workflow_dispatch: - - schedule: - - cron: "30 1 * * *" - -jobs: - build: - name: Build - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Use Node.js 14 - uses: actions/setup-node@v2 - env: - PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: 'true' - with: - node-version: '14' - - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn config get cacheFolder)" - - - uses: actions/cache@v2 - id: yarn-cache - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - name: Installing dependencies - run: yarn install --frozen-lockfile - - - name: Run E2E tests - uses: mujo-code/puppeteer-headful@v2 - env: - CI: 'true' - TEST_PASS: ${{ secrets.TEST_PASS }} - TEST_SEED: ${{ secrets.TEST_SEED }} - TEST_SEED2: ${{ secrets.TEST_SEED2 }} - TEST_PKEY: ${{ secrets.TEST_PKEY }} - TEST_ACCOUNT2_PUB_KEY: ${{ secrets.TEST_ACCOUNT2_PUB_KEY }} - with: - args: yarn e2e diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index 3b327bb861..0000000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,61 +0,0 @@ -name: Lint - -on: - push: - branches: - - master - pull_request: - branches: - - master - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -jobs: - lint: - name: Node ${{ matrix.node-version }} on ${{ matrix.os }} - runs-on: ${{ matrix.os }} - - strategy: - fail-fast: false - matrix: - node-version: ['16.x'] - os: ['ubuntu-latest'] - - steps: - - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 - with: - node-version: ${{ matrix.node-version }} - - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - - uses: actions/cache@v3 - id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - name: Install project dependencies - run: yarn --prefer-offline - id: install - - - name: Run linters w/ autofix - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.owner.login == github.repository_owner }} - uses: wearerequired/lint-action@v2 - id: lint - with: - auto_fix: true - continue_on_error: true - commit_message: "style: code style issues with ${linter}" - github_token: ${{ secrets.GITHUB_TOKEN }} - eslint_extensions: "js,jsx,ts,tsx" - eslint: true - prettier_extensions: "js,jsx,ts,tsx" - - - name: Run eslint - if: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.owner.login != github.repository_owner }} - run: yarn eslint . \ No newline at end of file diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml deleted file mode 100644 index fbb84433e9..0000000000 --- a/.github/workflows/nodejs.yml +++ /dev/null @@ -1,145 +0,0 @@ -name: nodejs - -on: - pull_request: - push: - branches: - - master - workflow_dispatch: {} - -defaults: - run: - # change this if your nextjs app does not live at the root of the repo - working-directory: ./ -env: - COMMIT_SHA: ${{ github.event.pull_request.head.sha }} - PULL_NUMBER: ${{ github.event.pull_request.number }} - RUN_ID: ${{ github.run_id }} - FORCE_COLOR: 2 - NEXT_TELEMETRY_DISABLED: 1 - -jobs: - pipeline: - name: Node ${{ matrix.node-version }} on ${{ matrix.os }} - runs-on: ${{ matrix.os }} - - strategy: - fail-fast: false - matrix: - node-version: ['16.x'] - os: ['ubuntu-latest'] - - steps: - - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - - uses: actions/cache@v3 - id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - name: Restore next build - uses: actions/cache@v3 - id: restore-build-cache - env: - cache-name: cache-next-build - with: - # if you use a custom build directory, replace all instances of `.next` in this file with your build directory - # ex: if your app builds to `dist`, replace `.next` with `dist` - path: .next/cache - # change this if you prefer a more strict cache - key: ${{ runner.os }}-build-${{ env.cache-name }} - - - name: Install project dependencies - env: - NODE_OPTIONS: "--max-old-space-size=4096" - run: yarn --prefer-offline - id: install - - - name: Build next.js app - env: - NODE_OPTIONS: "--max-old-space-size=4096" - run: yarn run build - id: production - - # Here's the first place where next-bundle-analysis' own script is used - # This step pulls the raw bundle stats for the current bundle - - name: Analyze bundle - run: npx -p nextjs-bundle-analysis report - env: - NODE_OPTIONS: "--max-old-space-size=4096" - - - name: Upload bundle - uses: actions/upload-artifact@v2 - with: - name: bundle - path: .next/analyze/__bundle_analysis.json - - - name: Download base branch bundle stats - uses: dawidd6/action-download-artifact@v2 - if: success() && github.event.number - with: - workflow: nodejs.yml - branch: ${{ github.event.pull_request.base.ref }} - path: .next/analyze/base - - # And here's the second place - this runs after we have both the current and - # base branch bundle stats, and will compare them to determine what changed. - # There are two configurable arguments that come from package.json: - # - # - budget: optional, set a budget (bytes) against which size changes are measured - # it's set to 350kb here by default, as informed by the following piece: - # https://infrequently.org/2021/03/the-performance-inequality-gap/ - # - # - red-status-percentage: sets the percent size increase where you get a red - # status indicator, defaults to 20% - # - # Either of these arguments can be changed or removed by editing the `nextBundleAnalysis` - # entry in your package.json file. - - name: Compare with base branch bundle - if: success() && github.event.number - run: ls -laR .next/analyze/base && npx -p nextjs-bundle-analysis compare - env: - NODE_OPTIONS: "--max-old-space-size=4096" - - - name: Get comment body - id: get-comment-body - if: success() && github.event.number - run: | - body=$(cat .next/analyze/__bundle_analysis_comment.txt) - body="${body//'%'/'%25'}" - body="${body//$'\n'/'%0A'}" - body="${body//$'\r'/'%0D'}" - echo ::set-output name=body::$body - - name: Find Comment - uses: peter-evans/find-comment@v1 - if: success() && github.event.number - id: fc - with: - issue-number: ${{ github.event.number }} - body-includes: '<!-- __NEXTJS_BUNDLE -->' - - - name: Create Comment - uses: peter-evans/create-or-update-comment@v1.4.4 - if: success() && github.event.number && steps.fc.outputs.comment-id == 0 - with: - issue-number: ${{ github.event.number }} - body: ${{ steps.get-comment-body.outputs.body }} - - - name: Update Comment - uses: peter-evans/create-or-update-comment@v1.4.4 - if: success() && github.event.number && steps.fc.outputs.comment-id != 0 - with: - issue-number: ${{ github.event.number }} - body: ${{ steps.get-comment-body.outputs.body }} - comment-id: ${{ steps.fc.outputs.comment-id }} - edit-mode: replace diff --git a/.husky/.gitignore b/.husky/.gitignore deleted file mode 100644 index 31354ec138..0000000000 --- a/.husky/.gitignore +++ /dev/null @@ -1 +0,0 @@ -_ diff --git a/.husky/commit-msg b/.husky/commit-msg deleted file mode 100755 index 8c4333a34f..0000000000 --- a/.husky/commit-msg +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" -. "$(dirname "$0")/common.sh" - -yarn commitlint --edit $1 \ No newline at end of file diff --git a/.husky/common.sh b/.husky/common.sh deleted file mode 100755 index 0f4ced8207..0000000000 --- a/.husky/common.sh +++ /dev/null @@ -1,8 +0,0 @@ -command_exists () { - command -v "$1" >/dev/null 2>&1 -} - -# Workaround for Windows 10, Git Bash and Yarn -if command_exists winpty && test -t 1; then - exec < /dev/tty -fi \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit deleted file mode 100755 index 9aa4c15c49..0000000000 --- a/.husky/pre-commit +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" -. "$(dirname "$0")/common.sh" - -yarn lint -yarn lint-staged -yarn lingui -# yarn test diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index b7be864712..0000000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "recommendations": [ - "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode", - "heybourn.headwind", - "bradlc.vscode-tailwindcss" - ] -} diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 57131d66a4..0000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Next.js: debug server-side", - "type": "node-terminal", - "request": "launch", - "command": "npm run dev" - }, - { - "name": "Next.js: debug client-side", - "type": "pwa-chrome", - "request": "launch", - "url": "http://localhost:3000" - }, - { - "name": "Next.js: debug full stack", - "type": "node-terminal", - "request": "launch", - "command": "npm run dev", - "console": "integratedTerminal", - "serverReadyAction": { - "pattern": "started server on .+, url: (https?://.+)", - "uriFormat": "%s", - "action": "debugWithChrome" - } - }, - { - "name": "Jest: Debug Tests", - "type": "node", - "request": "launch", - "runtimeArgs": [ - "--inspect-brk", - "${workspaceRoot}/node_modules/jest/bin/jest.js", - "--runInBand" - ], - "args": ["--testPathPattern", "${fileBasename}"], - "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen", - "port": 9229, - "skipFiles": [ - "<node_internals>/**/*.js", - "${workspaceRoot}/node_modules/**/*.js" - ], - } - ] -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 7be8a36d4a..f8fee6969b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,27 +1,5 @@ { - "eslint.enable": true, - "eslint.validate": [ - "javascript", - "javascriptreact", - "typescript", - "typescriptreact" - ], - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnPaste": false, - "editor.formatOnSave": false, - "[javascript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnSave": true - }, - "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnSave": true, - }, - "[typescriptreact]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnSave": true - }, - "yaml.schemas": { - "https://www.artillery.io/schema.json": [] - } -} + "yaml.schemas": { + "https://www.artillery.io/schema.json": [] + } +} \ No newline at end of file diff --git a/docs/CONTRIBUTION_GUIDELINES.md b/docs/CONTRIBUTION_GUIDELINES.md deleted file mode 100644 index 4b08dfd063..0000000000 --- a/docs/CONTRIBUTION_GUIDELINES.md +++ /dev/null @@ -1,13 +0,0 @@ -# Contribution guidelines - -## Pages - -Pages should be heavy, at least initially, try not to extract anything prematurely. - -## Components - -Components should be generic and reusable. - -## Features - -Features should be unique and specific. \ No newline at end of file diff --git a/docs/DATA_FETCHING.md b/docs/DATA_FETCHING.md deleted file mode 100644 index 310a18bca4..0000000000 --- a/docs/DATA_FETCHING.md +++ /dev/null @@ -1,3 +0,0 @@ -# Data Fetching - -https://swr.vercel.app/ \ No newline at end of file diff --git a/docs/DATA_SOURCES.md b/docs/DATA_SOURCES.md deleted file mode 100644 index 9dfbb59e41..0000000000 --- a/docs/DATA_SOURCES.md +++ /dev/null @@ -1,11 +0,0 @@ -# Data sources - -- Graph -- Covalent -- Web3 -- Next big thing... - -## Adding new data sources - -1. Add folder to fetchers with the name of the data source and define fetchers. -2. Add folder to services with the name of the data source and define hooks. \ No newline at end of file diff --git a/docs/DESIGN.md b/docs/DESIGN.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md deleted file mode 100644 index 23b8496d60..0000000000 --- a/docs/DEVELOPMENT.md +++ /dev/null @@ -1,3 +0,0 @@ -# Development - -... diff --git a/docs/INTRODUCTION.md b/docs/INTRODUCTION.md deleted file mode 100644 index f6ecaa676c..0000000000 --- a/docs/INTRODUCTION.md +++ /dev/null @@ -1 +0,0 @@ -# Introduction \ No newline at end of file diff --git a/docs/ORACLES.md b/docs/ORACLES.md deleted file mode 100644 index 1f55059cd4..0000000000 --- a/docs/ORACLES.md +++ /dev/null @@ -1,52 +0,0 @@ -# Oracles - -Currently there is two types of oracles which the sushi interface supports, Chainlink & SushiSwap TWAP. - -## Chainlink - -- Requires a mapping entry added (src/constants/chainlink/mapping.ts). -- Requires one exchange rate update to start. - -## Adding Chainlink Oracles - -Chainlink price feeds... - -https://docs.chain.link/docs/ethereum-addresses/ - -https://docs.chain.link/docs/binance-smart-chain-addresses/ - -https://docs.chain.link/docs/matic-addresses/ - -https://docs.chain.link/docs/xdai-price-feeds/ - -https://docs.chain.link/docs/huobi-eco-chain-price-feeds/ - -https://docs.chain.link/docs/avalanche-price-feeds/ - -Each price feed has a pair token0/token1, SUSHI/ETH or SUSHI/USD for example, decimals, and proxy. We use this information to construct mappings of the price feed to their respectful pair tokens. - -Chainlink tokens can be found in src/constants/chainlink/mappings, they are separated by network. - -Any token which is not currently in the Chainlink tokens needs to be added, with the exception of USD, and non-crypto, these should not be added to the Chainlink tokens. - -If a newly added token is not in the @sushiswap/default-token-list, it should be added. - -Chainlink mappings can be found in src/constants/chainlink/mappings, they are separated by network. - -Any price feed which is not currently in the Chainlink mappings need to be added. - -Each mapping is keyed by the price feed proxy address, and contains and object with these properties - -- from (token0 address) -- to (token1 address) -- decimals (price feed decimals) -- fromDecimals (token0 decimals) -- toDecimals (token1 decimals) - -Tip: USD address is 0x0000000000000000000000000000000000000001 and decimals 8 - -<!-- ## SushiSwap TWAP - -- Requires two exchange rate updates to start. -- On creation both current & oracle exchange rate will be set to zero. -- After first update both will still be zero, after the second both would be non-zero if a liquid pool is backing the oracle. --> diff --git a/docs/PROJECT_STRUCTURE.md b/docs/PROJECT_STRUCTURE.md deleted file mode 100644 index ca2b01726f..0000000000 --- a/docs/PROJECT_STRUCTURE.md +++ /dev/null @@ -1,3 +0,0 @@ -# Project structure - - diff --git a/jest.config.ts b/jest.config.ts deleted file mode 100644 index 1640be28ec..0000000000 --- a/jest.config.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { Config } from '@jest/types' - -const config: Config.InitialOptions = { - verbose: true, - collectCoverageFrom: ['**/*.{ts,tsx}', '!**/*.d.ts', '!**/node_modules/**'], - coveragePathIgnorePatterns: ['<rootDir>/node_modules/', '<rootDir>/.next/'], - moduleNameMapper: { - '^app/(.*)$': '<rootDir>/src/$1', - '^functions/(.*)$': '<rootDir>/src/functions/$1', - '^config/(.*)$': '<rootDir>/src/config/$1', - '^features/(.*)$': '<rootDir>/src/features/$1', - '^enums/(.*)$': '<rootDir>/src/enums/$1', - '^enums': '<rootDir>/src/enums', - /* Handle CSS imports (with CSS modules) - https://jestjs.io/docs/webpack#mocking-css-modules */ - '^.+\\.module\\.(css|sass|scss)$': 'identity-obj-proxy', - - // Handle CSS imports (without CSS modules) - '^.+\\.(css|sass|scss)$': '<rootDir>/__mocks__/styleMock.js', - - /* Handle image imports - https://jestjs.io/docs/webpack#handling-static-assets */ - '^.+\\.(jpg|jpeg|png|gif|webp|svg)$': '<rootDir>/__mocks__/fileMock.js', - }, - testPathIgnorePatterns: ['<rootDir>/node_modules/', '<rootDir>/.next/', '<rootDir>/src/pages/api/test.ts'], - testEnvironment: '<rootDir>/test/unit/custom-test-env.ts', - transform: { - /* Use babel-jest to transpile tests with the next/babel preset - https://jestjs.io/docs/configuration#transform-objectstring-pathtotransformer--pathtotransformer-object */ - '^.+\\.(js|jsx|ts|tsx)$': ['babel-jest', { presets: ['next/babel'] }], - }, - transformIgnorePatterns: ['/node_modules/', '^.+\\.module\\.(css|sass|scss)$'], - testTimeout: 600000, -} - -export default config diff --git a/next.config.js b/next.config.js index 85a8269fd3..43c3459373 100644 --- a/next.config.js +++ b/next.config.js @@ -1,26 +1,12 @@ -const withPWA = require('next-pwa') -const runtimeCaching = require('next-pwa/cache') const linguiConfig = require('./lingui.config.js') const defaultTheme = require('tailwindcss/defaultTheme') - -const { ChainId } = require('@sushiswap/core-sdk') - const { locales, sourceLocale } = linguiConfig const { screens } = defaultTheme const withBundleAnalyzer = require('@next/bundle-analyzer')({ enabled: process.env.ANALYZE === 'true', }) - -// This file sets a custom webpack configuration to use your Next.js app -// with Sentry. -// https://nextjs.org/docs/api-reference/next.config.js/introduction -// https://docs.sentry.io/platforms/javascript/guides/nextjs/ - -const { withSentryConfig } = require('@sentry/nextjs') - // @ts-check - /** * @type {import('next').NextConfig} **/ @@ -43,6 +29,12 @@ const nextConfig = { productionBrowserSourceMaps: false, swcMinify: false, reactStrictMode: true, + typescript: { + ignoreBuildErrors: true, + }, + eslint: { + ignoreDuringBuilds: true, + }, // pwa: { // dest: 'public', // runtimeCaching, @@ -166,27 +158,7 @@ const nextConfig = { // serverRuntimeConfig: {}, publicRuntimeConfig: { breakpoints: screens, - - [ChainId.ETHEREUM]: { - features: [], - }, }, } -const SentryWebpackPluginOptions = { - // Additional config options for the Sentry Webpack plugin. Keep in mind that - // the following options are set automatically, and overriding them is not - // recommended: - // release, url, org, project, authToken, configFile, stripPrefix, - // urlPrefix, include, ignore - // silent: true, // Suppresses all logs - // For all available options, see: - // https://github.com/getsentry/sentry-webpack-plugin#options. -} - -// Make sure adding Sentry options is the last code to run before exporting, to -// ensure that your source maps include changes from all other Webpack plugins -module.exports = withBundleAnalyzer(nextConfig) - -// Don't delete this console log, useful to see the config in Vercel deployments -// console.log('next.config.js', JSON.stringify(module.exports, null, 2)) +module.exports = withBundleAnalyzer(nextConfig) \ No newline at end of file diff --git a/package.json b/package.json index 098999d0b8..7d086eca5d 100644 --- a/package.json +++ b/package.json @@ -4,14 +4,14 @@ "private": true, "scripts": { "analyze": "ANALYZE=true yarn build && serve .next -n", - "build": "yarn lingui && next build", + "build": "pnpm run lingui && next build", "circular": "madge --circular src --extensions ts,tsx,js,jsx", "dev": "cross-env NODE_OPTIONS='--inspect' next dev", "e2e": "concurrently -k -s first -n \"app,e2e\" \"yarn dev\" \"yarn e2e:safe\"", - "e2e:run": "yarn jest --testPathPattern=test/e2e --runInBand", + "e2e:run": "pnpm run jest --testPathPattern=test/e2e --runInBand", "e2e:safe": "wait-on -l http://localhost:3000 && yarn e2e:run", "inspect": "NODE_OPTIONS='--inspect' next dev", - "postinstall": "yarn lingui", + "postinstall": "pnpm run lingui", "lingui": "lingui extract --clean --overwrite && lingui compile", "lint": "npx next lint --fix", "ngrok": "ngrok http 3000", @@ -116,7 +116,8 @@ "@types/ms.macro": "^2.0.0", "@types/node": "^16.11.0", "@types/qs": "^6.9.7", - "@types/react": "^17.0.2", + "@types/react": "17.0.2", + "@types/react-dom": "17.0.2", "@types/react-slider": "^1.3.1", "@types/react-table": "^7.7.9", "@types/ua-parser-js": "^0.7.36", @@ -127,8 +128,10 @@ "@uniswap/token-lists": "1.0.0-beta.27", "@visx/axis": "^2.1.0", "@visx/brush": "^2.1.0", + "@visx/event": "^2.1.0", "@visx/gradient": "^2.1.0", "@visx/grid": "^2.1.0", + "@visx/group": "^2.1.0", "@visx/legend": "^2.1.0", "@visx/marker": "^2.1.0", "@visx/pattern": "^2.1.0", @@ -179,7 +182,7 @@ "madge": "^5.0.1", "millify": "^4.0.0", "ms.macro": "^2.0.0", - "next": "^12.3.1", + "next": "12.3.1", "next-pwa": "5.4.7", "next-seo": "^5.1.0", "next-unused": "^0.0.6", @@ -193,9 +196,9 @@ "prettier": "^2.4.0", "puppeteer": "^11.0.0", "qs": "^6.10.1", - "react": "^17.0.2", + "react": "17.0.2", "react-device-detect": "^2.1.2", - "react-dom": "^17.0.2", + "react-dom": "17.0.2", "react-dropzone": "^12.0.4", "react-feather": "^2.0.9", "react-hook-form": "7.29.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fa4929632e..88fe97f9d7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -136,7 +136,7 @@ devDependencies: version: 1.9.7(react-redux@7.2.9)(react@17.0.2) '@sentry/nextjs': specifier: ^7.0.0 - version: 7.109.0(encoding@0.1.13)(next@12.3.4)(react@17.0.2)(webpack@5.91.0) + version: 7.109.0(encoding@0.1.13)(next@12.3.1)(react@17.0.2)(webpack@5.91.0) '@sentry/react': specifier: ^7.0.0 version: 7.109.0(react@17.0.2) @@ -207,8 +207,11 @@ devDependencies: specifier: ^6.9.7 version: 6.9.14 '@types/react': - specifier: ^17.0.2 - version: 17.0.80 + specifier: 17.0.2 + version: 17.0.2 + '@types/react-dom': + specifier: 17.0.2 + version: 17.0.2 '@types/react-slider': specifier: ^1.3.1 version: 1.3.6 @@ -239,12 +242,18 @@ devDependencies: '@visx/brush': specifier: ^2.1.0 version: 2.18.0(react@17.0.2) + '@visx/event': + specifier: ^2.1.0 + version: 2.17.0 '@visx/gradient': specifier: ^2.1.0 version: 2.17.0(react@17.0.2) '@visx/grid': specifier: ^2.1.0 version: 2.18.0(react@17.0.2) + '@visx/group': + specifier: ^2.1.0 + version: 2.17.0(react@17.0.2) '@visx/legend': specifier: ^2.1.0 version: 2.18.0(react@17.0.2) @@ -271,19 +280,19 @@ devDependencies: version: 1.0.3 '@web3-react/core': specifier: ^8.0.23-beta.0 - version: 8.2.3(@types/react@17.0.80)(bufferutil@4.0.8)(react@17.0.2)(utf-8-validate@5.0.10) + version: 8.2.3(@types/react@17.0.2)(bufferutil@4.0.8)(react@17.0.2)(utf-8-validate@5.0.10) '@web3-react/eip1193': specifier: ^8.0.18-beta.0 - version: 8.2.3(@types/react@17.0.80)(react@17.0.2) + version: 8.2.3(@types/react@17.0.2)(react@17.0.2) '@web3-react/empty': specifier: ^8.0.12-beta.0 - version: 8.2.3(@types/react@17.0.80)(react@17.0.2) + version: 8.2.3(@types/react@17.0.2)(react@17.0.2) '@web3-react/types': specifier: ^8.0.12-beta.0 - version: 8.2.3(@types/react@17.0.80)(react@17.0.2) + version: 8.2.3(@types/react@17.0.2)(react@17.0.2) '@web3-react/url': specifier: ^8.0.17-beta.0 - version: 8.2.3(@types/react@17.0.80)(bufferutil@4.0.8)(react@17.0.2)(utf-8-validate@5.0.10) + version: 8.2.3(@types/react@17.0.2)(bufferutil@4.0.8)(react@17.0.2)(utf-8-validate@5.0.10) '@welldone-software/why-did-you-render': specifier: ^6.2.3 version: 6.2.3(react@17.0.2) @@ -325,7 +334,7 @@ devDependencies: version: 7.32.0 eslint-config-next: specifier: ^11.1.0 - version: 11.1.4(eslint@7.32.0)(next@12.3.4)(typescript@4.9.5) + version: 11.1.4(eslint@7.32.0)(next@12.3.1)(typescript@4.9.5) eslint-plugin-simple-import-sort: specifier: ^7.0.0 version: 7.0.0(eslint@7.32.0) @@ -396,14 +405,14 @@ devDependencies: specifier: ^2.0.0 version: 2.0.0 next: - specifier: ^12.3.1 - version: 12.3.4(@babel/core@7.24.4)(babel-plugin-macros@3.1.0)(react-dom@17.0.2)(react@17.0.2) + specifier: 12.3.1 + version: 12.3.1(@babel/core@7.24.4)(babel-plugin-macros@3.1.0)(react-dom@17.0.2)(react@17.0.2) next-pwa: specifier: 5.4.7 - version: 5.4.7(@babel/core@7.24.4)(next@12.3.4)(webpack@5.91.0) + version: 5.4.7(@babel/core@7.24.4)(next@12.3.1)(webpack@5.91.0) next-seo: specifier: ^5.1.0 - version: 5.15.0(next@12.3.4)(react-dom@17.0.2)(react@17.0.2) + version: 5.15.0(next@12.3.1)(react-dom@17.0.2)(react@17.0.2) next-unused: specifier: ^0.0.6 version: 0.0.6 @@ -438,13 +447,13 @@ devDependencies: specifier: ^6.10.1 version: 6.12.0 react: - specifier: ^17.0.2 + specifier: 17.0.2 version: 17.0.2 react-device-detect: specifier: ^2.1.2 version: 2.2.3(react-dom@17.0.2)(react@17.0.2) react-dom: - specifier: ^17.0.2 + specifier: 17.0.2 version: 17.0.2(react@17.0.2) react-dropzone: specifier: ^12.0.4 @@ -2718,7 +2727,7 @@ packages: '@gnosis.pm/safe-apps-provider': 0.9.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) '@gnosis.pm/safe-apps-sdk': 6.2.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) '@web3-react/abstract-connector': 6.0.7 - '@web3-react/core': 8.2.3(@types/react@17.0.80)(bufferutil@4.0.8)(react@17.0.2)(utf-8-validate@5.0.10) + '@web3-react/core': 8.2.3(@types/react@17.0.2)(bufferutil@4.0.8)(react@17.0.2)(utf-8-validate@5.0.10) react: 17.0.2 transitivePeerDependencies: - bufferutil @@ -3392,8 +3401,8 @@ packages: - utf-8-validate dev: true - /@next/env@12.3.4: - resolution: {integrity: sha512-H/69Lc5Q02dq3o+dxxy5O/oNxFsZpdL6WREtOOtOM1B/weonIwDXkekr1KV5DPVPr12IHFPrMrcJQ6bgPMfn7A==} + /@next/env@12.3.1: + resolution: {integrity: sha512-9P9THmRFVKGKt9DYqeC2aKIxm8rlvkK38V1P1sRE7qyoPBIs8l9oo79QoSdPtOWfzkbDAVUqvbQGgTMsb8BtJg==} dev: true /@next/eslint-plugin-next@11.1.4: @@ -3402,8 +3411,8 @@ packages: glob: 7.1.7 dev: true - /@next/swc-android-arm-eabi@12.3.4: - resolution: {integrity: sha512-cM42Cw6V4Bz/2+j/xIzO8nK/Q3Ly+VSlZJTa1vHzsocJRYz8KT6MrreXaci2++SIZCF1rVRCDgAg5PpqRibdIA==} + /@next/swc-android-arm-eabi@12.3.1: + resolution: {integrity: sha512-i+BvKA8tB//srVPPQxIQN5lvfROcfv4OB23/L1nXznP+N/TyKL8lql3l7oo2LNhnH66zWhfoemg3Q4VJZSruzQ==} engines: {node: '>= 10'} cpu: [arm] os: [android] @@ -3411,8 +3420,8 @@ packages: dev: true optional: true - /@next/swc-android-arm64@12.3.4: - resolution: {integrity: sha512-5jf0dTBjL+rabWjGj3eghpLUxCukRhBcEJgwLedewEA/LJk2HyqCvGIwj5rH+iwmq1llCWbOky2dO3pVljrapg==} + /@next/swc-android-arm64@12.3.1: + resolution: {integrity: sha512-CmgU2ZNyBP0rkugOOqLnjl3+eRpXBzB/I2sjwcGZ7/Z6RcUJXK5Evz+N0ucOxqE4cZ3gkTeXtSzRrMK2mGYV8Q==} engines: {node: '>= 10'} cpu: [arm64] os: [android] @@ -3420,8 +3429,8 @@ packages: dev: true optional: true - /@next/swc-darwin-arm64@12.3.4: - resolution: {integrity: sha512-DqsSTd3FRjQUR6ao0E1e2OlOcrF5br+uegcEGPVonKYJpcr0MJrtYmPxd4v5T6UCJZ+XzydF7eQo5wdGvSZAyA==} + /@next/swc-darwin-arm64@12.3.1: + resolution: {integrity: sha512-hT/EBGNcu0ITiuWDYU9ur57Oa4LybD5DOQp4f22T6zLfpoBMfBibPtR8XktXmOyFHrL/6FC2p9ojdLZhWhvBHg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -3429,8 +3438,8 @@ packages: dev: true optional: true - /@next/swc-darwin-x64@12.3.4: - resolution: {integrity: sha512-PPF7tbWD4k0dJ2EcUSnOsaOJ5rhT3rlEt/3LhZUGiYNL8KvoqczFrETlUx0cUYaXe11dRA3F80Hpt727QIwByQ==} + /@next/swc-darwin-x64@12.3.1: + resolution: {integrity: sha512-9S6EVueCVCyGf2vuiLiGEHZCJcPAxglyckTZcEwLdJwozLqN0gtS0Eq0bQlGS3dH49Py/rQYpZ3KVWZ9BUf/WA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -3438,8 +3447,8 @@ packages: dev: true optional: true - /@next/swc-freebsd-x64@12.3.4: - resolution: {integrity: sha512-KM9JXRXi/U2PUM928z7l4tnfQ9u8bTco/jb939pdFUHqc28V43Ohd31MmZD1QzEK4aFlMRaIBQOWQZh4D/E5lQ==} + /@next/swc-freebsd-x64@12.3.1: + resolution: {integrity: sha512-qcuUQkaBZWqzM0F1N4AkAh88lLzzpfE6ImOcI1P6YeyJSsBmpBIV8o70zV+Wxpc26yV9vpzb+e5gCyxNjKJg5Q==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] @@ -3447,8 +3456,8 @@ packages: dev: true optional: true - /@next/swc-linux-arm-gnueabihf@12.3.4: - resolution: {integrity: sha512-3zqD3pO+z5CZyxtKDTnOJ2XgFFRUBciOox6EWkoZvJfc9zcidNAQxuwonUeNts6Xbm8Wtm5YGIRC0x+12YH7kw==} + /@next/swc-linux-arm-gnueabihf@12.3.1: + resolution: {integrity: sha512-diL9MSYrEI5nY2wc/h/DBewEDUzr/DqBjIgHJ3RUNtETAOB3spMNHvJk2XKUDjnQuluLmFMloet9tpEqU2TT9w==} engines: {node: '>= 10'} cpu: [arm] os: [linux] @@ -3456,8 +3465,8 @@ packages: dev: true optional: true - /@next/swc-linux-arm64-gnu@12.3.4: - resolution: {integrity: sha512-kiX0vgJGMZVv+oo1QuObaYulXNvdH/IINmvdZnVzMO/jic/B8EEIGlZ8Bgvw8LCjH3zNVPO3mGrdMvnEEPEhKA==} + /@next/swc-linux-arm64-gnu@12.3.1: + resolution: {integrity: sha512-o/xB2nztoaC7jnXU3Q36vGgOolJpsGG8ETNjxM1VAPxRwM7FyGCPHOMk1XavG88QZSQf+1r+POBW0tLxQOJ9DQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -3465,8 +3474,8 @@ packages: dev: true optional: true - /@next/swc-linux-arm64-musl@12.3.4: - resolution: {integrity: sha512-EETZPa1juczrKLWk5okoW2hv7D7WvonU+Cf2CgsSoxgsYbUCZ1voOpL4JZTOb6IbKMDo6ja+SbY0vzXZBUMvkQ==} + /@next/swc-linux-arm64-musl@12.3.1: + resolution: {integrity: sha512-2WEasRxJzgAmP43glFNhADpe8zB7kJofhEAVNbDJZANp+H4+wq+/cW1CdDi8DqjkShPEA6/ejJw+xnEyDID2jg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -3474,8 +3483,8 @@ packages: dev: true optional: true - /@next/swc-linux-x64-gnu@12.3.4: - resolution: {integrity: sha512-4csPbRbfZbuWOk3ATyWcvVFdD9/Rsdq5YHKvRuEni68OCLkfy4f+4I9OBpyK1SKJ00Cih16NJbHE+k+ljPPpag==} + /@next/swc-linux-x64-gnu@12.3.1: + resolution: {integrity: sha512-JWEaMyvNrXuM3dyy9Pp5cFPuSSvG82+yABqsWugjWlvfmnlnx9HOQZY23bFq3cNghy5V/t0iPb6cffzRWylgsA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -3483,8 +3492,8 @@ packages: dev: true optional: true - /@next/swc-linux-x64-musl@12.3.4: - resolution: {integrity: sha512-YeBmI+63Ro75SUiL/QXEVXQ19T++58aI/IINOyhpsRL1LKdyfK/35iilraZEFz9bLQrwy1LYAR5lK200A9Gjbg==} + /@next/swc-linux-x64-musl@12.3.1: + resolution: {integrity: sha512-xoEWQQ71waWc4BZcOjmatuvPUXKTv6MbIFzpm4LFeCHsg2iwai0ILmNXf81rJR+L1Wb9ifEke2sQpZSPNz1Iyg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -3492,8 +3501,8 @@ packages: dev: true optional: true - /@next/swc-win32-arm64-msvc@12.3.4: - resolution: {integrity: sha512-Sd0qFUJv8Tj0PukAYbCCDbmXcMkbIuhnTeHm9m4ZGjCf6kt7E/RMs55Pd3R5ePjOkN7dJEuxYBehawTR/aPDSQ==} + /@next/swc-win32-arm64-msvc@12.3.1: + resolution: {integrity: sha512-hswVFYQYIeGHE2JYaBVtvqmBQ1CppplQbZJS/JgrVI3x2CurNhEkmds/yqvDONfwfbttTtH4+q9Dzf/WVl3Opw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -3501,8 +3510,8 @@ packages: dev: true optional: true - /@next/swc-win32-ia32-msvc@12.3.4: - resolution: {integrity: sha512-rt/vv/vg/ZGGkrkKcuJ0LyliRdbskQU+91bje+PgoYmxTZf/tYs6IfbmgudBJk6gH3QnjHWbkphDdRQrseRefQ==} + /@next/swc-win32-ia32-msvc@12.3.1: + resolution: {integrity: sha512-Kny5JBehkTbKPmqulr5i+iKntO5YMP+bVM8Hf8UAmjSMVo3wehyLVc9IZkNmcbxi+vwETnQvJaT5ynYBkJ9dWA==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -3510,8 +3519,8 @@ packages: dev: true optional: true - /@next/swc-win32-x64-msvc@12.3.4: - resolution: {integrity: sha512-DQ20JEfTBZAgF8QCjYfJhv2/279M6onxFjdG/+5B0Cyj00/EdBxiWb2eGGFgQhrBbNv/lsvzFbbi0Ptf8Vw/bg==} + /@next/swc-win32-x64-msvc@12.3.1: + resolution: {integrity: sha512-W1ijvzzg+kPEX6LAc+50EYYSEo0FVu7dmTE+t+DM4iOLqgGHoW9uYSz9wCVdkXOEEMP9xhXfGpcSxsfDucyPkA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -3808,7 +3817,7 @@ packages: localforage: 1.10.0 dev: true - /@sentry/nextjs@7.109.0(encoding@0.1.13)(next@12.3.4)(react@17.0.2)(webpack@5.91.0): + /@sentry/nextjs@7.109.0(encoding@0.1.13)(next@12.3.1)(react@17.0.2)(webpack@5.91.0): resolution: {integrity: sha512-AT0jhMDj7N57z8+XfgEyTJBogpU64z4mQpfOsSF5uuequzo3IlVVoJcu88jdqUkaVFxBJp3aF2T4nz65OHLoeA==} engines: {node: '>=8'} peerDependencies: @@ -3829,7 +3838,7 @@ packages: '@sentry/vercel-edge': 7.109.0 '@sentry/webpack-plugin': 1.21.0(encoding@0.1.13) chalk: 3.0.0 - next: 12.3.4(@babel/core@7.24.4)(babel-plugin-macros@3.1.0)(react-dom@17.0.2)(react@17.0.2) + next: 12.3.1(@babel/core@7.24.4)(babel-plugin-macros@3.1.0)(react-dom@17.0.2)(react@17.0.2) react: 17.0.2 resolve: 1.22.8 rollup: 2.78.0 @@ -4150,7 +4159,7 @@ packages: dependencies: '@babel/runtime': 7.24.4 '@testing-library/dom': 8.20.1 - '@types/react-dom': 17.0.25 + '@types/react-dom': 17.0.2 react: 17.0.2 react-dom: 17.0.2(react@17.0.2) dev: true @@ -4326,7 +4335,7 @@ packages: /@types/hoist-non-react-statics@3.3.5: resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} dependencies: - '@types/react': 17.0.80 + '@types/react': 17.0.2 hoist-non-react-statics: 3.3.2 dev: true @@ -4450,20 +4459,20 @@ packages: /@types/react-blockies@1.4.4: resolution: {integrity: sha512-7QfFeT1y/izwP/Wxmnl9Ii73udFQIBsfI/IvG+841sPxqc7Pf79ZDZP3XQsmYzAjDXdoZXquLgI/Q/tmAZwB0w==} dependencies: - '@types/react': 17.0.80 + '@types/react': 17.0.2 dev: true - /@types/react-dom@17.0.25: - resolution: {integrity: sha512-urx7A7UxkZQmThYA4So0NelOVjx3V4rNFVJwp0WZlbIK5eM4rNJDiN3R/E9ix0MBh6kAEojk/9YL+Te6D9zHNA==} + /@types/react-dom@17.0.2: + resolution: {integrity: sha512-Icd9KEgdnFfJs39KyRyr0jQ7EKhq8U6CcHRMGAS45fp5qgUvxL3ujUCfWFttUK2UErqZNj97t9gsVPNAqcwoCg==} dependencies: - '@types/react': 17.0.80 + '@types/react': 17.0.2 dev: true /@types/react-redux@7.1.33: resolution: {integrity: sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==} dependencies: '@types/hoist-non-react-statics': 3.3.5 - '@types/react': 17.0.80 + '@types/react': 17.0.2 hoist-non-react-statics: 3.3.2 redux: 4.2.1 dev: true @@ -4471,20 +4480,19 @@ packages: /@types/react-slider@1.3.6: resolution: {integrity: sha512-RS8XN5O159YQ6tu3tGZIQz1/9StMLTg/FCIPxwqh2gwVixJnlfIodtVx+fpXVMZHe7A58lAX1Q4XTgAGOQaCQg==} dependencies: - '@types/react': 17.0.80 + '@types/react': 17.0.2 dev: true /@types/react-table@7.7.20: resolution: {integrity: sha512-ahMp4pmjVlnExxNwxyaDrFgmKxSbPwU23sGQw2gJK4EhCvnvmib2s/O/+y1dfV57dXOwpr2plfyBol+vEHbi2w==} dependencies: - '@types/react': 17.0.80 + '@types/react': 17.0.2 dev: true - /@types/react@17.0.80: - resolution: {integrity: sha512-LrgHIu2lEtIo8M7d1FcI3BdwXWoRQwMoXOZ7+dPTW0lYREjmlHl3P0U1VD0i/9tppOuv8/sam7sOjx34TxSFbA==} + /@types/react@17.0.2: + resolution: {integrity: sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA==} dependencies: '@types/prop-types': 15.7.12 - '@types/scheduler': 0.16.8 csstype: 3.1.3 dev: true @@ -4500,10 +4508,6 @@ packages: '@types/node': 16.18.96 dev: true - /@types/scheduler@0.16.8: - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} - dev: true - /@types/secp256k1@4.0.6: resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} dependencies: @@ -4808,7 +4812,7 @@ packages: peerDependencies: react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 dependencies: - '@types/react': 17.0.80 + '@types/react': 17.0.2 '@visx/group': 2.17.0(react@17.0.2) '@visx/point': 2.17.0 '@visx/scale': 2.18.0 @@ -4846,7 +4850,7 @@ packages: peerDependencies: react: ^16.8.0-0 || ^17.0.0-0 || ^18.0.0-0 dependencies: - '@types/react': 17.0.80 + '@types/react': 17.0.2 '@visx/event': 2.17.0 '@visx/point': 2.17.0 prop-types: 15.8.1 @@ -4856,7 +4860,7 @@ packages: /@visx/event@2.17.0: resolution: {integrity: sha512-fg2UWo89RgKgWWnnqI+i7EF8Ry+3CdMHTND4lo4DyJvcZZUCOwhxCHMQ4/PHW0EAUfxI51nGadcE1BcEVR5zWw==} dependencies: - '@types/react': 17.0.80 + '@types/react': 17.0.2 '@visx/point': 2.17.0 dev: true @@ -4865,7 +4869,7 @@ packages: peerDependencies: react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 dependencies: - '@types/react': 17.0.80 + '@types/react': 17.0.2 prop-types: 15.8.1 react: 17.0.2 dev: true @@ -4875,7 +4879,7 @@ packages: peerDependencies: react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 dependencies: - '@types/react': 17.0.80 + '@types/react': 17.0.2 '@visx/curve': 2.17.0 '@visx/group': 2.17.0(react@17.0.2) '@visx/point': 2.17.0 @@ -4891,7 +4895,7 @@ packages: peerDependencies: react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 dependencies: - '@types/react': 17.0.80 + '@types/react': 17.0.2 classnames: 2.5.1 prop-types: 15.8.1 react: 17.0.2 @@ -4902,7 +4906,7 @@ packages: peerDependencies: react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 dependencies: - '@types/react': 17.0.80 + '@types/react': 17.0.2 '@visx/group': 2.17.0(react@17.0.2) '@visx/scale': 2.18.0 classnames: 2.5.1 @@ -4915,7 +4919,7 @@ packages: peerDependencies: react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 dependencies: - '@types/react': 17.0.80 + '@types/react': 17.0.2 '@visx/group': 2.17.0(react@17.0.2) '@visx/shape': 2.18.0(react@17.0.2) classnames: 2.5.1 @@ -4928,7 +4932,7 @@ packages: peerDependencies: react: ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 dependencies: - '@types/react': 17.0.80 + '@types/react': 17.0.2 classnames: 2.5.1 prop-types: 15.8.1 react: 17.0.2 @@ -4957,7 +4961,7 @@ packages: '@types/d3-path': 1.0.11 '@types/d3-shape': 1.3.12 '@types/lodash': 4.17.0 - '@types/react': 17.0.80 + '@types/react': 17.0.2 '@visx/curve': 2.17.0 '@visx/group': 2.17.0(react@17.0.2) '@visx/scale': 2.18.0 @@ -4975,7 +4979,7 @@ packages: react: ^16.3.0-0 || ^17.0.0-0 || ^18.0.0-0 dependencies: '@types/lodash': 4.17.0 - '@types/react': 17.0.80 + '@types/react': 17.0.2 classnames: 2.5.1 lodash: 4.17.21 prop-types: 15.8.1 @@ -5209,15 +5213,15 @@ packages: tiny-warning: 1.0.3 dev: true - /@web3-react/core@8.2.3(@types/react@17.0.80)(bufferutil@4.0.8)(react@17.0.2)(utf-8-validate@5.0.10): + /@web3-react/core@8.2.3(@types/react@17.0.2)(bufferutil@4.0.8)(react@17.0.2)(utf-8-validate@5.0.10): resolution: {integrity: sha512-0ezmRKhqQpoa9ct2/3erg60zBXfC/f/liYR1mfSGKtIroRkLnPARigZSV6pI+fi8bhfGJ0RKtFWyTCCWZzdq1w==} peerDependencies: react: '>=16.8' dependencies: - '@web3-react/store': 8.2.3(@types/react@17.0.80)(react@17.0.2) - '@web3-react/types': 8.2.3(@types/react@17.0.80)(react@17.0.2) + '@web3-react/store': 8.2.3(@types/react@17.0.2)(react@17.0.2) + '@web3-react/types': 8.2.3(@types/react@17.0.2)(react@17.0.2) react: 17.0.2 - zustand: 4.4.0(@types/react@17.0.80)(react@17.0.2) + zustand: 4.4.0(@types/react@17.0.2)(react@17.0.2) optionalDependencies: '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: @@ -5227,10 +5231,10 @@ packages: - utf-8-validate dev: true - /@web3-react/eip1193@8.2.3(@types/react@17.0.80)(react@17.0.2): + /@web3-react/eip1193@8.2.3(@types/react@17.0.2)(react@17.0.2): resolution: {integrity: sha512-PdL8PCv3zgQrnowRlBK7PIO8G7v/nc31PYgarACo8mX+l5Y4+l7+ma/kpkULXp5yLtc4qlQYlCalmXpcbtl2FA==} dependencies: - '@web3-react/types': 8.2.3(@types/react@17.0.80)(react@17.0.2) + '@web3-react/types': 8.2.3(@types/react@17.0.2)(react@17.0.2) eventemitter3: 4.0.7 transitivePeerDependencies: - '@types/react' @@ -5238,10 +5242,10 @@ packages: - react dev: true - /@web3-react/empty@8.2.3(@types/react@17.0.80)(react@17.0.2): + /@web3-react/empty@8.2.3(@types/react@17.0.2)(react@17.0.2): resolution: {integrity: sha512-Uopeac2XgyJLmK8EawNmG1kferlSvklKgWzbianygriC3C3+6yHvflUBmHzYfcpZDq5gotP4JJr2bmhGAocQ5w==} dependencies: - '@web3-react/types': 8.2.3(@types/react@17.0.80)(react@17.0.2) + '@web3-react/types': 8.2.3(@types/react@17.0.2)(react@17.0.2) transitivePeerDependencies: - '@types/react' - immer @@ -5280,12 +5284,12 @@ packages: - utf-8-validate dev: true - /@web3-react/store@8.2.3(@types/react@17.0.80)(react@17.0.2): + /@web3-react/store@8.2.3(@types/react@17.0.2)(react@17.0.2): resolution: {integrity: sha512-qUJQ5pDsYYDra+/+glq2BmIS43HYAiEZ22sLLVh6E75WiZKRNOOqUxBDPe33KTIn718DLt51j+wd2FT+oT/kJQ==} dependencies: '@ethersproject/address': 5.7.0 - '@web3-react/types': 8.2.3(@types/react@17.0.80)(react@17.0.2) - zustand: 4.4.0(@types/react@17.0.80)(react@17.0.2) + '@web3-react/types': 8.2.3(@types/react@17.0.2)(react@17.0.2) + zustand: 4.4.0(@types/react@17.0.2)(react@17.0.2) transitivePeerDependencies: - '@types/react' - immer @@ -5296,21 +5300,21 @@ packages: resolution: {integrity: sha512-ofGmfDhxmNT1/P/MgVa8IKSkCStFiyvXe+U5tyZurKdrtTDFU+wJ/LxClPDtFerWpczNFPUSrKcuhfPX1sI6+A==} dev: true - /@web3-react/types@8.2.3(@types/react@17.0.80)(react@17.0.2): + /@web3-react/types@8.2.3(@types/react@17.0.2)(react@17.0.2): resolution: {integrity: sha512-kSG90QkN+n7IOtp10nQ44oS8J7jzfH9EmqnruwBpCGybh1FM/ohyRvUKWYZNfNE4wsjTSpKsINR0/VdDsZMHyg==} dependencies: - zustand: 4.4.0(@types/react@17.0.80)(react@17.0.2) + zustand: 4.4.0(@types/react@17.0.2)(react@17.0.2) transitivePeerDependencies: - '@types/react' - immer - react dev: true - /@web3-react/url@8.2.3(@types/react@17.0.80)(bufferutil@4.0.8)(react@17.0.2)(utf-8-validate@5.0.10): + /@web3-react/url@8.2.3(@types/react@17.0.2)(bufferutil@4.0.8)(react@17.0.2)(utf-8-validate@5.0.10): resolution: {integrity: sha512-gOcs8uEbD+BKMvw2VhTWnD8Ls3aOmbebLwASu7daWYuM2eB8hS8AoqsEAbV1NnliNpY7ztd+L1Vi5CckiIhXcw==} dependencies: '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@web3-react/types': 8.2.3(@types/react@17.0.80)(react@17.0.2) + '@web3-react/types': 8.2.3(@types/react@17.0.2)(react@17.0.2) transitivePeerDependencies: - '@types/react' - bufferutil @@ -8010,7 +8014,7 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-next@11.1.4(eslint@7.32.0)(next@12.3.4)(typescript@4.9.5): + /eslint-config-next@11.1.4(eslint@7.32.0)(next@12.3.1)(typescript@4.9.5): resolution: {integrity: sha512-PD2/sxnLcI1Zy/QwKSwugzgafwymNh70Y/nPB/v+i0GOTFIl2JpLRUg9m/bQFHzi6PDeDM81w89ayFvpa2/Nxg==} peerDependencies: eslint: ^7.23.0 @@ -8030,7 +8034,7 @@ packages: eslint-plugin-jsx-a11y: 6.8.0(eslint@7.32.0) eslint-plugin-react: 7.34.1(eslint@7.32.0) eslint-plugin-react-hooks: 4.6.0(eslint@7.32.0) - next: 12.3.4(@babel/core@7.24.4)(babel-plugin-macros@3.1.0)(react-dom@17.0.2)(react@17.0.2) + next: 12.3.1(@babel/core@7.24.4)(babel-plugin-macros@3.1.0)(react-dom@17.0.2)(react@17.0.2) typescript: 4.9.5 transitivePeerDependencies: - eslint-import-resolver-webpack @@ -11848,7 +11852,7 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true - /next-pwa@5.4.7(@babel/core@7.24.4)(next@12.3.4)(webpack@5.91.0): + /next-pwa@5.4.7(@babel/core@7.24.4)(next@12.3.1)(webpack@5.91.0): resolution: {integrity: sha512-Uc1pOYJ/7tORbi2LoIEbaHz/hEbq06jiGbVuhr+nzHJHjPGFkmF6JfcDKVdbaXbJa1gJass0utPOI+Wrce06Qw==} peerDependencies: next: '>=9.0.0' @@ -11856,7 +11860,7 @@ packages: babel-loader: 8.3.0(@babel/core@7.24.4)(webpack@5.91.0) clean-webpack-plugin: 4.0.0(webpack@5.91.0) globby: 11.1.0 - next: 12.3.4(@babel/core@7.24.4)(babel-plugin-macros@3.1.0)(react-dom@17.0.2)(react@17.0.2) + next: 12.3.1(@babel/core@7.24.4)(babel-plugin-macros@3.1.0)(react-dom@17.0.2)(react@17.0.2) terser-webpack-plugin: 5.3.10(webpack@5.91.0) workbox-webpack-plugin: 6.6.0(webpack@5.91.0) workbox-window: 6.6.0 @@ -11870,14 +11874,14 @@ packages: - webpack dev: true - /next-seo@5.15.0(next@12.3.4)(react-dom@17.0.2)(react@17.0.2): + /next-seo@5.15.0(next@12.3.1)(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-LGbcY91yDKGMb7YI+28n3g+RuChUkt6pXNpa8FkfKkEmNiJkeRDEXTnnjVtwT9FmMhG6NH8qwHTelGrlYm9rgg==} peerDependencies: next: ^8.1.1-canary.54 || >=9.0.0 react: '>=16.0.0' react-dom: '>=16.0.0' dependencies: - next: 12.3.4(@babel/core@7.24.4)(babel-plugin-macros@3.1.0)(react-dom@17.0.2)(react@17.0.2) + next: 12.3.1(@babel/core@7.24.4)(babel-plugin-macros@3.1.0)(react-dom@17.0.2)(react@17.0.2) react: 17.0.2 react-dom: 17.0.2(react@17.0.2) dev: true @@ -11893,8 +11897,8 @@ packages: - supports-color dev: true - /next@12.3.4(@babel/core@7.24.4)(babel-plugin-macros@3.1.0)(react-dom@17.0.2)(react@17.0.2): - resolution: {integrity: sha512-VcyMJUtLZBGzLKo3oMxrEF0stxh8HwuW976pAzlHhI3t8qJ4SROjCrSh1T24bhrbjw55wfZXAbXPGwPt5FLRfQ==} + /next@12.3.1(@babel/core@7.24.4)(babel-plugin-macros@3.1.0)(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-l7bvmSeIwX5lp07WtIiP9u2ytZMv7jIeB8iacR28PuUEFG5j0HGAPnMqyG5kbZNBG2H7tRsrQ4HCjuMOPnANZw==} engines: {node: '>=12.22.0'} hasBin: true peerDependencies: @@ -11911,7 +11915,7 @@ packages: sass: optional: true dependencies: - '@next/env': 12.3.4 + '@next/env': 12.3.1 '@swc/helpers': 0.4.11 caniuse-lite: 1.0.30001607 postcss: 8.4.14 @@ -11920,19 +11924,19 @@ packages: styled-jsx: 5.0.7(@babel/core@7.24.4)(babel-plugin-macros@3.1.0)(react@17.0.2) use-sync-external-store: 1.2.0(react@17.0.2) optionalDependencies: - '@next/swc-android-arm-eabi': 12.3.4 - '@next/swc-android-arm64': 12.3.4 - '@next/swc-darwin-arm64': 12.3.4 - '@next/swc-darwin-x64': 12.3.4 - '@next/swc-freebsd-x64': 12.3.4 - '@next/swc-linux-arm-gnueabihf': 12.3.4 - '@next/swc-linux-arm64-gnu': 12.3.4 - '@next/swc-linux-arm64-musl': 12.3.4 - '@next/swc-linux-x64-gnu': 12.3.4 - '@next/swc-linux-x64-musl': 12.3.4 - '@next/swc-win32-arm64-msvc': 12.3.4 - '@next/swc-win32-ia32-msvc': 12.3.4 - '@next/swc-win32-x64-msvc': 12.3.4 + '@next/swc-android-arm-eabi': 12.3.1 + '@next/swc-android-arm64': 12.3.1 + '@next/swc-darwin-arm64': 12.3.1 + '@next/swc-darwin-x64': 12.3.1 + '@next/swc-freebsd-x64': 12.3.1 + '@next/swc-linux-arm-gnueabihf': 12.3.1 + '@next/swc-linux-arm64-gnu': 12.3.1 + '@next/swc-linux-arm64-musl': 12.3.1 + '@next/swc-linux-x64-gnu': 12.3.1 + '@next/swc-linux-x64-musl': 12.3.1 + '@next/swc-win32-arm64-msvc': 12.3.1 + '@next/swc-win32-ia32-msvc': 12.3.1 + '@next/swc-win32-x64-msvc': 12.3.1 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -16357,7 +16361,7 @@ packages: react: 17.0.2 dev: true - /zustand@4.4.0(@types/react@17.0.80)(react@17.0.2): + /zustand@4.4.0(@types/react@17.0.2)(react@17.0.2): resolution: {integrity: sha512-2dq6wq4dSxbiPTamGar0NlIG/av0wpyWZJGeQYtUOLegIUvhM2Bf86ekPlmgpUtS5uR7HyetSiktYrGsdsyZgQ==} engines: {node: '>=12.7.0'} peerDependencies: @@ -16372,7 +16376,7 @@ packages: react: optional: true dependencies: - '@types/react': 17.0.80 + '@types/react': 17.0.2 react: 17.0.2 use-sync-external-store: 1.2.0(react@17.0.2) dev: true diff --git a/sentry.client.config.js b/sentry.client.config.js deleted file mode 100644 index d6f0b5706c..0000000000 --- a/sentry.client.config.js +++ /dev/null @@ -1,15 +0,0 @@ -// This file configures the initialization of Sentry on the browser. -// The config you add here will be used whenever a page is visited. -// https://docs.sentry.io/platforms/javascript/guides/nextjs/ - -import * as Sentry from '@sentry/nextjs'; - -const SENTRY_DSN = process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN - -Sentry.init({ - dsn: SENTRY_DSN, - tracesSampleRate: 1.0, - // Note: if you want to override the automatic release value, do not set a - // `release` value here - use the environment variable `SENTRY_RELEASE`, so - // that it will also get attached to your source maps -}) diff --git a/sentry.properties b/sentry.properties deleted file mode 100644 index 48104f3c26..0000000000 --- a/sentry.properties +++ /dev/null @@ -1,5 +0,0 @@ -defaults.url=https://sentry.io/ -defaults.org=sushi-j9 -defaults.project=sushiswap-interface -auth.token=7e784089c5ee4f03a278173c6922948ec810f334403f4353a515a637621098c7 -cli.executable=../.npm/_npx/a8388072043b4cbc/node_modules/@sentry/cli/bin/sentry-cli diff --git a/sentry.server.config.js b/sentry.server.config.js deleted file mode 100644 index 8f7d077fd9..0000000000 --- a/sentry.server.config.js +++ /dev/null @@ -1,15 +0,0 @@ -// This file configures the initialization of Sentry on the server. -// The config you add here will be used whenever the server handles a request. -// https://docs.sentry.io/platforms/javascript/guides/nextjs/ - -import * as Sentry from '@sentry/nextjs' - -const SENTRY_DSN = process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN - -Sentry.init({ - dsn: SENTRY_DSN, - tracesSampleRate: 1.0, - // Note: if you want to override the automatic release value, do not set a - // `release` value here - use the environment variable `SENTRY_RELEASE`, so - // that it will also get attached to your source maps -}) \ No newline at end of file diff --git a/src/bootstrap.ts b/src/bootstrap.ts index 8c28239900..44149785af 100644 --- a/src/bootstrap.ts +++ b/src/bootstrap.ts @@ -3,8 +3,6 @@ import { BigNumber, BigNumberish } from '@ethersproject/bignumber' import { Zero } from '@ethersproject/constants' import { parseUnits } from '@ethersproject/units' -import * as Sentry from '@sentry/browser' -import { Integrations } from '@sentry/tracing' import { Fraction } from 'app/entities/bignumber' import React from 'react' @@ -62,18 +60,4 @@ BigNumber.prototype.max = function (...values: BigNumberish[]): BigNumber { } } return highest -} - -Sentry.init({ - dsn: 'https://f58d5ab63dba4cf28c2dbd20b2494ff3@o960777.ingest.sentry.io/5909166', - - // Alternatively, use `process.env.npm_package_version` for a dynamic release version - // if your build tool supports it. - release: 'sushiswap-interface@1.0.0', - integrations: [new Integrations.BrowserTracing()], - - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for performance monitoring. - // We recommend adjusting this value in production - tracesSampleRate: 1.0, -}) +} \ No newline at end of file diff --git a/src/features/trident/migrate/SelectPoolsAndConfirm.tsx b/src/features/trident/migrate/SelectPoolsAndConfirm.tsx index 4b8349a4c2..1201dfdde2 100644 --- a/src/features/trident/migrate/SelectPoolsAndConfirm.tsx +++ b/src/features/trident/migrate/SelectPoolsAndConfirm.tsx @@ -1,6 +1,6 @@ import { t } from '@lingui/macro' import { useLingui } from '@lingui/react' -import EXPORTS from '@sushiswap/trident/exports/all.json' +import EXPORTS from '@sushiswap/trident/exports/exports.json' import Button from 'app/components/Button' import Dots from 'app/components/Dots' import { LoadingSpinner } from 'app/components/LoadingSpinner' diff --git a/src/hooks/useContract.ts b/src/hooks/useContract.ts index fb83ed97d1..dce4b51bce 100644 --- a/src/hooks/useContract.ts +++ b/src/hooks/useContract.ts @@ -22,7 +22,7 @@ import { import { LIMIT_ORDER_HELPER_ADDRESS, STOP_LIMIT_ORDER_ADDRESS } from '@sushiswap/limit-order-sdk' import MISO from '@sushiswap/miso/exports/all.json' import ConstantProductPoolArtifact from '@sushiswap/trident/artifacts/contracts/pool/constant-product/ConstantProductPool.sol/ConstantProductPool.json' -import TRIDENT from '@sushiswap/trident/exports/all.json' +import TRIDENT from '@sushiswap/trident/exports/exports.json' import { Pool, PoolType } from '@sushiswap/trident-sdk' import { ARGENT_WALLET_DETECTOR_ABI, diff --git a/test/e2e/addliquidity.test.ts b/test/e2e/addliquidity.test.ts deleted file mode 100644 index b78332bf14..0000000000 --- a/test/e2e/addliquidity.test.ts +++ /dev/null @@ -1,500 +0,0 @@ -import { Dappeteer } from '@chainsafe/dappeteer' -import { closeValues } from '@sushiswap/trident-sdk' -import { Browser, Page } from 'puppeteer' - -import { ADDRESSES } from './constants/Index' -import { TestHelper } from './helpers/TestHelper' -import { AddLiquidityPage } from './pages/pools/AddLiquidityPage' -import { LiquidityPoolsPage } from './pages/pools/LiquidityPoolsPage' -import { PoolPage } from './pages/pools/PoolPage' - -require('dotenv').config() - -let baseUrl: string = process.env.TEST_BASE_URL || 'http://localhost:3000' - -let browser: Browser -let page: Page -let metamask: Dappeteer - -let liquidityPoolsPage: LiquidityPoolsPage -let poolPage: PoolPage -let addLiquidityPage: AddLiquidityPage - -let depositPercentage = 0.01 - -async function initPages() { - liquidityPoolsPage = new LiquidityPoolsPage(page, metamask, baseUrl) - poolPage = new PoolPage(page, metamask) - addLiquidityPage = new AddLiquidityPage(page, metamask) -} - -async function importTokens() { - await liquidityPoolsPage.addTokenToMetamask(ADDRESSES.USDC) -} - -function round(input: number): number { - return parseFloat(input.toFixed(5)) -} - -jest.retryTimes(1) - -describe('Add Liquidity:', () => { - beforeAll(async () => { - ;[metamask, browser, page] = await TestHelper.initDappeteer() - await initPages() - await importTokens() - }) - - afterAll(async () => { - browser.close() - }) - - test('Should deposit USDC from wallet in unequal amounts', async () => { - const targetPoolName = 'USDC-WETH' - - await liquidityPoolsPage.navigateTo() - await liquidityPoolsPage.connectMetamaskWallet() - await liquidityPoolsPage.goToPool(targetPoolName) - - const positionBeforeDeposit = await poolPage.getPoolPosition() - expect(positionBeforeDeposit.assetA).toEqual('USDC') - expect(positionBeforeDeposit.assetB).toEqual('WETH') - - const poolLink = page.url() - await poolPage.clickAddLiquidityButton() - - const usdcWalletBalanceBefore = await addLiquidityPage.getAssetABalance(true) - const usdcDepositAmount = round(usdcWalletBalanceBefore * depositPercentage) - - await addLiquidityPage.setFixedRatio(false) - await addLiquidityPage.setAssetAFundFromWallet(true) - await addLiquidityPage.setAssetADepositAmount(usdcDepositAmount) - - const minLiquidityOutput = await addLiquidityPage.getMinReceivedAmount() - - await addLiquidityPage.confirmDeposit() - - await page.goto(poolLink) - await page.waitForSelector(`#pool-title-${targetPoolName}`) - - const positionAfterDeposit = await poolPage.getPoolPosition() - expect(positionAfterDeposit.assetA).toEqual('USDC') - expect(positionAfterDeposit.assetB).toEqual('WETH') - - await poolPage.clickAddLiquidityButton() - const usdcWalletBalanceAfter = await addLiquidityPage.getAssetABalance(true) - - const usdcBalanceDiff = usdcWalletBalanceBefore - usdcWalletBalanceAfter - // @ts-ignore TYPE NEEDS FIXING - const slpAmountDiff = positionAfterDeposit.slpAmount - positionBeforeDeposit.slpAmount - - expect(closeValues(usdcBalanceDiff, usdcDepositAmount, 1e-9)).toBe(true) - expect(closeValues(slpAmountDiff, minLiquidityOutput, 1e-9)).toBe(true) - }) - - test('Should deposit ETH from wallet in unequal amounts', async () => { - const targetPoolName = 'USDC-WETH' - - await liquidityPoolsPage.navigateTo() - await liquidityPoolsPage.connectMetamaskWallet() - await liquidityPoolsPage.goToPool(targetPoolName) - - const positionBeforeDeposit = await poolPage.getPoolPosition() - expect(positionBeforeDeposit.assetA).toEqual('USDC') - expect(positionBeforeDeposit.assetB).toEqual('WETH') - - const poolLink = page.url() - await poolPage.clickAddLiquidityButton() - - const ethWalletBalanceBefore = await addLiquidityPage.getAssetBBalance(true) - const ethDepositAmount = round(ethWalletBalanceBefore * depositPercentage) - - await addLiquidityPage.setFixedRatio(false) - await addLiquidityPage.setAssetBFundFromWallet(true) - await addLiquidityPage.setAssetBDepositAmount(ethDepositAmount) - - const minLiquidityOutput = await addLiquidityPage.getMinReceivedAmount() - - await addLiquidityPage.confirmDeposit() - - await page.goto(poolLink) - await page.waitForSelector(`#pool-title-${targetPoolName}`) - - const positionAfterDeposit = await poolPage.getPoolPosition() - expect(positionAfterDeposit.assetA).toEqual('USDC') - expect(positionAfterDeposit.assetB).toEqual('WETH') - - await poolPage.clickAddLiquidityButton() - const ethWalletBalanceAfter = await addLiquidityPage.getAssetBBalance(true) - - const ethBalanceDiff = ethWalletBalanceBefore - ethWalletBalanceAfter - // @ts-ignore TYPE NEEDS FIXING - const slpAmountDiff = positionAfterDeposit.slpAmount - positionBeforeDeposit.slpAmount - - expect(closeValues(ethBalanceDiff, ethDepositAmount, 1e-9)).toBe(true) - expect(closeValues(slpAmountDiff, minLiquidityOutput, 1e-9)).toBe(true) - }) - - test('Should deposit ETH from bento in unequal amounts', async () => { - const targetPoolName = 'USDC-WETH' - - await liquidityPoolsPage.navigateTo() - await liquidityPoolsPage.connectMetamaskWallet() - await liquidityPoolsPage.goToPool(targetPoolName) - - const positionBeforeDeposit = await poolPage.getPoolPosition() - expect(positionBeforeDeposit.assetA).toEqual('USDC') - expect(positionBeforeDeposit.assetB).toEqual('WETH') - - const poolLink = page.url() - await poolPage.clickAddLiquidityButton() - - const ethBalanceBefore = await addLiquidityPage.getAssetBBalance(false) - const ethDepositAmount = round(ethBalanceBefore * depositPercentage) - - await addLiquidityPage.setFixedRatio(false) - await addLiquidityPage.setAssetBFundFromWallet(false) - await addLiquidityPage.setAssetBDepositAmount(ethDepositAmount) - - const minLiquidityOutput = await addLiquidityPage.getMinReceivedAmount() - - await addLiquidityPage.confirmDeposit() - - await page.goto(poolLink) - await page.waitForSelector(`#pool-title-${targetPoolName}`) - - const positionAfterDeposit = await poolPage.getPoolPosition() - expect(positionAfterDeposit.assetA).toEqual('USDC') - expect(positionAfterDeposit.assetB).toEqual('WETH') - - await poolPage.clickAddLiquidityButton() - const ethBalanceAfter = await addLiquidityPage.getAssetBBalance(false) - - const ethBalanceDiff = ethBalanceBefore - ethBalanceAfter - // @ts-ignore TYPE NEEDS FIXING - const slpAmountDiff = positionAfterDeposit.slpAmount - positionBeforeDeposit.slpAmount - - expect(closeValues(ethBalanceDiff, ethDepositAmount, 1e-9)).toBe(true) - expect(closeValues(slpAmountDiff, minLiquidityOutput, 1e-9)).toBe(true) - }) - - test('Should deposit ETH from wallet & USDC from wallet in unequal amounts', async () => { - const targetPoolName = 'USDC-WETH' - - await liquidityPoolsPage.navigateTo() - await liquidityPoolsPage.connectMetamaskWallet() - await liquidityPoolsPage.goToPool(targetPoolName) - - const positionBeforeDeposit = await poolPage.getPoolPosition() - expect(positionBeforeDeposit.assetA).toEqual('USDC') - expect(positionBeforeDeposit.assetB).toEqual('WETH') - const poolLink = page.url() - - await poolPage.clickAddLiquidityButton() - - const assetAWalletBalanceBefore = await addLiquidityPage.getAssetABalance(true) - const assetBWalletBalanceBefore = await addLiquidityPage.getAssetBBalance(true) - - const assetADepositAmount = round(assetAWalletBalanceBefore * depositPercentage) - const assetBDepositAmount = round(assetBWalletBalanceBefore * depositPercentage) - - await addLiquidityPage.setFixedRatio(false) - await addLiquidityPage.setAssetAFundFromWallet(true) - await addLiquidityPage.setAssetBFundFromWallet(true) - - await addLiquidityPage.setAssetBDepositAmount(assetBDepositAmount) - await addLiquidityPage.setAssetADepositAmount(assetADepositAmount) - - const minLiquidityOutput = await addLiquidityPage.getMinReceivedAmount() - - await addLiquidityPage.confirmDeposit() - - await page.goto(poolLink) - await page.waitForSelector(`#pool-title-${targetPoolName}`) - - const positionAfterDeposit = await poolPage.getPoolPosition() - expect(positionAfterDeposit.assetA).toEqual('USDC') - expect(positionAfterDeposit.assetB).toEqual('WETH') - - await poolPage.clickAddLiquidityButton() - const assetAWalletBalanceAfter = await addLiquidityPage.getAssetABalance(true) - const assetBWalletBalanceAfter = await addLiquidityPage.getAssetBBalance(true) - - const assetABalanceDiff = assetAWalletBalanceBefore - assetAWalletBalanceAfter - const assetBBalanceDiff = assetBWalletBalanceBefore - assetBWalletBalanceAfter - // @ts-ignore TYPE NEEDS FIXING - const slpAmountDiff = positionAfterDeposit.slpAmount - positionBeforeDeposit.slpAmount - - expect(closeValues(assetABalanceDiff, assetADepositAmount, 1e-9)).toBe(true) - expect(closeValues(assetBBalanceDiff, assetBDepositAmount, 1e-9)).toBe(true) - expect(closeValues(slpAmountDiff, minLiquidityOutput, 1e-9)).toBe(true) - }) - - test('Should deposit ETH from wallet & USDC from bento in unequal amounts', async () => { - const targetPoolName = 'USDC-WETH' - // AssetA = USDC, AssetB = WETH - - await liquidityPoolsPage.navigateTo() - await liquidityPoolsPage.connectMetamaskWallet() - await liquidityPoolsPage.goToPool(targetPoolName) - - const positionBeforeDeposit = await poolPage.getPoolPosition() - expect(positionBeforeDeposit.assetA).toEqual('USDC') - expect(positionBeforeDeposit.assetB).toEqual('WETH') - const poolLink = page.url() - - await poolPage.clickAddLiquidityButton() - - const usdcBentoBalanceBefore = await addLiquidityPage.getAssetABalance(false) - const ethWalletBalanceBefore = await addLiquidityPage.getAssetBBalance(true) - - const usdcDepositAmount = round(usdcBentoBalanceBefore * depositPercentage) - const ethDepositAmount = round(ethWalletBalanceBefore * depositPercentage) - - await addLiquidityPage.setFixedRatio(false) - await addLiquidityPage.setAssetAFundFromWallet(false) - await addLiquidityPage.setAssetBFundFromWallet(true) - - await addLiquidityPage.setAssetBDepositAmount(ethDepositAmount) - await addLiquidityPage.setAssetADepositAmount(usdcDepositAmount) - - const minLiquidityOutput = await addLiquidityPage.getMinReceivedAmount() - - await addLiquidityPage.confirmDeposit() - - await page.goto(poolLink) - await page.waitForSelector(`#pool-title-${targetPoolName}`) - - const positionAfterDeposit = await poolPage.getPoolPosition() - expect(positionAfterDeposit.assetA).toEqual('USDC') - expect(positionAfterDeposit.assetB).toEqual('WETH') - - await poolPage.clickAddLiquidityButton() - const usdcBentoBalanceAfter = await addLiquidityPage.getAssetABalance(false) - const ethWalletBalanceAfter = await addLiquidityPage.getAssetBBalance(true) - - const assetABalanceDiff = usdcBentoBalanceBefore - usdcBentoBalanceAfter - const assetBBalanceDiff = ethWalletBalanceBefore - ethWalletBalanceAfter - // @ts-ignore TYPE NEEDS FIXING - const slpAmountDiff = positionAfterDeposit.slpAmount - positionBeforeDeposit.slpAmount - - expect(closeValues(assetABalanceDiff, usdcDepositAmount, 1e-9)).toBe(true) - expect(closeValues(assetBBalanceDiff, ethDepositAmount, 1e-9)).toBe(true) - expect(closeValues(slpAmountDiff, minLiquidityOutput, 1e-9)).toBe(true) - }) - - test('Should deposit ETH from bento & USDC from wallet in unequal amounts', async () => { - const targetPoolName = 'USDC-WETH' - // AssetA = USDC, AssetB = WETH - - await liquidityPoolsPage.navigateTo() - await liquidityPoolsPage.connectMetamaskWallet() - await liquidityPoolsPage.goToPool(targetPoolName) - - const positionBeforeDeposit = await poolPage.getPoolPosition() - expect(positionBeforeDeposit.assetA).toEqual('USDC') - expect(positionBeforeDeposit.assetB).toEqual('WETH') - const poolLink = page.url() - - await poolPage.clickAddLiquidityButton() - - const usdcWalletBalanceBefore = await addLiquidityPage.getAssetABalance(true) - const ethBentoBalanceBefore = await addLiquidityPage.getAssetBBalance(false) - - const usdcDepositAmount = round(usdcWalletBalanceBefore * depositPercentage) - const ethDepositAmount = round(ethBentoBalanceBefore * depositPercentage) - - await addLiquidityPage.setFixedRatio(false) - await addLiquidityPage.setAssetAFundFromWallet(true) - await addLiquidityPage.setAssetBFundFromWallet(false) - - await addLiquidityPage.setAssetBDepositAmount(ethDepositAmount) - await addLiquidityPage.setAssetADepositAmount(usdcDepositAmount) - - const minLiquidityOutput = await addLiquidityPage.getMinReceivedAmount() - - await addLiquidityPage.confirmDeposit() - - await page.goto(poolLink) - await page.waitForSelector(`#pool-title-${targetPoolName}`) - - const positionAfterDeposit = await poolPage.getPoolPosition() - expect(positionAfterDeposit.assetA).toEqual('USDC') - expect(positionAfterDeposit.assetB).toEqual('WETH') - - await poolPage.clickAddLiquidityButton() - const usdcWalletBalanceAfter = await addLiquidityPage.getAssetABalance(true) - const ethBentoBalanceAfter = await addLiquidityPage.getAssetBBalance(false) - - const usdcBalanceDiff = usdcWalletBalanceBefore - usdcWalletBalanceAfter - const ethBalanceDiff = ethBentoBalanceBefore - ethBentoBalanceAfter - // @ts-ignore TYPE NEEDS FIXING - const slpAmountDiff = positionAfterDeposit.slpAmount - positionBeforeDeposit.slpAmount - - expect(closeValues(usdcBalanceDiff, usdcDepositAmount, 1e-9)).toBe(true) - expect(closeValues(ethBalanceDiff, ethDepositAmount, 1e-9)).toBe(true) - expect(closeValues(slpAmountDiff, minLiquidityOutput, 1e-9)).toBe(true) - }) - - test('Should deposit ETH from bento & USDC from bento in unequal amounts', async () => { - const targetPoolName = 'USDC-WETH' - // AssetA: USDC - // AssetB: WETH - - await liquidityPoolsPage.navigateTo() - await liquidityPoolsPage.connectMetamaskWallet() - await liquidityPoolsPage.goToPool(targetPoolName) - - const positionBeforeDeposit = await poolPage.getPoolPosition() - expect(positionBeforeDeposit.assetA).toEqual('USDC') - expect(positionBeforeDeposit.assetB).toEqual('WETH') - - const poolLink = page.url() - - await poolPage.clickAddLiquidityButton() - - const usdcBentoBalanceBefore = await addLiquidityPage.getAssetABalance(false) - const ethBentoBalanceBefore = await addLiquidityPage.getAssetBBalance(false) - - const usdcDepositAmount = round(usdcBentoBalanceBefore * depositPercentage) - const ethDepositAmount = round(ethBentoBalanceBefore * depositPercentage) - - await addLiquidityPage.setFixedRatio(false) - await addLiquidityPage.setAssetAFundFromWallet(false) - await addLiquidityPage.setAssetBFundFromWallet(false) - - await addLiquidityPage.setAssetBDepositAmount(ethDepositAmount) - await addLiquidityPage.setAssetADepositAmount(usdcDepositAmount) - - const minLiquidityOutput = await addLiquidityPage.getMinReceivedAmount() - - await addLiquidityPage.confirmDeposit() - - await page.goto(poolLink) - await page.waitForSelector(`#pool-title-${targetPoolName}`) - - const positionAfterDeposit = await poolPage.getPoolPosition() - expect(positionAfterDeposit.assetA).toEqual('USDC') - expect(positionAfterDeposit.assetB).toEqual('WETH') - - await poolPage.clickAddLiquidityButton() - const usdcBentoBalanceAfter = await addLiquidityPage.getAssetABalance(false) - const ethBentoBalanceAfter = await addLiquidityPage.getAssetBBalance(false) - - const usdcBalanceDiff = usdcBentoBalanceBefore - usdcBentoBalanceAfter - const ethBalanceDiff = ethBentoBalanceBefore - ethBentoBalanceAfter - // @ts-ignore TYPE NEEDS FIXING - const slpAmountDiff = positionAfterDeposit.slpAmount - positionBeforeDeposit.slpAmount - - expect(closeValues(usdcBalanceDiff, usdcDepositAmount, 1e-9)).toBe(true) - expect(closeValues(ethBalanceDiff, ethDepositAmount, 1e-9)).toBe(true) - expect(closeValues(slpAmountDiff, minLiquidityOutput, 1e-9)).toBe(true) - }) - - test('Should deposit ETH from bento & USDC from bento in equal amounts', async () => { - const targetPoolName = 'USDC-WETH' - - await liquidityPoolsPage.navigateTo() - await liquidityPoolsPage.connectMetamaskWallet() - await liquidityPoolsPage.goToPool(targetPoolName) - - const positionBeforeDeposit = await poolPage.getPoolPosition() - expect(positionBeforeDeposit.assetA).toEqual('USDC') - expect(positionBeforeDeposit.assetB).toEqual('WETH') - const poolLink = page.url() - - await poolPage.clickAddLiquidityButton() - - const assetABentoBalanceBefore = await addLiquidityPage.getAssetABalance(false) - const assetBBentoBalanceBefore = await addLiquidityPage.getAssetBBalance(false) - - const assetADepositAmount = round(assetABentoBalanceBefore * depositPercentage) - - await addLiquidityPage.setFixedRatio(true) - await addLiquidityPage.setAssetAFundFromWallet(false) - await addLiquidityPage.setAssetBFundFromWallet(false) - - await addLiquidityPage.setAssetADepositAmount(assetADepositAmount) - - const assetBDepositAmount = await addLiquidityPage.getAssetBDepositAmount() - - const minLiquidityOutput = await addLiquidityPage.getMinReceivedAmount() - - await addLiquidityPage.confirmDeposit() - - await page.goto(poolLink) - await page.waitForSelector(`#pool-title-${targetPoolName}`) - - const positionAfterDeposit = await poolPage.getPoolPosition() - expect(positionAfterDeposit.assetA).toEqual('USDC') - expect(positionAfterDeposit.assetB).toEqual('WETH') - - await poolPage.clickAddLiquidityButton() - const assetABentoBalanceAfter = await addLiquidityPage.getAssetABalance(false) - const assetBBentoBalanceAfter = await addLiquidityPage.getAssetBBalance(false) - - const assetABalanceDiff = assetABentoBalanceBefore - assetABentoBalanceAfter - const assetBBalanceDiff = assetBBentoBalanceBefore - assetBBentoBalanceAfter - // @ts-ignore TYPE NEEDS FIXING - const slpAmountDiff = positionAfterDeposit.slpAmount - positionBeforeDeposit.slpAmount - - expect(closeValues(assetABalanceDiff, assetADepositAmount, 1e-9)).toBe(true) - expect(closeValues(assetBBalanceDiff, assetBDepositAmount, 1e-9)).toBe(true) - expect(closeValues(slpAmountDiff, minLiquidityOutput, 1e-9)).toBe(true) - }) - - test('Should deposit ETH from wallet & USDC from wallet in equal amounts', async () => { - const targetPoolName = 'USDC-WETH' - // AssetA: USDC - // AssetB: WETH - - await liquidityPoolsPage.navigateTo() - await liquidityPoolsPage.connectMetamaskWallet() - await liquidityPoolsPage.goToPool(targetPoolName) - - const positionBeforeDeposit = await poolPage.getPoolPosition() - expect(positionBeforeDeposit.assetA).toEqual('USDC') - expect(positionBeforeDeposit.assetB).toEqual('WETH') - - const poolLink = page.url() - - await poolPage.clickAddLiquidityButton() - - const usdcWalletBalanceBefore = await addLiquidityPage.getAssetABalance(true) - const ethWalletBalanceBefore = await addLiquidityPage.getAssetBBalance(true) - - const ethDepositAmount = round(ethWalletBalanceBefore * depositPercentage) - - await addLiquidityPage.setFixedRatio(true) - await addLiquidityPage.setAssetAFundFromWallet(true) - await addLiquidityPage.setAssetBFundFromWallet(true) - - await addLiquidityPage.setAssetBDepositAmount(ethDepositAmount) - - const usdcDepositAmount = await addLiquidityPage.getAssetADepositAmount() - - const minLiquidityOutput = await addLiquidityPage.getMinReceivedAmount() - - await addLiquidityPage.confirmDeposit() - - await page.goto(poolLink) - await page.waitForSelector(`#pool-title-${targetPoolName}`) - - const positionAfterDeposit = await poolPage.getPoolPosition() - expect(positionAfterDeposit.assetA).toEqual('USDC') - expect(positionAfterDeposit.assetB).toEqual('WETH') - - await poolPage.clickAddLiquidityButton() - const usdcWalletBalanceAfter = await addLiquidityPage.getAssetABalance(true) - const ethWalletBalanceAfter = await addLiquidityPage.getAssetBBalance(true) - - const usdcBalanceDiff = usdcWalletBalanceBefore - usdcWalletBalanceAfter - const ethBalanceDiff = ethWalletBalanceBefore - ethWalletBalanceAfter - // @ts-ignore TYPE NEEDS FIXING - const slpAmountDiff = positionAfterDeposit.slpAmount - positionBeforeDeposit.slpAmount - - expect(closeValues(usdcBalanceDiff, usdcDepositAmount, 1e-9)).toBe(true) - expect(closeValues(ethBalanceDiff, ethDepositAmount, 1e-9)).toBe(true) - expect(closeValues(slpAmountDiff, minLiquidityOutput, 1e-9)).toBe(true) - }) -}) diff --git a/test/e2e/constants/Index.ts b/test/e2e/constants/Index.ts deleted file mode 100644 index 9192d1488c..0000000000 --- a/test/e2e/constants/Index.ts +++ /dev/null @@ -1,24 +0,0 @@ -export const ADDRESSES = { - DAI: '0x4f96fe3b7a6cf9725f59d353f723c1bdb64ca6aa', - USDC: '0xb7a4F3E9097C08dA09517b5aB877F7a917224ede', - WETH: '0xd0A1E359811322d97991E03f863a0C30C2cF029C', - BAT: '0x482dc9bb08111cb875109b075a40881e48ae02cd', - USDT: '0x07de306FF27a2B630B1141956844eB1552B956B5', - TRIDENT_ROUTER: '0x70e9D5279AFbf898FB507C6FfF8Dd92618e892DB', - LEGACY_ROUTER: '0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506', - COMP: '0x61460874a7196d6a22D1eE4922473664b3E95270', -} - -export const FUNDING_SOURCE = { - BENTO: 'Bento', - WALLET: 'Wallet', -} - -export const RATIO = { - EQUAL: 'Equal', - UNEQUAL: 'Unequal', -} - -export const POOL_TYPE = { - CLASSIC: 'ConstantProduct', -} diff --git a/test/e2e/enums/SwapType.ts b/test/e2e/enums/SwapType.ts deleted file mode 100644 index f9ceb64ce6..0000000000 --- a/test/e2e/enums/SwapType.ts +++ /dev/null @@ -1,5 +0,0 @@ -export enum SwapType { - Normal, - Wrap, - Unwrap, -} diff --git a/test/e2e/helpers/ApprovalHelper.ts b/test/e2e/helpers/ApprovalHelper.ts deleted file mode 100644 index 8ba7b8ad5c..0000000000 --- a/test/e2e/helpers/ApprovalHelper.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { JsonRpcProvider } from '@ethersproject/providers' -import { Contract, Signer, Wallet } from 'ethers' - -import { ADDRESSES } from '../constants/Index' - -export class ApprovalHelper { - private Signer!: Signer - private Provider!: JsonRpcProvider - - constructor() { - this.Provider = new JsonRpcProvider(process.env.INFURA_URL) - - // @ts-ignore TYPE NEEDS FIXING - const signer = new Wallet(process.env.TEST_PKEY, this.Provider) - this.Signer = signer - } - - public async approveRouter(tokenAddress: string, amount: number): Promise<void> { - const approveFunction = ['function approve(address, uint256) external returns (bool)'] - const tokenContract = new Contract(tokenAddress, approveFunction, this.Signer) - - const tridentApproveTx = await tokenContract.approve(ADDRESSES.TRIDENT_ROUTER, amount) - await tridentApproveTx.wait() - - const legacyApproveTx = await tokenContract.approve(ADDRESSES.LEGACY_ROUTER, amount) - await legacyApproveTx.wait() - } -} diff --git a/test/e2e/helpers/BentoHelper.ts b/test/e2e/helpers/BentoHelper.ts deleted file mode 100644 index d403d63c52..0000000000 --- a/test/e2e/helpers/BentoHelper.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { JsonRpcProvider } from '@ethersproject/providers' -import { BENTOBOX_ADDRESS, ChainId } from '@sushiswap/core-sdk' -import { Contract, Signer, utils, Wallet } from 'ethers' - -import { ADDRESSES } from '../constants/Index' - -export class BentoHelper { - private Signer!: Signer - private Provider!: JsonRpcProvider - private BentoContract!: Contract - - constructor() { - this.Provider = new JsonRpcProvider(process.env.INFURA_URL) - - // @ts-ignore TYPE NEEDS FIXING - const signer = new Wallet(process.env.TEST_PKEY, this.Provider) - this.Signer = signer - - const balanceOfFunction = ['function balanceOf(address, address) public view returns (uint256)'] - this.BentoContract = new Contract(BENTOBOX_ADDRESS[ChainId.KOVAN], balanceOfFunction, this.Signer) - } - - public async getBentoBalance(tokenSymbol: string): Promise<number> { - // @ts-ignore TYPE NEEDS FIXING - const tokenAddress = ADDRESSES[tokenSymbol] - - const address = await this.Signer.getAddress() - const balance = await this.BentoContract.balanceOf(tokenAddress, address) - - const balanceFormatted = utils.formatEther(balance.toString()) - - return parseFloat(balanceFormatted) - } -} diff --git a/test/e2e/helpers/TestHelper.ts b/test/e2e/helpers/TestHelper.ts deleted file mode 100644 index ad730fd1e7..0000000000 --- a/test/e2e/helpers/TestHelper.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { Dappeteer, launch, LaunchOptions, setupMetamask } from '@chainsafe/dappeteer' -import puppeteer, { Browser, Page } from 'puppeteer' - -import { App } from '../pages/App' - -export class TestHelper { - public static async init(): Promise<App> { - const [metamask, browser, page] = await this.initDappeteer() - const app = new App(page, metamask, process.env.TEST_BASE_URL || 'http://localhost:3000') - return app - } - - public static async initDappeteer( - seedPhrase: string = '', - password: string = '' - ): Promise<[Dappeteer, Browser, Page]> { - let seed: string - let pass: string - - if (seedPhrase !== '' && password !== '') { - seed = seedPhrase - pass = password - } else { - seed = process.env.TEST_SEED || 'seed seed seed' - pass = process.env.TEST_PASS || 'password' - } - - const browser = await this.getBrowser() - const metamask = await this.getMetamask(browser, seed, pass) - const page = await this.getPage(browser) - - return [metamask, browser, page] - } - - private static async getMetamask(browser: Browser, seed: string, pass: string): Promise<Dappeteer> { - let metamask: Dappeteer - - try { - metamask = await setupMetamask(browser, { seed: seed, password: pass }) - await metamask.switchNetwork('kovan') - - if (process.env.CI === 'true') { - await metamask.page.setDefaultTimeout(60000) - } else { - await metamask.page.setDefaultTimeout(20000) - } - } catch (error) { - console.log('Error occurred setting up metamask') - throw error - } - - return metamask - } - - private static async getBrowser(): Promise<Browser> { - let browser: Browser - let options: LaunchOptions = { - metamaskVersion: 'v10.1.1', - headless: false, - defaultViewport: null, - args: ['--no-sandbox'], - } - - if (process.env.CI === 'true') { - options.slowMo = 3 - options.executablePath = process.env.TEST_PUPPETEER_EXEC_PATH - } - - try { - browser = await launch(puppeteer, options) - } catch (error) { - console.log('Error occurred launching Puppeteer') - throw error - } - - return browser - } - - private static async getPage(browser: Browser): Promise<Page> { - let page: Page - - try { - page = await browser.newPage() - - await page.setDefaultTimeout(180000) - - await page.setUserAgent( - 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36' - ) - } catch (error) { - console.log('Error occurred creating new page') - throw error - } - - return page - } -} diff --git a/test/e2e/interfaces/ILiquidityInfo.ts b/test/e2e/interfaces/ILiquidityInfo.ts deleted file mode 100644 index 46f86c6456..0000000000 --- a/test/e2e/interfaces/ILiquidityInfo.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface ILiquidityInfo { - assetA: string - assetB: string - amountA: number - amountB: number - slpAmount?: number -} diff --git a/test/e2e/pages/App.ts b/test/e2e/pages/App.ts deleted file mode 100644 index 85d4517d49..0000000000 --- a/test/e2e/pages/App.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Dappeteer } from '@chainsafe/dappeteer' -import { Page } from 'puppeteer' - -import { AddLiquidityPage } from './pools/AddLiquidityPage' -import { CreatePoolPage } from './pools/CreatePoolPage' -import { LiquidityPoolsPage } from './pools/LiquidityPoolsPage' -import { PoolPage } from './pools/PoolPage' -import { RemoveLiquidityPage } from './pools/RemoveLiquidityPage' -import { SwapPage } from './swap/SwapPage' - -export class App { - public SwapPage: SwapPage - public LiquidityPoolsPage: LiquidityPoolsPage - public AddLiquidityPage: AddLiquidityPage - public RemoveLiquidityPage: RemoveLiquidityPage - public PoolPage: PoolPage - public CreatePoolPage: CreatePoolPage - - constructor(page: Page, metamask: Dappeteer, baseUrl: string) { - this.SwapPage = new SwapPage(page, metamask, baseUrl) - this.LiquidityPoolsPage = new LiquidityPoolsPage(page, metamask, baseUrl) - this.AddLiquidityPage = new AddLiquidityPage(page, metamask, baseUrl) - this.RemoveLiquidityPage = new RemoveLiquidityPage(page, metamask, baseUrl) - this.PoolPage = new PoolPage(page, metamask, baseUrl) - this.CreatePoolPage = new CreatePoolPage(page, metamask, baseUrl) - } -} diff --git a/test/e2e/pages/AppPage.ts b/test/e2e/pages/AppPage.ts deleted file mode 100644 index 0494b4707f..0000000000 --- a/test/e2e/pages/AppPage.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { Dappeteer } from '@chainsafe/dappeteer' -import { ElementHandle, Page } from 'puppeteer' - -export abstract class AppPage { - public Metamask: Dappeteer - - protected BaseUrl: string - protected Page: Page - protected Route: string = '' - - protected WalletConnectSelector: string = '#connect-wallet' - protected WalletOptionMetamaskSelector: string = '#wallet-option-MetaMask' - - private ci: string = process.env.CI || 'false' - - constructor(page: Page, metamask: Dappeteer, baseUrl: string = '') { - this.Page = page - this.BaseUrl = baseUrl - this.Metamask = metamask - } - - public async navigateTo(): Promise<Page> { - await this.bringToFront() - if (this.BaseUrl && this.Route) { - await this.Page.goto(this.BaseUrl + this.Route) - } else { - console.warn('Page has no URL and cannot be navigated to') - } - return this.Page - } - - public async bringToFront(): Promise<Page> { - await this.Page.bringToFront() - return this.Page - } - - public async evaluateAndClick(btnSelector: string): Promise<void> { - await this.Page.evaluate((selector) => { - return document.querySelector(selector).click() - }, btnSelector) - } - - public async connectMetamaskWallet(): Promise<void> { - await await this.blockingWait(1, true) - - const web3Connected = await this.Page.$('#web3-status-connected') - if (web3Connected) return - - const btnConnectWallet = await this.Page.waitForSelector(this.WalletConnectSelector) - // @ts-ignore TYPE NEEDS FIXING - await btnConnectWallet.click() - - const metamaskButton = await this.Page.waitForSelector(this.WalletOptionMetamaskSelector) - // @ts-ignore TYPE NEEDS FIXING - await metamaskButton.click() - await this.Metamask.approve() - await this.bringToFront() - } - - public async addTokenToMetamask(tokenAddress: string): Promise<void> { - await await this.blockingWait(2) - await this.Metamask.page.bringToFront() - - await this.closeMetamaskWhatsNew() - - const addTokenButton = await this.Metamask.page.waitForSelector('.add-token-button > button') - // @ts-ignore TYPE NEEDS FIXING - await addTokenButton.click() - - const addressInput = await this.Metamask.page.waitForSelector('#custom-address') - // @ts-ignore TYPE NEEDS FIXING - addressInput.type(tokenAddress) - - await this.Metamask.page.waitForTimeout(4000) - - this.Metamask.page.waitForSelector(`button[data-testid='page-container-footer-next']:not([disabled])`) - const nextButton = await this.Metamask.page.waitForSelector(`button[data-testid='page-container-footer-next']`) - // @ts-ignore TYPE NEEDS FIXING - await nextButton.click() - - const buttons = await this.Metamask.page.$$('footer > button') - await buttons[1].click() - - await this.Metamask.page.reload() - } - - public async getMetamaskTokenBalance(tokenSymbol: string): Promise<number> { - await this.Metamask.page.bringToFront() - await this.blockingWait(1, true) - - await this.closeMetamaskWhatsNew() - - const assetMenutButton = await this.Metamask.page.waitForSelector(`li[data-testid="home__asset-tab"]`) - // @ts-ignore TYPE NEEDS FIXING - await assetMenutButton.click() - await this.blockingWait(1, true) - - const assetListItems = await this.Metamask.page.$$('.asset-list-item__token-button') - - for (let index = 0; index < assetListItems.length; index++) { - const assetListItem = assetListItems[index] - - const titleAttributeValue: string = await this.Metamask.page.evaluate( - (item) => item.getAttribute('title'), - assetListItem - ) - - if (titleAttributeValue.split(' ')[1].toUpperCase() === tokenSymbol.toUpperCase()) { - const balance = titleAttributeValue.split(' ')[0] - this.Page.bringToFront() - return parseFloat(balance) - } - } - - return 0 - } - - public async closeMetamaskWhatsNew(): Promise<void> { - await this.blockingWait(1, true) - const closeWhatsNewButton = await this.Metamask.page.$( - '#popover-content > div > div > section > header > div > button' - ) - if (closeWhatsNewButton) { - await closeWhatsNewButton.click() - } - } - - public async confirmMetamaskTransaction(): Promise<void> { - await this.blockingWait(4) - - try { - await this.Metamask.confirmTransaction() - - // Try to confirm transaction again - await this.Metamask.confirmTransaction() - await this.blockingWait(3) - - //Check if we're still at confirm transaction page. When gas estimation takes longer initial confirm does not work - const mmFooterButtons = await this.Metamask.page.$$('footer > button') - if (mmFooterButtons && mmFooterButtons[1]) { - const confirmButton = mmFooterButtons[1] - await confirmButton.click() - } - } catch (error) {} - - await this.blockingWait(1) - await this.Page.bringToFront() - await this.blockingWait(1, true) - } - - // @ts-ignore TYPE NEEDS FIXING - public async blockingWait(seconds, checkCi: boolean = false): Promise<void> { - let waitSeconds = seconds - - if (checkCi && this.ci === 'true') { - waitSeconds = seconds * 2 - } - - var waitTill = new Date(new Date().getTime() + waitSeconds * 1000) - while (waitTill > new Date()) {} - } - - protected async getSwitchElement(switchId: string): Promise<ElementHandle<Element>> { - await this.Page.waitForSelector(switchId) - const switchElement = await this.Page.$(switchId) - - // @ts-ignore TYPE NEEDS FIXING - const buttonElement = (await switchElement.$x('..'))[0] - if (!buttonElement) { - throw new Error(`Switch with id ${switchId} not found on the page. Check selector is valid.`) - } - - return buttonElement - } - - protected async isSwitchChecked(switchId: string): Promise<boolean> { - let checked: boolean - - const checkedValue = await this.Page.$eval(switchId, (button) => button.getAttribute('aria-checked')) - checked = checkedValue === 'true' - - return checked - } -} diff --git a/test/e2e/pages/AppPageComponent.ts b/test/e2e/pages/AppPageComponent.ts deleted file mode 100644 index f4e840c7da..0000000000 --- a/test/e2e/pages/AppPageComponent.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Page } from 'puppeteer' - -export abstract class AppPageComponent { - protected Page: Page - - private ci: string = process.env.CI || 'false' - - constructor(page: Page) { - this.Page = page - } - - // @ts-ignore TYPE NEEDS FIXING - public async blockingWait(seconds, checkCi: boolean = false): Promise<void> { - let waitSeconds = seconds - - if (checkCi && this.ci === 'true') { - waitSeconds = seconds * 2 - } - - var waitTill = new Date(new Date().getTime() + waitSeconds * 1000) - while (waitTill > new Date()) {} - } -} diff --git a/test/e2e/pages/balances/AssetBalancesComponent.ts b/test/e2e/pages/balances/AssetBalancesComponent.ts deleted file mode 100644 index 2dea0de19e..0000000000 --- a/test/e2e/pages/balances/AssetBalancesComponent.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { AppPageComponent } from '../AppPageComponent' - -export class AssetBalancesComponent extends AppPageComponent { - private AssetBalancesTableBodySelector: string = '#asset-portfolio-table > tbody' - - public async getAssetBalances(): Promise<Record<string, number>> { - let balances: Record<string, number> = {} - - await this.Page.waitForSelector(this.AssetBalancesTableBodySelector) - const balancesList = await this.Page.$$(this.AssetBalancesTableBodySelector + ' > tr') - - for (const balanceRow of balancesList) { - let assetSymbol: string = '' - let assetBalance: number = 0 - - const balanceCells = await balanceRow.$$('td') - - for (let cellIndex = 0; cellIndex < balanceCells.length - 1; cellIndex++) { - const balanceCell = balanceCells[cellIndex] - const cellText = await this.Page.evaluate((item) => item.innerText, balanceCell) - - if (cellIndex === 0) { - assetSymbol = cellText - } else if (cellIndex === 1) { - assetBalance = parseFloat(cellText) - } - } - - balances[assetSymbol] = assetBalance - } - - return balances - } -} diff --git a/test/e2e/pages/balances/MyBentoBoxPage.ts b/test/e2e/pages/balances/MyBentoBoxPage.ts deleted file mode 100644 index 03f4f4d466..0000000000 --- a/test/e2e/pages/balances/MyBentoBoxPage.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Dappeteer } from '@chainsafe/dappeteer' -import { Page } from 'puppeteer' - -import { AppPage } from '../AppPage' -import { AssetBalancesComponent } from './AssetBalancesComponent' - -export class MyBentoBoxPage extends AppPage { - protected Route: string = '/portfolio/bentobox' - private AssetBalances: AssetBalancesComponent - - constructor(page: Page, metamask: Dappeteer, baseUrl: string) { - super(page, metamask, baseUrl) - - this.AssetBalances = new AssetBalancesComponent(page) - } - - public async getBentoBalances(): Promise<Record<string, number>> { - return await this.AssetBalances.getAssetBalances() - } -} diff --git a/test/e2e/pages/balances/MyWalletPage.ts b/test/e2e/pages/balances/MyWalletPage.ts deleted file mode 100644 index 4134209da5..0000000000 --- a/test/e2e/pages/balances/MyWalletPage.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Dappeteer } from '@chainsafe/dappeteer' -import { Page } from 'puppeteer' - -import { AppPage } from '../AppPage' -import { AssetBalancesComponent } from './AssetBalancesComponent' - -export class MyWalletPage extends AppPage { - protected Route: string = '/portfolio/wallet' - private AssetBalances: AssetBalancesComponent - - constructor(page: Page, metamask: Dappeteer, baseUrl: string) { - super(page, metamask, baseUrl) - - this.AssetBalances = new AssetBalancesComponent(page) - } - - public async getWalletBalances(): Promise<Record<string, number>> { - return await this.AssetBalances.getAssetBalances() - } -} diff --git a/test/e2e/pages/pools/AddLiquidityPage.ts b/test/e2e/pages/pools/AddLiquidityPage.ts deleted file mode 100644 index 7841cb2070..0000000000 --- a/test/e2e/pages/pools/AddLiquidityPage.ts +++ /dev/null @@ -1,193 +0,0 @@ -import { ElementHandle } from 'puppeteer' - -import { AppPage } from '../AppPage' - -export class AddLiquidityPage extends AppPage { - private ConfirmDepositButtonSelector: string = '#btn-ConfirmDeposit' - private ModalConfirmDepositButtonSelector: string = '#btn-modal-confirm-deposit' - private TxStatusDivSelector: string = 'div-tx-status' - private ApproveButtonSelector: string = '#btn-approve' - private FixedRatioCheckboxSelector: string = '#chk-fixed-ratio-deposit' - - // Transaction Details Selctors - private MinReceivedSelector: string = '#text-liquidity-minted' - - // Asset input selectors - private SpendFromWalletASelector: string = '.switch-spend-from-wallet-a' - private SpendFromWalletBSelector: string = '.switch-spend-from-wallet-b' - private AssetInputALabelSelector: string = '#asset-input-a' - private AssetInputBLabelSelector: string = '#asset-input-b' - private AssetInputABalanceSelector: string = '#asset-input-a-balance' - private AssetInputBBalanceSelector: string = '#asset-input-b-balance' - - public async addLiquidity( - t0Amount: string, - spendFromWalletA: boolean = true, - spendFromWalletB: boolean = true, - t1Amount: string = '', - fixedRatio: boolean = false - ): Promise<void> { - await this.setFixedRatio(fixedRatio) - - await this.setAssetADepositAmount(parseFloat(t0Amount)) - await this.setAssetBDepositAmount(parseFloat(t1Amount)) - - await this.setAssetAFundFromWallet(spendFromWalletA) - await this.setAssetBFundFromWallet(spendFromWalletB) - - await this.confirmDeposit() - } - - public async confirmDeposit(): Promise<void> { - await this.blockingWait(1, true) - const approveButton = await this.Page.$(this.ApproveButtonSelector) - if (approveButton) { - await approveButton.click() - await this.Metamask.confirmTransaction() - await this.Metamask.page.waitForTimeout(1000) - await this.bringToFront() - } - - const confirmDepositButton = await this.Page.waitForSelector(this.ConfirmDepositButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - await confirmDepositButton.click() - - const modalConfirmDepositButton = await this.Page.waitForSelector(this.ModalConfirmDepositButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - await modalConfirmDepositButton.click() - - await this.confirmMetamaskTransaction() - - await this.Page.waitForXPath(`//div[@id='${this.TxStatusDivSelector}' and contains(., 'Success')]`) - - await this.blockingWait(5) - } - - public async getAssetABalance(fromWallet: boolean = true): Promise<number> { - return await this.getAssetBalance(this.SpendFromWalletASelector, this.AssetInputABalanceSelector, fromWallet) - } - - public async getAssetBBalance(fromWallet: boolean = true): Promise<number> { - return await this.getAssetBalance(this.SpendFromWalletBSelector, this.AssetInputBBalanceSelector, fromWallet) - } - - public async setFixedRatio(fixedRatio: boolean): Promise<void> { - await this.blockingWait(1, true) - const fixedRatioCheckbox = await this.getFixedRatioCheckbox() - - if (fixedRatio && !(await this.isFixedRatioChecked())) { - await fixedRatioCheckbox.click() - } else if (!fixedRatio && (await this.isFixedRatioChecked())) { - await fixedRatioCheckbox.click() - } - } - - public async setAssetADepositAmount(depositAmount: number): Promise<void> { - await this.blockingWait(1, true) - const inputs = await this.Page.$$('input[type=text]') - if (inputs.length !== 2) throw new Error('Expected 2 text inputs on add liquidity page') - - await inputs[0].type(depositAmount.toString()) - } - - public async setAssetBDepositAmount(depositAmount: number): Promise<void> { - await this.blockingWait(1, true) - const inputs = await this.Page.$$('input[type=text]') - if (inputs.length !== 2) throw new Error('Expected 2 text inputs on add liquidity page') - - await inputs[1].type(depositAmount.toString()) - } - - public async setAssetAFundFromWallet(fromWallet: boolean = true): Promise<void> { - await this.setFundingSource(this.SpendFromWalletASelector, fromWallet) - } - - public async setAssetBFundFromWallet(fromWallet: boolean = true): Promise<void> { - await this.setFundingSource(this.SpendFromWalletBSelector, fromWallet) - } - - public async getAssetBDepositAmount(): Promise<number> { - await this.blockingWait(1, true) - const inputs = await this.Page.$$('input[type=text]') - - const assetBInput = inputs[1] - - const depositAmount = (await (await assetBInput.getProperty('value')).jsonValue()) as string - return parseFloat(depositAmount) - } - - public async getAssetADepositAmount(): Promise<number> { - await this.blockingWait(1, true) - const inputs = await this.Page.$$('input[type=text]') - - const assetBInput = inputs[0] - - const depositAmount = (await (await assetBInput.getProperty('value')).jsonValue()) as string - return parseFloat(depositAmount) - } - - public async getMinReceivedAmount(): Promise<number> { - await this.Page.waitForSelector(this.MinReceivedSelector) - const minReceivedText = await this.Page.$eval(this.MinReceivedSelector, (el) => el.textContent) - - if (minReceivedText) { - const balance = minReceivedText.split(' ')[0] - return parseFloat(balance) - } - - return 0 - } - - private async setFundingSource(switchSelector: string, fromWallet: boolean = true): Promise<void> { - const isSpendFromWalletAChecked = await this.isSwitchChecked(switchSelector) - const spendFromWalletASwitch = await this.getSwitchElement(switchSelector) - if (fromWallet && !isSpendFromWalletAChecked) { - await spendFromWalletASwitch.click() - } else if (!fromWallet && isSpendFromWalletAChecked) { - await spendFromWalletASwitch.click() - } - } - - private async getAssetBalance( - spendFromSwitchSelector: string, - balanceSelector: string, - fromWallet: boolean = true - ): Promise<number> { - await this.blockingWait(5, true) - - const isSpendFromWalletChecked = await this.isSwitchChecked(spendFromSwitchSelector) - const spendFromWalletSwitch = await this.getSwitchElement(spendFromSwitchSelector) - if (fromWallet && !isSpendFromWalletChecked) { - await spendFromWalletSwitch.click() - } else if (!fromWallet && isSpendFromWalletChecked) { - await spendFromWalletSwitch.click() - } - - await this.Page.waitForSelector(balanceSelector) - const assetBalanceText = await this.Page.$eval(balanceSelector, (el) => el.textContent) - - if (assetBalanceText) { - const balance = assetBalanceText.split(' ')[0] - return parseFloat(balance) - } - - return 0 - } - - private async getFixedRatioCheckbox(): Promise<ElementHandle<Element>> { - await this.Page.waitForSelector(this.FixedRatioCheckboxSelector) - const fixedRateCheckbox = await this.Page.$(this.FixedRatioCheckboxSelector) - - // @ts-ignore TYPE NEEDS FIXING - return fixedRateCheckbox - } - - private async isFixedRatioChecked(): Promise<boolean> { - let fixedRatioChecked: boolean - - const fixedRatioCheckbox = await this.getFixedRatioCheckbox() - fixedRatioChecked = (await (await fixedRatioCheckbox.getProperty('checked')).jsonValue()) as boolean - - return fixedRatioChecked - } -} diff --git a/test/e2e/pages/pools/CreatePoolPage.ts b/test/e2e/pages/pools/CreatePoolPage.ts deleted file mode 100644 index 0feb333861..0000000000 --- a/test/e2e/pages/pools/CreatePoolPage.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { Dappeteer } from '@chainsafe/dappeteer' -import { Page } from 'puppeteer' - -import { AppPage } from '../AppPage' -import { CurrencySelectComponent } from '../shared/CurrencySelectComponent' - -export class CreatePoolPage extends AppPage { - // Page components - private CurrencySelectModal: CurrencySelectComponent - - // Page selectors - private ClassicContinueButtonSelector: string = '#btn-classic-continue' - private ClassicWithdrawFromSelector: string = '.switch-classic-withdraw-from-' - private PoolTypeButtonSelector: string = '#pool-select-' - private TokenSelectTriggerSelector: string = '.token-select-trigger' - private TokenAmountInputSelector: string = '.swap-panel-input input' - private FeeTierSelector: string = '#fee-tier-' - private ApproveButtonSelector: string = '#btn-approve' - private ReviewConfirmButtonSelector: string = '#btn-review-confirm' - private ConfirmCreationButtonSelector: string = '#btn-confirm-pool-creation' - private SuccessIconSelector: string = '#pool-creation-success' - - constructor(page: Page, metamask: Dappeteer, baseUrl: string) { - super(page, metamask, baseUrl) - - this.CurrencySelectModal = new CurrencySelectComponent(page) - } - - public async createPool( - poolType: string, - assetA: string, - assetB: string, - payAssetAFromWallet: boolean, - payAssetBFromWallet: boolean, - amountInA: string, - amountInB: string, - fee: number - ): Promise<void> { - // await this.setPoolType(poolType) - // await this.clickContinueButton() - await this.setAssetA(assetA, payAssetAFromWallet) - await this.setAssetB(assetB, payAssetBFromWallet) - await this.setAssetAAmountIn(amountInA) - await this.setAssetBAmountIn(amountInB) - await this.setPoolFee(fee) - await this.confirmCreate() - } - - public async setAssetA(symbol: string, payFromWallet: boolean): Promise<void> { - await this.setAsset(symbol, 0) - await this.setAssetPayFromWallet(payFromWallet, 0) - } - - public async setAssetB(symbol: string, payFromWallet: boolean): Promise<void> { - await this.setAsset(symbol, 1) - await this.setAssetPayFromWallet(payFromWallet, 1) - } - - private async setAssetPayFromWallet(payFromWallet: boolean, assetIndex: number): Promise<void> { - const selector = this.ClassicWithdrawFromSelector + assetIndex - - await this.Page.waitForSelector(selector) - const isSelectorChecked = await this.isSwitchChecked(selector) - const switchElement = await this.getSwitchElement(selector) - if (payFromWallet && !isSelectorChecked) { - await switchElement.click() - } else if (!payFromWallet && isSelectorChecked) { - await switchElement.click() - } - } - - private async setAsset(symbol: string, assetIndex: number): Promise<void> { - await this.Page.waitForSelector(this.TokenSelectTriggerSelector) - - const tokenSelectTriggers = await this.Page.$$(this.TokenSelectTriggerSelector) - if (tokenSelectTriggers.length > 1) { - await tokenSelectTriggers[assetIndex].click() - } else { - await tokenSelectTriggers[0].click() - } - - await this.CurrencySelectModal.selectToken(symbol) - } - - public async setAssetAAmountIn(amountIn: string): Promise<void> { - await this.setAssetAmountIn(amountIn, 0) - } - - public async setAssetBAmountIn(amountIn: string): Promise<void> { - await this.setAssetAmountIn(amountIn, 1) - } - - public async setPoolFee(fee: number): Promise<void> { - const feeTierButton = await this.Page.waitForSelector(this.FeeTierSelector + fee) - // @ts-ignore TYPE NEEDS FIXING - await feeTierButton.click() - } - - public async setPoolType(poolType: string): Promise<void> { - const poolTypeButton = await this.Page.waitForSelector(this.PoolTypeButtonSelector + poolType) - // @ts-ignore TYPE NEEDS FIXING - await poolTypeButton.click() - } - - public async clickContinueButton(): Promise<void> { - const continueButton = await this.Page.waitForSelector(this.ClassicContinueButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - await continueButton.click() - } - - public async confirmCreate(): Promise<void> { - await this.blockingWait(3, true) - let approveButton = await this.Page.$(this.ApproveButtonSelector) - while (approveButton) { - await approveButton.click() - await this.Metamask.confirmTransaction() - await this.bringToFront() - await this.blockingWait(3, true) - approveButton = await this.Page.$(this.ApproveButtonSelector) - } - - const btnReviewConfirm = await this.Page.waitForSelector(this.ReviewConfirmButtonSelector) - - const confirmButtonText = await this.Page.$eval(this.ReviewConfirmButtonSelector, (el) => el.textContent) - if (confirmButtonText === 'Pool already exists') { - return - } - - // @ts-ignore TYPE NEEDS FIXING - await btnReviewConfirm.click() - - const btnConfirmCreation = await this.Page.waitForSelector(this.ConfirmCreationButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - await btnConfirmCreation.click() - - await this.confirmMetamaskTransaction() - await this.Page.waitForSelector(this.SuccessIconSelector) - } - - private async setAssetAmountIn(amountIn: string, assetIndex: number): Promise<void> { - await this.Page.waitForSelector(this.TokenAmountInputSelector) - const tokenAmountInputs = await this.Page.$$(this.TokenAmountInputSelector) - await tokenAmountInputs[assetIndex].type(amountIn) - } -} diff --git a/test/e2e/pages/pools/LiquidityPoolsPage.ts b/test/e2e/pages/pools/LiquidityPoolsPage.ts deleted file mode 100644 index a0985a96e1..0000000000 --- a/test/e2e/pages/pools/LiquidityPoolsPage.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { AppPage } from '../AppPage' - -export class LiquidityPoolsPage extends AppPage { - protected Route: string = '/trident/pools' - - private CreateNewPoolButtonSelector: string = '#btn-create-new-pool' - - public async clickCreateNewPoolButton(): Promise<void> { - const createNewPoolButton = await this.Page.waitForSelector(this.CreateNewPoolButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - await createNewPoolButton.click() - } - - public async goToPool(poolName: string): Promise<void> { - if (!poolName) throw new Error('Pool name is required') - - const poolButton = await this.Page.waitForSelector(`#pool-${poolName}`) - - if (!poolButton) throw new Error(`Pool ${poolName} not found`) - await poolButton.click() - - await this.Page.waitForSelector(`#pool-title-${poolName}`) - } -} diff --git a/test/e2e/pages/pools/PoolPage.ts b/test/e2e/pages/pools/PoolPage.ts deleted file mode 100644 index 56870b3031..0000000000 --- a/test/e2e/pages/pools/PoolPage.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { ILiquidityInfo } from '../../interfaces/ILiquidityInfo' -import { AppPage } from '../AppPage' -export class PoolPage extends AppPage { - private DepositButtonSelector: string = '#btn-deposit > a' - private AddLiquidityButtonSelector: string = '#btn-add-stake-liquidity > a' - private RemoveLiquidityButtonSelector: string = '#btn-remove-liquidity > a' - - private PositionSlpSelector: string = '#my-position-header > div.flex.flex-col.text-right > div' - private Position0Selector: string = '#my-position-0' - private Position1Selector: string = '#my-position-1' - - public async clickAddLiquidityButton(): Promise<void> { - const depositButton = await this.Page.$(this.DepositButtonSelector) - const addLiquidityButton = await this.Page.$(this.AddLiquidityButtonSelector) - - if (depositButton) { - await this.evaluateAndClick(this.DepositButtonSelector) - } else if (addLiquidityButton) { - await this.evaluateAndClick(this.AddLiquidityButtonSelector) - } else { - throw new Error('No button found') - } - await this.Page.waitForNavigation() - } - - public async clickRemoveLiquidityButton(): Promise<void> { - const removeLiquidityButton = await this.Page.waitForSelector(this.RemoveLiquidityButtonSelector) - - if (removeLiquidityButton) { - await this.evaluateAndClick(this.RemoveLiquidityButtonSelector) - } else { - throw new Error('No button found') - } - - await this.Page.waitForNavigation() - } - - public async getPoolPosition(): Promise<ILiquidityInfo> { - let poolPosition: ILiquidityInfo = { - assetA: '', - assetB: '', - amountA: 0, - amountB: 0, - slpAmount: 0, - } - - const position0Element = await this.Page.waitForSelector(this.Position0Selector) - const position0Text = await this.Page.evaluate((element) => element.textContent, position0Element) - const position1Element = await this.Page.waitForSelector(this.Position1Selector) - const position1Text = await this.Page.evaluate((element) => element.textContent, position1Element) - const positionSlpElements = await this.Page.$$(this.PositionSlpSelector) - const positionSlpText = await this.Page.evaluate((element) => element.textContent, positionSlpElements[1]) - - poolPosition.assetA = position0Text.split(' ')[1].split('$')[0] - poolPosition.amountA = parseFloat(position0Text.split(' ')[0]) - poolPosition.assetB = position1Text.split(' ')[1].split('$')[0] - poolPosition.amountB = parseFloat(position1Text.split(' ')[0]) - poolPosition.slpAmount = parseFloat(positionSlpText.split(' ')[0]) - - return poolPosition - } -} diff --git a/test/e2e/pages/pools/RemoveLiquidityPage.ts b/test/e2e/pages/pools/RemoveLiquidityPage.ts deleted file mode 100644 index f47931aece..0000000000 --- a/test/e2e/pages/pools/RemoveLiquidityPage.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { ElementHandle } from 'puppeteer' - -import { ILiquidityInfo } from '../../interfaces/ILiquidityInfo' -import { AppPage } from '../AppPage' - -export class RemoveLiquidityPage extends AppPage { - private TxStatusDivSelector: string = 'div-tx-status' - private BackToPoolsButtonSelector: string = '#btn-withdraw-success-back' - private ModalConfirmWithdrawButtonSelector: string = '#btn-modal-confirm-withdrawal' - private ReviewAndConfirmButtonSelector: string = '#btn-confirm-remove-liquidity' - - private ApproveButtonSelector: string = '#btn-approve' - private FixedRatioCheckboxSelector: string = '#chk-fixed-ratio-withdraw' - private RemovePercentSelector: string = '#radio-option-' - - private WithdrawToSelector: string = '#txt-withdraw-to' - private CheckOutputToWalletSelector: string = '#chk-output-to-wallet' - - private EstimatedOutputTextSelector: string = '-min-liquidity-output' - - public async removeLiquidity(percent: number, outputToWallet: boolean, fixedRatio: boolean = false): Promise<void> { - await this.setRemovePercent(percent) - await this.setFixedRatio(fixedRatio) - await this.setWithdrawToWallet(outputToWallet) - await this.confirmWithdrawal() - } - - public async getMinLiquidityOutput(poolName: string): Promise<ILiquidityInfo> { - await this.blockingWait(1, true) - - const assets = poolName.toLowerCase().split('-') - const assetA = assets[0] - const assetB = assets[1] - - const estimatedOutput: ILiquidityInfo = { - assetA: assetA, - assetB: assetB, - amountA: await this.getEstimatedOutputForAsset(assetA), - amountB: await this.getEstimatedOutputForAsset(assetB), - } - - return estimatedOutput - } - - private async getEstimatedOutputForAsset(asset: string): Promise<number> { - const selector = `#` + asset + this.EstimatedOutputTextSelector - await this.Page.waitForSelector(selector) - - const assetAEstimatedOutputDiv = await this.Page.$(selector) - const estimatedOutputString = (await // @ts-ignore TYPE NEEDS FIXING - (await assetAEstimatedOutputDiv.getProperty('textContent')).jsonValue()) as string - - return parseFloat(estimatedOutputString) - } - - public async setFixedRatio(fixedRatio: boolean): Promise<void> { - await this.blockingWait(1, true) - const fixedRatioCheckbox = await this.getFixedRatioCheckbox() - - if (fixedRatio && !(await this.isFixedRatioChecked())) { - await fixedRatioCheckbox.click() - } else if (!fixedRatio && (await this.isFixedRatioChecked())) { - await fixedRatioCheckbox.click() - } - } - - public async confirmWithdrawal(): Promise<void> { - await this.blockingWait(1, true) - const approveButton = await this.Page.$(this.ApproveButtonSelector) - if (approveButton) { - await approveButton.click() - await this.Metamask.sign() - await this.Metamask.page.waitForTimeout(1000) - await this.bringToFront() - } - - const reviewConfirmButton = await this.Page.waitForSelector(this.ReviewAndConfirmButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - await reviewConfirmButton.click() - await this.Page.waitForTimeout(500) - - const modalConfirmWithdrawButton = await this.Page.waitForSelector(this.ModalConfirmWithdrawButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - await modalConfirmWithdrawButton.click() - - await this.confirmMetamaskTransaction() - - await this.Page.waitForXPath(`//div[@id='${this.TxStatusDivSelector}' and contains(., 'Success')]`) - - await this.blockingWait(5) - } - - public async setWithdrawToWallet(withdrawToWallet: boolean): Promise<void> { - await this.blockingWait(1, true) - const withdrawToElement = await this.Page.waitForSelector(this.WithdrawToSelector) - const withdrawTo = await this.Page.evaluate((el) => el.textContent, withdrawToElement) - - const outputSelector = await this.Page.waitForSelector(this.CheckOutputToWalletSelector) - // @ts-ignore TYPE NEEDS FIXING - const outputSelectorButton = (await outputSelector.$x('..'))[0] - - if (withdrawToWallet && withdrawTo.toLowerCase() !== 'wallet') { - await outputSelectorButton.click() - } else if (!withdrawToWallet && withdrawTo.toLowerCase() !== 'bentobox') { - await outputSelectorButton.click() - } - } - - public async setRemovePercent(percent: number): Promise<void> { - await this.blockingWait(1, true) - const percentSelectionButton = await this.Page.waitForSelector(this.RemovePercentSelector + percent.toString()) - // @ts-ignore TYPE NEEDS FIXING - await percentSelectionButton.click() - } - - private async getFixedRatioCheckbox(): Promise<ElementHandle<Element>> { - await this.Page.waitForSelector(this.FixedRatioCheckboxSelector) - const fixedRateCheckbox = await this.Page.$(this.FixedRatioCheckboxSelector) - - // @ts-ignore TYPE NEEDS FIXING - return fixedRateCheckbox - } - - private async isFixedRatioChecked(): Promise<boolean> { - let fixedRatioChecked: boolean - - const fixedRatioCheckbox = await this.getFixedRatioCheckbox() - fixedRatioChecked = (await (await fixedRatioCheckbox.getProperty('checked')).jsonValue()) as boolean - - return fixedRatioChecked - } -} diff --git a/test/e2e/pages/shared/CurrencySelectComponent.ts b/test/e2e/pages/shared/CurrencySelectComponent.ts deleted file mode 100644 index 6e366e4af6..0000000000 --- a/test/e2e/pages/shared/CurrencySelectComponent.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AppPageComponent } from '../AppPageComponent' - -export class CurrencySelectComponent extends AppPageComponent { - // Selectors - private SelectTokenInputSelector: string = '#txt-select-token' - private AllCurrenciesListSelector: string = '#all-currencies-list' - private SelectTokenResultsSelector: string = '.token-' - - public async selectToken(tokenSymbol: string): Promise<void> { - await this.Page.waitForSelector(this.AllCurrenciesListSelector) - await this.blockingWait(3) - - const tokenSelector = this.SelectTokenResultsSelector + tokenSymbol - - const tokenButton = await this.Page.$(tokenSelector) - - if (tokenButton) { - // @ts-ignore TYPE NEEDS FIXING - await tokenButton.click() - } - } -} diff --git a/test/e2e/pages/swap/SwapPage.ts b/test/e2e/pages/swap/SwapPage.ts deleted file mode 100644 index cafdde5569..0000000000 --- a/test/e2e/pages/swap/SwapPage.ts +++ /dev/null @@ -1,426 +0,0 @@ -import { Dappeteer } from '@chainsafe/dappeteer' -import { ElementHandle, Page } from 'puppeteer' - -import { SwapType } from '../../enums/SwapType' -import { AppPage } from '../AppPage' -import { CurrencySelectComponent } from '../shared/CurrencySelectComponent' - -export class SwapPage extends AppPage { - protected Route: string = '/trident/swap' - - // Components - private CurrencySelectModal: CurrencySelectComponent - - constructor(page: Page, metamask: Dappeteer, baseUrl: string) { - super(page, metamask, baseUrl) - - this.CurrencySelectModal = new CurrencySelectComponent(page) - } - - // Main swap panel selectors - private TokenInputSelector: string = '.swap-panel-input input' - private PayFromWalletSelector: string = '.chk-pay-from-wallet' - private ReceiveToWalletSelector: string = '.chk-receive-to-wallet' - private SwapButtonSelector: string = '#swap-button' - private WrapButtonSelector: string = '#wrap-button' - private UseMaxButtonSelector: string = '.btn-max' - private BalanceLabelSelector: string = '#text-balance-' - private SwitchCurrenciesButtonSelector: string = '#btn-switch-currencies' - - // Swap rate selectors - private ExchangeRateButtonSelector: string = '#btn-exchange-rate' - - // Swap review modal selectors - private ConfirmSwapButtonSelector: string = '#confirm-swap-or-send' - private TxSubmittedSelector: string = '#text-transaction-submitted' - - // Token selector & - private InTokenButtonSelector: string = '#asset-select-trigger-0' - private OutTokenButtonSelector: string = '#asset-select-trigger-1' - - // Tx settings - private TxSettingsButtonSelector: string = '#btn-transaction-settings' - private SlippageInputSelector: string = '#text-slippage' - private ExpertModeToggleSelector: string = '#toggle-expert-mode-button' - - //Confirm expert Mode Modal - private ConfirmExpertModeSelector: string = '#confirm-expert-mode' - - // Add recipient - private AddRecipientButtonSelector: string = '#btn-add-recipient' - private RecipientInputSelector: string = '#recipient-input' - - private ApproveButtonSelector: string = '#btn-approve' - - private TradeTypeSelector: string = '#trade-type' - - public async swapTokens( - inTokenSymbol: string, - outTokenSymbol: string, - inTokenAmount: string, - payFromWallet: boolean, - receiveToWallet: boolean - ): Promise<void> { - await this.setInputToken(inTokenSymbol) - await this.setOutputToken(outTokenSymbol) - await this.setAmountIn(inTokenAmount) - - const isPayFromWalletChecked = await this.isSwitchChecked(this.PayFromWalletSelector) - const payFromWalletSwitch = await this.getSwitchElement(this.PayFromWalletSelector) - if (payFromWallet && !isPayFromWalletChecked) { - await payFromWalletSwitch.click() - } else if (!payFromWallet && isPayFromWalletChecked) { - await payFromWalletSwitch.click() - } - - const isReceiveToWalletChecked = await this.isSwitchChecked(this.ReceiveToWalletSelector) - const receiveToWalletSwitch = await this.getSwitchElement(this.ReceiveToWalletSelector) - if (receiveToWallet && !isReceiveToWalletChecked) { - await receiveToWalletSwitch.click() - } else if (!receiveToWallet && isReceiveToWalletChecked) { - await receiveToWalletSwitch.click() - } - - await this.confirmSwap(inTokenSymbol, outTokenSymbol) - } - - // Swap Rate Component - public async getExchangeRate(): Promise<string> { - await this.blockingWait(1, true) - await this.Page.waitForSelector(this.ExchangeRateButtonSelector) - const rate = await this.Page.$(this.ExchangeRateButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - const rateText = (await (await rate.getProperty('textContent')).jsonValue()) as string - return rateText - } - - // Swap Asset Panel - public async setInputToken(tokenSymbol: string): Promise<void> { - await this.blockingWait(1, true) - - const selectedInToken = await this.getSelectedInputToken() - if (selectedInToken === tokenSymbol) { - return - } - - const inputTokenButton = await this.Page.waitForSelector(this.InTokenButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - await inputTokenButton.click() - await this.selectToken(tokenSymbol) - } - - public async setOutputToken(tokenSymbol: string): Promise<void> { - await this.blockingWait(1, true) - - const selectedOutToken = await this.getSelectedOutputToken() - if (selectedOutToken === tokenSymbol) { - return - } - - const outputTokenButton = await this.Page.waitForSelector(this.OutTokenButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - await outputTokenButton.click() - await this.selectToken(tokenSymbol) - } - - private async selectToken(tokenSymbol: string): Promise<void> { - await this.CurrencySelectModal.selectToken(tokenSymbol) - } - - public async setAmountIn(inTokenAmount: string): Promise<void> { - await this.Page.waitForTimeout(500) - const tokenAmountInput = await this.Page.waitForSelector(this.TokenInputSelector) - // @ts-ignore TYPE NEEDS FIXING - await tokenAmountInput.type(inTokenAmount) - } - - public async getInputTokenAmount(): Promise<string> { - await this.blockingWait(1, true) - await this.Page.waitForSelector(this.TokenInputSelector) - const tokenInput = await this.Page.$(this.TokenInputSelector) - - // @ts-ignore TYPE NEEDS FIXING - const inTokenAmount = (await (await tokenInput.getProperty('value')).jsonValue()) as string - return inTokenAmount - } - - public async getMinOutputAmount(): Promise<string> { - await this.blockingWait(1, true) - await this.Page.waitForSelector(this.TokenInputSelector) - const tokenOutput = await this.Page.$$(this.TokenInputSelector) - - const outTokenAmount = (await (await tokenOutput[1].getProperty('value')).jsonValue()) as string - return outTokenAmount - } - - public async setPayFromWallet(payFromWallet: boolean): Promise<void> { - await this.setFunding(payFromWallet, this.PayFromWalletSelector) - } - - public async setReceiveToWallet(receiveToWallet: boolean): Promise<void> { - await this.setFunding(receiveToWallet, this.ReceiveToWalletSelector) - } - - private async setFunding(useFundingMethod: boolean, selector: string): Promise<void> { - await this.blockingWait(3, true) - const isSelectorChecked = await this.isSwitchChecked(selector) - const switchElement = await this.getSwitchElement(selector) - if (useFundingMethod && !isSelectorChecked) { - await switchElement.click() - } else if (!useFundingMethod && isSelectorChecked) { - await switchElement.click() - } - } - - public async getSelectedInputToken(): Promise<string> { - return await this.getSelectedToken(this.InTokenButtonSelector) - } - - public async getSelectedOutputToken(): Promise<string> { - return await this.getSelectedToken(this.OutTokenButtonSelector) - } - - private async getSelectedToken(selector: string): Promise<string> { - await this.blockingWait(1, true) - await this.Page.waitForSelector(selector) - const tokenButton = await this.Page.$(selector) - // @ts-ignore TYPE NEEDS FIXING - const selectedToken = (await (await tokenButton.getProperty('textContent')).jsonValue()) as string - return selectedToken - } - - public async getInputTokenBalance(): Promise<string> { - await this.blockingWait(3, true) - await this.Page.waitForSelector(this.InTokenButtonSelector) - const inputTokenLabel = await this.Page.$(this.InTokenButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - const inToken = (await (await inputTokenLabel.getProperty('textContent')).jsonValue()) as string - - const balanceLabel = await this.Page.waitForSelector(`#text-balance-${inToken}`) - // @ts-ignore TYPE NEEDS FIXING - const inTokenBalance = (await (await balanceLabel.getProperty('textContent')).jsonValue()) as string - - return inTokenBalance - } - - public async getTokenBalance(tokenSymbol: string, fromWallet: boolean = true): Promise<number> { - await this.blockingWait(1, true) - - await this.setInputToken(tokenSymbol) - await this.setPayFromWallet(fromWallet) - - const balance = await this.getInputTokenBalance() - - return parseFloat(balance) - } - - // Swap Review Component - public async confirmSwap(inTokenSymbol: string, outTokenSymbol: string): Promise<void> { - await this.blockingWait(1) - - const swapType: SwapType = this.getSwapType(inTokenSymbol, outTokenSymbol) - - switch (swapType) { - case SwapType.Wrap: - case SwapType.Unwrap: - const wrapButon = await this.Page.waitForSelector(this.WrapButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - await wrapButon.click() - - await this.blockingWait(1) - break - - case SwapType.Normal: - default: - const swapButon = await this.Page.waitForSelector(this.SwapButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - await swapButon.click() - - await this.blockingWait(1) - const confirmSwapButton = await this.Page.waitForSelector(this.ConfirmSwapButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - await confirmSwapButton.click() - break - } - - await this.confirmMetamaskTransaction() - - if (swapType === SwapType.Normal) { - await this.Page.waitForSelector(this.TxSubmittedSelector) - await this.blockingWait(5) // wait for tx - } - } - - // Settings Tab - public async toggleExpertMode(): Promise<void> { - await this.blockingWait(1, true) - - const TxSettingsButtonSelector = await this.Page.waitForSelector(this.TxSettingsButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - await TxSettingsButtonSelector.click() - - const expertModeToggle = await this.Page.waitForSelector(this.ExpertModeToggleSelector) - // @ts-ignore TYPE NEEDS FIXING - await expertModeToggle.click() - - const confirmExpertModeButton = await this.Page.$(this.ConfirmExpertModeSelector) - if (confirmExpertModeButton) { - await confirmExpertModeButton.click() - } - } - - public async setSlippage(slippage: string): Promise<void> { - await this.blockingWait(1, true) - - const TxSettingsButtonSelector = await this.Page.waitForSelector(this.TxSettingsButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - await TxSettingsButtonSelector.click() - - const slippageInput = await this.Page.waitForSelector(this.SlippageInputSelector) - - // @ts-ignore TYPE NEEDS FIXING - await slippageInput.click({ clickCount: 3 }) - // @ts-ignore TYPE NEEDS FIXING - await slippageInput.type(slippage) - - // @ts-ignore TYPE NEEDS FIXING - await TxSettingsButtonSelector.click() - } - - public async getSlippage(): Promise<string> { - await this.blockingWait(1, true) - - const TxSettingsButtonSelector = await this.Page.waitForSelector(this.TxSettingsButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - await TxSettingsButtonSelector.click() - - await this.Page.waitForSelector(this.SlippageInputSelector) - - const slippageInputTextBox = await this.Page.$(this.SlippageInputSelector) - // @ts-ignore TYPE NEEDS FIXING - const slippage = (await (await slippageInputTextBox.getProperty('value')).jsonValue()) as string - return slippage - } - - // Recipient Panel - public async setRecipient(recipient: string): Promise<void> { - await this.blockingWait(1, true) - - const addRecipientButton = await this.Page.waitForSelector(this.AddRecipientButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - addRecipientButton.click() - - const recipientInput = await this.Page.waitForSelector(this.RecipientInputSelector) - // @ts-ignore TYPE NEEDS FIXING - await recipientInput.type(recipient) - } - - public async getRecipient(): Promise<string> { - await this.blockingWait(1, true) - - let recipientInputBox: ElementHandle<Element> - // @ts-ignore TYPE NEEDS FIXING - recipientInputBox = await this.Page.$(this.RecipientInputSelector) - - if (!recipientInputBox) { - return '' - } - - const recipient = (await (await recipientInputBox.getProperty('value')).jsonValue()) as string - return recipient - } - - public async clickSwitchCurrenciesButton(): Promise<void> { - await this.blockingWait(1, true) - const switchCurrenciesButton = await this.Page.waitForSelector(this.SwitchCurrenciesButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - await switchCurrenciesButton.click() - await this.blockingWait(1, true) - } - - public async getSwapButtonText(): Promise<string> { - await this.blockingWait(1, true) - - await this.Page.waitForSelector(this.SwapButtonSelector) - const swapButton = await this.Page.$(this.SwapButtonSelector) - - // @ts-ignore TYPE NEEDS FIXING - const swapButtonText = (await (await swapButton.getProperty('textContent')).jsonValue()) as string - return swapButtonText - } - - public async clickMaxButton(): Promise<void> { - await this.blockingWait(3, true) - await this.Page.waitForSelector(this.UseMaxButtonSelector) - const useMaxButton = await this.Page.$$(this.UseMaxButtonSelector) - await useMaxButton[1].click() - await this.blockingWait(1, true) - } - - public async clickInvertRateButton(): Promise<void> { - await this.blockingWait(1, true) - const invertRateButton = await this.Page.waitForSelector(this.ExchangeRateButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - await invertRateButton.click() - } - - public async getBentoBalance(tokenSymbol: string): Promise<string> { - await this.blockingWait(1, true) - await this.Page.bringToFront() - await this.setInputToken(tokenSymbol) - - await this.setPayFromWallet(false) - - const balance = await this.getInputTokenBalance() - - return balance - } - - public async getWalletBalance(tokenSymbol: string): Promise<string> { - await this.blockingWait(1, true) - await this.Page.bringToFront() - await this.setInputToken(tokenSymbol) - - await this.setPayFromWallet(true) - - const balance = await this.getInputTokenBalance() - - return balance - } - - public async requiresApproval(): Promise<boolean> { - await this.blockingWait(1, true) - const approveButton = await this.Page.$(this.ApproveButtonSelector) - return approveButton !== null - } - - public async approveToken(): Promise<void> { - await this.blockingWait(1, true) - const approveButton = await this.Page.waitForSelector(this.ApproveButtonSelector) - // @ts-ignore TYPE NEEDS FIXING - await approveButton.click() - await this.Metamask.confirmTransaction() - await this.Metamask.page.waitForTimeout(1000) - await this.bringToFront() - await this.blockingWait(5, true) - } - - private getSwapType(inTokenSymbol: string, outTokenSymbol: string): SwapType { - if (inTokenSymbol === 'ETH' && outTokenSymbol === 'WETH') { - return SwapType.Wrap - } else if (inTokenSymbol === 'WETH' && outTokenSymbol === 'ETH') { - return SwapType.Unwrap - } else { - return SwapType.Normal - } - } - - public async getTradeType(): Promise<string> { - await this.Page.waitForSelector(this.TradeTypeSelector) - - const tradeTypeInput = await this.Page.$(this.TradeTypeSelector) - // @ts-ignore TYPE NEEDS FIXING - const tradeType = (await (await tradeTypeInput.getProperty('textContent')).jsonValue()) as string - return tradeType.toLowerCase() - } -} diff --git a/test/e2e/portfolio.test.ts b/test/e2e/portfolio.test.ts deleted file mode 100644 index f87bd9a57c..0000000000 --- a/test/e2e/portfolio.test.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { Dappeteer } from '@chainsafe/dappeteer' -import { closeValues } from '@sushiswap/trident-sdk' -import { Browser, Page } from 'puppeteer' - -import { ADDRESSES } from './constants/Index' -import { BentoHelper } from './helpers/BentoHelper' -import { TestHelper } from './helpers/TestHelper' -import { MyBentoBoxPage } from './pages/balances/MyBentoBoxPage' -import { MyWalletPage } from './pages/balances/MyWalletPage' - -let browser: Browser -let page: Page -let metamask: Dappeteer - -let myWalletPage: MyWalletPage -let myBentoBoxPage: MyBentoBoxPage -let bentoHelper: BentoHelper - -require('dotenv').config() - -let baseUrl: string = process.env.TEST_BASE_URL || 'http://localhost:3000' - -jest.retryTimes(1) - -describe('Balances:', () => { - beforeAll(async () => { - ;[metamask, browser, page] = await TestHelper.initDappeteer() - myWalletPage = new MyWalletPage(page, metamask, baseUrl) - myBentoBoxPage = new MyBentoBoxPage(page, metamask, baseUrl) - bentoHelper = new BentoHelper() - - await myWalletPage.addTokenToMetamask(ADDRESSES.WETH) - await myWalletPage.addTokenToMetamask(ADDRESSES.USDC) - await myWalletPage.addTokenToMetamask(ADDRESSES.BAT) - await myWalletPage.addTokenToMetamask(ADDRESSES.USDT) - await myWalletPage.addTokenToMetamask(ADDRESSES.DAI) - await myWalletPage.addTokenToMetamask(ADDRESSES.COMP) - - await page.goto(baseUrl) - await page.bringToFront() - - await myWalletPage.connectMetamaskWallet() - }) - - beforeEach(async () => {}) - - afterAll(async () => { - browser.close() - }) - - test('Should get correct wallet balances', async () => { - await myWalletPage.navigateTo() - const appBalances = await myWalletPage.getWalletBalances() - - for (let balance in appBalances) { - const tokenSymbol = balance.toUpperCase() - const appBalance = appBalances[balance] - const mmBalance = await myWalletPage.getMetamaskTokenBalance(tokenSymbol) - - expect(closeValues(appBalance, mmBalance, 1e-5)).toBe(true) - } - }) - - test('Should get correct BentoBox balances', async () => { - await myBentoBoxPage.navigateTo() - const appBalances = await myBentoBoxPage.getBentoBalances() - - for (let balance in appBalances) { - const tokenSymbol = balance.toUpperCase() - const appBalance = appBalances[balance] - const bentoBalance = await bentoHelper.getBentoBalance(tokenSymbol) - - expect(closeValues(appBalance, bentoBalance, 1e-5)).toBe(true) - } - }) -}) diff --git a/test/e2e/removeLiquidity.test.ts b/test/e2e/removeLiquidity.test.ts deleted file mode 100644 index 479b9141b9..0000000000 --- a/test/e2e/removeLiquidity.test.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { Dappeteer } from '@chainsafe/dappeteer' -import { closeValues } from '@sushiswap/trident-sdk' -import { Browser, Page } from 'puppeteer' - -import { FUNDING_SOURCE, RATIO } from './constants/Index' -import { TestHelper } from './helpers/TestHelper' -import { AddLiquidityPage } from './pages/pools/AddLiquidityPage' -import { LiquidityPoolsPage } from './pages/pools/LiquidityPoolsPage' -import { PoolPage } from './pages/pools/PoolPage' -import { RemoveLiquidityPage } from './pages/pools/RemoveLiquidityPage' - -require('dotenv').config() - -let baseUrl: string = process.env.TEST_BASE_URL || 'http://localhost:3000' - -let browser: Browser -let page: Page -let metamask: Dappeteer - -let liquidityPoolsPage: LiquidityPoolsPage -let removeLiquidityPage: RemoveLiquidityPage -let addLiquidityPage: AddLiquidityPage -let poolPage: PoolPage - -async function initPages() { - liquidityPoolsPage = new LiquidityPoolsPage(page, metamask, baseUrl) - poolPage = new PoolPage(page, metamask) - addLiquidityPage = new AddLiquidityPage(page, metamask) - removeLiquidityPage = new RemoveLiquidityPage(page, metamask) -} - -jest.retryTimes(1) - -describe('Remove Liquidity:', () => { - beforeAll(async () => { - ;[metamask, browser, page] = await TestHelper.initDappeteer() - await initPages() - }) - - afterAll(async () => { - browser.close() - }) - - test.each([ - [25, RATIO.EQUAL, FUNDING_SOURCE.BENTO], - [25, RATIO.EQUAL, FUNDING_SOURCE.WALLET], - ])(`Remove %p percent in %p amounts and withdraw to %p`, async (removePercent, ratio, receiveTo) => { - const targetPoolName = 'USDC-WETH' - const fixedRatio = ratio === RATIO.EQUAL - const withdrawToWallet = receiveTo === FUNDING_SOURCE.WALLET - // USDC: Asset A - // WETH: Asset B - - await liquidityPoolsPage.navigateTo() - await liquidityPoolsPage.connectMetamaskWallet() - await liquidityPoolsPage.goToPool(targetPoolName) - - const poolLink = page.url() - - // Get position & balances before - const positionBeforeWithdraw = await poolPage.getPoolPosition() - expect(positionBeforeWithdraw.assetA).toEqual('USDC') - expect(positionBeforeWithdraw.assetB).toEqual('WETH') - expect(positionBeforeWithdraw.amountA || positionBeforeWithdraw.amountB).toBeGreaterThan(0) - - await poolPage.clickAddLiquidityButton() - - const usdcBalanceBefore = await addLiquidityPage.getAssetABalance(withdrawToWallet) - const ethBalanceBefore = await addLiquidityPage.getAssetBBalance(withdrawToWallet) - - // Set up page before confirm - await liquidityPoolsPage.navigateTo() - await liquidityPoolsPage.goToPool(targetPoolName) - await poolPage.clickRemoveLiquidityButton() - - await removeLiquidityPage.setRemovePercent(removePercent) - await removeLiquidityPage.setFixedRatio(fixedRatio) - await removeLiquidityPage.setWithdrawToWallet(withdrawToWallet) - - const minLiquidityOutput = await removeLiquidityPage.getMinLiquidityOutput(targetPoolName) - - await removeLiquidityPage.confirmWithdrawal() - - await page.goto(poolLink) - await page.waitForSelector(`#pool-title-${targetPoolName}`) - - // Get position & balances after - const positionAfterDeposit = await poolPage.getPoolPosition() - expect(positionAfterDeposit.assetA).toEqual('USDC') - expect(positionAfterDeposit.assetB).toEqual('WETH') - - await poolPage.clickAddLiquidityButton() - - const usdcBalanceAfter = await addLiquidityPage.getAssetABalance(withdrawToWallet) - const ethBalanceAfter = await addLiquidityPage.getAssetBBalance(withdrawToWallet) - - const usdcBalanceDiff = usdcBalanceAfter - usdcBalanceBefore - const ethBalanceDiff = ethBalanceAfter - ethBalanceBefore - - expect(closeValues(usdcBalanceDiff, minLiquidityOutput.amountA, 1e-9)).toBe(true) - expect(closeValues(ethBalanceDiff, minLiquidityOutput.amountB, 1e-9)).toBe(true) - }) -}) diff --git a/test/e2e/swap.test.ts b/test/e2e/swap.test.ts deleted file mode 100644 index a902476518..0000000000 --- a/test/e2e/swap.test.ts +++ /dev/null @@ -1,430 +0,0 @@ -import { Dappeteer } from '@chainsafe/dappeteer' -import { closeValues } from '@sushiswap/trident-sdk' -import { Browser, Page } from 'puppeteer' - -import { ADDRESSES, FUNDING_SOURCE } from './constants/Index' -import { ApprovalHelper } from './helpers/ApprovalHelper' -import { TestHelper } from './helpers/TestHelper' -import { SwapPage } from './pages/swap/SwapPage' - -let browser: Browser -let page: Page -let metamask: Dappeteer - -let swapPage: SwapPage - -require('dotenv').config() - -let baseUrl: string = process.env.TEST_BASE_URL || 'http://localhost:3000' -let account2PubKey: string = process.env.TEST_ACCOUNT2_PUB_KEY || '' -let approvalHelper: ApprovalHelper -let depositPercentage = 0.01 - -const cases = [ - ['ETH', FUNDING_SOURCE.WALLET, 'USDC', FUNDING_SOURCE.WALLET], - ['WETH', FUNDING_SOURCE.WALLET, 'USDC', FUNDING_SOURCE.WALLET], - ['USDC', FUNDING_SOURCE.WALLET, 'ETH', FUNDING_SOURCE.WALLET], - ['USDC', FUNDING_SOURCE.WALLET, 'WETH', FUNDING_SOURCE.WALLET], - ['ETH', FUNDING_SOURCE.WALLET, 'WETH', FUNDING_SOURCE.WALLET], - ['WETH', FUNDING_SOURCE.WALLET, 'ETH', FUNDING_SOURCE.WALLET], -] - -const currencySelectCases = [ - ['ETH', 'DAI'], - ['WETH', 'USDC'], - ['BAT', 'SUSHI'], -] - -jest.retryTimes(1) - -describe('Swap:', () => { - beforeAll(async () => { - ;[metamask, browser, page] = await TestHelper.initDappeteer() - swapPage = new SwapPage(page, metamask, baseUrl) - approvalHelper = new ApprovalHelper() - - await page.goto(baseUrl) - await page.bringToFront() - - await swapPage.connectMetamaskWallet() - await swapPage.addTokenToMetamask(ADDRESSES.WETH) - await swapPage.addTokenToMetamask(ADDRESSES.USDC) - await swapPage.addTokenToMetamask(ADDRESSES.BAT) - }) - - beforeEach(async () => { - await swapPage.navigateTo() - await swapPage.blockingWait(2, true) - }) - - afterAll(async () => { - browser.close() - }) - - test.each(cases)(`Should swap from %p %p to %p %p`, async (inToken, payFrom, outToken, receiveTo) => { - const payFromWallet = payFrom === FUNDING_SOURCE.WALLET ? true : false - const receiveToWallet = receiveTo === FUNDING_SOURCE.WALLET ? true : false - const inputTokenBalanceBefore = await swapPage.getTokenBalance(inToken, payFromWallet) - const outputTokenBalanceBefore = await swapPage.getTokenBalance(outToken, receiveToWallet) - - if (!(inputTokenBalanceBefore > 0)) throw new Error(`${inToken} wallet balance is 0. Can't execute swap`) - - const swapAmount = (inputTokenBalanceBefore * depositPercentage).toFixed(5) - - await swapPage.setInputToken(inToken) - await swapPage.setOutputToken(outToken) - await swapPage.setAmountIn(swapAmount) - await swapPage.setPayFromWallet(payFromWallet) - await swapPage.setReceiveToWallet(receiveToWallet) - - const minOutputAmount = await swapPage.getMinOutputAmount() - await swapPage.confirmSwap(inToken, outToken) - - await swapPage.navigateTo() - - const inputTokenBalanceAfter = await swapPage.getTokenBalance(inToken, payFromWallet) - const outputTokenBalanceAfter = await swapPage.getTokenBalance(outToken, receiveToWallet) - - const intputTokenBalanceDiff = inputTokenBalanceBefore - inputTokenBalanceAfter - const outputTokenBalanceDiff = outputTokenBalanceAfter - outputTokenBalanceBefore - - expect(closeValues(intputTokenBalanceDiff, parseFloat(swapAmount), 1e-9)).toBe(true) - expect(closeValues(outputTokenBalanceDiff, parseFloat(minOutputAmount), 1e-9)).toBe(true) - }) - - test('Should click max button for wallet', async () => { - await swapPage.setInputToken('USDC') - - const inputTokenBalance = await swapPage.getInputTokenBalance() - - await page.evaluate(() => { - // @ts-ignore - document.querySelector('#text-balance-USDC').click() - }) - - const inputTokenAmount = await swapPage.getInputTokenAmount() - - expect(closeValues(parseFloat(inputTokenBalance), parseFloat(inputTokenAmount), 1e-3)).toBe(true) - }) - - test('Should click max button for bento', async () => { - await swapPage.setPayFromWallet(false) - - await swapPage.setInputToken('USDC') - - const inputTokenBalance = await swapPage.getInputTokenBalance() - - await page.evaluate(() => { - // @ts-ignore - document.querySelector('#text-balance-USDC').click() - }) - - const inputTokenAmount = await swapPage.getInputTokenAmount() - - expect(closeValues(parseFloat(inputTokenBalance), parseFloat(inputTokenAmount), 1e-3)).toBe(true) - }) - - test('Should switch currencies', async () => { - await swapPage.setInputToken('USDC') - await swapPage.setOutputToken('WETH') - - const selectedInputTokenBefore = await swapPage.getSelectedInputToken() - const selectedOutputTokenBefore = await swapPage.getSelectedOutputToken() - - expect(selectedInputTokenBefore).toBe('USDC') - expect(selectedOutputTokenBefore).toBe('WETH') - - await swapPage.clickSwitchCurrenciesButton() - - const selectedInputTokenAfter = await swapPage.getSelectedInputToken() - const selectedOutputTokenAfter = await swapPage.getSelectedOutputToken() - - expect(selectedInputTokenAfter).toBe('WETH') - expect(selectedOutputTokenAfter).toBe('USDC') - }) - - test.each(currencySelectCases)(`Should select %p as input and %p as output`, async (inToken, outToken) => { - await swapPage.setInputToken(inToken) - await swapPage.setOutputToken(outToken) - - const selectedInputTokenBefore = await swapPage.getSelectedInputToken() - const selectedOutputTokenBefore = await swapPage.getSelectedOutputToken() - - expect(selectedInputTokenBefore).toBe(inToken) - expect(selectedOutputTokenBefore).toBe(outToken) - }) - - test('Should invert rate', async () => { - const inputAmount = 500 - - await swapPage.setInputToken('ETH') - await swapPage.setOutputToken('USDC') - - await swapPage.setAmountIn(inputAmount.toString()) - - const outputAmount = await swapPage.getMinOutputAmount() - - const usdcWethRateDisplayed = await swapPage.getExchangeRate() - const usdcWethRateExpected = parseFloat(outputAmount) / inputAmount - const usdcWethRate = usdcWethRateDisplayed.split('=')[1].trim().split(' ')[0] - - expect(closeValues(usdcWethRateExpected, parseFloat(usdcWethRate), 1e-3)).toBe(true) - - await swapPage.clickInvertRateButton() - const wethUsdcRateDispayed = await swapPage.getExchangeRate() - const wethUsdcRateExpected = inputAmount / parseFloat(outputAmount) - const wethUsdcRate = wethUsdcRateDispayed.split('=')[1].trim().split(' ')[0] - - expect(closeValues(wethUsdcRateExpected, parseFloat(wethUsdcRate), 1e-3)).toBe(true) - }) - - test('Should change slippage', async () => { - await swapPage.setSlippage('25.00') - - const slippage = await swapPage.getSlippage() - - expect(slippage).toBe('25.00') - }) - - test.skip('Should swap ETH from wallet to USDC bento with other recipient', async () => { - const inToken = 'ETH' - const outToken = 'USDC' - - let recipientBrowser: Browser - let recipientPage: Page - let recipientMetamask: Dappeteer - ;[recipientMetamask, recipientBrowser, recipientPage] = await TestHelper.initDappeteer( - process.env.TEST_SEED2, - process.env.TEST_PASS - ) - - try { - const recipientSwapPage = new SwapPage(recipientPage, recipientMetamask, baseUrl) - await recipientPage.goto(baseUrl) - await recipientPage.bringToFront() - await recipientSwapPage.connectMetamaskWallet() - - await recipientSwapPage.navigateTo() - const account2BentoBalanceBefore = await recipientSwapPage.getBentoBalance(outToken) - - const tokenWalletBalance = await swapPage.getMetamaskTokenBalance(inToken) - if (!(tokenWalletBalance > 0)) - throw new Error(`${inToken} wallet balance is 0 or could not be read from Metamask`) - - const swapAmount = (tokenWalletBalance * 0.01).toFixed(5) - - await swapPage.navigateTo() - await swapPage.toggleExpertMode() - await swapPage.setRecipient(account2PubKey) - await swapPage.setInputToken(inToken) - await swapPage.setOutputToken(outToken) - await swapPage.setAmountIn(swapAmount) - await swapPage.setPayFromWallet(true) - await swapPage.setReceiveToWallet(false) - - const expectedOutputAmount = await swapPage.getMinOutputAmount() - await swapPage.confirmSwap(inToken, outToken) - - const account2BentoBalanceAfter = await recipientSwapPage.getBentoBalance(outToken) - expect(account2BentoBalanceAfter !== account2BentoBalanceBefore).toBe(true) - - const account2BalanceDifference = parseFloat(account2BentoBalanceAfter) - parseFloat(account2BentoBalanceBefore) - expect(closeValues(parseFloat(expectedOutputAmount), account2BalanceDifference, 1e-3)).toBe(true) - } catch (error) { - throw error - } finally { - await recipientBrowser.close() - } - }) - - test.skip.each([ - ['USDC', FUNDING_SOURCE.WALLET, 'ETH', FUNDING_SOURCE.BENTO], - ['USDC', FUNDING_SOURCE.BENTO, 'ETH', FUNDING_SOURCE.BENTO], - ])(`Should add WETH to Bento when swapping from %p %p to %p %p`, async (inToken, payFrom, outToken, receiveTo) => { - const tokenWalletBalance = await swapPage.getMetamaskTokenBalance(inToken) - if (!(tokenWalletBalance > 0)) throw new Error(`${inToken} wallet balance is 0 or could not be read from Metamask`) - - await swapPage.navigateTo() - - const swapAmount = (tokenWalletBalance * 0.01).toFixed(5) - const payFromWallet = payFrom === FUNDING_SOURCE.WALLET ? true : false - const receiveToWallet = receiveTo === FUNDING_SOURCE.WALLET ? true : false - - const wethBentoBalanceBefore = await swapPage.getBentoBalance('WETH') - - await swapPage.setInputToken(inToken) - await swapPage.setOutputToken(outToken) - await swapPage.setAmountIn(swapAmount) - await swapPage.setPayFromWallet(payFromWallet) - await swapPage.setReceiveToWallet(receiveToWallet) - - const expectedOutputAmount = await swapPage.getMinOutputAmount() - await swapPage.confirmSwap(inToken, outToken) - - await swapPage.navigateTo() - const wethBentoBalanceAfter = await swapPage.getBentoBalance('WETH') - expect(wethBentoBalanceAfter !== wethBentoBalanceBefore).toBe(true) - - const wethBalanceDiff = parseFloat(wethBentoBalanceAfter) - parseFloat(wethBentoBalanceBefore) - expect(closeValues(parseFloat(expectedOutputAmount), wethBalanceDiff, 1e-3)).toBe(true) - }) - - test('Should swap ETH from wallet to USDC wallet with other recipient', async () => { - const inToken = 'ETH' - const outToken = 'USDC' - - let recipientBrowser: Browser - let recipientPage: Page - let recipientMetamask: Dappeteer - ;[recipientMetamask, recipientBrowser, recipientPage] = await TestHelper.initDappeteer( - process.env.TEST_SEED2, - process.env.TEST_PASS - ) - - try { - const recipientSwapPage = new SwapPage(recipientPage, recipientMetamask, baseUrl) - await recipientPage.goto(baseUrl) - await recipientPage.bringToFront() - await recipientSwapPage.connectMetamaskWallet() - - await recipientSwapPage.navigateTo() - const account2BentoBalanceBefore = await recipientSwapPage.getWalletBalance(outToken) - - const tokenWalletBalance = await swapPage.getMetamaskTokenBalance(inToken) - if (!(tokenWalletBalance > 0)) - throw new Error(`${inToken} wallet balance is 0 or could not be read from Metamask`) - - const swapAmount = (tokenWalletBalance * 0.01).toFixed(5) - - await swapPage.toggleExpertMode() - await swapPage.setRecipient(account2PubKey) - await swapPage.setInputToken(inToken) - await swapPage.setOutputToken(outToken) - await swapPage.setAmountIn(swapAmount) - await swapPage.setPayFromWallet(true) - await swapPage.setReceiveToWallet(true) - - const expectedOutputAmount = await swapPage.getMinOutputAmount() - await swapPage.confirmSwap(inToken, outToken) - - const account2BentoBalanceAfter = await recipientSwapPage.getWalletBalance(outToken) - expect(account2BentoBalanceAfter !== account2BentoBalanceBefore).toBe(true) - - const account2BalanceDifference = parseFloat(account2BentoBalanceAfter) - parseFloat(account2BentoBalanceBefore) - - expect(closeValues(parseFloat(expectedOutputAmount), account2BalanceDifference, 1e-3)).toBe(true) - } catch (error) { - throw error - } finally { - await recipientBrowser.close() - } - }) - - test('Should reset recipient address when expert mode is disabled', async () => { - await swapPage.toggleExpertMode() // enable expert mode - await swapPage.setRecipient('potato') - - const recipientAddressBefore = await swapPage.getRecipient() - expect(recipientAddressBefore).toBe('potato') - await swapPage.toggleExpertMode() // disable expert mode - - await page.click('body') // click to dismiss tx settings modal - - await swapPage.toggleExpertMode() // enable expert mode - const recipientAddressAfter = await swapPage.getRecipient() - expect(recipientAddressAfter).toBe('') - }) - - test('Should require approval of token when swapping from wallet', async () => { - await approvalHelper.approveRouter(ADDRESSES.BAT, 0) - - const inToken = 'BAT' - const outToken = 'ETH' - - const tokenWalletBalance = await swapPage.getMetamaskTokenBalance(inToken) - if (!(tokenWalletBalance > 0)) throw new Error(`${inToken} wallet balance is 0 or could not be read from Metamask`) - - const swapAmount = (tokenWalletBalance * 0.01).toFixed(5) - - await swapPage.setInputToken(inToken) - await swapPage.setOutputToken(outToken) - await swapPage.setAmountIn(swapAmount) - await swapPage.setPayFromWallet(true) - await swapPage.setReceiveToWallet(true) - - const requiresApprovalBefore = await swapPage.requiresApproval() - expect(requiresApprovalBefore).toBe(true) - - await swapPage.approveToken() - await swapPage.confirmSwap(inToken, outToken) - - await swapPage.navigateTo() - await swapPage.setInputToken(inToken) - await swapPage.setOutputToken(outToken) - await swapPage.setAmountIn(swapAmount) - await swapPage.setPayFromWallet(true) - await swapPage.setReceiveToWallet(true) - - const requiresApprovalAfter = await swapPage.requiresApproval() - expect(requiresApprovalAfter).toBe(false) - }) - - test('Should require approval once when swapping from BentoBox', async () => { - await approvalHelper.approveRouter(ADDRESSES.USDC, 0) - - const inToken = 'USDC' - const outToken = 'ETH' - - const tokenWalletBalance = await swapPage.getMetamaskTokenBalance(inToken) - if (!(tokenWalletBalance > 0)) throw new Error(`${inToken} wallet balance is 0 or could not be read from Metamask`) - - const swapAmount = (tokenWalletBalance * 0.01).toFixed(5) - - await swapPage.setInputToken(inToken) - await swapPage.setOutputToken(outToken) - await swapPage.setAmountIn(swapAmount) - await swapPage.setPayFromWallet(false) - await swapPage.setReceiveToWallet(true) - - const requiresApprovalBefore = await swapPage.requiresApproval() - expect(requiresApprovalBefore).toBe(true) - - await swapPage.approveToken() - await swapPage.confirmSwap(inToken, outToken) - - await swapPage.navigateTo() - await swapPage.setInputToken(inToken) - await swapPage.setOutputToken(outToken) - await swapPage.setAmountIn(swapAmount) - await swapPage.setPayFromWallet(true) - await swapPage.setReceiveToWallet(true) - - const requiresApprovalAfter = await swapPage.requiresApproval() - expect(requiresApprovalAfter).toBe(false) - - await approvalHelper.approveRouter(ADDRESSES.USDC, 2 ^ (256 - 1)) - }) - - test.each([['ETH', FUNDING_SOURCE.WALLET, 'USDC', FUNDING_SOURCE.WALLET]])( - `Should display insufficient balance when not enough %p in %p`, - async (inToken, payFrom, outToken, receiveTo) => { - const tokenWalletBalance = await swapPage.getMetamaskTokenBalance(inToken) - if (!(tokenWalletBalance > 0)) - throw new Error(`${inToken} wallet balance is 0 or could not be read from Metamask`) - - const swapAmount = (tokenWalletBalance * 100).toFixed(5) - const payFromWallet = payFrom === FUNDING_SOURCE.WALLET ? true : false - const receiveToWallet = receiveTo === FUNDING_SOURCE.WALLET ? true : false - - await swapPage.setInputToken(inToken) - await swapPage.setOutputToken(outToken) - await swapPage.setAmountIn(swapAmount) - await swapPage.setPayFromWallet(payFromWallet) - await swapPage.setReceiveToWallet(receiveToWallet) - - const swapButtonText = await swapPage.getSwapButtonText() - - expect(swapButtonText).toBe(`Insufficient Balance`) - } - ) -}) diff --git a/test/e2e/tridentSwap.test.ts b/test/e2e/tridentSwap.test.ts deleted file mode 100644 index 26a3d5d952..0000000000 --- a/test/e2e/tridentSwap.test.ts +++ /dev/null @@ -1,228 +0,0 @@ -import { Dappeteer } from '@chainsafe/dappeteer' -import { closeValues, Fee } from '@sushiswap/trident-sdk' -import { Browser, Page } from 'puppeteer' - -import { ADDRESSES, FUNDING_SOURCE, POOL_TYPE } from './constants/Index' -import { TestHelper } from './helpers/TestHelper' -import { CreatePoolPage } from './pages/pools/CreatePoolPage' -import { LiquidityPoolsPage } from './pages/pools/LiquidityPoolsPage' -import { SwapPage } from './pages/swap/SwapPage' - -let browser: Browser -let page: Page -let metamask: Dappeteer - -let swapPage: SwapPage -let liquidityPoolsPage: LiquidityPoolsPage -let createPoolPage: CreatePoolPage -let depositPercentage = 0.2 -let swapPercentage = 0.01 - -require('dotenv').config() - -let baseUrl: string = process.env.TEST_BASE_URL || 'http://localhost:3000' - -const bentoSwapCases = [ - ['ETH', FUNDING_SOURCE.WALLET, 'USDC', FUNDING_SOURCE.BENTO], - ['WETH', FUNDING_SOURCE.WALLET, 'USDC', FUNDING_SOURCE.BENTO], - ['ETH', FUNDING_SOURCE.BENTO, 'USDC', FUNDING_SOURCE.WALLET], - ['WETH', FUNDING_SOURCE.BENTO, 'ETH', FUNDING_SOURCE.WALLET], - ['ETH', FUNDING_SOURCE.BENTO, 'USDC', FUNDING_SOURCE.BENTO], - ['USDC', FUNDING_SOURCE.WALLET, 'WETH', FUNDING_SOURCE.BENTO], - ['USDC', FUNDING_SOURCE.BENTO, 'WETH', FUNDING_SOURCE.BENTO], - ['USDC', FUNDING_SOURCE.BENTO, 'ETH', FUNDING_SOURCE.WALLET], - ['USDC', FUNDING_SOURCE.BENTO, 'WETH', FUNDING_SOURCE.WALLET], -] - -jest.retryTimes(1) - -describe('Trident Swap:', () => { - beforeAll(async () => { - ;[metamask, browser, page] = await TestHelper.initDappeteer() - - swapPage = new SwapPage(page, metamask, baseUrl) - liquidityPoolsPage = new LiquidityPoolsPage(page, metamask, baseUrl) - createPoolPage = new CreatePoolPage(page, metamask, baseUrl) - - await page.goto(baseUrl) - await page.bringToFront() - - await swapPage.connectMetamaskWallet() - await swapPage.addTokenToMetamask(ADDRESSES.USDT) - }) - - beforeEach(async () => {}) - - afterAll(async () => { - browser.close() - }) - - test.each([['ETH', FUNDING_SOURCE.WALLET, 'USDT', FUNDING_SOURCE.WALLET]])( - `Complex Path: Should swap from %p %p to %p %p`, - async (assetA, payFromA, assetB, payFromB) => { - const payAFromWallet = payFromA === FUNDING_SOURCE.WALLET - const payBFromWallet = payFromB === FUNDING_SOURCE.WALLET - - await swapPage.navigateTo() - - const assetABalance = await swapPage.getTokenBalance(assetA, payAFromWallet) - const assetBBalance = await swapPage.getTokenBalance(assetB, payBFromWallet) - const assetADepositAmount = (assetABalance * depositPercentage).toFixed(5) - const assetBDepositAmount = (assetBBalance * depositPercentage).toFixed(5) - - await liquidityPoolsPage.navigateTo() - await liquidityPoolsPage.clickCreateNewPoolButton() - await createPoolPage.createPool( - POOL_TYPE.CLASSIC, - assetA, - assetB, - payAFromWallet, - payBFromWallet, - assetADepositAmount, - assetBDepositAmount, - Fee.LOW - ) - - await liquidityPoolsPage.navigateTo() - await liquidityPoolsPage.clickCreateNewPoolButton() - await createPoolPage.createPool( - POOL_TYPE.CLASSIC, - assetA, - assetB, - payAFromWallet, - payBFromWallet, - assetADepositAmount, - assetBDepositAmount, - Fee.MEDIUM - ) - - await swapPage.navigateTo() - - const inputTokenBalanceBefore = await swapPage.getTokenBalance(assetA, payAFromWallet) - const outputTokenBalanceBefore = await swapPage.getTokenBalance(assetB, payBFromWallet) - if (!(inputTokenBalanceBefore > 0)) throw new Error(`${assetA} wallet balance is 0. Can't execute swap`) - - const swapAmount = (inputTokenBalanceBefore * swapPercentage).toFixed(5) - - await swapPage.setInputToken(assetA) - await swapPage.setOutputToken(assetB) - await swapPage.setAmountIn(swapAmount) - await swapPage.setPayFromWallet(payAFromWallet) - await swapPage.setReceiveToWallet(payBFromWallet) - - const tradeType = await swapPage.getTradeType() - expect(tradeType).toBe('trident') - - const minOutputAmount = await swapPage.getMinOutputAmount() - - await swapPage.confirmSwap(assetA, assetB) - await swapPage.navigateTo() - - const inputTokenBalanceAfter = await swapPage.getTokenBalance(assetA, payAFromWallet) - const outputTokenBalanceAfter = await swapPage.getTokenBalance(assetB, payBFromWallet) - - const intputTokenBalanceDiff = inputTokenBalanceBefore - inputTokenBalanceAfter - const outputTokenBalanceDiff = outputTokenBalanceAfter - outputTokenBalanceBefore - - expect(closeValues(intputTokenBalanceDiff, parseFloat(swapAmount), 1e-9)).toBe(true) - expect(closeValues(outputTokenBalanceDiff, parseFloat(minOutputAmount), 1e-9)).toBe(true) - } - ) - - test.each([ - ['ETH', FUNDING_SOURCE.WALLET, 'BAT', FUNDING_SOURCE.WALLET, swapPercentage], - ['ETH', FUNDING_SOURCE.WALLET, 'BAT', FUNDING_SOURCE.WALLET, 0.8], - ])(`Single Pool: Should swap from %p %p to %p %p`, async (assetA, payFromA, assetB, payFromB, swapPercent) => { - const payAFromWallet = payFromA === FUNDING_SOURCE.WALLET - const payBFromWallet = payFromB === FUNDING_SOURCE.WALLET - - await swapPage.navigateTo() - - const assetABalance = await swapPage.getTokenBalance(assetA, payAFromWallet) - const assetBBalance = await swapPage.getTokenBalance(assetB, payBFromWallet) - const assetADepositAmount = (assetABalance * depositPercentage).toFixed(5) - const assetBDepositAmount = (assetBBalance * 0.7).toFixed(5) - - await liquidityPoolsPage.navigateTo() - await liquidityPoolsPage.clickCreateNewPoolButton() - await createPoolPage.createPool( - POOL_TYPE.CLASSIC, - assetA, - assetB, - payAFromWallet, - payBFromWallet, - assetADepositAmount, - assetBDepositAmount, - Fee.LOW - ) - - await swapPage.navigateTo() - - const inputTokenBalanceBefore = await swapPage.getTokenBalance(assetA, payAFromWallet) - const outputTokenBalanceBefore = await swapPage.getTokenBalance(assetB, payBFromWallet) - if (!(inputTokenBalanceBefore > 0)) throw new Error(`${assetA} wallet balance is 0. Can't execute swap`) - - const swapAmount = (inputTokenBalanceBefore * swapPercent).toFixed(5) - - await swapPage.setInputToken(assetA) - await swapPage.setOutputToken(assetB) - await swapPage.setAmountIn(swapAmount) - await swapPage.setPayFromWallet(payAFromWallet) - await swapPage.setReceiveToWallet(payBFromWallet) - - const tradeType = await swapPage.getTradeType() - expect(tradeType).toBe('trident') - - const minOutputAmount = await swapPage.getMinOutputAmount() - - await swapPage.confirmSwap(assetA, assetB) - await swapPage.navigateTo() - - const inputTokenBalanceAfter = await swapPage.getTokenBalance(assetA, payAFromWallet) - const outputTokenBalanceAfter = await swapPage.getTokenBalance(assetB, payBFromWallet) - - const intputTokenBalanceDiff = inputTokenBalanceBefore - inputTokenBalanceAfter - const outputTokenBalanceDiff = outputTokenBalanceAfter - outputTokenBalanceBefore - - expect(closeValues(intputTokenBalanceDiff, parseFloat(swapAmount), 1e-9)).toBe(true) - expect(closeValues(outputTokenBalanceDiff, parseFloat(minOutputAmount), 1e-9)).toBe(true) - }) - - test.each([['BAT', FUNDING_SOURCE.WALLET, 'USDT', FUNDING_SOURCE.WALLET, swapPercentage]])( - `Single Path: Should swap from %p %p to %p %p`, - async (assetA, payFromA, assetB, payFromB, swapPercent) => { - const payAFromWallet = payFromA === FUNDING_SOURCE.WALLET - const payBFromWallet = payFromB === FUNDING_SOURCE.WALLET - - await swapPage.navigateTo() - const inputTokenBalanceBefore = await swapPage.getTokenBalance(assetA, payAFromWallet) - const outputTokenBalanceBefore = await swapPage.getTokenBalance(assetB, payBFromWallet) - if (!(inputTokenBalanceBefore > 0)) throw new Error(`${assetA} wallet balance is 0. Can't execute swap`) - - const swapAmount = (inputTokenBalanceBefore * swapPercent).toFixed(5) - - await swapPage.setInputToken(assetA) - await swapPage.setOutputToken(assetB) - await swapPage.setAmountIn(swapAmount) - await swapPage.setPayFromWallet(payAFromWallet) - await swapPage.setReceiveToWallet(payBFromWallet) - - const tradeType = await swapPage.getTradeType() - expect(tradeType).toBe('trident') - - const minOutputAmount = await swapPage.getMinOutputAmount() - - await swapPage.confirmSwap(assetA, assetB) - await swapPage.navigateTo() - - const inputTokenBalanceAfter = await swapPage.getTokenBalance(assetA, payAFromWallet) - const outputTokenBalanceAfter = await swapPage.getTokenBalance(assetB, payBFromWallet) - - const intputTokenBalanceDiff = inputTokenBalanceBefore - inputTokenBalanceAfter - const outputTokenBalanceDiff = outputTokenBalanceAfter - outputTokenBalanceBefore - - expect(closeValues(intputTokenBalanceDiff, parseFloat(swapAmount), 1e-9)).toBe(true) - expect(closeValues(outputTokenBalanceDiff, parseFloat(minOutputAmount), 1e-9)).toBe(true) - } - ) -})