diff --git a/.github/workflows/audit_build_verify.yml b/.github/workflows/audit_build_verify.yml index 664f1c0a07..742b03786d 100644 --- a/.github/workflows/audit_build_verify.yml +++ b/.github/workflows/audit_build_verify.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # pin@v2 + uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # pin@v2 - name: Audit dependencies run: npm audit --audit-level=critical @@ -35,14 +35,14 @@ jobs: steps: - name: Checkout - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # pin@v2 + uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # pin@v2 - name: Set npm cache directory run: npm config set cache .npm-cache --global continue-on-error: true - name: Cache node modules - uses: actions/cache@136d96b4aee02b1f0de3ba493b1d47135042d9c0 # pin@v3 + uses: actions/cache@c3f1317a9e7b1ef106c153ac8c0f00fed3ddbc0d # pin@v3 with: path: | .npm-cache @@ -70,7 +70,7 @@ jobs: - name: Upload lint results # run if lint failed and only on master/dev/v2/v2-dev branch and pull requests if: always() && (github.ref == 'refs/heads/master' || github.ref == 'refs/heads/dev' || github.event_name == 'pull_request' || github.ref == 'refs/heads/v2' || github.ref == 'refs/heads/v2-dev') - uses: github/codeql-action/upload-sarif@81bfc289f5947eca8a3358341c874cb4f4697b64 # pin@codeql-bundle-20220322 + uses: github/codeql-action/upload-sarif@27ea8f8fe5977c00f5b37e076ab846c5bd783b96 # pin@codeql-bundle-20220322 with: sarif_file: lint-results.sarif continue-on-error: true @@ -91,14 +91,14 @@ jobs: steps: - name: Checkout - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # pin@v2 + uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # pin@v2 - name: Set npm cache directory run: npm config set cache .npm-cache --global continue-on-error: true - name: Cache node modules - uses: actions/cache@136d96b4aee02b1f0de3ba493b1d47135042d9c0 # pin@v3 + uses: actions/cache@c3f1317a9e7b1ef106c153ac8c0f00fed3ddbc0d # pin@v3 with: path: | .npm-cache @@ -119,7 +119,7 @@ jobs: npm install --prefer-offline --no-audit --legacy-peer-deps - name: Cache next.js build cache - uses: actions/cache@136d96b4aee02b1f0de3ba493b1d47135042d9c0 # pin@v2 + uses: actions/cache@c3f1317a9e7b1ef106c153ac8c0f00fed3ddbc0d # pin@v2 with: path: .next/cache key: ${{ runner.os }}-next-cache-${{ hashFiles('**/package-lock.json') }} diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 3de2f21305..80dce023ac 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -18,16 +18,16 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # pin@v2 + uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # pin@v2 - name: Initialize CodeQL - uses: github/codeql-action/init@81bfc289f5947eca8a3358341c874cb4f4697b64 # pin@codeql-bundle-20220322 + uses: github/codeql-action/init@27ea8f8fe5977c00f5b37e076ab846c5bd783b96 # pin@codeql-bundle-20220322 with: queries: security-and-quality languages: javascript - name: Autobuild - uses: github/codeql-action/autobuild@81bfc289f5947eca8a3358341c874cb4f4697b64 # pin@codeql-bundle-20220322 + uses: github/codeql-action/autobuild@27ea8f8fe5977c00f5b37e076ab846c5bd783b96 # pin@codeql-bundle-20220322 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@81bfc289f5947eca8a3358341c874cb4f4697b64 # pin@codeql-bundle-20220322 + uses: github/codeql-action/analyze@27ea8f8fe5977c00f5b37e076ab846c5bd783b96 # pin@codeql-bundle-20220322 diff --git a/.github/workflows/lighthouse.yml b/.github/workflows/lighthouse.yml index fda0f0a4a3..ba4bef8f99 100644 --- a/.github/workflows/lighthouse.yml +++ b/.github/workflows/lighthouse.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # pin@v2 + uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # pin@v2 - name: Run lighthouse run: | diff --git a/.github/workflows/updateDependency.yml b/.github/workflows/updateDependency.yml index 899bbb5b06..99bfe315b9 100644 --- a/.github/workflows/updateDependency.yml +++ b/.github/workflows/updateDependency.yml @@ -9,7 +9,7 @@ jobs: name: Update contracts-interface version runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b - uses: actions/setup-node@v3 with: node-version: '14.17.1' diff --git a/assets/png/features/permissionless.png b/assets/png/features/permissionless.png new file mode 100644 index 0000000000..318776566c Binary files /dev/null and b/assets/png/features/permissionless.png differ diff --git a/assets/png/learn/faq.png b/assets/png/learn/faq.png new file mode 100644 index 0000000000..ce6b0b3693 Binary files /dev/null and b/assets/png/learn/faq.png differ diff --git a/assets/png/marketing/market-order-preview.png b/assets/png/marketing/market-order-preview.png index 3721bd1e3a..9dc9754e21 100644 Binary files a/assets/png/marketing/market-order-preview.png and b/assets/png/marketing/market-order-preview.png differ diff --git a/assets/png/pnl-graphic.png b/assets/png/pnl-graphic.png new file mode 100644 index 0000000000..1417e057a9 Binary files /dev/null and b/assets/png/pnl-graphic.png differ diff --git a/assets/svg/app/arrow-down.svg b/assets/svg/app/arrow-down.svg index 2dbb99b199..2edc2bbe17 100644 --- a/assets/svg/app/arrow-down.svg +++ b/assets/svg/app/arrow-down.svg @@ -1,11 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/svg/app/arrow-up-right-tg.svg b/assets/svg/app/arrow-up-right-tg.svg new file mode 100644 index 0000000000..077f4fae41 --- /dev/null +++ b/assets/svg/app/arrow-up-right-tg.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/svg/app/arrow-up-right.svg b/assets/svg/app/arrow-up-right.svg new file mode 100644 index 0000000000..ac2cebb869 --- /dev/null +++ b/assets/svg/app/arrow-up-right.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/svg/app/caret-down-gray-slim.svg b/assets/svg/app/caret-down-gray-slim.svg new file mode 100644 index 0000000000..f3af2c1d4f --- /dev/null +++ b/assets/svg/app/caret-down-gray-slim.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/svg/app/grid.svg b/assets/svg/app/grid.svg new file mode 100644 index 0000000000..5fccaadd83 --- /dev/null +++ b/assets/svg/app/grid.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/assets/svg/brand/logo-beta-dark.svg b/assets/svg/brand/logo-beta-dark.svg new file mode 100644 index 0000000000..34e26d1d6b --- /dev/null +++ b/assets/svg/brand/logo-beta-dark.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/svg/brand/logo-beta-light.svg b/assets/svg/brand/logo-beta-light.svg new file mode 100644 index 0000000000..e97a7197e5 --- /dev/null +++ b/assets/svg/brand/logo-beta-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/svg/brand/logo-beta.svg b/assets/svg/brand/logo-beta.svg deleted file mode 100644 index d104039ddd..0000000000 --- a/assets/svg/brand/logo-beta.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/svg/brand/logo-no-text.svg b/assets/svg/brand/logo-no-text.svg index 98e6f538ac..c83600e5ea 100644 --- a/assets/svg/brand/logo-no-text.svg +++ b/assets/svg/brand/logo-no-text.svg @@ -1,24 +1,94 @@ - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/svg/brand/logo.svg b/assets/svg/brand/logo.svg index 5622c2badc..beb8779a7e 100644 --- a/assets/svg/brand/logo.svg +++ b/assets/svg/brand/logo.svg @@ -1,23 +1,23 @@ - - - - - - + + + + + + - + - + - + - + diff --git a/assets/svg/earn/stake-to-earn.svg b/assets/svg/earn/stake-to-earn.svg new file mode 100644 index 0000000000..77972f35ff --- /dev/null +++ b/assets/svg/earn/stake-to-earn.svg @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/svg/earn/trade-to-earn.svg b/assets/svg/earn/trade-to-earn.svg new file mode 100644 index 0000000000..1c6fb7545e --- /dev/null +++ b/assets/svg/earn/trade-to-earn.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/svg/earn/vote-n-govern.svg b/assets/svg/earn/vote-n-govern.svg new file mode 100644 index 0000000000..c984f02d23 --- /dev/null +++ b/assets/svg/earn/vote-n-govern.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/svg/features/blazing-fast.svg b/assets/svg/features/blazing-fast.svg new file mode 100644 index 0000000000..19fb8f88ed --- /dev/null +++ b/assets/svg/features/blazing-fast.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/svg/features/easy-ramping.svg b/assets/svg/features/easy-ramping.svg new file mode 100644 index 0000000000..96141275fe --- /dev/null +++ b/assets/svg/features/easy-ramping.svg @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/svg/features/low-gas-fee.svg b/assets/svg/features/low-gas-fee.svg new file mode 100644 index 0000000000..ca165bc10a --- /dev/null +++ b/assets/svg/features/low-gas-fee.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/svg/features/mobile.svg b/assets/svg/features/mobile.svg new file mode 100644 index 0000000000..21812d179b --- /dev/null +++ b/assets/svg/features/mobile.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/svg/features/unique-assets.svg b/assets/svg/features/unique-assets.svg new file mode 100644 index 0000000000..bc5ec0b579 --- /dev/null +++ b/assets/svg/features/unique-assets.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/svg/features/zero-slippage.svg b/assets/svg/features/zero-slippage.svg new file mode 100644 index 0000000000..32478e3a69 --- /dev/null +++ b/assets/svg/features/zero-slippage.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/svg/futures/currency-icon.svg b/assets/svg/futures/currency-icon.svg new file mode 100644 index 0000000000..f437f3df34 --- /dev/null +++ b/assets/svg/futures/currency-icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/svg/futures/stats.svg b/assets/svg/futures/stats.svg new file mode 100644 index 0000000000..375b5c308d --- /dev/null +++ b/assets/svg/futures/stats.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/svg/futures/upload-icon.svg b/assets/svg/futures/upload-icon.svg new file mode 100644 index 0000000000..e02ffc7c39 --- /dev/null +++ b/assets/svg/futures/upload-icon.svg @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/assets/svg/learn/faq.svg b/assets/svg/learn/faq.svg new file mode 100644 index 0000000000..df1f819317 --- /dev/null +++ b/assets/svg/learn/faq.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/svg/learn/how-governance.svg b/assets/svg/learn/how-governance.svg new file mode 100644 index 0000000000..672926b866 --- /dev/null +++ b/assets/svg/learn/how-governance.svg @@ -0,0 +1,321 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/svg/learn/how-to-stake.svg b/assets/svg/learn/how-to-stake.svg new file mode 100644 index 0000000000..45df9fe009 --- /dev/null +++ b/assets/svg/learn/how-to-stake.svg @@ -0,0 +1,308 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/svg/learn/how-to-trade.svg b/assets/svg/learn/how-to-trade.svg new file mode 100644 index 0000000000..0400ee0dfd --- /dev/null +++ b/assets/svg/learn/how-to-trade.svg @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/svg/marketing/medium-icon.svg b/assets/svg/marketing/medium-icon.svg index dda46b65e1..5ddeb1befb 100644 --- a/assets/svg/marketing/medium-icon.svg +++ b/assets/svg/marketing/medium-icon.svg @@ -1,3 +1,3 @@ - + diff --git a/assets/svg/marketing/twitter-icon.svg b/assets/svg/marketing/twitter-icon.svg index a0fbe10d30..6b2235913e 100644 --- a/assets/svg/marketing/twitter-icon.svg +++ b/assets/svg/marketing/twitter-icon.svg @@ -1,3 +1,3 @@ - - + + diff --git a/assets/svg/partners/aelin.svg b/assets/svg/partners/aelin.svg new file mode 100644 index 0000000000..dba02d3042 --- /dev/null +++ b/assets/svg/partners/aelin.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/svg/partners/chainlink.svg b/assets/svg/partners/chainlink.svg new file mode 100644 index 0000000000..20fdc16ff5 --- /dev/null +++ b/assets/svg/partners/chainlink.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/svg/partners/graph.svg b/assets/svg/partners/graph.svg new file mode 100644 index 0000000000..101ad4cfb5 --- /dev/null +++ b/assets/svg/partners/graph.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/assets/svg/partners/hop.svg b/assets/svg/partners/hop.svg new file mode 100644 index 0000000000..4a56c1e06f --- /dev/null +++ b/assets/svg/partners/hop.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/svg/partners/lyra.svg b/assets/svg/partners/lyra.svg new file mode 100644 index 0000000000..4a7a64cc2d --- /dev/null +++ b/assets/svg/partners/lyra.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/assets/svg/partners/optimism.svg b/assets/svg/partners/optimism.svg new file mode 100644 index 0000000000..2939c73bf9 --- /dev/null +++ b/assets/svg/partners/optimism.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/assets/svg/partners/synthetix.svg b/assets/svg/partners/synthetix.svg new file mode 100644 index 0000000000..d8774b1253 --- /dev/null +++ b/assets/svg/partners/synthetix.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/svg/partners/thales.svg b/assets/svg/partners/thales.svg new file mode 100644 index 0000000000..2cbe3aad2f --- /dev/null +++ b/assets/svg/partners/thales.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/svg/social/mirror.svg b/assets/svg/social/mirror.svg new file mode 100644 index 0000000000..867e2e373d --- /dev/null +++ b/assets/svg/social/mirror.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/Badge/Badge.tsx b/components/Badge/Badge.tsx index a48a66b49a..4f2f4aeb7e 100644 --- a/components/Badge/Badge.tsx +++ b/components/Badge/Badge.tsx @@ -6,7 +6,7 @@ const Badge = styled.span` padding: 2px 3px 1px 5px; text-align: center; font-family: ${(props) => props.theme.fonts.black}; - background: ${(props) => props.theme.colors.common.primaryRed}; + background: ${(props) => props.theme.colors.selectedTheme.red}; border-radius: 100px; letter-spacing: 1px; margin-left: 4px; diff --git a/components/BaseModal/BaseModal.tsx b/components/BaseModal/BaseModal.tsx index a231f6307a..78f9b62080 100644 --- a/components/BaseModal/BaseModal.tsx +++ b/components/BaseModal/BaseModal.tsx @@ -6,7 +6,6 @@ import CrossIcon from 'assets/svg/app/cross.svg'; import Card from 'components/Card'; import { resetButtonCSS } from 'styles/common'; -import { border } from 'components/Button'; import { zIndex } from 'constants/ui'; import media from 'styles/media'; @@ -71,7 +70,7 @@ const StyledCard = styled(Card)` border-radius: 10px; position: relative; box-shadow: ${(props) => props.theme.colors.selectedTheme.button.shadow}; - ${border} + border: ${(props) => props.theme.colors.selectedTheme.border}; `; const StyledCardHeader = styled(Card.Header)` @@ -94,9 +93,9 @@ const DismissButton = styled.button` ${resetButtonCSS}; position: absolute; right: 20px; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; &:hover { - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; } `; diff --git a/components/Button/Button.tsx b/components/Button/Button.tsx index 70c0b26f06..1a06d43ee1 100644 --- a/components/Button/Button.tsx +++ b/components/Button/Button.tsx @@ -12,6 +12,10 @@ type ButtonProps = { }; export const border = css` + box-shadow: ${(props) => props.theme.colors.selectedTheme.button.shadow}; + background: ${(props) => props.theme.colors.selectedTheme.button.background}; + border: none; + &::before { content: ''; position: absolute; @@ -21,15 +25,17 @@ export const border = css` bottom: 0; border-radius: 10px; padding: 1px; - background: rgb(255 255 255 / 10%); + background: ${(props) => props.theme.colors.selectedTheme.button.border}; -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask-composite: xor; + mask-image: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); + mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); mask-composite: exclude; } `; const Button = styled.button` - height: 41px; + height: auto; cursor: pointer; position: relative; border-radius: 10px; @@ -39,37 +45,46 @@ const Button = styled.button` outline: none; white-space: nowrap; font-size: 17px; - color: ${(props) => props.theme.colors.common.primaryWhite}; - border: none; - background: ${(props) => props.theme.colors.selectedTheme.button.background}; - box-shadow: ${(props) => props.theme.colors.selectedTheme.button.shadow}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; + transition: all 0.1s ease-in-out; ${border} - &:hover { background: ${(props) => props.theme.colors.selectedTheme.button.hover}; } - ${(props) => - props.mono - ? css` - font-family: ${props.theme.fonts.mono}; - ` - : css` - font-family: ${props.theme.fonts.bold}; - `}; - ${(props) => props.variant === 'primary' && css` background: ${props.theme.colors.selectedTheme.button.primary.background}; - color: ${props.theme.colors.common.primaryWhite}; text-shadow: ${props.theme.colors.selectedTheme.button.primary.textShadow}; - &:hover { background: ${props.theme.colors.selectedTheme.button.primary.hover}; } `}; + ${(props) => + props.noOutline && + css` + background: ${(props) => props.theme.colors.selectedTheme.button.fill}; + border: ${(props) => props.theme.colors.selectedTheme.border}; + box-shadow: none; + &:hover { + background: ${(props) => props.theme.colors.selectedTheme.button.fillHover}; + } + &::before { + display: none; + } + `}; + + ${(props) => + props.mono + ? css` + font-family: ${props.theme.fonts.mono}; + ` + : css` + font-family: ${props.theme.fonts.bold}; + `}; + ${(props) => props.variant === 'secondary' && css` @@ -79,7 +94,7 @@ const Button = styled.button` ${(props) => props.variant === 'danger' && css` - color: ${props.theme.colors.common.primaryRed}; + color: ${props.theme.colors.selectedTheme.red}; `}; ${(props) => @@ -87,6 +102,7 @@ const Button = styled.button` css` height: 41px; min-width: 157px; + font-size: 15px; `}; ${(props) => @@ -96,14 +112,6 @@ const Button = styled.button` min-width: 200px; `}; - ${(props) => - props.noOutline && - css` - &::before { - background: none; - } - `}; - ${(props) => props.size === 'lg' && css` @@ -128,13 +136,14 @@ const Button = styled.button` &:disabled { color: ${(props) => props.theme.colors.selectedTheme.button.disabled.text}; - background: ${(props) => props.theme.colors.selectedTheme.button.disabled.background}; + background: transparent; box-shadow: none; + text-shadow: none; border: ${(props) => props.theme.colors.selectedTheme.border}; + cursor: not-allowed; &::before { display: none; } - cursor: not-allowed; } `; diff --git a/components/Button/NavButton.tsx b/components/Button/NavButton.tsx index f121859843..b092cb72a0 100644 --- a/components/Button/NavButton.tsx +++ b/components/Button/NavButton.tsx @@ -32,8 +32,9 @@ const StyledButton = styled(Button)` border: transparent; background: ${(props) => - props.isActive ? props.theme.colors.selectedTheme.button.background : 'transparent'}; + props.isActive ? props.theme.colors.selectedTheme.button.fill : 'transparent'}; box-shadow: none; + border-radius: 100px; p { margin: 0; @@ -44,8 +45,8 @@ const StyledButton = styled(Button)` .title { color: ${(props) => props.isActive - ? props.theme.colors.common.primaryWhite - : props.theme.colors.common.secondaryGray}; + ? props.theme.colors.selectedTheme.button.text + : props.theme.colors.selectedTheme.gray}; } &:disabled { diff --git a/components/Button/TabButton.tsx b/components/Button/TabButton.tsx index b802ce5556..8fb4861335 100644 --- a/components/Button/TabButton.tsx +++ b/components/Button/TabButton.tsx @@ -15,39 +15,51 @@ export type TabButtonProps = { const TabButton: React.FC = ({ title, detail, badge, active, icon, ...props }) => { return ( - + {!!icon && {icon}} - {title} + + {title} + {!!badge && {badge}} + + {detail && {detail}} - {!!badge && {badge}} ); }; const StyledButton = styled(Button)<{ isActive: boolean }>` - height: initial; display: flex; align-items: center; padding-top: 10px; padding-bottom: 10px; justify-content: center; + background-color: ${(props) => !props.isActive && 'transparent'}; p { margin: 0; font-size: 13px; text-align: left; } + .title-container { + display: flex; + flex-direction: row; + } .title { text-align: center; color: ${(props) => props.isActive - ? props.theme.colors.common.primaryWhite - : props.theme.colors.common.secondaryGray}; + ? props.theme.colors.selectedTheme.button.text + : props.theme.colors.selectedTheme.gray}; } .detail { - color: ${(props) => props.theme.colors.common.secondaryGray}; - margin-top: 2px; + color: ${(props) => + props.isActive + ? props.theme.colors.selectedTheme.gold + : props.theme.colors.selectedTheme.gray}; + margin-top: 4px; + font-size: 18px; + font-family: ${(props) => props.theme.fonts.monoBold}; } .badge { height: 16px; @@ -56,10 +68,9 @@ const StyledButton = styled(Button)<{ isActive: boolean }>` padding-left: 4px; padding-right: 4px; margin-left: 7px; - font-size: 12px; - color: ${(props) => props.theme.colors.selectedTheme.button.tab.badge.text}; + font-size: 13px; + color: ${(props) => props.theme.colors.selectedTheme.black}; background-color: ${(props) => props.theme.colors.selectedTheme.button.tab.badge.background}; - box-shadow: ${(props) => props.theme.colors.selectedTheme.button.tab.badge.shadow}; border-radius: 4px; } @@ -71,8 +82,8 @@ const StyledButton = styled(Button)<{ isActive: boolean }>` path { fill: ${(props) => props.isActive - ? props.theme.colors.common.primaryWhite - : props.theme.colors.common.secondaryGray}; + ? props.theme.colors.selectedTheme.button.text + : props.theme.colors.selectedTheme.gray}; } } diff --git a/components/Card/CardHeader.tsx b/components/Card/CardHeader.tsx index 4c6dd71777..0ac0a36ca0 100644 --- a/components/Card/CardHeader.tsx +++ b/components/Card/CardHeader.tsx @@ -23,7 +23,7 @@ const CardHeader: FC = ({ const Container = styled(FlexDivCentered)<{ lowercase: boolean; noBorder: boolean }>` position: relative; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; border-bottom: ${(props) => (props.noBorder ? 'none' : `1px solid ${props.theme.colors.navy}`)}; height: 32px; padding: 0 18px; diff --git a/components/ChangePercent/ChangePercent.tsx b/components/ChangePercent/ChangePercent.tsx index 656abdc84e..ea6dd76cbb 100644 --- a/components/ChangePercent/ChangePercent.tsx +++ b/components/ChangePercent/ChangePercent.tsx @@ -28,13 +28,20 @@ const CurrencyChange = styled.span<{ isPositive: boolean }>` align-items: center; color: ${(props) => props.isPositive - ? props.theme.colors.common.primaryGreen - : props.theme.colors.common.primaryRed}; + ? props.theme.colors.selectedTheme.green + : props.theme.colors.selectedTheme.red}; font-family: ${(props) => props.theme.fonts.mono}; + svg { margin-right: 5px; width: 10px; height: 10px; + path { + fill: ${(props) => + props.isPositive + ? props.theme.colors.selectedTheme.green + : props.theme.colors.selectedTheme.red}; + } } ${media.lessThan('md')` diff --git a/components/Currency/CurrencyAmount/CurrencyAmount.tsx b/components/Currency/CurrencyAmount/CurrencyAmount.tsx index af1ae4ca93..67256e7692 100644 --- a/components/Currency/CurrencyAmount/CurrencyAmount.tsx +++ b/components/Currency/CurrencyAmount/CurrencyAmount.tsx @@ -56,10 +56,10 @@ const Container = styled.span` `; const Amount = styled.span` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; const TotalValue = styled.span` - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; `; export default CurrencyAmount; diff --git a/components/Currency/CurrencyIcon/CurrencyIcon.tsx b/components/Currency/CurrencyIcon/CurrencyIcon.tsx index db2e11dc05..387d66b8e4 100644 --- a/components/Currency/CurrencyIcon/CurrencyIcon.tsx +++ b/components/Currency/CurrencyIcon/CurrencyIcon.tsx @@ -18,6 +18,7 @@ export type CurrencyIconProps = { width?: string; height?: string; isDeprecated?: boolean; + style?: any; }; export const SNXIcon = @@ -43,7 +44,7 @@ export const getSynthIcon = (currencyKey: CurrencyKey) => { const CurrencyIconContainer: FC = (props) => ( - + {!props.isDeprecated ? null : ( @@ -146,9 +147,10 @@ const DeprecatedXIconContainer = styled.div` const Placeholder = styled(FlexDivCentered)<{ isDeprecated?: boolean }>` border-radius: 100%; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; border: 2px solid - ${(props) => (props.isDeprecated ? props.theme.colors.red : props.theme.colors.white)}; + ${(props) => + props.isDeprecated ? props.theme.colors.red : props.theme.colors.selectedTheme.button.text}; font-size: 7px; font-family: ${(props) => props.theme.fonts.bold}; justify-content: center; diff --git a/components/Currency/CurrencyName/CurrencyName.tsx b/components/Currency/CurrencyName/CurrencyName.tsx index 4ec38ad6a6..386eab54ec 100644 --- a/components/Currency/CurrencyName/CurrencyName.tsx +++ b/components/Currency/CurrencyName/CurrencyName.tsx @@ -77,7 +77,7 @@ const NameAndSymbol = styled.span` `; const Symbol = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.bold}; font-size: 14px; display: flex; @@ -85,7 +85,7 @@ const Symbol = styled.div` `; const Name = styled.span` - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; `; const CurrencyIconContainer = styled.span` diff --git a/components/Currency/CurrencyPrice/CurrencyPrice.tsx b/components/Currency/CurrencyPrice/CurrencyPrice.tsx index 49e283365c..534dc220ba 100644 --- a/components/Currency/CurrencyPrice/CurrencyPrice.tsx +++ b/components/Currency/CurrencyPrice/CurrencyPrice.tsx @@ -54,7 +54,7 @@ export const CurrencyPrice: FC = ({ const Container = styled.span` ${ContainerRowMixin}; font-family: ${(props) => props.theme.fonts.mono}; - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; const Price = styled.span``; diff --git a/components/FullScreenModal/FullScreenModal.tsx b/components/FullScreenModal/FullScreenModal.tsx index f150de3767..4a57800d1a 100644 --- a/components/FullScreenModal/FullScreenModal.tsx +++ b/components/FullScreenModal/FullScreenModal.tsx @@ -40,7 +40,7 @@ const StyledDialogContent = styled(DialogContent)` const Title = styled.div` text-transform: capitalize; font-family: ${(props) => props.theme.fonts.bold}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 24px; line-height: 24px; padding-bottom: 24px; diff --git a/components/InfoBox/InfoBox.tsx b/components/InfoBox/InfoBox.tsx index 1352872ce8..6235930e7c 100644 --- a/components/InfoBox/InfoBox.tsx +++ b/components/InfoBox/InfoBox.tsx @@ -4,7 +4,8 @@ import styled from 'styled-components'; type DetailedInfo = { value: string; - tooltip?: React.ReactNode; + keyNode?: React.ReactNode; + valueNode?: React.ReactNode; color?: 'green' | 'red' | 'gold'; spaceBeneath?: boolean; }; @@ -23,7 +24,7 @@ const InfoBox: React.FC = ({ details, style, className, disabled } - {key}: {value.tooltip} + {key}: {value.keyNode} = ({ details, style, className, disabled } }`} > {disabled ? NO_VALUE : value.value} + {value.valueNode} {value?.spaceBeneath && } @@ -57,23 +59,23 @@ const InfoBoxContainer = styled.div` } .key { - color: ${(props) => props.theme.colors.selectedTheme.input.placeholder}; - font-size: 12px; + color: ${(props) => props.theme.colors.selectedTheme.text.title}; + font-size: 13px; text-transform: capitalize; } .value { - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.text.value}; font-family: ${(props) => props.theme.fonts.mono}; - font-size: 12px; + font-size: 13px; } .red { - color: ${(props) => props.theme.colors.common.primaryRed}; + color: ${(props) => props.theme.colors.selectedTheme.red}; } .green { - color: ${(props) => props.theme.colors.common.primaryGreen}; + color: ${(props) => props.theme.colors.selectedTheme.green}; } .gold { @@ -81,7 +83,7 @@ const InfoBoxContainer = styled.div` } .closed { - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; } &:not(:last-of-type) { diff --git a/components/Input/CustomInput.tsx b/components/Input/CustomInput.tsx index 65aacb03d1..1641e37d30 100644 --- a/components/Input/CustomInput.tsx +++ b/components/Input/CustomInput.tsx @@ -57,7 +57,7 @@ const CustomInputContainer = styled.div` justify-content: space-between; box-sizing: border-box; height: 46px; - background: ${(props) => props.theme.colors.selectedTheme.input.background}; + background: ${(props) => props.theme.colors.selectedTheme.input.secondary.background}; box-shadow: ${(props) => props.theme.colors.selectedTheme.input.shadow}; border: ${(props) => props.theme.colors.selectedTheme.border}; border-radius: 10px; @@ -66,14 +66,13 @@ const CustomInputContainer = styled.div` input { display: flex; flex: 1; - margin-right: 4px; font-family: ${(props) => props.theme.fonts.mono}; font-size: 18px; line-height: 22px; background-color: transparent; border: none; - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; width: 100%; &:focus { diff --git a/components/Input/Input.tsx b/components/Input/Input.tsx index 839d2ef79e..f181122e8a 100644 --- a/components/Input/Input.tsx +++ b/components/Input/Input.tsx @@ -10,7 +10,7 @@ export const inputCSS = css` padding: 0 12px; font-size: 18px; border-radius: 10px; - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; outline: none; ::placeholder { diff --git a/components/PoweredBySynthetix/PoweredBySynthetix.tsx b/components/PoweredBySynthetix/PoweredBySynthetix.tsx index 407511d13c..ae7f534adb 100644 --- a/components/PoweredBySynthetix/PoweredBySynthetix.tsx +++ b/components/PoweredBySynthetix/PoweredBySynthetix.tsx @@ -2,7 +2,6 @@ import { EXTERNAL_LINKS } from 'constants/links'; import React from 'react'; import styled from 'styled-components'; import { ExternalLink, Paragraph } from 'styles/common'; -import media from 'styles/media'; import { useTranslation } from 'react-i18next'; import TextLogo from 'assets/svg/brand/text-logo-white.svg'; @@ -21,24 +20,20 @@ const PoweredBySynthetix = () => { const Container = styled.div` display: grid; - grid-auto-flow: column; - ${media.lessThan('sm')` - grid-auto-flow: row; - text-align: center; - grid-gap: 15px; - `} + grid-auto-flow: row; + grid-gap: 5px; `; const Text = styled(Paragraph)` - font-size: 12px; - color: ${(props) => props.theme.colors.silver}; - font-family: ${(props) => props.theme.fonts.bold}; - padding-right: 10px; + font-size: 10px; + color: ${(props) => props.theme.colors.common.primaryWhite}; + opacity: 0.5; + letter-spacing: 0.04em; + font-variant: small-caps; + font-family: ${(props) => props.theme.fonts.regular}; text-transform: uppercase; - line-height: normal; - ${media.lessThan('sm')` - padding-right: 0; - `} + line-height: 100%; + text-align: center; `; export default PoweredBySynthetix; diff --git a/components/PreviewArrow/PreviewArrow.tsx b/components/PreviewArrow/PreviewArrow.tsx new file mode 100644 index 0000000000..b16d83f00d --- /dev/null +++ b/components/PreviewArrow/PreviewArrow.tsx @@ -0,0 +1,41 @@ +import { useState, useEffect } from 'react'; +import styled from 'styled-components'; + +type PreviewArrowProps = { + showPreview: boolean; +}; + +const PreviewArrow: React.FC = ({ showPreview, children }) => { + const [showPotentialTrade, setShowPotentialTrade] = useState(false); + + useEffect(() => { + if (showPreview) { + setShowPotentialTrade(true); + } else { + setShowPotentialTrade(false); + } + }, [showPreview]); + + return showPotentialTrade ? ( + <> + + {children} + > + ) : null; +}; + +const StyledArrow = styled.span` + ::before { + content: '➞'; + color: ${(props) => props.theme.colors.common.secondaryGray}; + font-size: 13px; + padding: 0px 3px; + font-family: ${(props) => props.theme.fonts.bold}; + } +`; + +const StyledPreviewGold = styled.span` + color: ${(props) => props.theme.colors.selectedTheme.gold}; +`; + +export default PreviewArrow; diff --git a/components/PreviewArrow/index.ts b/components/PreviewArrow/index.ts new file mode 100644 index 0000000000..aa7c0ad2ee --- /dev/null +++ b/components/PreviewArrow/index.ts @@ -0,0 +1 @@ +export { default } from './PreviewArrow'; diff --git a/components/SegmentedControl/SegmentedControl.tsx b/components/SegmentedControl/SegmentedControl.tsx index a64c7f6ed5..73168ef0c0 100644 --- a/components/SegmentedControl/SegmentedControl.tsx +++ b/components/SegmentedControl/SegmentedControl.tsx @@ -1,6 +1,6 @@ import React from 'react'; import styled, { css } from 'styled-components'; -import { border } from 'components/Button'; + interface SegmentedControlProps { values: string[]; selectedIndex: number; @@ -49,14 +49,12 @@ const SegmentedControlOption = styled.button<{ isSelected: boolean }>` ${(props) => props.isSelected ? css` - background: ${(props) => props.theme.colors.selectedTheme.segmented.button.background}; - position:relative; + position: relative; box-shadow: ${(props) => props.theme.colors.selectedTheme.segmented.button.shadow}; - border: none; + border: ${(props) => props.theme.colors.selectedTheme.border}; border-radius: 6px; - ${border} - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; &::before { border-radius: 6px; } diff --git a/components/Select/Select.tsx b/components/Select/Select.tsx index f40649f972..450aa9494b 100644 --- a/components/Select/Select.tsx +++ b/components/Select/Select.tsx @@ -1,7 +1,6 @@ import React, { FC, useContext, useMemo } from 'react'; import ReactSelect, { Props, StylesConfig } from 'react-select'; import { ThemeContext } from 'styled-components'; - export const IndicatorSeparator: FC = () => null; function Select(props: Props) { @@ -15,44 +14,52 @@ function Select(props: Props) { }), singleValue: (provided) => ({ ...provided, - color: colors.common.primaryWhite, + color: colors.selectedTheme.button.text, boxShadow: 'none', fontSize: '12px', border: 'none', + margin: 0, + maxWidth: 'unset', }), control: (provided, state) => ({ ...provided, - color: colors.common.primaryWhite, + color: colors.selectedTheme.button.text, cursor: 'pointer', - boxShadow: colors.selectedTheme.select.control.shadow, - border: 'none', + boxShadow: props.noOutline ? 'none' : colors.selectedTheme.button.shadow, + border: props.noOutline ? colors.selectedTheme.border : 'none', outline: 'none', minHeight: 'unset', height: state.selectProps.controlHeight ?? 'unset', '&:hover': { - background: colors.selectedTheme.button.hover, + background: props.noOutline + ? colors.selectedTheme.button.fillHover + : colors.selectedTheme.button.hover, }, - '&::before': { + '&::before': !props.noOutline && { content: '""', position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, - borderRadius: '10px', - padding: '1px', - background: 'rgb(255 255 255 / 10%)', + borderRadius: 10, + padding: 1, + background: colors.selectedTheme.button.border, WebkitMask: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)', WebkitMaskComposite: 'xor', + maskImage: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)', + mask: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)', maskComposite: 'exclude', }, fontSize: '12px', - background: colors.selectedTheme.button.background, + background: props.noOutline + ? colors.selectedTheme.button.fill + : colors.selectedTheme.button.background, borderRadius: 10, }), menu: (provided, state) => ({ ...provided, - background: colors.selectedTheme.cell.gradient, + background: colors.selectedTheme.cell.fill, border: 'none', outline: 'none', borderRadius: 10, @@ -66,7 +73,8 @@ function Select(props: Props) { borderRadius: 10, padding: 0, textAlign: 'left', - border: colors.selectedTheme.cell.outline, + border: colors.selectedTheme.border, + borderWidth: '1px', borderStyle: 'solid', outline: 'none', 'div.react-select__option:first-of-type:hover': { @@ -82,7 +90,7 @@ function Select(props: Props) { ...provided, border: 'none', fontFamily: fonts.regular, - color: state.isSelected ? colors.common.secondaryGold : colors.common.primaryWhite, + color: state.isSelected ? colors.common.secondaryGold : colors.selectedTheme.button.text, cursor: 'pointer', fontSize: '12px', backgroundColor: 'transparent', @@ -98,7 +106,7 @@ function Select(props: Props) { placeholder: (provided) => ({ ...provided, fontSize: '12px', - color: colors.common.primaryWhite, + color: colors.selectedTheme.button.text, }), dropdownIndicator: (provided, state) => ({ ...provided, @@ -111,7 +119,7 @@ function Select(props: Props) { }), }; return styles; - }, [colors, fonts]); + }, [colors, fonts, props]); return ( (null); const _entryLine = useRef(null); const _liquidationLine = useRef(null); @@ -110,7 +112,7 @@ export function TVChart({ clearExistingWidget(); }; // eslint-disable-next-line react-hooks/exhaustive-deps - }, [baseCurrencyKey, quoteCurrencyKey, network.id]); + }, [baseCurrencyKey, quoteCurrencyKey, network.id, currentTheme]); useEffect(() => { _widget.current?.onChartReady(() => { diff --git a/components/TVChart/types.ts b/components/TVChart/types.ts index bffbcf9f99..1e0a47b1e5 100644 --- a/components/TVChart/types.ts +++ b/components/TVChart/types.ts @@ -3,5 +3,5 @@ import Wei from '@synthetixio/wei'; export type ChartPosition = { size: Wei; price: Wei; - liqPrice: Wei | undefined; + liqPrice?: Wei; }; diff --git a/components/TVChart/utils.ts b/components/TVChart/utils.ts index 20973e5d3e..00ce999285 100644 --- a/components/TVChart/utils.ts +++ b/components/TVChart/utils.ts @@ -1,10 +1,19 @@ import { ResolutionString } from 'public/static/charting_library/charting_library'; export const resolutionToSeconds = (resolution: ResolutionString): number => { - if (!Number.isNaN(resolution)) { + if (!isNaN(Number(resolution))) { return Number(resolution) * 60; } else { - const period = resolution === '1D' ? 86400 : 3600; + const period = + resolution === '1D' + ? 86400 + : resolution === '3D' + ? 86400 * 3 + : resolution === '7D' + ? 86400 * 7 + : resolution === '30D' + ? 86400 * 30 + : 3600; return period; } }; diff --git a/components/Tab/Tab.tsx b/components/Tab/Tab.tsx index 7c29a41043..24c6456974 100644 --- a/components/Tab/Tab.tsx +++ b/components/Tab/Tab.tsx @@ -63,11 +63,12 @@ const StyledTabButton = styled.button` ${resetButtonCSS}; font-family: ${(props) => props.theme.fonts.bold}; padding: 0; - color: ${(props) => (props.active ? props.theme.colors.white : props.theme.colors.blueberry)}; + color: ${(props) => + props.active ? props.theme.colors.selectedTheme.button.text : props.theme.colors.blueberry}; border-bottom: 2px solid ${(props) => (props.active ? props.theme.colors.goldColors.color1 : 'transparent')}; &:hover { - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; } margin-right: 12px; padding-bottom: 3px; diff --git a/components/Table/Pagination.tsx b/components/Table/Pagination.tsx index 694250cf05..35fc199138 100644 --- a/components/Table/Pagination.tsx +++ b/components/Table/Pagination.tsx @@ -57,7 +57,7 @@ const Pagination: FC = ({ }; const PageInfo = styled.span` - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; `; const PaginationContainer = styled(GridDivCenteredCol)` @@ -78,7 +78,7 @@ const ArrowButton = styled.button` svg { width: 14px; height: 14px; - fill: ${(props) => props.theme.colors.common.primaryWhite}; + fill: ${(props) => props.theme.colors.selectedTheme.button.text}; } `; diff --git a/components/Table/Table.tsx b/components/Table/Table.tsx index be79b71f9a..b1f99fc5ad 100644 --- a/components/Table/Table.tsx +++ b/components/Table/Table.tsx @@ -37,6 +37,7 @@ type TableProps = { hideHeaders?: boolean; highlightRowsOnHover?: boolean; sortBy?: object[]; + showShortList?: boolean; }; export const Table: FC = ({ @@ -54,6 +55,7 @@ export const Table: FC = ({ hiddenColumns = [], hideHeaders, highlightRowsOnHover, + showShortList, sortBy = [], }) => { const memoizedColumns = useMemo( @@ -90,7 +92,13 @@ export const Table: FC = ({ columns: memoizedColumns, data, initialState: { - pageSize: showPagination ? (pageSize ? pageSize : MAX_PAGE_ROWS) : data.length, + pageSize: showPagination + ? pageSize + ? pageSize + : MAX_PAGE_ROWS + : showShortList + ? pageSize ?? 5 + : data.length, hiddenColumns: hiddenColumns, sortBy: sortBy, }, @@ -169,7 +177,7 @@ export const Table: FC = ({ {!!noResultsMessage && noResultsMessage} - {showPagination && data.length > (pageSize ? pageSize : MAX_PAGE_ROWS) ? ( + {!showShortList && showPagination && data.length > (pageSize ? pageSize : MAX_PAGE_ROWS) ? ( = ({ const TableContainer = styled.div` overflow-x: auto; - //display: block; - //width: 100%; `; const StyledSpinner = styled(Spinner)` @@ -195,12 +201,9 @@ const StyledSpinner = styled(Spinner)` margin: 30px auto; `; -export const TableRow = styled.div` - //display: none; -`; +export const TableRow = styled.div``; const TableBody = styled.div` - //width: 100%; overflow-y: auto; overflow-x: hidden; min-width: fit-content; @@ -216,14 +219,14 @@ const TableBodyRow = styled.div<{ $highlightRowsOnHover?: boolean }>` } &:nth-child(odd) { - background-color: rgba(255, 255, 255, 0.01); + background-color: ${(props) => props.theme.colors.selectedTheme.table.fill}; } ${(props) => props.$highlightRowsOnHover && css` &:hover { - background-color: rgba(255, 255, 255, 0.1); + background-color: ${(props) => props.theme.colors.selectedTheme.table.hover}; } `} `; @@ -240,7 +243,6 @@ const TableCell = styled(FlexDivCentered)` const TableCellHead = styled(TableCell)<{ hideHeaders: boolean }>` user-select: none; - //probably shouldn't be extending the tableCell styles to then overwrite them &:first-child { padding-left: 18px; } @@ -259,7 +261,7 @@ const SortIconContainer = styled.span` const ReactTable = styled.div<{ palette: TablePalette }>` width: 100%; height: 100%; - overflow-x: auto; + overflow: auto; position: relative; border: ${(props) => props.theme.colors.selectedTheme.border}; border-radius: 10px; @@ -271,13 +273,13 @@ const ReactTable = styled.div<{ palette: TablePalette }>` max-height: calc(100% - ${CARD_HEIGHT}); } ${TableCell} { - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 12px; height: ${CARD_HEIGHT}; font-family: ${(props) => props.theme.fonts.mono}; } ${TableCellHead} { - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; font-family: ${(props) => props.theme.fonts.regular}; border-bottom: ${(props) => props.theme.colors.selectedTheme.border}; } @@ -289,13 +291,13 @@ const ReactTable = styled.div<{ palette: TablePalette }>` const StyledSortDownIcon = styled(SortDownIcon)` width: 5px; height: 5px; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; `; const StyledSortUpIcon = styled(SortUpIcon)` width: 5px; height: 5px; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; `; export default Table; diff --git a/components/Text/PositionType.tsx b/components/Text/PositionType.tsx index 8f3479a496..9b6371f75e 100644 --- a/components/Text/PositionType.tsx +++ b/components/Text/PositionType.tsx @@ -16,7 +16,7 @@ const StyledText = styled.p<{ $side: PositionProps['side'] }>` ${(props) => props.$side === 'long' && css` - color: rgba(127, 212, 130, 0.8); + color: ${(props) => props.theme.colors.selectedTheme.green}; background: rgba(127, 212, 130, 0.1); font-family: ${(props) => props.theme.fonts.monoBold}; font-variant: all-small-caps; @@ -26,7 +26,7 @@ const StyledText = styled.p<{ $side: PositionProps['side'] }>` ${(props) => props.$side === 'short' && css` - color: rgba(239, 104, 104, 0.8); + color: ${(props) => props.theme.colors.selectedTheme.red}; background: rgba(239, 104, 104, 0.1); font-family: ${(props) => props.theme.fonts.monoBold}; font-variant: all-small-caps; diff --git a/components/Tooltip/TimerTooltip.tsx b/components/Tooltip/TimerTooltip.tsx index 74ea24657f..093e83d8c4 100644 --- a/components/Tooltip/TimerTooltip.tsx +++ b/components/Tooltip/TimerTooltip.tsx @@ -77,10 +77,10 @@ const TimerTooltip = (props: ToolTipProps) => { {activeMouse && ( - {t(`exchange.market-details-card.timer-tooltip.last-update`)} + {t(`exchange.market-details-card.timer-tooltip.last-update`)} {`${formatTimeUnit(minutes)}:${formatTimeUnit(seconds)} `} - {t(timeUnitsFormat)} + {t(timeUnitsFormat)} @@ -91,4 +91,13 @@ const TimerTooltip = (props: ToolTipProps) => { export default TimerTooltip; -const Container = styled.div``; +const Container = styled.div` + padding-top: 10px; + padding-bottom: 10px; + p { + font-family: ${(props) => props.theme.fonts.mono}; + span { + font-family: ${(props) => props.theme.fonts.regular}; + } + } +`; diff --git a/components/Tooltip/TooltipStyles.tsx b/components/Tooltip/TooltipStyles.tsx index 85804ae5f8..6da7b6f2e9 100644 --- a/components/Tooltip/TooltipStyles.tsx +++ b/components/Tooltip/TooltipStyles.tsx @@ -1,4 +1,4 @@ -import styled from 'styled-components'; +import styled, { css } from 'styled-components'; // base styles for each component that make up the tooltip. @@ -13,37 +13,30 @@ interface ToolTipStyleProps { } export const Tooltip = styled.div` - height: ${(props) => props.height || '56px'}; width: max-content; max-width: ${(props) => props.width || '472.5px'}; - background: linear-gradient(180deg, #1E1D1D 0%, #161515 100%); - border: 1px solid rgba(255, 255, 255, 0.1); + background: ${(props) => props.theme.colors.selectedTheme.button.fill}; + border: ${(props) => props.theme.colors.selectedTheme.border}; box-sizing: border-box; - box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.25), inset 0px 1px 0px rgba(255, 255, 255, 0.1), inset 0px 0px 20px rgba(255, 255, 255, 0.03); - border-radius: 10px; - padding: 0.75em; + border-radius: 8px; + padding: 0 10px; + margin: 0; position: absolute; top: ${(props) => props.top}; bottom: ${(props) => props.bottom}; left: ${(props) => props.left}; right: ${(props) => props.right}; + z-index: 2; p, span { - margin: auto; - margin-left: 3px; - font-size: 12px; - text-align: left; - font-family: ${(props) => props.theme.fonts.mono}; - font-style: normal; - font-weight: 400; - line-height: 150%; - white-space: pre-line; - color: ${(props) => props.theme.colors.white}; + font-size: 13px; + font-family: ${(props) => props.theme.fonts.regular}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; } ${(props) => props.preset === 'top' && - ` + css` top: 0; left: 50%; transform: translate(-50%, -150%); @@ -53,7 +46,7 @@ export const Tooltip = styled.div` ${(props) => props.preset === 'bottom' && - ` + css` bottom: 0; transform: translate(-25%, 125%); `} @@ -61,14 +54,14 @@ export const Tooltip = styled.div` ${(props) => props.preset === 'left' && - ` + css` left: 0; transform: translate(-105%, -80%); `} ${(props) => props.preset === 'right' && - ` + css` right: 0; transform: translate(105%, -80%); `} diff --git a/constants/NotificationContainer.tsx b/constants/NotificationContainer.tsx index 0e589a4cda..f466595546 100644 --- a/constants/NotificationContainer.tsx +++ b/constants/NotificationContainer.tsx @@ -29,7 +29,7 @@ const StyledToastContainer = styled(ToastContainer)` .Toastify__toast { border: ${(props) => props.theme.colors.selectedTheme.border}; background: ${(props) => props.theme.colors.selectedTheme.button.background}; - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; } .Toastify__toast-body { font-family: ${(props) => props.theme.fonts.regular}; diff --git a/constants/address.ts b/constants/address.ts index 68a94b74c7..996fc09024 100644 --- a/constants/address.ts +++ b/constants/address.ts @@ -1 +1,3 @@ export const KWENTA_REFERRAL_ADDRESS = '0x08e30BFEE9B73c18F9770288DDd13203A4887460'; + +export const ENS_REVERSE_LOOKUP = '0x3671aE578E63FdF66ad4F3E12CC0c0d71Ac7510C'; diff --git a/constants/links.ts b/constants/links.ts index 9f511dfa26..3411264df1 100644 --- a/constants/links.ts +++ b/constants/links.ts @@ -4,6 +4,7 @@ export const PROD_HOSTNAME = 'kwenta.io'; export const EXTERNAL_LINKS = { Trading: { + Legacy: 'https://legacy.kwenta.io/exchange', DexAG: 'https://dex.ag/', Uniswap: 'https://uniswap.exchange/', OneInch: `https://1inch.exchange/`, @@ -16,7 +17,7 @@ export const EXTERNAL_LINKS = { }, Social: { Twitter: 'https://twitter.com/kwenta_io', - Medium: 'https://blog.kwenta.io/', + Mirror: 'https://mirror.xyz/kwenta.eth', Discord: 'https://discord.gg/kwenta', GitHub: 'https://github.com/kwenta/kwenta', }, @@ -28,6 +29,16 @@ export const EXTERNAL_LINKS = { Docs: { DocsRoot: 'https://docs.kwenta.io/', FeeReclamation: 'https://docs.kwenta.io/resources/fee-reclamation', + HowToTrade: 'https://docs.kwenta.io/products/futures', + Governance: 'https://docs.kwenta.io/dao/governance-framework', + DaoRoles: 'https://docs.kwenta.io/dao/dao-roles', + HowToUse: 'https://docs.kwenta.io/onboard/how-to-start-using-kwenta', + Perpetuals: 'https://docs.kwenta.io/products/futures', + Shorting: ' https://docs.kwenta.io/products/what-is-shorting', + Spot: 'https://docs.kwenta.io/products/swaps ', + DevDao: 'https://docs.kwenta.io/dao/contribute/devdao-contribute', + MarketingDao: 'https://docs.kwenta.io/dao/contribute/marketingDAO', + Faq: 'https://docs.kwenta.io/resources/faq', }, Explorer: { Optimism: 'https://optimistic.etherscan.io/tx', @@ -36,4 +47,7 @@ export const EXTERNAL_LINKS = { Trade: { NextPriceBlogPost: 'https://docs.kwenta.io/products/futures/next-price', }, + Kips: { + Home: 'https://kips.kwenta.io/all-kip/', + }, }; diff --git a/constants/queryKeys.ts b/constants/queryKeys.ts index 8cfe7324b6..971336dede 100644 --- a/constants/queryKeys.ts +++ b/constants/queryKeys.ts @@ -36,6 +36,8 @@ export const QUERY_KEYS = { }, Network: { EthGasPrice: ['network', 'ethGasPrice'], + ENSNames: (addresses: string[]) => ['network', 'ensNames', addresses], + ENSAvatar: (ensName: string) => ['network', 'ensNames', ensName], }, WalletBalances: { Synths: (walletAddress: string, networkId: NetworkId) => [ diff --git a/constants/routes.ts b/constants/routes.ts index 38074f697c..599378df1e 100644 --- a/constants/routes.ts +++ b/constants/routes.ts @@ -7,8 +7,9 @@ const normalizeRoute = (baseURL: string, path: string, queryParam: string) => export const ROUTES = { Home: { + Root: '/', Overview: normalizeRoute('/dashboard', 'overview', 'tab'), - Positions: normalizeRoute('/dashboard', 'positions', 'tab'), + History: normalizeRoute('/dashboard', 'history', 'tab'), Markets: normalizeRoute('/dashboard', 'markets', 'tab'), }, Dashboard: { diff --git a/contexts/CustomThemeContext.tsx b/contexts/CustomThemeContext.tsx deleted file mode 100644 index 994f544e65..0000000000 --- a/contexts/CustomThemeContext.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React from 'react'; -import { ThemeProvider } from 'styled-components'; - -import theme from 'styles/theme'; -import { themeColors } from 'styles/theme/colors'; -import useLocalStorage from 'hooks/useLocalStorage'; - -export type ThemeName = keyof typeof themeColors; - -type CustomThemeContextType = { - setTheme(name: ThemeName): void; -}; - -export const CustomThemeContext = React.createContext({ - setTheme: () => {}, -}); - -export const CustomThemeProvider: React.FC = ({ children }) => { - const [customTheme, setTheme] = useLocalStorage('currentTheme', 'dark'); - - const themeObj = React.useMemo( - () => ({ - ...theme, - colors: { ...theme.colors, selectedTheme: themeColors[customTheme] }, - }), - [customTheme] - ); - - return ( - - {children} - - ); -}; - -export const useSetTheme = () => { - const { setTheme } = React.useContext(CustomThemeContext); - - return setTheme; -}; diff --git a/hooks/useENSAvatar.ts b/hooks/useENSAvatar.ts new file mode 100644 index 0000000000..f8a4a13652 --- /dev/null +++ b/hooks/useENSAvatar.ts @@ -0,0 +1,17 @@ +import { useQuery, UseQueryOptions } from 'react-query'; +import QUERY_KEYS from 'constants/queryKeys'; + +const useENSAvatar = (provider: any, ensName: string, options?: UseQueryOptions) => { + return useQuery( + QUERY_KEYS.Network.ENSAvatar(ensName), + async () => { + const avatar = ensName.endsWith('.eth') ? await provider.getAvatar(ensName) : null; + return avatar; + }, + { + ...options, + } + ); +}; + +export default useENSAvatar; diff --git a/hooks/useENSs.ts b/hooks/useENSs.ts new file mode 100644 index 0000000000..147785f9dc --- /dev/null +++ b/hooks/useENSs.ts @@ -0,0 +1,49 @@ +import Connector from 'containers/Connector'; +import { useQuery, UseQueryOptions } from 'react-query'; +import { Contract } from 'ethers'; +import { ENS_REVERSE_LOOKUP } from 'constants/address'; +import reverseRecordsAbi from 'lib/abis/ReverseRecords.json'; +import QUERY_KEYS from 'constants/queryKeys'; +import { useRecoilValue } from 'recoil'; +import { appReadyState } from 'store/app'; +import { isL2State } from 'store/wallet'; + +const ADDRESSES_PER_LOOKUP = 1500; + +const useENSs = (addresses: string[], options?: UseQueryOptions) => { + const isAppReady = useRecoilValue(appReadyState); + const isL2 = useRecoilValue(isL2State); + + const { staticMainnetProvider } = Connector.useContainer(); + + return useQuery( + QUERY_KEYS.Network.ENSNames(addresses), + async () => { + const ReverseLookup = new Contract( + ENS_REVERSE_LOOKUP, + reverseRecordsAbi, + staticMainnetProvider + ); + + let ensPromises = []; + for (let i = 0; i < addresses.length; i += ADDRESSES_PER_LOOKUP) { + const addressesToLookup = addresses.slice(i, i + ADDRESSES_PER_LOOKUP); + const ensNamesPromise = ReverseLookup.getNames(addressesToLookup); + ensPromises.push(ensNamesPromise); + } + + const ensPromiseResult = await Promise.all(ensPromises); + const ensInfo = ensPromiseResult.flat(1).map((val: string, ind: number) => { + return val !== '' ? val : addresses[ind]; + }); + + return ensInfo; + }, + { + enabled: isAppReady && isL2 && addresses.length > 0, + ...options, + } + ); +}; + +export default useENSs; diff --git a/lib/abis/ReverseRecords.json b/lib/abis/ReverseRecords.json new file mode 100644 index 0000000000..0fa53904f3 --- /dev/null +++ b/lib/abis/ReverseRecords.json @@ -0,0 +1,32 @@ +[ + { + "inputs": [ + { + "internalType": "contract ENS", + "name": "_ens", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "addresses", + "type": "address[]" + } + ], + "name": "getNames", + "outputs": [ + { + "internalType": "string[]", + "name": "r", + "type": "string[]" + } + ], + "stateMutability": "view", + "type": "function" + } +] \ No newline at end of file diff --git a/next.config.js b/next.config.js index cce9dc22e6..e0986e9458 100644 --- a/next.config.js +++ b/next.config.js @@ -78,22 +78,16 @@ module.exports = withPlugins([ exportPathMap: function (defaultPathMap) { return { ...defaultPathMap, + '/': { + page: '/', + }, '/dashboard': { page: '/dashboard/[[...tab]]', }, - // '/exchange': { - // page: '/exchange/[[...market]]', - // }, - }; - }, - async redirects() { - return [ - { - source: '/', - destination: '/dashboard', - permanent: true, + '/exchange': { + page: '/exchange/[[...market]]', }, - ]; + }; }, }, ]); diff --git a/package-lock.json b/package-lock.json index a650abdcc2..ec0fa10943 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,13 +17,13 @@ "@reach/accordion": "0.15.1", "@reach/dialog": "0.15.0", "@reach/tabs": "0.15.0", - "@synthetixio/assets": "2.0.12", - "@synthetixio/contracts-interface": "2.68.2", - "@synthetixio/optimism-networks": "2.68.2", - "@synthetixio/providers": "2.68.2", - "@synthetixio/queries": "2.68.2", - "@synthetixio/transaction-notifier": "2.68.2", - "@synthetixio/wei": "2.68.2", + "@synthetixio/assets": "2.0.13", + "@synthetixio/contracts-interface": "2.71.2", + "@synthetixio/optimism-networks": "2.71.2", + "@synthetixio/providers": "2.71.2", + "@synthetixio/queries": "2.71.2", + "@synthetixio/transaction-notifier": "2.71.2", + "@synthetixio/wei": "2.71.2", "@tippyjs/react": "4.1.0", "@uniswap/widgets": "^1.0.0", "axios": "0.21.1", @@ -41,6 +41,7 @@ "imagemin-mozjpeg": "^10.0.0", "immer": "9.0.6", "intercept-stdout": "^0.1.2", + "lightweight-charts": "^3.8.0", "lodash": "4.17.20", "moment-business-time": "1.1.1", "next": "12.1.6", @@ -61,7 +62,7 @@ "react-table": "7.7.0", "react-toastify": "7.0.3", "recharts": "2.0.9", - "recoil": "0.3.1", + "recoil": "0.6.1", "slick-carousel": "1.8.1", "styled-components": "5.1.1", "styled-media-query": "2.1.2", @@ -112,6 +113,7 @@ "eslint-plugin-react-hooks": "4.2.0", "eslint-plugin-testing-library": "^5.1.0", "eslint-plugin-ui-testing": "^2.0.0", + "html-to-image": "^1.9.0", "husky": "5.0.9", "imagemin-optipng": "8.0.0", "imagemin-svgo": "8.0.0", @@ -133,7 +135,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.0" }, @@ -177,7 +178,6 @@ "version": "7.17.8", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", - "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", @@ -397,7 +397,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", @@ -466,7 +465,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dev": true, "dependencies": { "@babel/types": "^7.17.0" }, @@ -532,7 +530,6 @@ "version": "7.17.8", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", - "dev": true, "dependencies": { "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", @@ -5484,7 +5481,6 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -5492,14 +5488,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.11", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", - "dev": true + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", - "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -7012,7 +7006,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -7025,7 +7018,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -7034,7 +7026,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -18401,19 +18392,17 @@ } }, "node_modules/@synthetixio/assets": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@synthetixio/assets/-/assets-2.0.12.tgz", - "integrity": "sha512-yUtd9cvpohmPtajsb4Cinntx6wt8XuG+W1o3PwsrLYKhSEiCR4Psuslel2QCntnsY38yqLPmPDjpPYdyezeaHQ==" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@synthetixio/assets/-/assets-2.0.13.tgz", + "integrity": "sha512-H/2tpCJxbVWdawXNfF/Kz92w5nGkvYLVfiMaM6wpttNvtzV2Ii7VNDYwgr0EQ0Kax5wU6bOwp1oeUQ1Oa2JEyA==" }, "node_modules/@synthetixio/contracts-interface": { - "version": "2.68.2", - "resolved": "https://registry.npmjs.org/@synthetixio/contracts-interface/-/contracts-interface-2.68.2.tgz", - "integrity": "sha512-tRjMe7C4gBgOvBwQv9YYx2Ogl7inQNz0PvoeRLnIdEHr8OjQVZZtUf+ORd6uYsS12M3NkhPlBFgdNf5k8XSiOw==", + "version": "2.71.2", + "resolved": "https://registry.npmjs.org/@synthetixio/contracts-interface/-/contracts-interface-2.71.2.tgz", + "integrity": "sha512-9NU8QITXphxrEwtSMpjRdde3lxRswr5QaQedZo9ge8bMyyOFH+fL+M1K3gl2y9o8CUiEY66CaJwoiiP2U45HAg==", "dependencies": { "ethers": "5.5.3", - "lodash": "4.17.19", - "synthetix": "2.68.2", - "web3-utils": "1.2.11" + "synthetix": "2.71.2" } }, "node_modules/@synthetixio/contracts-interface/node_modules/@ethersproject/abi": { @@ -19085,6 +19074,16 @@ "@ethersproject/strings": "^5.5.0" } }, + "node_modules/@synthetixio/contracts-interface/node_modules/eth-lib": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", + "integrity": "sha512-VqEBQKH92jNsaE8lG9CTq8M/bc12gdAfb5MY8Ro1hVyXkh7rOtY3m5tRHK3Hus5HqIAAwU2ivcUjTLVwsvf/kw==", + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, "node_modules/@synthetixio/contracts-interface/node_modules/ethers": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.5.3.tgz", @@ -19132,10 +19131,49 @@ "@ethersproject/wordlists": "5.5.0" } }, - "node_modules/@synthetixio/contracts-interface/node_modules/lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + "node_modules/@synthetixio/contracts-interface/node_modules/synthetix": { + "version": "2.71.2", + "resolved": "https://registry.npmjs.org/synthetix/-/synthetix-2.71.2.tgz", + "integrity": "sha512-rl4JR2atAMsGS3Fa6hMoZBALVo2Mxb4JyR26chrmabTinN1omlCJRiwkgP1ivMPTcn5np8k/dxsDVm+w34KDHw==", + "dependencies": { + "abi-decoder": "2.3.0", + "commander": "8.1.0", + "inquirer": "^6.5.2", + "inquirer-list-search-prompt": "^1.0.2", + "js-levenshtein": "^1.1.6", + "pretty-error": "^2.1.1", + "solidity-parser-antlr": "^0.4.11", + "web3-utils": "1.2.2" + }, + "bin": { + "snx": "bin.js" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/@synthetixio/contracts-interface/node_modules/web3-utils": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.2.tgz", + "integrity": "sha512-joF+s3243TY5cL7Z7y4h1JsJpUCf/kmFmj+eJar7Y2yNIGVcW961VyrAms75tjUysSuHaUQ3eQXjBEUJueT52A==", + "dependencies": { + "bn.js": "4.11.8", + "eth-lib": "0.2.7", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.9.1", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@synthetixio/contracts-interface/node_modules/web3-utils/node_modules/bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" }, "node_modules/@synthetixio/contracts-interface/node_modules/ws": { "version": "7.4.6", @@ -19373,26 +19411,16 @@ } }, "node_modules/@synthetixio/optimism-networks": { - "version": "2.68.2", - "resolved": "https://registry.npmjs.org/@synthetixio/optimism-networks/-/optimism-networks-2.68.2.tgz", - "integrity": "sha512-TqgGXWmIFK5E7mH6Ocb5sKagBHXRPUFT9ePn9r+8Bx0KOfdrt8xDMtaLnRn56FaHOqhPAPbvnytNYhzciNM0Ig==", + "version": "2.71.2", + "resolved": "https://registry.npmjs.org/@synthetixio/optimism-networks/-/optimism-networks-2.71.2.tgz", + "integrity": "sha512-Inf6fHu8OvAn4SSckmJzTtFZU0YBx5jC+5SEG9csCO6HTCsbmF9B4ucxtROQIeM9caZ+bpBR6GsYjAKsP6XAug==", "dependencies": { "@eth-optimism/watcher": "^0.0.1-alpha.9", - "@metamask/providers": "8.1.1" - } - }, - "node_modules/@synthetixio/providers": { - "version": "2.68.2", - "resolved": "https://registry.npmjs.org/@synthetixio/providers/-/providers-2.68.2.tgz", - "integrity": "sha512-O/9pZXsvWWvYI62eC9AP1VuQU4xmUZDN9sbuR08lHe8kx01SCLx08tMi50uFs+mk8SjgqP5JtJBhZ07F9bpKlA==", - "dependencies": { - "@eth-optimism/provider": "0.0.1-alpha.14", - "@synthetixio/contracts-interface": "2.68.2", - "@synthetixio/optimism-networks": "2.68.2", + "@metamask/providers": "8.1.1", "ethers": "5.5.3" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/abi": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/abi": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.5.0.tgz", "integrity": "sha512-loW7I4AohP5KycATvc0MgujU6JyCHPqHdeoo9z3Nr9xEiNioxa65ccdm1+fsoJhkuhdRtfcL8cfyGamz2AxZ5w==", @@ -19418,7 +19446,7 @@ "@ethersproject/strings": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/abstract-provider": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/abstract-provider": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz", "integrity": "sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg==", @@ -19442,7 +19470,7 @@ "@ethersproject/web": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/abstract-signer": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/abstract-signer": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz", "integrity": "sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA==", @@ -19464,7 +19492,7 @@ "@ethersproject/properties": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/address": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/address": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.5.0.tgz", "integrity": "sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw==", @@ -19486,7 +19514,7 @@ "@ethersproject/rlp": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/base64": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/base64": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.5.0.tgz", "integrity": "sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA==", @@ -19504,7 +19532,7 @@ "@ethersproject/bytes": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/basex": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/basex": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.5.0.tgz", "integrity": "sha512-ZIodwhHpVJ0Y3hUCfUucmxKsWQA5TMnavp5j/UOuDdzZWzJlRmuOjcTMIGgHCYuZmHt36BfiSyQPSRskPxbfaQ==", @@ -19523,7 +19551,7 @@ "@ethersproject/properties": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/bignumber": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/bignumber": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.5.0.tgz", "integrity": "sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg==", @@ -19543,7 +19571,7 @@ "bn.js": "^4.11.9" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/bytes": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/bytes": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.5.0.tgz", "integrity": "sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog==", @@ -19561,7 +19589,7 @@ "@ethersproject/logger": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/constants": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/constants": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.5.0.tgz", "integrity": "sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ==", @@ -19579,7 +19607,7 @@ "@ethersproject/bignumber": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/contracts": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/contracts": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.5.0.tgz", "integrity": "sha512-2viY7NzyvJkh+Ug17v7g3/IJC8HqZBDcOjYARZLdzRxrfGlRgmYgl6xPRKVbEzy1dWKw/iv7chDcS83pg6cLxg==", @@ -19606,7 +19634,7 @@ "@ethersproject/transactions": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/hash": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/hash": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.5.0.tgz", "integrity": "sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg==", @@ -19631,7 +19659,7 @@ "@ethersproject/strings": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/hdnode": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/hdnode": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.5.0.tgz", "integrity": "sha512-mcSOo9zeUg1L0CoJH7zmxwUG5ggQHU1UrRf8jyTYy6HxdZV+r0PBoL1bxr+JHIPXRzS6u/UW4mEn43y0tmyF8Q==", @@ -19660,7 +19688,7 @@ "@ethersproject/wordlists": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/json-wallets": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/json-wallets": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.5.0.tgz", "integrity": "sha512-9lA21XQnCdcS72xlBn1jfQdj2A1VUxZzOzi9UkNdnokNKke/9Ya2xA9aIK1SC3PQyBDLt4C+dfps7ULpkvKikQ==", @@ -19690,7 +19718,7 @@ "scrypt-js": "3.0.1" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/keccak256": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/keccak256": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.5.0.tgz", "integrity": "sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg==", @@ -19709,7 +19737,7 @@ "js-sha3": "0.8.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/logger": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/logger": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.5.0.tgz", "integrity": "sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg==", @@ -19724,7 +19752,7 @@ } ] }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/networks": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/networks": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.5.2.tgz", "integrity": "sha512-NEqPxbGBfy6O3x4ZTISb90SjEDkWYDUbEeIFhJly0F7sZjoQMnj5KYzMSkMkLKZ+1fGpx00EDpHQCy6PrDupkQ==", @@ -19742,7 +19770,7 @@ "@ethersproject/logger": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/pbkdf2": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/pbkdf2": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.5.0.tgz", "integrity": "sha512-SaDvQFvXPnz1QGpzr6/HToLifftSXGoXrbpZ6BvoZhmx4bNLHrxDe8MZisuecyOziP1aVEwzC2Hasj+86TgWVg==", @@ -19761,7 +19789,7 @@ "@ethersproject/sha2": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/properties": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/properties": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.5.0.tgz", "integrity": "sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA==", @@ -19779,7 +19807,7 @@ "@ethersproject/logger": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/providers": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/providers": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.5.2.tgz", "integrity": "sha512-hkbx7x/MKcRjyrO4StKXCzCpWer6s97xnm34xkfPiarhtEUVAN4TBBpamM+z66WcTt7H5B53YwbRj1n7i8pZoQ==", @@ -19815,7 +19843,7 @@ "ws": "7.4.6" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/random": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/random": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.5.1.tgz", "integrity": "sha512-YaU2dQ7DuhL5Au7KbcQLHxcRHfgyNgvFV4sQOo0HrtW3Zkrc9ctWNz8wXQ4uCSfSDsqX2vcjhroxU5RQRV0nqA==", @@ -19834,7 +19862,7 @@ "@ethersproject/logger": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/rlp": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/rlp": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.5.0.tgz", "integrity": "sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA==", @@ -19853,7 +19881,7 @@ "@ethersproject/logger": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/sha2": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/sha2": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.5.0.tgz", "integrity": "sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA==", @@ -19873,7 +19901,7 @@ "hash.js": "1.1.7" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/signing-key": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/signing-key": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.5.0.tgz", "integrity": "sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng==", @@ -19896,7 +19924,7 @@ "hash.js": "1.1.7" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/solidity": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/solidity": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.5.0.tgz", "integrity": "sha512-9NgZs9LhGMj6aCtHXhtmFQ4AN4sth5HuFXVvAQtzmm0jpSCNOTGtrHZJAeYTh7MBjRR8brylWZxBZR9zDStXbw==", @@ -19919,7 +19947,7 @@ "@ethersproject/strings": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/strings": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/strings": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.5.0.tgz", "integrity": "sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ==", @@ -19939,7 +19967,7 @@ "@ethersproject/logger": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/transactions": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/transactions": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.5.0.tgz", "integrity": "sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA==", @@ -19965,7 +19993,7 @@ "@ethersproject/signing-key": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/units": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/units": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.5.0.tgz", "integrity": "sha512-7+DpjiZk4v6wrikj+TCyWWa9dXLNU73tSTa7n0TSJDxkYbV3Yf1eRh9ToMLlZtuctNYu9RDNNy2USq3AdqSbag==", @@ -19985,7 +20013,7 @@ "@ethersproject/logger": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/wallet": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/wallet": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.5.0.tgz", "integrity": "sha512-Mlu13hIctSYaZmUOo7r2PhNSd8eaMPVXe1wxrz4w4FCE4tDYBywDH+bAR1Xz2ADyXGwqYMwstzTrtUVIsKDO0Q==", @@ -20017,7 +20045,7 @@ "@ethersproject/wordlists": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/web": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/web": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.5.1.tgz", "integrity": "sha512-olvLvc1CB12sREc1ROPSHTdFCdvMh0J5GSJYiQg2D0hdD4QmJDy8QYDb1CvoqD/bF1c++aeKv2sR5uduuG9dQg==", @@ -20039,7 +20067,7 @@ "@ethersproject/strings": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/@ethersproject/wordlists": { + "node_modules/@synthetixio/optimism-networks/node_modules/@ethersproject/wordlists": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.5.0.tgz", "integrity": "sha512-bL0UTReWDiaQJJYOC9sh/XcRu/9i2jMrzf8VLRmPKx58ckSlOJiohODkECCO50dtLZHcGU6MLXQ4OOrgBwP77Q==", @@ -20061,7 +20089,7 @@ "@ethersproject/strings": "^5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/ethers": { + "node_modules/@synthetixio/optimism-networks/node_modules/ethers": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.5.3.tgz", "integrity": "sha512-fTT4WT8/hTe/BLwRUtl7I5zlpF3XC3P/Xwqxc5AIP2HGlH15qpmjs0Ou78az93b1rLITzXLFxoNX63B8ZbUd7g==", @@ -20108,7 +20136,7 @@ "@ethersproject/wordlists": "5.5.0" } }, - "node_modules/@synthetixio/providers/node_modules/ws": { + "node_modules/@synthetixio/optimism-networks/node_modules/ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", @@ -20128,34 +20156,18 @@ } } }, - "node_modules/@synthetixio/queries": { - "version": "2.68.2", - "resolved": "https://registry.npmjs.org/@synthetixio/queries/-/queries-2.68.2.tgz", - "integrity": "sha512-7LGDLY7H4I27tJhBjFG6FS0h88x5Nhestpf/Z2nMm8RRpxjhGyMGmNd43UcPAJq9tvrSh6o3bfHzK1INqiQz4A==", + "node_modules/@synthetixio/providers": { + "version": "2.71.2", + "resolved": "https://registry.npmjs.org/@synthetixio/providers/-/providers-2.71.2.tgz", + "integrity": "sha512-QdLl/IkFuFiCBWIH1phRpU+9ytDoTpf+ptS4LMmvlGRqNcy/Dd9oY+R9DGzuBhwyVSCa4lKYRvi4eNAyDciTYA==", "dependencies": { - "@snapshot-labs/snapshot.js": "0.3.22", - "@synthetixio/contracts-interface": "2.68.2", - "@synthetixio/optimism-networks": "2.68.2", - "@synthetixio/providers": "2.68.2", - "@synthetixio/transaction-notifier": "2.68.2", - "@synthetixio/wei": "2.68.2", - "axios": "^0.21.4", - "bignumber.js": "9.0.1", - "date-fns": "2.19.0", - "ethcall": "3.3.0", - "ethers": "5.5.3", - "graphql": "15.5.0", - "graphql-request": "3.4.0", - "lodash": "^4.17.21", - "maxibon-codegen-graph-ts": "0.2.0" - }, - "peerDependencies": { - "react": "17.x", - "react-dom": "17.x", - "react-query": "3.16.x" + "@eth-optimism/provider": "0.0.1-alpha.14", + "@synthetixio/contracts-interface": "2.71.2", + "@synthetixio/optimism-networks": "2.71.2", + "ethers": "5.5.3" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/abi": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/abi": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.5.0.tgz", "integrity": "sha512-loW7I4AohP5KycATvc0MgujU6JyCHPqHdeoo9z3Nr9xEiNioxa65ccdm1+fsoJhkuhdRtfcL8cfyGamz2AxZ5w==", @@ -20181,7 +20193,7 @@ "@ethersproject/strings": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/abstract-provider": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/abstract-provider": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz", "integrity": "sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg==", @@ -20205,7 +20217,7 @@ "@ethersproject/web": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/abstract-signer": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/abstract-signer": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz", "integrity": "sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA==", @@ -20227,7 +20239,7 @@ "@ethersproject/properties": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/address": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/address": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.5.0.tgz", "integrity": "sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw==", @@ -20249,7 +20261,7 @@ "@ethersproject/rlp": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/base64": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/base64": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.5.0.tgz", "integrity": "sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA==", @@ -20267,7 +20279,7 @@ "@ethersproject/bytes": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/basex": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/basex": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.5.0.tgz", "integrity": "sha512-ZIodwhHpVJ0Y3hUCfUucmxKsWQA5TMnavp5j/UOuDdzZWzJlRmuOjcTMIGgHCYuZmHt36BfiSyQPSRskPxbfaQ==", @@ -20286,7 +20298,7 @@ "@ethersproject/properties": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/bignumber": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/bignumber": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.5.0.tgz", "integrity": "sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg==", @@ -20306,7 +20318,7 @@ "bn.js": "^4.11.9" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/bytes": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/bytes": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.5.0.tgz", "integrity": "sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog==", @@ -20324,7 +20336,7 @@ "@ethersproject/logger": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/constants": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/constants": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.5.0.tgz", "integrity": "sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ==", @@ -20342,7 +20354,7 @@ "@ethersproject/bignumber": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/contracts": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/contracts": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.5.0.tgz", "integrity": "sha512-2viY7NzyvJkh+Ug17v7g3/IJC8HqZBDcOjYARZLdzRxrfGlRgmYgl6xPRKVbEzy1dWKw/iv7chDcS83pg6cLxg==", @@ -20369,7 +20381,7 @@ "@ethersproject/transactions": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/hash": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/hash": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.5.0.tgz", "integrity": "sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg==", @@ -20394,7 +20406,7 @@ "@ethersproject/strings": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/hdnode": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/hdnode": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.5.0.tgz", "integrity": "sha512-mcSOo9zeUg1L0CoJH7zmxwUG5ggQHU1UrRf8jyTYy6HxdZV+r0PBoL1bxr+JHIPXRzS6u/UW4mEn43y0tmyF8Q==", @@ -20423,7 +20435,7 @@ "@ethersproject/wordlists": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/json-wallets": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/json-wallets": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.5.0.tgz", "integrity": "sha512-9lA21XQnCdcS72xlBn1jfQdj2A1VUxZzOzi9UkNdnokNKke/9Ya2xA9aIK1SC3PQyBDLt4C+dfps7ULpkvKikQ==", @@ -20453,7 +20465,7 @@ "scrypt-js": "3.0.1" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/keccak256": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/keccak256": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.5.0.tgz", "integrity": "sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg==", @@ -20472,7 +20484,7 @@ "js-sha3": "0.8.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/logger": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/logger": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.5.0.tgz", "integrity": "sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg==", @@ -20487,7 +20499,7 @@ } ] }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/networks": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/networks": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.5.2.tgz", "integrity": "sha512-NEqPxbGBfy6O3x4ZTISb90SjEDkWYDUbEeIFhJly0F7sZjoQMnj5KYzMSkMkLKZ+1fGpx00EDpHQCy6PrDupkQ==", @@ -20505,7 +20517,7 @@ "@ethersproject/logger": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/pbkdf2": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/pbkdf2": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.5.0.tgz", "integrity": "sha512-SaDvQFvXPnz1QGpzr6/HToLifftSXGoXrbpZ6BvoZhmx4bNLHrxDe8MZisuecyOziP1aVEwzC2Hasj+86TgWVg==", @@ -20524,7 +20536,7 @@ "@ethersproject/sha2": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/properties": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/properties": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.5.0.tgz", "integrity": "sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA==", @@ -20542,7 +20554,7 @@ "@ethersproject/logger": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/providers": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/providers": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.5.2.tgz", "integrity": "sha512-hkbx7x/MKcRjyrO4StKXCzCpWer6s97xnm34xkfPiarhtEUVAN4TBBpamM+z66WcTt7H5B53YwbRj1n7i8pZoQ==", @@ -20578,7 +20590,7 @@ "ws": "7.4.6" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/random": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/random": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.5.1.tgz", "integrity": "sha512-YaU2dQ7DuhL5Au7KbcQLHxcRHfgyNgvFV4sQOo0HrtW3Zkrc9ctWNz8wXQ4uCSfSDsqX2vcjhroxU5RQRV0nqA==", @@ -20597,7 +20609,7 @@ "@ethersproject/logger": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/rlp": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/rlp": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.5.0.tgz", "integrity": "sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA==", @@ -20616,7 +20628,7 @@ "@ethersproject/logger": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/sha2": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/sha2": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.5.0.tgz", "integrity": "sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA==", @@ -20636,7 +20648,7 @@ "hash.js": "1.1.7" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/signing-key": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/signing-key": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.5.0.tgz", "integrity": "sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng==", @@ -20659,7 +20671,7 @@ "hash.js": "1.1.7" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/solidity": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/solidity": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.5.0.tgz", "integrity": "sha512-9NgZs9LhGMj6aCtHXhtmFQ4AN4sth5HuFXVvAQtzmm0jpSCNOTGtrHZJAeYTh7MBjRR8brylWZxBZR9zDStXbw==", @@ -20682,7 +20694,7 @@ "@ethersproject/strings": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/strings": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/strings": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.5.0.tgz", "integrity": "sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ==", @@ -20702,7 +20714,7 @@ "@ethersproject/logger": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/transactions": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/transactions": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.5.0.tgz", "integrity": "sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA==", @@ -20728,7 +20740,7 @@ "@ethersproject/signing-key": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/units": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/units": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.5.0.tgz", "integrity": "sha512-7+DpjiZk4v6wrikj+TCyWWa9dXLNU73tSTa7n0TSJDxkYbV3Yf1eRh9ToMLlZtuctNYu9RDNNy2USq3AdqSbag==", @@ -20748,7 +20760,7 @@ "@ethersproject/logger": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/wallet": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/wallet": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.5.0.tgz", "integrity": "sha512-Mlu13hIctSYaZmUOo7r2PhNSd8eaMPVXe1wxrz4w4FCE4tDYBywDH+bAR1Xz2ADyXGwqYMwstzTrtUVIsKDO0Q==", @@ -20780,7 +20792,7 @@ "@ethersproject/wordlists": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/web": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/web": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.5.1.tgz", "integrity": "sha512-olvLvc1CB12sREc1ROPSHTdFCdvMh0J5GSJYiQg2D0hdD4QmJDy8QYDb1CvoqD/bF1c++aeKv2sR5uduuG9dQg==", @@ -20802,7 +20814,7 @@ "@ethersproject/strings": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@ethersproject/wordlists": { + "node_modules/@synthetixio/providers/node_modules/@ethersproject/wordlists": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.5.0.tgz", "integrity": "sha512-bL0UTReWDiaQJJYOC9sh/XcRu/9i2jMrzf8VLRmPKx58ckSlOJiohODkECCO50dtLZHcGU6MLXQ4OOrgBwP77Q==", @@ -20824,52 +20836,7 @@ "@ethersproject/strings": "^5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/@types/node": { - "version": "14.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", - "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==" - }, - "node_modules/@synthetixio/queries/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/@synthetixio/queries/node_modules/bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "engines": { - "node": "*" - } - }, - "node_modules/@synthetixio/queries/node_modules/date-fns": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.19.0.tgz", - "integrity": "sha512-X3bf2iTPgCAQp9wvjOQytnf5vO5rESYRXlPIVcgSbtT5OTScPcsf9eZU+B/YIkKAtYr5WeCii58BgATrNitlWg==", - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/@synthetixio/queries/node_modules/ethcall": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ethcall/-/ethcall-3.3.0.tgz", - "integrity": "sha512-cwYNxRmhej4K4oot+97LE285WhBXZf1Ju/ykYQY5nMV1URuHMIHKtObLwKWwrKu/x1TpUoaMy5NvRUF43KGbxA==", - "dependencies": { - "@ethersproject/abi": "^5.0.0", - "@ethersproject/contracts": "^5.0.0", - "@ethersproject/providers": "^5.0.0", - "@types/node": "^14.11.5", - "js-sha3": "^0.8.0" - } - }, - "node_modules/@synthetixio/queries/node_modules/ethers": { + "node_modules/@synthetixio/providers/node_modules/ethers": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.5.3.tgz", "integrity": "sha512-fTT4WT8/hTe/BLwRUtl7I5zlpF3XC3P/Xwqxc5AIP2HGlH15qpmjs0Ou78az93b1rLITzXLFxoNX63B8ZbUd7g==", @@ -20916,20 +20883,7 @@ "@ethersproject/wordlists": "5.5.0" } }, - "node_modules/@synthetixio/queries/node_modules/graphql": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.5.0.tgz", - "integrity": "sha512-OmaM7y0kaK31NKG31q4YbD2beNYa6jBBKtMFT6gLYJljHLJr42IqJ8KX08u3Li/0ifzTU5HjmoOOrwa5BRLeDA==", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/@synthetixio/queries/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/@synthetixio/queries/node_modules/ws": { + "node_modules/@synthetixio/providers/node_modules/ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", @@ -20949,196 +20903,989 @@ } } }, - "node_modules/@synthetixio/synpress": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@synthetixio/synpress/-/synpress-1.1.1.tgz", - "integrity": "sha512-bf59iXi4sWAS1lQmM1V8mHLXFxV4zX2PhBLC0ZFJ0lB6b8kUTZUISgQDsMDka9FNBSN6qI0RhxAx8i/LM7D0kQ==", - "dev": true, + "node_modules/@synthetixio/queries": { + "version": "2.71.2", + "resolved": "https://registry.npmjs.org/@synthetixio/queries/-/queries-2.71.2.tgz", + "integrity": "sha512-OZad69+R0imUDfWlQt/kZEWr/m0Q6fRViakwVVnYQsmwMtTV08fZr7b0ui35G3JVgUhKYm4Ho8O8PXXqnEt/BA==", "dependencies": { - "@cypress/code-coverage": "3.9.10", - "@cypress/react": "5.9.4", - "@cypress/webpack-dev-server": "1.4.0", - "@drptbl/gremlins.js": "2.2.1", - "@synthetixio/js": "2.41.0", - "@testing-library/cypress": "8.0.0", - "@testing-library/react": "12.0.0", - "@types/puppeteer-core": "5.4.0", - "@types/testing-library__cypress": "5.0.9", - "axios": "0.21.1", - "babel-plugin-istanbul": "6.0.0", - "babel-plugin-react-generate-property": "1.0.5", - "babel-plugin-react-remove-properties": "0.3.0", - "babel-plugin-transform-react-qa-classes": "1.6.0", - "babel-plugin-transform-react-styled-components-qa": "2.0.1", - "bytes32": "0.0.3", - "commander": "8.1.0", - "cross-zip": "4.0.0", - "cypress": "9.2.0", - "cypress-wait-until": "1.7.1", - "eslint": "7.32.0", - "eslint-config-prettier": "8.3.0", - "eslint-config-standard": "16.0.3", - "eslint-plugin-chai-friendly": "0.7.2", - "eslint-plugin-cypress": "2.11.3", - "eslint-plugin-import": "2.24.1", - "eslint-plugin-node": "11.1.0", - "eslint-plugin-prettier": "3.4.1", - "eslint-plugin-promise": "5.1.0", - "eslint-plugin-standard": "4.1.0", - "eslint-plugin-testing-library": "4.11.0", - "eslint-plugin-ui-testing": "1.0.4", - "eslint-plugin-unicorn": "35.0.0", - "etherscan-api": "10.0.5", - "node-fetch": "2.6.1", - "prettier": "2.3.2", - "puppeteer-core": "10.4.0", - "serve": "12.0.0", - "start-server-and-test": "1.13.1", - "synthetix-js": "2.56.1" - }, - "bin": { - "synpress": "synpress.js" + "@snapshot-labs/snapshot.js": "0.3.22", + "@synthetixio/contracts-interface": "2.71.2", + "@synthetixio/optimism-networks": "2.71.2", + "@synthetixio/providers": "2.71.2", + "@synthetixio/wei": "2.71.2", + "axios": "^0.21.4", + "date-fns": "2.19.0", + "ethers": "5.5.3", + "graphql": "15.5.0", + "graphql-request": "3.4.0", + "lodash": "^4.17.21", + "maxibon-codegen-graph-ts": "0.2.0" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "react": "17.x", + "react-dom": "17.x", + "react-query": "3.16.x" } }, - "node_modules/@synthetixio/synpress/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/abi": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.5.0.tgz", + "integrity": "sha512-loW7I4AohP5KycATvc0MgujU6JyCHPqHdeoo9z3Nr9xEiNioxa65ccdm1+fsoJhkuhdRtfcL8cfyGamz2AxZ5w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@babel/highlight": "^7.10.4" + "@ethersproject/address": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/constants": "^5.5.0", + "@ethersproject/hash": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/strings": "^5.5.0" } }, - "node_modules/@synthetixio/synpress/node_modules/@cypress/react": { - "version": "5.9.4", - "resolved": "https://registry.npmjs.org/@cypress/react/-/react-5.9.4.tgz", - "integrity": "sha512-uw5/vJZ9IMBRzSalkHIw9eY0G+v1rpadMFQZcXUGDaeZOKvkvGVDJ0OHBa5TCONHEQfyMyKsf5VhkBMBATnj6w==", - "dev": true, - "dependencies": { - "@cypress/mount-utils": "1.0.2", - "debug": "4.3.2", - "find-webpack": "2.2.1", - "find-yarn-workspace-root": "2.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7", - "@babel/preset-env": ">=7", - "@cypress/webpack-dev-server": "*", - "@types/react": "^16.9.16 || ^17.0.0", - "babel-loader": ">=8", - "cypress": "*", - "next": ">=8", - "react": "^=16.x || ^=17.x", - "react-dom": "^=16.x || ^=17.x", - "webpack": ">=4" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@babel/preset-env": { - "optional": true - }, - "@cypress/webpack-dev-server": { - "optional": true - }, - "@types/react": { - "optional": true - }, - "babel-loader": { - "optional": true - }, - "next": { - "optional": true + "node_modules/@synthetixio/queries/node_modules/@ethersproject/abstract-provider": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz", + "integrity": "sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" }, - "webpack": { - "optional": true + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } - } - }, - "node_modules/@synthetixio/synpress/node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, + ], "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/networks": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/transactions": "^5.5.0", + "@ethersproject/web": "^5.5.0" } }, - "node_modules/@synthetixio/synpress/node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", - "dev": true, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/abstract-signer": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz", + "integrity": "sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@ethersproject/abstract-provider": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0" } }, - "node_modules/@synthetixio/synpress/node_modules/@testing-library/react": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-12.0.0.tgz", - "integrity": "sha512-sh3jhFgEshFyJ/0IxGltRhwZv2kFKfJ3fN1vTZ6hhMXzz9ZbbcTgmDYM4e+zJv+oiVKKEWZPyqPAh4MQBI65gA==", - "dev": true, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/address": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.5.0.tgz", + "integrity": "sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^8.0.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/rlp": "^5.5.0" } }, - "node_modules/@synthetixio/synpress/node_modules/@types/node": { - "version": "14.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", - "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", - "dev": true - }, - "node_modules/@synthetixio/synpress/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/base64": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.5.0.tgz", + "integrity": "sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "@ethersproject/bytes": "^5.5.0" } }, - "node_modules/@synthetixio/synpress/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { + "node_modules/@synthetixio/queries/node_modules/@ethersproject/basex": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.5.0.tgz", + "integrity": "sha512-ZIodwhHpVJ0Y3hUCfUucmxKsWQA5TMnavp5j/UOuDdzZWzJlRmuOjcTMIGgHCYuZmHt36BfiSyQPSRskPxbfaQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/properties": "^5.5.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/bignumber": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.5.0.tgz", + "integrity": "sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "bn.js": "^4.11.9" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/bytes": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.5.0.tgz", + "integrity": "sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.5.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/constants": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.5.0.tgz", + "integrity": "sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.5.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/contracts": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.5.0.tgz", + "integrity": "sha512-2viY7NzyvJkh+Ug17v7g3/IJC8HqZBDcOjYARZLdzRxrfGlRgmYgl6xPRKVbEzy1dWKw/iv7chDcS83pg6cLxg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "^5.5.0", + "@ethersproject/abstract-provider": "^5.5.0", + "@ethersproject/abstract-signer": "^5.5.0", + "@ethersproject/address": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/constants": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/transactions": "^5.5.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/hash": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.5.0.tgz", + "integrity": "sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.5.0", + "@ethersproject/address": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/strings": "^5.5.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/hdnode": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.5.0.tgz", + "integrity": "sha512-mcSOo9zeUg1L0CoJH7zmxwUG5ggQHU1UrRf8jyTYy6HxdZV+r0PBoL1bxr+JHIPXRzS6u/UW4mEn43y0tmyF8Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.5.0", + "@ethersproject/basex": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/pbkdf2": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/sha2": "^5.5.0", + "@ethersproject/signing-key": "^5.5.0", + "@ethersproject/strings": "^5.5.0", + "@ethersproject/transactions": "^5.5.0", + "@ethersproject/wordlists": "^5.5.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/json-wallets": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.5.0.tgz", + "integrity": "sha512-9lA21XQnCdcS72xlBn1jfQdj2A1VUxZzOzi9UkNdnokNKke/9Ya2xA9aIK1SC3PQyBDLt4C+dfps7ULpkvKikQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.5.0", + "@ethersproject/address": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/hdnode": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/pbkdf2": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/random": "^5.5.0", + "@ethersproject/strings": "^5.5.0", + "@ethersproject/transactions": "^5.5.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/keccak256": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.5.0.tgz", + "integrity": "sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.5.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/logger": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.5.0.tgz", + "integrity": "sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ] + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/networks": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.5.2.tgz", + "integrity": "sha512-NEqPxbGBfy6O3x4ZTISb90SjEDkWYDUbEeIFhJly0F7sZjoQMnj5KYzMSkMkLKZ+1fGpx00EDpHQCy6PrDupkQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.5.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/pbkdf2": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.5.0.tgz", + "integrity": "sha512-SaDvQFvXPnz1QGpzr6/HToLifftSXGoXrbpZ6BvoZhmx4bNLHrxDe8MZisuecyOziP1aVEwzC2Hasj+86TgWVg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/sha2": "^5.5.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/properties": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.5.0.tgz", + "integrity": "sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.5.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/providers": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.5.2.tgz", + "integrity": "sha512-hkbx7x/MKcRjyrO4StKXCzCpWer6s97xnm34xkfPiarhtEUVAN4TBBpamM+z66WcTt7H5B53YwbRj1n7i8pZoQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.5.0", + "@ethersproject/abstract-signer": "^5.5.0", + "@ethersproject/address": "^5.5.0", + "@ethersproject/basex": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/constants": "^5.5.0", + "@ethersproject/hash": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/networks": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/random": "^5.5.0", + "@ethersproject/rlp": "^5.5.0", + "@ethersproject/sha2": "^5.5.0", + "@ethersproject/strings": "^5.5.0", + "@ethersproject/transactions": "^5.5.0", + "@ethersproject/web": "^5.5.0", + "bech32": "1.1.4", + "ws": "7.4.6" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/random": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.5.1.tgz", + "integrity": "sha512-YaU2dQ7DuhL5Au7KbcQLHxcRHfgyNgvFV4sQOo0HrtW3Zkrc9ctWNz8wXQ4uCSfSDsqX2vcjhroxU5RQRV0nqA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/rlp": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.5.0.tgz", + "integrity": "sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/sha2": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.5.0.tgz", + "integrity": "sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "hash.js": "1.1.7" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/signing-key": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.5.0.tgz", + "integrity": "sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/solidity": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.5.0.tgz", + "integrity": "sha512-9NgZs9LhGMj6aCtHXhtmFQ4AN4sth5HuFXVvAQtzmm0jpSCNOTGtrHZJAeYTh7MBjRR8brylWZxBZR9zDStXbw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/sha2": "^5.5.0", + "@ethersproject/strings": "^5.5.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/strings": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.5.0.tgz", + "integrity": "sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/constants": "^5.5.0", + "@ethersproject/logger": "^5.5.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/transactions": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.5.0.tgz", + "integrity": "sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/constants": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/rlp": "^5.5.0", + "@ethersproject/signing-key": "^5.5.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/units": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.5.0.tgz", + "integrity": "sha512-7+DpjiZk4v6wrikj+TCyWWa9dXLNU73tSTa7n0TSJDxkYbV3Yf1eRh9ToMLlZtuctNYu9RDNNy2USq3AdqSbag==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/constants": "^5.5.0", + "@ethersproject/logger": "^5.5.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/wallet": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.5.0.tgz", + "integrity": "sha512-Mlu13hIctSYaZmUOo7r2PhNSd8eaMPVXe1wxrz4w4FCE4tDYBywDH+bAR1Xz2ADyXGwqYMwstzTrtUVIsKDO0Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.5.0", + "@ethersproject/abstract-signer": "^5.5.0", + "@ethersproject/address": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/hash": "^5.5.0", + "@ethersproject/hdnode": "^5.5.0", + "@ethersproject/json-wallets": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/random": "^5.5.0", + "@ethersproject/signing-key": "^5.5.0", + "@ethersproject/transactions": "^5.5.0", + "@ethersproject/wordlists": "^5.5.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/web": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.5.1.tgz", + "integrity": "sha512-olvLvc1CB12sREc1ROPSHTdFCdvMh0J5GSJYiQg2D0hdD4QmJDy8QYDb1CvoqD/bF1c++aeKv2sR5uduuG9dQg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/base64": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/strings": "^5.5.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/@ethersproject/wordlists": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.5.0.tgz", + "integrity": "sha512-bL0UTReWDiaQJJYOC9sh/XcRu/9i2jMrzf8VLRmPKx58ckSlOJiohODkECCO50dtLZHcGU6MLXQ4OOrgBwP77Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/hash": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/strings": "^5.5.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/date-fns": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.19.0.tgz", + "integrity": "sha512-X3bf2iTPgCAQp9wvjOQytnf5vO5rESYRXlPIVcgSbtT5OTScPcsf9eZU+B/YIkKAtYr5WeCii58BgATrNitlWg==", + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/@synthetixio/queries/node_modules/ethers": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.5.3.tgz", + "integrity": "sha512-fTT4WT8/hTe/BLwRUtl7I5zlpF3XC3P/Xwqxc5AIP2HGlH15qpmjs0Ou78az93b1rLITzXLFxoNX63B8ZbUd7g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "5.5.0", + "@ethersproject/abstract-provider": "5.5.1", + "@ethersproject/abstract-signer": "5.5.0", + "@ethersproject/address": "5.5.0", + "@ethersproject/base64": "5.5.0", + "@ethersproject/basex": "5.5.0", + "@ethersproject/bignumber": "5.5.0", + "@ethersproject/bytes": "5.5.0", + "@ethersproject/constants": "5.5.0", + "@ethersproject/contracts": "5.5.0", + "@ethersproject/hash": "5.5.0", + "@ethersproject/hdnode": "5.5.0", + "@ethersproject/json-wallets": "5.5.0", + "@ethersproject/keccak256": "5.5.0", + "@ethersproject/logger": "5.5.0", + "@ethersproject/networks": "5.5.2", + "@ethersproject/pbkdf2": "5.5.0", + "@ethersproject/properties": "5.5.0", + "@ethersproject/providers": "5.5.2", + "@ethersproject/random": "5.5.1", + "@ethersproject/rlp": "5.5.0", + "@ethersproject/sha2": "5.5.0", + "@ethersproject/signing-key": "5.5.0", + "@ethersproject/solidity": "5.5.0", + "@ethersproject/strings": "5.5.0", + "@ethersproject/transactions": "5.5.0", + "@ethersproject/units": "5.5.0", + "@ethersproject/wallet": "5.5.0", + "@ethersproject/web": "5.5.1", + "@ethersproject/wordlists": "5.5.0" + } + }, + "node_modules/@synthetixio/queries/node_modules/graphql": { + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.5.0.tgz", + "integrity": "sha512-OmaM7y0kaK31NKG31q4YbD2beNYa6jBBKtMFT6gLYJljHLJr42IqJ8KX08u3Li/0ifzTU5HjmoOOrwa5BRLeDA==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/@synthetixio/queries/node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/@synthetixio/queries/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@synthetixio/synpress": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@synthetixio/synpress/-/synpress-1.1.1.tgz", + "integrity": "sha512-bf59iXi4sWAS1lQmM1V8mHLXFxV4zX2PhBLC0ZFJ0lB6b8kUTZUISgQDsMDka9FNBSN6qI0RhxAx8i/LM7D0kQ==", + "dev": true, + "dependencies": { + "@cypress/code-coverage": "3.9.10", + "@cypress/react": "5.9.4", + "@cypress/webpack-dev-server": "1.4.0", + "@drptbl/gremlins.js": "2.2.1", + "@synthetixio/js": "2.41.0", + "@testing-library/cypress": "8.0.0", + "@testing-library/react": "12.0.0", + "@types/puppeteer-core": "5.4.0", + "@types/testing-library__cypress": "5.0.9", + "axios": "0.21.1", + "babel-plugin-istanbul": "6.0.0", + "babel-plugin-react-generate-property": "1.0.5", + "babel-plugin-react-remove-properties": "0.3.0", + "babel-plugin-transform-react-qa-classes": "1.6.0", + "babel-plugin-transform-react-styled-components-qa": "2.0.1", + "bytes32": "0.0.3", + "commander": "8.1.0", + "cross-zip": "4.0.0", + "cypress": "9.2.0", + "cypress-wait-until": "1.7.1", + "eslint": "7.32.0", + "eslint-config-prettier": "8.3.0", + "eslint-config-standard": "16.0.3", + "eslint-plugin-chai-friendly": "0.7.2", + "eslint-plugin-cypress": "2.11.3", + "eslint-plugin-import": "2.24.1", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-prettier": "3.4.1", + "eslint-plugin-promise": "5.1.0", + "eslint-plugin-standard": "4.1.0", + "eslint-plugin-testing-library": "4.11.0", + "eslint-plugin-ui-testing": "1.0.4", + "eslint-plugin-unicorn": "35.0.0", + "etherscan-api": "10.0.5", + "node-fetch": "2.6.1", + "prettier": "2.3.2", + "puppeteer-core": "10.4.0", + "serve": "12.0.0", + "start-server-and-test": "1.13.1", + "synthetix-js": "2.56.1" + }, + "bin": { + "synpress": "synpress.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@synthetixio/synpress/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@synthetixio/synpress/node_modules/@cypress/react": { + "version": "5.9.4", + "resolved": "https://registry.npmjs.org/@cypress/react/-/react-5.9.4.tgz", + "integrity": "sha512-uw5/vJZ9IMBRzSalkHIw9eY0G+v1rpadMFQZcXUGDaeZOKvkvGVDJ0OHBa5TCONHEQfyMyKsf5VhkBMBATnj6w==", + "dev": true, + "dependencies": { + "@cypress/mount-utils": "1.0.2", + "debug": "4.3.2", + "find-webpack": "2.2.1", + "find-yarn-workspace-root": "2.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7", + "@babel/preset-env": ">=7", + "@cypress/webpack-dev-server": "*", + "@types/react": "^16.9.16 || ^17.0.0", + "babel-loader": ">=8", + "cypress": "*", + "next": ">=8", + "react": "^=16.x || ^=17.x", + "react-dom": "^=16.x || ^=17.x", + "webpack": ">=4" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@babel/preset-env": { + "optional": true + }, + "@cypress/webpack-dev-server": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "babel-loader": { + "optional": true + }, + "next": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@synthetixio/synpress/node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@synthetixio/synpress/node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@synthetixio/synpress/node_modules/@testing-library/react": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-12.0.0.tgz", + "integrity": "sha512-sh3jhFgEshFyJ/0IxGltRhwZv2kFKfJ3fN1vTZ6hhMXzz9ZbbcTgmDYM4e+zJv+oiVKKEWZPyqPAh4MQBI65gA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@synthetixio/synpress/node_modules/@types/node": { + "version": "14.18.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", + "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", + "dev": true + }, + "node_modules/@synthetixio/synpress/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@synthetixio/synpress/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { "color-convert": "^2.0.1" }, "engines": { @@ -22117,12 +22864,11 @@ } }, "node_modules/@synthetixio/transaction-notifier": { - "version": "2.68.2", - "resolved": "https://registry.npmjs.org/@synthetixio/transaction-notifier/-/transaction-notifier-2.68.2.tgz", - "integrity": "sha512-KszjAiWZ8xIcVERZvw8qIJ57YzxCRx4PLKxxGsu6rn0KQxizf9iT/r7Xm1umqgim2zq0BAHPemQL1Mw0e+Wvfw==", + "version": "2.71.2", + "resolved": "https://registry.npmjs.org/@synthetixio/transaction-notifier/-/transaction-notifier-2.71.2.tgz", + "integrity": "sha512-CxaH+asK0v6wv6HhpmeuY0Py79G4neVJ1l0vkWcS3Tpfn1snNoUzJqzmvh8DgG8C9yNtS19/3JTXkszJyHSkdw==", "dependencies": { - "ethers": "5.5.3", - "lodash": "4.17.19" + "ethers": "5.5.3" } }, "node_modules/@synthetixio/transaction-notifier/node_modules/@ethersproject/abi": { @@ -22841,11 +23587,6 @@ "@ethersproject/wordlists": "5.5.0" } }, - "node_modules/@synthetixio/transaction-notifier/node_modules/lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - }, "node_modules/@synthetixio/transaction-notifier/node_modules/ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", @@ -22867,9 +23608,9 @@ } }, "node_modules/@synthetixio/wei": { - "version": "2.68.2", - "resolved": "https://registry.npmjs.org/@synthetixio/wei/-/wei-2.68.2.tgz", - "integrity": "sha512-GQDrtr6ADfXOerMJ/2abegUF1dMfpzPxp9N9umMud0rF/E2bNtY9nQXSvZH3Uz1/vQWiOFtAP/eJ2mVF82kpFA==", + "version": "2.71.2", + "resolved": "https://registry.npmjs.org/@synthetixio/wei/-/wei-2.71.2.tgz", + "integrity": "sha512-JNew+YVFDhOCL/xMr+6QueMyHrgy9NBkErV53kV7Pp/fGhW56+jZLolYwUeE7O+LBNwTueXr7nH1+XsZt6l7JA==", "dependencies": { "big.js": "6.1.1", "ethers": "5.5.3" @@ -24815,7 +25556,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, "dependencies": { "@types/minimatch": "*", "@types/node": "*" @@ -24923,8 +25663,7 @@ "node_modules/@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" }, "node_modules/@types/node": { "version": "14.0.13", @@ -26704,7 +27443,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "dev": true, "dependencies": { "@webassemblyjs/helper-module-context": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", @@ -26714,20 +27452,17 @@ "node_modules/@webassemblyjs/helper-api-error": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" }, "node_modules/@webassemblyjs/helper-code-frame": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, "dependencies": { "@webassemblyjs/wast-printer": "1.9.0" } @@ -26735,14 +27470,12 @@ "node_modules/@webassemblyjs/helper-fsm": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" }, "node_modules/@webassemblyjs/helper-module-context": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0" } @@ -26750,14 +27483,12 @@ "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", - "dev": true + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -26769,7 +27500,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", - "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -26778,7 +27508,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -26786,14 +27515,12 @@ "node_modules/@webassemblyjs/utf8": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -26809,7 +27536,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", @@ -26822,7 +27548,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -26834,7 +27559,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-api-error": "1.9.0", @@ -26848,7 +27572,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/floating-point-hex-parser": "1.9.0", @@ -26861,14 +27584,12 @@ "node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/wast-parser": "1.9.0", @@ -26878,14 +27599,12 @@ "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "node_modules/@zeit/schemas": { "version": "2.6.0", @@ -27255,7 +27974,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, + "devOptional": true, "dependencies": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -27265,7 +27984,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, + "devOptional": true, "dependencies": { "remove-trailing-separator": "^1.0.1" }, @@ -27447,7 +28166,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, "engines": { "node": ">=8" } @@ -27619,7 +28337,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true + "devOptional": true }, "node_modules/async-eventemitter": { "version": "0.2.4", @@ -30229,7 +30947,7 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -30953,7 +31671,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, "dependencies": { "pako": "~1.0.5" } @@ -31181,8 +31898,7 @@ "node_modules/builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, "node_modules/bunyan": { "version": "1.8.15", @@ -31380,7 +32096,6 @@ "version": "12.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, "dependencies": { "bluebird": "^3.5.5", "chownr": "^1.1.1", @@ -31402,20 +32117,17 @@ "node_modules/cacache/node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/cacache/node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "node_modules/cacache/node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "dependencies": { "yallist": "^3.0.2" } @@ -31423,14 +32135,12 @@ "node_modules/cacache/node_modules/y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "node_modules/cacache/node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/cache-base": { "version": "1.0.1", @@ -32092,7 +32802,7 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", - "dev": true, + "devOptional": true, "dependencies": { "anymatch": "^2.0.0", "async-each": "^1.0.1", @@ -32123,7 +32833,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, "engines": { "node": ">=6.0" } @@ -32824,8 +33533,7 @@ "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, "node_modules/component-emitter": { "version": "1.3.0", @@ -32898,7 +33606,6 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, "engines": [ "node >= 0.8" ], @@ -32932,8 +33639,7 @@ "node_modules/console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" }, "node_modules/console-control-strings": { "version": "1.1.0", @@ -32961,8 +33667,7 @@ "node_modules/constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" }, "node_modules/contains-path": { "version": "0.1.0", @@ -33037,7 +33742,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, "dependencies": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", @@ -33050,8 +33754,7 @@ "node_modules/copy-concurrently/node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "node_modules/copy-descriptor": { "version": "0.1.1", @@ -33784,8 +34487,7 @@ "node_modules/cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, "node_modules/cypress": { "version": "8.7.0", @@ -34685,7 +35387,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, "dependencies": { "path-type": "^4.0.0" }, @@ -34747,7 +35448,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true, "engines": { "node": ">=0.4", "npm": ">=1.2" @@ -35165,7 +35865,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "memory-fs": "^0.5.0", @@ -35179,7 +35878,6 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, "dependencies": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -36641,7 +37339,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -36653,7 +37350,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, "engines": { "node": ">=4.0" } @@ -36662,7 +37358,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, "engines": { "node": ">=4.0" } @@ -38975,6 +39670,11 @@ "dev": true, "optional": true }, + "node_modules/fancy-canvas": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fancy-canvas/-/fancy-canvas-0.2.2.tgz", + "integrity": "sha512-50qi8xA0QkHbjmb8h7XQ6k2fvD7y/yMfiUw9YTarJ7rWrq6o5/3CCXPouYk+XSLASvvxtjyiQLRBFt3qkE3oyA==" + }, "node_modules/fast-check": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-2.24.0.tgz", @@ -39012,7 +39712,6 @@ "version": "3.2.11", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -39028,7 +39727,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -39040,7 +39738,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -39052,7 +39749,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -39064,7 +39760,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -39073,7 +39768,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -39086,7 +39780,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -39145,7 +39838,6 @@ "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -39208,8 +39900,7 @@ "node_modules/figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" }, "node_modules/figures": { "version": "3.2.0", @@ -39635,7 +40326,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" @@ -39909,7 +40599,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", @@ -39927,7 +40616,6 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -40011,7 +40699,6 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -41281,6 +41968,12 @@ "node": ">=8" } }, + "node_modules/html-to-image": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.9.0.tgz", + "integrity": "sha512-9gaDCIYg62Ek07F2pBk76AHgYZ2gxq2YALU7rK3gNCqXuhu6cWzsOQqM7qGbjZiOzxGzrU1deDqZpAod2NEwbA==", + "dev": true + }, "node_modules/html-void-elements": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", @@ -41356,8 +42049,7 @@ "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, "node_modules/https-proxy-agent": { "version": "5.0.0", @@ -41530,8 +42222,7 @@ "node_modules/iferr": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, "node_modules/ignore": { "version": "4.0.6", @@ -41559,7 +42250,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-7.0.1.tgz", "integrity": "sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w==", - "dev": true, "dependencies": { "file-type": "^12.0.0", "globby": "^10.0.0", @@ -41747,7 +42437,6 @@ "version": "12.4.2", "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==", - "dev": true, "engines": { "node": ">=8" } @@ -41756,7 +42445,6 @@ "version": "10.0.2", "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, "dependencies": { "@types/glob": "^7.1.1", "array-union": "^2.1.0", @@ -41775,7 +42463,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, "engines": { "node": ">= 4" } @@ -41891,7 +42578,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, "engines": { "node": ">=0.8.19" } @@ -41907,8 +42593,7 @@ "node_modules/infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "node_modules/inflight": { "version": "1.0.6", @@ -42314,7 +42999,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, + "devOptional": true, "dependencies": { "binary-extensions": "^1.0.0" }, @@ -45514,7 +46199,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -45695,7 +46379,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", - "dev": true, "engines": { "node": ">=8" } @@ -46037,6 +46720,14 @@ "node": ">= 0.8.0" } }, + "node_modules/lightweight-charts": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/lightweight-charts/-/lightweight-charts-3.8.0.tgz", + "integrity": "sha512-7yFGnYuE1RjRJG9RwUTBz5wvF1QtjBOSW4FFlikr8Dh+/TDNt4ci+HsWSYmStgQUpawpvkCJ3j5/W25GppGj9Q==", + "dependencies": { + "fancy-canvas": "0.2.2" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -46769,7 +47460,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true, "engines": { "node": ">=4.3.0 <5.0.0 || >=5.10" } @@ -47567,7 +48257,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, "dependencies": { "semver": "^6.0.0" }, @@ -47855,7 +48544,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, "dependencies": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -48356,7 +49044,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, "dependencies": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", @@ -48377,7 +49064,6 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -48389,7 +49075,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, "dependencies": { "duplexify": "^3.6.0", "inherits": "^2.0.3", @@ -48400,7 +49085,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -48565,7 +49249,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, "dependencies": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", @@ -48578,8 +49261,7 @@ "node_modules/move-concurrently/node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "node_modules/mozjpeg": { "version": "8.0.0", @@ -48867,8 +49549,7 @@ "node_modules/neo-async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" }, "node_modules/nested-error-stacks": { "version": "2.1.1", @@ -49335,7 +50016,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, "dependencies": { "assert": "^1.1.1", "browserify-zlib": "^0.2.0", @@ -49366,7 +50046,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, "dependencies": { "object-assign": "^4.1.1", "util": "0.10.3" @@ -49375,14 +50054,12 @@ "node_modules/node-libs-browser/node_modules/assert/node_modules/inherits": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" }, "node_modules/node-libs-browser/node_modules/assert/node_modules/util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, "dependencies": { "inherits": "2.0.1" } @@ -49391,7 +50068,6 @@ "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, "dependencies": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", @@ -49401,14 +50077,12 @@ "node_modules/node-libs-browser/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "node_modules/node-libs-browser/node_modules/timers-browserify": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, "dependencies": { "setimmediate": "^1.0.4" }, @@ -49419,14 +50093,12 @@ "node_modules/node-libs-browser/node_modules/tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" }, "node_modules/node-libs-browser/node_modules/util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, "dependencies": { "inherits": "2.0.3" } @@ -50167,8 +50839,7 @@ "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" }, "node_modules/os-filter-obj": { "version": "2.0.0", @@ -50339,7 +51010,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", - "dev": true, "engines": { "node": ">=8" }, @@ -50398,7 +51068,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, "dependencies": { "cyclist": "^1.0.1", "inherits": "^2.0.3", @@ -50552,8 +51221,7 @@ "node_modules/path-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" }, "node_modules/path-case": { "version": "2.1.1", @@ -51583,8 +52251,7 @@ "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "node_modules/promise-to-callback": { "version": "1.0.0", @@ -51791,8 +52458,7 @@ "node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "node_modules/puppeteer-core": { "version": "10.4.0", @@ -52205,7 +52871,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true, "engines": { "node": ">=0.4.x" } @@ -52214,7 +52879,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -52902,7 +53566,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, + "devOptional": true, "dependencies": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", @@ -53030,9 +53694,9 @@ } }, "node_modules/recoil": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/recoil/-/recoil-0.3.1.tgz", - "integrity": "sha512-KNA3DRqgxX4rRC8E7fc6uIw7BACmMPuraIYy+ejhE8tsw7w32CetMm8w7AMZa34wzanKKkev3vl3H7Z4s0QSiA==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/recoil/-/recoil-0.6.1.tgz", + "integrity": "sha512-J7oT3LZl2vpyFClgSUpOQjpykz84VSX/NJE/PavAtR8n7Z+whEdVBPUtwc2TEWjONeL/lJmiac2XQ+qEOQA52Q==", "dependencies": { "hamt_plus": "1.0.2" }, @@ -53501,7 +54165,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true + "devOptional": true }, "node_modules/renderkid": { "version": "2.0.7", @@ -53838,7 +54502,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -53938,7 +54601,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -53961,7 +54623,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, "dependencies": { "aproba": "^1.1.1" } @@ -53969,8 +54630,7 @@ "node_modules/run-queue/node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "node_modules/rustbn.js": { "version": "0.2.0", @@ -54861,7 +55521,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } @@ -55353,8 +56012,7 @@ "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" }, "node_modules/source-map": { "version": "0.5.7", @@ -55387,7 +56045,6 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -55397,7 +56054,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -55648,7 +56304,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, "dependencies": { "figgy-pudding": "^3.5.1" } @@ -55894,7 +56549,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, "dependencies": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" @@ -55923,7 +56577,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" @@ -55933,7 +56586,6 @@ "version": "2.8.3", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", @@ -57205,7 +57857,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true, "engines": { "node": ">=6" } @@ -57550,7 +58201,6 @@ "version": "4.8.0", "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, "dependencies": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -57567,7 +58217,6 @@ "version": "1.4.5", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, "dependencies": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", @@ -57590,7 +58239,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -57606,7 +58254,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -57615,7 +58262,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, "dependencies": { "commondir": "^1.0.1", "make-dir": "^2.0.0", @@ -57629,7 +58275,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, "dependencies": { "locate-path": "^3.0.0" }, @@ -57641,7 +58286,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true, "engines": { "node": ">=4" } @@ -57649,14 +58293,12 @@ "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/terser-webpack-plugin/node_modules/locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -57669,7 +58311,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -57682,7 +58323,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, "dependencies": { "p-limit": "^2.0.0" }, @@ -57694,7 +58334,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, "engines": { "node": ">=4" } @@ -57703,7 +58342,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, "dependencies": { "find-up": "^3.0.0" }, @@ -57715,7 +58353,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, "dependencies": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -57729,7 +58366,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, "bin": { "semver": "bin/semver" } @@ -57738,7 +58374,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, "dependencies": { "randombytes": "^2.1.0" } @@ -57747,7 +58382,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -57755,14 +58389,12 @@ "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/terser/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -57959,8 +58591,7 @@ "node_modules/to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" }, "node_modules/to-buffer": { "version": "1.1.1", @@ -58358,8 +58989,7 @@ "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", @@ -58576,7 +59206,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, "dependencies": { "unique-slug": "^2.0.0" } @@ -58585,7 +59214,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, "dependencies": { "imurmurhash": "^0.1.4" } @@ -58792,7 +59420,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, + "devOptional": true, "engines": { "node": ">=4", "yarn": "*" @@ -59169,8 +59797,7 @@ "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "node_modules/void-elements": { "version": "2.0.1", @@ -59342,7 +59969,6 @@ "version": "1.7.5", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "neo-async": "^2.5.0" @@ -59356,7 +59982,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, "optional": true, "dependencies": { "chokidar": "^2.1.8" @@ -59366,7 +59991,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, "optional": true, "dependencies": { "normalize-path": "^3.0.0", @@ -59380,7 +60004,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, "optional": true, "engines": { "node": ">=8" @@ -59390,7 +60013,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "optional": true, "dependencies": { "fill-range": "^7.0.1" @@ -59403,7 +60025,6 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "funding": [ { "type": "individual", @@ -59431,7 +60052,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "optional": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -59444,7 +60064,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -59458,7 +60077,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "optional": true, "dependencies": { "is-glob": "^4.0.1" @@ -59471,7 +60089,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "optional": true, "dependencies": { "binary-extensions": "^2.0.0" @@ -59484,7 +60101,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "optional": true, "engines": { "node": ">=0.12.0" @@ -59494,7 +60110,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "optional": true, "dependencies": { "picomatch": "^2.2.1" @@ -59507,7 +60122,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "optional": true, "dependencies": { "is-number": "^7.0.0" @@ -61895,7 +62509,6 @@ "version": "4.46.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-module-context": "1.9.0", @@ -62001,7 +62614,6 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, "dependencies": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" @@ -62011,7 +62623,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -62038,7 +62649,6 @@ "version": "6.4.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -62050,7 +62660,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -62066,7 +62675,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -62075,7 +62683,6 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, "engines": { "node": "*" } @@ -62084,7 +62691,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, "dependencies": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -62096,14 +62702,12 @@ "node_modules/webpack/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/webpack/node_modules/json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, "dependencies": { "minimist": "^1.2.0" }, @@ -62115,7 +62719,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -62128,14 +62731,12 @@ "node_modules/webpack/node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/webpack/node_modules/schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, "dependencies": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -62435,7 +63036,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, "dependencies": { "errno": "~0.1.7" } @@ -62855,7 +63455,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.0" } @@ -62868,7 +63467,8 @@ "@artsy/fresnel": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/@artsy/fresnel/-/fresnel-1.7.0.tgz", - "integrity": "sha512-TXIFVwMXE8GHe2c6NEJ6FFhB8+6gCIfU6lwd/MeSIwYw7QzpyYrcaOjvLh33ZmuD7HWSnQ0kdK9TErj7l9BrUQ==" + "integrity": "sha512-TXIFVwMXE8GHe2c6NEJ6FFhB8+6gCIfU6lwd/MeSIwYw7QzpyYrcaOjvLh33ZmuD7HWSnQ0kdK9TErj7l9BrUQ==", + "requires": {} }, "@babel/code-frame": { "version": "7.16.7", @@ -62887,7 +63487,6 @@ "version": "7.17.8", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", - "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", @@ -63049,7 +63648,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", @@ -63103,7 +63701,6 @@ "version": "7.17.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dev": true, "requires": { "@babel/types": "^7.17.0" } @@ -63151,7 +63748,6 @@ "version": "7.17.8", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", - "dev": true, "requires": { "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", @@ -64610,7 +65206,8 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/babelify/-/babelify-10.0.0.tgz", "integrity": "sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg==", - "dev": true + "dev": true, + "requires": {} }, "debug": { "version": "4.1.1", @@ -65262,7 +65859,8 @@ "ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} } } }, @@ -65679,7 +66277,8 @@ "ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} } } }, @@ -66813,20 +67412,17 @@ "@jridgewell/resolve-uri": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", - "dev": true + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==" }, "@jridgewell/sourcemap-codec": { "version": "1.4.11", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", - "dev": true + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" }, "@jridgewell/trace-mapping": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", - "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -67335,7 +67931,8 @@ "@material-ui/types": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", - "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==" + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "requires": {} }, "@material-ui/utils": { "version": "4.11.2", @@ -67385,7 +67982,8 @@ "version": "1.6.22", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", - "dev": true + "dev": true, + "requires": {} }, "big.js": { "version": "5.2.2", @@ -67963,7 +68561,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "requires": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -67972,14 +68569,12 @@ "@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" }, "@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -68539,7 +69134,8 @@ "use-callback-ref": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.2.5.tgz", - "integrity": "sha512-gN3vgMISAgacF7sqsLPByqoePooY3n2emTH59Ur5d/M8eg4WTWu1xp8i8DHjohftIyEx0S08RiYxbffr4j8Peg==" + "integrity": "sha512-gN3vgMISAgacF7sqsLPByqoePooY3n2emTH59Ur5d/M8eg4WTWu1xp8i8DHjohftIyEx0S08RiYxbffr4j8Peg==", + "requires": {} }, "use-sidecar": { "version": "1.0.5", @@ -68591,7 +69187,8 @@ "use-callback-ref": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.2.5.tgz", - "integrity": "sha512-gN3vgMISAgacF7sqsLPByqoePooY3n2emTH59Ur5d/M8eg4WTWu1xp8i8DHjohftIyEx0S08RiYxbffr4j8Peg==" + "integrity": "sha512-gN3vgMISAgacF7sqsLPByqoePooY3n2emTH59Ur5d/M8eg4WTWu1xp8i8DHjohftIyEx0S08RiYxbffr4j8Peg==", + "requires": {} }, "use-sidecar": { "version": "1.0.5", @@ -68848,7 +69445,8 @@ "ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} } } }, @@ -69086,13 +69684,15 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.7.tgz", "integrity": "sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==", - "dev": true + "dev": true, + "requires": {} }, "react-colorful": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.5.1.tgz", "integrity": "sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==", - "dev": true + "dev": true, + "requires": {} }, "react-popper-tooltip": { "version": "3.1.1", @@ -69133,7 +69733,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.2.1.tgz", "integrity": "sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw==", - "dev": true + "dev": true, + "requires": {} }, "use-latest": { "version": "1.2.0", @@ -69148,7 +69749,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "dev": true + "dev": true, + "requires": {} } } } @@ -69354,13 +69956,15 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.7.tgz", "integrity": "sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==", - "dev": true + "dev": true, + "requires": {} }, "react-colorful": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.5.1.tgz", "integrity": "sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==", - "dev": true + "dev": true, + "requires": {} }, "react-popper-tooltip": { "version": "3.1.1", @@ -69401,7 +70005,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.2.1.tgz", "integrity": "sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw==", - "dev": true + "dev": true, + "requires": {} }, "use-latest": { "version": "1.2.0", @@ -69416,7 +70021,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "dev": true + "dev": true, + "requires": {} } } } @@ -69515,13 +70121,15 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.7.tgz", "integrity": "sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==", - "dev": true + "dev": true, + "requires": {} }, "react-colorful": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.5.1.tgz", "integrity": "sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==", - "dev": true + "dev": true, + "requires": {} }, "react-popper-tooltip": { "version": "3.1.1", @@ -69562,7 +70170,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.2.1.tgz", "integrity": "sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw==", - "dev": true + "dev": true, + "requires": {} }, "use-latest": { "version": "1.2.0", @@ -69577,7 +70186,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "dev": true + "dev": true, + "requires": {} } } } @@ -69788,7 +70398,8 @@ "version": "1.6.22", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", - "dev": true + "dev": true, + "requires": {} }, "@storybook/builder-webpack4": { "version": "6.4.20", @@ -70136,7 +70747,8 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.7.tgz", "integrity": "sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==", - "dev": true + "dev": true, + "requires": {} }, "react-draggable": { "version": "4.4.4", @@ -70408,7 +71020,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/webpack-filter-warnings-plugin/-/webpack-filter-warnings-plugin-1.2.1.tgz", "integrity": "sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg==", - "dev": true + "dev": true, + "requires": {} } } }, @@ -70448,13 +71061,15 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.7.tgz", "integrity": "sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==", - "dev": true + "dev": true, + "requires": {} }, "react-colorful": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.5.1.tgz", "integrity": "sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==", - "dev": true + "dev": true, + "requires": {} }, "react-popper-tooltip": { "version": "3.1.1", @@ -70495,7 +71110,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.2.1.tgz", "integrity": "sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw==", - "dev": true + "dev": true, + "requires": {} }, "use-latest": { "version": "1.2.0", @@ -70510,7 +71126,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "dev": true + "dev": true, + "requires": {} } } } @@ -70710,7 +71327,8 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.7.tgz", "integrity": "sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==", - "dev": true + "dev": true, + "requires": {} }, "react-draggable": { "version": "4.4.4", @@ -71016,7 +71634,8 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.7.tgz", "integrity": "sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==", - "dev": true + "dev": true, + "requires": {} }, "react-draggable": { "version": "4.4.4", @@ -71621,13 +72240,15 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.7.tgz", "integrity": "sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==", - "dev": true + "dev": true, + "requires": {} }, "react-colorful": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.5.1.tgz", "integrity": "sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==", - "dev": true + "dev": true, + "requires": {} }, "react-popper-tooltip": { "version": "3.1.1", @@ -71668,7 +72289,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.2.1.tgz", "integrity": "sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw==", - "dev": true + "dev": true, + "requires": {} }, "use-latest": { "version": "1.2.0", @@ -71683,7 +72305,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "dev": true + "dev": true, + "requires": {} } } } @@ -71780,13 +72403,15 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.7.tgz", "integrity": "sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==", - "dev": true + "dev": true, + "requires": {} }, "react-colorful": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.5.1.tgz", "integrity": "sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==", - "dev": true + "dev": true, + "requires": {} }, "react-popper-tooltip": { "version": "3.1.1", @@ -71827,7 +72452,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.2.1.tgz", "integrity": "sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw==", - "dev": true + "dev": true, + "requires": {} }, "use-latest": { "version": "1.2.0", @@ -71842,7 +72468,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "dev": true + "dev": true, + "requires": {} } } } @@ -71902,13 +72529,15 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.7.tgz", "integrity": "sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==", - "dev": true + "dev": true, + "requires": {} }, "react-colorful": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.5.1.tgz", "integrity": "sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==", - "dev": true + "dev": true, + "requires": {} }, "react-popper-tooltip": { "version": "3.1.1", @@ -71949,7 +72578,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.2.1.tgz", "integrity": "sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw==", - "dev": true + "dev": true, + "requires": {} }, "use-latest": { "version": "1.2.0", @@ -71964,7 +72594,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "dev": true + "dev": true, + "requires": {} } } } @@ -72062,13 +72693,15 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.7.tgz", "integrity": "sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==", - "dev": true + "dev": true, + "requires": {} }, "react-colorful": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.5.1.tgz", "integrity": "sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==", - "dev": true + "dev": true, + "requires": {} }, "react-popper-tooltip": { "version": "3.1.1", @@ -72109,7 +72742,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.2.1.tgz", "integrity": "sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw==", - "dev": true + "dev": true, + "requires": {} }, "use-latest": { "version": "1.2.0", @@ -72124,7 +72758,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "dev": true + "dev": true, + "requires": {} } } } @@ -72442,7 +73077,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "ansi-align": { "version": "3.0.1", @@ -73013,7 +73649,8 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true + "dev": true, + "requires": {} } } }, @@ -73776,7 +74413,8 @@ "version": "5.5.1", "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.5.1.tgz", "integrity": "sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==", - "dev": true + "dev": true, + "requires": {} }, "react-popper-tooltip": { "version": "3.1.1", @@ -73817,7 +74455,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.2.1.tgz", "integrity": "sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw==", - "dev": true + "dev": true, + "requires": {} }, "use-latest": { "version": "1.2.0", @@ -73832,7 +74471,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "dev": true + "dev": true, + "requires": {} } } } @@ -73950,7 +74590,8 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.7.tgz", "integrity": "sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==", - "dev": true + "dev": true, + "requires": {} }, "react-draggable": { "version": "4.4.4", @@ -74195,13 +74836,15 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.7.tgz", "integrity": "sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==", - "dev": true + "dev": true, + "requires": {} }, "react-colorful": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.5.1.tgz", "integrity": "sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==", - "dev": true + "dev": true, + "requires": {} }, "react-popper-tooltip": { "version": "3.1.1", @@ -74242,7 +74885,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.2.1.tgz", "integrity": "sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw==", - "dev": true + "dev": true, + "requires": {} }, "use-latest": { "version": "1.2.0", @@ -74257,7 +74901,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "dev": true + "dev": true, + "requires": {} } } } @@ -74448,7 +75093,8 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.7.tgz", "integrity": "sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==", - "dev": true + "dev": true, + "requires": {} }, "react-draggable": { "version": "4.4.4", @@ -74651,7 +75297,8 @@ "version": "5.5.1", "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.5.1.tgz", "integrity": "sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==", - "dev": true + "dev": true, + "requires": {} }, "react-popper-tooltip": { "version": "3.1.1", @@ -74692,7 +75339,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.2.1.tgz", "integrity": "sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw==", - "dev": true + "dev": true, + "requires": {} }, "use-latest": { "version": "1.2.0", @@ -74707,7 +75355,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "dev": true + "dev": true, + "requires": {} } } } @@ -74805,7 +75454,8 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.7.tgz", "integrity": "sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w==", - "dev": true + "dev": true, + "requires": {} }, "react-draggable": { "version": "4.4.4", @@ -75180,7 +75830,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "ansi-align": { "version": "3.0.1", @@ -75776,7 +76427,8 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz", "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==", - "dev": true + "dev": true, + "requires": {} }, "react-is": { "version": "17.0.2", @@ -75916,7 +76568,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/webpack-filter-warnings-plugin/-/webpack-filter-warnings-plugin-1.2.1.tgz", "integrity": "sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg==", - "dev": true + "dev": true, + "requires": {} }, "widest-line": { "version": "3.1.0", @@ -75931,7 +76584,8 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true + "dev": true, + "requires": {} } } }, @@ -76173,175 +76827,863 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz", "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz", + "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz", + "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz", + "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz", + "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz", + "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz", + "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz", + "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==", + "dev": true, + "requires": {} + }, + "@svgr/babel-preset": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.2.0.tgz", + "integrity": "sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ==", + "dev": true, + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^6.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "^6.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "^6.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "^6.0.0", + "@svgr/babel-plugin-transform-svg-component": "^6.2.0" + } + }, + "@svgr/core": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.2.1.tgz", + "integrity": "sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA==", + "dev": true, + "requires": { + "@svgr/plugin-jsx": "^6.2.1", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz", + "integrity": "sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ==", + "dev": true, + "requires": { + "@babel/types": "^7.15.6", + "entities": "^3.0.1" + } + }, + "@svgr/plugin-jsx": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz", + "integrity": "sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g==", + "dev": true, + "requires": { + "@babel/core": "^7.15.5", + "@svgr/babel-preset": "^6.2.0", + "@svgr/hast-util-to-babel-ast": "^6.2.1", + "svg-parser": "^2.0.2" + } + }, + "@svgr/plugin-svgo": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz", + "integrity": "sha512-oDdMQONKOJEbuKwuy4Np6VdV6qoaLLvoY86hjvQEgU82Vx1MSWRyYms6Sl0f+NtqxLI/rDVufATbP/ev996k3Q==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "svgo": "^2.5.0" + } + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz", - "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==", - "dev": true + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + } + } + } + }, + "@synthetixio/assets": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@synthetixio/assets/-/assets-2.0.13.tgz", + "integrity": "sha512-H/2tpCJxbVWdawXNfF/Kz92w5nGkvYLVfiMaM6wpttNvtzV2Ii7VNDYwgr0EQ0Kax5wU6bOwp1oeUQ1Oa2JEyA==" + }, + "@synthetixio/contracts-interface": { + "version": "2.71.2", + "resolved": "https://registry.npmjs.org/@synthetixio/contracts-interface/-/contracts-interface-2.71.2.tgz", + "integrity": "sha512-9NU8QITXphxrEwtSMpjRdde3lxRswr5QaQedZo9ge8bMyyOFH+fL+M1K3gl2y9o8CUiEY66CaJwoiiP2U45HAg==", + "requires": { + "ethers": "5.5.3", + "synthetix": "2.71.2" + }, + "dependencies": { + "@ethersproject/abi": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.5.0.tgz", + "integrity": "sha512-loW7I4AohP5KycATvc0MgujU6JyCHPqHdeoo9z3Nr9xEiNioxa65ccdm1+fsoJhkuhdRtfcL8cfyGamz2AxZ5w==", + "requires": { + "@ethersproject/address": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/constants": "^5.5.0", + "@ethersproject/hash": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/strings": "^5.5.0" + } + }, + "@ethersproject/abstract-provider": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz", + "integrity": "sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg==", + "requires": { + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/networks": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/transactions": "^5.5.0", + "@ethersproject/web": "^5.5.0" + } + }, + "@ethersproject/abstract-signer": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz", + "integrity": "sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA==", + "requires": { + "@ethersproject/abstract-provider": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0" + } + }, + "@ethersproject/address": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.5.0.tgz", + "integrity": "sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw==", + "requires": { + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/rlp": "^5.5.0" + } + }, + "@ethersproject/base64": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.5.0.tgz", + "integrity": "sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA==", + "requires": { + "@ethersproject/bytes": "^5.5.0" + } + }, + "@ethersproject/basex": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.5.0.tgz", + "integrity": "sha512-ZIodwhHpVJ0Y3hUCfUucmxKsWQA5TMnavp5j/UOuDdzZWzJlRmuOjcTMIGgHCYuZmHt36BfiSyQPSRskPxbfaQ==", + "requires": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/properties": "^5.5.0" + } + }, + "@ethersproject/bignumber": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.5.0.tgz", + "integrity": "sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg==", + "requires": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "bn.js": "^4.11.9" + } + }, + "@ethersproject/bytes": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.5.0.tgz", + "integrity": "sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog==", + "requires": { + "@ethersproject/logger": "^5.5.0" + } + }, + "@ethersproject/constants": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.5.0.tgz", + "integrity": "sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ==", + "requires": { + "@ethersproject/bignumber": "^5.5.0" + } + }, + "@ethersproject/contracts": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.5.0.tgz", + "integrity": "sha512-2viY7NzyvJkh+Ug17v7g3/IJC8HqZBDcOjYARZLdzRxrfGlRgmYgl6xPRKVbEzy1dWKw/iv7chDcS83pg6cLxg==", + "requires": { + "@ethersproject/abi": "^5.5.0", + "@ethersproject/abstract-provider": "^5.5.0", + "@ethersproject/abstract-signer": "^5.5.0", + "@ethersproject/address": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/constants": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/transactions": "^5.5.0" + } + }, + "@ethersproject/hash": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.5.0.tgz", + "integrity": "sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg==", + "requires": { + "@ethersproject/abstract-signer": "^5.5.0", + "@ethersproject/address": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/strings": "^5.5.0" + } + }, + "@ethersproject/hdnode": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.5.0.tgz", + "integrity": "sha512-mcSOo9zeUg1L0CoJH7zmxwUG5ggQHU1UrRf8jyTYy6HxdZV+r0PBoL1bxr+JHIPXRzS6u/UW4mEn43y0tmyF8Q==", + "requires": { + "@ethersproject/abstract-signer": "^5.5.0", + "@ethersproject/basex": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/pbkdf2": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/sha2": "^5.5.0", + "@ethersproject/signing-key": "^5.5.0", + "@ethersproject/strings": "^5.5.0", + "@ethersproject/transactions": "^5.5.0", + "@ethersproject/wordlists": "^5.5.0" + } + }, + "@ethersproject/json-wallets": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.5.0.tgz", + "integrity": "sha512-9lA21XQnCdcS72xlBn1jfQdj2A1VUxZzOzi9UkNdnokNKke/9Ya2xA9aIK1SC3PQyBDLt4C+dfps7ULpkvKikQ==", + "requires": { + "@ethersproject/abstract-signer": "^5.5.0", + "@ethersproject/address": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/hdnode": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/pbkdf2": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/random": "^5.5.0", + "@ethersproject/strings": "^5.5.0", + "@ethersproject/transactions": "^5.5.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" + } + }, + "@ethersproject/keccak256": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.5.0.tgz", + "integrity": "sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg==", + "requires": { + "@ethersproject/bytes": "^5.5.0", + "js-sha3": "0.8.0" + } + }, + "@ethersproject/logger": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.5.0.tgz", + "integrity": "sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg==" + }, + "@ethersproject/networks": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.5.2.tgz", + "integrity": "sha512-NEqPxbGBfy6O3x4ZTISb90SjEDkWYDUbEeIFhJly0F7sZjoQMnj5KYzMSkMkLKZ+1fGpx00EDpHQCy6PrDupkQ==", + "requires": { + "@ethersproject/logger": "^5.5.0" + } + }, + "@ethersproject/pbkdf2": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.5.0.tgz", + "integrity": "sha512-SaDvQFvXPnz1QGpzr6/HToLifftSXGoXrbpZ6BvoZhmx4bNLHrxDe8MZisuecyOziP1aVEwzC2Hasj+86TgWVg==", + "requires": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/sha2": "^5.5.0" + } + }, + "@ethersproject/properties": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.5.0.tgz", + "integrity": "sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA==", + "requires": { + "@ethersproject/logger": "^5.5.0" + } + }, + "@ethersproject/providers": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.5.2.tgz", + "integrity": "sha512-hkbx7x/MKcRjyrO4StKXCzCpWer6s97xnm34xkfPiarhtEUVAN4TBBpamM+z66WcTt7H5B53YwbRj1n7i8pZoQ==", + "requires": { + "@ethersproject/abstract-provider": "^5.5.0", + "@ethersproject/abstract-signer": "^5.5.0", + "@ethersproject/address": "^5.5.0", + "@ethersproject/basex": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/constants": "^5.5.0", + "@ethersproject/hash": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/networks": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/random": "^5.5.0", + "@ethersproject/rlp": "^5.5.0", + "@ethersproject/sha2": "^5.5.0", + "@ethersproject/strings": "^5.5.0", + "@ethersproject/transactions": "^5.5.0", + "@ethersproject/web": "^5.5.0", + "bech32": "1.1.4", + "ws": "7.4.6" + } + }, + "@ethersproject/random": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.5.1.tgz", + "integrity": "sha512-YaU2dQ7DuhL5Au7KbcQLHxcRHfgyNgvFV4sQOo0HrtW3Zkrc9ctWNz8wXQ4uCSfSDsqX2vcjhroxU5RQRV0nqA==", + "requires": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0" + } + }, + "@ethersproject/rlp": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.5.0.tgz", + "integrity": "sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA==", + "requires": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0" + } }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz", - "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==", - "dev": true + "@ethersproject/sha2": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.5.0.tgz", + "integrity": "sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA==", + "requires": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "hash.js": "1.1.7" + } }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz", - "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==", - "dev": true + "@ethersproject/signing-key": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.5.0.tgz", + "integrity": "sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng==", + "requires": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz", - "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==", - "dev": true + "@ethersproject/solidity": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.5.0.tgz", + "integrity": "sha512-9NgZs9LhGMj6aCtHXhtmFQ4AN4sth5HuFXVvAQtzmm0jpSCNOTGtrHZJAeYTh7MBjRR8brylWZxBZR9zDStXbw==", + "requires": { + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/sha2": "^5.5.0", + "@ethersproject/strings": "^5.5.0" + } }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz", - "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==", - "dev": true + "@ethersproject/strings": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.5.0.tgz", + "integrity": "sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ==", + "requires": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/constants": "^5.5.0", + "@ethersproject/logger": "^5.5.0" + } }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz", - "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==", - "dev": true + "@ethersproject/transactions": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.5.0.tgz", + "integrity": "sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA==", + "requires": { + "@ethersproject/address": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/constants": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/rlp": "^5.5.0", + "@ethersproject/signing-key": "^5.5.0" + } }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz", - "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==", - "dev": true + "@ethersproject/units": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.5.0.tgz", + "integrity": "sha512-7+DpjiZk4v6wrikj+TCyWWa9dXLNU73tSTa7n0TSJDxkYbV3Yf1eRh9ToMLlZtuctNYu9RDNNy2USq3AdqSbag==", + "requires": { + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/constants": "^5.5.0", + "@ethersproject/logger": "^5.5.0" + } }, - "@svgr/babel-preset": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.2.0.tgz", - "integrity": "sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ==", - "dev": true, + "@ethersproject/wallet": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.5.0.tgz", + "integrity": "sha512-Mlu13hIctSYaZmUOo7r2PhNSd8eaMPVXe1wxrz4w4FCE4tDYBywDH+bAR1Xz2ADyXGwqYMwstzTrtUVIsKDO0Q==", "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^6.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "^6.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "^6.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "^6.0.0", - "@svgr/babel-plugin-transform-svg-component": "^6.2.0" + "@ethersproject/abstract-provider": "^5.5.0", + "@ethersproject/abstract-signer": "^5.5.0", + "@ethersproject/address": "^5.5.0", + "@ethersproject/bignumber": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/hash": "^5.5.0", + "@ethersproject/hdnode": "^5.5.0", + "@ethersproject/json-wallets": "^5.5.0", + "@ethersproject/keccak256": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/random": "^5.5.0", + "@ethersproject/signing-key": "^5.5.0", + "@ethersproject/transactions": "^5.5.0", + "@ethersproject/wordlists": "^5.5.0" } }, - "@svgr/core": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.2.1.tgz", - "integrity": "sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA==", - "dev": true, + "@ethersproject/web": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.5.1.tgz", + "integrity": "sha512-olvLvc1CB12sREc1ROPSHTdFCdvMh0J5GSJYiQg2D0hdD4QmJDy8QYDb1CvoqD/bF1c++aeKv2sR5uduuG9dQg==", "requires": { - "@svgr/plugin-jsx": "^6.2.1", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.1" + "@ethersproject/base64": "^5.5.0", + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/strings": "^5.5.0" } }, - "@svgr/hast-util-to-babel-ast": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz", - "integrity": "sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ==", - "dev": true, + "@ethersproject/wordlists": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.5.0.tgz", + "integrity": "sha512-bL0UTReWDiaQJJYOC9sh/XcRu/9i2jMrzf8VLRmPKx58ckSlOJiohODkECCO50dtLZHcGU6MLXQ4OOrgBwP77Q==", "requires": { - "@babel/types": "^7.15.6", - "entities": "^3.0.1" + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/hash": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "@ethersproject/properties": "^5.5.0", + "@ethersproject/strings": "^5.5.0" } }, - "@svgr/plugin-jsx": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz", - "integrity": "sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g==", + "eth-lib": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", + "integrity": "sha512-VqEBQKH92jNsaE8lG9CTq8M/bc12gdAfb5MY8Ro1hVyXkh7rOtY3m5tRHK3Hus5HqIAAwU2ivcUjTLVwsvf/kw==", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "ethers": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.5.3.tgz", + "integrity": "sha512-fTT4WT8/hTe/BLwRUtl7I5zlpF3XC3P/Xwqxc5AIP2HGlH15qpmjs0Ou78az93b1rLITzXLFxoNX63B8ZbUd7g==", + "requires": { + "@ethersproject/abi": "5.5.0", + "@ethersproject/abstract-provider": "5.5.1", + "@ethersproject/abstract-signer": "5.5.0", + "@ethersproject/address": "5.5.0", + "@ethersproject/base64": "5.5.0", + "@ethersproject/basex": "5.5.0", + "@ethersproject/bignumber": "5.5.0", + "@ethersproject/bytes": "5.5.0", + "@ethersproject/constants": "5.5.0", + "@ethersproject/contracts": "5.5.0", + "@ethersproject/hash": "5.5.0", + "@ethersproject/hdnode": "5.5.0", + "@ethersproject/json-wallets": "5.5.0", + "@ethersproject/keccak256": "5.5.0", + "@ethersproject/logger": "5.5.0", + "@ethersproject/networks": "5.5.2", + "@ethersproject/pbkdf2": "5.5.0", + "@ethersproject/properties": "5.5.0", + "@ethersproject/providers": "5.5.2", + "@ethersproject/random": "5.5.1", + "@ethersproject/rlp": "5.5.0", + "@ethersproject/sha2": "5.5.0", + "@ethersproject/signing-key": "5.5.0", + "@ethersproject/solidity": "5.5.0", + "@ethersproject/strings": "5.5.0", + "@ethersproject/transactions": "5.5.0", + "@ethersproject/units": "5.5.0", + "@ethersproject/wallet": "5.5.0", + "@ethersproject/web": "5.5.1", + "@ethersproject/wordlists": "5.5.0" + } + }, + "synthetix": { + "version": "2.71.2", + "resolved": "https://registry.npmjs.org/synthetix/-/synthetix-2.71.2.tgz", + "integrity": "sha512-rl4JR2atAMsGS3Fa6hMoZBALVo2Mxb4JyR26chrmabTinN1omlCJRiwkgP1ivMPTcn5np8k/dxsDVm+w34KDHw==", + "requires": { + "abi-decoder": "2.3.0", + "commander": "8.1.0", + "inquirer": "^6.5.2", + "inquirer-list-search-prompt": "^1.0.2", + "js-levenshtein": "^1.1.6", + "pretty-error": "^2.1.1", + "solidity-parser-antlr": "^0.4.11", + "web3-utils": "1.2.2" + } + }, + "web3-utils": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.2.tgz", + "integrity": "sha512-joF+s3243TY5cL7Z7y4h1JsJpUCf/kmFmj+eJar7Y2yNIGVcW961VyrAms75tjUysSuHaUQ3eQXjBEUJueT52A==", + "requires": { + "bn.js": "4.11.8", + "eth-lib": "0.2.7", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.9.1", + "utf8": "3.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + } + } + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} + } + } + }, + "@synthetixio/js": { + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/@synthetixio/js/-/js-2.41.0.tgz", + "integrity": "sha512-t09q0JKtbOw6nCGUffd06m/+Jgsev79A0PaNKyQImxlgw2olGZGqeA/Z7AEqlDH0+6NU25jYVhMPip0r63cHtQ==", + "dev": true, + "requires": { + "ethers": "5.0.7", + "lodash": "4.17.19", + "synthetix": "2.41.0", + "web3-utils": "1.2.11" + }, + "dependencies": { + "@eth-optimism/contracts": { + "version": "0.0.2-alpha.7", + "resolved": "https://registry.npmjs.org/@eth-optimism/contracts/-/contracts-0.0.2-alpha.7.tgz", + "integrity": "sha512-nl+UsKPTPEyKS6p5E5g4U5SAqOK8Cj24o0GXtxERuVW/+eaBqbc5IEM50/wL5e/XiW4DjUOAMZl01GYiE8mIfA==", "dev": true, "requires": { - "@babel/core": "^7.15.5", - "@svgr/babel-preset": "^6.2.0", - "@svgr/hast-util-to-babel-ast": "^6.2.1", - "svg-parser": "^2.0.2" + "ethers": "5.0.0" + }, + "dependencies": { + "ethers": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.0.0.tgz", + "integrity": "sha512-uOSACd2E8dg8XuiOewpL42uFH7SvrkA5k0oGkHoqSJl2lflrMPV+7ciWzyuPBjyHnOFvAPPJUpsXrwpFKaLFww==", + "dev": true, + "requires": { + "@ethersproject/abi": "^5.0.0", + "@ethersproject/abstract-provider": "^5.0.0", + "@ethersproject/abstract-signer": "^5.0.0", + "@ethersproject/address": "^5.0.0", + "@ethersproject/base64": "^5.0.0", + "@ethersproject/bignumber": "^5.0.0", + "@ethersproject/bytes": "^5.0.0", + "@ethersproject/constants": "^5.0.0", + "@ethersproject/contracts": "^5.0.0", + "@ethersproject/hash": "^5.0.0", + "@ethersproject/hdnode": "^5.0.0", + "@ethersproject/json-wallets": "^5.0.0", + "@ethersproject/keccak256": "^5.0.0", + "@ethersproject/logger": "^5.0.0", + "@ethersproject/networks": "^5.0.0", + "@ethersproject/pbkdf2": "^5.0.0", + "@ethersproject/properties": "^5.0.0", + "@ethersproject/providers": "^5.0.0", + "@ethersproject/random": "^5.0.0", + "@ethersproject/rlp": "^5.0.0", + "@ethersproject/sha2": "^5.0.0", + "@ethersproject/signing-key": "^5.0.0", + "@ethersproject/solidity": "^5.0.0", + "@ethersproject/strings": "^5.0.0", + "@ethersproject/transactions": "^5.0.0", + "@ethersproject/units": "^5.0.0", + "@ethersproject/wallet": "^5.0.0", + "@ethersproject/web": "^5.0.0", + "@ethersproject/wordlists": "^5.0.0" + } + } } }, - "@svgr/plugin-svgo": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz", - "integrity": "sha512-oDdMQONKOJEbuKwuy4Np6VdV6qoaLLvoY86hjvQEgU82Vx1MSWRyYms6Sl0f+NtqxLI/rDVufATbP/ev996k3Q==", + "@eth-optimism/watcher": { + "version": "0.0.1-alpha.8", + "resolved": "https://registry.npmjs.org/@eth-optimism/watcher/-/watcher-0.0.1-alpha.8.tgz", + "integrity": "sha512-UICItZmRtQ4U2Ae8D56to0MZskFVdKOej3srcDg7PgAi/HqDetoyt5eutBPVgABiiIMTWvkoh6EsbgRJRPjWNg==", "dev": true, "requires": { - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "svgo": "^2.5.0" + "ethers": "5.0.0" + }, + "dependencies": { + "ethers": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.0.0.tgz", + "integrity": "sha512-uOSACd2E8dg8XuiOewpL42uFH7SvrkA5k0oGkHoqSJl2lflrMPV+7ciWzyuPBjyHnOFvAPPJUpsXrwpFKaLFww==", + "dev": true, + "requires": { + "@ethersproject/abi": "^5.0.0", + "@ethersproject/abstract-provider": "^5.0.0", + "@ethersproject/abstract-signer": "^5.0.0", + "@ethersproject/address": "^5.0.0", + "@ethersproject/base64": "^5.0.0", + "@ethersproject/bignumber": "^5.0.0", + "@ethersproject/bytes": "^5.0.0", + "@ethersproject/constants": "^5.0.0", + "@ethersproject/contracts": "^5.0.0", + "@ethersproject/hash": "^5.0.0", + "@ethersproject/hdnode": "^5.0.0", + "@ethersproject/json-wallets": "^5.0.0", + "@ethersproject/keccak256": "^5.0.0", + "@ethersproject/logger": "^5.0.0", + "@ethersproject/networks": "^5.0.0", + "@ethersproject/pbkdf2": "^5.0.0", + "@ethersproject/properties": "^5.0.0", + "@ethersproject/providers": "^5.0.0", + "@ethersproject/random": "^5.0.0", + "@ethersproject/rlp": "^5.0.0", + "@ethersproject/sha2": "^5.0.0", + "@ethersproject/signing-key": "^5.0.0", + "@ethersproject/solidity": "^5.0.0", + "@ethersproject/strings": "^5.0.0", + "@ethersproject/transactions": "^5.0.0", + "@ethersproject/units": "^5.0.0", + "@ethersproject/wallet": "^5.0.0", + "@ethersproject/web": "^5.0.0", + "@ethersproject/wordlists": "^5.0.0" + } + } } }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "eth-lib": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", + "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", "dev": true, "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" } }, - "entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "dev": true - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true + "ethers": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.0.7.tgz", + "integrity": "sha512-1Zu9s+z4BgsDAZcGIYACJdWBB6mVtCCmUonj68Njul7STcSdgwOyj0sCAxCUr2Nsmsamckr4E12q3ecvZPGAUw==", + "dev": true, + "requires": { + "@ethersproject/abi": "^5.0.0", + "@ethersproject/abstract-provider": "^5.0.0", + "@ethersproject/abstract-signer": "^5.0.0", + "@ethersproject/address": "^5.0.0", + "@ethersproject/base64": "^5.0.0", + "@ethersproject/bignumber": "^5.0.0", + "@ethersproject/bytes": "^5.0.0", + "@ethersproject/constants": "^5.0.0", + "@ethersproject/contracts": "^5.0.0", + "@ethersproject/hash": "^5.0.0", + "@ethersproject/hdnode": "^5.0.0", + "@ethersproject/json-wallets": "^5.0.0", + "@ethersproject/keccak256": "^5.0.0", + "@ethersproject/logger": "^5.0.0", + "@ethersproject/networks": "^5.0.0", + "@ethersproject/pbkdf2": "^5.0.0", + "@ethersproject/properties": "^5.0.0", + "@ethersproject/providers": "^5.0.0", + "@ethersproject/random": "^5.0.0", + "@ethersproject/rlp": "^5.0.0", + "@ethersproject/sha2": "^5.0.0", + "@ethersproject/signing-key": "^5.0.0", + "@ethersproject/solidity": "^5.0.0", + "@ethersproject/strings": "^5.0.0", + "@ethersproject/transactions": "^5.0.0", + "@ethersproject/units": "^5.0.0", + "@ethersproject/wallet": "^5.0.0", + "@ethersproject/web": "^5.0.0", + "@ethersproject/wordlists": "^5.0.0" + } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", "dev": true }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "synthetix": { + "version": "2.41.0", + "resolved": "https://registry.npmjs.org/synthetix/-/synthetix-2.41.0.tgz", + "integrity": "sha512-UsPPSijN2w2C4v7V4QwtjwBpLhJ/pC0NVzec+TpRBTdAFOreJNI+bUTzG479/CFFGLm7sS4nJNM/c+7UAUzcbg==", "dev": true, "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" + "@chainlink/contracts-0.0.10": "npm:@chainlink/contracts@0.0.10", + "@eth-optimism/contracts": "0.0.2-alpha.7", + "@eth-optimism/watcher": "0.0.1-alpha.8", + "abi-decoder": "2.3.0", + "commander": "5.1.0", + "openzeppelin-solidity-2.3.0": "npm:openzeppelin-solidity@2.3.0", + "pretty-error": "^2.1.1", + "solidity-parser-antlr": "^0.4.11", + "web3-utils": "1.2.2" + }, + "dependencies": { + "web3-utils": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.2.tgz", + "integrity": "sha512-joF+s3243TY5cL7Z7y4h1JsJpUCf/kmFmj+eJar7Y2yNIGVcW961VyrAms75tjUysSuHaUQ3eQXjBEUJueT52A==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "eth-lib": "0.2.7", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.9.1", + "utf8": "3.0.0" + } + } } } } }, - "@synthetixio/assets": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@synthetixio/assets/-/assets-2.0.12.tgz", - "integrity": "sha512-yUtd9cvpohmPtajsb4Cinntx6wt8XuG+W1o3PwsrLYKhSEiCR4Psuslel2QCntnsY38yqLPmPDjpPYdyezeaHQ==" - }, - "@synthetixio/contracts-interface": { - "version": "2.68.2", - "resolved": "https://registry.npmjs.org/@synthetixio/contracts-interface/-/contracts-interface-2.68.2.tgz", - "integrity": "sha512-tRjMe7C4gBgOvBwQv9YYx2Ogl7inQNz0PvoeRLnIdEHr8OjQVZZtUf+ORd6uYsS12M3NkhPlBFgdNf5k8XSiOw==", + "@synthetixio/optimism-networks": { + "version": "2.71.2", + "resolved": "https://registry.npmjs.org/@synthetixio/optimism-networks/-/optimism-networks-2.71.2.tgz", + "integrity": "sha512-Inf6fHu8OvAn4SSckmJzTtFZU0YBx5jC+5SEG9csCO6HTCsbmF9B4ucxtROQIeM9caZ+bpBR6GsYjAKsP6XAug==", "requires": { - "ethers": "5.5.3", - "lodash": "4.17.19", - "synthetix": "2.68.2", - "web3-utils": "1.2.11" + "@eth-optimism/watcher": "^0.0.1-alpha.9", + "@metamask/providers": "8.1.1", + "ethers": "5.5.3" }, "dependencies": { "@ethersproject/abi": { @@ -76750,246 +78092,22 @@ "@ethersproject/wordlists": "5.5.0" } }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - }, "ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" - } - } - }, - "@synthetixio/js": { - "version": "2.41.0", - "resolved": "https://registry.npmjs.org/@synthetixio/js/-/js-2.41.0.tgz", - "integrity": "sha512-t09q0JKtbOw6nCGUffd06m/+Jgsev79A0PaNKyQImxlgw2olGZGqeA/Z7AEqlDH0+6NU25jYVhMPip0r63cHtQ==", - "dev": true, - "requires": { - "ethers": "5.0.7", - "lodash": "4.17.19", - "synthetix": "2.41.0", - "web3-utils": "1.2.11" - }, - "dependencies": { - "@eth-optimism/contracts": { - "version": "0.0.2-alpha.7", - "resolved": "https://registry.npmjs.org/@eth-optimism/contracts/-/contracts-0.0.2-alpha.7.tgz", - "integrity": "sha512-nl+UsKPTPEyKS6p5E5g4U5SAqOK8Cj24o0GXtxERuVW/+eaBqbc5IEM50/wL5e/XiW4DjUOAMZl01GYiE8mIfA==", - "dev": true, - "requires": { - "ethers": "5.0.0" - }, - "dependencies": { - "ethers": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.0.0.tgz", - "integrity": "sha512-uOSACd2E8dg8XuiOewpL42uFH7SvrkA5k0oGkHoqSJl2lflrMPV+7ciWzyuPBjyHnOFvAPPJUpsXrwpFKaLFww==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.0.0", - "@ethersproject/abstract-provider": "^5.0.0", - "@ethersproject/abstract-signer": "^5.0.0", - "@ethersproject/address": "^5.0.0", - "@ethersproject/base64": "^5.0.0", - "@ethersproject/bignumber": "^5.0.0", - "@ethersproject/bytes": "^5.0.0", - "@ethersproject/constants": "^5.0.0", - "@ethersproject/contracts": "^5.0.0", - "@ethersproject/hash": "^5.0.0", - "@ethersproject/hdnode": "^5.0.0", - "@ethersproject/json-wallets": "^5.0.0", - "@ethersproject/keccak256": "^5.0.0", - "@ethersproject/logger": "^5.0.0", - "@ethersproject/networks": "^5.0.0", - "@ethersproject/pbkdf2": "^5.0.0", - "@ethersproject/properties": "^5.0.0", - "@ethersproject/providers": "^5.0.0", - "@ethersproject/random": "^5.0.0", - "@ethersproject/rlp": "^5.0.0", - "@ethersproject/sha2": "^5.0.0", - "@ethersproject/signing-key": "^5.0.0", - "@ethersproject/solidity": "^5.0.0", - "@ethersproject/strings": "^5.0.0", - "@ethersproject/transactions": "^5.0.0", - "@ethersproject/units": "^5.0.0", - "@ethersproject/wallet": "^5.0.0", - "@ethersproject/web": "^5.0.0", - "@ethersproject/wordlists": "^5.0.0" - } - } - } - }, - "@eth-optimism/watcher": { - "version": "0.0.1-alpha.8", - "resolved": "https://registry.npmjs.org/@eth-optimism/watcher/-/watcher-0.0.1-alpha.8.tgz", - "integrity": "sha512-UICItZmRtQ4U2Ae8D56to0MZskFVdKOej3srcDg7PgAi/HqDetoyt5eutBPVgABiiIMTWvkoh6EsbgRJRPjWNg==", - "dev": true, - "requires": { - "ethers": "5.0.0" - }, - "dependencies": { - "ethers": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.0.0.tgz", - "integrity": "sha512-uOSACd2E8dg8XuiOewpL42uFH7SvrkA5k0oGkHoqSJl2lflrMPV+7ciWzyuPBjyHnOFvAPPJUpsXrwpFKaLFww==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.0.0", - "@ethersproject/abstract-provider": "^5.0.0", - "@ethersproject/abstract-signer": "^5.0.0", - "@ethersproject/address": "^5.0.0", - "@ethersproject/base64": "^5.0.0", - "@ethersproject/bignumber": "^5.0.0", - "@ethersproject/bytes": "^5.0.0", - "@ethersproject/constants": "^5.0.0", - "@ethersproject/contracts": "^5.0.0", - "@ethersproject/hash": "^5.0.0", - "@ethersproject/hdnode": "^5.0.0", - "@ethersproject/json-wallets": "^5.0.0", - "@ethersproject/keccak256": "^5.0.0", - "@ethersproject/logger": "^5.0.0", - "@ethersproject/networks": "^5.0.0", - "@ethersproject/pbkdf2": "^5.0.0", - "@ethersproject/properties": "^5.0.0", - "@ethersproject/providers": "^5.0.0", - "@ethersproject/random": "^5.0.0", - "@ethersproject/rlp": "^5.0.0", - "@ethersproject/sha2": "^5.0.0", - "@ethersproject/signing-key": "^5.0.0", - "@ethersproject/solidity": "^5.0.0", - "@ethersproject/strings": "^5.0.0", - "@ethersproject/transactions": "^5.0.0", - "@ethersproject/units": "^5.0.0", - "@ethersproject/wallet": "^5.0.0", - "@ethersproject/web": "^5.0.0", - "@ethersproject/wordlists": "^5.0.0" - } - } - } - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true - }, - "eth-lib": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", - "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", - "dev": true, - "requires": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "ethers": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.0.7.tgz", - "integrity": "sha512-1Zu9s+z4BgsDAZcGIYACJdWBB6mVtCCmUonj68Njul7STcSdgwOyj0sCAxCUr2Nsmsamckr4E12q3ecvZPGAUw==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.0.0", - "@ethersproject/abstract-provider": "^5.0.0", - "@ethersproject/abstract-signer": "^5.0.0", - "@ethersproject/address": "^5.0.0", - "@ethersproject/base64": "^5.0.0", - "@ethersproject/bignumber": "^5.0.0", - "@ethersproject/bytes": "^5.0.0", - "@ethersproject/constants": "^5.0.0", - "@ethersproject/contracts": "^5.0.0", - "@ethersproject/hash": "^5.0.0", - "@ethersproject/hdnode": "^5.0.0", - "@ethersproject/json-wallets": "^5.0.0", - "@ethersproject/keccak256": "^5.0.0", - "@ethersproject/logger": "^5.0.0", - "@ethersproject/networks": "^5.0.0", - "@ethersproject/pbkdf2": "^5.0.0", - "@ethersproject/properties": "^5.0.0", - "@ethersproject/providers": "^5.0.0", - "@ethersproject/random": "^5.0.0", - "@ethersproject/rlp": "^5.0.0", - "@ethersproject/sha2": "^5.0.0", - "@ethersproject/signing-key": "^5.0.0", - "@ethersproject/solidity": "^5.0.0", - "@ethersproject/strings": "^5.0.0", - "@ethersproject/transactions": "^5.0.0", - "@ethersproject/units": "^5.0.0", - "@ethersproject/wallet": "^5.0.0", - "@ethersproject/web": "^5.0.0", - "@ethersproject/wordlists": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", - "dev": true - }, - "synthetix": { - "version": "2.41.0", - "resolved": "https://registry.npmjs.org/synthetix/-/synthetix-2.41.0.tgz", - "integrity": "sha512-UsPPSijN2w2C4v7V4QwtjwBpLhJ/pC0NVzec+TpRBTdAFOreJNI+bUTzG479/CFFGLm7sS4nJNM/c+7UAUzcbg==", - "dev": true, - "requires": { - "@chainlink/contracts-0.0.10": "npm:@chainlink/contracts@0.0.10", - "@eth-optimism/contracts": "0.0.2-alpha.7", - "@eth-optimism/watcher": "0.0.1-alpha.8", - "abi-decoder": "2.3.0", - "commander": "5.1.0", - "openzeppelin-solidity-2.3.0": "npm:openzeppelin-solidity@2.3.0", - "pretty-error": "^2.1.1", - "solidity-parser-antlr": "^0.4.11", - "web3-utils": "1.2.2" - }, - "dependencies": { - "web3-utils": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.2.tgz", - "integrity": "sha512-joF+s3243TY5cL7Z7y4h1JsJpUCf/kmFmj+eJar7Y2yNIGVcW961VyrAms75tjUysSuHaUQ3eQXjBEUJueT52A==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "eth-lib": "0.2.7", - "ethereum-bloom-filters": "^1.0.6", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "underscore": "1.9.1", - "utf8": "3.0.0" - } - } - } + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} } } }, - "@synthetixio/optimism-networks": { - "version": "2.68.2", - "resolved": "https://registry.npmjs.org/@synthetixio/optimism-networks/-/optimism-networks-2.68.2.tgz", - "integrity": "sha512-TqgGXWmIFK5E7mH6Ocb5sKagBHXRPUFT9ePn9r+8Bx0KOfdrt8xDMtaLnRn56FaHOqhPAPbvnytNYhzciNM0Ig==", - "requires": { - "@eth-optimism/watcher": "^0.0.1-alpha.9", - "@metamask/providers": "8.1.1" - } - }, "@synthetixio/providers": { - "version": "2.68.2", - "resolved": "https://registry.npmjs.org/@synthetixio/providers/-/providers-2.68.2.tgz", - "integrity": "sha512-O/9pZXsvWWvYI62eC9AP1VuQU4xmUZDN9sbuR08lHe8kx01SCLx08tMi50uFs+mk8SjgqP5JtJBhZ07F9bpKlA==", + "version": "2.71.2", + "resolved": "https://registry.npmjs.org/@synthetixio/providers/-/providers-2.71.2.tgz", + "integrity": "sha512-QdLl/IkFuFiCBWIH1phRpU+9ytDoTpf+ptS4LMmvlGRqNcy/Dd9oY+R9DGzuBhwyVSCa4lKYRvi4eNAyDciTYA==", "requires": { "@eth-optimism/provider": "0.0.1-alpha.14", - "@synthetixio/contracts-interface": "2.68.2", - "@synthetixio/optimism-networks": "2.68.2", + "@synthetixio/contracts-interface": "2.71.2", + "@synthetixio/optimism-networks": "2.71.2", "ethers": "5.5.3" }, "dependencies": { @@ -77402,25 +78520,23 @@ "ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} } } }, "@synthetixio/queries": { - "version": "2.68.2", - "resolved": "https://registry.npmjs.org/@synthetixio/queries/-/queries-2.68.2.tgz", - "integrity": "sha512-7LGDLY7H4I27tJhBjFG6FS0h88x5Nhestpf/Z2nMm8RRpxjhGyMGmNd43UcPAJq9tvrSh6o3bfHzK1INqiQz4A==", + "version": "2.71.2", + "resolved": "https://registry.npmjs.org/@synthetixio/queries/-/queries-2.71.2.tgz", + "integrity": "sha512-OZad69+R0imUDfWlQt/kZEWr/m0Q6fRViakwVVnYQsmwMtTV08fZr7b0ui35G3JVgUhKYm4Ho8O8PXXqnEt/BA==", "requires": { "@snapshot-labs/snapshot.js": "0.3.22", - "@synthetixio/contracts-interface": "2.68.2", - "@synthetixio/optimism-networks": "2.68.2", - "@synthetixio/providers": "2.68.2", - "@synthetixio/transaction-notifier": "2.68.2", - "@synthetixio/wei": "2.68.2", + "@synthetixio/contracts-interface": "2.71.2", + "@synthetixio/optimism-networks": "2.71.2", + "@synthetixio/providers": "2.71.2", + "@synthetixio/wei": "2.71.2", "axios": "^0.21.4", - "bignumber.js": "9.0.1", "date-fns": "2.19.0", - "ethcall": "3.3.0", "ethers": "5.5.3", "graphql": "15.5.0", "graphql-request": "3.4.0", @@ -77797,11 +78913,6 @@ "@ethersproject/strings": "^5.5.0" } }, - "@types/node": { - "version": "14.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", - "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==" - }, "axios": { "version": "0.21.4", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", @@ -77810,28 +78921,11 @@ "follow-redirects": "^1.14.0" } }, - "bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" - }, "date-fns": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.19.0.tgz", "integrity": "sha512-X3bf2iTPgCAQp9wvjOQytnf5vO5rESYRXlPIVcgSbtT5OTScPcsf9eZU+B/YIkKAtYr5WeCii58BgATrNitlWg==" }, - "ethcall": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ethcall/-/ethcall-3.3.0.tgz", - "integrity": "sha512-cwYNxRmhej4K4oot+97LE285WhBXZf1Ju/ykYQY5nMV1URuHMIHKtObLwKWwrKu/x1TpUoaMy5NvRUF43KGbxA==", - "requires": { - "@ethersproject/abi": "^5.0.0", - "@ethersproject/contracts": "^5.0.0", - "@ethersproject/providers": "^5.0.0", - "@types/node": "^14.11.5", - "js-sha3": "^0.8.0" - } - }, "ethers": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.5.3.tgz", @@ -77882,7 +78976,8 @@ "ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} } } }, @@ -78206,13 +79301,15 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", - "dev": true + "dev": true, + "requires": {} }, "eslint-config-standard": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz", "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==", - "dev": true + "dev": true, + "requires": {} }, "eslint-plugin-cypress": { "version": "2.11.3", @@ -78327,13 +79424,15 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.1.0.tgz", "integrity": "sha512-NGmI6BH5L12pl7ScQHbg7tvtk4wPxxj8yPHH47NvSmMtFneC077PSeY3huFj06ZWZvtbfxSPt3RuOQD5XcR4ng==", - "dev": true + "dev": true, + "requires": {} }, "eslint-plugin-standard": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz", "integrity": "sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ==", - "dev": true + "dev": true, + "requires": {} }, "eslint-plugin-testing-library": { "version": "4.11.0", @@ -78707,12 +79806,11 @@ } }, "@synthetixio/transaction-notifier": { - "version": "2.68.2", - "resolved": "https://registry.npmjs.org/@synthetixio/transaction-notifier/-/transaction-notifier-2.68.2.tgz", - "integrity": "sha512-KszjAiWZ8xIcVERZvw8qIJ57YzxCRx4PLKxxGsu6rn0KQxizf9iT/r7Xm1umqgim2zq0BAHPemQL1Mw0e+Wvfw==", + "version": "2.71.2", + "resolved": "https://registry.npmjs.org/@synthetixio/transaction-notifier/-/transaction-notifier-2.71.2.tgz", + "integrity": "sha512-CxaH+asK0v6wv6HhpmeuY0Py79G4neVJ1l0vkWcS3Tpfn1snNoUzJqzmvh8DgG8C9yNtS19/3JTXkszJyHSkdw==", "requires": { - "ethers": "5.5.3", - "lodash": "4.17.19" + "ethers": "5.5.3" }, "dependencies": { "@ethersproject/abi": { @@ -79121,22 +80219,18 @@ "@ethersproject/wordlists": "5.5.0" } }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" - }, "ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} } } }, "@synthetixio/wei": { - "version": "2.68.2", - "resolved": "https://registry.npmjs.org/@synthetixio/wei/-/wei-2.68.2.tgz", - "integrity": "sha512-GQDrtr6ADfXOerMJ/2abegUF1dMfpzPxp9N9umMud0rF/E2bNtY9nQXSvZH3Uz1/vQWiOFtAP/eJ2mVF82kpFA==", + "version": "2.71.2", + "resolved": "https://registry.npmjs.org/@synthetixio/wei/-/wei-2.71.2.tgz", + "integrity": "sha512-JNew+YVFDhOCL/xMr+6QueMyHrgy9NBkErV53kV7Pp/fGhW56+jZLolYwUeE7O+LBNwTueXr7nH1+XsZt6l7JA==", "requires": { "big.js": "6.1.1", "ethers": "5.5.3" @@ -79551,7 +80645,8 @@ "ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} } } }, @@ -80583,7 +81678,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, "requires": { "@types/minimatch": "*", "@types/node": "*" @@ -80691,8 +81785,7 @@ "@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" }, "@types/node": { "version": "14.0.13", @@ -81395,7 +82488,8 @@ "@uniswap/redux-multicall": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@uniswap/redux-multicall/-/redux-multicall-1.1.1.tgz", - "integrity": "sha512-sXX2pAbxJj1OrErSc7zMEFo7j1EXqTBbllYuUDEWCZ/A12sK/4RXgXW2+zSoXOHCN6djyVUc3FmEt0v3x2jLSw==" + "integrity": "sha512-sXX2pAbxJj1OrErSc7zMEFo7j1EXqTBbllYuUDEWCZ/A12sK/4RXgXW2+zSoXOHCN6djyVUc3FmEt0v3x2jLSw==", + "requires": {} }, "@uniswap/router-sdk": { "version": "1.0.5", @@ -81980,7 +83074,8 @@ "ws": { "version": "7.5.3", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", - "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==" + "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", + "requires": {} } } }, @@ -82235,7 +83330,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "dev": true, "requires": { "@webassemblyjs/helper-module-context": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", @@ -82245,20 +83339,17 @@ "@webassemblyjs/helper-api-error": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" }, "@webassemblyjs/helper-buffer": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" }, "@webassemblyjs/helper-code-frame": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, "requires": { "@webassemblyjs/wast-printer": "1.9.0" } @@ -82266,14 +83357,12 @@ "@webassemblyjs/helper-fsm": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" }, "@webassemblyjs/helper-module-context": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0" } @@ -82281,14 +83370,12 @@ "@webassemblyjs/helper-wasm-bytecode": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", - "dev": true + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" }, "@webassemblyjs/helper-wasm-section": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -82300,7 +83387,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", - "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } @@ -82309,7 +83395,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "dev": true, "requires": { "@xtuc/long": "4.2.2" } @@ -82317,14 +83402,12 @@ "@webassemblyjs/utf8": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" }, "@webassemblyjs/wasm-edit": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -82340,7 +83423,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", @@ -82353,7 +83435,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -82365,7 +83446,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-api-error": "1.9.0", @@ -82379,7 +83459,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/floating-point-hex-parser": "1.9.0", @@ -82392,8 +83471,7 @@ "@webassemblyjs/floating-point-hex-parser": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" } } }, @@ -82401,7 +83479,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/wast-parser": "1.9.0", @@ -82411,14 +83488,12 @@ "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, "@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "@zeit/schemas": { "version": "2.6.0", @@ -82485,7 +83560,8 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "requires": {} }, "acorn-node": { "version": "1.8.2", @@ -82589,7 +83665,8 @@ "ajv-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "requires": {} }, "ajv-formats": { "version": "2.1.1", @@ -82700,7 +83777,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, + "devOptional": true, "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -82710,7 +83787,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, + "devOptional": true, "requires": { "remove-trailing-separator": "^1.0.1" } @@ -82844,8 +83921,7 @@ "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, "array-uniq": { "version": "1.0.3", @@ -82972,7 +84048,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true + "devOptional": true }, "async-eventemitter": { "version": "0.2.4", @@ -83997,7 +85073,8 @@ "version": "0.3.8", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", - "dev": true + "dev": true, + "requires": {} }, "babel-plugin-polyfill-corejs2": { "version": "0.3.1", @@ -85264,7 +86341,7 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true + "devOptional": true }, "bind-decorator": { "version": "1.0.11", @@ -85975,7 +87052,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, "requires": { "pako": "~1.0.5" } @@ -86099,8 +87175,7 @@ "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, "bunyan": { "version": "1.8.15", @@ -86234,7 +87309,6 @@ "version": "12.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, "requires": { "bluebird": "^3.5.5", "chownr": "^1.1.1", @@ -86256,20 +87330,17 @@ "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "requires": { "yallist": "^3.0.2" } @@ -86277,14 +87348,12 @@ "y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } }, @@ -86809,7 +87878,7 @@ "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, + "devOptional": true, "requires": { "anymatch": "^2.0.0", "async-each": "^1.0.1", @@ -86834,8 +87903,7 @@ "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" }, "ci-info": { "version": "3.3.0", @@ -87395,8 +88463,7 @@ "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, "component-emitter": { "version": "1.3.0", @@ -87465,7 +88532,6 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -87498,8 +88564,7 @@ "console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" }, "console-control-strings": { "version": "1.1.0", @@ -87527,8 +88592,7 @@ "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" }, "contains-path": { "version": "0.1.0", @@ -87593,7 +88657,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, "requires": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", @@ -87606,8 +88669,7 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" } } }, @@ -88191,8 +89253,7 @@ "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, "cypress": { "version": "8.7.0", @@ -88475,7 +89536,8 @@ "date-fns-tz": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-1.1.4.tgz", - "integrity": "sha512-lQ+FF7xUxxRuRqIY7H/lagnT3PhhSnnvtGHzjE5WZKwRyLU7glJfLys05SZ7zHlEr6RXWiqkmgWq4nCkcElR+g==" + "integrity": "sha512-lQ+FF7xUxxRuRqIY7H/lagnT3PhhSnnvtGHzjE5WZKwRyLU7glJfLys05SZ7zHlEr6RXWiqkmgWq4nCkcElR+g==", + "requires": {} }, "dayjs": { "version": "1.10.6", @@ -88923,7 +89985,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, "requires": { "path-type": "^4.0.0" } @@ -88978,8 +90039,7 @@ "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" }, "domelementtype": { "version": "2.2.0", @@ -89330,7 +90390,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "memory-fs": "^0.5.0", @@ -89341,7 +90400,6 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, "requires": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -89876,7 +90934,8 @@ "version": "0.7.2", "resolved": "https://registry.npmjs.org/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.7.2.tgz", "integrity": "sha512-LOIfGx5sZZ5FwM1shr2GlYAWV9Omdi+1/3byuVagvQNoGUuU0iHhp7AfjA1uR+4dJ4Isfb4+FwBJgQajIw9iAg==", - "dev": true + "dev": true, + "requires": {} }, "eslint-plugin-cypress": { "version": "2.12.1", @@ -90104,7 +91163,8 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==", - "dev": true + "dev": true, + "requires": {} }, "eslint-plugin-testing-library": { "version": "5.2.0", @@ -90393,7 +91453,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "requires": { "estraverse": "^5.2.0" }, @@ -90401,16 +91460,14 @@ "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" } } }, "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, "estree-to-babel": { "version": "3.2.1", @@ -90706,7 +91763,8 @@ "ws": { "version": "7.4.3", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.3.tgz", - "integrity": "sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA==" + "integrity": "sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA==", + "requires": {} } } }, @@ -91588,7 +92646,8 @@ "ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} } } }, @@ -92235,6 +93294,11 @@ "dev": true, "optional": true }, + "fancy-canvas": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fancy-canvas/-/fancy-canvas-0.2.2.tgz", + "integrity": "sha512-50qi8xA0QkHbjmb8h7XQ6k2fvD7y/yMfiUw9YTarJ7rWrq6o5/3CCXPouYk+XSLASvvxtjyiQLRBFt3qkE3oyA==" + }, "fast-check": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-2.24.0.tgz", @@ -92265,7 +93329,6 @@ "version": "3.2.11", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -92278,7 +93341,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -92287,7 +93349,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -92296,7 +93357,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -92304,14 +93364,12 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "requires": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -92321,7 +93379,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -92372,7 +93429,6 @@ "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, "requires": { "reusify": "^1.0.4" } @@ -92430,8 +93486,7 @@ "figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" }, "figures": { "version": "3.2.0", @@ -92476,7 +93531,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "json-schema-traverse": { "version": "0.4.1", @@ -92782,7 +93838,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, "requires": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" @@ -92980,7 +94035,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", @@ -92997,7 +94051,6 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, "optional": true, "requires": { "bindings": "^1.5.0", @@ -93058,8 +94111,7 @@ "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-assigned-identifiers": { "version": "1.2.0", @@ -93480,7 +94532,8 @@ "ethers-eip712": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/ethers-eip712/-/ethers-eip712-0.2.0.tgz", - "integrity": "sha512-fgS196gCIXeiLwhsWycJJuxI9nL/AoUPGSQ+yvd+8wdWR+43G+J1n69LmWVWvAON0M6qNaf2BF4/M159U8fujQ==" + "integrity": "sha512-fgS196gCIXeiLwhsWycJJuxI9nL/AoUPGSQ+yvd+8wdWR+43G+J1n69LmWVWvAON0M6qNaf2BF4/M159U8fujQ==", + "requires": {} }, "secp256k1": { "version": "4.0.2", @@ -94059,6 +95112,12 @@ "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", "dev": true }, + "html-to-image": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.9.0.tgz", + "integrity": "sha512-9gaDCIYg62Ek07F2pBk76AHgYZ2gxq2YALU7rK3gNCqXuhu6cWzsOQqM7qGbjZiOzxGzrU1deDqZpAod2NEwbA==", + "dev": true + }, "html-void-elements": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", @@ -94118,8 +95177,7 @@ "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, "https-proxy-agent": { "version": "5.0.0", @@ -94235,8 +95293,7 @@ "iferr": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, "ignore": { "version": "4.0.6", @@ -94263,7 +95320,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-7.0.1.tgz", "integrity": "sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w==", - "dev": true, "requires": { "file-type": "^12.0.0", "globby": "^10.0.0", @@ -94277,14 +95333,12 @@ "file-type": { "version": "12.4.2", "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", - "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==", - "dev": true + "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==" }, "globby": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, "requires": { "@types/glob": "^7.1.1", "array-union": "^2.1.0", @@ -94299,8 +95353,7 @@ "ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" } } }, @@ -94487,8 +95540,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "indent-string": { "version": "3.2.0", @@ -94498,8 +95550,7 @@ "infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "inflight": { "version": "1.0.6", @@ -94820,7 +95871,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, + "devOptional": true, "requires": { "binary-extensions": "^1.0.0" } @@ -96300,7 +97351,8 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true + "dev": true, + "requires": {} }, "jest-regex-util": { "version": "27.5.1", @@ -96918,7 +97970,8 @@ "jotai": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/jotai/-/jotai-1.6.2.tgz", - "integrity": "sha512-WglyuXX67f8QPCOX5tDR0N9GhasOV1+IQ3piaF4owr2wBn2CV51T8zbw01ZCme/24JKJilFe6+aA29PJx+jsQw==" + "integrity": "sha512-WglyuXX67f8QPCOX5tDR0N9GhasOV1+IQ3piaF4owr2wBn2CV51T8zbw01ZCme/24JKJilFe6+aA29PJx+jsQw==", + "requires": {} }, "jpeg-js": { "version": "0.4.2", @@ -97050,7 +98103,8 @@ "version": "7.5.7", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "dev": true + "dev": true, + "requires": {} } } }, @@ -97159,8 +98213,7 @@ "json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" }, "jsonfile": { "version": "6.1.0", @@ -97309,8 +98362,7 @@ "junk": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", - "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", - "dev": true + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==" }, "keccak": { "version": "3.0.2", @@ -97602,6 +98654,14 @@ "type-check": "~0.4.0" } }, + "lightweight-charts": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/lightweight-charts/-/lightweight-charts-3.8.0.tgz", + "integrity": "sha512-7yFGnYuE1RjRJG9RwUTBz5wvF1QtjBOSW4FFlikr8Dh+/TDNt4ci+HsWSYmStgQUpawpvkCJ3j5/W25GppGj9Q==", + "requires": { + "fancy-canvas": "0.2.2" + } + }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -98167,8 +99227,7 @@ "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" }, "loader-utils": { "version": "2.0.2", @@ -98805,7 +99864,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, "requires": { "semver": "^6.0.0" } @@ -99047,7 +100105,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, "requires": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -99440,7 +100497,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, "requires": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", @@ -99458,7 +100514,6 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, "requires": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -99470,7 +100525,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, "requires": { "duplexify": "^3.6.0", "inherits": "^2.0.3", @@ -99481,7 +100535,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -99630,7 +100683,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, "requires": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", @@ -99643,8 +100695,7 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" } } }, @@ -99893,8 +100944,7 @@ "neo-async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" }, "nested-error-stacks": { "version": "2.1.1", @@ -99971,7 +101021,8 @@ "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} }, "array-union": { "version": "1.0.2", @@ -100242,7 +101293,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, "requires": { "assert": "^1.1.1", "browserify-zlib": "^0.2.0", @@ -100273,7 +101323,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, "requires": { "object-assign": "^4.1.1", "util": "0.10.3" @@ -100282,14 +101331,12 @@ "inherits": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, "requires": { "inherits": "2.0.1" } @@ -100300,7 +101347,6 @@ "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", @@ -100310,14 +101356,12 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "timers-browserify": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, "requires": { "setimmediate": "^1.0.4" } @@ -100325,14 +101369,12 @@ "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" }, "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, "requires": { "inherits": "2.0.3" } @@ -100920,8 +101962,7 @@ "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" }, "os-filter-obj": { "version": "2.0.0", @@ -101046,8 +102087,7 @@ "p-pipe": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", - "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", - "dev": true + "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==" }, "p-reduce": { "version": "1.0.0", @@ -101088,7 +102128,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, "requires": { "cyclist": "^1.0.1", "inherits": "^2.0.3", @@ -101223,8 +102262,7 @@ "path-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" }, "path-case": { "version": "2.1.1", @@ -101583,7 +102621,8 @@ "popper-max-size-modifier": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/popper-max-size-modifier/-/popper-max-size-modifier-0.2.0.tgz", - "integrity": "sha512-UerPt9pZfTFnpSpIBVJrR3ibHMuU1k5K01AyNLfMUWCr4z1MFH+dsayPlAF9ZeYExa02HPiQn5OIMqUSVtJEbg==" + "integrity": "sha512-UerPt9pZfTFnpSpIBVJrR3ibHMuU1k5K01AyNLfMUWCr4z1MFH+dsayPlAF9ZeYExa02HPiQn5OIMqUSVtJEbg==", + "requires": {} }, "popper.js": { "version": "1.16.1-lts", @@ -102027,8 +103066,7 @@ "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "promise-to-callback": { "version": "1.0.0", @@ -102207,8 +103245,7 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "puppeteer-core": { "version": "10.4.0", @@ -102327,7 +103364,8 @@ "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true + "dev": true, + "requires": {} } } }, @@ -102523,14 +103561,12 @@ "querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, "quick-lru": { "version": "1.1.0", @@ -102620,7 +103656,8 @@ "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} }, "big.js": { "version": "5.2.2", @@ -102923,7 +103960,8 @@ "react-table": { "version": "7.7.0", "resolved": "https://registry.npmjs.org/react-table/-/react-table-7.7.0.tgz", - "integrity": "sha512-jBlj70iBwOTvvImsU9t01LjFjy4sXEtclBovl3mTiqjz23Reu0DKnRza4zlLtOPACx6j2/7MrQIthIK1Wi+LIA==" + "integrity": "sha512-jBlj70iBwOTvvImsU9t01LjFjy4sXEtclBovl3mTiqjz23Reu0DKnRza4zlLtOPACx6j2/7MrQIthIK1Wi+LIA==", + "requires": {} }, "react-test-renderer": { "version": "17.0.1", @@ -102956,7 +103994,8 @@ "react-virtualized-auto-sizer": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.6.tgz", - "integrity": "sha512-7tQ0BmZqfVF6YYEWcIGuoR3OdYe8I/ZFbNclFlGOC3pMqunkYF/oL30NCjSGl9sMEb17AnzixDz98Kqc3N76HQ==" + "integrity": "sha512-7tQ0BmZqfVF6YYEWcIGuoR3OdYe8I/ZFbNclFlGOC3pMqunkYF/oL30NCjSGl9sMEb17AnzixDz98Kqc3N76HQ==", + "requires": {} }, "react-window": { "version": "1.8.6", @@ -103048,7 +104087,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, + "devOptional": true, "requires": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", @@ -103159,9 +104198,9 @@ } }, "recoil": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/recoil/-/recoil-0.3.1.tgz", - "integrity": "sha512-KNA3DRqgxX4rRC8E7fc6uIw7BACmMPuraIYy+ejhE8tsw7w32CetMm8w7AMZa34wzanKKkev3vl3H7Z4s0QSiA==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/recoil/-/recoil-0.6.1.tgz", + "integrity": "sha512-J7oT3LZl2vpyFClgSUpOQjpykz84VSX/NJE/PavAtR8n7Z+whEdVBPUtwc2TEWjONeL/lJmiac2XQ+qEOQA52Q==", "requires": { "hamt_plus": "1.0.2" } @@ -103204,7 +104243,8 @@ "redux-thunk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz", - "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==" + "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==", + "requires": {} }, "refractor": { "version": "3.6.0", @@ -103526,7 +104566,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true + "devOptional": true }, "renderkid": { "version": "2.0.7", @@ -103783,8 +104823,7 @@ "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, "rfdc": { "version": "1.3.0", @@ -103860,7 +104899,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "requires": { "queue-microtask": "^1.2.2" } @@ -103869,7 +104907,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, "requires": { "aproba": "^1.1.1" }, @@ -103877,8 +104914,7 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" } } }, @@ -104091,7 +105127,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "json-schema-traverse": { "version": "0.4.1", @@ -104607,8 +105644,7 @@ "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, "slice-ansi": { "version": "0.0.4", @@ -104619,7 +105655,8 @@ "slick-carousel": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz", - "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==" + "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==", + "requires": {} }, "snake-case": { "version": "2.1.0", @@ -105013,8 +106050,7 @@ "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" }, "source-map": { "version": "0.5.7", @@ -105040,7 +106076,6 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -105049,8 +106084,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -105253,7 +106287,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, "requires": { "figgy-pudding": "^3.5.1" } @@ -105439,7 +106472,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, "requires": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" @@ -105468,7 +106500,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" @@ -105478,7 +106509,6 @@ "version": "2.8.3", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", @@ -105762,12 +106792,14 @@ "styled-jsx": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.2.tgz", - "integrity": "sha512-LqPQrbBh3egD57NBcHET4qcgshPks+yblyhPlH2GY8oaDgKs8SK4C3dBh3oSJjgzJ3G5t1SYEZGHkP+QEpX9EQ==" + "integrity": "sha512-LqPQrbBh3egD57NBcHET4qcgshPks+yblyhPlH2GY8oaDgKs8SK4C3dBh3oSJjgzJ3G5t1SYEZGHkP+QEpX9EQ==", + "requires": {} }, "styled-media-query": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/styled-media-query/-/styled-media-query-2.1.2.tgz", - "integrity": "sha512-ds24iBxOrfIhdHP+e23y6kj1gbosgWu+tgAuxvMrYmnp6Sju/LjuY8lfkiVnn6P7mcdhtwpC2Z43o+apT9UdJg==" + "integrity": "sha512-ds24iBxOrfIhdHP+e23y6kj1gbosgWu+tgAuxvMrYmnp6Sju/LjuY8lfkiVnn6P7mcdhtwpC2Z43o+apT9UdJg==", + "requires": {} }, "styled-system": { "version": "5.1.5", @@ -106568,8 +107600,7 @@ "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, "tape": { "version": "4.15.0", @@ -106854,7 +107885,6 @@ "version": "4.8.0", "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, "requires": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -106864,14 +107894,12 @@ "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -106879,7 +107907,6 @@ "version": "1.4.5", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, "requires": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", @@ -106896,7 +107923,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -106908,13 +107934,12 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "requires": {} }, "find-cache-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, "requires": { "commondir": "^1.0.1", "make-dir": "^2.0.0", @@ -106925,7 +107950,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, "requires": { "locate-path": "^3.0.0" } @@ -106933,20 +107957,17 @@ "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -106956,7 +107977,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, "requires": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -106966,7 +107986,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, "requires": { "p-limit": "^2.0.0" } @@ -106974,14 +107993,12 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, "requires": { "find-up": "^3.0.0" } @@ -106990,7 +108007,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, "requires": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -107000,14 +108016,12 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "serialize-javascript": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, "requires": { "randombytes": "^2.1.0" } @@ -107015,8 +108029,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -107187,8 +108200,7 @@ "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" }, "to-buffer": { "version": "1.1.1", @@ -107499,8 +108511,7 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typedarray-to-buffer": { "version": "3.1.5", @@ -107671,7 +108682,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, "requires": { "unique-slug": "^2.0.0" } @@ -107680,7 +108690,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, "requires": { "imurmurhash": "^0.1.4" } @@ -107834,7 +108843,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true + "devOptional": true }, "update-check": { "version": "1.5.2", @@ -107954,7 +108963,8 @@ "use-sync-external-store": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.0.0.tgz", - "integrity": "sha512-AFVsxg5GkFg8GDcxnl+Z0lMAz9rE8DGJCc28qnBuQF7lac57B5smLcT37aXpXIIPz75rW4g3eXHPjhHwdGskOw==" + "integrity": "sha512-AFVsxg5GkFg8GDcxnl+Z0lMAz9rE8DGJCc28qnBuQF7lac57B5smLcT37aXpXIIPz75rW4g3eXHPjhHwdGskOw==", + "requires": {} }, "utf-8-validate": { "version": "5.0.9", @@ -108143,8 +109153,7 @@ "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "void-elements": { "version": "2.0.1", @@ -108294,7 +109303,6 @@ "version": "1.7.5", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dev": true, "requires": { "chokidar": "^3.4.1", "graceful-fs": "^4.1.2", @@ -108306,7 +109314,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, "optional": true, "requires": { "normalize-path": "^3.0.0", @@ -108317,14 +109324,12 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, "optional": true }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "optional": true, "requires": { "fill-range": "^7.0.1" @@ -108334,7 +109339,6 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "optional": true, "requires": { "anymatch": "~3.1.2", @@ -108351,7 +109355,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "optional": true, "requires": { "to-regex-range": "^5.0.1" @@ -108361,14 +109364,12 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "optional": true }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "optional": true, "requires": { "is-glob": "^4.0.1" @@ -108378,7 +109379,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "optional": true, "requires": { "binary-extensions": "^2.0.0" @@ -108388,14 +109388,12 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "optional": true }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "optional": true, "requires": { "picomatch": "^2.2.1" @@ -108405,7 +109403,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "optional": true, "requires": { "is-number": "^7.0.0" @@ -108417,7 +109414,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, "optional": true, "requires": { "chokidar": "^2.1.8" @@ -110453,7 +111449,6 @@ "version": "4.46.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-module-context": "1.9.0", @@ -110483,14 +111478,12 @@ "acorn": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -110502,19 +111495,17 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "requires": {} }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" }, "eslint-scope": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -110523,14 +111514,12 @@ "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, "requires": { "minimist": "^1.2.0" } @@ -110539,7 +111528,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -110549,14 +111537,12 @@ "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, "requires": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -110615,7 +111601,6 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" @@ -110624,8 +111609,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -110893,7 +111877,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, "requires": { "errno": "~0.1.7" } @@ -111010,7 +111993,8 @@ "ws": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", - "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==" + "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", + "requires": {} }, "xhr": { "version": "2.6.0", diff --git a/package.json b/package.json index d27c19a257..b665d54099 100644 --- a/package.json +++ b/package.json @@ -31,13 +31,13 @@ "@reach/accordion": "0.15.1", "@reach/dialog": "0.15.0", "@reach/tabs": "0.15.0", - "@synthetixio/assets": "2.0.12", - "@synthetixio/contracts-interface": "2.68.2", - "@synthetixio/optimism-networks": "2.68.2", - "@synthetixio/providers": "2.68.2", - "@synthetixio/queries": "2.68.2", - "@synthetixio/transaction-notifier": "2.68.2", - "@synthetixio/wei": "2.68.2", + "@synthetixio/assets": "2.0.13", + "@synthetixio/contracts-interface": "2.71.2", + "@synthetixio/optimism-networks": "2.71.2", + "@synthetixio/providers": "2.71.2", + "@synthetixio/queries": "2.71.2", + "@synthetixio/transaction-notifier": "2.71.2", + "@synthetixio/wei": "2.71.2", "@tippyjs/react": "4.1.0", "@uniswap/widgets": "^1.0.0", "axios": "0.21.1", @@ -55,12 +55,13 @@ "imagemin-mozjpeg": "^10.0.0", "immer": "9.0.6", "intercept-stdout": "^0.1.2", + "lightweight-charts": "^3.8.0", "lodash": "4.17.20", "moment-business-time": "1.1.1", "next": "12.1.6", "next-compose-plugins": "2.2.0", - "next-optimized-images": "^2.6.2", "next-connect": "^0.12.2", + "next-optimized-images": "^2.6.2", "react": "17.0.1", "react-countdown": "2.3.1", "react-dom": "17.0.1", @@ -75,7 +76,7 @@ "react-table": "7.7.0", "react-toastify": "7.0.3", "recharts": "2.0.9", - "recoil": "0.3.1", + "recoil": "0.6.1", "slick-carousel": "1.8.1", "styled-components": "5.1.1", "styled-media-query": "2.1.2", @@ -126,6 +127,7 @@ "eslint-plugin-react-hooks": "4.2.0", "eslint-plugin-testing-library": "^5.1.0", "eslint-plugin-ui-testing": "^2.0.0", + "html-to-image": "^1.9.0", "husky": "5.0.9", "imagemin-optipng": "8.0.0", "imagemin-svgo": "8.0.0", diff --git a/pages/404.tsx b/pages/404.tsx index c9b0fd60ee..7ff5546db4 100644 --- a/pages/404.tsx +++ b/pages/404.tsx @@ -46,7 +46,7 @@ const Container = styled(FlexDivRowCentered)` `; const Content = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.mono}; padding: 0 48px; text-align: center; @@ -56,7 +56,6 @@ const Content = styled.div` const Title = styled.h1` font-size: 120px; margin: 0; - font-weight: normal; line-height: normal; ${media.lessThan('sm')` font-size: 80px; @@ -67,7 +66,6 @@ const Subtitle = styled.h2` margin: 0; font-size: 20px; line-height: normal; - font-weight: normal; ${media.lessThan('sm')` font-size: 14px; `} diff --git a/pages/_app.tsx b/pages/_app.tsx index c340a60e83..b509c5c656 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,19 +1,18 @@ -import { FC } from 'react'; +import { FC, ReactElement, ReactNode, useMemo } from 'react'; import { AppProps } from 'next/app'; import Head from 'next/head'; -import { RecoilRoot } from 'recoil'; +import { RecoilRoot, useRecoilValue } from 'recoil'; import { useTranslation } from 'react-i18next'; import { QueryClientProvider, QueryClient } from 'react-query'; +import { NextPage } from 'next'; +import { createQueryContext, SynthetixQueryContextProvider } from '@synthetixio/queries'; +import { ReactQueryDevtools } from 'react-query/devtools'; +import { ThemeProvider } from 'styled-components'; import { MediaContextProvider } from 'styles/media'; - +import { themes } from 'styles/theme'; import WithAppContainers from 'containers'; - -import { ReactQueryDevtools } from 'react-query/devtools'; - -import { CustomThemeProvider } from 'contexts/CustomThemeContext'; import SystemStatus from 'sections/shared/SystemStatus'; - import { isSupportedNetworkId } from 'utils/network'; import AppLayout from 'sections/shared/Layout/AppLayout'; @@ -28,13 +27,31 @@ import 'tippy.js/dist/tippy.css'; import '../i18n'; import Layout from 'sections/shared/Layout'; -import { createQueryContext, SynthetixQueryContextProvider } from '@synthetixio/queries'; + import Connector from 'containers/Connector'; +import { currentThemeState } from 'store/ui'; -const InnerApp: FC = ({ Component, pageProps }) => { +type NextPageWithLayout = NextPage & { + layout?: (page: ReactElement) => ReactNode; +}; + +type AppPropsWithLayout = AppProps & { + Component: NextPageWithLayout; +}; + +const InnerApp: FC = ({ Component, pageProps }: AppPropsWithLayout) => { const { provider, signer, network } = Connector.useContainer(); - return ( - <> + const getLayout = + Component.layout === undefined + ? (page: ReactElement) => <>{page}> + : (page: ReactElement) => {page}; + + const currentTheme = useRecoilValue(currentThemeState); + const theme = useMemo(() => themes[currentTheme], [currentTheme]); + const isReady = useMemo(() => typeof window !== 'undefined', []); + + return isReady ? ( + = ({ Component, pageProps }) => { } > - - - - - + {getLayout()} - > - ); + + ) : null; }; const App: FC = (props) => { @@ -86,15 +99,13 @@ const App: FC = (props) => { - - - - - - - - - + + + + + + + > ); }; diff --git a/pages/dashboard/[[...tab]].tsx b/pages/dashboard/[[...tab]].tsx index dae539c932..6665abb2ac 100644 --- a/pages/dashboard/[[...tab]].tsx +++ b/pages/dashboard/[[...tab]].tsx @@ -5,8 +5,15 @@ import styled from 'styled-components'; import { PageContent, FullHeightContainer } from 'styles/common'; import DashboardContainer from 'sections/dashboard/DashboardContainer'; +import AppLayout from 'sections/shared/Layout/AppLayout'; -const Futures: FC = () => { +type AppLayoutProps = { + children: React.ReactNode; +}; + +type DashboardComponent = FC & { layout: FC }; + +const Dashboard: DashboardComponent = () => { const { t } = useTranslation(); return ( @@ -23,8 +30,10 @@ const Futures: FC = () => { ); }; +Dashboard.layout = AppLayout; + const StyledFullHeightContainer = styled(FullHeightContainer)` padding-top: 14px; `; -export default Futures; +export default Dashboard; diff --git a/pages/earn.tsx b/pages/earn.tsx index 8b07014674..29285ac348 100644 --- a/pages/earn.tsx +++ b/pages/earn.tsx @@ -42,7 +42,7 @@ const PageHeading = styled(Text.Heading)` `; const StyledBody = styled(Text.Body)` - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; margin-bottom: 40px; `; diff --git a/pages/exchange/[[...market]].tsx b/pages/exchange/[[...market]].tsx index e5ac3109c0..c8f59bb559 100644 --- a/pages/exchange/[[...market]].tsx +++ b/pages/exchange/[[...market]].tsx @@ -9,8 +9,15 @@ import { formatCurrency } from 'utils/formatters/number'; import { CurrencyKey } from 'constants/currency'; import BasicSwap from 'sections/exchange/BasicSwap'; import { useTranslation } from 'react-i18next'; +import AppLayout from 'sections/shared/Layout/AppLayout'; -const Exchange: FC = () => { +type AppLayoutProps = { + children: React.ReactNode; +}; + +type ExchangeComponent = FC & { layout: FC }; + +const Exchange: ExchangeComponent = () => { const { t } = useTranslation(); const { baseCurrencyKey, quoteCurrencyKey, inverseRate } = useExchange({ showPriceCard: true, @@ -47,6 +54,8 @@ const Exchange: FC = () => { ); }; +Exchange.layout = AppLayout; + const StyledFullHeightContainer = styled(FullHeightContainer)` padding-top: 14px; `; diff --git a/pages/index.tsx b/pages/index.tsx index ba0ed568fd..327de2102c 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,25 +1,53 @@ import { FC } from 'react'; import Head from 'next/head'; +import dynamic from 'next/dynamic'; import { useTranslation } from 'react-i18next'; +import styled from 'styled-components'; -import { PageContent, FullHeightContainer } from 'styles/common'; -import DashboardContainer from 'sections/dashboard/DashboardContainer'; +import Hero from 'sections/homepage/Hero'; +import HomeLayout from 'sections/shared/Layout/HomeLayout'; +import Features from 'sections/homepage/Features'; +import ShortList from 'sections/homepage/ShortList'; +import Earning from 'sections/homepage/Earning'; +import Learn from 'sections/homepage/Learn'; +import TradeNow from 'sections/homepage/TradeNow'; -const Futures: FC = () => { +type AppLayoutProps = { + children: React.ReactNode; +}; + +type HomePageComponent = FC & { layout?: FC }; + +const HomePage: HomePageComponent = () => { const { t } = useTranslation(); + const Assets = dynamic(() => import('../sections/homepage/Assets'), { + ssr: false, + }); return ( <> - {t('futures.page-title')} + {t('homepage.page-title')} - - - - - + + + + + + + + + + + > ); }; -export default Futures; +export const Container = styled.div` + width: 100%; + margin: 0 auto; + padding: 100px 20px 0 20px; +`; + +export default HomePage; diff --git a/pages/leaderboard/[[...tab]].tsx b/pages/leaderboard/[[...tab]].tsx index 66f2fc4be0..53eab58b12 100644 --- a/pages/leaderboard/[[...tab]].tsx +++ b/pages/leaderboard/[[...tab]].tsx @@ -3,8 +3,15 @@ import Head from 'next/head'; import { useTranslation } from 'react-i18next'; import { PageContent, MainContent, FullHeightContainer } from 'styles/common'; import Leaderboard from 'sections/leaderboard/Leaderboard'; +import AppLayout from 'sections/shared/Layout/AppLayout'; -const Futures: FC = () => { +type AppLayoutProps = { + children: React.ReactNode; +}; + +type LeaderComponent = FC & { layout: FC }; + +const Leader: LeaderComponent = () => { const { t } = useTranslation(); return ( @@ -23,4 +30,6 @@ const Futures: FC = () => { ); }; -export default Futures; +Leader.layout = AppLayout; + +export default Leader; diff --git a/pages/market/[[...market]].tsx b/pages/market/[[...market]].tsx index 1d97d98ab6..38eb7b32ad 100644 --- a/pages/market/[[...market]].tsx +++ b/pages/market/[[...market]].tsx @@ -1,4 +1,4 @@ -import { useState, useCallback } from 'react'; +import { useState, useCallback, FC } from 'react'; import styled from 'styled-components'; import Head from 'next/head'; import { useRouter } from 'next/router'; @@ -23,8 +23,15 @@ import useGetFuturesOpenOrders from 'queries/futures/useGetFuturesOpenOrders'; import { getMarketKey } from 'utils/futures'; import useGetFuturesPositionForMarket from 'queries/futures/useGetFuturesPositionForMarket'; import Connector from 'containers/Connector'; +import AppLayout from 'sections/shared/Layout/AppLayout'; -const Market = () => { +type AppLayoutProps = { + children: React.ReactNode; +}; + +type MarketComponent = FC & { layout: FC }; + +const Market: MarketComponent = () => { const { t } = useTranslation(); const router = useRouter(); @@ -53,11 +60,9 @@ const Market = () => { - - - - - + + + { { ); }; +Market.layout = AppLayout; + export default Market; const StyledPageContent = styled(PageContent)``; -const StyledFullHeightContainer = styled(FullHeightContainer)` - display: grid; - grid-template-columns: 20% 60% 20%; - column-gap: 15px; - width: calc(100% - 30px); -`; - const StyledMainContent = styled(MainContent)` - max-width: unset; margin: unset; + max-width: unset; `; const StyledRightSideContent = styled(RightSideContent)` @@ -106,3 +107,23 @@ const StyledRightSideContent = styled(RightSideContent)` const StyledLeftSideContent = styled(LeftSideContent)` width: 100%; `; + +const StyledFullHeightContainer = styled(FullHeightContainer)` + display: grid; + grid-template-columns: 20% 60% 20%; + column-gap: 15px; + width: calc(100% - 30px); + @media (min-width: 1725px) { + display: grid; + grid-template-columns: 400px 1fr 400px; + column-gap: 15px; + width: 100%; + } + @media (max-width: 1200px) { + ${StyledLeftSideContent} { + display: none; + } + grid-template-columns: 70% 30%; + width: calc(100% - 15px); + } +`; diff --git a/public/fonts/GT-America-Compressed-Black.woff b/public/fonts/GT-America-Compressed-Black.woff new file mode 100644 index 0000000000..f473c8f765 Binary files /dev/null and b/public/fonts/GT-America-Compressed-Black.woff differ diff --git a/public/fonts/GT-America-Compressed-Black.woff2 b/public/fonts/GT-America-Compressed-Black.woff2 new file mode 100644 index 0000000000..2915425a10 Binary files /dev/null and b/public/fonts/GT-America-Compressed-Black.woff2 differ diff --git a/public/fonts/GT-America-Compressed-Medium.woff b/public/fonts/GT-America-Compressed-Medium.woff new file mode 100644 index 0000000000..8fa9a6b18f Binary files /dev/null and b/public/fonts/GT-America-Compressed-Medium.woff differ diff --git a/public/fonts/GT-America-Compressed-Medium.woff2 b/public/fonts/GT-America-Compressed-Medium.woff2 new file mode 100644 index 0000000000..c7b084e5c3 Binary files /dev/null and b/public/fonts/GT-America-Compressed-Medium.woff2 differ diff --git a/public/static/charting_library/theme.css b/public/static/charting_library/theme.css index 4a8aee8db1..f025c2e233 100644 --- a/public/static/charting_library/theme.css +++ b/public/static/charting_library/theme.css @@ -16,7 +16,7 @@ .theme-dark:root { --tv-color-platform-background: #131212; - --tv-color-pane-background: #131212; + --tv-color-pane-background: transparent; --tv-color-pane-background-secondary: #08080F; --tv-color-toolbar-button-background-hover: #3A3A3A; --tv-color-toolbar-button-background-secondary-hover: #3A3A3A; diff --git a/queries/futures/constants.ts b/queries/futures/constants.ts index 113704dd18..88f880ed26 100644 --- a/queries/futures/constants.ts +++ b/queries/futures/constants.ts @@ -21,9 +21,12 @@ export const FUTURES_POSITION_FRAGMENT = gql` account market asset + initialMargin margin size feesPaid + totalDeposits + netTransfers netFunding isOpen isLiquidated diff --git a/queries/futures/types.ts b/queries/futures/types.ts index 2f7f9f51a1..53359873f7 100644 --- a/queries/futures/types.ts +++ b/queries/futures/types.ts @@ -1,5 +1,6 @@ import Wei from '@synthetixio/wei'; import { FuturesClosureReason } from 'hooks/useFuturesMarketClosed'; +import { PotentialTradeStatus } from 'sections/futures/types'; export type PositionDetail = { remainingMargin: Wei; @@ -96,6 +97,9 @@ export type RawPosition = { size: Wei; feesPaid: Wei; netFunding: Wei; + netTransfers: Wei; + totalDeposits: Wei; + initialMargin: Wei; margin: Wei; entryPrice: Wei; avgEntryPrice: Wei; @@ -132,6 +136,9 @@ export type PositionHistory = { size: Wei; feesPaid: Wei; netFunding: Wei; + netTransfers: Wei; + totalDeposits: Wei; + initialMargin: Wei; margin: Wei; entryPrice: Wei; avgEntryPrice: Wei; @@ -201,6 +208,7 @@ export type FuturesStat = { liquidations: number; totalTrades: number; totalVolume: number; + pnl?: number; }; export type FuturesCumulativeStats = { @@ -221,4 +229,11 @@ export type FuturesPotentialTradeDetails = { margin: Wei; price: Wei; fee: Wei; + leverage: Wei; + notionalValue: Wei; + minInitialMargin: Wei; + side: PositionSide; + status: PotentialTradeStatus; + showStatus: boolean; + statusMessage: string; }; diff --git a/queries/futures/useGetFuturesDailyTradeStats.ts b/queries/futures/useGetFuturesDailyTradeStats.ts index 3ac5c4d6e8..a4379b1093 100644 --- a/queries/futures/useGetFuturesDailyTradeStats.ts +++ b/queries/futures/useGetFuturesDailyTradeStats.ts @@ -9,6 +9,7 @@ import QUERY_KEYS from 'constants/queryKeys'; import { calculateTimestampForPeriod } from 'utils/formatters/date'; import { getFuturesEndpoint, calculateDailyTradeStats } from './utils'; import { FuturesDailyTradeStats, FuturesOneMinuteStat } from './types'; +import { DAY_PERIOD } from './constants'; const PAGE_SIZE = 500; @@ -23,7 +24,7 @@ const useGetFuturesDailyTradeStats = (options?: UseQueryOptions => { try { - const minTimestamp = calculateTimestampForPeriod(24); + const minTimestamp = Math.floor(calculateTimestampForPeriod(DAY_PERIOD) / 1000); const response = await request( futuresEndpoint, gql` diff --git a/queries/futures/useGetFuturesPotentialTradeDetails.ts b/queries/futures/useGetFuturesPotentialTradeDetails.ts index c9efac351b..36261e73ed 100644 --- a/queries/futures/useGetFuturesPotentialTradeDetails.ts +++ b/queries/futures/useGetFuturesPotentialTradeDetails.ts @@ -1,6 +1,5 @@ import { useQuery, UseQueryOptions } from 'react-query'; import { useRecoilValue } from 'recoil'; - import { appReadyState } from 'store/app'; import { isL2State, networkState, walletAddressState } from 'store/wallet'; import Connector from 'containers/Connector'; @@ -8,10 +7,17 @@ import Connector from 'containers/Connector'; import QUERY_KEYS from 'constants/queryKeys'; import { getFuturesMarketContract } from './utils'; import { FuturesPotentialTradeDetails } from './types'; -import { PotentialTrade } from 'sections/futures/types'; +import { + PotentialTrade, + PotentialTradeStatus, + POTENTIAL_TRADE_STATUS_TO_MESSAGE, +} from 'sections/futures/types'; import { CurrencyKey } from '@synthetixio/contracts-interface'; import { wei } from '@synthetixio/wei'; +const SUCCESS = 'Success'; +const UNKNOWN = 'Unknown'; + const useGetFuturesPotentialTradeDetails = ( marketAsset: CurrencyKey | null, trade: PotentialTrade | null, @@ -23,17 +29,36 @@ const useGetFuturesPotentialTradeDetails = ( const walletAddress = useRecoilValue(walletAddressState); const { synthetixjs } = Connector.useContainer(); + const getStatusMessage = (status: PotentialTradeStatus): string => { + if (typeof status !== 'number') { + return UNKNOWN; + } + + if (status === 0) { + return SUCCESS; + } else if (PotentialTradeStatus[status]) { + return POTENTIAL_TRADE_STATUS_TO_MESSAGE[PotentialTradeStatus[status]]; + } else { + return UNKNOWN; + } + }; + return useQuery( QUERY_KEYS.Futures.PotentialTrade(network.id, marketAsset || null, trade, walletAddress || ''), async () => { - if (!marketAsset || !trade || !trade.size?.length) return null; + if (!marketAsset || !trade || !trade.size?.length || !isL2) return null; + + const { + contracts: { FuturesMarketData }, + } = synthetixjs!; const FuturesMarketContract = getFuturesMarketContract(marketAsset, synthetixjs!.contracts); const newSize = trade.side === 'long' ? +trade.size : -trade.size; - const { fee, liqPrice, margin, price, size } = await FuturesMarketContract.postTradeDetails( - wei(newSize).toBN(), - walletAddress - ); + + const [globals, { fee, liqPrice, margin, price, size, status }] = await Promise.all([ + await FuturesMarketData.globals(), + await FuturesMarketContract.postTradeDetails(wei(newSize).toBN(), walletAddress), + ]); return { fee: wei(fee), @@ -41,6 +66,13 @@ const useGetFuturesPotentialTradeDetails = ( margin: wei(margin), price: wei(price), size: wei(size), + side: trade.side, + leverage: wei(trade.leverage), + notionalValue: wei(size).mul(wei(price)), + minInitialMargin: wei(globals.minInitialMargin), + status, + showStatus: status > 0, // 0 is success + statusMessage: getStatusMessage(status), }; }, { diff --git a/queries/futures/utils.ts b/queries/futures/utils.ts index 4d3567b24b..8b10e47182 100644 --- a/queries/futures/utils.ts +++ b/queries/futures/utils.ts @@ -318,6 +318,9 @@ export const mapTradeHistory = ( size, feesPaid, netFunding, + netTransfers, + totalDeposits, + initialMargin, margin, entryPrice, exitPrice, @@ -333,6 +336,9 @@ export const mapTradeHistory = ( const sizeWei = new Wei(size, 18, true); const feesWei = new Wei(feesPaid || 0, 18, true); const netFundingWei = new Wei(netFunding || 0, 18, true); + const netTransfersWei = new Wei(netTransfers || 0, 18, true); + const totalDepositsWei = new Wei(totalDeposits || 0, 18, true); + const initialMarginWei = new Wei(initialMargin, 18, true); const marginWei = new Wei(margin, 18, true); const pnlWei = new Wei(pnl, 18, true); const totalVolumeWei = new Wei(totalVolume, 18, true); @@ -351,6 +357,9 @@ export const mapTradeHistory = ( size: sizeWei.abs(), feesPaid: feesWei, netFunding: netFundingWei, + netTransfers: netTransfersWei, + totalDeposits: totalDepositsWei, + initialMargin: initialMarginWei, margin: marginWei, entryPrice: entryPriceWei, exitPrice: exitPriceWei, diff --git a/queries/rates/useCandlesticksQuery.ts b/queries/rates/useCandlesticksQuery.ts index 2d1e88108f..74326d8f09 100644 --- a/queries/rates/useCandlesticksQuery.ts +++ b/queries/rates/useCandlesticksQuery.ts @@ -1,5 +1,5 @@ import { getCandles } from 'queries/futures/subgraph'; -import { getRatesEndpoint, mapCandles } from './utils'; +import { getRatesEndpoint, mapCandles, mapPriceChart } from './utils'; export const requestCandlesticks = async ( currencyKey: string | null, @@ -8,7 +8,8 @@ export const requestCandlesticks = async ( period: number, networkId: number, limit?: number, - orderDirection: 'asc' | 'desc' | undefined = 'asc' + orderDirection: 'asc' | 'desc' | undefined = 'asc', + priceChart?: boolean | null ) => { const ratesEndpoint = getRatesEndpoint(networkId); @@ -38,7 +39,7 @@ export const requestCandlesticks = async ( aggregatedPrices: true, } ).then((response) => { - return mapCandles(response); + return priceChart ? mapPriceChart(response) : mapCandles(response); }); return response; }; diff --git a/queries/rates/utils.ts b/queries/rates/utils.ts index f305f903c1..347444fa41 100644 --- a/queries/rates/utils.ts +++ b/queries/rates/utils.ts @@ -123,3 +123,18 @@ export const mapCandles = (candles: CandleResult[]): Candle[] => { }; }); }; + +export const mapPriceChart = (candles: CandleResult[]): Candle[] => { + return candles?.map(({ id, synth, open, high, low, close, average, timestamp }: CandleResult) => { + return { + id: id, + synth: synth, + open: open.toNumber(), + high: high.toNumber(), + low: low.toNumber(), + close: close.toNumber(), + average: average.toNumber(), + timestamp: timestamp.toNumber(), + }; + }); +}; diff --git a/queries/synths/useGetWalletTrades.ts b/queries/synths/useGetWalletTrades.ts new file mode 100644 index 0000000000..771c5a0998 --- /dev/null +++ b/queries/synths/useGetWalletTrades.ts @@ -0,0 +1,68 @@ +import { useQuery, UseQueryOptions } from 'react-query'; +import { useRecoilValue } from 'recoil'; + +import { appReadyState } from 'store/app'; +import { networkState } from 'store/wallet'; + +import QUERY_KEYS from 'constants/queryKeys'; +import { SynthsVolumes } from './type'; +import request, { gql } from 'graphql-request'; +import { getSynthsEndpoint } from './utils'; + +const useGetWalletTrades = ( + walletAddress: string, + options?: UseQueryOptions +) => { + const isAppReady = useRecoilValue(appReadyState); + const network = useRecoilValue(networkState); + const synthsEndpoint = getSynthsEndpoint(network); + + return useQuery( + QUERY_KEYS.Trades.WalletTrades(walletAddress, network.id), + async () => { + try { + const response = await request( + synthsEndpoint, + gql` + query WalletTrades($walletAddress: String!) { + synthExchanges( + where: { account: $walletAddress } + first: 1000 + orderBy: "timestamp" + orderDirection: "desc" + ) { + id + fromAmount + fromAmountInUSD + fromSynth { + name + symbol + id + } + toSynth { + name + symbol + id + } + toAmount + toAmountInUSD + feesInUSD + toAddress + timestamp + gasPrice + } + } + `, + { walletAddress: walletAddress } + ); + return response; + } catch (e) { + console.error(e); + return null; + } + }, + { enabled: isAppReady && !!walletAddress, ...options } + ); +}; + +export default useGetWalletTrades; diff --git a/sections/dashboard/DashboardCard/DashboardCard.tsx b/sections/dashboard/DashboardCard/DashboardCard.tsx index 43c9f20f57..1a6aff3c7c 100644 --- a/sections/dashboard/DashboardCard/DashboardCard.tsx +++ b/sections/dashboard/DashboardCard/DashboardCard.tsx @@ -192,7 +192,7 @@ const Title = styled(BoldText)` const StyledCurrencyPrice = styled(Currency.Price)` font-size: 20px; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; const StyledTabList = styled(TabList)` diff --git a/sections/dashboard/DashboardContainer/DashboardContainer.tsx b/sections/dashboard/DashboardContainer/DashboardContainer.tsx index 2cfc35ff87..51dc93164c 100644 --- a/sections/dashboard/DashboardContainer/DashboardContainer.tsx +++ b/sections/dashboard/DashboardContainer/DashboardContainer.tsx @@ -9,12 +9,12 @@ import NavButton from 'components/Button/NavButton'; import Links from '../Links'; import Markets from '../Markets'; import Overview from '../Overview'; -import StakingInfo from '../StakingInfo'; -import { MainContent, LeftSideContent, RightSideContent } from 'styles/common'; +import { MainContent, LeftSideContent } from 'styles/common'; +import History from '../History'; enum Tab { Overview = 'overview', - Positions = 'positions', + History = 'history', Rewards = 'rewards', Markets = 'markets', Governance = 'governance', @@ -48,11 +48,10 @@ const DashboardContainer: FC = () => { onClick: () => router.push(ROUTES.Home.Overview), }, { - name: Tab.Positions, - label: t('futures-dashboard.tabs.nav.positions'), - active: activeTab === Tab.Positions, - disabled: true, - onClick: () => {}, + name: Tab.History, + label: t('futures-dashboard.tabs.nav.history'), + active: activeTab === Tab.History, + onClick: () => router.push(ROUTES.Home.History), }, { name: Tab.Rewards, @@ -124,23 +123,17 @@ const DashboardContainer: FC = () => { + + + - - - > ); }; -const StyledRightSideContent = styled(RightSideContent)` - display: flex; - flex-direction: row; - justify-content: end; -`; - const StyledTabList = styled(TabList)` display: flex; flex-direction: column; diff --git a/sections/dashboard/Deprecated/DeprecatedSynthsTable.tsx b/sections/dashboard/Deprecated/DeprecatedSynthsTable.tsx index de61f51799..d69a16d3d8 100644 --- a/sections/dashboard/Deprecated/DeprecatedSynthsTable.tsx +++ b/sections/dashboard/Deprecated/DeprecatedSynthsTable.tsx @@ -90,7 +90,7 @@ export const NoBalancesContainer = styled(GridDivCentered)` `; export const Message = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 14px; font-family: ${(props) => props.theme.fonts.bold}; flex-grow: 1; diff --git a/sections/dashboard/Deprecated/DeprecatedSynthsTableRow.tsx b/sections/dashboard/Deprecated/DeprecatedSynthsTableRow.tsx index 5ad63ca89f..5c35cc7e7e 100644 --- a/sections/dashboard/Deprecated/DeprecatedSynthsTableRow.tsx +++ b/sections/dashboard/Deprecated/DeprecatedSynthsTableRow.tsx @@ -113,7 +113,7 @@ export const NoBalancesContainer = styled(GridDivCentered)` `; export const Message = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 14px; font-family: ${(props) => props.theme.fonts.bold}; flex-grow: 1; diff --git a/sections/dashboard/Deprecated/RedeemTxModal.tsx b/sections/dashboard/Deprecated/RedeemTxModal.tsx index 7356cbcea1..2999910357 100644 --- a/sections/dashboard/Deprecated/RedeemTxModal.tsx +++ b/sections/dashboard/Deprecated/RedeemTxModal.tsx @@ -110,7 +110,7 @@ const BalanceItemTitle = styled.div` `; const BalanceItemAmount = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; const Subtitle = styled.div` @@ -124,7 +124,7 @@ const Actions = styled(FlexDivColCentered)` `; const Message = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 14px; font-family: ${(props) => props.theme.fonts.bold}; flex-grow: 1; @@ -143,7 +143,7 @@ export const TooltipItem = styled.span` `; const Title = styled.div<{ topPad?: boolean }>` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 12px; margin-bottom: 12px; ${(props) => (!props.topPad ? '' : 'margin-top: 24px;')} diff --git a/sections/dashboard/FeeReclaimingSynths/FeeReclaimingSynth.tsx b/sections/dashboard/FeeReclaimingSynths/FeeReclaimingSynth.tsx index d236c34e1a..db2181153a 100644 --- a/sections/dashboard/FeeReclaimingSynths/FeeReclaimingSynth.tsx +++ b/sections/dashboard/FeeReclaimingSynths/FeeReclaimingSynth.tsx @@ -192,7 +192,7 @@ const Col = styled.div` `; const ColTitle = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.mono}; text-align: center; `; diff --git a/sections/dashboard/FuturesMarketsTable/FuturesMarketsTable.tsx b/sections/dashboard/FuturesMarketsTable/FuturesMarketsTable.tsx index 38948b3fcd..81f2a118d4 100644 --- a/sections/dashboard/FuturesMarketsTable/FuturesMarketsTable.tsx +++ b/sections/dashboard/FuturesMarketsTable/FuturesMarketsTable.tsx @@ -278,11 +278,11 @@ const FuturesMarketsTable: FC = ({ }; const StyledLongPrice = styled(Currency.Price)` - color: ${(props) => props.theme.colors.common.primaryGreen}; + color: ${(props) => props.theme.colors.selectedTheme.green}; `; const StyledShortPrice = styled(Currency.Price)` - color: ${(props) => props.theme.colors.common.primaryRed}; + color: ${(props) => props.theme.colors.selectedTheme.red}; `; const StyledCurrencyIcon = styled(Currency.Icon)` @@ -303,7 +303,7 @@ const IconContainer = styled.div` `; const StyledValue = styled.div` - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; font-family: ${(props) => props.theme.fonts.regular}; font-size: 12px; grid-column: 2; @@ -317,7 +317,7 @@ const TableContainer = styled.div` margin-bottom: '40px'; .paused { - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; } `; @@ -325,7 +325,9 @@ const StyledTable = styled(Table)` margin-bottom: 20px; `; -const TableHeader = styled.div``; +const TableHeader = styled.div` + color: ${(props) => props.theme.colors.selectedTheme.gray}; +`; const StyledText = styled.div` display: flex; @@ -333,6 +335,8 @@ const StyledText = styled.div` margin-bottom: -4px; grid-column: 2; grid-row: 1; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; + font-family: ${(props) => props.theme.fonts.bold}; `; const MarketContainer = styled.div` diff --git a/sections/dashboard/FuturesPositionsTable/FuturesPositionsTable.tsx b/sections/dashboard/FuturesPositionsTable/FuturesPositionsTable.tsx index f0f0c57ac6..a091f93b10 100644 --- a/sections/dashboard/FuturesPositionsTable/FuturesPositionsTable.tsx +++ b/sections/dashboard/FuturesPositionsTable/FuturesPositionsTable.tsx @@ -159,7 +159,7 @@ const FuturesPositionsTable: FC = ({ return cellProps.row.original.leverage === NO_VALUE ? ( {NO_VALUE} ) : ( - {formatNumber(cellProps.row.original.leverage ?? 0)}x + {formatNumber(cellProps.row.original.leverage ?? 0)}x ); }, width: 90, @@ -259,14 +259,16 @@ const IconContainer = styled.div` `; const StyledValue = styled.div` - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; font-family: ${(props) => props.theme.fonts.regular}; font-size: 12px; grid-column: 2; grid-row: 2; `; -const DefaultCell = styled.p``; +const DefaultCell = styled.p` + color: ${(props) => props.theme.colors.selectedTheme.button.text}; +`; const TableContainer = styled.div``; @@ -274,7 +276,9 @@ const StyledTable = styled(Table)` /* margin-top: 20px; */ `; -const TableHeader = styled.div``; +const TableHeader = styled.div` + color: ${(props) => props.theme.colors.selectedTheme.gray}; +`; const StyledText = styled.div` display: flex; @@ -282,6 +286,8 @@ const StyledText = styled.div` grid-column: 2; grid-row: 1; margin-bottom: -4px; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; + font-family: ${(props) => props.theme.fonts.bold}; `; const MarketContainer = styled.div` diff --git a/sections/dashboard/History/History.tsx b/sections/dashboard/History/History.tsx new file mode 100644 index 0000000000..8ebd422bc3 --- /dev/null +++ b/sections/dashboard/History/History.tsx @@ -0,0 +1,78 @@ +import { FC, useState, useMemo } from 'react'; +import styled from 'styled-components'; +import { useTranslation } from 'react-i18next'; +import { TabPanel } from 'components/Tab'; +import TabButton from 'components/Button/TabButton'; +import SpotHistoryTable from '../SpotHistoryTable'; + +enum HistoryTab { + FUTURES = 'futures', + SPOT = 'spot', +} + +const History: FC = () => { + const { t } = useTranslation(); + + const [activeMarketsTab, setActiveMarketsTab] = useState(HistoryTab.SPOT); + + const HISTORY_TABS = useMemo( + () => [ + { + name: HistoryTab.FUTURES, + label: t('dashboard.overview.history-tabs.futures'), + active: activeMarketsTab === HistoryTab.FUTURES, + disabled: true, + onClick: () => { + setActiveMarketsTab(HistoryTab.FUTURES); + }, + }, + { + name: HistoryTab.SPOT, + label: t('dashboard.overview.history-tabs.spot'), + active: activeMarketsTab === HistoryTab.SPOT, + onClick: () => { + setActiveMarketsTab(HistoryTab.SPOT); + }, + }, + ], + [activeMarketsTab, t] + ); + + return ( + <> + + {HISTORY_TABS.map(({ name, label, active, disabled, onClick }) => ( + + ))} + + + + + + + > + ); +}; + +const TabButtonsContainer = styled.div` + display: flex; + margin-top: 16px; + margin-bottom: 16px; + + & > button { + height: 38px; + font-size: 13px; + + &:not(:last-of-type) { + margin-right: 14px; + } + } +`; + +export default History; diff --git a/sections/dashboard/History/index.tsx b/sections/dashboard/History/index.tsx new file mode 100644 index 0000000000..aca6b6c177 --- /dev/null +++ b/sections/dashboard/History/index.tsx @@ -0,0 +1 @@ +export { default } from './History'; diff --git a/sections/dashboard/Onboard/HowItWorksModal/HowItWorksModal.tsx b/sections/dashboard/Onboard/HowItWorksModal/HowItWorksModal.tsx index dc832ef314..8c7b538dd7 100644 --- a/sections/dashboard/Onboard/HowItWorksModal/HowItWorksModal.tsx +++ b/sections/dashboard/Onboard/HowItWorksModal/HowItWorksModal.tsx @@ -7,8 +7,6 @@ import { CenteredModal } from 'sections/shared/modals/common'; import { FlexDiv, Paragraph } from 'styles/common'; import media, { breakpoints } from 'styles/media'; -import { STEPS } from 'sections/homepage/Steps'; - type HowItWorksModalProps = { onDismiss: () => void; }; @@ -37,18 +35,7 @@ export const HowItWorksModal: FC = ({ onDismiss }) => { }, }, ]} - > - {STEPS.map(({ id, image, subtitle, title, copy }) => ( - - - {image} - {t(subtitle)} - - {t(title)} - {t(copy)} - - ))} - + > @@ -111,7 +98,7 @@ const SubHeader = styled(Paragraph)` line-height: 120%; letter-spacing: 0.2px; font-family: ${(props) => props.theme.fonts.bold}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; padding-right: 40px; ${media.lessThan('md')` font-size: 20px; @@ -121,34 +108,4 @@ const SubHeader = styled(Paragraph)` `} `; -const StepBox = styled.div` - position: relative; - margin-bottom: 20px; -`; - -const StepSubtitle = styled(Paragraph)` - font-size: 16px; - line-height: 120%; - color: ${(props) => props.theme.colors.goldColors.color1}; - font-family: ${(props) => props.theme.fonts.bold}; - position: absolute; - bottom: 2px; -`; - -const StepTitle = styled(Paragraph)` - font-family: ${(props) => props.theme.fonts.bold}; - font-size: 16px; - color: ${(props) => props.theme.colors.white}; - padding-bottom: 12px; - line-height: 19.2px; -`; - -const StepCopy = styled(Paragraph)` - color: ${(props) => props.theme.colors.silver}; - ${media.lessThan('md')` - font-size: 14px; - line-height: 20px; - `} -`; - export default HowItWorksModal; diff --git a/sections/dashboard/Onboard/Onboard.tsx b/sections/dashboard/Onboard/Onboard.tsx index 03600015a2..7900581f54 100644 --- a/sections/dashboard/Onboard/Onboard.tsx +++ b/sections/dashboard/Onboard/Onboard.tsx @@ -55,7 +55,7 @@ const Subtitle = styled.div` font-family: ${(props) => props.theme.fonts.bold}; font-size: 20px; line-height: 24px; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; text-align: center; margin-bottom: 33px; `; diff --git a/sections/dashboard/Overview/Overview.tsx b/sections/dashboard/Overview/Overview.tsx index e3b8556efa..930b054a3c 100644 --- a/sections/dashboard/Overview/Overview.tsx +++ b/sections/dashboard/Overview/Overview.tsx @@ -80,6 +80,7 @@ const Overview: FC = () => { badge: futuresPositionQuery?.data?.length, active: activePositionsTab === PositionsTab.FUTURES, detail: totalFuturesPortfolioValue, + disabled: false, onClick: () => { setActivePositionsTab(PositionsTab.FUTURES); }, @@ -89,19 +90,20 @@ const Overview: FC = () => { label: t('dashboard.overview.positions-tabs.spot'), active: activePositionsTab === PositionsTab.SPOT, detail: totalSpotBalancesValue, + disabled: false, onClick: () => { setActivePositionsTab(PositionsTab.SPOT); }, }, - { - name: PositionsTab.SHORTS, - label: t('dashboard.overview.positions-tabs.shorts'), - disabled: true, - active: activePositionsTab === PositionsTab.SHORTS, - onClick: () => { - setActivePositionsTab(PositionsTab.SHORTS); - }, - }, + // { + // name: PositionsTab.SHORTS, + // label: t('dashboard.overview.positions-tabs.shorts'), + // disabled: true, + // active: activePositionsTab === PositionsTab.SHORTS, + // onClick: () => { + // setActivePositionsTab(PositionsTab.SHORTS); + // }, + // }, ], [ activePositionsTab, @@ -169,7 +171,7 @@ const Overview: FC = () => { /> - + {/* */} {MARKETS_TABS.map(({ name, label, active, onClick }) => ( @@ -193,9 +195,6 @@ const TabButtonsContainer = styled.div<{ hasDetail?: boolean }>` margin-bottom: 16px; & > button { - height: ${(props) => (props.hasDetail ? '48px' : '38px')}; - font-size: 13px; - &:not(:last-of-type) { margin-right: 14px; } diff --git a/sections/dashboard/PortfolioChart/PortfolioChart.tsx b/sections/dashboard/PortfolioChart/PortfolioChart.tsx index 78ff603359..304334eeed 100644 --- a/sections/dashboard/PortfolioChart/PortfolioChart.tsx +++ b/sections/dashboard/PortfolioChart/PortfolioChart.tsx @@ -35,19 +35,18 @@ const Chart = styled.div` `; const PortfolioTitle = styled.p` - color: ${(props) => props.theme.colors.common.secondaryGray}; - font-family: ${(props) => props.theme.fonts.regular}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; + font-family: ${(props) => props.theme.fonts.bold}; font-size: 16px; - font-weight: bold; margin-top: 26px; margin-left: 26px; margin-bottom: 10px; `; const PortfolioText = styled(Currency.Price)` - color: ${(props) => props.theme.colors.common.primaryWhite}; - font-family: ${(props) => props.theme.fonts.mono}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; + font-family: ${(props) => props.theme.fonts.monoBold}; + letter-spacing: -1.2px; font-size: 27px; - font-weight: bold; margin-left: 26px; margin-top: 0; margin-bottom: 26px; diff --git a/sections/dashboard/SpotHistoryTable/SpotHistoryTable.tsx b/sections/dashboard/SpotHistoryTable/SpotHistoryTable.tsx new file mode 100644 index 0000000000..1848650216 --- /dev/null +++ b/sections/dashboard/SpotHistoryTable/SpotHistoryTable.tsx @@ -0,0 +1,259 @@ +import { FC, useMemo, ReactElement } from 'react'; +import styled from 'styled-components'; +import { useTranslation } from 'react-i18next'; +import { useRecoilValue } from 'recoil'; +import { Synths } from '@synthetixio/contracts-interface'; +import { CurrencyKey } from 'constants/currency'; +import Connector from 'containers/Connector'; +import values from 'lodash/values'; +import Currency from 'components/Currency'; +import { CellProps } from 'react-table'; +import Table from 'components/Table'; +import { walletAddressState } from 'store/wallet'; +import { SynthTradesExchangeResult } from '../Transactions/TradeHistory/TradeHistory'; +import useSelectedPriceCurrency from 'hooks/useSelectedPriceCurrency'; +import TimeDisplay from '../../futures/Trades/TimeDisplay'; +import { NO_VALUE } from 'constants/placeholder'; +import BlockExplorer from 'containers/BlockExplorer'; +import { ExternalLink } from 'styles/common'; +import LinkIcon from 'assets/svg/app/link.svg'; +import * as _ from 'lodash/fp'; +import { isFiatCurrency } from 'utils/currencies'; +import useGetWalletTrades from 'queries/synths/useGetWalletTrades'; + +type WalletTradesExchangeResult = Omit & { + timestamp: number; +}; + +const SpotHistoryTable: FC = () => { + const { t } = useTranslation(); + const walletAddress = useRecoilValue(walletAddressState); + + const { blockExplorerInstance } = BlockExplorer.useContainer(); + const { selectPriceCurrencyRate, selectedPriceCurrency } = useSelectedPriceCurrency(); + const walletTradesQuery = useGetWalletTrades(walletAddress!); + const { synthsMap } = Connector.useContainer(); + + const synths = useMemo(() => values(synthsMap) || [], [synthsMap]); + const trades = useMemo(() => { + const t = walletTradesQuery.data?.synthExchanges ?? []; + + return t.map((trade: any) => ({ + ...trade, + hash: trade.id.split('-')[0], + })); + }, [walletTradesQuery.data]); + + const filteredHistoricalTrades = useMemo( + () => + trades.filter((trade: any) => { + const activeSynths = synths.map((synth) => synth.name); + return activeSynths.includes(trade.fromSynth?.symbol as CurrencyKey); + }), + [trades, synths] + ); + + const conditionalRender = (prop: T, children: ReactElement): ReactElement => + _.isNil(prop) ? {NO_VALUE} : children; + + return ( + + {t('dashboard.overview.history-table.date-time')}, + accessor: 'dateTime', + Cell: (cellProps: CellProps) => { + return conditionalRender( + cellProps.row.original.timestamp, + + + + ); + }, + width: 190, + }, + { + Header: {t('dashboard.overview.history-table.from')}, + accessor: 'fromAmount', + Cell: (cellProps: CellProps) => { + return conditionalRender( + cellProps.row.original.fromSynth && cellProps.row.original.fromAmount, + + {cellProps.row.original.fromSynth?.symbol && ( + <> + + + + {cellProps.row.original.fromSynth.symbol} + > + )} + + + + + + ); + }, + width: 190, + }, + { + Header: {t('dashboard.overview.history-table.to')}, + accessor: 'toAmount', + Cell: (cellProps: CellProps) => { + return conditionalRender( + cellProps.row.original.toSynth && cellProps.row.original.toAmount, + + {cellProps.row.original.toSynth?.symbol && ( + <> + + + + {cellProps.row.original.toSynth.symbol} + > + )} + + + + + + ); + }, + width: 190, + }, + { + Header: {t('dashboard.overview.history-table.usd-value')}, + accessor: 'amount', + Cell: (cellProps: CellProps) => { + const currencyKey = cellProps.row.original.toSynth?.symbol as CurrencyKey; + return conditionalRender( + currencyKey, + + ); + }, + width: 190, + }, + { + id: 'link', + Cell: (cellProps: CellProps) => + blockExplorerInstance != null && cellProps.row.original.hash ? ( + + + + ) : ( + NO_VALUE + ), + width: 50, + sortable: false, + }, + ]} + /> + + ); +}; + +const DefaultCell = styled.p``; + +const StyledExternalLink = styled(ExternalLink)` + margin-left: auto; +`; + +const StyledTimeDisplay = styled.div` + div { + margin-left: 2px; + } +`; + +const StyledLinkIcon = styled(LinkIcon)` + width: 14px; + height: 14px; + color: ${(props) => props.theme.colors.common.secondaryGray}; + &:hover { + color: ${(props) => props.theme.colors.goldColors.color1}; + } +`; + +const StyledCurrencyIcon = styled(Currency.Icon)` + width: 30px; + height: 30px; + margin-right: 5px; +`; + +const IconContainer = styled.div` + grid-column: 1; + grid-row: 1 / span 2; +`; + +const TableContainer = styled.div` + margin-top: 16px; + margin-bottom: '40px'; + font-family: ${(props) => props.theme.fonts.regular}; + + .paused { + color: ${(props) => props.theme.colors.common.secondaryGray}; + } +`; + +const StyledTable = styled(Table)` + margin-bottom: 20px; +`; + +const TableHeader = styled.div``; + +const StyledText = styled.div` + display: flex; + align-items: center; + grid-column: 2; + grid-row: 1; + color: ${(props) => props.theme.colors.common.secondaryGray}; +`; + +const SynthContainer = styled.div` + display: flex; + align-items: center; + grid-column: 3; + grid-row: 1; + column-gap: 5px; + margin-left: -4px; +`; + +export default SpotHistoryTable; diff --git a/sections/dashboard/SpotHistoryTable/index.ts b/sections/dashboard/SpotHistoryTable/index.ts new file mode 100644 index 0000000000..2ba9a4c312 --- /dev/null +++ b/sections/dashboard/SpotHistoryTable/index.ts @@ -0,0 +1 @@ +export { default } from './SpotHistoryTable'; diff --git a/sections/dashboard/SpotMarketsTable/SpotMarketsTable.tsx b/sections/dashboard/SpotMarketsTable/SpotMarketsTable.tsx index af24780dce..d8c17370a8 100644 --- a/sections/dashboard/SpotMarketsTable/SpotMarketsTable.tsx +++ b/sections/dashboard/SpotMarketsTable/SpotMarketsTable.tsx @@ -205,7 +205,7 @@ const IconContainer = styled.div` `; const StyledValue = styled.div` - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; font-family: ${(props) => props.theme.fonts.regular}; font-size: 12px; grid-column: 2; @@ -219,7 +219,7 @@ const TableContainer = styled.div` margin-bottom: '40px'; .paused { - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; } `; @@ -235,6 +235,8 @@ const StyledText = styled.div` margin-bottom: -4px; grid-column: 2; grid-row: 1; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; + font-family: ${(props) => props.theme.fonts.bold}; `; const MarketContainer = styled.div` diff --git a/sections/dashboard/SynthBalances/SynthBalanceRow.tsx b/sections/dashboard/SynthBalances/SynthBalanceRow.tsx index c6bf00cddf..d1d9868862 100644 --- a/sections/dashboard/SynthBalances/SynthBalanceRow.tsx +++ b/sections/dashboard/SynthBalances/SynthBalanceRow.tsx @@ -157,7 +157,7 @@ export const NoBalancesContainer = styled(GridDivCentered)` `; export const Message = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 14px; font-family: ${(props) => props.theme.fonts.bold}; flex-grow: 1; diff --git a/sections/dashboard/SynthBalances/SynthBalances.tsx b/sections/dashboard/SynthBalances/SynthBalances.tsx index dbb6f1e158..7e8a8119e9 100644 --- a/sections/dashboard/SynthBalances/SynthBalances.tsx +++ b/sections/dashboard/SynthBalances/SynthBalances.tsx @@ -46,7 +46,7 @@ export const NoBalancesContainer = styled(GridDivCentered)` `; export const Message = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 14px; font-family: ${(props) => props.theme.fonts.bold}; flex-grow: 1; diff --git a/sections/dashboard/SynthBalancesTable/SynthBalancesTable.tsx b/sections/dashboard/SynthBalancesTable/SynthBalancesTable.tsx index d1ffc7b02f..597cc232ef 100644 --- a/sections/dashboard/SynthBalancesTable/SynthBalancesTable.tsx +++ b/sections/dashboard/SynthBalancesTable/SynthBalancesTable.tsx @@ -229,14 +229,16 @@ const IconContainer = styled.div` `; const StyledValue = styled.div` - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; font-family: ${(props) => props.theme.fonts.regular}; font-size: 12px; grid-column: 2; grid-row: 2; `; -const DefaultCell = styled.p``; +const DefaultCell = styled.p` + color: ${(props) => props.theme.colors.selectedTheme.button.text}; +`; const TableContainer = styled.div``; @@ -252,6 +254,8 @@ const StyledText = styled.div` grid-column: 2; grid-row: 1; margin-bottom: -4px; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; + font-family: ${(props) => props.theme.fonts.bold}; `; const MarketContainer = styled.div` @@ -263,6 +267,7 @@ const MarketContainer = styled.div` const AmountCol = styled.div` justify-self: flex-end; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; export default SynthBalancesTable; diff --git a/sections/dashboard/Transactions/TradeHistory/SynthFeeReclaimStatus.tsx b/sections/dashboard/Transactions/TradeHistory/SynthFeeReclaimStatus.tsx index 137399e1d3..8487361920 100644 --- a/sections/dashboard/Transactions/TradeHistory/SynthFeeReclaimStatus.tsx +++ b/sections/dashboard/Transactions/TradeHistory/SynthFeeReclaimStatus.tsx @@ -56,7 +56,7 @@ export default SynthFeeReclaimStatus; const Tooltip = styled(Tippy)` font-size: 12px; background-color: ${(props) => props.theme.colors.navy}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; .tippy-arrow { color: ${(props) => props.theme.colors.navy}; } diff --git a/sections/dashboard/Transactions/TradeHistory/TradeHistory.tsx b/sections/dashboard/Transactions/TradeHistory/TradeHistory.tsx index 5c62d4cb58..4170395a34 100644 --- a/sections/dashboard/Transactions/TradeHistory/TradeHistory.tsx +++ b/sections/dashboard/Transactions/TradeHistory/TradeHistory.tsx @@ -187,13 +187,13 @@ const StyledTableHeader = styled.div` `; const StyledOrderType = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; display: flex; align-items: center; `; const StyledCurrencyKey = styled.span` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; padding-right: 10px; `; diff --git a/sections/dashboard/common.tsx b/sections/dashboard/common.tsx index 9ed2c41ceb..f454a8f355 100644 --- a/sections/dashboard/common.tsx +++ b/sections/dashboard/common.tsx @@ -4,7 +4,7 @@ import Text from 'components/Text'; export const CardTitle = styled.div` font-family: ${(props) => props.theme.fonts.bold}; font-size: 14px; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; export const ConvertContainer = styled.div` @@ -14,7 +14,7 @@ export const ConvertContainer = styled.div` `; export const Title = styled(Text.Body)` - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; font-size: 14px; &:not(:first-of-type) { diff --git a/sections/earn/common.tsx b/sections/earn/common.tsx index b7b8bdd985..9fd93985ba 100644 --- a/sections/earn/common.tsx +++ b/sections/earn/common.tsx @@ -26,14 +26,14 @@ export const BigText = styled(Text.Heading)<{ $gold?: boolean }>` `; export const Title = styled(Text.Body)` - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; font-size: 14px; margin-bottom: 5px; `; export const Description = styled(Text.Body)` font-size: 13px; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; `; const StyledKwentaLogo = styled(KwentaLogo)` @@ -57,7 +57,7 @@ export const GridHeading = styled(Text.Heading)` `; export const StyledBody = styled(Text.Body)` - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; margin-bottom: 40px; `; @@ -67,7 +67,7 @@ export const StyledButton = styled(Button)` `; export const DollarValue = styled(BigText)` - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; `; export const ColumnInner = styled.div` diff --git a/sections/exchange/BasicSwap/BasicSwap.tsx b/sections/exchange/BasicSwap/BasicSwap.tsx index 0306776216..b014288048 100644 --- a/sections/exchange/BasicSwap/BasicSwap.tsx +++ b/sections/exchange/BasicSwap/BasicSwap.tsx @@ -42,7 +42,7 @@ const BasicSwap: FC = () => { export default BasicSwap; const ExchangeTitle = styled(BoldText)` - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 30px; margin-bottom: 1.5em; text-align: center; diff --git a/sections/exchange/FooterCard/SettleTransactionsCard/SettleTransactionsCard.tsx b/sections/exchange/FooterCard/SettleTransactionsCard/SettleTransactionsCard.tsx index daab0bf314..903a99fdfd 100644 --- a/sections/exchange/FooterCard/SettleTransactionsCard/SettleTransactionsCard.tsx +++ b/sections/exchange/FooterCard/SettleTransactionsCard/SettleTransactionsCard.tsx @@ -106,7 +106,7 @@ export const MessageItems = styled.span` export const ErrorTooltip = styled(Tippy)` font-size: 12px; background-color: ${(props) => props.theme.colors.red}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; .tippy-arrow { color: ${(props) => props.theme.colors.red}; } diff --git a/sections/exchange/FooterCard/TradeBalancerSummaryCard/TradeBalancerSummaryCard.tsx b/sections/exchange/FooterCard/TradeBalancerSummaryCard/TradeBalancerSummaryCard.tsx index 6c78e25f7a..cd4c5bc781 100644 --- a/sections/exchange/FooterCard/TradeBalancerSummaryCard/TradeBalancerSummaryCard.tsx +++ b/sections/exchange/FooterCard/TradeBalancerSummaryCard/TradeBalancerSummaryCard.tsx @@ -83,7 +83,7 @@ const SummaryItemLabel = styled.div` `; const SummaryItemValue = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; ${numericValueCSS}; `; diff --git a/sections/exchange/FooterCard/TradeSummaryCard/GasPriceSummaryItem.tsx b/sections/exchange/FooterCard/TradeSummaryCard/GasPriceSummaryItem.tsx index c92669a795..c2fc6b619f 100644 --- a/sections/exchange/FooterCard/TradeSummaryCard/GasPriceSummaryItem.tsx +++ b/sections/exchange/FooterCard/TradeSummaryCard/GasPriceSummaryItem.tsx @@ -219,7 +219,7 @@ export const StyledGasEditButton = styled.span` export const ErrorTooltip = styled(Tippy)` font-size: 12px; background-color: ${(props) => props.theme.colors.red}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; .tippy-arrow { color: ${(props) => props.theme.colors.red}; } diff --git a/sections/exchange/FooterCard/TradeSummaryCard/TradeSummaryCard.tsx b/sections/exchange/FooterCard/TradeSummaryCard/TradeSummaryCard.tsx index f40f206434..df6dc2c967 100644 --- a/sections/exchange/FooterCard/TradeSummaryCard/TradeSummaryCard.tsx +++ b/sections/exchange/FooterCard/TradeSummaryCard/TradeSummaryCard.tsx @@ -22,8 +22,6 @@ import { SummaryItems, SummaryItem, SummaryItemLabel, SummaryItemValue } from '. import GasPriceSelect from 'sections/shared/components/GasPriceSelect'; import FeeRateSummaryItem from 'sections/shared/components/FeeRateSummary'; import FeeCostSummaryItem from 'sections/shared/components/FeeCostSummary'; - -import TotalTradePriceSummaryItem from './TotalTradePriceSummaryItem'; import { GasPrices } from '@synthetixio/queries'; import PoweredBy1Inch from 'components/PoweredBy1Inch'; import { Synth } from '@synthetixio/contracts-interface'; @@ -82,18 +80,16 @@ const TradeSummaryCard: FC = ({ const summaryItems = ( - - {isCreateShort ? ( + {isCreateShort && ( + <> {t('shorting.common.interestRate')} {formatPercent((shortInterestRate ?? 0).toString())} > - ) : ( - - )} - + + )} {showFee && ( <> @@ -156,7 +152,7 @@ const TradeSummaryCard: FC = ({ export const ErrorTooltip = styled(Tippy)` font-size: 12px; background-color: ${(props) => props.theme.colors.red}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; .tippy-arrow { color: ${(props) => props.theme.colors.red}; } diff --git a/sections/exchange/FooterCard/common.tsx b/sections/exchange/FooterCard/common.tsx index da53ae5330..205a293816 100644 --- a/sections/exchange/FooterCard/common.tsx +++ b/sections/exchange/FooterCard/common.tsx @@ -11,6 +11,7 @@ export const SummaryItems = styled.div<{ attached?: boolean }>` grid-auto-flow: column; flex-grow: 1; padding-left: 32px; + justify-content: space-between; ${media.lessThan('md')` grid-auto-flow: unset; grid-template-columns: auto auto; @@ -37,13 +38,13 @@ export const SummaryItem = styled.div` export const SummaryItemLabel = styled.div` text-transform: capitalize; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; font-family: ${(props) => props.theme.fonts.bold}; font-size: 13px; `; export const SummaryItemValue = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; ${numericValueCSS}; max-width: 100px; overflow: hidden; @@ -90,7 +91,7 @@ export const FixedMessageContainerSpacer = styled.div` `; export const Message = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 14px; font-family: ${(props) => props.theme.fonts.bold}; flex-grow: 1; diff --git a/sections/exchange/TradeCard/Cards/CombinedMarketDetailsCard.tsx b/sections/exchange/TradeCard/Cards/CombinedMarketDetailsCard.tsx index a74036a47e..112c0d71f2 100644 --- a/sections/exchange/TradeCard/Cards/CombinedMarketDetailsCard.tsx +++ b/sections/exchange/TradeCard/Cards/CombinedMarketDetailsCard.tsx @@ -184,7 +184,7 @@ const Label = styled.div` `; const Value = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.mono}; `; diff --git a/sections/exchange/TradeCard/Cards/MarketDetailsCard.tsx b/sections/exchange/TradeCard/Cards/MarketDetailsCard.tsx index 5937860cb1..a210691db9 100644 --- a/sections/exchange/TradeCard/Cards/MarketDetailsCard.tsx +++ b/sections/exchange/TradeCard/Cards/MarketDetailsCard.tsx @@ -275,7 +275,7 @@ const Label = styled.div` `; const Value = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.mono}; `; diff --git a/sections/exchange/TradeCard/Charts/Types/CandlesticksChart.tsx b/sections/exchange/TradeCard/Charts/Types/CandlesticksChart.tsx index 5248634fe7..aaddc789b6 100644 --- a/sections/exchange/TradeCard/Charts/Types/CandlesticksChart.tsx +++ b/sections/exchange/TradeCard/Charts/Types/CandlesticksChart.tsx @@ -41,7 +41,7 @@ const CandlesticksChart: FC = ({ const fontStyle = { fontSize: '12px', - fill: theme.colors.white, + fill: theme.colors.selectedTheme.button.text, fontFamily: theme.fonts.mono, }; diff --git a/sections/exchange/TradeCard/Charts/common/ChartTypeTextsToggle.tsx b/sections/exchange/TradeCard/Charts/common/ChartTypeTextsToggle.tsx index b204e7c54e..1bbc0b1b15 100644 --- a/sections/exchange/TradeCard/Charts/common/ChartTypeTextsToggle.tsx +++ b/sections/exchange/TradeCard/Charts/common/ChartTypeTextsToggle.tsx @@ -69,9 +69,8 @@ export const CompareRatioToggle = styled(FlexDiv)` export const CompareRatioToggleType = styled.div<{ isActive: boolean }>` cursor: pointer; - font-weight: bold; border-bottom: 2px solid ${(props) => (props.isActive ? '#b68b58' : 'transparent')}; - color: ${(props) => (props.isActive ? props.theme.colors.white : 'inherit')}; + color: ${(props) => (props.isActive ? props.theme.colors.selectedTheme.button.text : 'inherit')}; text-transform: uppercase; `; diff --git a/sections/exchange/TradeCard/Charts/common/styles.ts b/sections/exchange/TradeCard/Charts/common/styles.ts index 6afbabfbc9..37444d3951 100644 --- a/sections/exchange/TradeCard/Charts/common/styles.ts +++ b/sections/exchange/TradeCard/Charts/common/styles.ts @@ -25,7 +25,7 @@ export const LinkTag = styled.span` export const CurrencyLabel = styled.div` font-size: 14px; text-transform: capitalize; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.bold}; display: flex; align-items: center; @@ -34,7 +34,7 @@ export const CurrencyLabel = styled.div` export const CurrencyPrice = styled.span` font-family: ${(props) => props.theme.fonts.mono}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; export const Actions = styled(FlexDiv)<{ reverseChildren?: boolean }>` @@ -62,12 +62,13 @@ export const ChartBody = styled.div<{ paddingTop?: string }>` export const StyledTextButton = styled(TextButton)<{ isActive: boolean; isDisabled: boolean }>` font-family: ${(props) => props.theme.fonts.bold}; - color: ${(props) => (props.isActive ? props.theme.colors.white : props.theme.colors.blueberry)}; + color: ${(props) => + props.isActive ? props.theme.colors.selectedTheme.button.text : props.theme.colors.blueberry}; opacity: ${(props) => (props.isDisabled ? 0.2 : 1)}; border-bottom: 2px solid ${(props) => (props.isActive ? props.theme.colors.goldColors.color1 : 'transparent')}; &:hover { - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; } `; @@ -80,7 +81,7 @@ export const TooltipContentStyle = styled.div` `; export const ItemStyle = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; padding: 3px 5px; `; @@ -95,7 +96,7 @@ export const OverlayMessage = styled(GridDivCenteredRow)` export const OverlayMessageTitle = styled.div` font-family: ${(props) => props.theme.fonts.bold}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 14px; padding-top: 10px; padding-bottom: 5px; @@ -112,7 +113,7 @@ export const OverlayTimer = styled.div` export const NoData = styled.div` font-size: 14px; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; export const CurrencyLabelWithDot = styled(CurrencyLabel)` diff --git a/sections/exchange/TradeCard/CurrencyCard/CurrencyCard.tsx b/sections/exchange/TradeCard/CurrencyCard/CurrencyCard.tsx index 7818580630..e458b3c8c2 100644 --- a/sections/exchange/TradeCard/CurrencyCard/CurrencyCard.tsx +++ b/sections/exchange/TradeCard/CurrencyCard/CurrencyCard.tsx @@ -220,7 +220,7 @@ const InputContainer = styled(FlexDivCol)` const InputLabel = styled.div` text-transform: capitalize; - color: ${(props) => props.theme.colors.common.primaryGold}; + color: ${(props) => props.theme.colors.selectedTheme.gold}; font-size: 14px; font-family: ${(props) => props.theme.fonts.regular}; line-height: 0.75em; @@ -249,7 +249,7 @@ const CurrencySelector = styled.div<{ font-size: 18px; line-height: 1em; font-family: ${(props) => props.theme.fonts.regular}; - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; svg { color: ${(props) => props.theme.colors.goldColors.color1}; } @@ -278,14 +278,14 @@ const CurrencySelector = styled.div<{ `; const CurrencyAmountContainer = styled.div<{ disableInput?: boolean }>` - background: ${(props) => props.theme.colors.inputGradient}; + background: ${(props) => props.theme.colors.selectedTheme.input.background}; border: ${(props) => props.theme.colors.selectedTheme.border}; box-sizing: border-box; - box-shadow: ${(props) => props.theme.colors.inputHighlight}; border-radius: 8px; height: 84px; width: 290px; position: relative; + ${(props) => props.disableInput && css` @@ -311,7 +311,7 @@ const CurrencyAmountValue = styled.div` line-height: 1.25em; width: 150px; overflow: hidden; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; const Slippage = styled.div` @@ -327,7 +327,7 @@ const CurrencyNameLabel = styled.div` font-size: 14px; font-family: ${(props) => props.theme.fonts.regular}; line-height: 1.25em; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; width: 180px; padding-left: 12px; `; @@ -345,7 +345,7 @@ const WalletBalanceLabel = styled.div` text-transform: capitalize; font-size: 13px; font-family: ${(props) => props.theme.fonts.regular}; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; `; const WalletBalance = styled.div<{ insufficientBalance: boolean }>` @@ -356,9 +356,9 @@ const WalletBalance = styled.div<{ insufficientBalance: boolean }>` ${(props) => props.insufficientBalance && css` - color: ${props.theme.colors.red}; + color: ${props.theme.colors.selectedTheme.red}; `} - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; const StyledLoader = styled(Loader)` diff --git a/sections/futures/CountdownTimer/CountdownTimer.tsx b/sections/futures/CountdownTimer/CountdownTimer.tsx index 2475823dc4..46aa07d220 100644 --- a/sections/futures/CountdownTimer/CountdownTimer.tsx +++ b/sections/futures/CountdownTimer/CountdownTimer.tsx @@ -70,7 +70,6 @@ const Container = styled.div` const CountdownTime = styled.div` font-family: ${(props) => props.theme.fonts.mono}; font-size: 34px; - font-weight: 300; color: #fff; line-height: 38px; margin-bottom: 12px; @@ -81,7 +80,7 @@ const FinishTime = styled.div` `; const ClosedLabel = styled(CountdownTime)` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.regular}; font-size: 30px; `; diff --git a/sections/futures/FeeInfoBox/FeeInfoBox.tsx b/sections/futures/FeeInfoBox/FeeInfoBox.tsx index 41e3ffbb12..deeb198673 100644 --- a/sections/futures/FeeInfoBox/FeeInfoBox.tsx +++ b/sections/futures/FeeInfoBox/FeeInfoBox.tsx @@ -56,7 +56,7 @@ const FeeInfoBox: React.FC = ({ ]); const ToolTip: FC = (props) => ( - = ({ > {props.children} - + ); const marketCostTooltip = ( @@ -132,7 +132,7 @@ const FeeInfoBox: React.FC = ({ sign: selectedPriceCurrency.sign, } ), - tooltip: dynamicFee?.gt(0) ? : null, + keyNode: dynamicFee?.gt(0) ? : null, }, } : { @@ -143,7 +143,7 @@ const FeeInfoBox: React.FC = ({ minDecimals: feeCost.lt(0.01) ? 4 : 2, }) : NO_VALUE, - tooltip: marketCostTooltip, + keyNode: marketCostTooltip, }, }), }} @@ -155,13 +155,20 @@ const StyledInfoBox = styled(InfoBox)` margin-bottom: 16px; `; +const DynamicStyledToolTip = styled(StyledTooltip)` + padding: 10px; +`; + const StyledDynamicFee = styled.span` - color: ${(props) => props.theme.colors.yellow}; + color: ${(props) => props.theme.colors.selectedTheme.gold}; margin-left: 5px; `; const StyledTimerIcon = styled(TimerIcon)` margin-left: 5px; + path { + fill: ${(props) => props.theme.colors.selectedTheme.gold}; + } `; export default FeeInfoBox; diff --git a/sections/futures/Hero/Hero.tsx b/sections/futures/Hero/Hero.tsx index d1cbb150e3..350f224417 100644 --- a/sections/futures/Hero/Hero.tsx +++ b/sections/futures/Hero/Hero.tsx @@ -127,7 +127,7 @@ const StyledBodyText = styled.div` const StyledBodySubtitle = styled(StyledBodyText)` font-family: ${(props) => props.theme.fonts.bold}; margin-bottom: 20px; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; const StyledCardRow = styled(FlexDivRowCentered)``; diff --git a/sections/futures/LeverageInput/LeverageInput.tsx b/sections/futures/LeverageInput/LeverageInput.tsx index 980e52b105..f43ddd46e9 100644 --- a/sections/futures/LeverageInput/LeverageInput.tsx +++ b/sections/futures/LeverageInput/LeverageInput.tsx @@ -117,12 +117,12 @@ const LeverageRow = styled(FlexDivRow)` `; const LeverageTitle = styled.div` - font-size: 12px; - color: ${(props) => props.theme.colors.common.primaryWhite}; + font-size: 13px; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; text-transform: capitalize; span { - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; } `; @@ -141,23 +141,24 @@ const LeverageInputContainer = styled.div` const LeverageButton = styled(Button)` padding: 0; - font-weight: 700; font-size: 13px; + height: 46px; + font-family: ${(props) => props.theme.fonts.monoBold}; `; const TextButton = styled.button` text-decoration: underline; - font-size: 11px; + font-size: 13px; line-height: 11px; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; background-color: transparent; border: none; cursor: pointer; `; const LeverageDisclaimer = styled.div` - font-size: 12px; - color: ${(props) => props.theme.colors.common.secondaryGray}; + font-size: 13px; + color: ${(props) => props.theme.colors.selectedTheme.gray}; margin: 0 8px 12px; `; diff --git a/sections/futures/LeverageSlider/LeverageSlider.tsx b/sections/futures/LeverageSlider/LeverageSlider.tsx index 624ad4ac2f..9772579fef 100644 --- a/sections/futures/LeverageSlider/LeverageSlider.tsx +++ b/sections/futures/LeverageSlider/LeverageSlider.tsx @@ -48,7 +48,7 @@ const StyledSlider = styled(Slider)<{ $currentMark: number }>` props.$currentMark === props.minValue && css` &:nth-child(5) { - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; } `} @@ -57,7 +57,7 @@ const StyledSlider = styled(Slider)<{ $currentMark: number }>` props.$currentMark === props.maxValue && css` &:nth-child(7) { - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; } `} } diff --git a/sections/futures/MarketDetails/MarketDetails.tsx b/sections/futures/MarketDetails/MarketDetails.tsx index 01841adf9c..07351a4e9f 100644 --- a/sections/futures/MarketDetails/MarketDetails.tsx +++ b/sections/futures/MarketDetails/MarketDetails.tsx @@ -6,7 +6,6 @@ import { CurrencyKey } from '@synthetixio/contracts-interface'; import useSelectedPriceCurrency from 'hooks/useSelectedPriceCurrency'; import useGetFuturesMarkets from 'queries/futures/useGetFuturesMarkets'; import useGetFuturesTradingVolume from 'queries/futures/useGetFuturesTradingVolume'; - import { FuturesMarket } from 'queries/futures/types'; import { isFiatCurrency } from 'utils/currencies'; import { formatCurrency, formatPercent, zeroBN } from 'utils/formatters/number'; @@ -93,74 +92,126 @@ const MarketDetails: React.FC = ({ baseCurrencyKey }) => { const pastPrice = dailyPriceChanges.find((price: Price) => price.synth === baseCurrencyKey); + const assetName = baseCurrencyKey ? `${getDisplayAsset(baseCurrencyKey)}-PERP` : ''; + const fundingTitle = React.useMemo( + () => + `${ + fundingRateQuery.failureCount > 0 && !avgFundingRate && !!marketSummary ? 'Inst.' : '1H' + } Funding Rate`, + [fundingRateQuery, avgFundingRate, marketSummary] + ); + + const enableTooltip = (key: string, children: React.ReactElement) => { + switch (key) { + case 'External Price': + return ( + + {children} + + ); + case '24H Change': + return ( + + {children} + + ); + case '24H Volume': + return ( + + {children} + + ); + case '24H Trades': + return ( + + {children} + + ); + case 'Open Interest': + return ( + + {children} + + ); + case assetName: + return ( + + {children} + + ); + case fundingTitle: + return ( + + {children} + + ); + default: + return children; + } + }; + const data: MarketData = React.useMemo(() => { - const fundingTitle = `${ - fundingRateQuery.failureCount > 0 && !avgFundingRate && !!marketSummary ? 'Inst.' : '1H' - } Funding Rate`; const fundingValue = fundingRateQuery.failureCount > 0 && !avgFundingRate && !!marketSummary ? marketSummary?.currentFundingRate : avgFundingRate; return { - [baseCurrencyKey ? `${getDisplayAsset(baseCurrencyKey)}-PERP` : '']: { + [assetName]: { value: formatCurrency(selectedPriceCurrency.name, basePriceRate, { sign: '$', minDecimals, - }) && lastOracleUpdateTime ? ( - - - {formatCurrency(selectedPriceCurrency.name, basePriceRate, { - sign: '$', - minDecimals, - })} - - - ) : ( - NO_VALUE - ), + }) && lastOracleUpdateTime + ? formatCurrency(selectedPriceCurrency.name, basePriceRate, { + sign: '$', + minDecimals, + }) + : NO_VALUE, }, 'External Price': { value: - externalPrice === 0 ? ( - '-' - ) : ( - - - {formatCurrency(selectedPriceCurrency.name, externalPrice, { - sign: '$', - minDecimals, - })} - - - ), + externalPrice === 0 + ? '-' + : formatCurrency(selectedPriceCurrency.name, externalPrice, { + sign: '$', + minDecimals, + }), }, '24H Change': { value: - marketSummary?.price && pastPrice?.price ? ( - - - {`${formatCurrency( - selectedPriceCurrency.name, - marketSummary?.price.sub(pastPrice?.price) ?? zeroBN, - { sign: '$', minDecimals } - )} (${formatPercent( - marketSummary?.price.sub(pastPrice?.price).div(marketSummary?.price) ?? zeroBN - )})`} - - - ) : ( - NO_VALUE - ), + marketSummary?.price && pastPrice?.price + ? `${formatCurrency( + selectedPriceCurrency.name, + marketSummary?.price.sub(pastPrice?.price) ?? zeroBN, + { sign: '$', minDecimals } + )} (${formatPercent( + marketSummary?.price.sub(pastPrice?.price).div(marketSummary?.price) ?? zeroBN + )})` + : NO_VALUE, color: marketSummary?.price && pastPrice?.price ? marketSummary?.price.sub(pastPrice?.price).gt(zeroBN) @@ -171,85 +222,26 @@ const MarketDetails: React.FC = ({ baseCurrencyKey }) => { : undefined, }, '24H Volume': { - value: !!futuresTradingVolume ? ( - - - {formatCurrency(selectedPriceCurrency.name, futuresTradingVolume ?? zeroBN, { - sign: '$', - })} - - - ) : ( - NO_VALUE - ), + value: !!futuresTradingVolume + ? formatCurrency(selectedPriceCurrency.name, futuresTradingVolume ?? zeroBN, { + sign: '$', + }) + : NO_VALUE, }, '24H Trades': { - value: !!futuresDailyTradeStats ? ( - - {`${futuresDailyTradeStats ?? 0}`} - - ) : ( - NO_VALUE - ), + value: !!futuresDailyTradeStats ? `${futuresDailyTradeStats ?? 0}` : NO_VALUE, }, 'Open Interest': { - value: marketSummary?.marketSize?.mul(wei(basePriceRate)) ? ( - - - {formatCurrency( - selectedPriceCurrency.name, - marketSummary?.marketSize?.mul(wei(basePriceRate)).toNumber(), - { sign: '$' } - )} - - - ) : ( - NO_VALUE - ), + ) + : NO_VALUE, }, [fundingTitle]: { - value: fundingValue ? ( - - - {formatPercent(fundingValue ?? zeroBN, { minDecimals: 6 })} - - - ) : ( - NO_VALUE - ), + value: fundingValue ? formatPercent(fundingValue ?? zeroBN, { minDecimals: 6 }) : NO_VALUE, color: fundingValue?.gt(zeroBN) ? 'green' : fundingValue?.lt(zeroBN) ? 'red' : undefined, }, }; @@ -276,27 +268,41 @@ const MarketDetails: React.FC = ({ baseCurrencyKey }) => { {Object.entries(data).map(([key, { value, color }]) => { const colorClass = color || ''; - return ( - - {key} - {value} - + return enableTooltip( + key, + + + {key} + {value} + + ); })} ); }; +// Extend type of cursor to accept different style of cursor. Currently accept only 'help' +const WithCursor = styled.div<{ cursor: 'help' }>` + cursor: ${(props) => props.cursor}; +`; + const OneHrFundingRateTooltip = styled(StyledTooltip)` - bottom: -145px; + bottom: -115px; z-index: 2; left: -200px; + padding: 10px; +`; + +const MarketDetailsTooltip = styled(StyledTooltip)` + z-index: 2; + padding: 10px; `; const MarketDetailsContainer = styled.div` width: 100%; height: 55px; - padding: 12px 45px 10px 15px; + padding: 10px 45px 10px 15px; margin-bottom: 16px; box-sizing: border-box; @@ -315,32 +321,26 @@ const MarketDetailsContainer = styled.div` } .heading { - font-size: 12px; - color: ${(props) => props.theme.colors.common.secondaryGray}; + font-size: 13px; + color: ${(props) => props.theme.colors.selectedTheme.text.title}; } .value { font-family: ${(props) => props.theme.fonts.mono}; - font-size: 12px; - color: ${(props) => props.theme.colors.common.primaryWhite}; + font-size: 13px; + color: ${(props) => props.theme.colors.selectedTheme.text.value}; } .green { - color: ${(props) => props.theme.colors.common.primaryGreen}; + color: ${(props) => props.theme.colors.selectedTheme.green}; } .red { - color: ${(props) => props.theme.colors.common.primaryRed}; + color: ${(props) => props.theme.colors.selectedTheme.red}; } .paused { - color: ${(props) => props.theme.colors.common.secondaryGray}; - } -`; - -export const HoverTransform = styled.div` - :hover { - transform: scale(1.03); + color: ${(props) => props.theme.colors.selectedTheme.gray}; } `; diff --git a/sections/futures/MarketInfo/MarketInfo.tsx b/sections/futures/MarketInfo/MarketInfo.tsx index fce7f74101..87f7a42d97 100644 --- a/sections/futures/MarketInfo/MarketInfo.tsx +++ b/sections/futures/MarketInfo/MarketInfo.tsx @@ -64,6 +64,7 @@ const MarketInfo: FC = ({ position={position} openOrders={openOrders} refetch={refetch} + potentialTrade={potentialTrade} /> ); diff --git a/sections/futures/MarketInfoBox/MarketInfoBox.tsx b/sections/futures/MarketInfoBox/MarketInfoBox.tsx index 5a3f807f16..926103b9e7 100644 --- a/sections/futures/MarketInfoBox/MarketInfoBox.tsx +++ b/sections/futures/MarketInfoBox/MarketInfoBox.tsx @@ -1,38 +1,166 @@ -import React from 'react'; +import React, { useMemo } from 'react'; import styled from 'styled-components'; -import Wei from '@synthetixio/wei'; +import Wei, { wei } from '@synthetixio/wei'; import InfoBox from 'components/InfoBox'; -import { formatCurrency, formatPercent } from 'utils/formatters/number'; -import { Synths } from '@synthetixio/contracts-interface'; +import { formatCurrency, formatPercent, zeroBN } from 'utils/formatters/number'; +import { CurrencyKey, Synths } from '@synthetixio/contracts-interface'; +import { PositionSide, PotentialTrade } from '../types'; +import PreviewArrow from 'components/PreviewArrow'; +import useGetFuturesPotentialTradeDetails from 'queries/futures/useGetFuturesPotentialTradeDetails'; +import { FuturesPosition, FuturesPotentialTradeDetails } from 'queries/futures/types'; +import useGetNextPriceDetails from 'queries/futures/useGetNextPriceDetails'; +import { computeNPFee } from 'utils/costCalculations'; +import { getMarketKey } from 'utils/futures'; +import { useRecoilValue } from 'recoil'; +import { networkState } from 'store/wallet'; type MarketInfoBoxProps = { - totalMargin: Wei; - availableMargin: Wei; - buyingPower: Wei; - marginUsage: Wei; + position: FuturesPosition | null; isMarketClosed: boolean; + potentialTrade: PotentialTrade | null; + marketMaxLeverage: Wei | undefined; + currencyKey: string; + tradeSize: Wei; + side: PositionSide; + orderType: number; }; const MarketInfoBox: React.FC = ({ - totalMargin, - availableMargin, - buyingPower, - marginUsage, + position, isMarketClosed, + potentialTrade, + marketMaxLeverage, + currencyKey, + tradeSize, + side, + orderType, }) => { + const network = useRecoilValue(networkState); + const totalMargin = position?.remainingMargin ?? zeroBN; + const availableMargin = position?.accessibleMargin ?? zeroBN; + const buyingPower = + position && position?.accessibleMargin.gt(zeroBN) + ? position?.accessibleMargin?.mul(marketMaxLeverage ?? zeroBN) + : zeroBN; + + const marginUsage = + position && position?.remainingMargin.gt(zeroBN) + ? position?.remainingMargin?.sub(position?.accessibleMargin).div(position?.remainingMargin) + : zeroBN; + + const potentialTradeDetails = useGetFuturesPotentialTradeDetails( + currencyKey as CurrencyKey, + potentialTrade + ); + + const previewTrade = potentialTradeDetails.data ?? null; + const isNextPriceOrder = orderType === 1; + const nextPriceDetailsQuery = useGetNextPriceDetails(getMarketKey(currencyKey, network.id)); + const nextPriceDetails = nextPriceDetailsQuery?.data; + + const positionSize = position?.position?.size ? wei(position?.position?.size) : zeroBN; + const orderDetails = useMemo(() => { + const newSize = side === PositionSide.LONG ? tradeSize : -tradeSize; + return { newSize, size: (positionSize ?? zeroBN).add(newSize).abs() }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [side, positionSize]); + + const { commitDeposit } = useMemo( + () => computeNPFee(nextPriceDetails, wei(orderDetails.newSize)), + [nextPriceDetails, orderDetails] + ); + + const totalDeposit = useMemo(() => { + return (commitDeposit ?? zeroBN).add(nextPriceDetails?.keeperDeposit ?? zeroBN); + }, [commitDeposit, nextPriceDetails?.keeperDeposit]); + + const getPotentialAvailableMargin = ( + previewTrade: FuturesPotentialTradeDetails | null, + marketMaxLeverage: Wei | undefined + ) => { + let inaccessible; + + inaccessible = previewTrade?.notionalValue.div(marketMaxLeverage).abs() ?? zeroBN; + + // If the user has a position open, we'll enforce a min initial margin requirement. + if (inaccessible.gt(0)) { + if (inaccessible.lt(previewTrade?.minInitialMargin ?? zeroBN)) { + inaccessible = previewTrade?.minInitialMargin ?? zeroBN; + } + } + + // check if available margin will be less than 0 + return previewTrade?.margin?.sub(inaccessible).gt(0) + ? previewTrade?.margin?.sub(inaccessible).abs() + : zeroBN; + }; + + const previewAvailableMargin = React.useMemo(() => { + const potentialAvailableMargin = getPotentialAvailableMargin(previewTrade, marketMaxLeverage); + return isNextPriceOrder + ? potentialAvailableMargin?.sub(totalDeposit) ?? zeroBN + : potentialAvailableMargin; + }, [previewTrade, marketMaxLeverage, isNextPriceOrder, totalDeposit]); + + const previewTradeData = React.useMemo(() => { + const size = wei(potentialTrade?.size || zeroBN); + const potentialMarginUsage = + previewTrade?.margin?.sub(previewAvailableMargin)?.div(previewTrade?.margin)?.abs() ?? zeroBN; + const potentialBuyingPower = + previewAvailableMargin?.mul(marketMaxLeverage ?? zeroBN)?.abs() ?? zeroBN; + + return { + showPreview: size && !size.eq(0), + totalMargin: previewTrade?.margin || zeroBN, + availableMargin: previewAvailableMargin.gt(0) ? previewAvailableMargin : zeroBN, + buyingPower: potentialBuyingPower.gt(0) ? potentialBuyingPower : zeroBN, + marginUsage: potentialMarginUsage.gt(1) ? wei(1) : potentialMarginUsage, + }; + }, [potentialTrade?.size, previewTrade?.margin, previewAvailableMargin, marketMaxLeverage]); + return ( + {formatCurrency(Synths.sUSD, previewTradeData?.availableMargin, { + sign: '$', + })} + + ), + }, + 'Buying Power': { + value: `${formatCurrency(Synths.sUSD, buyingPower, { + currencyKey: undefined, + sign: '$', })}`, + valueNode: previewTradeData?.buyingPower && ( + + {formatCurrency(Synths.sUSD, previewTradeData?.buyingPower, { + sign: '$', + })} + + ), + }, + 'Margin Usage': { + value: `${formatPercent(marginUsage)}`, + valueNode: ( + + {formatPercent(previewTradeData?.marginUsage)} + + ), }, - 'Buying Power': { value: `${formatCurrency(Synths.sUSD, buyingPower, { sign: '$' })}` }, - 'Margin Usage': { value: `${formatPercent(marginUsage)}` }, }} disabled={isMarketClosed} /> @@ -41,6 +169,10 @@ const MarketInfoBox: React.FC = ({ const StyledInfoBox = styled(InfoBox)` margin-bottom: 16px; + + .value { + font-family: ${(props) => props.theme.fonts.regular}; + } `; export default MarketInfoBox; diff --git a/sections/futures/MarketOverlay/MarketOverlay.tsx b/sections/futures/MarketOverlay/MarketOverlay.tsx index 7da3c07314..b0250a4e73 100644 --- a/sections/futures/MarketOverlay/MarketOverlay.tsx +++ b/sections/futures/MarketOverlay/MarketOverlay.tsx @@ -68,7 +68,6 @@ const OverlayContent = styled.div` justify-content: center; align-items: center; height: 100%; - font-weight: 700; `; const AssetsImage = styled.img` @@ -82,7 +81,7 @@ const StyledSvg = styled(PausedIcon)` const StyledText = styled.div` font-family: ${(props) => props.theme.fonts.regular}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 24px; padding-bottom: 10px; `; diff --git a/sections/futures/Markets/Markets.tsx b/sections/futures/Markets/Markets.tsx index ddfd3b349e..98e6a961eb 100644 --- a/sections/futures/Markets/Markets.tsx +++ b/sections/futures/Markets/Markets.tsx @@ -108,7 +108,7 @@ const StyledTableHeader = styled.div` `; const StyledMarketName = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.bold}; font-size: 12px; margin-left: 10px; diff --git a/sections/futures/OrderSizing/OrderSizing.tsx b/sections/futures/OrderSizing/OrderSizing.tsx index b54653e8a3..7b8474b926 100644 --- a/sections/futures/OrderSizing/OrderSizing.tsx +++ b/sections/futures/OrderSizing/OrderSizing.tsx @@ -80,11 +80,11 @@ const OrderSizingContainer = styled.div` `; const OrderSizingTitle = styled.div` - color: ${(props) => props.theme.colors.common.primaryWhite}; - font-size: 12px; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; + font-size: 13px; span { - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; } `; @@ -97,9 +97,9 @@ const OrderSizingRow = styled(FlexDivRow)` const MaxButton = styled.button` text-decoration: underline; - font-size: 11px; + font-size: 13px; line-height: 11px; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; background-color: transparent; border: none; cursor: pointer; diff --git a/sections/futures/Orders/Orders.tsx b/sections/futures/Orders/Orders.tsx index 5b19642588..39acb77593 100644 --- a/sections/futures/Orders/Orders.tsx +++ b/sections/futures/Orders/Orders.tsx @@ -232,7 +232,7 @@ export default Orders; const BoldTableText = css` font-family: ${(props) => props.theme.fonts.bold}; font-size: 12px; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; text-transform: capitalize; `; diff --git a/sections/futures/PositionButtons/PositionButtons.tsx b/sections/futures/PositionButtons/PositionButtons.tsx index 3948c35aa4..f31cea85c3 100644 --- a/sections/futures/PositionButtons/PositionButtons.tsx +++ b/sections/futures/PositionButtons/PositionButtons.tsx @@ -55,7 +55,6 @@ const PositionButtonsContainer = styled.div` const StyledPositionButton = styled(Button)` font-size: 16px; height: 55px; - transition: all 0.1s ease-in-out; &:active { transform: scale(0.96); @@ -69,10 +68,10 @@ const StyledPositionButton = styled(Button)` ${(props) => props.$position === PositionSide.LONG && css` - color: ${props.theme.colors.common.primaryGreen}; + color: ${props.theme.colors.selectedTheme.green}; ${props.$isActive && css` - border: 1px solid rgba(127, 212, 130, 0.7); + border: 1px solid ${(props) => props.theme.colors.selectedTheme.green}; border-radius: 11px; background: linear-gradient( 180deg, @@ -80,6 +79,7 @@ const StyledPositionButton = styled(Button)` rgba(71, 122, 73, 0.05) 100% ); box-shadow: rgb(127 212 130 / 50%) 0px 0 3px; + &::before { display: none; } @@ -96,7 +96,7 @@ const StyledPositionButton = styled(Button)` ${(props) => props.$position === PositionSide.SHORT && css` - color: ${props.theme.colors.common.primaryRed}; + color: ${props.theme.colors.selectedTheme.red}; ${props.$isActive && css` border: 1px solid rgba(239, 104, 104, 0.7); @@ -119,11 +119,11 @@ const StyledPositionButton = styled(Button)` `}; `}; - ${(props) => + /* ${(props) => props.$isActive && css` text-shadow: ${props.theme.colors.selectedTheme.button.active.textShadow}; - `}; + `}; */ `; export default PositionButtons; diff --git a/sections/futures/PositionCard/ClosePositionModal.tsx b/sections/futures/PositionCard/ClosePositionModal.tsx index f96470b5b1..d749924c8c 100644 --- a/sections/futures/PositionCard/ClosePositionModal.tsx +++ b/sections/futures/PositionCard/ClosePositionModal.tsx @@ -102,29 +102,33 @@ const ClosePositionModal: FC = ({ if (!position || !currencyKey) return []; return [ { - label: t('futures.market.user.position.modal-close.side'), + label: t('futures.market.user.position.modal.order-type'), + value: t('futures.market.user.position.modal.market-order'), + }, + { + label: t('futures.market.user.position.modal.side'), value: (position?.side ?? PositionSide.LONG).toUpperCase(), }, { - label: t('futures.market.user.position.modal-close.size'), + label: t('futures.market.user.position.modal.size'), value: formatCurrency(currencyKey || '', position?.size ?? zeroBN, { sign: synthToAsset(currencyKey as CurrencyKey), }), }, { - label: t('futures.market.user.position.modal-close.leverage'), + label: t('futures.market.user.position.modal.leverage'), value: `${formatNumber(position?.leverage ?? zeroBN)}x`, }, { - label: t('futures.market.user.position.modal-close.ROI'), + label: t('futures.market.user.position.modal.ROI'), value: formatCurrency(Synths.sUSD, position?.roi ?? zeroBN, { sign: '$' }), }, { - label: t('futures.market.user.position.modal-close.fee'), + label: t('futures.market.user.position.modal.fee'), value: formatCurrency(Synths.sUSD, orderFee, { sign: '$' }), }, { - label: t('futures.market.user.position.modal-close.gas-fee'), + label: t('futures.market.user.position.modal.gas-fee'), value: formatCurrency(selectedPriceCurrency.name as CurrencyKey, transactionFee ?? zeroBN, { sign: '$', }), @@ -150,7 +154,7 @@ const ClosePositionModal: FC = ({ <> {dataRows.map(({ label, value }, i) => ( @@ -168,7 +172,7 @@ const ClosePositionModal: FC = ({ onClick={() => closeTxn.mutate()} disabled={!!error || !!closeTxn.errorMessage} > - {error || closeTxn.errorMessage || t('futures.market.user.position.modal-close.title')} + {error || closeTxn.errorMessage || t('futures.market.user.position.modal.title')} > @@ -192,7 +196,7 @@ const Row = styled(FlexDivCentered)` const Label = styled.div` font-family: ${(props) => props.theme.fonts.regular}; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; font-size: 12px; text-transform: capitalize; margin-top: 6px; @@ -200,7 +204,7 @@ const Label = styled.div` const Value = styled.div` font-family: ${(props) => props.theme.fonts.mono}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 12px; margin-top: 6px; `; diff --git a/sections/futures/PositionCard/PositionCard.tsx b/sections/futures/PositionCard/PositionCard.tsx index 957267190c..2dc7370ebe 100644 --- a/sections/futures/PositionCard/PositionCard.tsx +++ b/sections/futures/PositionCard/PositionCard.tsx @@ -1,10 +1,9 @@ -import React from 'react'; +import React, { useMemo } from 'react'; import styled, { css } from 'styled-components'; import { FlexDivCol } from 'styles/common'; import { useTranslation } from 'react-i18next'; import StyledTooltip from 'components/Tooltip/StyledTooltip'; -import { HoverTransform } from '../MarketDetails/MarketDetails'; import useSelectedPriceCurrency from 'hooks/useSelectedPriceCurrency'; import { formatCurrency, formatPercent, zeroBN } from 'utils/formatters/number'; import { isFiatCurrency } from 'utils/currencies'; @@ -22,11 +21,15 @@ import useGetFuturesMarkets from 'queries/futures/useGetFuturesMarkets'; import useLaggedDailyPrice from 'queries/rates/useLaggedDailyPrice'; import { Price } from 'queries/rates/types'; import { DEFAULT_FIAT_EURO_DECIMALS } from 'constants/defaults'; +import { PotentialTrade } from '../types'; +import useGetFuturesPotentialTradeDetails from 'queries/futures/useGetFuturesPotentialTradeDetails'; +import PreviewArrow from 'components/PreviewArrow'; type PositionCardProps = { currencyKey: string; position: FuturesPosition | null; currencyKeyRate: number; + potentialTrade: PotentialTrade | null; onPositionClose?: () => void; dashboard?: boolean; }; @@ -51,7 +54,23 @@ type PositionData = { avgEntryPrice: string | JSX.Element; }; -const PositionCard: React.FC = ({ currencyKey, position, currencyKeyRate }) => { +type PositionPreviewData = { + sizeIsNotZero: boolean; + positionSide: string; + positionSize: Wei; + leverage: Wei; + liquidationPrice: Wei; + avgEntryPrice: Wei; + notionalValue: Wei; + showStatus: boolean; +}; + +const PositionCard: React.FC = ({ + currencyKey, + position, + currencyKeyRate, + potentialTrade, +}) => { const { t } = useTranslation(); const positionDetails = position?.position ?? null; const futuresPositionsQuery = useGetFuturesPositionForAccount(); @@ -78,11 +97,54 @@ const PositionCard: React.FC = ({ currencyKey, position, curr futuresMarketsQuery?.data?.map(({ asset }) => asset) ?? [] ); + const potentialTradeDetails = useGetFuturesPotentialTradeDetails( + currencyKey as CurrencyKey, + potentialTrade + ); + + const previewTradeData = potentialTradeDetails.data ?? null; + + const modifiedAverage = useMemo(() => { + if (positionHistory && potentialTradeDetails.data && potentialTrade) { + const totalSize = positionHistory.size.add(potentialTrade.size); + + const existingValue = positionHistory.avgEntryPrice.mul(positionHistory.size); + const newValue = potentialTradeDetails.data.price.mul(potentialTrade.size); + const totalValue = existingValue.add(newValue); + return totalValue.div(totalSize); + } + return null; + }, [positionHistory, potentialTradeDetails.data, potentialTrade]); + + const previewData: PositionPreviewData = React.useMemo(() => { + if (positionDetails === null || previewTradeData === null) { + return {} as PositionPreviewData; + } + + const size: Wei = previewTradeData?.size; + const newSide = size?.gt(zeroBN) ? PositionSide.LONG : PositionSide.SHORT; + + return { + sizeIsNotZero: size && !size?.eq(0), + positionSide: newSide, + positionSize: size?.abs(), + notionalValue: previewTradeData.notionalValue, + leverage: previewTradeData.notionalValue.div(previewTradeData.margin), + liquidationPrice: previewTradeData.liqPrice, + avgEntryPrice: modifiedAverage || zeroBN, + showStatus: previewTradeData.showStatus, + }; + }, [positionDetails, previewTradeData, modifiedAverage]); + const data: PositionData = React.useMemo(() => { const pnl = positionDetails?.profitLoss.add(positionDetails?.accruedFunding) ?? zeroBN; + const pnlPct = pnl.abs().gt(0) ? pnl.div(positionDetails?.initialMargin) : zeroBN; const realizedPnl = positionHistory?.pnl.add(positionHistory?.netFunding).sub(positionHistory?.feesPaid) ?? zeroBN; + const realizedPnlPct = realizedPnl.abs().gt(0) + ? realizedPnl.div(positionHistory?.initialMargin.add(positionHistory?.totalDeposits)) + : zeroBN; const netFunding = positionDetails?.accruedFunding.add(positionHistory?.netFunding ?? zeroBN) ?? zeroBN; const lastPriceWei = wei(currencyKeyRate) ?? zeroBN; @@ -102,157 +164,145 @@ const PositionCard: React.FC = ({ currencyKey, position, curr }), price24h: lastPriceWei.sub(pastPriceWei), positionSide: positionDetails ? ( - - - - {positionDetails.side === 'long' ? PositionSide.LONG : PositionSide.SHORT} - - - + + {previewData.positionSide} + + + )} + ) : ( {NO_VALUE} ), positionSize: positionDetails ? ( - - - {`${formatNumber(positionDetails.size ?? 0, { - minDecimals: positionDetails.size.abs().lt(0.01) ? 4 : 2, - })} (${formatCurrency(Synths.sUSD, positionDetails.notionalValue.abs() ?? zeroBN, { + <> + {`${formatNumber(positionDetails.size ?? 0, { + minDecimals: positionDetails.size.abs().lt(0.01) ? 4 : 2, + })} (${formatCurrency(Synths.sUSD, positionDetails.notionalValue?.abs() ?? zeroBN, { + sign: '$', + minDecimals: positionDetails.notionalValue?.abs()?.lt(0.01) ? 4 : 2, + })})`} + + {`${formatNumber(previewData.positionSize ?? 0, { + minDecimals: 2, + })} (${formatCurrency(Synths.sUSD, previewData.notionalValue?.abs() ?? zeroBN, { sign: '$', - minDecimals: positionDetails.notionalValue.abs().lt(0.01) ? 4 : 2, + minDecimals: 2, })})`} - - + + > ) : ( NO_VALUE ), leverage: positionDetails ? ( - - {formatNumber(positionDetails?.leverage ?? zeroBN) + 'x'} - + <> + {formatNumber(positionDetails?.leverage ?? zeroBN) + 'x'} + { + + {formatNumber(previewData?.leverage ?? zeroBN) + 'x'} + + } + > ) : ( NO_VALUE ), liquidationPrice: positionDetails ? ( - - - {formatCurrency(Synths.sUSD, positionDetails?.liquidationPrice ?? zeroBN, { - sign: '$', - minDecimals, - })} - - + <> + {formatCurrency(Synths.sUSD, positionDetails?.liquidationPrice ?? zeroBN, { + sign: '$', + minDecimals, + })} + { + + {formatCurrency(Synths.sUSD, previewData?.liquidationPrice ?? zeroBN, { + sign: '$', + minDecimals, + })} + + } + > ) : ( NO_VALUE ), pnl: pnl ?? NO_VALUE, realizedPnl: realizedPnl, pnlText: - positionDetails && pnl ? ( - - - {`${formatCurrency(Synths.sUSD, pnl, { - sign: '$', - minDecimals: pnl.abs().lt(0.01) ? 4 : 2, - })} (${formatPercent(pnl.div(positionDetails.initialMargin))})`} - - - ) : ( - NO_VALUE - ), + positionDetails && pnl + ? `${formatCurrency(Synths.sUSD, pnl, { + sign: '$', + minDecimals: pnl.abs().lt(0.01) ? 4 : 2, + })} (${formatPercent(pnlPct)})` + : NO_VALUE, realizedPnlText: - positionHistory && realizedPnl ? ( - - - {`${formatCurrency(Synths.sUSD, realizedPnl, { - sign: '$', - minDecimals: 2, - })}`} - - - ) : ( - NO_VALUE - ), + positionHistory && realizedPnl + ? `${formatCurrency(Synths.sUSD, realizedPnl, { + sign: '$', + minDecimals: realizedPnl.abs().lt(0.01) ? 4 : 2, + })} (${formatPercent(realizedPnlPct)})` + : NO_VALUE, netFunding: netFunding, - netFundingText: netFunding ? ( - - {`${formatCurrency(Synths.sUSD, netFunding, { + netFundingText: netFunding + ? `${formatCurrency(Synths.sUSD, netFunding, { sign: '$', minDecimals: netFunding.abs().lt(0.01) ? 4 : 2, - })}`} - - ) : null, - fees: positionDetails ? ( - - - {formatCurrency(Synths.sUSD, positionHistory?.feesPaid ?? zeroBN, { - sign: '$', - })} - - - ) : ( - NO_VALUE - ), + })}` + : null, + fees: positionDetails + ? formatCurrency(Synths.sUSD, positionHistory?.feesPaid ?? zeroBN, { + sign: '$', + }) + : NO_VALUE, avgEntryPrice: positionDetails ? ( - - - {formatCurrency(Synths.sUSD, positionHistory?.entryPrice ?? zeroBN, { - sign: '$', - minDecimals, - })} - - + <> + {formatCurrency(Synths.sUSD, positionHistory?.entryPrice ?? zeroBN, { + sign: '$', + minDecimals, + })} + { + + {formatCurrency(Synths.sUSD, previewData.avgEntryPrice ?? zeroBN, { + sign: '$', + minDecimals, + })} + + } + > ) : ( NO_VALUE ), }; }, [ - currencyKey, - currencyKeyRate, - minDecimals, positionDetails, positionHistory, + currencyKeyRate, + dailyPriceChangesQuery?.data, + currencyKey, synthsMap, - dailyPriceChangesQuery, t, + previewData.positionSide, + previewData.sizeIsNotZero, + previewData.showStatus, + previewData.positionSize, + previewData.notionalValue, + previewData?.leverage, + previewData?.liquidationPrice, + previewData.avgEntryPrice, + minDecimals, ]); return ( @@ -264,18 +314,42 @@ const PositionCard: React.FC = ({ currencyKey, position, curr {data.marketPrice} - {t('futures.market.position-card.position-side')} + + + {t('futures.market.position-card.position-side')} + + {data.positionSide} - {t('futures.market.position-card.position-size')} + + + {t('futures.market.position-card.position-size')} + + {data.positionSize} - {t('futures.market.position-card.net-funding')} + + + {t('futures.market.position-card.net-funding')} + + {positionDetails ? ( = ({ currencyKey, position, curr )} - {t('futures.market.position-card.r-pnl')} + + + {t('futures.market.position-card.u-pnl')} + + + {positionDetails ? ( + zeroBN ? 'green' : data.pnl < zeroBN ? 'red' : ''}> + {data.pnlText} + + ) : ( + {NO_VALUE} + )} + + + + + {t('futures.market.position-card.r-pnl')} + + {positionDetails ? ( = ({ currencyKey, position, curr {NO_VALUE} )} - - {t('futures.market.position-card.liquidation-price')} - {data.liquidationPrice} - - {t('futures.market.position-card.leverage')} + + + {t('futures.market.position-card.leverage')} + + {data.leverage} - {t('futures.market.position-card.u-pnl')} - {positionDetails ? ( - zeroBN ? 'green' : data.pnl < zeroBN ? 'red' : ''}> - {data.pnlText} - - ) : ( - {NO_VALUE} - )} + + + {t('futures.market.position-card.liquidation-price')} + + + {data.liquidationPrice} - {t('futures.market.position-card.avg-entry-price')} + + + {t('futures.market.position-card.avg-entry-price')} + + {data.avgEntryPrice} @@ -365,20 +479,29 @@ const InfoRow = styled.div` padding-bottom: 0; } .green { - color: ${(props) => props.theme.colors.common.primaryGreen}; + color: ${(props) => props.theme.colors.selectedTheme.green}; } .red { - color: ${(props) => props.theme.colors.common.primaryRed}; + color: ${(props) => props.theme.colors.selectedTheme.red}; } `; const StyledSubtitle = styled.p` - font-family: ${(props) => props.theme.fonts.mono}; + font-family: ${(props) => props.theme.fonts.regular}; + font-size: 13px; + color: ${(props) => props.theme.colors.selectedTheme.gray}; + text-transform: capitalize; + margin: 0; +`; + +const StyledSubtitleWithCursor = styled.p` + font-family: ${(props) => props.theme.fonts.regular}; font-size: 13px; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; text-transform: capitalize; margin: 0; + cursor: help; `; const PositionCardTooltip = styled(StyledTooltip)` @@ -393,33 +516,33 @@ const LeftMarginTooltip = styled(StyledTooltip)` const StyledValue = styled.p` font-family: ${(props) => props.theme.fonts.mono}; font-size: 13px; - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; margin: 0; text-align: end; ${Container}#closed & { - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; } `; -const PositionValue = styled.p<{ side: PositionSide }>` +const PositionValue = styled.span<{ side?: PositionSide }>` font-family: ${(props) => props.theme.fonts.bold}; font-size: 13px; text-transform: uppercase; - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; margin: 0; ${Container}#closed & { - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; } ${(props) => props.side === PositionSide.LONG && css` - color: ${props.theme.colors.common.primaryGreen}; + color: ${props.theme.colors.selectedTheme.green}; `} ${(props) => props.side === PositionSide.SHORT && css` - color: ${props.theme.colors.common.primaryRed}; + color: ${props.theme.colors.selectedTheme.red}; `} `; diff --git a/sections/futures/ProfitCalculator/LabelWithInput.tsx b/sections/futures/ProfitCalculator/LabelWithInput.tsx index e42543ab0b..6bdc819fdd 100644 --- a/sections/futures/ProfitCalculator/LabelWithInput.tsx +++ b/sections/futures/ProfitCalculator/LabelWithInput.tsx @@ -43,14 +43,11 @@ const LabelText = styled.p` height: 12px; left: 479px; top: 329px; - margin-left: 12.1px; - - font-weight: 400; font-size: 12px; line-height: 12px; - color: #ece8e3; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; export default LabelWithInput; diff --git a/sections/futures/ProfitCalculator/ProfitDetails.tsx b/sections/futures/ProfitCalculator/ProfitDetails.tsx index b9a346839d..a5b8d73775 100644 --- a/sections/futures/ProfitCalculator/ProfitDetails.tsx +++ b/sections/futures/ProfitCalculator/ProfitDetails.tsx @@ -6,10 +6,11 @@ import { useTranslation } from 'react-i18next'; import { PositionSide } from '../types'; function textColor(props: any) { - if (!props.className || props.className === 'row-name') return props.theme.colors.white; - if (props.className === 'long') return '#7FD482'; - if (props.className === 'short') return '#EF6868'; - if (props.className === 'gray-font-color') return '#787878'; + if (!props.className || props.className === 'row-name') + return props.theme.colors.selectedTheme.button.text; + if (props.className === 'long') return props.theme.colors.selectedTheme.green; + if (props.className === 'short') return props.theme.colors.selectedTheme.red; + if (props.className === 'gray-font-color') return props.theme.colors.selectedTheme.gray; } type ProfitDetailsProps = { @@ -115,7 +116,7 @@ const StyledProfitDetails = styled.div` grid-gap: 0rem; grid-template-columns: repeat(2, 1fr); - border: 1px solid rgba(255, 255, 255, 0.1); + border: ${(props) => props.theme.colors.selectedTheme.border}; box-sizing: border-box; border-radius: 6px; diff --git a/sections/futures/ProfitCalculator/StatWithContainer.tsx b/sections/futures/ProfitCalculator/StatWithContainer.tsx index 21bffb9bb3..f1b3990e0f 100644 --- a/sections/futures/ProfitCalculator/StatWithContainer.tsx +++ b/sections/futures/ProfitCalculator/StatWithContainer.tsx @@ -5,13 +5,11 @@ type StatWithContainerProps = { stat: any; type: number; }; - -function textColor(type: number) { - if (type === 0) return '#7FD482'; - if (type === 1) return '#EF6868'; - if (type === 2) return '#ECE8E3'; +function textColor(props: any) { + if (props.colorNum === 0) return props.theme.colors.selectedTheme.green; + if (props.colorNum === 1) return props.theme.colors.selectedTheme.red; + if (props.colorNum === 2) return props.theme.colors.selectedTheme.button.text; } - function pnlText(type: number, stat: any) { return `${type === 2 ? stat + 'x' : '$' + stat}`; } @@ -21,30 +19,30 @@ export const StatWithContainer: React.FC = ({ label, sta <> {label} - {pnlText(type, stat)} + {pnlText(type, stat)} > ); }; -const Stat = styled.div` +const Stat = styled.div<{ colorNum: any }>` font-size: 16px; line-height: 19px; margin: -7.5px 0px 0px 12px; + color: ${(props) => textColor(props)}; `; const StatLabel = styled.p` font-size: 14px; line-height: 14px; - color: #787878; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; margin-left: 12px; `; const StatContainer = styled.div` width: auto; height: 69px; - - border: 1px solid rgba(255, 255, 255, 0.1); + border: ${(props) => props.theme.colors.selectedTheme.border}; box-sizing: border-box; border-radius: 6px; `; diff --git a/sections/futures/ShareModal/AmountContainer.tsx b/sections/futures/ShareModal/AmountContainer.tsx new file mode 100644 index 0000000000..3a2ae7c342 --- /dev/null +++ b/sections/futures/ShareModal/AmountContainer.tsx @@ -0,0 +1,116 @@ +import { FC } from 'react'; +import styled from 'styled-components'; + +import CurrencyIcon from 'components/Currency/CurrencyIcon'; +import { FuturesPosition } from 'queries/futures/types'; +import { formatNumber, zeroBN } from 'utils/formatters/number'; +import { CurrencyKey } from 'constants/currency'; +import { PositionSide } from '../types'; +import { getDisplayAsset, getMarketAssetFromKey } from 'utils/futures'; + +type AmountContainerProps = { + marketAsset: CurrencyKey; + position: FuturesPosition | null; +}; + +const currencyIconStyle = { + height: '1.94vw', + width: 'auto', + margin: '-0.3vw 0.5vw 0vw 0vw', +}; + +const AmountContainer: FC = ({ marketAsset, position }) => { + const marketAsset__RemovedSChar = getDisplayAsset(marketAsset); + const positionDetails = position?.position ?? null; + const leverage = formatNumber(positionDetails?.leverage ?? zeroBN) + 'x'; + const side = positionDetails?.side === 'long' ? PositionSide.LONG : PositionSide.SHORT; + const roiChange = positionDetails?.roiChange.mul(100); + + const amount = () => { + if (roiChange) { + return roiChange.gt(0) + ? `+${roiChange.toNumber().toFixed(2)}%` + : roiChange.eq(0) + ? `+0.00%` + : `${roiChange.toNumber().toFixed(2)}%`; + } + }; + + return ( + <> + + + + {`${marketAsset__RemovedSChar}-PERP`} + {`|`} + {side.toUpperCase()} + {`|`} + {`${leverage}`} + + {amount()} + + > + ); +}; + +const StyledPositionLeverage = styled.div` + display: flex; + flex-direction: column; + color: ${(props) => props.theme.colors.common.primaryGold}; + + font-size: 1.07vw; +`; + +const StyledPositionSide = styled.div` + display: flex; + flex-direction: column; + color: ${(props) => + props.className === 'long' ? props.theme.colors.green : props.theme.colors.red}; + + font-size: 1.07vw; +`; + +const StyledPositionDetails = styled.div` + margin: ${(props) => (props.className === 'line-separator' ? '0vw 0.7vw 0vw 0.7vw' : '')}; + + display: flex; + flex-direction: column; + + font-size: 1.07vw; + + color: ${(props) => props.theme.colors.white}; +`; + +const StyledPositionType = styled.div` + display: flex; + flex-direction: row; +`; + +const StyledAmount = styled.div` + position: absolute; + margin-top: -0.05vw; + + font-size: 4.8vw; + font-weight: 700; + color: ${(props) => + props.className && parseFloat(props.className) > 0 + ? props.theme.colors.green + : props.theme.colors.red}; + + text-shadow: 0px 0px 3.99vw + ${(props) => + props.className && parseFloat(props.className) > 0 + ? 'rgba(127, 212, 130, 0.35)' + : 'rgb(255, 4, 32, 0.35)'}; +`; + +const Container = styled.div` + position: absolute; + top: 6vw; + left: 2.02vw; +`; + +export default AmountContainer; diff --git a/sections/futures/ShareModal/PositionMetadata.tsx b/sections/futures/ShareModal/PositionMetadata.tsx new file mode 100644 index 0000000000..53a8bd870e --- /dev/null +++ b/sections/futures/ShareModal/PositionMetadata.tsx @@ -0,0 +1,189 @@ +import { FC, useLayoutEffect, useState } from 'react'; +import { format } from 'date-fns'; +import styled from 'styled-components'; +import { useTranslation } from 'react-i18next'; + +import { PositionHistory } from 'queries/futures/types'; +import getLocale from 'utils/formatters/getLocale'; + +type PositionMetadataProps = { + marketAsset: string; + marketAssetRate: number; + futuresPositionHistory: PositionHistory[]; +}; + +function getColor(props: any) { + let color = ''; + + switch (props.className) { + case 'header': + color = props.theme.colors.common.tertiaryGray; + break; + case 'time': + color = props.theme.colors.common.tertiaryGray; + break; + case 'date-or-price': + color = props.theme.colors.white; + break; + + default: + color = props.theme.colors.common.tertiaryGray; + } + + return color; +} + +function getFontSize(props: any) { + let fontSize = ''; + + switch (props.className) { + case 'header': + fontSize = '0.83vw'; + break; + case 'time': + fontSize = '0.83vw'; + break; + case 'date-or-price': + fontSize = '1.23vw'; + break; + + default: + fontSize = '0.83vw'; + } + + return fontSize; +} + +function getFontFamily(props: any) { + const fontFamilyObj: any = { + time: props.theme.fonts.regular, + header: props.theme.fonts.compressedMedium, + 'date-or-price': props.theme.fonts.bold, + }; + + for (const key of Object.keys(fontFamilyObj)) { + if (key === props.className) return fontFamilyObj[props.className]; + } +} + +const PositionMetadata: FC = ({ + marketAsset, + marketAssetRate, + futuresPositionHistory, +}) => { + const { t } = useTranslation(); + const [currentTimestamp, setCurrentTimestamp] = useState(0); + + let avgEntryPrice = '', + openAtDate = '', + openAtTime = '', + createdOnDate = '', + createdOnTime = ''; + + const currentPosition = futuresPositionHistory.filter( + (obj: PositionHistory) => obj.asset === marketAsset + ); + + avgEntryPrice = currentPosition[0].avgEntryPrice.toNumber().toFixed(2); + + const openTimestamp = currentPosition[0].openTimestamp; + + openAtDate = format(openTimestamp, 'PP', { locale: getLocale() }); + openAtTime = format(openTimestamp, 'HH:mm:ss', { locale: getLocale() }); + createdOnDate = format(currentTimestamp, 'PP', { locale: getLocale() }); + createdOnTime = format(currentTimestamp, 'HH:mm:ss', { locale: getLocale() }); + + useLayoutEffect(() => { + const now = new Date().getTime(); + setCurrentTimestamp(now); + }, []); + + return ( + <> + + + {t('futures.modals.share.position-metadata.open-at')} + + {openAtDate.toUpperCase()} + {openAtTime} + + + + {t('futures.modals.share.position-metadata.created-on')} + + {createdOnDate.toUpperCase()} + {createdOnTime} + + + + {t('futures.modals.share.position-metadata.avg-open-price')} + + {avgEntryPrice} + + + + {t('futures.modals.share.position-metadata.current-price')} + + {marketAssetRate.toFixed(2)} + + > + ); +}; + +const ContainerText = styled.div` + font-size: ${(props) => getFontSize(props)}; + font-weight: 100; + color: ${(props) => getColor(props)}; + + text-transform: uppercase; + + width: 100%; + + font-family: ${(props) => getFontFamily(props)}; +`; + +const TopRightContainer = styled.div` + position: absolute; + display: flex; + flex-direction: column; + + width: 100%; + + bottom: 5.5vw; + left: 12.02vw; +`; + +const TopLeftContainer = styled.div` + position: absolute; + display: flex; + flex-direction: column; + + width: 100%; + + bottom: 5.5vw; + left: 2.02vw; +`; + +const BottomRightContainer = styled.div` + position: absolute; + display: flex; + flex-direction: column; + + width: 100%; + + bottom: 2vw; + left: 12.02vw; +`; + +const BottomLeftContainer = styled.div` + position: absolute; + display: flex; + flex-direction: column; + + width: 100%; + + bottom: 2vw; + left: 2.02vw; +`; + +export default PositionMetadata; diff --git a/sections/futures/ShareModal/ShareModal.tsx b/sections/futures/ShareModal/ShareModal.tsx new file mode 100644 index 0000000000..9ded1cb68a --- /dev/null +++ b/sections/futures/ShareModal/ShareModal.tsx @@ -0,0 +1,84 @@ +import { FC } from 'react'; +import styled from 'styled-components'; +import { useTranslation } from 'react-i18next'; + +import BaseModal from 'components/BaseModal'; + +import AmountContainer from './AmountContainer'; +import PositionMetadata from './PositionMetadata'; +import ShareModalButton from './ShareModalButton'; + +import { CurrencyKey } from 'constants/currency'; +import { FuturesPosition, PositionHistory } from 'queries/futures/types'; + +import PNLGraphicPNG from 'assets/png/pnl-graphic.png'; + +type ShareModalProps = { + position: FuturesPosition | null; + marketAsset: CurrencyKey; + marketAssetRate: number; + setShowShareModal: React.Dispatch>; + futuresPositionHistory: PositionHistory[]; +}; + +const ShareModal: FC = ({ + position, + marketAsset, + marketAssetRate, + setShowShareModal, + futuresPositionHistory, +}) => { + const { t } = useTranslation(); + + return ( + <> + setShowShareModal(false)} + isOpen={true} + title={t('futures.modals.share.title')} + > + + + + + + + + + + + + > + ); +}; + +const PNLImageFrame = styled.div` + position: relative; + border-radius: 10px; +`; + +const PNLImage = styled.img` + position: relative; + + width: 100%; + height: auto; + + border-radius: 10px; + border: 0px solid ${(props) => props.theme.colors.common.primaryGold}; + box-shadow: 0 0 0.5px ${(props) => props.theme.colors.common.primaryGold}; +`; + +const PNLGraphic = styled.div` + position: relative; +`; + +const ModalWindow = styled.div` + padding: 0px 25px; + box-shadow: 0 0 0.1px ${(props) => props.theme.colors.common.primaryGold}; +`; + +export default ShareModal; diff --git a/sections/futures/ShareModal/ShareModalButton.tsx b/sections/futures/ShareModal/ShareModalButton.tsx new file mode 100644 index 0000000000..bf5d8101d7 --- /dev/null +++ b/sections/futures/ShareModal/ShareModalButton.tsx @@ -0,0 +1,55 @@ +import { toPng } from 'html-to-image'; +import styled from 'styled-components'; +import { useTranslation } from 'react-i18next'; + +import Button from 'components/Button'; + +function downloadPng(dataUrl: string) { + const link = document.createElement('a'); + + link.download = 'my-pnl-on-kwenta.png'; + link.href = dataUrl; + link.pathname = 'assets/png/' + link.download; + link.click(); +} + +const ShareModalButton = () => { + const { t } = useTranslation(); + + const handleDownloadImage = async () => { + let node = document.getElementById('pnl-graphic'); + + if (node) { + const dataUrl = await toPng(node, { cacheBust: true }); + downloadPng(dataUrl); + } + }; + + return ( + <> + + + {t('futures.modals.share.buttons.download')} + + + > + ); +}; + +const ButtonContainer = styled.div` + display: flex; + flex-direction: row; + gap: 4vw; + + margin: 25px 0px 25px 0px; + + justify-content: center; +`; + +export default ShareModalButton; diff --git a/sections/futures/ShareModal/index.tsx b/sections/futures/ShareModal/index.tsx new file mode 100644 index 0000000000..cb8e5248be --- /dev/null +++ b/sections/futures/ShareModal/index.tsx @@ -0,0 +1 @@ +export { default } from './ShareModal'; diff --git a/sections/futures/Trade/DepositMarginModal.tsx b/sections/futures/Trade/DepositMarginModal.tsx index 76617e87b2..4cd433446e 100644 --- a/sections/futures/Trade/DepositMarginModal.tsx +++ b/sections/futures/Trade/DepositMarginModal.tsx @@ -174,9 +174,9 @@ export const BalanceContainer = styled(FlexDivRowCentered)` export const BalanceText = styled.p<{ $gold?: boolean }>` color: ${(props) => - props.$gold ? props.theme.colors.common.primaryGold : props.theme.colors.common.secondaryGray}; + props.$gold ? props.theme.colors.common.primaryGold : props.theme.colors.selectedTheme.gray}; span { - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; } `; @@ -194,20 +194,20 @@ export const MaxButton = styled.button` font-size: 13px; line-height: 13px; border: ${(props) => props.theme.colors.selectedTheme.border}; - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; cursor: pointer; `; const MinimumAmountDisclaimer = styled.div` font-size: 12px; margin-top: 8px; - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; text-align: center; `; export const ErrorMessage = styled.div` margin-top: 16px; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; `; export const GasFeeContainer = styled(FlexDivRowCentered)` diff --git a/sections/futures/Trade/EditMarginModal.tsx b/sections/futures/Trade/EditMarginModal.tsx index 901fcaa01f..5ba61fa340 100644 --- a/sections/futures/Trade/EditMarginModal.tsx +++ b/sections/futures/Trade/EditMarginModal.tsx @@ -223,7 +223,7 @@ const ActionTabsRow = styled(FlexDiv)` const ActionTab = styled(TextButton)<{ isSelected: boolean }>` margin-left: 8px; padding: 0 2px 2px 2px; - color: ${(props) => props.theme.colors.blueberry}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.regular}; &:disabled { opacity: 0.2; @@ -232,7 +232,7 @@ const ActionTab = styled(TextButton)<{ isSelected: boolean }>` ${(props) => props.isSelected && css` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; border-bottom: 2px solid ${(props) => props.theme.colors.goldColors.color2}; `}; `; diff --git a/sections/futures/Trade/MarginSection.tsx b/sections/futures/Trade/MarginSection.tsx index 6b696f5bc8..845d83a45d 100644 --- a/sections/futures/Trade/MarginSection.tsx +++ b/sections/futures/Trade/MarginSection.tsx @@ -69,7 +69,7 @@ const AvailableMargin = styled.div` const MarginBalance = styled.div` margin-top: 4px; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.bold}; font-size: 16px; `; diff --git a/sections/futures/Trade/MarketsDropdownIndicator.tsx b/sections/futures/Trade/MarketsDropdownIndicator.tsx index a61ecc73b2..26a57e0304 100644 --- a/sections/futures/Trade/MarketsDropdownIndicator.tsx +++ b/sections/futures/Trade/MarketsDropdownIndicator.tsx @@ -1,11 +1,18 @@ import React from 'react'; import { components, IndicatorProps } from 'react-select'; +import styled from 'styled-components'; import DropdownArrow from '../../../assets/svg/app/dropdown-arrow.svg'; const MarketsDropdownIndicator: React.FC> = (props) => ( - + ); +const StyledDropdownArrow = styled(DropdownArrow)` + path { + fill: ${(props) => props.theme.colors.selectedTheme.button.text}; + } +`; + export default MarketsDropdownIndicator; diff --git a/sections/futures/Trade/MarketsDropdownOption.tsx b/sections/futures/Trade/MarketsDropdownOption.tsx index 1844151821..139f0166fa 100644 --- a/sections/futures/Trade/MarketsDropdownOption.tsx +++ b/sections/futures/Trade/MarketsDropdownOption.tsx @@ -16,19 +16,21 @@ const MarketsDropdownOption: React.FC> = (pro /> - + {props.data.label} - + {props.data.description} - {props.data.price} + + {props.data.price} + {props.data.change} @@ -37,6 +39,9 @@ const MarketsDropdownOption: React.FC> = (pro ); +const StyledCurrencyLabel = styled(CurrencyLabel)` + color: ${(props) => props.theme.colors.selectedTheme.gray}; +`; const CurrencyMeta = styled(FlexDivCentered)<{ $isSelected: boolean }>` flex: 1; margin-left: 12px; @@ -44,8 +49,8 @@ const CurrencyMeta = styled(FlexDivCentered)<{ $isSelected: boolean }>` ${(props) => props.$isSelected && css` - ${CurrencyLabel} { - color: ${(props) => props.theme.colors.common.secondaryGold}; + ${StyledCurrencyLabel} { + color: ${(props) => props.theme.colors.selectedTheme.button.text}; } `} `; @@ -59,13 +64,8 @@ const OptionDetailsContainer = styled(SingleValueContainer)<{ $isSelected: boole .price { font-family: ${(props) => props.theme.fonts.mono}; - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; font-size: 15px; - ${(props) => - props.$isSelected && - css` - color: ${(props) => props.theme.colors.common.secondaryGold}; - `} } .change { @@ -80,14 +80,21 @@ const OptionDetailsContainer = styled(SingleValueContainer)<{ $isSelected: boole &:hover { background-color: rgba(255, 255, 255, 0.05); + color: ${(props) => props.theme.colors.selectedTheme.button.text}; + ${StyledCurrencyLabel} { + color: ${(props) => props.theme.colors.selectedTheme.button.text}; + } + .name { + color: ${(props) => props.theme.colors.selectedTheme.button.text}; + } } .green { - color: ${(props) => props.theme.colors.common.primaryGreen}; + color: ${(props) => props.theme.colors.selectedTheme.green}; } .red { - color: ${(props) => props.theme.colors.common.primaryRed}; + color: ${(props) => props.theme.colors.selectedTheme.red}; } `; diff --git a/sections/futures/Trade/MarketsDropdownSingleValue.tsx b/sections/futures/Trade/MarketsDropdownSingleValue.tsx index ecac6cc973..3f03f5b4c7 100644 --- a/sections/futures/Trade/MarketsDropdownSingleValue.tsx +++ b/sections/futures/Trade/MarketsDropdownSingleValue.tsx @@ -31,11 +31,9 @@ const MarketsDropdownSingleValue: React.FC props.theme.fonts.regular}; - color: ${(props) => props.theme.colors.common.primaryWhite}; font-size: 16px; display: flex; align-items: center; -} `; export const SingleValueContainer = styled(FlexDivCentered)` @@ -48,7 +46,7 @@ export const SingleValueContainer = styled(FlexDivCentered)` font-size: 12.5px; line-height: 12.5px; margin: 0; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; } `; diff --git a/sections/futures/Trade/NextPrice.tsx b/sections/futures/Trade/NextPrice.tsx index b022aafcd4..d53332ef75 100644 --- a/sections/futures/Trade/NextPrice.tsx +++ b/sections/futures/Trade/NextPrice.tsx @@ -22,11 +22,11 @@ const NextPriceContainer = styled.div` margin-bottom: 16px; .next-price-description { - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; margin: 0 8px; a { - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; } } `; diff --git a/sections/futures/Trade/NextPriceConfirmationModal.tsx b/sections/futures/Trade/NextPriceConfirmationModal.tsx index b54ea3cc43..c2e1ac63fc 100644 --- a/sections/futures/Trade/NextPriceConfirmationModal.tsx +++ b/sections/futures/Trade/NextPriceConfirmationModal.tsx @@ -83,7 +83,7 @@ const NextPriceConfirmationModal: FC = ({ ); const orderDetails = useMemo(() => { - const newSize = side === PositionSide.LONG ? tradeSize : -tradeSize; + const newSize = side === PositionSide.LONG ? wei(tradeSize) : wei(tradeSize).mul(-1); return { newSize, size: (positionSize ?? zeroBN).add(newSize).abs() }; }, [side, tradeSize, positionSize]); @@ -103,25 +103,32 @@ const NextPriceConfirmationModal: FC = ({ const dataRows = useMemo( () => [ - { label: 'Side', value: (side ?? PositionSide.LONG).toUpperCase() }, { - label: 'Size', - value: formatCurrency(market || '', orderDetails.size ?? zeroBN, { + label: t('futures.market.user.position.modal.order-type'), + value: t('futures.market.user.position.modal.next-price-order'), + }, + { + label: t('futures.market.user.position.modal.side'), + value: (side ?? PositionSide.LONG).toUpperCase(), + }, + { + label: t('futures.market.user.position.modal.size'), + value: formatCurrency(market || '', orderDetails.newSize.abs() ?? zeroBN, { sign: market ? synthsMap[market]?.sign : '', }), }, { - label: 'Total Deposit', + label: t('futures.market.user.position.modal.deposit'), value: formatCurrency(Synths.sUSD, totalDeposit, { sign: '$' }), }, { - label: 'Next-Price Discount', + label: t('futures.market.user.position.modal.np-discount'), value: !!nextPriceDiscount ? formatCurrency(Synths.sUSD, nextPriceDiscount, { sign: '$' }) : NO_VALUE, }, { - label: 'Estimated Fees', + label: t('futures.market.user.position.modal.fee-total'), value: formatCurrency( selectedPriceCurrency.name, totalDeposit.add(nextPriceDiscount ?? zeroBN), @@ -133,6 +140,7 @@ const NextPriceConfirmationModal: FC = ({ }, ], [ + t, orderDetails, market, synthsMap, @@ -190,7 +198,7 @@ const Row = styled(FlexDivCentered)` `; const Label = styled.div` - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; font-size: 12px; text-transform: capitalize; margin-top: 6px; @@ -198,7 +206,7 @@ const Label = styled.div` const Value = styled.div` font-family: ${(props) => props.theme.fonts.mono}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 12px; margin-top: 6px; `; @@ -213,7 +221,7 @@ const StyledGasPriceSelect = styled(GasPriceSelect)` justify-content: space-between; width: auto; border-bottom: 1px solid ${(props) => props.theme.colors.selectedTheme.border}; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; font-size: 12px; font-family: ${(props) => props.theme.fonts.regular}; text-transform: capitalize; @@ -230,7 +238,7 @@ const ConfirmTradeButton = styled(Button)` const Disclaimer = styled.div` font-size: 12px; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; margin-top: 12px; margin-bottom: 12px; `; diff --git a/sections/futures/Trade/Trade.tsx b/sections/futures/Trade/Trade.tsx index e9f7e9fd1d..7dff3f13f9 100644 --- a/sections/futures/Trade/Trade.tsx +++ b/sections/futures/Trade/Trade.tsx @@ -10,7 +10,7 @@ import { CurrencyKey, Synths } from 'constants/currency'; import Button from 'components/Button'; import { zeroBN } from 'utils/formatters/number'; -import { PositionSide } from '../types'; +import { PositionSide, PotentialTrade } from '../types'; import { useRecoilState } from 'recoil'; import { gasSpeedState } from 'store/wallet'; import { newGetExchangeRatesForCurrencies } from 'utils/currencies'; @@ -27,7 +27,6 @@ import MarketsDropdown from './MarketsDropdown'; import SegmentedControl from 'components/SegmentedControl'; import PositionButtons from '../PositionButtons'; import OrderSizing from '../OrderSizing'; -import MarketInfoBox from '../MarketInfoBox/MarketInfoBox'; import FeeInfoBox from '../FeeInfoBox'; import DepositMarginModal from './DepositMarginModal'; import WithdrawMarginModal from './WithdrawMarginModal'; @@ -41,17 +40,26 @@ import useFuturesMarketClosed from 'hooks/useFuturesMarketClosed'; import NextPriceConfirmationModal from './NextPriceConfirmationModal'; import useGetFuturesMarketLimit from 'queries/futures/useGetFuturesMarketLimit'; import ClosePositionModal from '../PositionCard/ClosePositionModal'; +import useGetFuturesPotentialTradeDetails from 'queries/futures/useGetFuturesPotentialTradeDetails'; +import MarketInfoBox from '../MarketInfoBox/MarketInfoBox'; const DEFAULT_MAX_LEVERAGE = wei(10); type TradeProps = { position: FuturesPosition | null; refetch(): void; - onEditPositionInput: (position: { size: string; side: PositionSide }) => void; + onEditPositionInput: (position: { size: string; side: PositionSide; leverage: string }) => void; currencyKey: string; + potentialTrade: PotentialTrade | null; }; -const Trade: React.FC = ({ refetch, onEditPositionInput, position, currencyKey }) => { +const Trade: React.FC = ({ + refetch, + onEditPositionInput, + position, + currencyKey, + potentialTrade, +}) => { const { t } = useTranslation(); const walletAddress = useRecoilValue(walletAddressState); const { useSynthsBalancesQuery, useEthGasPriceQuery, useSynthetixTxn } = useSynthetixQueries(); @@ -62,6 +70,8 @@ const Trade: React.FC = ({ refetch, onEditPositionInput, position, c const { synthetixjs, network } = Connector.useContainer(); const [closePositionModalIsVisible, setClosePositionModalIsVisible] = useState(false); + const [nextPriceCloseModalIsVisible, setNextPriceCloseModalIsVisible] = useState(false); + const [orderType, setOrderType] = useState(0); const marketAsset = (router.query.market?.[0] as CurrencyKey) ?? null; const { isFuturesMarketClosed } = useFuturesMarketClosed(marketAsset); @@ -70,9 +80,15 @@ const Trade: React.FC = ({ refetch, onEditPositionInput, position, c const marketLimitQuery = useGetFuturesMarketLimit(getMarketKey(marketAsset, network.id)); const futuresPositionHistoryQuery = useGetFuturesPositionHistory(marketAsset); - const positionDetails = position?.position ?? null; + const potentialTradeDetails = useGetFuturesPotentialTradeDetails( + router.query.market?.[0] as CurrencyKey, + potentialTrade + ); + + const previewTrade = potentialTradeDetails.data ?? null; + const onPositionClose = () => { setTimeout(() => { futuresPositionHistoryQuery.refetch(); @@ -91,7 +107,6 @@ const Trade: React.FC = ({ refetch, onEditPositionInput, position, c const [tradeSize, setTradeSize] = useState(''); const [tradeSizeSUSD, setTradeSizeSUSD] = useState(''); const [leverageSide, setLeverageSide] = useState(PositionSide.LONG); - const [orderType, setOrderType] = useState(0); const [gasSpeed] = useRecoilState(gasSpeedState); const [feeCost, setFeeCost] = useState(null); @@ -146,7 +161,7 @@ const Trade: React.FC = ({ refetch, onEditPositionInput, position, c const size = fromLeverage ? (value === '' ? '' : wei(value).toNumber().toString()) : value; const sizeSUSD = value === '' ? '' : marketAssetRate.mul(Number(value)).toNumber().toString(); const leverage = - value === '' + value === '' || !position?.remainingMargin ? '' : marketAssetRate .mul(Number(value)) @@ -275,7 +290,6 @@ const Trade: React.FC = ({ refetch, onEditPositionInput, position, c { enabled: !!marketAsset && - !!leverage && Number(leverage) >= 0 && maxLeverageValue.gte(Number(leverage)) && !sizeDelta.eq(zeroBN), @@ -284,25 +298,33 @@ const Trade: React.FC = ({ refetch, onEditPositionInput, position, c useEffect(() => { if (orderTxn.hash) { - monitorTransaction({ - txHash: orderTxn.hash, - onTxConfirmed: () => { - onLeverageChange(''); - setTimeout(async () => { - futuresPositionHistoryQuery.refetch(); - marketQuery.refetch(); - refetch(); - }, 5 * 1000); - }, - }); + try { + monitorTransaction({ + txHash: orderTxn.hash, + onTxConfirmed: () => { + onLeverageChange(''); + setTimeout(async () => { + futuresPositionHistoryQuery.refetch(); + marketQuery.refetch(); + refetch(); + }, 5 * 1000); + }, + onTxFailed: (failureMessage) => { + orderTxn.errorMessage = 'Something went wrong.'; + }, + }); + } catch (e) { + console.log(e); + debugger; + } } // eslint-disable-next-line react-hooks/exhaustive-deps }, [orderTxn.hash]); useEffect(() => { - onEditPositionInput({ size: tradeSize, side: leverageSide }); - }, [leverageSide, tradeSize, onEditPositionInput]); + onEditPositionInput({ size: tradeSize, side: leverageSide, leverage: leverage }); + }, [leverageSide, leverage, tradeSize, onEditPositionInput]); return ( @@ -311,33 +333,28 @@ const Trade: React.FC = ({ refetch, onEditPositionInput, position, c setIsDepositMarginModalOpen(true)} + noOutline={true} > {t('futures.market.trade.button.deposit')} setIsWithdrawMarginModalOpen(true)} + noOutline={true} > {t('futures.market.trade.button.withdraw')} = ({ refetch, onEditPositionInput, position, c = ({ refetch, onEditPositionInput, position, c isRounded={true} fullWidth variant="danger" - onClick={() => setClosePositionModalIsVisible(true)} + onClick={() => { + if (orderType === 1 && position?.position?.size) { + const newTradeSize = position.position.size; + const newLeverageSide = + position.position.side === PositionSide.LONG + ? PositionSide.SHORT + : PositionSide.LONG; + setLeverageSide(newLeverageSide); + setTradeSize(newTradeSize.toString()); + setNextPriceCloseModalIsVisible(true); + } else { + setClosePositionModalIsVisible(true); + } + }} disabled={!positionDetails || isFuturesMarketClosed} noOutline={true} > @@ -421,8 +451,8 @@ const Trade: React.FC = ({ refetch, onEditPositionInput, position, c )} - {(orderTxn.errorMessage || error) && ( - {orderTxn.errorMessage || error} + {(orderTxn.errorMessage || error || previewTrade?.showStatus) && ( + {orderTxn.errorMessage || error || previewTrade?.statusMessage} )} = ({ refetch, onEditPositionInput, position, c l1Fee={orderTxn.optimismLayerOneFee} market={marketAsset} side={leverageSide} + leverage={leverage} onDismiss={() => setIsTradeConfirmationModalOpen(false)} /> )} @@ -500,6 +531,21 @@ const Trade: React.FC = ({ refetch, onEditPositionInput, position, c onDismiss={() => setClosePositionModalIsVisible(false)} /> )} + + {nextPriceCloseModalIsVisible && onPositionClose && ( + orderTxn.mutate()} + gasLimit={orderTxn.gasLimit} + l1Fee={orderTxn.optimismLayerOneFee} + market={marketAsset} + side={leverageSide} + onDismiss={() => setNextPriceCloseModalIsVisible(false)} + feeCost={feeCost} + positionSize={position?.position?.size ?? null} + isDisclaimerDisplayed={shouldDisplayNextPriceDisclaimer} + /> + )} ); }; @@ -519,6 +565,14 @@ const MarketActions = styled.div` const MarketActionButton = styled(Button)` font-size: 15px; + height: 40px; + background-color: transparent; + color: ${(props) => props.theme.colors.selectedTheme.gray}; + + &:hover:enabled { + color: ${(props) => props.theme.colors.selectedTheme.button.text}; + background-color: ${(props) => props.theme.colors.selectedTheme.button.fill}; + } `; const ManagePositions = styled.div` @@ -541,13 +595,13 @@ const CloseOrderButton = styled(Button)` text-align: center; white-space: normal; background: rgba(239, 104, 104, 0.04); - border: 1px solid #ef6868; - box-shadow: none; + border: 1px solid ${(props) => props.theme.colors.selectedTheme.red}; transition: all 0s ease-in-out; + box-shadow: none; &:hover { - background: ${(props) => props.theme.colors.common.primaryRed}; - color: ${(props) => props.theme.colors.white}; + background: ${(props) => props.theme.colors.selectedTheme.red}; + color: ${(props) => props.theme.colors.selectedTheme.white}; transform: scale(0.98); } @@ -560,7 +614,7 @@ const CloseOrderButton = styled(Button)` `; const ErrorMessage = styled.div` - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.red}; font-size: 12px; margin-bottom: 16px; `; @@ -570,12 +624,12 @@ const StyledSegmentedControl = styled(SegmentedControl)` `; const ManageOrderTitle = styled.p` - color: ${(props) => props.theme.colors.common.primaryWhite}; - font-size: 12px; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; + font-size: 13px; margin-bottom: 8px; margin-left: 14px; span { - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; } `; diff --git a/sections/futures/Trade/TradeConfirmationModal.tsx b/sections/futures/Trade/TradeConfirmationModal.tsx index 567d5e80bf..234cfebb98 100644 --- a/sections/futures/Trade/TradeConfirmationModal.tsx +++ b/sections/futures/Trade/TradeConfirmationModal.tsx @@ -29,6 +29,7 @@ type TradeConfirmationModalProps = { onConfirmOrder: () => void; side: PositionSide; l1Fee: Wei | null; + leverage: string; }; const TradeConfirmationModal: FC = ({ @@ -39,6 +40,7 @@ const TradeConfirmationModal: FC = ({ gasLimit, onConfirmOrder, l1Fee, + leverage, }) => { const { t } = useTranslation(); const { synthsMap } = Connector.useContainer(); @@ -50,6 +52,7 @@ const TradeConfirmationModal: FC = ({ const { data: potentialTradeDetails } = useGetFuturesPotentialTradeDetails(market, { size: tradeSize, side, + leverage, }); const exchangeRates = useMemo( @@ -167,7 +170,7 @@ const Row = styled(FlexDivCentered)` `; const Label = styled.div` - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; font-size: 12px; text-transform: capitalize; margin-top: 6px; @@ -175,7 +178,7 @@ const Label = styled.div` const Value = styled.div` font-family: ${(props) => props.theme.fonts.mono}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 12px; margin-top: 6px; `; diff --git a/sections/futures/Trades/TimeDisplay.tsx b/sections/futures/Trades/TimeDisplay.tsx index 6bd9448095..61a0202637 100644 --- a/sections/futures/Trades/TimeDisplay.tsx +++ b/sections/futures/Trades/TimeDisplay.tsx @@ -1,7 +1,7 @@ import { FC, useState } from 'react'; -import { format, Locale } from 'date-fns'; +import { format } from 'date-fns'; -import getLocale from '../../../utils/formatters/getLocale'; +import getLocale from 'utils/formatters/getLocale'; type TimeDisplayProps = { cellPropsValue: any; @@ -14,18 +14,12 @@ const TimeDisplay: FC = ({ cellPropsValue }) => { setShow12h(!show12hr); }; - let language: Locale = { code: '' }; - - navigator.languages !== undefined - ? (language.code = navigator.languages[0]) - : (language.code = navigator.language); - const date = format(new Date(cellPropsValue), 'MM/dd/yy', { - locale: getLocale(language.code), + locale: getLocale(), }); - const time12hr = new Date(cellPropsValue).toLocaleTimeString(language.code); + const time12hr = new Date(cellPropsValue).toLocaleTimeString(getLocale().code); const time24hr = format(new Date(cellPropsValue), 'HH:mm:ss', { - locale: getLocale(language.code), + locale: getLocale(), }); return ( diff --git a/sections/futures/Trades/Trades.tsx b/sections/futures/Trades/Trades.tsx index 296bc0dfde..7207a8113d 100644 --- a/sections/futures/Trades/Trades.tsx +++ b/sections/futures/Trades/Trades.tsx @@ -45,31 +45,6 @@ const Trades: React.FC = ({ history, isLoading, isLoaded, marketAss const columnsDeps = useMemo(() => [historyData], [historyData]); - /* const getStatus = (status: string) => { - switch (status) { - case TradeStatus.OPEN: - return ( - - {t('futures.market.user.trades.table.trade-types.entry')} - - ); - case TradeStatus.CLOSED: - return ( - - {t('futures.market.user.trades.table.trade-types.exit')} - - ); - case TradeStatus.LIQUIDATED: - return ( - - {t('futures.market.user.trades.table.trade-types.liquidated')} - - ); - default: - return null; - } - };*/ - return ( = ({ history, isLoading, isLoaded, marketAss ), width: 100, }, - // { - // Header: ( - // {t('futures.market.user.trades.table.status')} - // ), - // id: 'status', - // accessor: 'status', - // sortType: 'basic', - // Cell: (cellProps: CellProps) => { - // return ( - // <> - // {getStatus(cellProps.value)} - // > - // ); - // }, - // width: 100, - // }, { accessor: 'txnHash', Cell: (cellProps: CellProps) => ( @@ -237,47 +196,26 @@ const StyledTableHeader = styled.div` const StyledPositionSide = styled.div<{ side: PositionSide }>` text-transform: uppercase; - font-weight: bold; ${(props) => props.side === PositionSide.LONG && css` - color: ${props.theme.colors.common.primaryGreen}; + color: ${props.theme.colors.selectedTheme.green}; `} ${(props) => props.side === PositionSide.SHORT && css` - color: ${props.theme.colors.common.primaryRed}; + color: ${props.theme.colors.selectedTheme.red}; `} `; -/* -const StyledStatus = styled.span<{ status: string }>` - font-size: 10px; - color: ${(props) => - props.status === TradeStatus.OPEN - ? props.theme.colors.yellow - : props.status === TradeStatus.CLOSED - ? props.theme.colors.white - : props.theme.colors.red}; - font-family: ${(props) => props.theme.fonts.bold}; - margin-left: 2px; - text-transform: uppercase; -`; - -const StatusText = styled.div` - ${BoldTableText}; - margin-left: 4px; -`; -*/ - const PNL = styled.div<{ negative?: boolean; normal?: boolean }>` color: ${(props) => props.normal - ? props.theme.colors.common.primaryWhite + ? props.theme.colors.selectedTheme.button.text : props.negative - ? props.theme.colors.common.primaryRed - : props.theme.colors.common.primaryGreen}; + ? props.theme.colors.selectedTheme.red + : props.theme.colors.selectedTheme.green}; `; const TableNoResults = styled(GridDivCenteredRow)` @@ -286,7 +224,7 @@ const TableNoResults = styled(GridDivCenteredRow)` margin-top: -2px; justify-items: center; grid-gap: 10px; - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 16px; `; @@ -295,18 +233,18 @@ const StyledExternalLink = styled(ExternalLink)` &:hover { svg { path { - fill: ${(props) => props.theme.colors.common.primaryWhite}; + fill: ${(props) => props.theme.colors.selectedTheme.button.text}; } } } `; const StyledLinkIcon = styled(LinkIcon)` - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; width: 14px; height: 14px; path { - fill: ${(props) => props.theme.colors.common.secondaryGray}; + fill: ${(props) => props.theme.colors.selectedTheme.gray}; } `; diff --git a/sections/futures/TradingHistory/OpenInterestBar.tsx b/sections/futures/TradingHistory/OpenInterestBar.tsx index 75632f875f..af04e6add8 100644 --- a/sections/futures/TradingHistory/OpenInterestBar.tsx +++ b/sections/futures/TradingHistory/OpenInterestBar.tsx @@ -28,23 +28,22 @@ const OIContainer = styled.div` border: 1px solid #2b2a2a; border-radius: 1px; width: 100%; - height: 100%; `; const ShortOI = styled.div<{ skew: { long: number; short: number }[] }>` - background-color: ${(props) => props.theme.colors.common.primaryRed}; + background-color: ${(props) => props.theme.colors.selectedTheme.red}; height: 9px; width: ${(props) => formatPercent(props.skew[0].short, { minDecimals: 0 })}; `; const LongOI = styled.div` - background-color: ${(props) => props.theme.colors.common.primaryGreen}; + background-color: ${(props) => props.theme.colors.selectedTheme.green}; width: 100%; height: 9px; `; const ZeroOI = styled.div` - background-color: ${(props) => props.theme.colors.common.secondaryGray}; + background-color: ${(props) => props.theme.colors.selectedTheme.gray}; width: 100%; height: 9px; `; diff --git a/sections/futures/TradingHistory/SkewInfo.tsx b/sections/futures/TradingHistory/SkewInfo.tsx index d7f4d4c59f..832a7bf884 100644 --- a/sections/futures/TradingHistory/SkewInfo.tsx +++ b/sections/futures/TradingHistory/SkewInfo.tsx @@ -1,12 +1,14 @@ import StyledTooltip from 'components/Tooltip/StyledTooltip'; +import useSelectedPriceCurrency from 'hooks/useSelectedPriceCurrency'; +import * as _ from 'lodash/fp'; import { FuturesMarket } from 'queries/futures/types'; import useGetFuturesMarkets from 'queries/futures/useGetFuturesMarkets'; +import React from 'react'; import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import styled from 'styled-components'; import { CapitalizedText, NumericValue } from 'styles/common'; -import { formatPercent } from 'utils/formatters/number'; -import { HoverTransform } from '../MarketDetails/MarketDetails'; +import { formatCurrency, formatPercent } from 'utils/formatters/number'; import OpenInterestBar from './OpenInterestBar'; type SkewInfoProps = { @@ -15,14 +17,18 @@ type SkewInfoProps = { const SkewInfo: React.FC = ({ currencyKey }) => { const { t } = useTranslation(); + const futuresMarketsQuery = useGetFuturesMarkets(); + const { selectedPriceCurrency } = useSelectedPriceCurrency(); + + const futuresMarkets = useMemo(() => futuresMarketsQuery?.data ?? [], [futuresMarketsQuery]); const data = useMemo(() => { - const futuresMarkets = futuresMarketsQuery?.data ?? []; return futuresMarkets.length > 0 ? futuresMarkets .filter((i: FuturesMarket) => i.asset === currencyKey) .map((i: FuturesMarket) => { + const basePriceRate = _.defaultTo(0, Number(i.price)); return { short: i.marketSize.eq(0) ? 0 @@ -30,15 +36,26 @@ const SkewInfo: React.FC = ({ currencyKey }) => { long: i.marketSize.eq(0) ? 0 : i.marketSize.add(i.marketSkew).div('2').div(i.marketSize).toNumber(), + shortValue: i.marketSize.eq(0) + ? 0 + : i.marketSize.sub(i.marketSkew).div('2').mul(basePriceRate).toNumber(), + longValue: i.marketSize.eq(0) + ? 0 + : i.marketSize.add(i.marketSkew).div('2').mul(basePriceRate).toNumber(), }; }) : [ { short: 0, long: 0, + shortValue: 0, + longValue: 0, }, ]; - }, [futuresMarketsQuery, currencyKey]); + }, [futuresMarkets, currencyKey]); + + const long = formatCurrency(selectedPriceCurrency.name, data[0].longValue, { sign: '$' }); + const short = formatCurrency(selectedPriceCurrency.name, data[0].shortValue, { sign: '$' }); return ( @@ -50,22 +67,53 @@ const SkewInfo: React.FC = ({ currencyKey }) => { height={'auto'} content={t('futures.market.history.skew-tooltip')} > - + {t('futures.market.history.skew-label')} - + {formatPercent(data[0].long, { minDecimals: 0 })} + + {short} + {long} + ); }; export default SkewInfo; +const WithCursor = styled.div<{ cursor: 'help' }>` + cursor: ${(props) => props.cursor}; +`; + +const OpenInterestRow = styled.div` + display: flex; + width: 100%; + justify-content: space-between; + line-height: 16px; + padding-bottom: 10px; + padding-top: 10px; + font-size: 13px; + font-family: ${(props) => props.theme.fonts.mono}; + + :last-child { + padding-bottom: 0; + } + .green { + color: ${(props) => props.theme.colors.selectedTheme.green}; + } + + .red { + color: ${(props) => props.theme.colors.selectedTheme.red}; + } +`; + const SkewTooltip = styled(StyledTooltip)` left: -30px; z-index: 2; + padding: 10px; `; const SkewContainer = styled.div` @@ -75,7 +123,7 @@ const SkewContainer = styled.div` align-items: center; width: 100%; - height: 55px; + height: auto; padding: 10px; margin-bottom: 16px; box-sizing: border-box; @@ -91,15 +139,15 @@ const SkewContainer = styled.div` } .heading { - font-size: 12px; - color: ${(props) => props.theme.colors.common.secondaryGray}; + font-size: 13px; + color: ${(props) => props.theme.colors.selectedTheme.gray}; width: 292px; } .value { font-family: ${(props) => props.theme.fonts.mono}; - font-size: 12px; - color: ${(props) => props.theme.colors.common.primaryWhite}; + font-size: 13px; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; } `; @@ -107,16 +155,18 @@ const SkewHeader = styled.div` display: flex; justify-content: space-between; width: 100%; - margin-bottom: 10px; + margin-bottom: 5px; `; const SkewLabel = styled(CapitalizedText)` text-align: center; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; + font-size: 13px; `; const SkewValue = styled(NumericValue)` text-align: center; - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; + font-size: 13px; font-family: ${(props) => props.theme.fonts.mono}; `; diff --git a/sections/futures/TradingHistory/TradesHistoryTable.tsx b/sections/futures/TradingHistory/TradesHistoryTable.tsx index 57e35a1eed..6ee3e2a6e0 100644 --- a/sections/futures/TradingHistory/TradesHistoryTable.tsx +++ b/sections/futures/TradingHistory/TradesHistoryTable.tsx @@ -163,17 +163,18 @@ const HistoryContainer = styled.div` `; const HistoryLabelContainer = styled(FlexDivRowCentered)` + font-size: 13px; justify-content: space-between; padding: 12px 18px; border-bottom: ${(props) => props.theme.colors.selectedTheme.border}; `; const HistoryLabel = styled(CapitalizedText)` - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; const LastTradesLabel = styled(CapitalizedText)` - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; `; const TableContainer = styled.div``; @@ -187,15 +188,20 @@ const StyledTable = styled(Table)` `; const TableHeader = styled(CapitalizedText)` + font-size: 13px; font-family: ${(props) => props.theme.fonts.regular}; `; const PriceValue = styled(NumericValue)` - font-size: 11px; + font-size: 13px; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; + padding-left: 5px; `; const TimeValue = styled.p` + font-size: 13px; font-family: ${(props) => props.theme.fonts.regular}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; text-decoration: underline; `; @@ -203,8 +209,8 @@ const DirectionalValue = styled(PriceValue)<{ negative?: boolean; normal?: boole padding-left: 4px; color: ${(props) => props.normal - ? props.theme.colors.common.primaryWhite + ? props.theme.colors.selectedTheme.button.text : props.negative - ? props.theme.colors.common.primaryGreen - : props.theme.colors.common.primaryRed}; + ? props.theme.colors.selectedTheme.green + : props.theme.colors.selectedTheme.red}; `; diff --git a/sections/futures/Transfers/Transfers.tsx b/sections/futures/Transfers/Transfers.tsx index 992d99cc0d..1ae1e4de0b 100644 --- a/sections/futures/Transfers/Transfers.tsx +++ b/sections/futures/Transfers/Transfers.tsx @@ -128,7 +128,7 @@ const StyledTable = styled(Table)` `; const DefaultCell = styled.p` - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; const StyledActionCell = styled(DefaultCell)` @@ -136,13 +136,13 @@ const StyledActionCell = styled(DefaultCell)` `; const StyledTitle = styled.p` - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 16px; margin: 0; `; const StyledExternalLink = styled(ExternalLink)` - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; text-decoration: underline; &:hover { text-decoration: underline; @@ -152,8 +152,8 @@ const StyledExternalLink = styled(ExternalLink)` const StyledAmountCell = styled(DefaultCell)<{ isPositive: boolean }>` color: ${(props: any) => props.isPositive - ? props.theme.colors.common.primaryGreen - : props.theme.colors.common.primaryRed}; + ? props.theme.colors.selectedTheme.green + : props.theme.colors.selectedTheme.red}; `; const StyledTableHeader = styled.div` diff --git a/sections/futures/UserInfo/OpenOrdersTable.tsx b/sections/futures/UserInfo/OpenOrdersTable.tsx index 06b79d7ab2..25f3d09ced 100644 --- a/sections/futures/UserInfo/OpenOrdersTable.tsx +++ b/sections/futures/UserInfo/OpenOrdersTable.tsx @@ -82,21 +82,19 @@ const OpenOrdersTable: React.FC = ({ }, [cancelOrExecuteOrderTxn.hash]); const data = React.useMemo(() => { - const positionSize = position?.position?.notionalValue ?? wei(0); - return openOrders.map((order: any) => ({ asset: order.asset, market: getDisplayAsset(order.asset) + '-PERP', orderType: order.orderType === 'NextPrice' ? 'Next-Price' : order.orderType, - size: order.size, - side: positionSize.add(wei(order.size)).gt(0) ? PositionSide.LONG : PositionSide.SHORT, + size: order.size.abs(), + side: wei(order.size).gt(0) ? PositionSide.LONG : PositionSide.SHORT, isStale: wei(nextPriceDetails?.currentRoundId ?? 0).gte(wei(order.targetRoundId).add(2)), isExecutable: wei(nextPriceDetails?.currentRoundId ?? 0).eq(order.targetRoundId) || wei(nextPriceDetails?.currentRoundId ?? 0).eq(order.targetRoundId.add(1)), timestamp: order.timestamp, })); - }, [openOrders, position, nextPriceDetails?.currentRoundId]); + }, [openOrders, nextPriceDetails?.currentRoundId]); return ( props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; font-family: ${(props) => props.theme.fonts.regular}; font-size: 12px; grid-column: 2; @@ -258,13 +256,13 @@ const MarketContainer = styled.div` `; const EditButton = styled.button` - border: 1px solid ${(props) => props.theme.colors.common.secondaryGray}; + border: 1px solid ${(props) => props.theme.colors.selectedTheme.gray}; height: 28px; box-sizing: border-box; border-radius: 14px; cursor: pointer; background-color: transparent; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; font-family: ${(props) => props.theme.fonts.bold}; font-size: 12px; padding-left: 12px; @@ -272,13 +270,13 @@ const EditButton = styled.button` `; const CancelButton = styled(EditButton)` - border: 1px solid ${(props) => props.theme.colors.common.primaryRed}; - color: ${(props) => props.theme.colors.common.primaryRed}; + border: 1px solid ${(props) => props.theme.colors.selectedTheme.red}; + color: ${(props) => props.theme.colors.selectedTheme.red}; margin-right: 8px; `; const ExpiredBadge = styled(Badge)` - background: ${(props) => props.theme.colors.common.primaryRed}; + background: ${(props) => props.theme.colors.selectedTheme.red}; padding: 1px 5px; line-height: 9px; `; diff --git a/sections/futures/UserInfo/UserInfo.tsx b/sections/futures/UserInfo/UserInfo.tsx index e86392637b..ffa16db708 100644 --- a/sections/futures/UserInfo/UserInfo.tsx +++ b/sections/futures/UserInfo/UserInfo.tsx @@ -7,22 +7,18 @@ import { useRouter } from 'next/router'; import { TabPanel } from 'components/Tab'; import TabButton from 'components/Button/TabButton'; -import PositionCard from '../PositionCard'; import Trades from '../Trades'; -import ProfitCalculator from '../ProfitCalculator'; import Transfers from '../Transfers'; +import ShareModal from '../ShareModal'; +import PositionCard from '../PositionCard'; +import ProfitCalculator from '../ProfitCalculator'; import ROUTES from 'constants/routes'; import { CurrencyKey, Synths } from 'constants/currency'; import { getExchangeRatesForCurrencies } from 'utils/currencies'; import OpenOrdersTable from './OpenOrdersTable'; -import { FuturesPosition } from 'queries/futures/types'; +import { FuturesPosition, PositionHistory } from 'queries/futures/types'; -import CalculatorIcon from 'assets/svg/futures/calculator-icon.svg'; -import OrderHistoryIcon from 'assets/svg/futures/icon-order-history.svg'; -import OpenPositionsIcon from 'assets/svg/futures/icon-open-positions.svg'; -import PositionIcon from 'assets/svg/futures/icon-position.svg'; -import TransfersIcon from 'assets/svg/futures/icon-transfers.svg'; import useGetFuturesMarginTransfers from 'queries/futures/useGetFuturesMarginTransfers'; import FuturesPositionsTable from 'sections/dashboard/FuturesPositionsTable'; import useGetFuturesMarkets from 'queries/futures/useGetFuturesMarkets'; @@ -32,6 +28,14 @@ import { useRecoilValue } from 'recoil'; import { walletAddressState } from 'store/wallet'; import useGetFuturesTradesForAccount from 'queries/futures/useGetFuturesTradesForAccount'; import useExchangeRatesQuery from 'queries/rates/useExchangeRatesQuery'; +import { PotentialTrade } from '../types'; + +import UploadIcon from 'assets/svg/futures/upload-icon.svg'; +import PositionIcon from 'assets/svg/futures/icon-position.svg'; +import TransfersIcon from 'assets/svg/futures/icon-transfers.svg'; +import CalculatorIcon from 'assets/svg/futures/calculator-icon.svg'; +import OrderHistoryIcon from 'assets/svg/futures/icon-order-history.svg'; +import OpenPositionsIcon from 'assets/svg/futures/icon-open-positions.svg'; enum FuturesTab { POSITION = 'position', @@ -39,6 +43,7 @@ enum FuturesTab { TRADES = 'trades', CALCULATOR = 'calculator', TRANSFERS = 'transfers', + SHARE = 'share', } const FutureTabs = Object.values(FuturesTab); @@ -46,11 +51,18 @@ const FutureTabs = Object.values(FuturesTab); type UserInfoProps = { marketAsset: CurrencyKey; position: FuturesPosition | null; + potentialTrade: PotentialTrade | null; openOrders: any[]; refetch(): void; }; -const UserInfo: React.FC = ({ marketAsset, position, openOrders, refetch }) => { +const UserInfo: React.FC = ({ + marketAsset, + position, + potentialTrade, + openOrders, + refetch, +}) => { const router = useRouter(); const walletAddress = useRecoilValue(walletAddressState); @@ -63,8 +75,11 @@ const UserInfo: React.FC = ({ marketAsset, position, openOrders, const otherFuturesMarkets = futuresMarkets.filter((market) => market.asset !== marketAsset) ?? []; const futuresPositionQuery = useGetFuturesPositionForAccount(); + // eslint-disable-next-line react-hooks/exhaustive-deps const futuresPositionHistory = futuresPositionQuery?.data ?? []; + const [showShareModal, setShowShareModal] = useState(false); + const [hasOpenPosition, setHasOpenPosition] = useState(false); const [openProfitCalcModal, setOpenProfitCalcModal] = useState(false); const marginTransfersQuery = useGetFuturesMarginTransfers(marketAsset); @@ -106,6 +121,10 @@ const UserInfo: React.FC = ({ marketAsset, position, openOrders, setOpenProfitCalcModal(!openProfitCalcModal); }, [openProfitCalcModal]); + const handleOpenShareModal = useCallback(() => { + setShowShareModal(!showShareModal); + }, [showShareModal]); + const refetchTrades = useCallback(() => { futuresTradesQuery.refetch(); marginTransfersQuery.refetch(); @@ -155,6 +174,18 @@ const UserInfo: React.FC = ({ marketAsset, position, openOrders, [activeTab, router, marketAsset, openOrders?.length] ); + useEffect(() => { + let currentPosition: PositionHistory[] = []; + + if (futuresPositionHistory.length > 0) { + currentPosition = futuresPositionHistory.filter( + (obj: PositionHistory) => obj.asset === marketAsset + ); + + setHasOpenPosition(currentPosition.length === 0 ? false : true); + } + }, [futuresPositionHistory, marketAsset]); + return ( <> @@ -179,6 +210,13 @@ const UserInfo: React.FC = ({ marketAsset, position, openOrders, icon={} onClick={handleOpenProfitCalc} /> + } + onClick={handleOpenShareModal} + /> @@ -187,6 +225,7 @@ const UserInfo: React.FC = ({ marketAsset, position, openOrders, position={position} currencyKey={marketAsset} currencyKeyRate={marketAssetRate} + potentialTrade={potentialTrade} /> = ({ marketAsset, position, openOrders, isLoaded={marginTransfersQuery.isFetched} /> - {openProfitCalcModal ? ( + + {openProfitCalcModal && ( - ) : null} + )} + {showShareModal && ( + + )} > ); }; const TabButtonsContainer = styled.div` display: grid; - grid-gap: 0rem; + grid-gap: 15px; grid-template-columns: repeat(2, 1fr); margin-top: 16px; margin-bottom: 16px; + @media (max-width: 1182px) { + grid-template-columns: repeat(1, 1fr); + } + & > button { height: 38px; font-size: 13px; @@ -247,15 +300,18 @@ const TabButtonsContainer = styled.div` const TabLeft = styled.div` display: flex; - flex-direction: row; justify-content: left; grid-gap: 12px; `; const TabRight = styled.div` display: flex; - flex-direction: row; justify-content: right; + grid-gap: 12px; + + @media (max-width: 1182px) { + justify-content: left; + } `; export default UserInfo; diff --git a/sections/futures/common.tsx b/sections/futures/common.tsx index 1dbd4520f5..c72eb1e01a 100644 --- a/sections/futures/common.tsx +++ b/sections/futures/common.tsx @@ -2,7 +2,7 @@ import styled from 'styled-components'; import { FlexDivRowCentered } from 'styles/common'; export const Title = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.bold}; font-size: 14px; text-transform: capitalize; @@ -10,7 +10,7 @@ export const Title = styled.div` `; export const Subheader = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.bold}; font-size: 12px; text-transform: capitalize; @@ -24,7 +24,7 @@ export const Subtitle = styled.div` `; export const Data = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.bold}; font-size: 12px; `; diff --git a/sections/futures/types.ts b/sections/futures/types.ts index 3355c6ac85..b8d59d57ed 100644 --- a/sections/futures/types.ts +++ b/sections/futures/types.ts @@ -73,4 +73,36 @@ export type Trade = { export type PotentialTrade = { size: string; side: PositionSide; + leverage: string; +}; + +// https://github.com/Synthetixio/synthetix/blob/4d2add4f74c68ac4f1106f6e7be4c31d4f1ccc76/contracts/interfaces/IFuturesMarketBaseTypes.sol#L6-L19 +export enum PotentialTradeStatus { + OK = 0, + INVALID_PRICE = 1, + PRICE_OUT_OF_BOUNDS = 2, + CAN_LIQUIDATE = 3, + CANNOT_LIQUIDATE = 4, + MAX_MARKET_SIZE_EXCEEDED = 5, + MAX_LEVERAGE_EXCEEDED = 6, + INSUFFICIENT_MARGIN = 7, + NOT_PERMITTED = 8, + NIL_ORDER = 9, + NO_POSITION_OPEN = 10, + PRICE_TOO_VOLATILE = 11, +} + +// https://github.com/Synthetixio/synthetix/blob/4d2add4f74c68ac4f1106f6e7be4c31d4f1ccc76/contracts/PerpsV2MarketBase.sol#L130-L141 +export const POTENTIAL_TRADE_STATUS_TO_MESSAGE: { [key: string]: string } = { + INVALID_PRICE: 'Invalid price', + PRICE_OUT_OF_BOUNDS: 'Price out of acceptable range', + CAN_LIQUIDATE: 'Position can be liquidated', + CANNOT_LIQUIDATE: 'Position cannot be liquidated', + MAX_MARKET_SIZE_EXCEEDED: 'Max market size exceeded', + MAX_LEVERAGE_EXCEEDED: 'Max leverage exceeded', + INSUFFICIENT_MARGIN: 'Insufficient margin', + NOT_PERMITTED: 'Not permitted by this address', + NIL_ORDER: 'Cannot submit empty order', + NO_POSITION_OPEN: 'No position open', + PRICE_TOO_VOLATILE: 'Price too volatile', }; diff --git a/sections/homepage/Assets/Assets.tsx b/sections/homepage/Assets/Assets.tsx index 026b88a676..dab95391a4 100644 --- a/sections/homepage/Assets/Assets.tsx +++ b/sections/homepage/Assets/Assets.tsx @@ -1,160 +1,527 @@ -import React from 'react'; +import React, { useEffect, useMemo, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; +import { useQueryClient } from 'react-query'; import styled from 'styled-components'; +import router from 'next/router'; +import values from 'lodash/values'; +import isNil from 'lodash/isNil'; +import { ColorType, createChart, UTCTimestamp } from 'lightweight-charts'; -import AssetCollections from 'assets/png/marketing/asset-collections.png'; -import Fade from 'assets/svg/marketing/fade.svg'; - -import { FlexDivCentered, FlexDivRowCentered, Paragraph } from 'styles/common'; -import media, { Media } from 'styles/media'; - -import SmoothScroll from 'sections/homepage/containers/SmoothScroll'; - -import { GridContainer, SubHeader } from '../common'; -import Webp from 'components/Webp'; - -const ASSETS = [ - { - id: 'index', - label: 'homepage.assets.index', - }, - { - id: 'forex', - label: 'homepage.assets.forex', - }, - { - id: 'equities', - label: 'homepage.assets.equities', - }, - { - id: 'crypto', - label: 'homepage.assets.crypto', - }, - { - id: 'commodity', - label: 'homepage.assets.commodity', - }, - { - id: 'short', - label: 'homepage.assets.short', - }, -]; +import GridSvg from 'assets/svg/app/grid.svg'; +import { + FlexDiv, + FlexDivColCentered, + FlexDivRow, + SmallGoldenHeader, + WhiteHeader, +} from 'styles/common'; +import { Media } from 'styles/media'; +import useGetFuturesMarkets from 'queries/futures/useGetFuturesMarkets'; +import useLaggedDailyPrice from 'queries/rates/useLaggedDailyPrice'; +import useGetFuturesTradingVolumeForAllMarkets from 'queries/futures/useGetFuturesTradingVolumeForAllMarkets'; +import useGetSynthsTradingVolumeForAllMarkets from 'queries/synths/useGetSynthsTradingVolumeForAllMarkets'; +import useExchangeRatesQuery from 'queries/rates/useExchangeRatesQuery'; +import { requestCandlesticks } from 'queries/rates/useCandlesticksQuery'; +import { Price } from 'queries/rates/types'; +import ChangePercent from 'components/ChangePercent'; +import Currency from 'components/Currency'; +import { TabPanel } from 'components/Tab'; +import Connector from 'containers/Connector'; +import { getSynthDescription } from 'utils/futures'; +import { CurrencyKey, Synths } from 'constants/currency'; +import { GridContainer } from '../common'; + +enum MarketsTab { + FUTURES = 'futures', + SPOT = 'spot', +} + +type PriceChartProps = { + asset: string; +}; + +export const PriceChart = ({ asset }: PriceChartProps) => { + const chartRef = useRef('0'); + + useEffect(() => { + const chart = createChart(chartRef.current, { + width: 160, + height: 64, + rightPriceScale: { + visible: false, + scaleMargins: { + top: 0.5, + bottom: 0, + }, + }, + leftPriceScale: { + visible: false, + scaleMargins: { + top: 0.5, + bottom: 0, + }, + }, + layout: { + background: { type: ColorType.Solid, color: '#00000000' }, + }, + timeScale: { + visible: false, + barSpacing: 4, + }, + grid: { + vertLines: { + visible: false, + }, + horzLines: { + visible: false, + }, + }, + handleScale: { + mouseWheel: false, + }, + crosshair: { + vertLine: { + visible: false, + }, + horzLine: { + visible: false, + }, + }, + }); + + Promise.all([ + requestCandlesticks( + asset, + Math.floor(Date.now() / 1000) - 60 * 60 * 24, + undefined, + 60, + 10, + 1, + 'desc', + true + ), + requestCandlesticks( + asset, + Math.floor(Date.now() / 1000) - 60 * 60 * 24, + undefined, + 3600, + 10, + 24, + 'asc', + true + ), + ]) + .then(([currentPrice, bars]) => { + let postive = false; + if (bars !== undefined) { + const first = bars[0]?.average ?? 0; + postive = (currentPrice[0]?.average ?? 0) - first >= 0; + } + const results = bars.map((b) => ({ + value: b.average, + time: b.timestamp as UTCTimestamp, + })); + return { results, postive }; + }) + .then(({ results, postive }) => { + chart + .addAreaSeries({ + topColor: postive ? 'rgba(127, 212, 130, 1)' : 'rgba(255, 71, 71, 1)', + bottomColor: postive ? 'rgba(127, 212, 130, 0.1)' : 'rgba(255, 71, 71, 0.1)', + lineColor: postive ? 'rgba(127, 212, 130, 1)' : 'rgba(239, 104, 104, 1)', + priceLineVisible: false, + crosshairMarkerVisible: false, + lineStyle: 0, + lineWidth: 2, + }) + .setData(results); + }); + // eslint-disable-next-line + }, []); + + return }>; +}; const Assets = () => { const { t } = useTranslation(); - const { whyKwentaRef } = SmoothScroll.useContainer(); - - const title = {t('homepage.assets.title')}; - const assetCards = ( - - {ASSETS.map(({ id, label }) => ( - - - {t(label)} - - ))} - + const { synthsMap } = Connector.useContainer(); + const [activeMarketsTab, setActiveMarketsTab] = useState(MarketsTab.FUTURES); + + const MARKETS_TABS = useMemo( + () => [ + { + key: 'futures', + name: MarketsTab.FUTURES, + label: t('dashboard.overview.markets-tabs.futures').replace('Markets', ''), + active: activeMarketsTab === MarketsTab.FUTURES, + onClick: () => { + setActiveMarketsTab(MarketsTab.FUTURES); + }, + }, + { + key: 'synths', + name: MarketsTab.SPOT, + label: t('dashboard.overview.markets-tabs.synths').replace('Markets', ''), + active: activeMarketsTab === MarketsTab.SPOT, + onClick: () => { + setActiveMarketsTab(MarketsTab.SPOT); + }, + }, + ], + [activeMarketsTab, t] + ); + + const exchangeRatesQuery = useExchangeRatesQuery(); + const exchangeRates = exchangeRatesQuery.isSuccess ? exchangeRatesQuery.data ?? null : null; + + const futuresMarketsQuery = useGetFuturesMarkets(); + const futuresMarkets = futuresMarketsQuery?.data ?? []; + const synthList = futuresMarkets.map(({ asset }) => asset); + const dailyPriceChangesQuery = useLaggedDailyPrice(synthList); + const futuresVolumeQuery = useGetFuturesTradingVolumeForAllMarkets(); + + const synths = useMemo(() => values(synthsMap) || [], [synthsMap]); + const queryCache = useQueryClient().getQueryCache(); + // KM-NOTE: come back and delete + const frozenSynthsQuery = queryCache.find(['synths', 'frozenSynths', 10]); + + const unfrozenSynths = + frozenSynthsQuery && frozenSynthsQuery.state.status === 'success' + ? synths.filter( + (synth) => !(frozenSynthsQuery.state.data as Set).has(synth.name) + ) + : synths; + + const synthNames = synths.map((synth) => synth.name); + const spotDailyPriceChangesQuery = useLaggedDailyPrice(synthNames); + const yesterday = Math.floor(new Date().setDate(new Date().getDate() - 1) / 1000); + const synthVolumesQuery = useGetSynthsTradingVolumeForAllMarkets(yesterday); + + const PERPS = useMemo(() => { + const dailyPriceChanges = dailyPriceChangesQuery?.data ?? []; + const futuresVolume = futuresVolumeQuery?.data ?? {}; + + return futuresMarkets.map((market, i) => { + const description = getSynthDescription(market.asset, synthsMap, t); + const volume = futuresVolume[market.assetHex]; + const pastPrice = dailyPriceChanges.find( + (price: Price) => price.synth === market.asset || price.synth === market.asset.slice(1) + ); + return { + key: market.asset, + name: market.asset[0] === 's' ? market.asset.slice(1) : market.asset, + description: description.split(' ')[0], + price: market.price.toNumber(), + volume: volume?.toNumber() || 0, + priceChange: (market.price.toNumber() - pastPrice?.price) / market.price.toNumber() || 0, + image: , + icon: ( + + ), + }; + }); + // eslint-disable-next-line + }, [synthsMap, dailyPriceChangesQuery?.data, futuresVolumeQuery?.data, t]); + + const SPOTS = useMemo(() => { + const spotDailyPriceChanges = spotDailyPriceChangesQuery?.data ?? []; + const synthVolumes = synthVolumesQuery?.data ?? {}; + + return unfrozenSynths.map((synth) => { + const description = synth.description + ? t('common.currency.synthetic-currency-name', { + currencyName: synth.description, + }) + : ''; + const rate = exchangeRates && exchangeRates[synth.name]; + const price = isNil(rate) ? 0 : rate.toNumber(); + + const pastPrice = spotDailyPriceChanges.find((price: Price) => { + return price.synth === synth.asset || price.synth === synth.name; + }); + + return { + key: synth.asset, + market: synth.name, + description: description.split(' ')[1], + price, + change: price !== 0 ? (price - pastPrice?.price) / price || 0 : 0, + volume: !isNil(synthVolumes[synth.name]) ? Number(synthVolumes[synth.name]) ?? 0 : 0, + image: , + icon: ( + + ), + }; + }); + }, [unfrozenSynths, synthVolumesQuery, spotDailyPriceChangesQuery, exchangeRates, t]); + + const title = ( + <> + {t('homepage.assets.title')} + {t('homepage.assets.description')} + > ); return ( - + - - - - - - - {title} - {assetCards} - - - - - {title} - - {assetCards} + + {title} + + {MARKETS_TABS.map(({ name, label, active, onClick }) => ( + + {label} + + ))} + + + + {PERPS.map(({ key, name, description, price, volume, priceChange, image, icon }) => ( + { + console.log(`link`, `/market/${key}`); + router.push(`/market/${key}`); + }} + > + + + {icon} + + {name} + {description} + + + {image} + + + + + + {'CHG '} + {priceChange === 0 ? ( + <>-> + ) : ( + + )} + + + {'VOL '} + {volume === 0 ? ( + <>-> + ) : ( + + )} + + + + ))} + + + + + {SPOTS.map(({ key, market, description, price, volume, change, image, icon }) => ( + { + market !== 'sUSD' + ? router.push(`/exchange/${market}-sUSD`) + : router.push(`/exchange/`); + }} + > + + + {icon} + + {market} + {description} + + + {image} + + + + + + {'CHG '} + {change === 0 ? ( + <>-> + ) : ( + + )} + + + {'VOL '} + {volume === 0 ? ( + <>-> + ) : ( + + )} + + + + ))} + + + ); }; -const Container = styled.div` - padding-top: 80px; - ${media.lessThan('md')` - padding-top: 40px; - `} - padding-bottom: 150px; +const StatsIconContainer = styled(FlexDiv)` + justify-content: flex-start; + padding-left: 5px; `; -const LeftSubHeader = styled(SubHeader)` - text-align: left; - max-width: 500px; - ${media.lessThan('lg')` - max-width: unset; - text-align: center; - `} +const ChartContainer = styled.div` + margin-left: -65px; + margin-top: -20px; `; -const AssetCollectionWrapper = styled.div` - position: relative; - flex-shrink: 0; - svg { - display: none; - ${media.between('lg', 'xl')` - display: unset; - position: absolute; - left: -50px; - top: -120px; - pointer-events: none; - `} - } +const StatsValueContainer = styled.div` + display: flex; + flex-direction: column; + width: 100px; + font-size: 13px; + align-self: flex-end; `; -const Col = styled.div` - display: grid; - grid-gap: 80px; +const StatsNameContainer = styled.div` + font-size: 18px; + align-self: center; `; -const AssetCard = styled(FlexDivCentered)` - background: ${(props) => props.theme.colors.elderberry}; - border: ${(props) => `1px solid ${props.theme.colors.black}`}; - box-sizing: border-box; - border-radius: 3px; - padding: 16px; +const AssetName = styled.div` + font-size: 18px; + color: ${(props) => props.theme.colors.common.primaryWhite}; `; -const AssetCardText = styled(Paragraph)` - font-family: ${(props) => props.theme.fonts.bold}; - font-size: 16px; - text-transform: capitalize; - color: ${(props) => props.theme.colors.white}; - margin: 0px 0px 0px 16px; - text-align: center; +const AssetPrice = styled.div` + font-family: ${(props) => props.theme.fonts.mono}; + align-self: flex-end; + font-size: 20px; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; + width: 120px; + padding-left: 5px; `; -const AssetsImage = styled.img` - max-width: 500px; - width: 100%; +const AssetDescription = styled.div` + font-size: 11px; + color: ${(props) => props.theme.colors.common.secondaryGray}; `; -const MobileImage = styled(AssetsImage)` - margin: 0 auto; - display: block; - margin-top: 50px; - margin-bottom: 80px; - ${media.lessThan('sm')` - width: 100%; - margin-bottom: 60px; - `} +const StatsValue = styled.div` + font-size: 13px; + color: ${(props) => props.theme.colors.common.secondaryGray}; + letter-spacing: -0.04em; + white-space: pre; +`; + +const StyledFlexDivRow = styled(FlexDivRow)` + margin: auto; + margin-top: 40px; + gap: 20px 20px; + width: 1160px; + flex-wrap: wrap; + justify-content: center; +`; + +const StatsCard = styled(GridContainer)` + cursor: pointer; + grid-template-columns: repeat(2, auto); + width: 275px; + height: 140px; + background: linear-gradient(180deg, rgba(40, 39, 39, 0.5) 0%, rgba(25, 24, 24, 0.5) 100%); + box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.25), inset 0px 1px 0px rgba(255, 255, 255, 0.1), + inset 0px 0px 20px rgba(255, 255, 255, 0.03); + border-radius: 15px; + padding: 16px 20px; + + svg.bg { + position: absolute; + z-index: 10; + margin-top: 16px; + margin-left: -20px; + width: 275px; + height: 140px; + } `; -export const Bullet = styled.span` - display: inline-block; - width: 8px; - height: 8px; - border-radius: 100%; - background: ${(props) => props.theme.colors.gold}; +const Container = styled.div` + margin-bottom: 140px; +`; + +const StyledCurrencyIcon = styled(Currency.Icon)` + width: 45px; + height: 45px; + margin-right: 15px; +`; + +const TabButtonsContainer = styled.div` + display: flex; + margin-top: 40px; + margin-bottom: 35px; + width: 150px; + height: 28px; + justify-content: center; + align-items: center; + border-radius: 134px; + background: #1d1d1d; + border: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: inset 0px -1.34783px 0px rgba(255, 255, 255, 0.08), + inset 0px 9.43478px 10.7826px rgba(0, 0, 0, 0.25); +`; + +const MarketSwitcher = styled(FlexDiv)<{ isActive: boolean }>` + cursor: pointer; + height: 28px; + font-size: 13px; + width: 88px; + display: flex; + align-items: center; + justify-content: center; + border-radius: ${(props) => (props.isActive ? '100px' : '134px')}; + color: ${(props) => + props.isActive + ? props.theme.colors.common.primaryWhite + : props.theme.colors.common.secondaryGray}; + background: ${(props) => + props.isActive ? 'linear-gradient(180deg, #BE9562 0%, #A07141 100%)' : null}; + text-shadow: 0px 1px 2px rgba(0, 0, 0, 0.5); + font-family: ${(props) => props.theme.fonts.bold}; + padding: 12px 16px; + box-shadow: ${(props) => + props.isActive + ? '0px 2px 2px rgba(0, 0, 0, 0.25), inset 0px 1px 0px rgba(255, 255, 255, 0.1), inset 0px 0px 20px rgba(255, 255, 255, 0.03)' + : null}; + border: ${(props) => (props.isActive ? '1px solid rgba(255, 255, 255, 0.15)' : null)}; + + &.short { + cursor: not-allowed; + } `; export default Assets; diff --git a/sections/homepage/Benefits/Benefits.tsx b/sections/homepage/Benefits/Benefits.tsx deleted file mode 100644 index d504a745c2..0000000000 --- a/sections/homepage/Benefits/Benefits.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import React from 'react'; -import { useTranslation } from 'react-i18next'; -import styled from 'styled-components'; - -import P2CIcon from 'assets/svg/marketing/icon-p2c.svg'; -import PermissionlessIcon from 'assets/svg/marketing/icon-permissionless.svg'; -import RestrictionsIcon from 'assets/svg/marketing/icon-restrictions.svg'; - -import { FlexDivCol } from 'styles/common'; - -import media from 'styles/media'; - -import { StackSection, CenterSubHeader, Title, Copy } from '../common'; - -const BENEFITS = [ - { - id: 'peer-to-contract', - image: , - title: 'homepage.benefits.peer-to-contract.title', - copy: 'homepage.benefits.peer-to-contract.copy', - }, - { - id: 'trading-pair', - image: , - title: 'homepage.benefits.trading-pair.title', - copy: 'homepage.benefits.trading-pair.copy', - }, - { - id: 'permissionless', - image: , - title: 'homepage.benefits.permissionless.title', - copy: 'homepage.benefits.permissionless.copy', - }, -]; - -const Benefits = () => { - const { t } = useTranslation(); - - return ( - - {t('homepage.benefits.title')} - - {BENEFITS.map(({ id, image, title, copy }) => ( - - {image} - {t(title)} - {t(copy)} - - ))} - - - ); -}; - -const StyledCenterSubHeader = styled(CenterSubHeader)` - padding-bottom: 56px; - max-width: 700px; - ${media.lessThan('lg')` - max-width: 450px; - `} -`; - -const BenefitCard = styled(FlexDivCol)` - align-items: flex-start; - img { - width: 64px; - height: 64px; - } -`; - -const StyledTitle = styled(Title)` - padding-bottom: 14px; - padding-top: 40px; -`; - -const BenefitContainer = styled.div` - display: grid; - grid-auto-flow: column; - align-items: baseline; - margin: 60px 0px 140px 0; - grid-gap: 40px; - ${media.lessThan('md')` - margin: 80px 0; - grid-auto-flow: unset; - grid-template-columns: repeat(2, 1fr); - `} - ${media.lessThan('sm')` - grid-gap: 50px; - grid-template-columns: auto; - margin: 56px 0px 80px 0; - `} -`; - -export default Benefits; diff --git a/sections/homepage/Benefits/index.ts b/sections/homepage/Benefits/index.ts deleted file mode 100644 index 31e68c527a..0000000000 --- a/sections/homepage/Benefits/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './Benefits'; diff --git a/sections/homepage/ChartBanner/ChartBanner.tsx b/sections/homepage/ChartBanner/ChartBanner.tsx deleted file mode 100644 index cbafece475..0000000000 --- a/sections/homepage/ChartBanner/ChartBanner.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import React from 'react'; -import { useTranslation } from 'react-i18next'; -import styled from 'styled-components'; - -import ChartBanner from 'assets/png/marketing/chart-banner.png'; - -import Button from 'components/Button'; - -import media from 'styles/media'; - -import { AbsoluteCenteredDiv, FlexDivCentered } from 'styles/common'; -import { StackSection, Subtext } from '../common'; -import Link from 'next/link'; -import ROUTES from 'constants/routes'; -import Webp from 'components/Webp'; - -const FAQ = () => { - const { t } = useTranslation(); - - return ( - - - - - {t('homepage.footer.cta.title')} - - - {t('homepage.footer.cta.button')} - - - - - - ); -}; - -const StyledStackSection = styled(StackSection)` - padding-top: 300px; - ${media.lessThan('sm')` - padding-top: 280px; - `} -`; - -const ChartGraphicContainer = styled(FlexDivCentered)` - position: relative; - width: 100vw; - justify-content: center; - margin-bottom: -100%; - transform: translateY(-50%); - overflow: hidden; -`; - -const OverlayText = styled(AbsoluteCenteredDiv)` - width: 100%; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - padding: 0 20px; -`; - -const StyledSubtext = styled(Subtext)` - padding-bottom: 32px; -`; - -const ChartBannerImage = styled.img` - max-width: 1440px; -`; - -export default FAQ; diff --git a/sections/homepage/ChartBanner/index.ts b/sections/homepage/ChartBanner/index.ts deleted file mode 100644 index 93a7f0d9f7..0000000000 --- a/sections/homepage/ChartBanner/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './ChartBanner'; diff --git a/sections/homepage/Earning/Earning.tsx b/sections/homepage/Earning/Earning.tsx new file mode 100644 index 0000000000..a8e5491f5a --- /dev/null +++ b/sections/homepage/Earning/Earning.tsx @@ -0,0 +1,226 @@ +import React from 'react'; +import { Trans, useTranslation } from 'react-i18next'; +import styled from 'styled-components'; + +import { + FlexDivCentered, + FlexDivCol, + FlexDivColCentered, + FlexDivRow, + GridDiv, + SmallGoldenHeader, + WhiteHeader, +} from 'styles/common'; +import { Copy, StackSection, Title } from '../common'; + +import ArrowUpRightIcon from 'assets/svg/app/arrow-up-right.svg'; +import StakeToEarnIcon from 'assets/svg/earn/stake-to-earn.svg'; +import TradeToEarnIcon from 'assets/svg/earn/trade-to-earn.svg'; +import VoteNGovernIcon from 'assets/svg/earn/vote-n-govern.svg'; + +import Link from 'next/link'; +import ROUTES from 'constants/routes'; +import Button from 'components/Button'; +import useGetFuturesCumulativeStats from 'queries/futures/useGetFuturesCumulativeStats'; +import Loader from 'components/Loader'; +import { formatCurrency, formatNumber, zeroBN } from 'utils/formatters/number'; +import { Synths } from 'constants/currency'; + +const EARNINGS = [ + { + id: 'stake-to-earn', + title: 'homepage.earning.stake-to-earn.title', + copy: 'homepage.earning.stake-to-earn.copy', + image: , + }, + { + id: 'trade-to-earn', + title: 'homepage.earning.trade-to-earn.title', + copy: 'homepage.earning.trade-to-earn.copy', + image: , + }, + { + id: 'vote-and-govern', + title: 'homepage.earning.vote-and-govern.title', + copy: 'homepage.earning.vote-and-govern.copy', + image: , + }, +]; + +const Earning = () => { + const { t } = useTranslation(); + + const title = ( + <> + {t('homepage.earning.title')} + + ]} /> + + {t('homepage.earning.copy')} + > + ); + + const totalTradeStats = useGetFuturesCumulativeStats(); + return ( + + + {title} + + {EARNINGS.map(({ id, title, copy, image }) => ( + + {image} + + {t(title)} + + {t(copy)} + + ))} + + + + + {totalTradeStats.isLoading ? ( + + ) : ( + formatCurrency(Synths.sUSD, totalTradeStats.data?.totalVolume || zeroBN, { + sign: '$', + minDecimals: 0, + }) + )} + + {t('homepage.earning.stats.volume')} + + + + {totalTradeStats.isLoading ? ( + + ) : ( + formatNumber(totalTradeStats.data?.totalTrades ?? 0, { minDecimals: 0 }) + )} + + {t('homepage.earning.stats.trades')} + + + + + + {t('homepage.earning.stake-kwenta')} + + + + + {t('homepage.earning.how-to-earn')} + + + + + + + ); +}; + +const GrayCopy = styled(Copy)` + margin-top: 17px; + text-align: center; + width: 446px; + font-size: 18px; + line-height: 100%; + color: ${(props) => props.theme.colors.common.secondaryGray}; +`; + +const Emphasis = styled.b` + color: ${(props) => props.theme.colors.common.primaryGold}; +`; + +const StyledButton = styled(Button)` + display: flex; + align-items: center; + justify-content: center; + text-transform: none; +`; + +const StatsName = styled.div` + font-size: 15px; + letter-spacing: -0.02em; + text-transform: uppercase; + color: ${(props) => props.theme.colors.common.secondaryGray}; +`; +const StatsValue = styled.div` + font-size: 40px; + line-height: 100%; + color: ${(props) => props.theme.colors.common.primaryWhite}; + margin-top: 14px; + margin-bottom: 10px; +`; +const StatsCardContainer = styled(FlexDivRow)` + margin: 80px 0px; + justify-content: center; + border-top: 1px solid #3d3c3c; + width: 1160px; +`; + +const StatsCard = styled(FlexDivColCentered)` + width: 580px; + padding: 10px 45px; + margin-top: 40px; + + &.first { + border-right: 1px solid #3d3c3c; + } +`; +const CenteredCopy = styled(Copy)` + font-size: 15px; + text-align: center; + line-height: 150%; + letter-spacing: -0.03em; + color: ${(props) => props.theme.colors.common.secondaryGray}; +`; + +const CenteredTitle = styled(Title)` + font-family: ${(props) => props.theme.fonts.compressedBlack}; + text-transform: uppercase; + font-size: 24px; +`; + +const Container = styled(GridDiv)` + width: 100vw; + background: linear-gradient(180deg, #0f0f0f 0%, #1e1e1e 100%); + overflow: hidden; + justify-content: center; + padding: 110px 0px; +`; + +const StyledFlexContainer = styled(FlexDivRow)` + width: 1160px; + justify-content: center; +`; + +const FeatureCard = styled(FlexDivCol)` + margin-top: 90px; + padding: 0px 40px; +`; + +const FeatureIconContainer = styled.div` + padding-bottom: 25px; + svg { + width: 64px; + height: 64px; + } + display: flex; + justify-content: center; +`; + +const FeatureContentTitle = styled(FlexDivCentered)` + padding-bottom: 20px; + justify-content: center; +`; + +const CTAContainer = styled.div` + margin-top: 28.5px; + display: flex; + justify-content: center; + gap: 20px; + width: 1160px; +`; + +export default Earning; diff --git a/sections/homepage/Earning/index.ts b/sections/homepage/Earning/index.ts new file mode 100644 index 0000000000..2706892636 --- /dev/null +++ b/sections/homepage/Earning/index.ts @@ -0,0 +1 @@ +export { default } from './Earning'; diff --git a/sections/homepage/FAQ/FAQ.tsx b/sections/homepage/FAQ/FAQ.tsx index ca785ebfbb..c015150860 100644 --- a/sections/homepage/FAQ/FAQ.tsx +++ b/sections/homepage/FAQ/FAQ.tsx @@ -198,7 +198,7 @@ const StyledAccordion = styled(Accordion)` } [data-reach-accordion-button] { ${resetButtonCSS}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 32px; width: 100%; text-align: left; @@ -213,7 +213,7 @@ const StyledAccordion = styled(Accordion)` `} } [data-reach-accordion-panel] { - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 16px; line-height: 22px; padding-top: 8px; diff --git a/sections/homepage/FAQ/index.ts b/sections/homepage/FAQ/index.ts deleted file mode 100644 index f213547f2c..0000000000 --- a/sections/homepage/FAQ/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './FAQ'; diff --git a/sections/homepage/Features/Features.tsx b/sections/homepage/Features/Features.tsx index 22ec1bdc4e..6bc47a43a1 100644 --- a/sections/homepage/Features/Features.tsx +++ b/sections/homepage/Features/Features.tsx @@ -2,111 +2,264 @@ import React from 'react'; import { useTranslation } from 'react-i18next'; import styled from 'styled-components'; -import SlippageIcon from 'assets/svg/marketing/icon-slippage.svg'; -import InfiniteLiquidityIcon from 'assets/svg/marketing/icon-infinite-liquidity.svg'; -import FuturesIcon from 'assets/svg/marketing/icon-futures.svg'; - -import { FlexDivCentered, FlexDivCol } from 'styles/common'; - -import { Copy, FlexSection, GridContainer, LeftSubHeader, Title } from '../common'; -import media from 'styles/media'; +import BlazingFastIcon from 'assets/svg/features/blazing-fast.svg'; +import LowGasFeeIcon from 'assets/svg/features/low-gas-fee.svg'; +import UniqueAssetsIcon from 'assets/svg/features/unique-assets.svg'; +import PermissionlessIcon from 'assets/png/features/permissionless.png'; +import MobileIcon from 'assets/svg/features/mobile.svg'; +import EasyRampingIcon from 'assets/svg/features/easy-ramping.svg'; +import ZeroSlippageIcon from 'assets/svg/features/zero-slippage.svg'; +import SynthetixIcon from 'assets/svg/partners/synthetix.svg'; +import LyraIcon from 'assets/svg/partners/lyra.svg'; +import AelinIcon from 'assets/svg/partners/aelin.svg'; +import ThalesIcon from 'assets/svg/partners/thales.svg'; +import OptimismIcon from 'assets/svg/partners/optimism.svg'; +import GraphIcon from 'assets/svg/partners/graph.svg'; +import HopIcon from 'assets/svg/partners/hop.svg'; +import ChainLinkIcon from 'assets/svg/partners/chainlink.svg'; +import { + FlexDivCentered, + FlexDivCol, + FlexDivColCentered, + FlexDivRow, + GridDivCentered, + SmallGoldenHeader, + WhiteHeader, +} from 'styles/common'; +import { Copy, Title } from '../common'; const FEATURES = [ { - id: 'infinite-liquidity', - title: 'homepage.features.infinite-liquidity.title', - copy: 'homepage.features.infinite-liquidity.copy', - image: , + key: 'blazing-fast', + title: 'homepage.features.blazing-fast.title', + copy: 'homepage.features.blazing-fast.copy', + image: , + }, + { + key: 'low-gas-fees', + title: 'homepage.features.low-gas-fees.title', + copy: 'homepage.features.low-gas-fees.copy', + image: , + }, + { + key: 'unique-assets', + title: 'homepage.features.unique-assets.title', + copy: 'homepage.features.unique-assets.copy', + image: , + }, + { + key: 'permissionless', + title: 'homepage.features.permissionless.title', + copy: 'homepage.features.permissionless.copy', + image: , + }, + { + key: 'mobile', + title: 'homepage.features.mobile.title', + copy: 'homepage.features.mobile.copy', + image: , + comingSoon: true, + }, + { + key: 'easy-ramping', + title: 'homepage.features.easy-ramping.title', + copy: 'homepage.features.easy-ramping.copy', + image: , + comingSoon: true, }, { - id: 'zero-slippage', + key: 'zero-slippage', title: 'homepage.features.zero-slippage.title', copy: 'homepage.features.zero-slippage.copy', - image: , + image: , }, +]; + +const PARTNERS = [ { - id: 'synthetic-futures', - title: 'homepage.features.synthetic-futures.title', - copy: 'homepage.features.synthetic-futures.copy', - image: , - comingSoon: true, + key: 'synthetix', + image: , + }, + { + key: 'lyra', + image: , + }, + { + key: 'aelin', + image: , + }, + { + key: 'thales', + image: , + }, + { + key: 'optimism', + image: , + }, + { + key: 'graph', + image: , + }, + { + key: 'hop', + image: , + }, + { + key: 'chainlink', + image: , }, ]; const Features = () => { const { t } = useTranslation(); + const title = ( + <> + {t('homepage.features.title')} + {t('homepage.features.description')} + > + ); + + const sectionTitle = ( + <> + {t('homepage.features.partners.title')} + {t('homepage.features.partners.copy')} + > + ); + return ( - - {t('homepage.features.title')} - - {FEATURES.map(({ id, title, comingSoon, copy, image }) => ( - - {image} + {title} + + {FEATURES.map(({ key, title, comingSoon, copy, image }) => ( + + {image} + - {t(title)} + {t(title)} {comingSoon && {t('common.features.coming-soon')}} - {t(copy)} - - ))} - - + {t(copy)} + + + ))} + + {sectionTitle} + + {PARTNERS.map(({ key, image }) => ( + + {image} + + ))} + ); }; -const StyledGridContainer = styled(GridContainer)` - ${media.lessThan('lg')` - grid-template-columns: repeat(3, auto); - `} - ${media.lessThan('md')` - grid-template-columns: auto; - `} +const FeatureCopy = styled(Copy)` + font-size: 15px; + line-height: 150%; + letter-spacing: -0.04em; + color: ${(props) => props.theme.colors.common.secondaryGray}; + width: 250px; +`; + +const FeatureTitle = styled(Title)` + font-size: 24px; + line-height: 100%; + font-family: ${(props) => props.theme.fonts.compressedBlack}; + text-transform: uppercase; + color: ${(props) => props.theme.colors.white}; + text-shadow: 0px 0px 12.83px rgba(255, 255, 255, 0.2); + width: 150px; +`; + +const StyledFlexDivRow = styled(FlexDivRow)` + margin: auto; + margin-top: 60px; + gap: 20px 20px; + width: 826px; + flex-wrap: wrap; + justify-content: center; +`; + +const IconGridContainer = styled(GridDivCentered)` + place-items: center; + justify-content: center; + grid-template-rows: 1fr 1fr; + grid-template-columns: repeat(4, 280px); + gap: 80px 20px; + margin-top: 80px; + svg { + width: 128px; + height: 64px; + } `; const Container = styled.div` - margin-bottom: 150px; - ${media.lessThan('lg')` - margin-bottom: 75px; - `} + margin: 140px 0px; `; -const StyledLeftSubHeader = styled(LeftSubHeader)` - max-width: 500px; - padding-top: 80px; - ${media.lessThan('lg')` - padding-top: 0; - padding-bottom: 56px; - `} +const FeatureCard = styled(FlexDivRow)` + background: linear-gradient(180deg, rgba(40, 39, 39, 0.5) 0%, rgba(25, 24, 24, 0.5) 100%); + box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.25), inset 0px 1px 0px rgba(255, 255, 255, 0.1), + inset 0px 0px 20px rgba(255, 255, 255, 0.03); + border-radius: 15px; + padding: 32px 80px 32px 32px; + width: 403px; + height: 135px; `; -const FeatureCard = styled(FlexDivCol)` - margin-bottom: 16px; +const PartnerIconContainer = styled.div` + place-self: center; + svg { + width: 128px; + height: 64px; + } `; const FeatureIconContainer = styled.div` padding-bottom: 40px; - img { + img, + svg { width: 64px; height: 64px; } `; -const FeatureContentTitle = styled(FlexDivCentered)` - padding-bottom: 14px; +const FeatureContentContainer = styled(FlexDivCol)` + margin-left: 20px; +`; + +const FeatureContentTitle = styled(FlexDivRow)` + padding-bottom: 12px; `; const ComingSoonTag = styled(FlexDivCentered)` - width: 104px; + width: 50px; height: 24px; - background: ${(props) => props.theme.colors.gold}; - border-radius: 50px; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.bold}; justify-content: center; margin-left: 16px; + background: linear-gradient(180deg, #39332d 0%, #2d2a28 100%); + box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.25), inset 0px 1px 0px rgba(255, 255, 255, 0.1), + inset 0px 0px 20px rgba(255, 255, 255, 0.03); + border-radius: 8px; + border: 1px solid #9c6c3c; +`; + +const SectionFeatureTitle = styled(FeatureTitle)` + margin-top: 80px; + text-align: center; + width: 500px; +`; + +const SectionFeatureCopy = styled(FeatureCopy)` + margin-top: 16px; + text-align: center; + width: 500px; + font-size: 18px; `; export default Features; diff --git a/sections/homepage/Hero/Hero.tsx b/sections/homepage/Hero/Hero.tsx index 5a712e1559..c7b0425e09 100644 --- a/sections/homepage/Hero/Hero.tsx +++ b/sections/homepage/Hero/Hero.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { useTranslation } from 'react-i18next'; +import { Trans, useTranslation } from 'react-i18next'; import styled from 'styled-components'; import LogoNoTextSVG from 'assets/svg/brand/logo-no-text.svg'; @@ -22,13 +22,16 @@ const Hero = () => { {t('homepage.hero.title')} + + ]} /> + - - - {t('homepage.nav.start-trading')} + + + {t('homepage.nav.trade-now')} @@ -39,40 +42,52 @@ const Hero = () => { ); }; +const Emphasis = styled.b` + color: ${(props) => props.theme.colors.common.primaryWhite}; +`; + const Header = styled(Paragraph)` - font-family: ${(props) => props.theme.fonts.bold}; - font-size: 48px; - line-height: 120%; + font-family: ${(props) => props.theme.fonts.compressedBlack}; + max-width: 636px; + font-size: 80px; + line-height: 85%; text-align: center; - letter-spacing: 0.2px; - color: ${(props) => props.theme.colors.white}; + text-transform: uppercase; + color: ${(props) => props.theme.colors.common.primaryGold}; + text-shadow: 0px 0px 62px rgba(208, 168, 117, 0.35); padding-top: 40px; `; +const ProductDescription = styled(Paragraph)` + font-family: ${(props) => props.theme.fonts.regular}; + max-width: 530px; + font-size: 24px; + line-height: 120%; + text-align: center; + color: #bdbdbd; + padding-top: 16px; +`; + const HeroImageContainer = styled(GridDiv)` width: 100vw; overflow: hidden; display: grid; justify-content: center; - margin-top: -40px; - min-height: 839px; - ${media.lessThan('md')` - min-height: 684px; - `} - ${media.lessThan('sm')` - margin-top: 0; - min-height: 338px; - `} + margin-top: 97px; + margin-bottom: 201px; `; const HeroImage = styled.img` - max-width: 1400px; + width: 960px; ${media.lessThan('md')` - width: 1140px; + width: 785px; `} ${media.lessThan('sm')` - width: 560px; + width: 380px; `} + background: linear-gradient(180deg, #C9975A 0%, #94F2FF 100%); + border: 1px solid; + border-radius: 20px; `; const SynthetixContainer = styled.div` diff --git a/sections/homepage/L2/L2.tsx b/sections/homepage/L2/L2.tsx index 2d64b6404f..2bea31de6b 100644 --- a/sections/homepage/L2/L2.tsx +++ b/sections/homepage/L2/L2.tsx @@ -148,7 +148,7 @@ const Golden = styled.div` `; const Emphasis = styled.b` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; const StyledGridContainer = styled(GridContainer)` diff --git a/sections/homepage/L2/index.ts b/sections/homepage/L2/index.ts deleted file mode 100644 index 771caabcc4..0000000000 --- a/sections/homepage/L2/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './L2'; diff --git a/sections/homepage/Learn/Learn.tsx b/sections/homepage/Learn/Learn.tsx new file mode 100644 index 0000000000..bfcbe6706c --- /dev/null +++ b/sections/homepage/Learn/Learn.tsx @@ -0,0 +1,234 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import styled from 'styled-components'; + +import ArrowUpRightIcon from 'assets/svg/app/arrow-up-right.svg'; +import FaqIcon from 'assets/png/learn/faq.png'; +import HowToTradeIcon from 'assets/svg/learn/how-to-trade.svg'; +import HowToStakeIcon from 'assets/svg/learn/how-to-stake.svg'; +import HowGovernanceIcon from 'assets/svg/learn/how-governance.svg'; +import Button from 'components/Button'; +import { EXTERNAL_LINKS } from 'constants/links'; +import { + FlexDivCol, + FlexDivColCentered, + FlexDivRow, + SmallGoldenHeader, + WhiteHeader, +} from 'styles/common'; +import { Copy, Title } from '../common'; + +const LEARNS = [ + { + key: 'how-to-trade', + title: 'homepage.learn.how-to-trade.title', + copy: 'homepage.learn.how-to-trade.copy', + image: , + onClick: () => window.open(EXTERNAL_LINKS.Docs.HowToTrade, '_blank'), + }, + { + key: 'how-to-stake', + title: 'homepage.learn.how-to-stake.title', + copy: 'homepage.learn.how-to-stake.copy', + image: , + onClick: () => {}, + }, + { + key: 'how-governance', + title: 'homepage.learn.how-governance.title', + copy: 'homepage.learn.how-governance.copy', + image: , + onClick: () => window.open(EXTERNAL_LINKS.Docs.Governance, '_blank'), + }, + { + key: 'faq', + title: 'homepage.learn.faq', + copy: '', + image: , + onClick: () => window.open(EXTERNAL_LINKS.Docs.Faq, '_blank'), + }, +]; + +const Learn = () => { + const { t } = useTranslation(); + + const title = ( + <> + {t('homepage.learn.title')} + {t('homepage.learn.description')} + > + ); + + return ( + + {title} + + {LEARNS.map(({ key, title, copy, image, onClick }) => ( + + {image} + + {key !== 'faq' ? ( + {t(title)} + ) : ( + + {t(title)} + + + )} + {t(copy)} + {key !== 'faq' ? ( + + {t('homepage.learn.title')} + + + ) : ( + <>> + )} + + + ))} + + + ); +}; + +const StyledButton = styled(Button)` + width: 148px; + height: 40px; + display: flex; + align-items: center; + padding: 0px 30px; +`; + +const FeatureCopy = styled(Copy)` + font-size: 15px; + line-height: 150%; + letter-spacing: -0.04em; + color: ${(props) => props.theme.colors.common.secondaryGray}; + margin-bottom: 36px; + width: 280px; +`; + +const FeatureTitle = styled(Title)` + font-size: 24px; + line-height: 100%; + font-family: ${(props) => props.theme.fonts.compressedBlack}; + text-transform: uppercase; + color: ${(props) => props.theme.colors.white}; + text-shadow: 0px 0px 12.83px rgba(255, 255, 255, 0.2); + width: 203px; + padding-bottom: 20px; + + &.how-to-stake, + &.how-governance { + width: 252px; + } + + &.how-to-trade { + margin-top: 0px; + width: 203px; + } + + &.faq { + padding-bottom: 0px; + margin: 5px; + margin-left: 0px; + cursor: pointer; + } + + svg { + width: 20px; + height: 20px; + } +`; + +const StyledFlexDivRow = styled(FlexDivRow)` + margin: auto; + margin-top: 60px; + gap: 20px 20px; + width: 766px; + flex-wrap: wrap; +`; + +const Container = styled.div` + margin-bottom: 140px; +`; + +const FeatureCard = styled(FlexDivRow)` + background: linear-gradient(180deg, rgba(40, 39, 39, 0.5) 0%, rgba(25, 24, 24, 0.5) 100%); + box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.25), inset 0px 1px 0px rgba(255, 255, 255, 0.1), + inset 0px 0px 20px rgba(255, 255, 255, 0.03); + border-radius: 15px; + padding: 32px 32px 32px 32px; + height: 380px; + + &.how-to-stake, + &.how-governance { + width: 373px; + display: flex; + flex-direction: column; + justify-content: flex-end; + } + + &.how-to-trade { + width: 766px; + height: 280px; + display: flex; + flex-direction: row-reverse; + justify-content: space-between; + } + + &.faq { + width: 766px; + height: 100px; + flex-direction: row-reverse; + } +`; + +const FeatureIconContainer = styled.div` + display: flex; + align-items: center; + width: 64px; + height: 64px; + + &.faq { + padding-bottom: 15px; + } + + img { + width: 60px; + height: 60px; + } + + &.how-to-stake { + width: 154px; + height: 100px; + margin-bottom: 15px; + padding-left: 10px; + } + + &.how-governance { + width: 156px; + height: 100px; + margin-bottom: 15px; + padding-left: 10px; + } + + &.how-to-trade { + width: 332px; + height: 200px; + } +`; + +const FeatureContentContainer = styled(FlexDivCol)` + margin-left: 10px; + width: 313px; + justify-content: space-between; +`; + +export default Learn; diff --git a/sections/homepage/Learn/index.ts b/sections/homepage/Learn/index.ts new file mode 100644 index 0000000000..72b4dd3e22 --- /dev/null +++ b/sections/homepage/Learn/index.ts @@ -0,0 +1 @@ +export { default } from './Learn'; diff --git a/sections/homepage/ShortList/ShortList.tsx b/sections/homepage/ShortList/ShortList.tsx new file mode 100644 index 0000000000..77c91bccc5 --- /dev/null +++ b/sections/homepage/ShortList/ShortList.tsx @@ -0,0 +1,360 @@ +import React, { useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useRouter } from 'next/router'; +import styled from 'styled-components'; +import { CellProps } from 'react-table'; +import Wei, { wei } from '@synthetixio/wei'; +import { Synths } from '@synthetixio/contracts-interface'; + +import GridSvg from 'assets/svg/app/grid.svg'; +import Table from 'components/Table'; +import Currency from 'components/Currency'; +import Loader from 'components/Loader'; +import ROUTES from 'constants/routes'; +import useENS from 'hooks/useENS'; +import useGetStats from 'queries/futures/useGetStats'; +import { FuturesStat } from 'queries/futures/types'; +import useGetFuturesMarkets from 'queries/futures/useGetFuturesMarkets'; +import useGetFuturesDailyTradeStats from 'queries/futures/useGetFuturesDailyTradeStats'; +import { FlexDivColCentered, FlexDivRow, SmallGoldenHeader, WhiteHeader } from 'styles/common'; +import { Media } from 'styles/media'; +import { formatCurrency, formatNumber, zeroBN } from 'utils/formatters/number'; +import { truncateAddress } from 'utils/formatters/string'; +import { Copy, Title } from '../common'; + +type Stat = { + pnl: Wei; + liquidations: Wei; + totalTrades: Wei; + totalVolume: Wei; +}; + +const ShortList = () => { + const { t } = useTranslation(); + + const statsQuery = useGetStats(); + const stats = useMemo(() => statsQuery.data ?? [], [statsQuery]); + const pnlMap = useMemo( + () => + stats.reduce((acc: Record, stat: FuturesStat) => { + acc[stat.account] = { + pnl: wei(stat.pnlWithFeesPaid ?? 0, 18, true), + liquidations: new Wei(stat.liquidations ?? 0), + totalTrades: new Wei(stat.totalTrades ?? 0), + totalVolume: wei(stat.totalVolume ?? 0, 18, true), + }; + return acc; + }, {}), + [stats] + ); + + const router = useRouter(); + const onClickTrader = (trader: string) => { + router.push(ROUTES.Leaderboard.Trader(trader)); + }; + + const getMedal = (position: number) => { + switch (position) { + case 1: + return 🥇; + case 2: + return 🥈; + case 3: + return 🥉; + default: + return {position} ; + } + }; + + let data = useMemo( + () => + stats + .sort( + (a: FuturesStat, b: FuturesStat) => + (pnlMap[b.account]?.pnl || 0) - (pnlMap[a.account]?.pnl || 0) + ) + .map((stat: FuturesStat, i: number) => ({ + rank: i + 1, + trader: stat.account, + traderShort: truncateAddress(stat.account), + totalTrades: (pnlMap[stat.account]?.totalTrades ?? wei(0)).toNumber(), + totalVolume: (pnlMap[stat.account]?.totalVolume ?? wei(0)).toNumber(), + liquidations: (pnlMap[stat.account]?.liquidations ?? wei(0)).toNumber(), + '24h': 80000, + pnl: (pnlMap[stat.account]?.pnl ?? wei(0)).toNumber(), + })), + [stats, pnlMap] + ); + + const title = ( + <> + {t('homepage.shortlist.title')} + {t('homepage.shortlist.description')} + > + ); + + const sectionTitle = ( + <> + {t('homepage.shortlist.stats.title')} + {t('homepage.shortlist.stats.copy')} + > + ); + + const dailyTradeStats = useGetFuturesDailyTradeStats(); + + const futuresMarketsQuery = useGetFuturesMarkets(); + const openInterest = useMemo(() => { + const futuresMarkets = futuresMarketsQuery?.data ?? []; + return futuresMarkets + .map((market) => market.marketSize.mul(market.price).toNumber()) + .reduce((total, openInterest) => total + openInterest, 0); + }, [futuresMarketsQuery?.data]); + + return ( + + + {title} + + onClickTrader(row.original.trader)} + data={data} + pageSize={5} + hideHeaders={false} + columns={[ + { + Header: {t('leaderboard.leaderboard.table.rank')}, + accessor: 'rank', + Cell: (cellProps: CellProps) => ( + {getMedal(cellProps.row.original.rank)} + ), + width: 65, + }, + { + Header: {t('leaderboard.leaderboard.table.trader')}, + accessor: 'trader', + Cell: (cellProps: CellProps) => { + const { ensName, ensAvatar } = useENS(cellProps.row.original.trader); + return ( + + {ensName ? ( + <> + {ensAvatar && ( + + )} + {ensName} + > + ) : ( + cellProps.row.original.traderShort + )} + + ); + }, + width: 150, + }, + { + Header: {t('leaderboard.leaderboard.table.total-trades')}, + accessor: 'totalTrades', + Cell: (cellProps: CellProps) => ( + {cellProps.row.original.totalTrades} + ), + width: 100, + }, + { + Header: {t('leaderboard.leaderboard.table.liquidations')}, + accessor: 'liquidations', + Cell: (cellProps: CellProps) => ( + {cellProps.row.original.liquidations} + ), + width: 100, + }, + { + Header: {t('leaderboard.leaderboard.table.total-pnl')}, + accessor: 'pnl', + Cell: (cellProps: CellProps) => ( + + ), + width: 125, + }, + ]} + /> + {sectionTitle} + + + {t('homepage.shortlist.stats.volume')} + + {dailyTradeStats.isLoading ? ( + + ) : ( + formatCurrency(Synths.sUSD, dailyTradeStats.data?.totalVolume || zeroBN, { + sign: '$', + minDecimals: 0, + }) + )} + + + + + {t('homepage.shortlist.stats.open-interest')} + + {futuresMarketsQuery.isLoading ? ( + + ) : ( + formatCurrency(Synths.sUSD, openInterest ?? 0, { + sign: '$', + minDecimals: 0, + }) + )} + + + + + {t('homepage.shortlist.stats.trades')} + + {dailyTradeStats.isLoading ? ( + + ) : ( + formatNumber(dailyTradeStats.data?.totalTrades ?? 0, { minDecimals: 0 }) + )} + + + + + + ); +}; + +const StatsName = styled.div` + font-size: 15px; + color: ${(props) => props.theme.colors.common.secondaryGray}; +`; + +const StatsValue = styled.div` + font-size: 32px; + color: ${(props) => props.theme.colors.common.primaryWhite}; + margin-top: 14px; +`; + +const StatsCardContainer = styled(FlexDivRow)` + margin-top: 40px; + justify-content: center; + column-gap: 20px; +`; + +const StatsCard = styled(FlexDivColCentered)` + width: 308px; + height: 191px; + background: linear-gradient(180deg, rgba(40, 39, 39, 0.5) 0%, rgba(25, 24, 24, 0.5) 100%); + box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.25), inset 0px 1px 0px rgba(255, 255, 255, 0.1), + inset 0px 0px 20px rgba(255, 255, 255, 0.03); + border-radius: 15px; + padding: 45px; + padding-bottom: 0px; + justify-conent: flex-end; + svg { + width: 307px; + height: 79px; + } +`; + +const StyledTable = styled(Table)` + margin-top: 60px; + font-size: 15px; + width: 1160px; +`; + +const Medal = styled.span` + font-size: 15px; +`; + +const DefaultCell = styled.p` + font-size: 15px; +`; + +const ColorCodedPrice = styled(Currency.Price)` + align-items: right; + color: ${(props) => + props.price > 0 + ? props.theme.colors.green + : props.price < 0 + ? props.theme.colors.red + : props.theme.colors.white}; + font-size: 15px; +`; + +const Container = styled(FlexDivColCentered)` + margin-bottom: 140px; + justify-content: center; +`; + +const TableHeader = styled.div` + font-family: ${(props) => props.theme.fonts.regular}; + color: ${(props) => props.theme.colors.common.secondaryGray}; + font-size: 13px; +`; + +export const Bullet = styled.span` + display: inline-block; + width: 8px; + height: 8px; + border-radius: 100%; + background: ${(props) => props.theme.colors.gold}; +`; + +const StyledOrderType = styled.div` + color: ${(props) => props.theme.colors.white}; + text-align: center; + width: 40px; +`; + +const StyledTrader = styled.a` + color: ${(props) => props.theme.colors.white}; + display: flex; + font-size: 15px; +`; + +const FeatureCopy = styled(Copy)` + font-size: 15px; + line-height: 150%; + letter-spacing: -0.03em; + color: ${(props) => props.theme.colors.common.secondaryGray}; + width: 183px; +`; + +const FeatureTitle = styled(Title)` + font-size: 24px; + line-height: 100%; + font-family: ${(props) => props.theme.fonts.compressedBlack}; + text-transform: uppercase; + color: ${(props) => props.theme.colors.white}; + text-shadow: 0px 0px 12.83px rgba(255, 255, 255, 0.2); + width: 150px; +`; + +const SectionFeatureTitle = styled(FeatureTitle)` + margin-top: 80px; + text-align: center; + width: 500px; +`; + +const SectionFeatureCopy = styled(FeatureCopy)` + margin-top: 16px; + text-align: center; + width: 500px; + font-size: 18px; +`; + +export default ShortList; diff --git a/sections/homepage/ShortList/index.ts b/sections/homepage/ShortList/index.ts new file mode 100644 index 0000000000..1bd07f9f9f --- /dev/null +++ b/sections/homepage/ShortList/index.ts @@ -0,0 +1 @@ +export { default } from './ShortList'; diff --git a/sections/homepage/Steps/Steps.tsx b/sections/homepage/Steps/Steps.tsx index abba2a7b7b..e6b6f77d0d 100644 --- a/sections/homepage/Steps/Steps.tsx +++ b/sections/homepage/Steps/Steps.tsx @@ -118,7 +118,7 @@ const StepTitle = styled(Paragraph)` font-family: ${(props) => props.theme.fonts.bold}; font-size: 32px; line-height: 41px; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; padding: 20px 0 40px 0; `; diff --git a/sections/homepage/Steps/index.ts b/sections/homepage/Steps/index.ts deleted file mode 100644 index 6905f324f2..0000000000 --- a/sections/homepage/Steps/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default, STEPS } from './Steps'; diff --git a/sections/homepage/TradeNow/TradeNow.tsx b/sections/homepage/TradeNow/TradeNow.tsx new file mode 100644 index 0000000000..7a3c2de1f9 --- /dev/null +++ b/sections/homepage/TradeNow/TradeNow.tsx @@ -0,0 +1,70 @@ +import Link from 'next/link'; +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import styled from 'styled-components'; + +import Button from 'components/Button'; +import ROUTES from 'constants/routes'; +import { FlexDivColCentered, Paragraph, SmallGoldenHeader, WhiteHeader } from 'styles/common'; +import { Media } from 'styles/media'; + +const TradeNow = () => { + const { t } = useTranslation(); + + const title = ( + + {t('homepage.tradenow.title')} + {t('homepage.tradenow.description')} + {t('homepage.tradenow.categories')} + + + + {t('homepage.nav.trade-now')} + + + + + ); + + return ( + + + {title} + + {title} + + ); +}; + +const TransparentCard = styled.div` + padding: 140px 303px; + box-sizing: border-box; + text-align: center; + background: linear-gradient(180deg, rgba(40, 39, 39, 0.5) 0%, rgba(25, 24, 24, 0.5) 100%); + box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.25), inset 0px 1px 0px rgba(255, 255, 255, 0.1), + inset 0px 0px 20px rgba(255, 255, 255, 0.03); + border-radius: 15px; +`; +const Container = styled.div` + margin-bottom: 140px; +`; + +const GrayDescription = styled(Paragraph)` + color: ${(props) => props.theme.colors.common.secondaryGray}; + font-size: 24px; + line-height: 120%; + text-align: center; + margin-top: 30px; +`; + +const CTAContainer = styled.div` + margin: 50px 0px 0px 0; + z-index: 1; +`; + +const BigWhiteHeader = styled(WhiteHeader)` + font-size: 60px; + width: 600px; +`; + +export default TradeNow; diff --git a/sections/homepage/TradeNow/index.ts b/sections/homepage/TradeNow/index.ts new file mode 100644 index 0000000000..47d8ab1321 --- /dev/null +++ b/sections/homepage/TradeNow/index.ts @@ -0,0 +1 @@ +export { default } from './TradeNow'; diff --git a/sections/homepage/common.tsx b/sections/homepage/common.tsx index 091636fc1c..ae17c4018e 100644 --- a/sections/homepage/common.tsx +++ b/sections/homepage/common.tsx @@ -9,7 +9,7 @@ export const SubHeader = styled(Paragraph)` line-height: 120%; letter-spacing: 0.2px; font-family: ${(props) => props.theme.fonts.bold}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; ${media.lessThan('md')` font-size: 32px; text-align: center; @@ -56,7 +56,7 @@ export const Title = styled(Paragraph)` font-size: 16px; font-family: ${(props) => props.theme.fonts.bold}; text-align: left; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; export const Copy = styled(Paragraph)` @@ -73,5 +73,5 @@ export const Subtext = styled(Paragraph)` line-height: 120%; text-align: center; letter-spacing: 0.2px; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; diff --git a/sections/leaderboard/Leaderboard/Leaderboard.tsx b/sections/leaderboard/Leaderboard/Leaderboard.tsx index c4525e2413..f1e058de72 100644 --- a/sections/leaderboard/Leaderboard/Leaderboard.tsx +++ b/sections/leaderboard/Leaderboard/Leaderboard.tsx @@ -17,7 +17,9 @@ import Loader from 'components/Loader'; import TraderHistory from '../TraderHistory'; import Search from 'components/Table/Search'; import ROUTES from 'constants/routes'; -import useENS from 'hooks/useENS'; +import useENSs from 'hooks/useENSs'; +import useENSAvatar from 'hooks/useENSAvatar'; +import Connector from 'containers/Connector'; type LeaderboardProps = { compact?: boolean; @@ -32,16 +34,27 @@ type Stat = { const Leaderboard: FC = ({ compact }: LeaderboardProps) => { const { t } = useTranslation(); - const [searchTerm, setSearchTerm] = useState(); + const [searchTerm, setSearchTerm] = useState(''); const [selectedTrader, setSelectedTrader] = useState(''); const [traderENSName, setTraderENSName] = useState(null); const router = useRouter(); + const { staticMainnetProvider } = Connector.useContainer(); const walletAddress = useRecoilValue(walletAddressState); const statsQuery = useGetStats(); const stats = useMemo(() => statsQuery.data ?? [], [statsQuery]); + const traders = useMemo( + () => + stats.map((stat: FuturesStat) => { + return stat.account; + }) ?? [], + [stats] + ); + const ensInfoQuery = useENSs(traders); + const ensInfo = useMemo(() => ensInfoQuery.data ?? [], [ensInfoQuery]); + useMemo(() => { if (router.query.tab) { const trader = router.query.tab[0]; @@ -69,25 +82,33 @@ const Leaderboard: FC = ({ compact }: LeaderboardProps) => { let data = useMemo(() => { return stats - .sort( - (a: FuturesStat, b: FuturesStat) => - (pnlMap[b.account]?.pnl || 0) - (pnlMap[a.account]?.pnl || 0) - ) .map((stat: FuturesStat, i: number) => ({ - rank: i + 1, address: stat.account, trader: stat.account, traderShort: truncateAddress(stat.account), + traderEns: ensInfo[i] + ? ensInfo[i].endsWith('.eth') + ? ensInfo[i] + : truncateAddress(ensInfo[i]) + : null, totalTrades: (pnlMap[stat.account]?.totalTrades ?? wei(0)).toNumber(), totalVolume: (pnlMap[stat.account]?.totalVolume ?? wei(0)).toNumber(), liquidations: (pnlMap[stat.account]?.liquidations ?? wei(0)).toNumber(), '24h': 80000, pnl: (pnlMap[stat.account]?.pnl ?? wei(0)).toNumber(), })) - .filter((i: { trader: string }) => - searchTerm?.length ? i.trader.toLowerCase().includes(searchTerm) : true + .sort((a: FuturesStat, b: FuturesStat) => (b?.pnl || 0) - (a?.pnl || 0)) + .map((stat: FuturesStat, i: number) => ({ + rank: i + 1, + ...stat, + })) + .filter((i: { trader: string; traderEns: string }) => + searchTerm?.length + ? i.trader.toLowerCase().includes(searchTerm) || + i.traderEns?.toLowerCase().includes(searchTerm) + : true ); - }, [stats, searchTerm, pnlMap]); + }, [stats, searchTerm, pnlMap, ensInfo]); if (compact) { const ownPosition = data.findIndex((i: { address: string }) => { @@ -143,7 +164,7 @@ const Leaderboard: FC = ({ compact }: LeaderboardProps) => { = ({ compact }: LeaderboardProps) => { ), accessor: 'trader', Cell: (cellProps: CellProps) => { - const { ensName, ensAvatar } = useENS(cellProps.row.original.trader); + const avatar = useENSAvatar( + staticMainnetProvider, + cellProps.row.original.traderEns + ); return ( onClickTrader(cellProps.row.original.trader, ensName)} + onClick={() => + onClickTrader( + cellProps.row.original.trader, + cellProps.row.original.traderEns + ) + } > {compact && cellProps.row.original.rank + '. '} - {ensName ? ( + {avatar ? ( <> - {ensAvatar && ( + {!avatar.isLoading && avatar.data && ( (err.target.style.display = 'none')} /> )} - {ensName} + {cellProps.row.original.traderEns} > ) : ( - cellProps.row.original.traderShort + cellProps.row.original.traderEns ?? cellProps.row.original.traderShort )} - {getMedal(cellProps.row.index + 1)} + {getMedal(cellProps.row.original.rank)} ); }, @@ -276,10 +307,10 @@ const ColorCodedPrice = styled(Currency.Price)` align-items: right; color: ${(props) => props.price > 0 - ? props.theme.colors.green + ? props.theme.colors.selectedTheme.green : props.price < 0 - ? props.theme.colors.red - : props.theme.colors.white}; + ? props.theme.colors.selectedTheme.red + : props.theme.colors.selectedTheme.button.text}; `; const SearchContainer = styled.div` @@ -305,22 +336,22 @@ const TableTitle = styled.div` const TitleText = styled.div` font-family: ${(props) => props.theme.fonts.regular}; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; `; const TableHeader = styled.div` font-family: ${(props) => props.theme.fonts.regular}; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; `; const StyledOrderType = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; display: flex; align-items: center; `; const StyledTrader = styled.a` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; display: flex; &:hover { diff --git a/sections/leaderboard/Statistics/DistributionChart/DistributionChart.tsx b/sections/leaderboard/Statistics/DistributionChart/DistributionChart.tsx index 19cab77213..435fa4711c 100644 --- a/sections/leaderboard/Statistics/DistributionChart/DistributionChart.tsx +++ b/sections/leaderboard/Statistics/DistributionChart/DistributionChart.tsx @@ -63,7 +63,7 @@ const LegendBox = styled.div<{ stroke: string; background: string }>` const LegendLabel = styled.div` margin-top: 12px; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; const strokeColor = (asset: string) => { diff --git a/sections/leaderboard/Statistics/Statistics.tsx b/sections/leaderboard/Statistics/Statistics.tsx index afd4195662..2d77cfc273 100644 --- a/sections/leaderboard/Statistics/Statistics.tsx +++ b/sections/leaderboard/Statistics/Statistics.tsx @@ -168,7 +168,7 @@ const Label = styled.div` `; const Value = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.mono}; font-size: 32px; line-height: 38px; diff --git a/sections/leaderboard/TraderHistory/TraderHistory.tsx b/sections/leaderboard/TraderHistory/TraderHistory.tsx index 8e60782d7a..2aec5c8902 100644 --- a/sections/leaderboard/TraderHistory/TraderHistory.tsx +++ b/sections/leaderboard/TraderHistory/TraderHistory.tsx @@ -37,20 +37,32 @@ const TraderHistory: FC = ({ let data = useMemo(() => { return positions .sort((a: PositionHistory, b: PositionHistory) => b.timestamp - a.timestamp) - .map((stat: PositionHistory, i: number) => ({ - rank: i + 1, - currencyIconKey: stat.asset ? (stat.asset[0] !== 's' ? 's' : '') + stat.asset : '', - marketShortName: (stat.asset[0] === 's' ? stat.asset.slice(1) : stat.asset) + '-PERP', - openTimestamp: stat.openTimestamp, - asset: stat.asset, - status: stat.isOpen ? 'Open' : stat.isLiquidated ? 'Liquidated' : 'Closed', - feesPaid: stat.feesPaid, - netFunding: stat.netFunding, - pnl: stat.pnl.sub(stat.feesPaid).add(stat.netFunding), - totalVolume: stat.totalVolume, - trades: stat.trades, - side: stat.side, - })) + .map((stat: PositionHistory, i: number) => { + const pnlAfterFees = stat.pnl.sub(stat.feesPaid).add(stat.netFunding); + const actualPnl = pnlAfterFees.lt(stat.initialMargin.add(stat.totalDeposits).mul(-1)) + ? stat.initialMargin.add(stat.totalDeposits).mul(-1) + : pnlAfterFees; + + return { + rank: i + 1, + currencyIconKey: stat.asset ? (stat.asset[0] !== 's' ? 's' : '') + stat.asset : '', + marketShortName: (stat.asset[0] === 's' ? stat.asset.slice(1) : stat.asset) + '-PERP', + openTimestamp: stat.openTimestamp, + asset: stat.asset, + status: stat.isOpen ? 'Open' : stat.isLiquidated ? 'Liquidated' : 'Closed', + feesPaid: stat.feesPaid, + netFunding: stat.netFunding, + pnl: actualPnl, + pnlPct: `(${actualPnl + .div(stat.initialMargin.add(stat.totalDeposits)) + .mul(100) + .toNumber() + .toFixed(2)}%)`, + totalVolume: stat.totalVolume, + trades: stat.trades, + side: stat.side, + }; + }) .filter((i: { marketShortName: string; status: string }) => searchTerm?.length ? i.marketShortName.toLowerCase().includes(searchTerm) || @@ -158,12 +170,25 @@ const TraderHistory: FC = ({ Header: {t('leaderboard.trader-history.table.total-pnl')}, accessor: 'pnl', Cell: (cellProps: CellProps) => ( - + + + + {cellProps.row.original.pnlPct} + + ), width: compact ? 40 : 100, sortType: 'basic', @@ -188,7 +213,7 @@ const TableTitle = styled.div` const TitleText = styled.a` font-family: ${(props) => props.theme.fonts.regular}; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; &:hover { text-decoration: underline; @@ -197,7 +222,7 @@ const TitleText = styled.a` `; const StyledCell = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; display: flex; `; @@ -205,12 +230,12 @@ const TitleSeparator = styled.div` margin-left: 10px; margin-right: 10px; font-family: ${(props) => props.theme.fonts.regular}; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; `; const TraderText = styled.a` font-family: ${(props) => props.theme.fonts.regular}; - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; &:hover { text-decoration: underline; @@ -219,7 +244,7 @@ const TraderText = styled.a` const TableHeader = styled.div` font-family: ${(props) => props.theme.fonts.regular}; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; `; const StyledCurrencyIcon = styled(CurrencyIcon)` @@ -235,18 +260,37 @@ const CurrencyInfo = styled(FlexDiv)` const StyledSubtitle = styled.div` font-family: ${(props) => props.theme.fonts.regular}; font-size: 13px; - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; text-transform: capitalize; `; +const PnlContainer = styled.div` + display: flex; + flex-direction: column; + align-items: center; +`; + const ColorCodedPrice = styled(Currency.Price)` align-items: right; color: ${(props) => props.price > 0 - ? props.theme.colors.green + ? props.theme.colors.selectedTheme.green : props.price < 0 - ? props.theme.colors.red - : props.theme.colors.white}; + ? props.theme.colors.selectedTheme.red + : props.theme.colors.selectedTheme.button.text}; +`; + +const StyledValue = styled.div` + font-family: ${(props) => props.theme.fonts.mono}; + font-size: 13px; + color: ${(props) => + props.color === 'green' + ? props.theme.colors.selectedTheme.green + : props.color === 'red' + ? props.theme.colors.selectedTheme.red + : props.theme.colors.selectedTheme.button.text}; + margin: 0; + text-align: end; `; export default TraderHistory; diff --git a/sections/shared/Layout/AppLayout/Header/BalanceActions.tsx b/sections/shared/Layout/AppLayout/Header/BalanceActions.tsx index 8c5d233ec8..b69a2ec5e2 100644 --- a/sections/shared/Layout/AppLayout/Header/BalanceActions.tsx +++ b/sections/shared/Layout/AppLayout/Header/BalanceActions.tsx @@ -148,7 +148,11 @@ const BalanceActions: FC = ({ return ( {sUSDBalance.eq(zeroBN) && accessiblePositions.length === 0 ? ( - setShowUniswapWidget(true)}> + setShowUniswapWidget(true)} + noOutline={true} + > {t('header.balance.get-susd')} @@ -170,6 +174,7 @@ const BalanceActions: FC = ({ IndicatorSeparator: () => null, }} isSearchable={false} + noOutline={true} > )} @@ -192,7 +197,7 @@ const BalanceSelect = styled(Select)<{ value: { label: string } }>` padding: 20px; .react-select__group-heading { - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 12px; padding: 0; margin-bottom: 15px; @@ -227,7 +232,7 @@ const StyledLabel = styled.div<{ noPadding: boolean }>` `; const LabelContainer = styled(FlexDivRowCentered)` - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 13px; padding: 10px; > div { @@ -237,6 +242,7 @@ const LabelContainer = styled(FlexDivRowCentered)` const StyledButton = styled(Button)` width: 100%; + height: 41px; font-size: 13px; margin-top: 15px; align-items: center; diff --git a/sections/shared/Layout/AppLayout/Header/Header.tsx b/sections/shared/Layout/AppLayout/Header/Header.tsx index f9e15268b3..ec2ba512cb 100644 --- a/sections/shared/Layout/AppLayout/Header/Header.tsx +++ b/sections/shared/Layout/AppLayout/Header/Header.tsx @@ -2,9 +2,8 @@ import { FC } from 'react'; import styled from 'styled-components'; import { MobileHiddenView, MobileOnlyView } from 'components/Media'; -import { HEADER_HEIGHT, HEADER_TOP_PADDING, zIndex } from 'constants/ui'; +import { zIndex } from 'constants/ui'; -import { GridDivCol } from 'styles/common'; import media from 'styles/media'; import Logo from '../../Logo'; @@ -18,19 +17,19 @@ import { isL2State } from 'store/wallet'; const Header: FC = () => { const isL2 = useRecoilValue(isL2State); - const logo = ; - return ( - {logo} + - {logo} + + + @@ -48,19 +47,17 @@ const Container = styled.header<{ isL2: boolean }>` box-shadow: 0 8px 8px 0 ${(props) => props.theme.colors.black}; `}; > div { - /* height: ${HEADER_HEIGHT}; */ - /* padding-top: ${HEADER_TOP_PADDING}; */ padding-bottom: 20px; display: flex; justify-content: space-between; - align-items: flex-start; } `; -const LogoNav = styled(GridDivCol)` - padding-top: 8px; - grid-gap: 24px; - align-items: start; +const LogoNav = styled.div` + display: flex; + align-items: center; `; +const StyledLogo = styled(Logo)``; + export default Header; diff --git a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileSettingsModal.tsx b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileSettingsModal.tsx index 33960dee8a..cf57eea841 100644 --- a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileSettingsModal.tsx +++ b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileSettingsModal.tsx @@ -142,7 +142,7 @@ const OptionRow = styled.div` const WalletConnected = styled(FlexDivRowCentered)` font-family: ${(props) => props.theme.fonts.mono}; background-color: ${(props) => props.theme.colors.navy}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; border-radius: 4px; margin-bottom: 24px; padding: 0 16px; diff --git a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileUserMenu.tsx b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileUserMenu.tsx index e38e45000e..8997c41064 100644 --- a/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileUserMenu.tsx +++ b/sections/shared/Layout/AppLayout/Header/MobileUserMenu/MobileUserMenu.tsx @@ -73,7 +73,8 @@ const Menu = styled.div` const MenuButton = styled.button<{ isActive: boolean }>` ${resetButtonCSS}; - color: ${(props) => (props.isActive ? props.theme.colors.white : props.theme.colors.blueberry)}; + color: ${(props) => + props.isActive ? props.theme.colors.selectedTheme.button.text : props.theme.colors.blueberry}; &:hover { color: ${(props) => props.theme.colors.white}; } diff --git a/sections/shared/Layout/AppLayout/Header/Nav/Nav.tsx b/sections/shared/Layout/AppLayout/Header/Nav/Nav.tsx index 0f85667c34..8430ce879a 100644 --- a/sections/shared/Layout/AppLayout/Header/Nav/Nav.tsx +++ b/sections/shared/Layout/AppLayout/Header/Nav/Nav.tsx @@ -62,18 +62,21 @@ const MenuLinks = styled.ul` `; const MenuLinkItem = styled.li<{ isActive: boolean }>` - padding-right: 20px; a { ${linkCSS}; + padding: 8px 13px; + margin-right: 2px; font-family: ${(props) => props.theme.fonts.bold}; font-size: 15px; text-transform: capitalize; + border-radius: 100px; + background: transparent; color: ${(props) => props.isActive - ? props.theme.colors.common.primaryGold - : props.theme.colors.common.secondaryGray}; + ? props.theme.colors.selectedTheme.button.text + : props.theme.colors.selectedTheme.gray}; &:hover { - color: ${(props) => props.theme.colors.white}; + background: ${(props) => props.theme.colors.selectedTheme.button.fill}; } } `; diff --git a/sections/shared/Layout/AppLayout/Header/NetworksSwitcher.tsx b/sections/shared/Layout/AppLayout/Header/NetworksSwitcher.tsx index a63ec3815e..28aa6156d8 100644 --- a/sections/shared/Layout/AppLayout/Header/NetworksSwitcher.tsx +++ b/sections/shared/Layout/AppLayout/Header/NetworksSwitcher.tsx @@ -84,7 +84,9 @@ const NetworksSwitcher: FC = () => { return !isL2 ? ( - {t('header.networks-switcher.l2')} + + {t('header.networks-switcher.l2')} + ) : ( @@ -97,6 +99,7 @@ const NetworksSwitcher: FC = () => { optionPadding={'0px'} //override default padding to 0 components={{ IndicatorSeparator, DropdownIndicator }} isSearchable={false} + noOutline={true} > ); @@ -142,24 +145,24 @@ const PrefixIcon = styled.span` const StyledCaretDownIcon = styled(CaretDownIcon)` width: 11px; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; `; const LabelContainer = styled(FlexDivRowCentered)<{ noPadding: boolean }>` padding: ${(props) => !props.noPadding && '16px'}; font-size: 13px; font-family: ${(props) => props.theme.fonts.regular}; - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; :hover { > svg { path { - fill: ${(props) => props.theme.colors.common.primaryWhite}; + fill: ${(props) => props.theme.colors.selectedTheme.icon.hover}; } } } > svg { path { - fill: ${(props) => props.theme.colors.common.secondaryGray}; + fill: ${(props) => props.theme.colors.selectedTheme.icon.fill}; } } `; diff --git a/sections/shared/Layout/AppLayout/Header/UserMenu/UserMenu.tsx b/sections/shared/Layout/AppLayout/Header/UserMenu/UserMenu.tsx index 3ae1ea2283..f05ba1aab6 100644 --- a/sections/shared/Layout/AppLayout/Header/UserMenu/UserMenu.tsx +++ b/sections/shared/Layout/AppLayout/Header/UserMenu/UserMenu.tsx @@ -35,6 +35,7 @@ const UserMenu: FC = () => { { const walletIsConnectedButNotSupported = ( - + {t('homepage.l2.cta-buttons.switch-l2')} - + {t('common.wallet.unsupported-network')} @@ -70,6 +71,7 @@ const UserMenu: FC = () => { setSettingsModalOpened(!settingsModalOpened); }} isActive={settingsModalOpened} + noOutline={true} > @@ -103,6 +105,16 @@ const MenuButton = styled(Button)` display: flex; align-items: center; margin-left: 15px; + height: 41px; + circle { + fill: ${(props) => props.theme.colors.selectedTheme.icon.fill}; + } + + :hover { + circle { + fill: ${(props) => props.theme.colors.selectedTheme.icon.hover}; + } + } `; const ConnectButton = styled(Button)` @@ -111,7 +123,7 @@ const ConnectButton = styled(Button)` const SwitchToL2Button = styled(Button)` font-size: 13px; - color: ${(props) => props.theme.colors.common.primaryWhite}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.mono}; `; diff --git a/sections/shared/Layout/AppLayout/Header/WalletActions.tsx b/sections/shared/Layout/AppLayout/Header/WalletActions.tsx index 14a5a2dc8a..cc316e15d9 100644 --- a/sections/shared/Layout/AppLayout/Header/WalletActions.tsx +++ b/sections/shared/Layout/AppLayout/Header/WalletActions.tsx @@ -139,6 +139,7 @@ export const WalletActions: FC = () => { components={{ IndicatorSeparator, DropdownIndicator }} isSearchable={false} data-testid="wallet-btn" + noOutline={true} > ); @@ -174,24 +175,24 @@ const WalletOptionsSelect = styled(Select)` const StyledCaretDownIcon = styled(CaretDownIcon)` width: 11px; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; `; const LabelContainer = styled(FlexDivRow)` padding: 16px; font-size: 13px; width: 100%; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; :hover { > svg { path { - fill: ${(props) => props.theme.colors.common.primaryWhite}; + fill: ${(props) => props.theme.colors.selectedTheme.icon.hover}; } } } > svg { path { - fill: ${(props) => props.theme.colors.common.secondaryGray}; + fill: ${(props) => props.theme.colors.selectedTheme.icon.fill}; } } `; diff --git a/sections/shared/Layout/HomeLayout/Footer.tsx b/sections/shared/Layout/HomeLayout/Footer.tsx index a74cc451d0..654da9790c 100644 --- a/sections/shared/Layout/HomeLayout/Footer.tsx +++ b/sections/shared/Layout/HomeLayout/Footer.tsx @@ -1,60 +1,205 @@ import React from 'react'; import styled from 'styled-components'; - -import { FlexDivCentered, ExternalLink } from 'styles/common'; +import { useTranslation } from 'react-i18next'; import DiscordLogo from 'assets/svg/social/discord.svg'; -import MediumLogo from 'assets/svg/marketing/medium-icon.svg'; +import MirrorLogo from 'assets/svg/social/mirror.svg'; import TwitterLogo from 'assets/svg/marketing/twitter-icon.svg'; - -import media from 'styles/media'; - import { EXTERNAL_LINKS } from 'constants/links'; import PoweredBySynthetix from 'components/PoweredBySynthetix'; +import { FlexDivCentered, ExternalLink } from 'styles/common'; +import { GridContainer } from 'sections/homepage/common'; +import Logo from '../Logo'; const Footer: React.FC = () => { + const { t } = useTranslation(); + const DOC_LINKS = [ + { + key: 'about-kwenta', + title: t('homepage.footer.about-kwenta.title'), + links: [ + { + key: 'docs', + title: t('homepage.footer.about-kwenta.docs'), + link: EXTERNAL_LINKS.Docs.DocsRoot, + }, + { + key: 'news', + title: t('homepage.footer.about-kwenta.news'), + link: EXTERNAL_LINKS.Social.Mirror, + }, + { + key: 'faq', + title: t('homepage.footer.about-kwenta.faq'), + link: EXTERNAL_LINKS.Docs.Faq, + }, + { + key: 'dao-roles', + title: t('homepage.footer.about-kwenta.dao-roles'), + link: EXTERNAL_LINKS.Docs.DaoRoles, + }, + ], + }, + { + key: 'use-kwenta', + title: t('homepage.footer.use-kwenta.title'), + links: [ + { + key: 'how-to', + title: t('homepage.footer.use-kwenta.how-to'), + link: EXTERNAL_LINKS.Docs.DocsRoot, + }, + { + key: 'preps', + title: t('homepage.footer.use-kwenta.perps'), + link: EXTERNAL_LINKS.Docs.Perpetuals, + }, + { + key: 'spot', + title: t('homepage.footer.use-kwenta.spot'), + link: EXTERNAL_LINKS.Docs.Spot, + }, + { + key: 'legacy', + title: t('homepage.footer.use-kwenta.legacy'), + link: EXTERNAL_LINKS.Trading.Legacy, + }, + ], + }, + { + key: 'community', + title: t('homepage.footer.community.title'), + links: [ + { + key: 'governance', + title: t('homepage.footer.community.governance'), + link: EXTERNAL_LINKS.Docs.Governance, + }, + { + key: 'dev-dao', + title: t('homepage.footer.community.dev-dao'), + link: EXTERNAL_LINKS.Docs.DevDao, + }, + { + key: 'marketing-dao', + title: t('homepage.footer.community.marketing-dao'), + link: EXTERNAL_LINKS.Docs.MarketingDao, + }, + { + key: 'kips', + title: t('homepage.footer.community.kips'), + link: EXTERNAL_LINKS.Kips.Home, + }, + ], + }, + ]; return ( - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + {DOC_LINKS.map(({ key, title, links }) => ( + + {title} + {links.map(({ key, title, link }) => ( + + {title} + + ))} + + ))} + + + + {t('homepage.footer.copyright')} + + ); }; -const FooterContainer = styled.footer` - padding: 0px 20px; - margin: 360px 0 60px 0; - display: grid; - grid-auto-flow: column; +const StyledLink = styled.a` + cursor: pointer; +`; + +const CopyRight = styled.div` + font-size: 12px; + text-align: right; + letter-spacing: 0.04em; + text-transform: uppercase; + color: ${(props) => props.theme.colors.common.primaryWhite}; + opacity: 0.5; + margin-right: 20px; + padding-top: 10px; +`; + +const ListTitle = styled.div` + font-size: 15px; + line-height: 150%; + color: ${(props) => props.theme.colors.common.secondaryGray}; + text-transform: uppercase; +`; + +const PowerContainer = styled.div` + display: flex; + flex-direction: row; + justify-content: space-between; + width: 1280px; + padding-top: 45px; + border-top-width: 1px; + border-top-style: solid; + border-top-color: #3d3c3c; + margin-bottom: 50px; +`; + +const MultiListContainer = styled.div` + display: flex; + flex-direction: row; + column-gap: 350px; + width: 1280px; + padding-left: 40px; + padding-right: 40px; + margin-top: 80px; + margin-bottom: 42.5px; +`; + +const ListContainer = styled.div` + disply: flex; + flex-direction: column; + font-size: 18px; + line-height: 150%; + color: ${(props) => props.theme.colors.common.primaryWhite}; +`; + +const LogoFooter = styled.div` + display: flex; + flex-direction: row; justify-content: space-between; - ${media.lessThan('sm')` - margin-top: 150px; - grid-auto-flow: row; - justify-content: center; - grid-gap: 35px; - `} + width: 1280px; + padding-left: 40px; + padding-right: 40px; +`; + +const StyledGridContainer = styled(GridContainer)` + grid-template-columns: repeat(1, auto); + grid-column-gap: 20px; `; const SocialIcons = styled(FlexDivCentered)` > * + * { - margin-left: 10px; + margin-left: 24px; } - ${media.lessThan('sm')` - justify-content: center; - > * + * { - margin-left: 24px; - } - `} `; export default Footer; diff --git a/sections/shared/Layout/HomeLayout/Header.tsx b/sections/shared/Layout/HomeLayout/Header.tsx index c496315ae1..c8c10118d0 100644 --- a/sections/shared/Layout/HomeLayout/Header.tsx +++ b/sections/shared/Layout/HomeLayout/Header.tsx @@ -1,96 +1,127 @@ +import Link from 'next/link'; +import router from 'next/router'; import { FC, useMemo } from 'react'; -import styled from 'styled-components'; +import { useRecoilValue } from 'recoil'; import { useTranslation } from 'react-i18next'; -import Link from 'next/link'; +import styled from 'styled-components'; -import { HEADER_HEIGHT } from 'constants/ui'; +import ArrowUpRightIcon from 'assets/svg/app/arrow-up-right-tg.svg'; +import CaretDownGrayIcon from 'assets/svg/app/caret-down-gray-slim.svg'; +import DiscordLogo from 'assets/svg/social/discord.svg'; +import MirrorLogo from 'assets/svg/social/mirror.svg'; +import TwitterLogo from 'assets/svg/marketing/twitter-icon.svg'; import ROUTES from 'constants/routes'; - +import { EXTERNAL_LINKS } from 'constants/links'; import { MobileHiddenView, MobileOnlyView } from 'components/Media'; import Button from 'components/Button'; - -import UserMenu from '../AppLayout/Header/UserMenu'; +import { FlexDivRowCentered, GridDivCenteredCol } from 'styles/common'; +import { isL2State } from 'store/wallet'; import AppHeader from '../AppLayout/Header'; - -import media from 'styles/media'; - import Logo from '../Logo'; -import { GridDivCenteredCol, TextButton } from 'styles/common'; - -import SmoothScroll from 'sections/homepage/containers/SmoothScroll'; -import { useRecoilValue } from 'recoil'; -import { isL2State } from 'store/wallet'; -import FuturesBordersSvg from 'assets/svg/app/futures-borders.svg'; -import LinkWhiteIcon from 'assets/svg/app/link-white.svg'; - -const KIPS_LINK = 'https://github.com/Kwenta/KIPs'; const Header: FC = () => { const { t } = useTranslation(); - const { whyKwentaRef, howItWorksRef, faqRef, scrollToRef } = SmoothScroll.useContainer(); const isL2 = useRecoilValue(isL2State); - const links = useMemo( + const LINKS = useMemo( () => [ { - id: 'why', - label: t('homepage.nav.why'), - ref: whyKwentaRef, + id: 'market', + label: t('homepage.nav.markets'), + onClick: () => router.push(ROUTES.Home.Markets), }, { - id: 'how', - label: t('homepage.nav.how'), - ref: howItWorksRef, + id: 'governance', + label: t('homepage.nav.governance.title'), + icon: , }, { - id: 'faq', - label: t('homepage.nav.faq'), - ref: faqRef, + id: 'socials', + label: t('homepage.nav.socials.title'), + icon: , }, { - id: 'kips', - label: t('homepage.nav.kips'), - onClick: () => window.open(KIPS_LINK, '_blank'), + id: 'blogs', + label: t('homepage.nav.blog'), + icon: , + onClick: () => window.open(EXTERNAL_LINKS.Social.Mirror, '_blank'), }, ], - [t, whyKwentaRef, howItWorksRef, faqRef] + // eslint-disable-next-line + [t] ); + const GOVERNANCE = [ + { + id: 'overview', + label: t('homepage.nav.governance.overview'), + onClick: () => window.open(EXTERNAL_LINKS.Docs.Governance, '_blank'), + }, + { + id: 'kips', + label: t('homepage.nav.governance.kips'), + onClick: () => window.open(EXTERNAL_LINKS.Kips.Home, '_blank'), + }, + ]; + + const SOCIALS = [ + { + id: 'discord', + label: t('homepage.nav.socials.discord'), + onClick: () => window.open(EXTERNAL_LINKS.Social.Discord, '_blank'), + icon: , + }, + { + id: 'twitter', + label: t('homepage.nav.socials.twitter'), + onClick: () => window.open(EXTERNAL_LINKS.Social.Twitter, '_blank'), + icon: , + }, + { + id: 'mirror', + label: t('homepage.nav.socials.mirror'), + onClick: () => window.open(EXTERNAL_LINKS.Social.Mirror, '_blank'), + icon: , + }, + ]; + return ( <> - - - <> - - Kwenta Community Raise now live on Aelin - - - > - - - - - - + + + + - {links.map(({ id, label, ref, onClick }) => ( - { - ref ? scrollToRef(ref) : onClick?.(); - }} - > - {label} + {LINKS.map(({ id, label, icon, onClick }) => ( + + + {label} + {icon} + + + {GOVERNANCE.map(({ id, label, onClick }) => ( + + {label} + + ))} + + + {SOCIALS.map(({ id, label, onClick, icon }) => ( + + {icon} + {label} + + ))} + ))} - - - - {t('homepage.nav.start-trading')} + + + {t('homepage.nav.start-trade')} @@ -103,72 +134,104 @@ const Header: FC = () => { ); }; -const Container = styled.header` - height: ${HEADER_HEIGHT}; - line-height: ${HEADER_HEIGHT}; - padding: 0px 20px; - display: grid; - align-items: center; - width: 100%; - grid-template-columns: 1fr 1fr 1fr; - ${media.lessThan('md')` - grid-template-columns: auto auto; - `} +const LogoContainer = styled.div` + padding-top: 8px; `; -const FuturesBannerContainer = styled.div` - height: 65px; - width: 100%; + +const StyledMenu = styled.div` + position: absolute; + background: linear-gradient(180deg, #1e1d1d 0%, #161515 100%); + border: 1px solid rgba(255, 255, 255, 0.1); + border-radius: 6px; + width: 120px; + margin: auto; + padding: 10px 0px; + margin-top: 35px; display: flex; + flex-direction: column; align-items: center; - background: linear-gradient( - 180deg, - ${(props) => props.theme.colors.goldColors.color1} 0%, - ${(props) => props.theme.colors.goldColors.color2} 100% - ); - ${media.lessThan('md')` - position: relative; - top: ${HEADER_HEIGHT}; - margin-bottom: ${HEADER_HEIGHT}; - `} + + &.governance { + visibility: hidden; + transition: visibility 0.1s; + :hover { + visibility: visible; + } + } + + &.socials { + visibility: hidden; + transition: visibility 0.1s; + :hover { + visibility: visible; + } + } `; -const FuturesBannerLinkWrapper = styled.div` - width: 100%; - text-align: center; - position: absolute; - text-shadow: 0px 1px 2px ${(props) => props.theme.colors.transparentBlack}; - color: ${(props) => props.theme.colors.white}; +const StyledMenuItem = styled.p` font-family: ${(props) => props.theme.fonts.bold}; - font-size: 16px; + cursor: pointer; + width: 90px; + font-size: 15px; + height: 30px; + color: ${(props) => props.theme.colors.common.secondaryGray}; display: flex; - justify-content: center; + flex-direction: row; align-items: center; + justify-content: flex-start; + padding-top: 0px; + padding-bottom: 0px; + margin: 0px; + &:hover { + color: ${(props) => props.theme.colors.common.primaryWhite}; + } + svg { + margin-right: 10px; + width: 15px; + height: 15px; + } `; -const DivBorder = styled.div` - height: 2px; - background: ${(props) => props.theme.colors.goldColors.color1}; - flex-grow: 1; -`; -const FuturesLink = styled.a` - margin-right: 5px; +const Container = styled.header` + display: grid; + align-items: start; + width: 100%; + grid-template-columns: 1fr 1fr 1fr; `; const Links = styled.div` + display: flex; + flex-direction: row; white-space: nowrap; justify-self: center; - ${media.lessThan('md')` - display: none; - `} + padding-top: 10px; `; -const StyledTextButton = styled(TextButton)` - font-size: 12px; +const StyledTextButton = styled.div` + display: flex; + flex-direction: column; + align-items: center; + font-size: 15px; + line-height: 15px; font-family: ${(props) => props.theme.fonts.bold}; - color: ${(props) => props.theme.colors.silver}; - margin: 0px 8px; - &:hover { - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.common.tertiaryGray}; + cursor: pointer; + + &.governance:hover { + > div.governance { + visibility: visible; + } + } + + &.socials:hover { + > div.socials { + visibility: visible; + } + } + + margin: 0px 20px; + svg { + margin-left: 5px; } `; diff --git a/sections/shared/Layout/HomeLayout/HomeLayout.tsx b/sections/shared/Layout/HomeLayout/HomeLayout.tsx index 28b9e9eeb9..265c86e486 100644 --- a/sections/shared/Layout/HomeLayout/HomeLayout.tsx +++ b/sections/shared/Layout/HomeLayout/HomeLayout.tsx @@ -1,5 +1,6 @@ import { FC } from 'react'; import styled, { createGlobalStyle } from 'styled-components'; +import { FullScreenContainer } from 'styles/common'; import Footer from './Footer'; import Header from './Header'; @@ -9,22 +10,125 @@ type HomeLayoutProps = { }; const HomeLayout: FC = ({ children }) => ( - <> + + + + + + + + + - {children} + {children} - > + ); +const BlueBlurImageHero = styled.div` + position: absolute; + width: 201.37px; + height: 220.5px; + left: 302.01px; + top: 600px; + + background: #02e1ff; + opacity: 0.5; + filter: blur(240px); + transform: rotate(51.27deg); +`; + +const GoldenBlurImageHero = styled.div` + position: absolute; + width: 550.34px; + height: 493px; + left: 904.83px; + top: 700px; + + background: #c9975a; + opacity: 0.3; + filter: blur(217.829px); +`; + +const BlueBlurImageShortList = styled.div` + position: absolute; + width: 121.37px; + height: 180.5px; + left: 600px; + top: 3400px; + + background: #02e1ff; + opacity: 0.5; + filter: blur(240px); + transform: rotate(51.27deg); +`; + +const GoldenBlurImageShortList = styled.div` + position: absolute; + width: 300.34px; + height: 453px; + left: 1204.83px; + top: 3300px; + + background: #c9975a; + opacity: 0.3; + filter: blur(217.829px); +`; + +const BlueBlurImageEarning = styled.div` + position: absolute; + width: 151.37px; + height: 220.5px; + left: 200px; + top: 4000px; + + background: #02e1ff; + opacity: 0.5; + filter: blur(240px); + transform: rotate(51.27deg); +`; + +const GoldenBlurImageEarning = styled.div` + position: absolute; + width: 350.34px; + height: 493px; + left: 254.83px; + top: 3700px; + + background: #c9975a; + opacity: 0.3; + filter: blur(217.829px); +`; + +const BlueBlurImageTradeNow = styled.div` + position: absolute; + width: 201.37px; + height: 270.5px; + left: 400px; + top: 7500px; + + background: #02e1ff; + opacity: 0.5; + filter: blur(240px); + transform: rotate(51.27deg); +`; + +const GoldenBlurImageTradeNow = styled.div` + position: absolute; + width: 350.34px; + height: 493px; + left: 1204.83px; + top: 7400px; + + background: #c9975a; + opacity: 0.3; + filter: blur(217.829px); +`; const GlobalStyle = createGlobalStyle` body { overflow-x: hidden; } `; -const Content = styled.div` - ${(props) => props.theme.animations.show}; -`; - export default HomeLayout; diff --git a/sections/shared/Layout/Layout.tsx b/sections/shared/Layout/Layout.tsx index e629f9c405..f7dd9e7a97 100644 --- a/sections/shared/Layout/Layout.tsx +++ b/sections/shared/Layout/Layout.tsx @@ -61,14 +61,14 @@ const GlobalStyle = createGlobalStyle` a { ${linkCSS}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; } /* blocknative onboard style overrides */ .bn-onboard-custom { &&& { font-family: ${(props) => props.theme.fonts.regular}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; } &&.bn-onboard-modal { @@ -83,7 +83,7 @@ const GlobalStyle = createGlobalStyle` } &&.bn-onboard-selected-wallet { background-color: ${(props) => props.theme.colors.navy}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; } &&.bn-onboard-modal-content { background-color: ${(props) => props.theme.colors.elderberry}; @@ -93,7 +93,7 @@ const GlobalStyle = createGlobalStyle` } &&.bn-onboard-select-wallet-info { cursor: pointer; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; } &&.bn-onboard-dark-mode-background-hover { &:hover { @@ -102,12 +102,12 @@ const GlobalStyle = createGlobalStyle` } &&.bn-onboard-prepare-button { border-radius: 2px; - color: ${(props) => props.theme.colors.white} ; + color: ${(props) => props.theme.colors.selectedTheme.button.text} ; background-color: ${(props) => props.theme.colors.elderberry} ; border: 1px solid ${(props) => props.theme.colors.navy} ; } .bn-onboard-clickable { - color: ${(props) => props.theme.colors.white} !important; + color: ${(props) => props.theme.colors.selectedTheme.button.text} !important; } } `; diff --git a/sections/shared/Layout/Logo/Logo.tsx b/sections/shared/Layout/Logo/Logo.tsx index 409ab6ac6b..31ff2e94a6 100644 --- a/sections/shared/Layout/Logo/Logo.tsx +++ b/sections/shared/Layout/Logo/Logo.tsx @@ -3,43 +3,54 @@ import styled from 'styled-components'; import Link from 'next/link'; import ROUTES from 'constants/routes'; +import { currentThemeState } from 'store/ui'; +import { useRecoilValue } from 'recoil'; + import LogoSvg from 'assets/svg/brand/logo.svg'; import LogoSvgL2 from 'assets/svg/brand/logol2.svg'; -import LogoSvgBeta from 'assets/svg/brand/logo-beta.svg'; +import LogoSvgBetaLight from 'assets/svg/brand/logo-beta-light.svg'; +import LogoSvgBetaDark from 'assets/svg/brand/logo-beta-dark.svg'; type LogoProps = { isL2: boolean; isFutures?: boolean; + isHomePage?: boolean; }; -const SvgLogo = ({ isFutures = false, isL2 }: LogoProps) => { +const SvgLogo = ({ isFutures = false, isHomePage = false, isL2 }: LogoProps) => { + const currentTheme = useRecoilValue(currentThemeState); + if (isFutures) { - return ; + if (currentTheme === 'dark') { + return ; + } + if (currentTheme === 'light') { + return ; + } + } + if (isHomePage) { + return ; } return isL2 ? : ; }; const Logo: FC = (props) => { return ( - + ); }; -// const Logo: FC = ({ isL2 }) => ( -// -// -// {isL2 ? : } -// -// -// ); const LogoContainer = styled.span` display: flex; align-items: center; cursor: pointer; + height: 18px; + width: 122px; + margin-right: 20px; `; export default Logo; diff --git a/sections/shared/SystemStatus/SystemStatus.tsx b/sections/shared/SystemStatus/SystemStatus.tsx index bf69e0696f..6e1e4b713d 100644 --- a/sections/shared/SystemStatus/SystemStatus.tsx +++ b/sections/shared/SystemStatus/SystemStatus.tsx @@ -22,8 +22,6 @@ import DiscordIcon from 'assets/svg/social/discord.svg'; import TwitterIcon from 'assets/svg/social/twitter.svg'; import GithubIcon from 'assets/svg/social/github.svg'; -import { useRecoilValue } from 'recoil'; -import { isL2State } from 'store/wallet'; import useSynthetixQueries from '@synthetixio/queries'; type SystemStatusProps = { @@ -52,7 +50,6 @@ export const REFRESH_INTERVAL = 2 * 60 * 1000; // 2 min const SystemStatus: FC = ({ children }) => { const { t } = useTranslation(); - const isL2 = useRecoilValue(isL2State); const { useIsSystemOnMaintenance } = useSynthetixQueries(); @@ -74,7 +71,7 @@ const SystemStatus: FC = ({ children }) => { - + @@ -127,7 +124,6 @@ const StyledSystemDownIcon = styled(SystemDownIcon)` const titleCSS = css` font-size: 20px; margin: 0; - font-weight: normal; line-height: normal; font-family: ${(props) => props.theme.fonts.mono}; @@ -136,7 +132,7 @@ const titleCSS = css` const Title = styled.h1` ${titleCSS}; font-size: 20px; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; padding-bottom: 15px; line-height: 28px; `; diff --git a/sections/shared/components/FeeRateSummary/FeeRateSummary.tsx b/sections/shared/components/FeeRateSummary/FeeRateSummary.tsx index 03966452e9..6b41937962 100644 --- a/sections/shared/components/FeeRateSummary/FeeRateSummary.tsx +++ b/sections/shared/components/FeeRateSummary/FeeRateSummary.tsx @@ -63,7 +63,7 @@ export const FeeRateItem = styled.span` `; export const DynamicFeeLabel = styled.span` - color: ${(props) => props.theme.colors.blueberry}; + color: ${(props) => props.theme.colors.common.secondaryGray}; `; export const DynamicFeeRateTooltip = styled(Tippy)` @@ -77,13 +77,16 @@ export const DynamicFeeRateTooltip = styled(Tippy)` `; export const DynamicFeeRateItem = styled.span` - color: #ffdf6d; + color: ${(props) => props.theme.colors.selectedTheme.gold}; display: flex; align-items: center; justify-content: space-between; cursor: pointer; svg { margin-left: 3px; + path { + fill: ${(props) => props.theme.colors.selectedTheme.gold}; + } } `; diff --git a/sections/shared/components/GasPriceSelect/GasPriceSelect.tsx b/sections/shared/components/GasPriceSelect/GasPriceSelect.tsx index 7849fbe9bc..ab81d96404 100644 --- a/sections/shared/components/GasPriceSelect/GasPriceSelect.tsx +++ b/sections/shared/components/GasPriceSelect/GasPriceSelect.tsx @@ -1,23 +1,18 @@ import { FC } from 'react'; import { useTranslation } from 'react-i18next'; -import styled from 'styled-components'; -import Tippy from '@tippyjs/react'; -import { customGasPriceState, gasSpeedState, isMainnetState } from 'store/wallet'; +import { customGasPriceState, gasSpeedState, isL2State, isMainnetState } from 'store/wallet'; import { useRecoilValue, useRecoilState } from 'recoil'; import Wei from '@synthetixio/wei'; import { NO_VALUE } from 'constants/placeholder'; -import InfoIcon from 'assets/svg/app/info.svg'; - import { formatCurrency, formatNumber } from 'utils/formatters/number'; - -import useSelectedPriceCurrency from 'hooks/useSelectedPriceCurrency'; - +import { Synths } from 'constants/currency'; import { SummaryItem, SummaryItemValue, SummaryItemLabel } from '../common'; import { GasPrices } from '@synthetixio/queries'; -import { CurrencyKey } from 'constants/currency'; + import { parseGasPriceObject } from 'hooks/useGas'; +import { useMemo } from 'react'; type GasPriceSelectProps = { gasPrices: GasPrices | undefined; @@ -29,16 +24,26 @@ const GasPriceSelect: FC = ({ gasPrices, transactionFee, .. const { t } = useTranslation(); const [gasSpeed] = useRecoilState(gasSpeedState); const [customGasPrice] = useRecoilState(customGasPriceState); - const { selectedPriceCurrency } = useSelectedPriceCurrency(); const isMainnet = useRecoilValue(isMainnetState); + const isL2 = useRecoilValue(isL2State); + + const formattedTransactionFee = useMemo(() => { + return transactionFee + ? formatCurrency(Synths.sUSD, transactionFee, { sign: '$', maxDecimals: 1 }) + : NO_VALUE; + }, [transactionFee]); const hasCustomGasPrice = customGasPrice !== ''; const gasPrice = gasPrices ? parseGasPriceObject(gasPrices[gasSpeed]) : null; - const gasPriceItem = hasCustomGasPrice ? ( - {formatNumber(customGasPrice, { minDecimals: 4 })} - ) : ( - {formatNumber(gasPrice ?? 0, { minDecimals: 4 })} + const gasPriceItem = ( + + {isL2 + ? formattedTransactionFee + : `${formatNumber(hasCustomGasPrice ? +customGasPrice : gasPrice ?? 0, { + minDecimals: 2, + })} Gwei`} + ); return ( @@ -48,63 +53,9 @@ const GasPriceSelect: FC = ({ gasPrices, transactionFee, .. ? t('common.summary.gas-prices.max-fee') : t('common.summary.gas-prices.gas-price')} - - {gasPrice != null ? ( - <> - {transactionFee != null ? ( - - {formatCurrency(selectedPriceCurrency.name as CurrencyKey, transactionFee, { - sign: selectedPriceCurrency.sign, - maxDecimals: 1, - })} - - } - arrow={false} - > - - {gasPriceItem} - - - - ) : ( - gasPriceItem - )} - > - ) : ( - NO_VALUE - )} - + {gasPrice != null ? gasPriceItem : NO_VALUE} ); }; -const GasPriceTooltip = styled(Tippy)` - border: ${(props) => props.theme.colors.selectedTheme.border}; - border-radius: 4px; - width: 155px; - .tippy-content { - padding: 0; - } -`; - -const GasPriceCostTooltip = styled(GasPriceTooltip)` - width: auto; - font-size: 12px; - .tippy-content { - padding: 5px; - font-family: ${(props) => props.theme.fonts.mono}; - } -`; - -const GasPriceItem = styled.span` - display: inline-flex; - align-items: center; - cursor: pointer; - svg { - margin-left: 5px; - } -`; - export default GasPriceSelect; diff --git a/sections/shared/components/ThemeSelect/ThemeSelect.tsx b/sections/shared/components/ThemeSelect/ThemeSelect.tsx new file mode 100644 index 0000000000..280855fb01 --- /dev/null +++ b/sections/shared/components/ThemeSelect/ThemeSelect.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import Select from 'components/Select'; +import { useRecoilState } from 'recoil'; +import { currentThemeState } from 'store/ui'; + +const themes = { + light: 'Light', + dark: 'Dark', + // elite: 'Elite', +}; + +const ThemeSelect: React.FC = () => { + const [currentTheme, setTheme] = useRecoilState(currentThemeState); + + const themesObject = React.useMemo(() => { + return Object.entries(themes).map(([themeName, themeLabel]) => ({ + label: themeLabel, + value: themeName, + })); + }, []); + + return ( + {option.label}} + options={themesObject} + value={{ label: themes[currentTheme], value: currentTheme }} + onChange={(option) => { + // @ts-ignore + setTheme(option.value); + }} + /> + ); +}; + +export default ThemeSelect; diff --git a/sections/shared/components/common.tsx b/sections/shared/components/common.tsx index 310cdce621..0c9801e2ec 100644 --- a/sections/shared/components/common.tsx +++ b/sections/shared/components/common.tsx @@ -34,13 +34,13 @@ export const SummaryItem = styled.div` export const SummaryItemLabel = styled.div` text-transform: capitalize; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; font-family: ${(props) => props.theme.fonts.bold}; font-size: 13px; `; export const SummaryItemValue = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; ${numericValueCSS}; max-width: 100px; overflow: hidden; diff --git a/sections/shared/modals/BalancerApproveModal/BalancerApproveModal.tsx b/sections/shared/modals/BalancerApproveModal/BalancerApproveModal.tsx index e6bb6fcd57..afb9f24c92 100644 --- a/sections/shared/modals/BalancerApproveModal/BalancerApproveModal.tsx +++ b/sections/shared/modals/BalancerApproveModal/BalancerApproveModal.tsx @@ -65,7 +65,7 @@ const ErrorText = styled.div` `; const SubText = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; padding: 20px 0; `; diff --git a/sections/shared/modals/NotificationsModal/CurrencyExchange.tsx b/sections/shared/modals/NotificationsModal/CurrencyExchange.tsx index 1d7da7e146..c8712fef4c 100644 --- a/sections/shared/modals/NotificationsModal/CurrencyExchange.tsx +++ b/sections/shared/modals/NotificationsModal/CurrencyExchange.tsx @@ -69,7 +69,7 @@ export const CurrencyExchange: FC = ({ order }) => { }; const Container = styled(FlexDivRowCentered)` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; const StatusIconMixin = ` diff --git a/sections/shared/modals/NotificationsModal/CurrencyFeeReclaim.tsx b/sections/shared/modals/NotificationsModal/CurrencyFeeReclaim.tsx index 09cd7a789e..8d1131cafc 100644 --- a/sections/shared/modals/NotificationsModal/CurrencyFeeReclaim.tsx +++ b/sections/shared/modals/NotificationsModal/CurrencyFeeReclaim.tsx @@ -37,7 +37,7 @@ export const CurrencyFeeReclaim: FC = ({ currencyKey }) }; const Container = styled(FlexDivRowCentered)` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; padding: 12px 16px; border-bottom: 1px solid ${(props) => props.theme.colors.navy}; `; diff --git a/sections/shared/modals/NotificationsModal/Popup.tsx b/sections/shared/modals/NotificationsModal/Popup.tsx index 9ebdc23ce3..77cf18db21 100644 --- a/sections/shared/modals/NotificationsModal/Popup.tsx +++ b/sections/shared/modals/NotificationsModal/Popup.tsx @@ -129,7 +129,7 @@ const ViewAllButtonContainer = styled.div` `; const ViewAllButton = styled(TextButton)` text-transform: capitalize; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.bold}; `; const StyledNoResults = styled(NoResults)` diff --git a/sections/shared/modals/SelectCurrencyModal/SelectCurrencyModal.tsx b/sections/shared/modals/SelectCurrencyModal/SelectCurrencyModal.tsx index 10049e1fe9..823d60b62c 100644 --- a/sections/shared/modals/SelectCurrencyModal/SelectCurrencyModal.tsx +++ b/sections/shared/modals/SelectCurrencyModal/SelectCurrencyModal.tsx @@ -132,6 +132,7 @@ export const SelectCurrencyModal: FC = ({ return ( { @@ -193,7 +194,7 @@ const StyledCenteredModal = styled(CenteredModal)` } .card-body { height: 80vh; - padding: 16px 0; + padding: 0px; overflow: hidden; } `; @@ -221,26 +222,16 @@ const CategoryFilters = styled.div` `; const CategoryButton = styled(Button)` + height: 30px; text-transform: uppercase; - font-family: ${(props) => props.theme.fonts.bold}; font-size: 12px; - transition: all 0.1s ease-in-out; - background: ${(props) => props.theme.colors.selectedTheme.button.background}; - color: ${(props) => props.theme.colors.common.primaryGold}; ${(props) => props.isActive && css` - transform: scale(0.99); - color: ${props.theme.colors.common.primaryWhite}; - border: 2px solid ${props.theme.colors.common.primaryGold}; - border-radius: 11px; - background: ${props.theme.colors.selectedTheme.button.hover}; - box-shadow: inset rgb(0 0 0 / 30%) 0px 0 20px, #7fd48245 0px 0 10px 0px; - - &:hover { - background: ${props.theme.colors.selectedTheme.button.hover}; - } + color: ${props.theme.colors.selectedTheme.button.text}; + background: ${props.theme.colors.selectedTheme.button.fill}; + /* background: transparent */ `}; ${(props) => props.disabled && @@ -257,7 +248,7 @@ const EmptyDisplay = styled(FlexDivCentered)` text-align: center; margin: 24px 0px; height: 50px; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; export default SelectCurrencyModal; diff --git a/sections/shared/modals/SelectShortCurrencyModal/SelectShortCurrencyModal.tsx b/sections/shared/modals/SelectShortCurrencyModal/SelectShortCurrencyModal.tsx index c5ca9ac516..35c5fd455f 100644 --- a/sections/shared/modals/SelectShortCurrencyModal/SelectShortCurrencyModal.tsx +++ b/sections/shared/modals/SelectShortCurrencyModal/SelectShortCurrencyModal.tsx @@ -138,7 +138,7 @@ export const Title = styled.div` export const Total = styled.div` font-size: 20px; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.mono}; padding-bottom: 10px; `; diff --git a/sections/shared/modals/SelectTokenModal/SelectTokenModal.tsx b/sections/shared/modals/SelectTokenModal/SelectTokenModal.tsx index 28cc01a794..ec6c69b2b2 100644 --- a/sections/shared/modals/SelectTokenModal/SelectTokenModal.tsx +++ b/sections/shared/modals/SelectTokenModal/SelectTokenModal.tsx @@ -240,7 +240,7 @@ const ContainerEmptyState = styled(FlexDivColCentered)` `; const Message = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 14px; font-family: ${(props) => props.theme.fonts.bold}; padding: 24px 32px; @@ -258,7 +258,7 @@ const EmptyDisplay = styled(FlexDivCentered)` text-align: center; margin: 24px 0px; height: 50px; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; const StyledBottomShadow = styled(BottomShadow)` diff --git a/sections/shared/modals/SettingsModal/SettingsModal.tsx b/sections/shared/modals/SettingsModal/SettingsModal.tsx index ac2f062ce1..f7652498e6 100644 --- a/sections/shared/modals/SettingsModal/SettingsModal.tsx +++ b/sections/shared/modals/SettingsModal/SettingsModal.tsx @@ -44,7 +44,7 @@ const Options = styled.div``; const OptionLabel = styled.div` font-family: ${(props) => props.theme.fonts.bold}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; text-transform: capitalize; `; diff --git a/sections/shared/modals/SettingsModal/constants.ts b/sections/shared/modals/SettingsModal/constants.ts index 681d6e27c2..a1ccaa44e9 100644 --- a/sections/shared/modals/SettingsModal/constants.ts +++ b/sections/shared/modals/SettingsModal/constants.ts @@ -1,4 +1,5 @@ import LanguageSelect from 'sections/shared/components/LanguageSelect'; +import ThemeSelect from 'sections/shared/components/ThemeSelect/ThemeSelect'; export const OPTIONS = [ { @@ -6,4 +7,9 @@ export const OPTIONS = [ label: 'modals.settings.options.language', SelectComponent: LanguageSelect, }, + { + id: 'theme-options', + label: 'modals.settings.options.theme', + SelectComponent: ThemeSelect, + }, ]; diff --git a/sections/shared/modals/TxApproveModal/TxApproveModal.tsx b/sections/shared/modals/TxApproveModal/TxApproveModal.tsx index 138189cf2d..ff448d4474 100644 --- a/sections/shared/modals/TxApproveModal/TxApproveModal.tsx +++ b/sections/shared/modals/TxApproveModal/TxApproveModal.tsx @@ -80,7 +80,7 @@ const Currencies = styled.div` const CurrencyItem = styled.div` text-align: center; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; const CurrencyItemTitle = styled.div` @@ -99,7 +99,7 @@ const Actions = styled(FlexDivColCentered)` `; const Message = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 14px; font-family: ${(props) => props.theme.fonts.bold}; flex-grow: 1; diff --git a/sections/shared/modals/TxConfirmationModal/TxConfirmationModal.tsx b/sections/shared/modals/TxConfirmationModal/TxConfirmationModal.tsx index 9ac34d5a20..7e548a70c3 100644 --- a/sections/shared/modals/TxConfirmationModal/TxConfirmationModal.tsx +++ b/sections/shared/modals/TxConfirmationModal/TxConfirmationModal.tsx @@ -301,7 +301,7 @@ const Currencies = styled.div` const CurrencyItem = styled.div` text-align: center; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; const CurrencyItemTitle = styled.div` @@ -316,7 +316,7 @@ const ArrowsIconContainer = styled.div` const Subtitle = styled.div` text-align: center; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; padding-bottom: 48px; `; @@ -329,11 +329,11 @@ const SummaryItem = styled(FlexDivRowCentered)` `; const SummaryItemLabel = styled.div` - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; `; const SummaryItemValue = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; ${numericValueCSS}; `; @@ -342,7 +342,7 @@ const Actions = styled(FlexDivColCentered)` `; const Message = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 14px; font-family: ${(props) => props.theme.fonts.bold}; flex-grow: 1; diff --git a/sections/shared/modals/TxSettleModal/TxSettleModal.tsx b/sections/shared/modals/TxSettleModal/TxSettleModal.tsx index 697405ed2f..9c89f3d0a5 100644 --- a/sections/shared/modals/TxSettleModal/TxSettleModal.tsx +++ b/sections/shared/modals/TxSettleModal/TxSettleModal.tsx @@ -80,7 +80,7 @@ const Currencies = styled.div` const CurrencyItem = styled.div` text-align: center; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; const CurrencyItemTitle = styled.div` @@ -99,7 +99,7 @@ const Actions = styled(FlexDivColCentered)` `; const Message = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 14px; font-family: ${(props) => props.theme.fonts.bold}; flex-grow: 1; diff --git a/sections/shared/modals/common.tsx b/sections/shared/modals/common.tsx index 016b89661e..96d2edcbbd 100644 --- a/sections/shared/modals/common.tsx +++ b/sections/shared/modals/common.tsx @@ -13,7 +13,7 @@ export const RowsHeader = styled(FlexDivRow)` text-transform: uppercase; font-family: ${(props) => props.theme.fonts.bold}; padding: 0 16px 9px 16px; - color: ${(props) => props.theme.colors.common.secondaryGray}; + color: ${(props) => props.theme.colors.selectedTheme.gray}; `; export const MenuModal = styled(BaseModal)` diff --git a/sections/shorting/ManageShort/ManageShort.tsx b/sections/shorting/ManageShort/ManageShort.tsx index bcceab9b1c..4edffddd83 100644 --- a/sections/shorting/ManageShort/ManageShort.tsx +++ b/sections/shorting/ManageShort/ManageShort.tsx @@ -216,7 +216,8 @@ const Container = styled.div``; const StyledTabButton = styled(TabButton)``; const CloseTabButton = styled(TabButton)<{ active: boolean }>` - color: ${(props) => (props.active ? props.theme.colors.white : props.theme.colors.red)}; + color: ${(props) => + props.active ? props.theme.colors.selectedTheme.button.text : props.theme.colors.red}; margin-left: auto; `; @@ -224,7 +225,7 @@ const ManageShortTitle = styled(CardTitle)` margin-bottom: 12px; padding: 15px 0 10px 0; font-size: 26px; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; const StyledBackIcon = styled(BackIcon)` diff --git a/sections/shorting/ManageShort/PositionCard.tsx b/sections/shorting/ManageShort/PositionCard.tsx index 052c64d6e6..93f8df0b00 100644 --- a/sections/shorting/ManageShort/PositionCard.tsx +++ b/sections/shorting/ManageShort/PositionCard.tsx @@ -366,7 +366,7 @@ const DataField = styled(FlexDivRowCentered)<{ isPositive?: boolean | null }>` ? props.isPositive ? props.theme.colors.green : props.theme.colors.red - : props.theme.colors.white}; + : props.theme.colors.selectedTheme.button.text}; `; const StyledLinkIcon = styled(LinkIcon)` diff --git a/sections/shorting/ShortingHistory/ShortingHistoryTable/ShortingHistoryTable.tsx b/sections/shorting/ShortingHistory/ShortingHistoryTable/ShortingHistoryTable.tsx index 6a72b249a3..f10eb3987a 100644 --- a/sections/shorting/ShortingHistory/ShortingHistoryTable/ShortingHistoryTable.tsx +++ b/sections/shorting/ShortingHistory/ShortingHistoryTable/ShortingHistoryTable.tsx @@ -174,7 +174,7 @@ const StyledTableHeader = styled.div` `; const CellData = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.mono}; `; diff --git a/sections/shorting/ShortingHistory/ShortingHistoryTable/common.tsx b/sections/shorting/ShortingHistory/ShortingHistoryTable/common.tsx index 981ffd104e..1950ace837 100644 --- a/sections/shorting/ShortingHistory/ShortingHistoryTable/common.tsx +++ b/sections/shorting/ShortingHistory/ShortingHistoryTable/common.tsx @@ -2,7 +2,7 @@ import styled from 'styled-components'; export const StyledCurrencyKey = styled.span` font-family: ${(props) => props.theme.fonts.mono}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; padding-left: 10px; `; diff --git a/sections/shorting/ShortingRewards/ShortingRewardRow.tsx b/sections/shorting/ShortingRewards/ShortingRewardRow.tsx index 3ad10dd895..dc3a949169 100644 --- a/sections/shorting/ShortingRewards/ShortingRewardRow.tsx +++ b/sections/shorting/ShortingRewards/ShortingRewardRow.tsx @@ -225,7 +225,7 @@ const RewardsAmount = styled.span` `; const RewardsAmountContainer = styled(FlexDivCentered)` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; `; export default ShortingRewardRow; diff --git a/sections/shorting/ShortingStats/ShortingStats.tsx b/sections/shorting/ShortingStats/ShortingStats.tsx index 3ab3891fe3..2775a47df6 100644 --- a/sections/shorting/ShortingStats/ShortingStats.tsx +++ b/sections/shorting/ShortingStats/ShortingStats.tsx @@ -132,7 +132,7 @@ const TableRow = styled.tr` const TableRowHead = styled(TableRow)``; const TableCell = styled.td` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; &:last-child { text-align: right; } diff --git a/sections/shorting/common.tsx b/sections/shorting/common.tsx index 7bea8527e3..33e0ee71ae 100644 --- a/sections/shorting/common.tsx +++ b/sections/shorting/common.tsx @@ -7,7 +7,7 @@ import media from 'styles/media'; import { zIndex } from 'constants/ui'; export const Title = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.bold}; font-size: 14px; text-transform: capitalize; @@ -15,7 +15,7 @@ export const Title = styled.div` `; export const Message = styled.div` - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-size: 14px; font-family: ${(props) => props.theme.fonts.bold}; flex-grow: 1; diff --git a/sections/shorting/components/ProfitLoss/ProfitLoss.tsx b/sections/shorting/components/ProfitLoss/ProfitLoss.tsx index 3051ea3737..775f8b6b99 100644 --- a/sections/shorting/components/ProfitLoss/ProfitLoss.tsx +++ b/sections/shorting/components/ProfitLoss/ProfitLoss.tsx @@ -42,7 +42,7 @@ export const Container = styled.span<{ isPositive?: boolean | null }>` ? props.isPositive ? props.theme.colors.green : props.theme.colors.red - : props.theme.colors.white}; + : props.theme.colors.selectedTheme.button.text}; `; export default ProfitLoss; diff --git a/store/effects.ts b/store/effects.ts new file mode 100644 index 0000000000..7b65bf6f79 --- /dev/null +++ b/store/effects.ts @@ -0,0 +1,15 @@ +import { AtomEffect } from 'recoil'; +import { ThemeName } from 'styles/theme'; + +export const localStorageEffect = (key: string): AtomEffect => ({ setSelf, onSet }) => { + if (typeof window !== 'undefined') { + const savedValue = localStorage.getItem(key); + if (savedValue != null) { + setSelf(JSON.parse(savedValue)); + } + + onSet((newValue: any, _: any, isReset: any) => { + isReset ? localStorage.removeItem(key) : localStorage.setItem(key, JSON.stringify(newValue)); + }); + } +}; diff --git a/store/ui/index.ts b/store/ui/index.ts index 950842c3b5..5f7f550dcc 100644 --- a/store/ui/index.ts +++ b/store/ui/index.ts @@ -3,6 +3,8 @@ import { atom } from 'recoil'; import { DEFAULT_SORT_OPTION } from 'sections/dashboard/TrendingSynths/constants'; import { SHORT_C_RATIO } from 'sections/shorting/ShortingCard/components/CRatioSelector/constants'; +import { localStorageEffect } from 'store/effects'; +import { ThemeName } from 'styles/theme'; import { getUIKey } from '../utils'; @@ -30,3 +32,9 @@ export const customShortCRatioState = atom({ key: getUIKey('customShortCRatio'), default: '', }); + +export const currentThemeState = atom({ + key: getUIKey('currentTheme'), + default: 'dark', + effects: [localStorageEffect('currentTheme')], +}); diff --git a/styles/common.tsx b/styles/common.tsx index 232823dc54..191e17ad3f 100644 --- a/styles/common.tsx +++ b/styles/common.tsx @@ -125,7 +125,7 @@ export const SelectableCurrencyRow = styled(FlexDivRowCentered)<{ isSelectable: ? css` cursor: pointer; &:hover { - background-color: ${(props) => props.theme.colors.black}; + background-color: ${(props) => props.theme.colors.selectedTheme.cell.hover}; } ` : css` @@ -188,10 +188,11 @@ export const BottomShadow = styled.div` export const FullScreenContainer = styled(FlexDiv)` flex-flow: column; width: 100%; - height: 100vh; + height: auto; position: relative; - overflow-y: overlay; + overflow-y: visible; padding: 25px 25px 0; + margin: 0 auto; `; export const Tooltip = styled(Tippy)` @@ -203,7 +204,7 @@ export const Tooltip = styled(Tippy)` export const InfoTooltip = styled(Tippy)` font-size: 12px; background-color: ${(props) => props.theme.colors.navy}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; .tippy-arrow { color: ${(props) => props.theme.colors.navy}; } @@ -259,7 +260,7 @@ export const IconButton = styled.button` export const CenteredMessage = styled.div` ${absoluteCenteredCSS}; font-size: 14px; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; font-family: ${(props) => props.theme.fonts.bold}; text-align: center; display: grid; @@ -270,28 +271,28 @@ export const FullHeightContainer = styled(FlexDiv)` justify-content: space-between; width: 100%; flex-grow: 1; - height: 100vh; + height: auto; position: relative; `; export const MainContent = styled(FlexDiv)` position: relative; flex-grow: 1; - max-width: 915px; flex-direction: column; margin: 0 auto; + max-width: 915px; `; export const RightSideContent = styled.div` background-color: transparent; position: relative; - height: 100%; + height: auto; `; export const LeftSideContent = styled.div` background-color: transparent; position: relative; - height: 100%; + height: auto; `; export const Table = styled.table.attrs({ @@ -307,7 +308,7 @@ export const CurrencyCardsSelector = styled.div` position: absolute; padding: 6px; border-radius: 4px; - background: ${(props) => props.theme.colors.common.secondaryGray}; + background: ${(props) => props.theme.colors.selectedTheme.gray}; border: 2px solid ${(props) => props.theme.colors.black}; left: 50%; top: 50%; @@ -329,7 +330,7 @@ export const DropdownSelection = styled.span.attrs({ font-family: ${(props) => props.theme.fonts.bold}; padding-left: 5px; cursor: pointer; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; text-transform: uppercase; svg { color: ${(props) => props.theme.colors.goldColors.color3}; @@ -396,7 +397,7 @@ export const ExchangeCardsWithSelector = styled.div` `; export const SwapCurrenciesButton = styled.button` ${resetButtonCSS}; - color: ${(props) => props.theme.colors.white}; + color: ${(props) => props.theme.colors.selectedTheme.button.text}; height: 32px; width: 32px; display: flex; @@ -404,9 +405,7 @@ export const SwapCurrenciesButton = styled.button` justify-content: center; z-index: ${zIndex.BASE}; border-radius: 50%; - background: ${(props) => props.theme.colors.selectedTheme.button.background}; box-sizing: border-box; - box-shadow: ${(props) => props.theme.colors.selectedTheme.button.shadow}; cursor: pointer; ${border} transition-duration: 0.1s; @@ -436,5 +435,31 @@ export const SwapCurrenciesButton = styled.button` transition-duration: 0.12s; transition-timing-function: ease-in-out; z-index: 1; + path { + fill: ${(props) => props.theme.colors.selectedTheme.button.text}; + } } `; + +export const SmallGoldenHeader = styled(Paragraph)` + font-family: ${(props) => props.theme.fonts.bold}; + font-size: 14px; + line-height: 100%; + color: ${(props) => props.theme.colors.common.primaryGold}; + text-transform: uppercase; + text-align: center; + letter-spacing: 0.65em; + margin-bottom: 20px; +`; + +export const WhiteHeader = styled.div` + font-family: ${(props) => props.theme.fonts.compressedBlack}; + font-size: 42px; + line-height: 100%; + color: ${(props) => props.theme.colors.common.primaryWhite}; + text-transform: uppercase; + text-align: center; + text-shadow: 0px 0px 12.83px rgba(255, 255, 255, 0.2); + letter-spacing: 0.05em; + width: 550px; +`; diff --git a/styles/main.css b/styles/main.css index 9e0b450fd3..963606f418 100644 --- a/styles/main.css +++ b/styles/main.css @@ -37,11 +37,31 @@ font-display: monospace; } +@font-face { + font-family: 'GT-America-Compressed-Black'; + src: url('/fonts/GT-America-Compressed-Black.woff2') format('woff2'), + url('/fonts/GT-America-Compressed-Black.woff') format('woff'); + font-display: monospace; +} + +@font-face { + font-family: 'GT-America-Compressed-Medium'; + src: url('/fonts/GT-America-Compressed-Medium.woff2') format('woff2'), + url('/fonts/GT-America-Compressed-Medium.woff') format('woff'); +} + #__next { width: 100%; height: 100%; position: relative; } +* { + scroll-behavior: smooth; + } + +html { + scrollbar-width: none; +} body { font-family: 'AkkuratLLWeb-Regular', -apple-system, BlinkMacSystemFont, sans-serif; @@ -51,8 +71,17 @@ body { margin: 0; position: relative; min-height: 100vh; - scroll-behavior: smooth; font-size: 12px; + + -ms-overflow-style: none; + scrollbar-width: none; + overflow: auto; +} + +::-webkit-scrollbar { + display: none; + width: 0; + height: 0; } ul { diff --git a/styles/theme/colors/common.ts b/styles/theme/colors/common.ts index e4df031f84..85f86b87b6 100644 --- a/styles/theme/colors/common.ts +++ b/styles/theme/colors/common.ts @@ -6,6 +6,7 @@ const common = { primaryRed: '#EF6868', primaryGreen: '#7FD482', secondaryGray: '#787878', + tertiaryGray: '#999999', secondaryGold: '#E4B378', }; diff --git a/styles/theme/colors/dark.ts b/styles/theme/colors/dark.ts index 346d6bc2b6..d4cacbc73a 100644 --- a/styles/theme/colors/dark.ts +++ b/styles/theme/colors/dark.ts @@ -3,7 +3,17 @@ import common from './common'; const darkTheme = { background: '#131212', border: '1px solid #2B2A2A', + red: '#EF6868', + green: '#7FD482', + black: '#171002', + white: '#ECE8E3', + gray: '#787878', + table: { fill: 'rgba(255, 255, 255, 0.01)', hover: 'rgba(255, 255, 255, 0.05)' }, + gold: '#E4B378', button: { + border: 'rgb(255 255 255 / 10%)', + fill: '#252525', + fillHover: '#2B2A2A', background: 'linear-gradient(180deg, #282727 0%, #191818 100%)', hover: 'linear-gradient(180deg, #383838 0%, #383838 0.01%, #1E1E1E 100%)', shadow: @@ -39,7 +49,7 @@ const darkTheme = { }, }, input: { - background: 'linear-gradient(180deg, rgba(27, 27, 27, 0.1) 0%, rgba(27, 27, 27, 0.075) 100%)', + background: '#151515', secondary: { background: 'linear-gradient(180deg, rgba(27, 27, 27, 0.1) 0%, rgba(27, 27, 27, 0.075) 100%)', }, @@ -49,7 +59,7 @@ const darkTheme = { segmented: { background: 'linear-gradient(180deg, rgba(27, 27, 27, 0.1) 0%, rgba(33, 33, 33, 0.1) 100%)', button: { - background: 'linear-gradient(180deg, rgba(36, 36, 36, 0.08) 0%, rgba(88, 88, 88, 0.1) 100%)', + background: '#2f2f2f', shadow: '0px 4px 4px rgba(0, 0, 0, 0.25), 0px 1px 2px rgba(0, 0, 0, 0.5), inset 0px 0px 20px rgba(255, 255, 255, 0.03), inset 0px 1px 0px rgba(255, 255, 255, 0.09)', inactive: { color: '#787878' }, @@ -67,10 +77,19 @@ const darkTheme = { }, }, cell: { + fill: '#1E1D1D;', gradient: 'linear-gradient(180deg, #1E1D1D 0%, #1b1a1a 100%)', hover: '#222222', outline: '#2B2A2A', }, + text: { + title: common.secondaryGray, + value: common.primaryWhite, + }, + icon: { + fill: '#787878', + hover: '#ECE8E3', + }, }; export default darkTheme; diff --git a/styles/theme/colors/elite.ts b/styles/theme/colors/elite.ts index 9ed1e5caff..a5d67db899 100644 --- a/styles/theme/colors/elite.ts +++ b/styles/theme/colors/elite.ts @@ -3,7 +3,17 @@ import common from './common'; const eliteTheme = { background: '#282626', border: '1px solid rgba(255, 255, 255, 0.1)', + red: '', + green: '', + black: '#171002', + white: '', + gray: '#787878', + table: { fill: 'rgba(255, 255, 255, 0.01)', hover: '#EDEDED' }, + gold: '#E4B378', button: { + border: '', + fill: '#E6E6E6', + fillHover: '#2B2A2A', background: 'linear-gradient(180deg, #39332D 0%, #2D2A28 100%)', hover: 'linear-gradient(180deg, #4F463D 0%, #332F2D 100%)', shadow: '0px 2px 2px rgba(0, 0, 0, 0.25), inset 0px 0px 20px rgba(255, 255, 255, 0.03)', @@ -72,10 +82,19 @@ const eliteTheme = { }, }, cell: { + fill: '#EBEBEB', gradient: 'linear-gradient(180deg, #1E1D1D 0%, #1b1a1a 100%)', hover: '#222222', outline: '#2B2A2A', }, + text: { + title: common.secondaryGray, + value: common.primaryWhite, + }, + icon: { + fill: '', + hover: '', + }, }; export default eliteTheme; diff --git a/styles/theme/colors/index.ts b/styles/theme/colors/index.ts index 8f31a59ed4..c82a972bf8 100644 --- a/styles/theme/colors/index.ts +++ b/styles/theme/colors/index.ts @@ -1,6 +1,5 @@ import common from './common'; -import eliteTheme from './elite'; import darkTheme from './dark'; import lightTheme from './light'; @@ -12,7 +11,6 @@ const goldColors = { }; export const themeColors = { - elite: eliteTheme, dark: darkTheme, light: lightTheme, }; @@ -48,7 +46,6 @@ const colors = { noNetwork: '#EF6868', transparentBlack: 'rgba(0, 0, 0, 0.5)', common, - selectedTheme: themeColors.dark, }; export default colors; diff --git a/styles/theme/colors/light.ts b/styles/theme/colors/light.ts index 3704f0336a..4addaf97d7 100644 --- a/styles/theme/colors/light.ts +++ b/styles/theme/colors/light.ts @@ -1,22 +1,32 @@ import common from './common'; const lightTheme = { - background: '#F9F9F9', + background: '#F2F2F2', border: '1px solid rgba(0, 0, 0, 0.1)', + red: '#A80300', + green: '#1D5D1F', + black: '#171002', + white: '#F2F2F2', + gray: '#515151', + table: { fill: '#EEE', hover: '#E6E6E6' }, + gold: '#724713', button: { + border: 'rgb(0 0 0 / 10%)', + fill: '#e8e8e8', + fillHover: '#f0f0f0', background: - 'linear-gradient(180deg, rgba(231, 231, 231, 0.5) 0%, rgba(203, 203, 203, 0.5) 100%)', - hover: 'linear-gradient(180deg, #383838 0%, #383838 0.01%, #1E1E1E 100%)', + 'linear-gradient(180deg, rgba(231, 231, 231, 0.6) 0%, rgba(203, 203, 203, 0.6) 100%)', + hover: 'linear-gradient(180deg, rgba(231, 231, 231, 0.8) 0%, rgba(203, 203, 203, 0.8) 100%)', shadow: - '0px 2px 2px rgba(0, 0, 0, 0.25), inset 0px 1px 0px rgba(255, 255, 255, 0.08), inset 0px 0px 20px rgba(255, 255, 255, 0.03)', - text: '#000000', + '0px 2px 3px rgb(0 0 0 / 10%), inset 0px 1px 0px rgb(255 255 255 / 8%), inset 0px 0px 20px rgb(255 255 255 / 3%)', + text: '#171002', primary: { background: 'linear-gradient(180deg, #BE9461 0%, #9C6C3C 100%)', hover: 'linear-gradient(180deg, #E4B378 0%, #B98C55 100%)', textShadow: '0px 1px 2px rgba(0, 0, 0, 0.5)', }, - secondary: { text: '#C9975B' }, - danger: { text: '#EF6868' }, + secondary: { text: '#7D7D7F' }, + danger: { text: '#FF4747' }, active: { shadow: 'inset 0px 0px 20px rgba(255, 255, 255, 0.03)', textShadow: '0px 1px 2px rgba(0, 0, 0, 0.4)', @@ -29,30 +39,30 @@ const lightTheme = { dangerBorder: 'rgba(239, 104, 104, 0.2)', }, }, - disabled: { text: '#555555', background: '#272727' }, + disabled: { text: '#B3B3B3', background: '#272727' }, tab: { badge: { background: '#E4B378', text: common.secondaryGray, shadow: 'inset 0px 0.8px 0px rgba(255, 255, 255, 0.6)', }, - disabled: { border: '1px solid #353333', text: '#353333' }, + disabled: { border: '1px solid #353333', text: '#B3B3B3' }, }, }, input: { - background: 'linear-gradient(180deg, #1B1B1B 0%, rgba(27, 27, 27, 0.75) 100%)', + background: '#cbcbcb', secondary: { - background: 'linear-gradient(180deg, #1B1B1B 0%, rgba(27, 27, 27, 0.3) 100%)', + background: 'transparent', }, placeholder: '#787878', shadow: '0px 0.5px 0px rgba(255, 255, 255, 0.08)', }, segmented: { - background: 'linear-gradient(180deg, #1B1B1B 0%, #212121 100%)', + background: 'transparent', button: { - background: 'linear-gradient(180deg, #262322 0%, #39332D 100%)', + background: '#dfdfdf', shadow: - '0px 4px 4px rgba(0, 0, 0, 0.25), 0px 1px 2px rgba(0, 0, 0, 0.5), inset 0px 0px 20px rgba(255, 255, 255, 0.03), inset 0px 1px 0px rgba(255, 255, 255, 0.09)', + '0px 2px 2px rgb(0 0 0 / 10%), inset 0px 0px 20px rgb(255 255 255 / 30%), inset 0px 1px 0px rgb(255 255 255 / 50%)', inactive: { color: '#787878' }, }, }, @@ -68,9 +78,18 @@ const lightTheme = { }, }, cell: { + fill: '#EDEDED', gradient: 'linear-gradient(180deg, #1E1D1D 0%, #1b1a1a 100%)', - hover: '#222222', - outline: '#2B2A2A', + hover: '#E6E6E6', + outline: 'grey', + }, + text: { + title: common.secondaryGray, + value: '#000000', + }, + icon: { + fill: '#515151', + hover: '#171002', }, }; diff --git a/styles/theme/fonts.ts b/styles/theme/fonts.ts index bad30b949b..c4c1914d78 100644 --- a/styles/theme/fonts.ts +++ b/styles/theme/fonts.ts @@ -4,6 +4,8 @@ const fontStyles = { black: `AkkuratLLWeb-Black`, mono: `AkkuratMonoLLWeb-Regular`, monoBold: `AkkuratMonoLLWeb-Bold`, + compressedBlack: `GT-America-Compressed-Black`, + compressedMedium: `GT-America-Compressed-Medium`, }; export default fontStyles; diff --git a/styles/theme/index.ts b/styles/theme/index.ts index bb4501f44f..bfef1b016c 100644 --- a/styles/theme/index.ts +++ b/styles/theme/index.ts @@ -1,13 +1,29 @@ -import colors from './colors'; +import colors, { themeColors } from './colors'; import fonts from './fonts'; import animations from './animations'; -export const theme = { +const theme = { colors, fonts, animations, }; -export type ThemeInterface = typeof theme; +export type ThemeName = keyof typeof themeColors; + +export const wrapTheme = (name: ThemeName) => ({ + ...theme, + colors: { + ...theme.colors, + selectedTheme: themeColors[name], + }, +}); + +export type ThemeInterface = ReturnType; + +export const themes = { + light: wrapTheme('light'), + dark: wrapTheme('dark'), + // elite: wrapTheme('elite'), +}; export default theme; diff --git a/test-utils/ContextProvider.tsx b/test-utils/ContextProvider.tsx index 3b38596aee..6ccc76313c 100644 --- a/test-utils/ContextProvider.tsx +++ b/test-utils/ContextProvider.tsx @@ -1,12 +1,12 @@ import { FC } from 'react'; import { ThemeProvider } from 'styled-components'; -import theme from 'styles/theme'; +import { themes } from 'styles/theme'; import { RecoilRoot } from 'recoil'; const ContextProvider: FC = ({ children }) => { return ( - {children} + {children} ); }; diff --git a/translations/en.json b/translations/en.json index 8b19ce8450..3e2363f151 100644 --- a/translations/en.json +++ b/translations/en.json @@ -36,20 +36,32 @@ } }, "homepage": { - "page-title": "Kwenta | derivatives trading with infinite liquidity", + "page-title": "Kwenta | Derivatives Trading with Infinite Liquidity", "nav": { - "start-trading": "Start Trading", + "start-trade": "Start Trading", + "trade-now": "Trade now", "wallet": "Connect Wallet", - "why": "Why Kwenta?", - "how": "How it Works", - "faq": "FAQ", - "kips": "KIPs" + "markets": "Markets", + "governance": { + "title": "Governance", + "overview": "Overview", + "kips": "KIPs" + }, + "socials": { + "title": "Socials", + "discord": "Discord", + "mirror": "Mirror", + "twitter": "Twitter" + }, + "blog": "Blog" }, "hero": { - "title": "Derivatives trading with zero slippage" + "title": "UNSTOPPABLE SYNTHETIC LEVERAGE", + "copy": "Trade commodities, forex, crypto, and more with up to <0>25x leverage0> and <0>deep liquidity0>." }, "assets": { - "title": "Trade real world assets and derivatives on Ethereum", + "title": "TRENDING MARKETS", + "description": "Start Trading Synths now", "index": "Unique Indices", "forex": "Forex", "equities": "Traditional Equities", @@ -57,19 +69,96 @@ "commodity": "Commodities", "short": "Short positions" }, + "shortlist": { + "title": "Leaderboard", + "description": "Overview Of Current Most Profitable Accounts", + "stats": { + "title": "Last 24H Stats", + "copy": "Access to decentralized trading tools", + "volume": "Trading Volume", + "trades": "Total Daily Trades", + "open-interest": "Open Interest" + } + }, + "earning": { + "title": "Earnings", + "description": "See What You Can Do With <0>$KWENTA0> Token", + "copy": "Stake to earn, receive trading bonuses and participate in Kwenta DAO governance.", + "stake-to-earn": { + "title": "stake to earn", + "copy": "Staking $KWENTA earns weekly rewards which includes protocol fees and inflationary rewards" + }, + "trade-to-earn": { + "title": "trade to earn", + "copy": "Stakers who trade actively will receive increased staking rewards" + }, + "vote-and-govern": { + "title": "vote & govern", + "copy": "Token-managed governance empowers the community to help steer the Kwenta Exchange" + }, + "how-to-earn": "How to earn", + "stake-kwenta": "Stake KWENTA", + "stats": { + "volume": "Total Trading Volume", + "trades": "Total Trades" + } + }, + "learn": { + "title": "Learn More", + "description": "Explore Endless Possibilities Of Kwenta Exchange", + "how-to-trade": { + "title": "Learn How To Trade On Kwenta", + "copy": "Trading made easy, trade like a pro!" + }, + "how-to-stake": { + "title": "Learn how to start earning with Kwenta", + "copy": "Earn the Kwenta token by participating in staking or incentives" + }, + "how-governance": { + "title": "How Governance Works", + "copy": "Kwenta is governed, built, and maintained by its community. Learn more about how governance works, and how to get involved." + }, + "faq": "FAQ" + }, + "tradenow": { + "title": "SYNTHETIC LEVERAGE", + "description": "Take Back The Market, Trade Like A Whale", + "categories": "Commodities, Forex, Crypto and more." + }, "features": { - "title": "Unique trading features", - "infinite-liquidity": { - "title": "Infinite liquidity", - "copy": "All trading is peer-to-contract, using the Synthetix protocol’s pooled liquidity model. This means no counterparty matching, and essentially infinite liquidity for traders." + "title": "FEATURE CALLOUTS", + "description": "Trading Without The Limits Of A Centralised Exchange", + "blazing-fast": { + "title": "Blazing Fast", + "copy": "Near-instant trade confirmations using Layer 2 scalability" + }, + "low-gas-fees": { + "title": "Low Gas Fees", + "copy": "Transaction costs on Layer 2 are one-tenth of L1" + }, + "unique-assets": { + "title": "Unique Assets", + "copy": "Trade a variety of digital and traditional assets with low trading fees" + }, + "permissionless": { + "title": "Permissionless", + "copy": "A full on-chain DeFi futures trading experience" + }, + "mobile": { + "title": "Mobile", + "copy": "Manage your trades at home or on the go" + }, + "easy-ramping": { + "title": "Easy Ramping", + "copy": "Deposit any asset to get started" }, "zero-slippage": { "title": "Zero slippage", - "copy": "Infinite liquidity means that traders never have to worry about moving the orderbook and being affected by slippage." + "copy": "Trade any available market with little to no slippage regardless of size" }, - "synthetic-futures": { - "title": "Synthetic futures", - "copy": "Once futures is built on the Synthetix protocol, it will soon be supported on Kwenta, offering perpetual future contracts on a non-custodial, permissionless platform." + "partners": { + "title": "Kwenta Ecosystem", + "copy": "Collaborating with industry leaders to deliver the best trading experience in DeFi." } }, "l2": { @@ -164,6 +253,29 @@ "cta": { "title": "Start trading today", "button": "View Exchange" + }, + "copyright": "© 2022 kwenta, All Rights Reserved.", + "about-kwenta": { + "title": "About Kwenta", + "docs": "Docs", + "news": "News", + "faq": "FAQ", + "dao-roles": "DAO Roles" + }, + "use-kwenta": { + "title": "Use KWENTA", + "how-to": "How to use Kwenta", + "perps": "Perpetuals", + "short": "Shorting", + "spot": "Spot Trading", + "legacy": "Legacy Exchange" + }, + "community": { + "title": "Community", + "governance": "Governance", + "dev-dao": "Dev DAO", + "marketing-dao": "Marketing DAO", + "kips": "KIPs" } } }, @@ -197,11 +309,13 @@ "seconds-ago": "sec ago" }, "tooltips": { - "external-price": "Aggregated market price provided by CoinGecko", + "external-price": "Aggregated market price provided by external sources (Coingecko, Forex Market, etc.)", "24h-change": "Total change in asset value within the past 24 hours", "24h-vol": "Total trade volume within the past 24 hours", "24h-trades": "Total amount of trades on selected pair within the past 24h", + "open-interest":"Total notional value on all outstanding positions of the selected market", "1h-funding-rate": "Funding applies to all open positions. A positive rate means longs pay shorts, a negative rate means shorts pay longs. The rate is calculated as the average funding paid by open positions for the last hour. Funding accrues on a position every time it is opened, modified, or closed. Funding accrues on open positions." + } }, "price-chart-card": { @@ -243,7 +357,7 @@ "summary-info": { "gas-price-gwei": "gas price (GWEI)", "max-fee-gwei": "Max Fee (GWEI)", - "fee": "fee", + "fee": "Exchange fee", "fee-cost": "fee cost", "button": { "approve": "approve", @@ -417,6 +531,16 @@ "open-interest": "Open Interest", "daily-volume": "24H Volume" }, + "history-tabs": { + "futures": "Futures History", + "spot": "Spot History" + }, + "history-table": { + "date-time": "Date/Time", + "from": "From", + "to": "To", + "usd-value": "USD Value" + }, "positions-tabs": { "futures": "Futures Positions", "shorts": "Shorts", @@ -424,7 +548,8 @@ }, "markets-tabs": { "futures": "Futures Markets", - "spot": "Spot Markets" + "spot": "Spot Markets", + "synths": "Synths Markets" } }, "deprecated": { @@ -654,10 +779,10 @@ "r-pnl": "Realized PnL", "u-pnl": "Unrealized PnL", "leverage": "Leverage", - "liquidation-price": "Liq. Price", + "liquidation-price": "Liq Price", "net-funding": "Net Funding", "fees": "Fees", - "avg-entry-price": "Avg. Entry", + "avg-entry-price": "Avg Entry", "tooltips": { "position-side": "Direction of current trade", "position-size": "Notional value of the open position", @@ -784,7 +909,7 @@ } }, "history": { - "history-label": "trading history", + "history-label": "trade history", "last-n-trades": "last {{ numberOfTrades }} trades", "skew-label": "skew", "skew-tooltip": "Skew is the total amount of outstanding long and short contracts expressed as a percentage", @@ -809,14 +934,20 @@ "accrued-funding-tooltip": "Funding is continuous and accrued over time. Longs pay shorts if market is skewed long and vice versa.", "close-position": "close position", "manage-position": "manage position", - "modal-close": { + "modal": { "title": "Close position", "size": "Size", "side": "Side", "leverage": "Leverage", "ROI": "ROI", "fee": "Protocol Fee", - "gas-fee": "Network Gas Fee" + "fee-total": "Total Fees", + "gas-fee": "Network Gas Fee", + "order-type": "Order Type", + "market-order": "Market", + "next-price-order": "Next-Price", + "deposit": "Total Deposit", + "np-discount": "Next-Price Discount" } }, "orders": { @@ -897,6 +1028,18 @@ "at": "at" } } + }, + "share": { + "title": "Share", + "buttons": { + "download": "Download" + }, + "position-metadata": { + "open-at": "open at", + "created-on": "created on", + "avg-open-price": "avg open price", + "current-price": "current price" + } } } }, @@ -917,8 +1060,7 @@ "total-volume": "Total Volume", "liquidations": "Liquidations", "24h-pnl": "24H PnL", - "total-pnl": "PnL ($)", - "percent-pnl": "PnL (%)" + "total-pnl": "PnL" } }, "trader-history": { @@ -929,7 +1071,7 @@ "liquidated": "Liquidated", "total-trades": "Trades", "total-volume": "Total Volume", - "total-pnl": "Realized PnL ($)" + "total-pnl": "Realized PnL" } }, "statistics": { @@ -1009,7 +1151,8 @@ "title": "settings", "options": { "currency": "currency", - "language": "language" + "language": "language", + "theme": "theme" } }, "wallet": { @@ -1065,7 +1208,7 @@ "tabs": { "nav": { "overview": "Overview", - "positions": "Positions", + "history": "History", "rewards": "Rewards", "markets": "Markets", "governance": "Governance", @@ -1145,7 +1288,7 @@ "limit": "limit order" }, "features": { - "coming-soon": "Coming Soon" + "coming-soon": "Soon" }, "wallet": { "connect-wallet": "connect wallet", @@ -1222,4 +1365,4 @@ }, "min": "min" } -} \ No newline at end of file +} diff --git a/utils/formatters/getLocale.ts b/utils/formatters/getLocale.ts index 3d769f2a19..626c322b00 100644 --- a/utils/formatters/getLocale.ts +++ b/utils/formatters/getLocale.ts @@ -81,10 +81,15 @@ import { zhTW, } from 'date-fns/locale'; -function getLocale(languageCode: string) { - let locale_: Locale = enUS; +function getLocale() { + let locale_: Locale = enUS, + language: Locale = { code: '' }; - switch (languageCode) { + navigator.languages !== undefined + ? (language.code = navigator.languages[0]) + : (language.code = navigator.language); + + switch (language.code) { case 'af': locale_ = af; break; @@ -325,6 +330,9 @@ function getLocale(languageCode: string) { case 'zh-tw': locale_ = zhTW; break; + + default: + console.error('Locale could not be detected.'); } return locale_;
{title}
{detail}
= ({ details, style, className, disabled } }`} > {disabled ? NO_VALUE : value.value} + {value.valueNode}
{t(`exchange.market-details-card.timer-tooltip.last-update`)}
{`${formatTimeUnit(minutes)}:${formatTimeUnit(seconds)} `} - {t(timeUnitsFormat)} + {t(timeUnitsFormat)}
{formatNumber(cellProps.row.original.leverage ?? 0)}x
{key}
{props.data.description}
{props.data.price}
+ {props.data.price} +
{props.data.change}
{short}
{long}