From 423731f65eee1c1b9cf1146c614f903d0a67921c Mon Sep 17 00:00:00 2001 From: Linkie Link Date: Tue, 12 Dec 2023 14:02:01 +0100 Subject: [PATCH] v2.1.2 (#692) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Build(deps): bump @splinetool/runtime from 0.9.477 to 0.9.482 (#544) Bumps @splinetool/runtime from 0.9.477 to 0.9.482. --- updated-dependencies: - dependency-name: "@splinetool/runtime" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps-dev): bump @types/node from 20.7.0 to 20.8.6 (#548) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.7.0 to 20.8.6. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps): bump @sentry/nextjs from 7.73.0 to 7.74.0 (#545) Bumps [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) from 7.73.0 to 7.74.0. - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/7.73.0...7.74.0) --- updated-dependencies: - dependency-name: "@sentry/nextjs" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Mp 3245 usehlsvaults hook (#541) * ✨ routing and pages for HLS * ✨ create hooks for fetching HLS vaults and Strategies * Share accounts (#539) * feat: do not redirect to wallet on portfolio page * fix: use connected wallet for AccountMenu * fix: fixed ghost AccountDetails * feat: created ShareBar and share functionality * fix: don’t show shareBar if no address is present * fix: stupid 'next/navigation' * tidy: format * fix: fixed tests * ✨ routing and pages for HLS (#538) * πŸ› use useAccountIds * fix: fixed the tests * fix: accountIds is now a suspense --------- Co-authored-by: Bob van der Helm <34470358+bobthebuidlr@users.noreply.github.com> * πŸ› fix build --------- Co-authored-by: Linkie Link * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * added hatched health masks (#552) * added hatched health masks * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * sneak: change filled to used * fix: fixed the foregroundColor on increase and my ocd * ♻️ refactor table (Farm) (#555) * ♻️ refactor table (Farm) * 🧽 clean up PR * 🧽 clean up PR * Build(deps): bump @babel/traverse from 7.21.2 to 7.23.2 (#554) Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.21.2 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix: rename withdraw to unlend (#557) * Full refactor tables (#556) * πŸ“ˆ Improve structure generic Table component * ♻️ Update Borrow Table and overall structure of Table comp * ♻️ Update Lend table * ✨ add loading state for lend table * πŸ§ͺ Fix unit tests * ✨ Add available HLS Vaults page (#558) * Table updates (#559) * fix: adjusted table colors and hover interactions * fix: added actionButtons back and changed lend to APY * fix: build update * tidy: fixed the CircularProgress indicators on the loading modals * fix: relative import * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * Mp 3480 persist last trading pair (#578) * MP-3480: remove favourite asset and prepare localStore * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * MP-3480: persist trading pair * fix: updated according to feedback * fix: remove pair from Trading View header --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Bob van der Helm <34470358+bobthebuidlr@users.noreply.github.com> * post update hotfixes (#580) * fix: fixed showing 0 on farm page if no desposited vaults * fix: chnage USDC’s name to Noble * v2.0.1 (#579) (#582) * Build(deps): bump @splinetool/runtime from 0.9.477 to 0.9.482 (#544) Bumps @splinetool/runtime from 0.9.477 to 0.9.482. --- updated-dependencies: - dependency-name: "@splinetool/runtime" dependency-type: direct:production update-type: version-update:semver-patch ... * Build(deps-dev): bump @types/node from 20.7.0 to 20.8.6 (#548) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.7.0 to 20.8.6. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... * Build(deps): bump @sentry/nextjs from 7.73.0 to 7.74.0 (#545) Bumps [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) from 7.73.0 to 7.74.0. - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/7.73.0...7.74.0) --- updated-dependencies: - dependency-name: "@sentry/nextjs" dependency-type: direct:production update-type: version-update:semver-minor ... * Mp 3245 usehlsvaults hook (#541) * ✨ routing and pages for HLS * ✨ create hooks for fetching HLS vaults and Strategies * Share accounts (#539) * feat: do not redirect to wallet on portfolio page * fix: use connected wallet for AccountMenu * fix: fixed ghost AccountDetails * feat: created ShareBar and share functionality * fix: don’t show shareBar if no address is present * fix: stupid 'next/navigation' * tidy: format * fix: fixed tests * ✨ routing and pages for HLS (#538) * πŸ› use useAccountIds * fix: fixed the tests * fix: accountIds is now a suspense --------- * πŸ› fix build --------- * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * added hatched health masks (#552) * added hatched health masks * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * sneak: change filled to used * fix: fixed the foregroundColor on increase and my ocd * ♻️ refactor table (Farm) (#555) * ♻️ refactor table (Farm) * 🧽 clean up PR * 🧽 clean up PR * Build(deps): bump @babel/traverse from 7.21.2 to 7.23.2 (#554) Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.21.2 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... * fix: rename withdraw to unlend (#557) * Full refactor tables (#556) * πŸ“ˆ Improve structure generic Table component * ♻️ Update Borrow Table and overall structure of Table comp * ♻️ Update Lend table * ✨ add loading state for lend table * πŸ§ͺ Fix unit tests * ✨ Add available HLS Vaults page (#558) * Table updates (#559) * fix: adjusted table colors and hover interactions * fix: added actionButtons back and changed lend to APY * fix: build update * tidy: fixed the CircularProgress indicators on the loading modals * fix: relative import * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * Mp 3480 persist last trading pair (#578) * MP-3480: remove favourite asset and prepare localStore * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * MP-3480: persist trading pair * fix: updated according to feedback * fix: remove pair from Trading View header --------- --------- Signed-off-by: dependabot[bot] Co-authored-by: Linkie Link Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * v2.0.1 (#579) (#583) * Build(deps): bump @splinetool/runtime from 0.9.477 to 0.9.482 (#544) Bumps @splinetool/runtime from 0.9.477 to 0.9.482. --- updated-dependencies: - dependency-name: "@splinetool/runtime" dependency-type: direct:production update-type: version-update:semver-patch ... * Build(deps-dev): bump @types/node from 20.7.0 to 20.8.6 (#548) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.7.0 to 20.8.6. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... * Build(deps): bump @sentry/nextjs from 7.73.0 to 7.74.0 (#545) Bumps [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) from 7.73.0 to 7.74.0. - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/7.73.0...7.74.0) --- updated-dependencies: - dependency-name: "@sentry/nextjs" dependency-type: direct:production update-type: version-update:semver-minor ... * Mp 3245 usehlsvaults hook (#541) * ✨ routing and pages for HLS * ✨ create hooks for fetching HLS vaults and Strategies * Share accounts (#539) * feat: do not redirect to wallet on portfolio page * fix: use connected wallet for AccountMenu * fix: fixed ghost AccountDetails * feat: created ShareBar and share functionality * fix: don’t show shareBar if no address is present * fix: stupid 'next/navigation' * tidy: format * fix: fixed tests * ✨ routing and pages for HLS (#538) * πŸ› use useAccountIds * fix: fixed the tests * fix: accountIds is now a suspense --------- * πŸ› fix build --------- * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * added hatched health masks (#552) * added hatched health masks * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * sneak: change filled to used * fix: fixed the foregroundColor on increase and my ocd * ♻️ refactor table (Farm) (#555) * ♻️ refactor table (Farm) * 🧽 clean up PR * 🧽 clean up PR * Build(deps): bump @babel/traverse from 7.21.2 to 7.23.2 (#554) Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.21.2 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... * fix: rename withdraw to unlend (#557) * Full refactor tables (#556) * πŸ“ˆ Improve structure generic Table component * ♻️ Update Borrow Table and overall structure of Table comp * ♻️ Update Lend table * ✨ add loading state for lend table * πŸ§ͺ Fix unit tests * ✨ Add available HLS Vaults page (#558) * Table updates (#559) * fix: adjusted table colors and hover interactions * fix: added actionButtons back and changed lend to APY * fix: build update * tidy: fixed the CircularProgress indicators on the loading modals * fix: relative import * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * Mp 3480 persist last trading pair (#578) * MP-3480: remove favourite asset and prepare localStore * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * MP-3480: persist trading pair * fix: updated according to feedback * fix: remove pair from Trading View header --------- --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Bob van der Helm <34470358+bobthebuidlr@users.noreply.github.com> * Asset select overflow (#584) * v2.0.1 (#579) * Build(deps): bump @splinetool/runtime from 0.9.477 to 0.9.482 (#544) Bumps @splinetool/runtime from 0.9.477 to 0.9.482. --- updated-dependencies: - dependency-name: "@splinetool/runtime" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps-dev): bump @types/node from 20.7.0 to 20.8.6 (#548) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.7.0 to 20.8.6. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps): bump @sentry/nextjs from 7.73.0 to 7.74.0 (#545) Bumps [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) from 7.73.0 to 7.74.0. - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/7.73.0...7.74.0) --- updated-dependencies: - dependency-name: "@sentry/nextjs" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Mp 3245 usehlsvaults hook (#541) * ✨ routing and pages for HLS * ✨ create hooks for fetching HLS vaults and Strategies * Share accounts (#539) * feat: do not redirect to wallet on portfolio page * fix: use connected wallet for AccountMenu * fix: fixed ghost AccountDetails * feat: created ShareBar and share functionality * fix: don’t show shareBar if no address is present * fix: stupid 'next/navigation' * tidy: format * fix: fixed tests * ✨ routing and pages for HLS (#538) * πŸ› use useAccountIds * fix: fixed the tests * fix: accountIds is now a suspense --------- Co-authored-by: Bob van der Helm <34470358+bobthebuidlr@users.noreply.github.com> * πŸ› fix build --------- Co-authored-by: Linkie Link * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * added hatched health masks (#552) * added hatched health masks * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * sneak: change filled to used * fix: fixed the foregroundColor on increase and my ocd * ♻️ refactor table (Farm) (#555) * ♻️ refactor table (Farm) * 🧽 clean up PR * 🧽 clean up PR * Build(deps): bump @babel/traverse from 7.21.2 to 7.23.2 (#554) Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.21.2 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix: rename withdraw to unlend (#557) * Full refactor tables (#556) * πŸ“ˆ Improve structure generic Table component * ♻️ Update Borrow Table and overall structure of Table comp * ♻️ Update Lend table * ✨ add loading state for lend table * πŸ§ͺ Fix unit tests * ✨ Add available HLS Vaults page (#558) * Table updates (#559) * fix: adjusted table colors and hover interactions * fix: added actionButtons back and changed lend to APY * fix: build update * tidy: fixed the CircularProgress indicators on the loading modals * fix: relative import * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * Mp 3480 persist last trading pair (#578) * MP-3480: remove favourite asset and prepare localStore * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * MP-3480: persist trading pair * fix: updated according to feedback * fix: remove pair from Trading View header --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Bob van der Helm <34470358+bobthebuidlr@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Bob van der Helm <34470358+bobthebuidlr@users.noreply.github.com> * Build(deps): bump @splinetool/runtime from 0.9.477 to 0.9.482 (#544) Bumps @splinetool/runtime from 0.9.477 to 0.9.482. --- updated-dependencies: - dependency-name: "@splinetool/runtime" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps-dev): bump @types/node from 20.7.0 to 20.8.6 (#548) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.7.0 to 20.8.6. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps): bump @sentry/nextjs from 7.73.0 to 7.74.0 (#545) Bumps [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) from 7.73.0 to 7.74.0. - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/7.73.0...7.74.0) --- updated-dependencies: - dependency-name: "@sentry/nextjs" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Mp 3245 usehlsvaults hook (#541) * ✨ routing and pages for HLS * ✨ create hooks for fetching HLS vaults and Strategies * Share accounts (#539) * feat: do not redirect to wallet on portfolio page * fix: use connected wallet for AccountMenu * fix: fixed ghost AccountDetails * feat: created ShareBar and share functionality * fix: don’t show shareBar if no address is present * fix: stupid 'next/navigation' * tidy: format * fix: fixed tests * ✨ routing and pages for HLS (#538) * πŸ› use useAccountIds * fix: fixed the tests * fix: accountIds is now a suspense --------- Co-authored-by: Bob van der Helm <34470358+bobthebuidlr@users.noreply.github.com> * πŸ› fix build --------- Co-authored-by: Linkie Link * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * added hatched health masks (#552) * added hatched health masks * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * sneak: change filled to used * fix: fixed the foregroundColor on increase and my ocd * ♻️ refactor table (Farm) (#555) * ♻️ refactor table (Farm) * 🧽 clean up PR * 🧽 clean up PR * fix: rename withdraw to unlend (#557) * Full refactor tables (#556) * πŸ“ˆ Improve structure generic Table component * ♻️ Update Borrow Table and overall structure of Table comp * ♻️ Update Lend table * ✨ add loading state for lend table * πŸ§ͺ Fix unit tests * ✨ Add available HLS Vaults page (#558) * Table updates (#559) * fix: adjusted table colors and hover interactions * fix: added actionButtons back and changed lend to APY * fix: build update * tidy: fixed the CircularProgress indicators on the loading modals * fix: relative import * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * post update hotfixes (#580) * fix: fixed showing 0 on farm page if no desposited vaults * fix: chnage USDC’s name to Noble * v2.0.1 (#579) (#582) * Build(deps): bump @splinetool/runtime from 0.9.477 to 0.9.482 (#544) Bumps @splinetool/runtime from 0.9.477 to 0.9.482. --- updated-dependencies: - dependency-name: "@splinetool/runtime" dependency-type: direct:production update-type: version-update:semver-patch ... * Build(deps-dev): bump @types/node from 20.7.0 to 20.8.6 (#548) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.7.0 to 20.8.6. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... * Build(deps): bump @sentry/nextjs from 7.73.0 to 7.74.0 (#545) Bumps [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) from 7.73.0 to 7.74.0. - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/7.73.0...7.74.0) --- updated-dependencies: - dependency-name: "@sentry/nextjs" dependency-type: direct:production update-type: version-update:semver-minor ... * Mp 3245 usehlsvaults hook (#541) * ✨ routing and pages for HLS * ✨ create hooks for fetching HLS vaults and Strategies * Share accounts (#539) * feat: do not redirect to wallet on portfolio page * fix: use connected wallet for AccountMenu * fix: fixed ghost AccountDetails * feat: created ShareBar and share functionality * fix: don’t show shareBar if no address is present * fix: stupid 'next/navigation' * tidy: format * fix: fixed tests * ✨ routing and pages for HLS (#538) * πŸ› use useAccountIds * fix: fixed the tests * fix: accountIds is now a suspense --------- * πŸ› fix build --------- * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * added hatched health masks (#552) * added hatched health masks * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * sneak: change filled to used * fix: fixed the foregroundColor on increase and my ocd * ♻️ refactor table (Farm) (#555) * ♻️ refactor table (Farm) * 🧽 clean up PR * 🧽 clean up PR * Build(deps): bump @babel/traverse from 7.21.2 to 7.23.2 (#554) Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.21.2 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... * fix: rename withdraw to unlend (#557) * Full refactor tables (#556) * πŸ“ˆ Improve structure generic Table component * ♻️ Update Borrow Table and overall structure of Table comp * ♻️ Update Lend table * ✨ add loading state for lend table * πŸ§ͺ Fix unit tests * ✨ Add available HLS Vaults page (#558) * Table updates (#559) * fix: adjusted table colors and hover interactions * fix: added actionButtons back and changed lend to APY * fix: build update * tidy: fixed the CircularProgress indicators on the loading modals * fix: relative import * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * Mp 3480 persist last trading pair (#578) * MP-3480: remove favourite asset and prepare localStore * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * MP-3480: persist trading pair * fix: updated according to feedback * fix: remove pair from Trading View header --------- --------- Signed-off-by: dependabot[bot] Co-authored-by: Linkie Link Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * v2.0.1 (#579) (#583) * Build(deps): bump @splinetool/runtime from 0.9.477 to 0.9.482 (#544) Bumps @splinetool/runtime from 0.9.477 to 0.9.482. --- updated-dependencies: - dependency-name: "@splinetool/runtime" dependency-type: direct:production update-type: version-update:semver-patch ... * Build(deps-dev): bump @types/node from 20.7.0 to 20.8.6 (#548) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.7.0 to 20.8.6. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... * Build(deps): bump @sentry/nextjs from 7.73.0 to 7.74.0 (#545) Bumps [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) from 7.73.0 to 7.74.0. - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/7.73.0...7.74.0) --- updated-dependencies: - dependency-name: "@sentry/nextjs" dependency-type: direct:production update-type: version-update:semver-minor ... * Mp 3245 usehlsvaults hook (#541) * ✨ routing and pages for HLS * ✨ create hooks for fetching HLS vaults and Strategies * Share accounts (#539) * feat: do not redirect to wallet on portfolio page * fix: use connected wallet for AccountMenu * fix: fixed ghost AccountDetails * feat: created ShareBar and share functionality * fix: don’t show shareBar if no address is present * fix: stupid 'next/navigation' * tidy: format * fix: fixed tests * ✨ routing and pages for HLS (#538) * πŸ› use useAccountIds * fix: fixed the tests * fix: accountIds is now a suspense --------- * πŸ› fix build --------- * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * added hatched health masks (#552) * added hatched health masks * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * sneak: change filled to used * fix: fixed the foregroundColor on increase and my ocd * ♻️ refactor table (Farm) (#555) * ♻️ refactor table (Farm) * 🧽 clean up PR * 🧽 clean up PR * Build(deps): bump @babel/traverse from 7.21.2 to 7.23.2 (#554) Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.21.2 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... * fix: rename withdraw to unlend (#557) * Full refactor tables (#556) * πŸ“ˆ Improve structure generic Table component * ♻️ Update Borrow Table and overall structure of Table comp * ♻️ Update Lend table * ✨ add loading state for lend table * πŸ§ͺ Fix unit tests * ✨ Add available HLS Vaults page (#558) * Table updates (#559) * fix: adjusted table colors and hover interactions * fix: added actionButtons back and changed lend to APY * fix: build update * tidy: fixed the CircularProgress indicators on the loading modals * fix: relative import * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * Mp 3480 persist last trading pair (#578) * MP-3480: remove favourite asset and prepare localStore * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * MP-3480: persist trading pair * fix: updated according to feedback * fix: remove pair from Trading View header --------- --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Bob van der Helm <34470358+bobthebuidlr@users.noreply.github.com> * fix: fixed the asset select overflow --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Bob van der Helm <34470358+bobthebuidlr@users.noreply.github.com> * fix: fixed the AccountDetails position * fix: update * Hotfixes v2.0.1 (#581) (#585) * Build(deps): bump @splinetool/runtime from 0.9.477 to 0.9.482 (#544) Bumps @splinetool/runtime from 0.9.477 to 0.9.482. --- updated-dependencies: - dependency-name: "@splinetool/runtime" dependency-type: direct:production update-type: version-update:semver-patch ... * Build(deps-dev): bump @types/node from 20.7.0 to 20.8.6 (#548) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.7.0 to 20.8.6. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... * Build(deps): bump @sentry/nextjs from 7.73.0 to 7.74.0 (#545) Bumps [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) from 7.73.0 to 7.74.0. - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/7.73.0...7.74.0) --- updated-dependencies: - dependency-name: "@sentry/nextjs" dependency-type: direct:production update-type: version-update:semver-minor ... * Mp 3245 usehlsvaults hook (#541) * ✨ routing and pages for HLS * ✨ create hooks for fetching HLS vaults and Strategies * Share accounts (#539) * feat: do not redirect to wallet on portfolio page * fix: use connected wallet for AccountMenu * fix: fixed ghost AccountDetails * feat: created ShareBar and share functionality * fix: don’t show shareBar if no address is present * fix: stupid 'next/navigation' * tidy: format * fix: fixed tests * ✨ routing and pages for HLS (#538) * πŸ› use useAccountIds * fix: fixed the tests * fix: accountIds is now a suspense --------- * πŸ› fix build --------- * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * added hatched health masks (#552) * added hatched health masks * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * sneak: change filled to used * fix: fixed the foregroundColor on increase and my ocd * ♻️ refactor table (Farm) (#555) * ♻️ refactor table (Farm) * 🧽 clean up PR * 🧽 clean up PR * Build(deps): bump @babel/traverse from 7.21.2 to 7.23.2 (#554) Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.21.2 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... * fix: rename withdraw to unlend (#557) * Full refactor tables (#556) * πŸ“ˆ Improve structure generic Table component * ♻️ Update Borrow Table and overall structure of Table comp * ♻️ Update Lend table * ✨ add loading state for lend table * πŸ§ͺ Fix unit tests * ✨ Add available HLS Vaults page (#558) * Table updates (#559) * fix: adjusted table colors and hover interactions * fix: added actionButtons back and changed lend to APY * fix: build update * tidy: fixed the CircularProgress indicators on the loading modals * fix: relative import * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * Mp 3480 persist last trading pair (#578) * MP-3480: remove favourite asset and prepare localStore * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * MP-3480: persist trading pair * fix: updated according to feedback * fix: remove pair from Trading View header --------- * post update hotfixes (#580) * fix: fixed showing 0 on farm page if no desposited vaults * fix: chnage USDC’s name to Noble * v2.0.1 (#579) (#582) * Build(deps): bump @splinetool/runtime from 0.9.477 to 0.9.482 (#544) Bumps @splinetool/runtime from 0.9.477 to 0.9.482. --- updated-dependencies: - dependency-name: "@splinetool/runtime" dependency-type: direct:production update-type: version-update:semver-patch ... * Build(deps-dev): bump @types/node from 20.7.0 to 20.8.6 (#548) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.7.0 to 20.8.6. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... * Build(deps): bump @sentry/nextjs from 7.73.0 to 7.74.0 (#545) Bumps [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) from 7.73.0 to 7.74.0. - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/7.73.0...7.74.0) --- updated-dependencies: - dependency-name: "@sentry/nextjs" dependency-type: direct:production update-type: version-update:semver-minor ... * Mp 3245 usehlsvaults hook (#541) * ✨ routing and pages for HLS * ✨ create hooks for fetching HLS vaults and Strategies * Share accounts (#539) * feat: do not redirect to wallet on portfolio page * fix: use connected wallet for AccountMenu * fix: fixed ghost AccountDetails * feat: created ShareBar and share functionality * fix: don’t show shareBar if no address is present * fix: stupid 'next/navigation' * tidy: format * fix: fixed tests * ✨ routing and pages for HLS (#538) * πŸ› use useAccountIds * fix: fixed the tests * fix: accountIds is now a suspense --------- * πŸ› fix build --------- * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * added hatched health masks (#552) * added hatched health masks * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * sneak: change filled to used * fix: fixed the foregroundColor on increase and my ocd * ♻️ refactor table (Farm) (#555) * ♻️ refactor table (Farm) * 🧽 clean up PR * 🧽 clean up PR * Build(deps): bump @babel/traverse from 7.21.2 to 7.23.2 (#554) Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.21.2 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... * fix: rename withdraw to unlend (#557) * Full refactor tables (#556) * πŸ“ˆ Improve structure generic Table component * ♻️ Update Borrow Table and overall structure of Table comp * ♻️ Update Lend table * ✨ add loading state for lend table * πŸ§ͺ Fix unit tests * ✨ Add available HLS Vaults page (#558) * Table updates (#559) * fix: adjusted table colors and hover interactions * fix: added actionButtons back and changed lend to APY * fix: build update * tidy: fixed the CircularProgress indicators on the loading modals * fix: relative import * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * Mp 3480 persist last trading pair (#578) * MP-3480: remove favourite asset and prepare localStore * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * MP-3480: persist trading pair * fix: updated according to feedback * fix: remove pair from Trading View header --------- --------- * v2.0.1 (#579) (#583) * Build(deps): bump @splinetool/runtime from 0.9.477 to 0.9.482 (#544) Bumps @splinetool/runtime from 0.9.477 to 0.9.482. --- updated-dependencies: - dependency-name: "@splinetool/runtime" dependency-type: direct:production update-type: version-update:semver-patch ... * Build(deps-dev): bump @types/node from 20.7.0 to 20.8.6 (#548) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.7.0 to 20.8.6. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... * Build(deps): bump @sentry/nextjs from 7.73.0 to 7.74.0 (#545) Bumps [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) from 7.73.0 to 7.74.0. - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/7.73.0...7.74.0) --- updated-dependencies: - dependency-name: "@sentry/nextjs" dependency-type: direct:production update-type: version-update:semver-minor ... * Mp 3245 usehlsvaults hook (#541) * ✨ routing and pages for HLS * ✨ create hooks for fetching HLS vaults and Strategies * Share accounts (#539) * feat: do not redirect to wallet on portfolio page * fix: use connected wallet for AccountMenu * fix: fixed ghost AccountDetails * feat: created ShareBar and share functionality * fix: don’t show shareBar if no address is present * fix: stupid 'next/navigation' * tidy: format * fix: fixed tests * ✨ routing and pages for HLS (#538) * πŸ› use useAccountIds * fix: fixed the tests * fix: accountIds is now a suspense --------- * πŸ› fix build --------- * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * added hatched health masks (#552) * added hatched health masks * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * sneak: change filled to used * fix: fixed the foregroundColor on increase and my ocd * ♻️ refactor table (Farm) (#555) * ♻️ refactor table (Farm) * 🧽 clean up PR * 🧽 clean up PR * Build(deps): bump @babel/traverse from 7.21.2 to 7.23.2 (#554) Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.21.2 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... * fix: rename withdraw to unlend (#557) * Full refactor tables (#556) * πŸ“ˆ Improve structure generic Table component * ♻️ Update Borrow Table and overall structure of Table comp * ♻️ Update Lend table * ✨ add loading state for lend table * πŸ§ͺ Fix unit tests * ✨ Add available HLS Vaults page (#558) * Table updates (#559) * fix: adjusted table colors and hover interactions * fix: added actionButtons back and changed lend to APY * fix: build update * tidy: fixed the CircularProgress indicators on the loading modals * fix: relative import * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * Mp 3480 persist last trading pair (#578) * MP-3480: remove favourite asset and prepare localStore * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * MP-3480: persist trading pair * fix: updated according to feedback * fix: remove pair from Trading View header --------- --------- * Asset select overflow (#584) * v2.0.1 (#579) * Build(deps): bump @splinetool/runtime from 0.9.477 to 0.9.482 (#544) Bumps @splinetool/runtime from 0.9.477 to 0.9.482. --- updated-dependencies: - dependency-name: "@splinetool/runtime" dependency-type: direct:production update-type: version-update:semver-patch ... * Build(deps-dev): bump @types/node from 20.7.0 to 20.8.6 (#548) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.7.0 to 20.8.6. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... * Build(deps): bump @sentry/nextjs from 7.73.0 to 7.74.0 (#545) Bumps [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) from 7.73.0 to 7.74.0. - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/7.73.0...7.74.0) --- updated-dependencies: - dependency-name: "@sentry/nextjs" dependency-type: direct:production update-type: version-update:semver-minor ... * Mp 3245 usehlsvaults hook (#541) * ✨ routing and pages for HLS * ✨ create hooks for fetching HLS vaults and Strategies * Share accounts (#539) * feat: do not redirect to wallet on portfolio page * fix: use connected wallet for AccountMenu * fix: fixed ghost AccountDetails * feat: created ShareBar and share functionality * fix: don’t show shareBar if no address is present * fix: stupid 'next/navigation' * tidy: format * fix: fixed tests * ✨ routing and pages for HLS (#538) * πŸ› use useAccountIds * fix: fixed the tests * fix: accountIds is now a suspense --------- * πŸ› fix build --------- * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * added hatched health masks (#552) * added hatched health masks * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * sneak: change filled to used * fix: fixed the foregroundColor on increase and my ocd * ♻️ refactor table (Farm) (#555) * ♻️ refactor table (Farm) * 🧽 clean up PR * 🧽 clean up PR * Build(deps): bump @babel/traverse from 7.21.2 to 7.23.2 (#554) Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.21.2 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... * fix: rename withdraw to unlend (#557) * Full refactor tables (#556) * πŸ“ˆ Improve structure generic Table component * ♻️ Update Borrow Table and overall structure of Table comp * ♻️ Update Lend table * ✨ add loading state for lend table * πŸ§ͺ Fix unit tests * ✨ Add available HLS Vaults page (#558) * Table updates (#559) * fix: adjusted table colors and hover interactions * fix: added actionButtons back and changed lend to APY * fix: build update * tidy: fixed the CircularProgress indicators on the loading modals * fix: relative import * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * Mp 3480 persist last trading pair (#578) * MP-3480: remove favourite asset and prepare localStore * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * MP-3480: persist trading pair * fix: updated according to feedback * fix: remove pair from Trading View header --------- --------- * Build(deps): bump @splinetool/runtime from 0.9.477 to 0.9.482 (#544) Bumps @splinetool/runtime from 0.9.477 to 0.9.482. --- updated-dependencies: - dependency-name: "@splinetool/runtime" dependency-type: direct:production update-type: version-update:semver-patch ... * Build(deps-dev): bump @types/node from 20.7.0 to 20.8.6 (#548) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.7.0 to 20.8.6. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... * Build(deps): bump @sentry/nextjs from 7.73.0 to 7.74.0 (#545) Bumps [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) from 7.73.0 to 7.74.0. - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/7.73.0...7.74.0) --- updated-dependencies: - dependency-name: "@sentry/nextjs" dependency-type: direct:production update-type: version-update:semver-minor ... * Mp 3245 usehlsvaults hook (#541) * ✨ routing and pages for HLS * ✨ create hooks for fetching HLS vaults and Strategies * Share accounts (#539) * feat: do not redirect to wallet on portfolio page * fix: use connected wallet for AccountMenu * fix: fixed ghost AccountDetails * feat: created ShareBar and share functionality * fix: don’t show shareBar if no address is present * fix: stupid 'next/navigation' * tidy: format * fix: fixed tests * ✨ routing and pages for HLS (#538) * πŸ› use useAccountIds * fix: fixed the tests * fix: accountIds is now a suspense --------- * πŸ› fix build --------- * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * added hatched health masks (#552) * added hatched health masks * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * sneak: change filled to used * fix: fixed the foregroundColor on increase and my ocd * ♻️ refactor table (Farm) (#555) * ♻️ refactor table (Farm) * 🧽 clean up PR * 🧽 clean up PR * fix: rename withdraw to unlend (#557) * Full refactor tables (#556) * πŸ“ˆ Improve structure generic Table component * ♻️ Update Borrow Table and overall structure of Table comp * ♻️ Update Lend table * ✨ add loading state for lend table * πŸ§ͺ Fix unit tests * ✨ Add available HLS Vaults page (#558) * Table updates (#559) * fix: adjusted table colors and hover interactions * fix: added actionButtons back and changed lend to APY * fix: build update * tidy: fixed the CircularProgress indicators on the loading modals * fix: relative import * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * post update hotfixes (#580) * fix: fixed showing 0 on farm page if no desposited vaults * fix: chnage USDC’s name to Noble * v2.0.1 (#579) (#582) * Build(deps): bump @splinetool/runtime from 0.9.477 to 0.9.482 (#544) Bumps @splinetool/runtime from 0.9.477 to 0.9.482. --- updated-dependencies: - dependency-name: "@splinetool/runtime" dependency-type: direct:production update-type: version-update:semver-patch ... * Build(deps-dev): bump @types/node from 20.7.0 to 20.8.6 (#548) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.7.0 to 20.8.6. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... * Build(deps): bump @sentry/nextjs from 7.73.0 to 7.74.0 (#545) Bumps [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) from 7.73.0 to 7.74.0. - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/7.73.0...7.74.0) --- updated-dependencies: - dependency-name: "@sentry/nextjs" dependency-type: direct:production update-type: version-update:semver-minor ... * Mp 3245 usehlsvaults hook (#541) * ✨ routing and pages for HLS * ✨ create hooks for fetching HLS vaults and Strategies * Share accounts (#539) * feat: do not redirect to wallet on portfolio page * fix: use connected wallet for AccountMenu * fix: fixed ghost AccountDetails * feat: created ShareBar and share functionality * fix: don’t show shareBar if no address is present * fix: stupid 'next/navigation' * tidy: format * fix: fixed tests * ✨ routing and pages for HLS (#538) * πŸ› use useAccountIds * fix: fixed the tests * fix: accountIds is now a suspense --------- * πŸ› fix build --------- * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * added hatched health masks (#552) * added hatched health masks * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * sneak: change filled to used * fix: fixed the foregroundColor on increase and my ocd * ♻️ refactor table (Farm) (#555) * ♻️ refactor table (Farm) * 🧽 clean up PR * 🧽 clean up PR * Build(deps): bump @babel/traverse from 7.21.2 to 7.23.2 (#554) Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.21.2 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... * fix: rename withdraw to unlend (#557) * Full refactor tables (#556) * πŸ“ˆ Improve structure generic Table component * ♻️ Update Borrow Table and overall structure of Table comp * ♻️ Update Lend table * ✨ add loading state for lend table * πŸ§ͺ Fix unit tests * ✨ Add available HLS Vaults page (#558) * Table updates (#559) * fix: adjusted table colors and hover interactions * fix: added actionButtons back and changed lend to APY * fix: build update * tidy: fixed the CircularProgress indicators on the loading modals * fix: relative import * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * Mp 3480 persist last trading pair (#578) * MP-3480: remove favourite asset and prepare localStore * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * MP-3480: persist trading pair * fix: updated according to feedback * fix: remove pair from Trading View header --------- --------- * v2.0.1 (#579) (#583) * Build(deps): bump @splinetool/runtime from 0.9.477 to 0.9.482 (#544) Bumps @splinetool/runtime from 0.9.477 to 0.9.482. --- updated-dependencies: - dependency-name: "@splinetool/runtime" dependency-type: direct:production update-type: version-update:semver-patch ... * Build(deps-dev): bump @types/node from 20.7.0 to 20.8.6 (#548) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.7.0 to 20.8.6. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... * Build(deps): bump @sentry/nextjs from 7.73.0 to 7.74.0 (#545) Bumps [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) from 7.73.0 to 7.74.0. - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/7.73.0...7.74.0) --- updated-dependencies: - dependency-name: "@sentry/nextjs" dependency-type: direct:production update-type: version-update:semver-minor ... * Mp 3245 usehlsvaults hook (#541) * ✨ routing and pages for HLS * ✨ create hooks for fetching HLS vaults and Strategies * Share accounts (#539) * feat: do not redirect to wallet on portfolio page * fix: use connected wallet for AccountMenu * fix: fixed ghost AccountDetails * feat: created ShareBar and share functionality * fix: don’t show shareBar if no address is present * fix: stupid 'next/navigation' * tidy: format * fix: fixed tests * ✨ routing and pages for HLS (#538) * πŸ› use useAccountIds * fix: fixed the tests * fix: accountIds is now a suspense --------- * πŸ› fix build --------- * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * added hatched health masks (#552) * added hatched health masks * Mp 2837 pre commit hook (#549) * MP-2837: added husys and lint-staged * MP-2837: enabled lint-staged * MP-2837: setup .prettierignore * MP-2837: setup .prettierignore * MP-3483: all Depo. Caps are now % filled (#551) * MP-3487: changed the copy of the bridging intro screen (#553) * MP-3482: replaced Max LTV with Max. Leverage (#550) * sneak: change filled to used * fix: fixed the foregroundColor on increase and my ocd * ♻️ refactor table (Farm) (#555) * ♻️ refactor table (Farm) * 🧽 clean up PR * 🧽 clean up PR * Build(deps): bump @babel/traverse from 7.21.2 to 7.23.2 (#554) Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.21.2 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... * fix: rename withdraw to unlend (#557) * Full refactor tables (#556) * πŸ“ˆ Improve structure generic Table component * ♻️ Update Borrow Table and overall structure of Table comp * ♻️ Update Lend table * ✨ add loading state for lend table * πŸ§ͺ Fix unit tests * ✨ Add available HLS Vaults page (#558) * Table updates (#559) * fix: adjusted table colors and hover interactions * fix: added actionButtons back and changed lend to APY * fix: build update * tidy: fixed the CircularProgress indicators on the loading modals * fix: relative import * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * Mp 3480 persist last trading pair (#578) * MP-3480: remove favourite asset and prepare localStore * env: updated shuttle, keplr and version (#566) * fix: fixed dust left when trying to buy max amount without leverage (#565) * feat: added squidrouter to the bridges (#561) * feat: added squidrouter to the bridges * fix: copy update * MP-3521: updated the APR calculation (#572) * Table fixes (#563) * fix: fixed the sorting of the tables * fix: added sorting functions * fix: farm sorting for deposit cap * fix: fixed Row types * Build(deps-dev): bump prettier-plugin-tailwindcss from 0.5.5 to 0.5.6 (#567) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.5.5 to 0.5.6. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.5.5...v0.5.6) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... * Build(deps): bump react-router-dom from 6.16.0 to 6.17.0 (#571) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.16.0 to 6.17.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.17.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... * ✨ HLS: Add info modal (#573) * MP-3484: remember summaryAccount tabs and auto expand both (#574) * User feedback (#575) * feat: added debt indicator and adjusted the borrowModal * fix: wallet interaction fix * Add usdc noble (#576) * env: added USDC.n * env: updated usdc noble variables * fix: fixed the pool on USDC for devnet purposes * πŸ› Fix initial status of chart (#577) * MP-3480: persist trading pair * fix: updated according to feedback * fix: remove pair from Trading View header --------- --------- * fix: fixed the asset select overflow --------- * fix: fixed the AccountDetails position * fix: update --------- Signed-off-by: dependabot[bot] Co-authored-by: Bob van der Helm <34470358+bobthebuidlr@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix: prevent permanent account updates by trade page (#587) * fix: keep the selected accountId if its present int the url (#588) * Link changelog (#589) * env: update RPC endpoint * feat: added changelog link to the footer version * Refactor balances table (#590) * env: update env.example after last sync * tidy: refactored AccountBalancesTable * fix: updated isCard to hideCard * fix: do update the health on sliding the margin back to 0 (#593) * fix: disable highlighting on non-expandable rows (#592) * Healthfactor adjustments (#594) * fix: do update the health on sliding the margin back to 0 * MP-3531: first updates on the health bars * fix: added exponential function for health percentage * fix: build fix * tidy: refactor * tidy: cleanup * feat: added new curve * fix: base set to 3.5 * env: version update * 🌟 Add HLS Vault Modal (#595) * 🌟 Add HLS Vault Modal * πŸ› οΈ Fix failing build * fix: keep the selected accountId if its present int the url (#588) * Link changelog (#589) * env: update RPC endpoint * feat: added changelog link to the footer version * Refactor balances table (#590) * env: update env.example after last sync * tidy: refactored AccountBalancesTable * fix: updated isCard to hideCard * fix: do update the health on sliding the margin back to 0 (#593) * fix: disable highlighting on non-expandable rows (#592) * Healthfactor adjustments (#594) * fix: do update the health on sliding the margin back to 0 * MP-3531: first updates on the health bars * fix: added exponential function for health percentage * fix: build fix * tidy: refactor * tidy: cleanup * feat: added new curve * fix: base set to 3.5 * env: version update * 🌟 Add HLS Vault Modal * Use `DisplayCurrency` in subtitle header * πŸ”₯Remove redundant component --------- Co-authored-by: Linkie Link * fix: if HF > 1 and health === 0, return health 1 (#601) * MP-3540: added liquidity warning (#605) * Oracle update button (#606) * feat: added a resync button to the header * fix: updated the text * fix: remove pulsing * fix: fixed the checkbox not being clickable after select (#608) * Mp 3360 create vault position (#607) * πŸ”§ Small fixes * ✨ Deposit into HLS Vault + Groudnwork for HLS Staking * Adjusted according to feedback * Adjusted according to feedback * Build(deps-dev): bump eslint-config-next from 13.5.4 to 14.0.0 (#599) Bumps [eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next) from 13.5.4 to 14.0.0. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/commits/v14.0.0/packages/eslint-config-next) --- updated-dependencies: - dependency-name: eslint-config-next dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps): bump recharts from 2.8.0 to 2.9.0 (#598) Bumps [recharts](https://github.com/recharts/recharts) from 2.8.0 to 2.9.0. - [Release notes](https://github.com/recharts/recharts/releases) - [Changelog](https://github.com/recharts/recharts/blob/master/CHANGELOG.md) - [Commits](https://github.com/recharts/recharts/compare/v2.8.0...v2.9.0) --- updated-dependencies: - dependency-name: recharts dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps-dev): bump @types/react from 18.2.28 to 18.2.33 (#596) Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.2.28 to 18.2.33. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react) --- updated-dependencies: - dependency-name: "@types/react" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps): bump crypto-js from 4.1.1 to 4.2.0 (#591) Bumps [crypto-js](https://github.com/brix/crypto-js) from 4.1.1 to 4.2.0. - [Commits](https://github.com/brix/crypto-js/compare/4.1.1...4.2.0) --- updated-dependencies: - dependency-name: crypto-js dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps-dev): bump @types/lodash.throttle from 4.1.7 to 4.1.8 (#569) Bumps [@types/lodash.throttle](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash.throttle) from 4.1.7 to 4.1.8. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/lodash.throttle) --- updated-dependencies: - dependency-name: "@types/lodash.throttle" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix: waiting for script to be ready (#609) * fix: show a loading state of the trading chart (#610) * fix: show a loading state of the trading chart * tidy: refactor * Feedback implementation (#611) * env: update wallet volnurabilities * fix: always render TradingChart container * fix: amounts can be a fraction of MIN_AMOUNT * feat: added clickaway handler * tidy: refactor * fix: size below 0.00001 is possible for BTC and WETH * fix: fixed tests * Mp 3367 staking interactions (#613) * ♻️ Refactor borrowRate to be in full numbers * ✨Enter into HLS Staking strategy * ✨HLS Staking deposited table + Portfolio pages * tidy: refactored the masks for HealthBar --------- Co-authored-by: Linkie Link * ✨Added dropdown button (#614) * ✨Add basic modal for HLS staking (#615) * Hls staking manage actions (#622) * ✨Add basic modal for HLS staking * ✨UI components for Manage * ✨All Manage actions (except change lev) * πŸ›hls intro icons + checkbox, hide repay when no debt, clickable dropdown * fix build * Pyth history feed (#623) * MP-3556: first PythDataFeed class * fix: fixed the timestamp * fix: fixed the chart data * fix: fixed the prices * fix: fixed the math and decimal scale * tidy: refactor * fix: update the pythFeedId * fix: updated OsmosisTheGraphDataFeed * fix: add a fallback for non pyth data * tidy: refactor * fix: adjusted to feedback * Tia and stosmo (#627) * feat: listed TIA and stOSMO * fix: fixed USDC * tidy: refactor the token logos * Hls leverage (#628) * ✨Add basic modal for HLS staking * ✨UI components for Manage * ✨All Manage actions (except change lev) * πŸ›hls intro icons + checkbox, hide repay when no debt, clickable dropdown * fix build * ✨finish all actiosn for HLS staking * πŸ›clean up tooltip props * tidy: updated the token logos (#629) * tidy: updated the token logos * feat: added dydx * hotfix: quickfix for Trade * fix: inverted the charts * fix: fixed the chart description * fix: assets * Build(deps): bump @keplr-wallet/cosmos from 0.12.39 to 0.12.42 (#634) Bumps @keplr-wallet/cosmos from 0.12.39 to 0.12.42. --- updated-dependencies: - dependency-name: "@keplr-wallet/cosmos" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Borrow Rate to APY (#632) * fix: changed Borrow Rate to Borrow Rate APY * fix: regarding feedback * Auto repay on trade (#631) * fix: fixed the trading chart load * fix: prevent wrapped checkboxes to be double clicked * fix: refactored funding account modal * fix: fixed modal classes * fix: adjusted width classes * fix: fixed updating states * tidy: format * fix: fixed the slider masks * fix: fixed the slider masks * listed: TIA and USDT * fix: fixed the slider initial position * env: version update * fix: fixed priceFeedIds * Hls latest (#637) * env: enable HLS * feat: added background and orb fading * tidy: updated the token logos (#629) * tidy: updated the token logos * feat: added dydx * fix: increase load spead of trading charts * feat: first version of the UI shift * Deployment for HLS testing * ✨ add APY to HLS staking * ✨ add APY account overview and summary * fix: fixed the intro component visibility * ✨ add warning messages HLS * fix: menu order * ✨ implement live APRs * auto-select first account, add no balance message * enable tabs for hls, fix net APY for deposit * fix button for hls, sorting apy and console warnings * disable feature flag HLS * fix slider * update routing --------- Co-authored-by: Linkie Link * Build(deps): bump postcss from 8.4.23 to 8.4.31 (#624) Bumps [postcss](https://github.com/postcss/postcss) from 8.4.23 to 8.4.31. - [Release notes](https://github.com/postcss/postcss/releases) - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss/compare/8.4.23...8.4.31) --- updated-dependencies: - dependency-name: postcss dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps): bump zustand from 4.4.3 to 4.4.6 (#621) Bumps [zustand](https://github.com/pmndrs/zustand) from 4.4.3 to 4.4.6. - [Release notes](https://github.com/pmndrs/zustand/releases) - [Commits](https://github.com/pmndrs/zustand/compare/v4.4.3...v4.4.6) --- updated-dependencies: - dependency-name: zustand dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps): bump @sentry/nextjs from 7.74.0 to 7.77.0 (#625) Bumps [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) from 7.74.0 to 7.77.0. - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/7.74.0...7.77.0) --- updated-dependencies: - dependency-name: "@sentry/nextjs" dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps-dev): bump @types/react-dom from 18.2.13 to 18.2.15 (#633) Bumps [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom) from 18.2.13 to 18.2.15. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom) --- updated-dependencies: - dependency-name: "@types/react-dom" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps-dev): bump eslint from 8.51.0 to 8.53.0 (#620) Bumps [eslint](https://github.com/eslint/eslint) from 8.51.0 to 8.53.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.51.0...v8.53.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps-dev): bump eslint-plugin-import from 2.28.1 to 2.29.0 (#617) Bumps [eslint-plugin-import](https://github.com/import-js/eslint-plugin-import) from 2.28.1 to 2.29.0. - [Release notes](https://github.com/import-js/eslint-plugin-import/releases) - [Changelog](https://github.com/import-js/eslint-plugin-import/blob/main/CHANGELOG.md) - [Commits](https://github.com/import-js/eslint-plugin-import/compare/v2.28.1...v2.29.0) --- updated-dependencies: - dependency-name: eslint-plugin-import dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * MP-3564: added navigation dropdown and Governance NavLink (#639) * MP-2887: added ICNS and ICP support (#638) * MP-2887: added ICNS and ICP support : * fix: removed unessecary package * Build(deps): bump recharts from 2.9.0 to 2.10.1 (#640) Bumps [recharts](https://github.com/recharts/recharts) from 2.9.0 to 2.10.1. - [Release notes](https://github.com/recharts/recharts/releases) - [Changelog](https://github.com/recharts/recharts/blob/master/CHANGELOG.md) - [Commits](https://github.com/recharts/recharts/compare/v2.9.0...v2.10.1) --- updated-dependencies: - dependency-name: recharts dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps-dev): bump eslint from 8.53.0 to 8.54.0 (#641) Bumps [eslint](https://github.com/eslint/eslint) from 8.53.0 to 8.54.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.53.0...v8.54.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps-dev): bump @types/react-helmet from 6.1.7 to 6.1.9 (#642) Bumps [@types/react-helmet](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-helmet) from 6.1.7 to 6.1.9. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-helmet) --- updated-dependencies: - dependency-name: "@types/react-helmet" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps-dev): bump @types/lodash.debounce from 4.0.7 to 4.0.9 (#643) Bumps [@types/lodash.debounce](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash.debounce) from 4.0.7 to 4.0.9. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/lodash.debounce) --- updated-dependencies: - dependency-name: "@types/lodash.debounce" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update HC for Margin trade and HLS (#645) * Update HC for Margin trade and HLS * fix relative imports * fix: added clickaway handler and fixed z-index issues (#646) * v2.0.6 and use feature flag for auto repay (#650) * πŸ›incorrect deposit cap utilization (#647) * Initialize perps (#648) * setup routing * add basic perps interface * small fix * feat: listed dydx and AKT (#652) * Deposit Cap and Utilization Fix (#654) * fix: fixed the deposit cap and total supplied / utilization rate * fix: fixed build * fix: fixed build * fix: avoid deposit cap usage over 100% * refactor market data apy/ltv * fix: fixed the withdraw from vaults modal * tidy: refactor --------- Co-authored-by: Bob van der Helm <34470358+bobthebuidlr@users.noreply.github.com> * stATOM and stOSMO TradingView support (#653) * feat: listed dydx and AKT * fix: removed theGraph support for now * ✨finish adding liquidation price (#649) * ✨finish adding liquidation price * fix minor issues * v2.0.6 and use feature flag for auto repay (#650) * πŸ›incorrect deposit cap utilization (#647) * Initialize perps (#648) * setup routing * add basic perps interface * small fix * feat: listed dydx and AKT (#652) * Deposit Cap and Utilization Fix (#654) * fix: fixed the deposit cap and total supplied / utilization rate * fix: fixed build * fix: fixed build * fix: avoid deposit cap usage over 100% * refactor market data apy/ltv * fix: fixed the withdraw from vaults modal * tidy: refactor --------- Co-authored-by: Bob van der Helm <34470358+bobthebuidlr@users.noreply.github.com> * stATOM and stOSMO TradingView support (#653) * feat: listed dydx and AKT * fix: removed theGraph support for now * adjust liq price loading and null/0 values --------- Co-authored-by: Linkie Link * Auto Lend Switch (#660) * refactor: moved the autolend logic to the switch * tidy: update default value * adjust logic of auto-lend for switch component --------- Co-authored-by: Bob van der Helm <34470358+bobthebuidlr@users.noreply.github.com> * temp: remove liquidation price (#661) * Revert "temp: remove liquidation price (#661)" (#663) This reverts commit 0cba668c82c264b8d6b1cb556e722fe1c7d1382e. * πŸ› fix liquidation price (#664) * Hls text fixes (#667) * πŸ› incorrect vault values calc * πŸ› incorrect message for no balance in wallet hls * πŸ› hls message on keep leverage * update to correct wasm files * update to correct wasm files * v2.1.0 (#669) * Repay from Wallet (#673) * feat: added repay from wallet * tidy: refactor * UX/UI finetuning (#672) * feat: added Buy/Sell token ratio to the TradingView header * fix: changed the order in the trading view description * feat: added minute timeframe to the chart * fix: changed WBTC to WBTC/USD pyth price feed * fix: adjusted HLS health curve * fix: made HLS accounts unselectable * copy: changed the APY range and Strategy text * tidy: fix the tables layout to be more readable * fix: change the precision of the Trading chart header * feat: added summary collapsable * fix: removed Debt Column for active HLS positions * fix: added Memo to TVChart * fix: adjust Trade page layout * tidy: refactor table meta * fix: DisplayCurrency is able to take options now * tidy: remove unneeded typesafety * fix: adjusted according feedback * env: enabled autoRepay and updated version * fix: auto-repay * fix: disable lend on auto repay on trade * tidy: refactor * feat: make USDC the standard secondary asset (for trade) (#681) * Add usePerpsMarket hook and adjust routing (#680) * Add usePerpsMarket hook and adjust routing * fix: enable 7 links in the header --------- Co-authored-by: Linkie Link * Liq price in balances (#679) * add liquidation price to balances table trade * add depositcap to HLS * fix: add width classes to the balances table, remove abbreviation, remove flicker * fix: fixed the account selection and added a tooltip * fix wasm file for debt liquidation price --------- Co-authored-by: Linkie Link * added sharp (#682) * env: added sharp * fix: use dvh over vh * add cache for asset params (#683) * Build(deps): bump @sentry/nextjs from 7.77.0 to 7.84.0 (#677) Bumps [@sentry/nextjs](https://github.com/getsentry/sentry-javascript) from 7.77.0 to 7.84.0. - [Release notes](https://github.com/getsentry/sentry-javascript/releases) - [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript/compare/7.77.0...7.84.0) --- updated-dependencies: - dependency-name: "@sentry/nextjs" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps): bump @splinetool/runtime from 0.9.482 to 0.9.516 (#676) Bumps @splinetool/runtime from 0.9.482 to 0.9.516. --- updated-dependencies: - dependency-name: "@splinetool/runtime" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps-dev): bump @types/react from 18.2.33 to 18.2.41 (#675) Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.2.33 to 18.2.41. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react) --- updated-dependencies: - dependency-name: "@types/react" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps): bump react-helmet-async from 1.3.0 to 2.0.3 (#674) Bumps [react-helmet-async](https://github.com/staylor/react-helmet-async) from 1.3.0 to 2.0.3. - [Release notes](https://github.com/staylor/react-helmet-async/releases) - [Commits](https://github.com/staylor/react-helmet-async/commits) --- updated-dependencies: - dependency-name: react-helmet-async dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps): bump @adobe/css-tools from 4.3.1 to 4.3.2 (#671) Bumps [@adobe/css-tools](https://github.com/adobe/css-tools) from 4.3.1 to 4.3.2. - [Changelog](https://github.com/adobe/css-tools/blob/main/History.md) - [Commits](https://github.com/adobe/css-tools/commits) --- updated-dependencies: - dependency-name: "@adobe/css-tools" dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps-dev): bump @types/debounce-promise from 3.1.7 to 3.1.9 (#659) Bumps [@types/debounce-promise](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/debounce-promise) from 3.1.7 to 3.1.9. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/debounce-promise) --- updated-dependencies: - dependency-name: "@types/debounce-promise" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Simple spot trading (#684) * env: added sharp * fix: use dvh over vh * feat: prepared the trade view for perps and spot * fix: adjusted heights for Trade * feat: added Navigation submenu * feat: added first interface itteration * feat: added logic * feat: added pairsList * feat: finished Trade Spot Simple * fix: fixed Sell button * fix: adjusted capLeft logic and added sorting util * fix: order of values * fix: fixed the autoLend switch to be deselectable * env: bump version * fix: changes according to feedback * fix: fixed naming * tidy: refactor * fix: set default stable to USDC.axl * Build(deps): bump @splinetool/runtime from 0.9.516 to 0.9.521 (#690) Bumps @splinetool/runtime from 0.9.516 to 0.9.521. --- updated-dependencies: - dependency-name: "@splinetool/runtime" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps-dev): bump eslint-config-next from 14.0.0 to 14.0.4 (#687) Bumps [eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next) from 14.0.0 to 14.0.4. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/commits/v14.0.4/packages/eslint-config-next) --- updated-dependencies: - dependency-name: eslint-config-next dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps-dev): bump @types/react-helmet from 6.1.9 to 6.1.11 (#688) Bumps [@types/react-helmet](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-helmet) from 6.1.9 to 6.1.11. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-helmet) --- updated-dependencies: - dependency-name: "@types/react-helmet" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build(deps-dev): bump lint-staged from 15.0.1 to 15.2.0 (#689) Bumps [lint-staged](https://github.com/okonet/lint-staged) from 15.0.1 to 15.2.0. - [Release notes](https://github.com/okonet/lint-staged/releases) - [Changelog](https://github.com/lint-staged/lint-staged/blob/master/CHANGELOG.md) - [Commits](https://github.com/okonet/lint-staged/compare/v15.0.1...v15.2.0) --- updated-dependencies: - dependency-name: lint-staged dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Bob van der Helm <34470358+bobthebuidlr@users.noreply.github.com> --- package.json | 19 +- src/api/cache.ts | 1 + src/api/params/getAssetParams.ts | 12 +- src/api/vaults/getDepositedVaults.ts | 4 +- .../AccountBalancesTable/Columns/Apy.tsx | 2 +- .../AccountBalancesTable/Columns/LiqPrice.tsx | 67 ++ .../AccountBalancesTable/Columns/Price.tsx | 26 + .../AccountBalancesTable/Columns/Size.tsx | 2 +- .../Columns/useAccountBalancesColumns.tsx | 47 +- .../Account/AccountBalancesTable/index.tsx | 17 +- src/components/Account/AccountCreateFirst.tsx | 7 +- src/components/Account/AccountList/index.tsx | 5 +- src/components/Account/AccountMenuContent.tsx | 6 +- src/components/Asset/AssetSymbol.tsx | 16 + src/components/DirectionSelect.tsx | 59 ++ src/components/Divider.tsx | 13 +- src/components/Earn/Tab.tsx | 5 +- .../HLS/Staking/Table/Columns/DepositCap.tsx | 6 +- .../Table/Columns/useAvailableColumns.tsx | 5 + .../Table/Columns/useDepositedColumns.tsx | 2 +- src/components/Header/DesktopHeader.tsx | 22 +- src/components/Icons/Coins.svg | 6 + src/components/Icons/CoinsSwap.svg | 8 + src/components/Icons/index.ts | 2 + .../Modals/Account/AccountDeleteModal.tsx | 20 +- .../Navigation/DesktopNavigation.tsx | 56 +- src/components/Navigation/NavLink.tsx | 32 +- src/components/Navigation/NavMenu.tsx | 80 +++ src/components/Perps/Module/PerpsModule.tsx | 6 +- .../Perps/Module/SelectLongShort.tsx | 62 -- src/components/Perps/PerpsInfo.tsx | 64 +- src/components/Portfolio/Account/Balances.tsx | 6 +- .../Portfolio/Account/BreadCrumbs.tsx | 5 +- src/components/Portfolio/Card/index.tsx | 10 +- src/components/Routes.tsx | 5 +- src/components/Switch/SwitchAutoLend.tsx | 7 +- src/components/Trade/AccountDetailsCard.tsx | 15 +- .../Trade/TradeChart/TVChartContainer.tsx | 4 +- src/components/Trade/TradeChart/index.tsx | 2 +- .../TradeModule/AssetSelector/AssetItem.tsx | 24 +- .../TradeModule/AssetSelector/AssetList.tsx | 41 +- .../AssetSelector/AssetOverlay.tsx | 134 +++- .../AssetSelector/AssetSelectorItem.tsx | 129 ++++ .../AssetSelector/AssetSelectorPair.tsx | 59 ++ .../{index.tsx => AssetSelectorSingle.tsx} | 23 +- .../TradeModule/AssetSelector/PairsList.tsx | 73 +++ .../TradeModule/SwapForm/MarginToggle.tsx | 2 +- .../TradeModule/SwapForm/TradeSummary.tsx | 30 +- .../Trade/TradeModule/SwapForm/index.tsx | 434 +++++++------ src/components/Trade/TradeModule/index.tsx | 11 +- .../Wallet/WalletConnectedButton.tsx | 9 +- .../Wallet/WalletFetchBalancesAndAccounts.tsx | 9 +- src/constants/assets.ts | 76 +-- src/constants/defaultSettings.ts | 3 +- src/constants/localStorageKeys.ts | 3 +- src/hooks/perps/usePerpsMarket.ts | 36 ++ src/hooks/useHealthComputer.tsx | 5 +- src/hooks/useLiquidationPrice.ts | 22 + src/pages/PerpsPage.tsx | 2 +- src/pages/PortfolioAccountPage.tsx | 5 +- src/pages/TradePage.tsx | 36 +- src/pages/_layout.tsx | 11 +- src/types/interfaces/asset.d.ts | 14 + .../interfaces/components/AssetOverlay.d.ts | 2 +- .../interfaces/components/Navigation.d.ts | 8 + src/types/interfaces/components/Trade.d.ts | 4 + src/types/interfaces/perps.d.ts | 2 +- src/types/interfaces/route.d.ts | 1 + src/types/interfaces/store/settings.d.ts | 3 +- src/utils/assets.ts | 43 ++ src/utils/health_computer/index.d.ts | 11 +- src/utils/health_computer/index.js | 5 +- src/utils/health_computer/index_bg.wasm | Bin 256048 -> 259447 bytes src/utils/health_computer/index_bg.wasm.d.ts | 2 +- src/utils/math.ts | 2 +- src/utils/messages.ts | 2 +- src/utils/route.ts | 15 +- tailwind.config.js | 5 + yarn.lock | 588 ++++++++++++------ 79 files changed, 1899 insertions(+), 718 deletions(-) create mode 100644 src/components/Account/AccountBalancesTable/Columns/LiqPrice.tsx create mode 100644 src/components/Account/AccountBalancesTable/Columns/Price.tsx create mode 100644 src/components/Asset/AssetSymbol.tsx create mode 100644 src/components/DirectionSelect.tsx create mode 100644 src/components/Icons/Coins.svg create mode 100644 src/components/Icons/CoinsSwap.svg create mode 100644 src/components/Navigation/NavMenu.tsx delete mode 100644 src/components/Perps/Module/SelectLongShort.tsx create mode 100644 src/components/Trade/TradeModule/AssetSelector/AssetSelectorItem.tsx create mode 100644 src/components/Trade/TradeModule/AssetSelector/AssetSelectorPair.tsx rename src/components/Trade/TradeModule/AssetSelector/{index.tsx => AssetSelectorSingle.tsx} (74%) create mode 100644 src/components/Trade/TradeModule/AssetSelector/PairsList.tsx create mode 100644 src/hooks/perps/usePerpsMarket.ts create mode 100644 src/hooks/useLiquidationPrice.ts create mode 100644 src/types/interfaces/components/Trade.d.ts diff --git a/package.json b/package.json index e311b9b7..a11c1059 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mars-v2-frontend", - "version": "2.1.1", + "version": "2.1.2", "private": true, "scripts": { "build": "yarn validate-env && next build", @@ -25,9 +25,9 @@ "@cosmjs/cosmwasm-stargate": "^0.31.1", "@delphi-labs/shuttle-react": "^3.10.0", "@keplr-wallet/cosmos": "^0.12.42", - "@sentry/nextjs": "^7.77.0", + "@sentry/nextjs": "^7.84.0", "@splinetool/react-spline": "^2.2.6", - "@splinetool/runtime": "^0.9.482", + "@splinetool/runtime": "^0.9.521", "@tailwindcss/container-queries": "^0.1.1", "@tanstack/react-table": "^8.10.6", "@tippyjs/react": "^4.2.6", @@ -43,13 +43,14 @@ "react-device-detect": "^2.2.3", "react-dom": "^18.2.0", "react-draggable": "^4.4.6", - "react-helmet-async": "^1.3.0", + "react-helmet-async": "^2.0.3", "react-qr-code": "^2.0.12", "react-router-dom": "^6.17.0", "react-spring": "^9.7.3", "react-toastify": "^9.1.3", "react-use-clipboard": "^1.0.9", "recharts": "^2.10.1", + "sharp": "^0.33.0", "swr": "^2.2.4", "tailwind-scrollbar-hide": "^1.1.7", "zustand": "^4.4.6" @@ -58,25 +59,25 @@ "@svgr/webpack": "^8.1.0", "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^14.0.0", - "@types/debounce-promise": "^3.1.7", + "@types/debounce-promise": "^3.1.9", "@types/lodash.debounce": "^4.0.9", "@types/lodash.throttle": "^4.1.8", "@types/node": "^20.8.6", - "@types/react": "18.2.33", + "@types/react": "18.2.41", "@types/react-dom": "18.2.15", - "@types/react-helmet": "^6.1.9", + "@types/react-helmet": "^6.1.11", "autoprefixer": "^10.4.16", "babel-jest": "^29.7.0", "dotenv": "^16.3.1", "dotenv-cli": "^7.3.0", "eslint": "^8.54.0", - "eslint-config-next": "^14.0.0", + "eslint-config-next": "^14.0.4", "eslint-plugin-import": "^2.29.0", "husky": "^8.0.3", "identity-obj-proxy": "^3.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", - "lint-staged": "^15.0.1", + "lint-staged": "^15.2.0", "prettier": "^3.0.3", "prettier-plugin-tailwindcss": "^0.5.6", "shelljs": "^0.8.5", diff --git a/src/api/cache.ts b/src/api/cache.ts index ccfc7743..3ce93c94 100644 --- a/src/api/cache.ts +++ b/src/api/cache.ts @@ -61,3 +61,4 @@ export const allParamsCache: Cache = new Map() export const underlyingDebtCache: Cache = new Map() export const previewDepositCache: Cache<{ vaultAddress: string; amount: string }> = new Map() export const stakingAprCache: Cache = new Map() +export const assetParamsCache: Cache = new Map() diff --git a/src/api/params/getAssetParams.ts b/src/api/params/getAssetParams.ts index e7228005..d42ceee2 100644 --- a/src/api/params/getAssetParams.ts +++ b/src/api/params/getAssetParams.ts @@ -1,11 +1,19 @@ +import { assetParamsCache, cacheFn } from 'api/cache' import { getParamsQueryClient } from 'api/cosmwasm-client' import { AssetParamsBaseForAddr } from 'types/generated/mars-params/MarsParams.types' import iterateContractQuery from 'utils/iterateContractQuery' export default async function getAssetParams(): Promise { try { - const paramsQueryClient = await getParamsQueryClient() - return iterateContractQuery(paramsQueryClient.allAssetParams) + return await cacheFn( + async () => { + const paramsQueryClient = await getParamsQueryClient() + return iterateContractQuery(paramsQueryClient.allAssetParams) + }, + assetParamsCache, + 'assetParams', + 600, + ) } catch (ex) { throw ex } diff --git a/src/api/vaults/getDepositedVaults.ts b/src/api/vaults/getDepositedVaults.ts index 6e42df32..189d4734 100644 --- a/src/api/vaults/getDepositedVaults.ts +++ b/src/api/vaults/getDepositedVaults.ts @@ -62,7 +62,7 @@ async function getVaultPositionStatusAndUnlockIdAndUnlockTime( } } -function flatVaultPositionAmount( +export function flatVaultPositionAmount( vaultPositionAmount: VaultPositionAmount, ): VaultPositionFlatAmounts { const amounts = { @@ -82,7 +82,7 @@ function flatVaultPositionAmount( return amounts } -async function getLpTokensForVaultPosition( +export async function getLpTokensForVaultPosition( vault: Vault, vaultPosition: VaultPosition, ): Promise { diff --git a/src/components/Account/AccountBalancesTable/Columns/Apy.tsx b/src/components/Account/AccountBalancesTable/Columns/Apy.tsx index 4de85ade..b210fd2d 100644 --- a/src/components/Account/AccountBalancesTable/Columns/Apy.tsx +++ b/src/components/Account/AccountBalancesTable/Columns/Apy.tsx @@ -1,7 +1,7 @@ import AssetRate from 'components/Asset/AssetRate' import { byDenom } from 'utils/array' -export const APY_META = { accessorKey: 'apy', header: 'APY' } +export const APY_META = { accessorKey: 'apy', header: 'APY', meta: { className: 'w-30' } } interface Props { apy: number diff --git a/src/components/Account/AccountBalancesTable/Columns/LiqPrice.tsx b/src/components/Account/AccountBalancesTable/Columns/LiqPrice.tsx new file mode 100644 index 00000000..f82bc914 --- /dev/null +++ b/src/components/Account/AccountBalancesTable/Columns/LiqPrice.tsx @@ -0,0 +1,67 @@ +import { useEffect, useMemo, useState } from 'react' + +import DisplayCurrency from 'components/DisplayCurrency' +import { InfoCircle } from 'components/Icons' +import Text from 'components/Text' +import { Tooltip } from 'components/Tooltip' +import useLiquidationPrice from 'hooks/useLiquidationPrice' +import { BNCoin } from 'types/classes/BNCoin' +import { LiquidationPriceKind } from 'utils/health_computer' +import { BN } from 'utils/helpers' + +export const LIQ_META = { + accessorKey: 'symbol', + header: 'Liquidation Price', + id: 'liqPrice', + meta: { className: 'w-40' }, +} + +interface Props { + amount: number + computeLiquidationPrice: (denom: string, kind: LiquidationPriceKind) => number | null + denom: string + type: 'deposits' | 'borrowing' | 'lending' | 'vault' + account: Account +} + +export default function LiqPrice(props: Props) { + const { denom, type, amount, account, computeLiquidationPrice } = props + const [lastLiquidationPrice, setLastLiquidationPrice] = useState(null) + const hasDebt = account.debts.length > 0 + + const liqPrice = useMemo(() => { + if (type === 'vault' || amount === 0) return 0 + return computeLiquidationPrice(denom, type === 'borrowing' ? 'debt' : 'asset') + }, [amount, computeLiquidationPrice, denom, type]) + + const { liquidationPrice } = useLiquidationPrice(liqPrice) + + useEffect(() => { + if (lastLiquidationPrice !== liqPrice && liqPrice !== null) setLastLiquidationPrice(liqPrice) + }, [liqPrice, lastLiquidationPrice]) + + const tooltipText = useMemo(() => { + if (type === 'vault') + return 'Liquidation prices cannot be calculated for farm positions. But it a drop in price of the underlying assets can still cause a liquidation.' + if (!hasDebt) return 'Your position cannot be liquidated as you currently have no debt.' + return 'The position size is too small to liquidate the account, even if the price goes to $0.00.' + }, [type, hasDebt]) + + if (!lastLiquidationPrice || (liquidationPrice === 0 && lastLiquidationPrice === 0)) + return ( + + N/A + + + + + ) + + return ( + + ) +} diff --git a/src/components/Account/AccountBalancesTable/Columns/Price.tsx b/src/components/Account/AccountBalancesTable/Columns/Price.tsx new file mode 100644 index 00000000..c45c9465 --- /dev/null +++ b/src/components/Account/AccountBalancesTable/Columns/Price.tsx @@ -0,0 +1,26 @@ +import DisplayCurrency from 'components/DisplayCurrency' +import usePrice from 'hooks/usePrice' +import { BNCoin } from 'types/classes/BNCoin' +import { BN } from 'utils/helpers' + +export const PRICE_META = { id: 'price', header: 'Price', meta: { className: 'w-30' } } + +interface Props { + amount: number + denom: string + type: 'deposits' | 'borrowing' | 'lending' | 'vault' +} + +export default function Price(props: Props) { + const price = usePrice(props.denom) + + if (props.amount === 0 || props.type === 'vault') return null + + return ( + + ) +} diff --git a/src/components/Account/AccountBalancesTable/Columns/Size.tsx b/src/components/Account/AccountBalancesTable/Columns/Size.tsx index ccb8fc24..00514636 100644 --- a/src/components/Account/AccountBalancesTable/Columns/Size.tsx +++ b/src/components/Account/AccountBalancesTable/Columns/Size.tsx @@ -6,7 +6,7 @@ import { FormattedNumber } from 'components/FormattedNumber' import { MAX_AMOUNT_DECIMALS, MIN_AMOUNT } from 'constants/math' import { formatAmountToPrecision } from 'utils/formatters' -export const SIZE_META = { accessorKey: 'size', header: 'Size' } +export const SIZE_META = { accessorKey: 'size', header: 'Size', meta: { className: 'w-40' } } interface Props { size: number diff --git a/src/components/Account/AccountBalancesTable/Columns/useAccountBalancesColumns.tsx b/src/components/Account/AccountBalancesTable/Columns/useAccountBalancesColumns.tsx index c8cfa9e3..e05cfcb8 100644 --- a/src/components/Account/AccountBalancesTable/Columns/useAccountBalancesColumns.tsx +++ b/src/components/Account/AccountBalancesTable/Columns/useAccountBalancesColumns.tsx @@ -1,8 +1,10 @@ -import { ColumnDef } from '@tanstack/react-table' +import { ColumnDef, Row } from '@tanstack/react-table' import { useMemo } from 'react' import Apy, { APY_META } from 'components/Account/AccountBalancesTable/Columns/Apy' import Asset, { ASSET_META } from 'components/Account/AccountBalancesTable/Columns/Asset' +import LiqPrice, { LIQ_META } from 'components/Account/AccountBalancesTable/Columns/LiqPrice' +import Price, { PRICE_META } from 'components/Account/AccountBalancesTable/Columns/Price' import Size, { SIZE_META, sizeSortingFn, @@ -11,10 +13,18 @@ import Value, { VALUE_META, valueSortingFn, } from 'components/Account/AccountBalancesTable/Columns/Value' +import useHealthComputer from 'hooks/useHealthComputer' import useMarketAssets from 'hooks/useMarketAssets' +import useStore from 'store' -export default function useAccountBalancesColumns() { +export default function useAccountBalancesColumns( + account: Account, + showLiquidationPrice?: boolean, +) { const { data: markets } = useMarketAssets() + const updatedAccount = useStore((s) => s.updatedAccount) + + const { computeLiquidationPrice } = useHealthComputer(updatedAccount ?? account) return useMemo[]>(() => { return [ @@ -46,6 +56,37 @@ export default function useAccountBalancesColumns() { ), sortingFn: sizeSortingFn, }, + ...(showLiquidationPrice + ? [ + { + ...PRICE_META, + cell: ({ row }: { row: Row }) => ( + + ), + }, + ] + : []), + ...(showLiquidationPrice + ? [ + { + ...LIQ_META, + enableSorting: false, + cell: ({ row }: { row: Row }) => ( + + ), + }, + ] + : []), { ...APY_META, cell: ({ row }) => ( @@ -58,5 +99,5 @@ export default function useAccountBalancesColumns() { ), }, ] - }, [markets]) + }, [computeLiquidationPrice, markets, showLiquidationPrice, account, updatedAccount]) } diff --git a/src/components/Account/AccountBalancesTable/index.tsx b/src/components/Account/AccountBalancesTable/index.tsx index 3edfba9c..591aadbc 100644 --- a/src/components/Account/AccountBalancesTable/index.tsx +++ b/src/components/Account/AccountBalancesTable/index.tsx @@ -1,5 +1,5 @@ import classNames from 'classnames' -import { useLocation, useNavigate } from 'react-router-dom' +import { useLocation, useNavigate, useSearchParams } from 'react-router-dom' import useAccountBalancesColumns from 'components/Account/AccountBalancesTable/Columns/useAccountBalancesColumns' import useAccountBalanceData from 'components/Account/AccountBalancesTable/useAccountBalanceData' @@ -19,10 +19,19 @@ interface Props { borrowingData: BorrowMarketTableData[] hideCard?: boolean tableBodyClassName?: string + showLiquidationPrice?: boolean } export default function AccountBalancesTable(props: Props) { - const { account, lendingData, borrowingData, tableBodyClassName, hideCard } = props + const [searchParams] = useSearchParams() + const { + account, + lendingData, + borrowingData, + tableBodyClassName, + hideCard, + showLiquidationPrice, + } = props const currentAccount = useCurrentAccount() const navigate = useNavigate() const { pathname } = useLocation() @@ -36,7 +45,7 @@ export default function AccountBalancesTable(props: Props) { isHls: props.isHls, }) - const columns = useAccountBalancesColumns() + const columns = useAccountBalancesColumns(account, showLiquidationPrice) if (accountBalanceData.length === 0) return ( @@ -55,7 +64,7 @@ export default function AccountBalancesTable(props: Props) { color='tertiary' onClick={() => { if (currentAccount?.id !== account.id) { - navigate(getRoute(getPage(pathname), address, account.id)) + navigate(getRoute(getPage(pathname), searchParams, address, account.id)) } useStore.setState({ focusComponent: { diff --git a/src/components/Account/AccountCreateFirst.tsx b/src/components/Account/AccountCreateFirst.tsx index 0c8c38d1..e2ea005e 100644 --- a/src/components/Account/AccountCreateFirst.tsx +++ b/src/components/Account/AccountCreateFirst.tsx @@ -1,5 +1,5 @@ import { useCallback, useEffect } from 'react' -import { useLocation, useNavigate } from 'react-router-dom' +import { useLocation, useNavigate, useSearchParams } from 'react-router-dom' import AccountFundFullPage from 'components/Account/AccountFund/AccountFundFullPage' import FullOverlayContent from 'components/FullOverlayContent' @@ -14,6 +14,7 @@ export default function AccountCreateFirst() { const address = useStore((s) => s.address) const createAccount = useStore((s) => s.createAccount) const [isCreating, setIsCreating] = useToggle(false) + const [searchParams] = useSearchParams() useEffect(() => { if (!address) useStore.setState({ focusComponent: { component: } }) @@ -24,7 +25,7 @@ export default function AccountCreateFirst() { const accountId = await createAccount('default') setIsCreating(false) if (accountId) { - navigate(getRoute(getPage(pathname), address, accountId)) + navigate(getRoute(getPage(pathname), searchParams, address, accountId)) useStore.setState({ focusComponent: { component: , @@ -34,7 +35,7 @@ export default function AccountCreateFirst() { }, }) } - }, [createAccount, navigate, pathname, address, setIsCreating]) + }, [setIsCreating, createAccount, navigate, pathname, searchParams, address]) return ( s.address) const { data: accountIds } = useAccountIds(address, true, true) + const [searchParams] = useSearchParams() useEffect(() => { if (!currentAccountId) return @@ -54,7 +55,7 @@ export default function AccountList(props: Props) { onClick={() => { if (isActive) return useStore.setState({ accountDeleteModal: null }) - navigate(getRoute(getPage(pathname), address, accountId)) + navigate(getRoute(getPage(pathname), searchParams, address, accountId)) }} title={
diff --git a/src/components/Account/AccountMenuContent.tsx b/src/components/Account/AccountMenuContent.tsx index ad63b4fe..8265ef55 100644 --- a/src/components/Account/AccountMenuContent.tsx +++ b/src/components/Account/AccountMenuContent.tsx @@ -1,6 +1,6 @@ import classNames from 'classnames' import { useCallback } from 'react' -import { useLocation, useNavigate } from 'react-router-dom' +import { useLocation, useNavigate, useSearchParams } from 'react-router-dom' import AccountCreateFirst from 'components/Account/AccountCreateFirst' import AccountFund from 'components/Account/AccountFund/AccountFundFullPage' @@ -33,6 +33,7 @@ export default function AccountMenuContent() { const address = useStore((s) => s.address) const { data: accountIds } = useAccountIds(address, true, true) const accountId = useAccountId() + const [searchParams] = useSearchParams() const createAccount = useStore((s) => s.createAccount) const baseCurrency = useStore((s) => s.baseCurrency) @@ -63,7 +64,7 @@ export default function AccountMenuContent() { setIsCreating(false) if (accountId) { - navigate(getRoute(getPage(pathname), address, accountId)) + navigate(getRoute(getPage(pathname), searchParams, address, accountId)) if (lendAssets) enableAutoLendAccountId(accountId) useStore.setState({ focusComponent: { @@ -80,6 +81,7 @@ export default function AccountMenuContent() { createAccount, navigate, pathname, + searchParams, address, lendAssets, enableAutoLendAccountId, diff --git a/src/components/Asset/AssetSymbol.tsx b/src/components/Asset/AssetSymbol.tsx new file mode 100644 index 00000000..becc4d71 --- /dev/null +++ b/src/components/Asset/AssetSymbol.tsx @@ -0,0 +1,16 @@ +import Text from 'components/Text' + +interface Props { + symbol: string +} +export default function AssetSymbol(props: Props) { + return ( + + {props.symbol} + + ) +} diff --git a/src/components/DirectionSelect.tsx b/src/components/DirectionSelect.tsx new file mode 100644 index 00000000..e94da6ed --- /dev/null +++ b/src/components/DirectionSelect.tsx @@ -0,0 +1,59 @@ +import classNames from 'classnames' + +import Text from 'components/Text' + +interface Props { + direction: OrderDirection + onChangeDirection: (direction: OrderDirection) => void + asset?: Asset +} + +export function DirectionSelect(props: Props) { + const hasAsset = props.asset + const directions: OrderDirection[] = hasAsset ? ['buy', 'sell'] : ['long', 'short'] + return ( +
+ props.onChangeDirection(directions[0])} + direction={directions[0]} + isActive={props.direction === directions[0]} + asset={props.asset} + /> + props.onChangeDirection(directions[1])} + direction={directions[1]} + isActive={props.direction === directions[1]} + asset={props.asset} + /> +
+ ) +} + +interface DirectionProps { + direction: 'long' | 'short' | 'buy' | 'sell' + isActive: boolean + onClick: () => void + asset?: Asset +} +function Direction(props: DirectionProps) { + const classString = props.direction === 'long' || props.direction === 'buy' ? 'success' : 'error' + return ( + + ) +} diff --git a/src/components/Divider.tsx b/src/components/Divider.tsx index efd9fcca..7ba94868 100644 --- a/src/components/Divider.tsx +++ b/src/components/Divider.tsx @@ -6,8 +6,13 @@ interface Props { } export default function Divider(props: Props) { - if (props.orientation === 'vertical') { - return
- } - return
+ return ( +
+ ) } diff --git a/src/components/Earn/Tab.tsx b/src/components/Earn/Tab.tsx index 1495c47c..d9431e34 100644 --- a/src/components/Earn/Tab.tsx +++ b/src/components/Earn/Tab.tsx @@ -1,5 +1,5 @@ import classNames from 'classnames' -import { NavLink, useParams } from 'react-router-dom' +import { NavLink, useParams, useSearchParams } from 'react-router-dom' import useAccountId from 'hooks/useAccountId' import { getRoute } from 'utils/route' @@ -15,13 +15,14 @@ interface Props { export default function Tab(props: Props) { const accountId = useAccountId() const { address } = useParams() + const [searchParams] = useSearchParams() return (
{props.tabs.map((tab, index) => ( +export default function DepositCap(props: Props) { + return } diff --git a/src/components/HLS/Staking/Table/Columns/useAvailableColumns.tsx b/src/components/HLS/Staking/Table/Columns/useAvailableColumns.tsx index fc2a6688..3c609012 100644 --- a/src/components/HLS/Staking/Table/Columns/useAvailableColumns.tsx +++ b/src/components/HLS/Staking/Table/Columns/useAvailableColumns.tsx @@ -6,6 +6,7 @@ import ApyRange, { APY_RANGE_META, apyRangeSortingFn, } from 'components/HLS/Staking/Table/Columns/ApyRange' +import DepositCap, { CAP_META } from 'components/HLS/Staking/Table/Columns/DepositCap' import MaxLeverage, { MAX_LEV_META } from 'components/HLS/Staking/Table/Columns/MaxLeverage' import MaxLTV, { LTV_MAX_META } from 'components/HLS/Staking/Table/Columns/MaxLTV' import Name, { NAME_META } from 'components/HLS/Staking/Table/Columns/Name' @@ -31,6 +32,10 @@ export default function useAvailableColumns(props: Props) { ), }, + { + ...CAP_META, + cell: ({ row }) => , + }, { ...APY_RANGE_META, cell: ({ row }) => ( diff --git a/src/components/HLS/Staking/Table/Columns/useDepositedColumns.tsx b/src/components/HLS/Staking/Table/Columns/useDepositedColumns.tsx index bf8b874b..5e58ec30 100644 --- a/src/components/HLS/Staking/Table/Columns/useDepositedColumns.tsx +++ b/src/components/HLS/Staking/Table/Columns/useDepositedColumns.tsx @@ -57,7 +57,7 @@ export default function useDepositedColumns(props: Props) { }, { ...CAP_META, - cell: ({ row }) => , + cell: ({ row }) => , sortingFn: depositCapSortingFn, }, { diff --git a/src/components/Header/DesktopHeader.tsx b/src/components/Header/DesktopHeader.tsx index 555d40c0..83771ef6 100644 --- a/src/components/Header/DesktopHeader.tsx +++ b/src/components/Header/DesktopHeader.tsx @@ -4,18 +4,36 @@ import { isDesktop } from 'react-device-detect' import AccountMenu from 'components/Account/AccountMenu' import EscButton from 'components/Button/EscButton' import OracleResyncButton from 'components/Header/OracleResyncButton' +import { Coins, CoinsSwap } from 'components/Icons' import DesktopNavigation from 'components/Navigation/DesktopNavigation' import RewardsCenter from 'components/RewardsCenter' import Settings from 'components/Settings' import Wallet from 'components/Wallet' import useAccountId from 'hooks/useAccountId' import useStore from 'store' -import { ENABLE_HLS, ENABLE_PERPS } from 'utils/constants' import { WalletID } from 'types/enums/wallet' +import { ENABLE_HLS, ENABLE_PERPS } from 'utils/constants' import { getGovernanceUrl } from 'utils/helpers' export const menuTree = (walletId: WalletID): MenuTreeEntry[] => [ - { pages: ['trade'], label: 'Trade' }, + { + pages: ['trade', 'trade-advanced'], + label: 'Trade', + submenu: [ + { + page: 'trade', + label: 'Spot', + subtitle: 'Trade assets against stables', + icon: , + }, + { + page: 'trade-advanced', + label: 'Spot Advanced', + subtitle: 'Trade any assets', + icon: , + }, + ], + }, ...(ENABLE_PERPS ? [{ pages: ['perps'] as Page[], label: 'Perps' }] : []), { pages: ['lend', 'farm'], label: 'Earn' }, { pages: ['borrow'], label: 'Borrow' }, diff --git a/src/components/Icons/Coins.svg b/src/components/Icons/Coins.svg new file mode 100644 index 00000000..0c43ca94 --- /dev/null +++ b/src/components/Icons/Coins.svg @@ -0,0 +1,6 @@ + + + diff --git a/src/components/Icons/CoinsSwap.svg b/src/components/Icons/CoinsSwap.svg new file mode 100644 index 00000000..088c0862 --- /dev/null +++ b/src/components/Icons/CoinsSwap.svg @@ -0,0 +1,8 @@ + + + diff --git a/src/components/Icons/index.ts b/src/components/Icons/index.ts index f078645d..fc2773f7 100644 --- a/src/components/Icons/index.ts +++ b/src/components/Icons/index.ts @@ -15,6 +15,8 @@ export { default as ChevronLeft } from 'components/Icons/ChevronLeft.svg' export { default as ChevronRight } from 'components/Icons/ChevronRight.svg' export { default as ChevronUp } from 'components/Icons/ChevronUp.svg' export { default as Circle } from 'components/Icons/Circle.svg' +export { default as Coins } from 'components/Icons/Coins.svg' +export { default as CoinsSwap } from 'components/Icons/CoinsSwap.svg' export { default as Compass } from 'components/Icons/Compass.svg' export { default as Copy } from 'components/Icons/Copy.svg' export { default as Cross } from 'components/Icons/Cross.svg' diff --git a/src/components/Modals/Account/AccountDeleteModal.tsx b/src/components/Modals/Account/AccountDeleteModal.tsx index 9d1f2168..13c6fd5a 100644 --- a/src/components/Modals/Account/AccountDeleteModal.tsx +++ b/src/components/Modals/Account/AccountDeleteModal.tsx @@ -1,5 +1,5 @@ import { useCallback, useMemo } from 'react' -import { useLocation, useNavigate, useParams } from 'react-router-dom' +import { useLocation, useNavigate, useParams, useSearchParams } from 'react-router-dom' import AssetBalanceRow from 'components/Asset/AssetBalanceRow' import { ArrowRight, ExclamationMarkCircled } from 'components/Icons' @@ -30,6 +30,7 @@ function AccountDeleteModal(props: Props) { const { pathname } = useLocation() const { address } = useParams() const { debts, vaults, id: accountId } = modal || {} + const [searchParams] = useSearchParams() const closeDeleteAccountModal = useCallback(() => { useStore.setState({ accountDeleteModal: null }) @@ -38,9 +39,18 @@ function AccountDeleteModal(props: Props) { const deleteAccountHandler = useCallback(() => { const options = { accountId: modal.id, lends: modal.lends } deleteAccount(options) - navigate(getRoute(getPage(pathname), address)) + navigate(getRoute(getPage(pathname), searchParams, address)) closeDeleteAccountModal() - }, [modal, deleteAccount, navigate, pathname, address, closeDeleteAccountModal]) + }, [ + modal.id, + modal.lends, + deleteAccount, + navigate, + pathname, + searchParams, + address, + closeDeleteAccountModal, + ]) const depositsAndLends = useMemo( () => combineBNCoins([...modal.deposits, ...modal.lends]), @@ -58,7 +68,7 @@ function AccountDeleteModal(props: Props) { text: 'Repay Debts', icon: , onClick: () => { - navigate(getRoute('borrow', address, accountId)) + navigate(getRoute('borrow', searchParams, address, accountId)) closeDeleteAccountModal() }, }} @@ -75,7 +85,7 @@ function AccountDeleteModal(props: Props) { text: 'Close Positions', icon: , onClick: () => { - navigate(getRoute('farm', address, accountId)) + navigate(getRoute('farm', searchParams, address, accountId)) closeDeleteAccountModal() }, }} diff --git a/src/components/Navigation/DesktopNavigation.tsx b/src/components/Navigation/DesktopNavigation.tsx index 859b1b80..73cd1a8a 100644 --- a/src/components/Navigation/DesktopNavigation.tsx +++ b/src/components/Navigation/DesktopNavigation.tsx @@ -6,28 +6,24 @@ import Button from 'components/Button' import { menuTree } from 'components/Header/DesktopHeader' import { ChevronDown, Logo } from 'components/Icons' import { NavLink } from 'components/Navigation/NavLink' -import useAccountId from 'hooks/useAccountId' +import { NavMenu } from 'components/Navigation/NavMenu' import useToggle from 'hooks/useToggle' import useStore from 'store' import { WalletID } from 'types/enums/wallet' -import { getRoute } from 'utils/route' + +export function getIsActive(pages: string[]) { + const segments = location.pathname.split('/') + return pages.some((page) => segments.includes(page)) +} export default function DesktopNavigation() { const [showMenu, setShowMenu] = useToggle() const { recentWallet } = useShuttle() const walletId = (recentWallet?.providerId as WalletID) ?? WalletID.Keplr - const address = useStore((s) => s.address) - const accountId = useAccountId() - const focusComponent = useStore((s) => s.focusComponent) const menu = useMemo(() => menuTree(walletId), [walletId]) - function getIsActive(pages: string[]) { - const segments = location.pathname.split('/') - return pages.some((page) => segments.includes(page)) - } - return (
- + {!focusComponent && ( -
- {menu.map((item, index) => ( - - ))} +
+ {menu.map((item, index) => + item.submenu ? ( + + ) : ( + + ), + )}
- ) -} - -const directionColors = { - long: 'text-success', - short: 'text-error', -} - -const borderColors = { - long: 'border-success', - short: 'border-error', -} diff --git a/src/components/Perps/PerpsInfo.tsx b/src/components/Perps/PerpsInfo.tsx index 13e9c4c4..ec93a67f 100644 --- a/src/components/Perps/PerpsInfo.tsx +++ b/src/components/Perps/PerpsInfo.tsx @@ -1,19 +1,52 @@ import React, { useMemo } from 'react' +import AssetSymbol from 'components/Asset/AssetSymbol' import Card from 'components/Card' +import DisplayCurrency from 'components/DisplayCurrency' import Divider from 'components/Divider' +import { FormattedNumber } from 'components/FormattedNumber' +import Loading from 'components/Loading' import Text from 'components/Text' +import usePerpsMarket from 'hooks/perps/usePerpsMarket' +import usePrice from 'hooks/usePrice' +import { BNCoin } from 'types/classes/BNCoin' export function PerpsInfo() { + const { data: market } = usePerpsMarket() + const assetPrice = usePrice(market?.asset.denom || '') + const items = useMemo( () => [ - $6,735, - Value} />, - Value} />, - Value} />, - Value} />, + ...(!assetPrice.isZero() + ? [] + : []), + } + />, + } + />, + + ) : ( + + ) + } + />, ], - [], + [assetPrice, market], ) return ( @@ -45,3 +78,22 @@ function InfoItem(props: InfoItemProps) {
) } + +interface InterestItemProps { + market: PerpsMarket | null + type: 'long' | 'short' +} +function InterestItem(props: InterestItemProps) { + if (!props.market) return + + return ( +
+ + +
+ ) +} diff --git a/src/components/Portfolio/Account/Balances.tsx b/src/components/Portfolio/Account/Balances.tsx index 755ec53c..07f11970 100644 --- a/src/components/Portfolio/Account/Balances.tsx +++ b/src/components/Portfolio/Account/Balances.tsx @@ -29,6 +29,7 @@ function Content(props: Props) { account={account} borrowingData={borrowAssets} lendingData={lendingAssets} + showLiquidationPrice hideCard /> @@ -55,7 +56,10 @@ function Skeleton(props: SkeletonProps) { {props.children ? ( props.children ) : ( - + )}
diff --git a/src/components/Portfolio/Account/BreadCrumbs.tsx b/src/components/Portfolio/Account/BreadCrumbs.tsx index 88d94e4d..db43314a 100644 --- a/src/components/Portfolio/Account/BreadCrumbs.tsx +++ b/src/components/Portfolio/Account/BreadCrumbs.tsx @@ -1,4 +1,4 @@ -import { NavLink, useParams } from 'react-router-dom' +import { NavLink, useParams, useSearchParams } from 'react-router-dom' import { ArrowRight } from 'components/Icons' import Text from 'components/Text' @@ -12,10 +12,11 @@ interface Props { export default function PortfolioAccountPageHeader(props: Props) { const { address } = useParams() const selectedAccountId = useAccountId() + const [searchParams] = useSearchParams() return (
- + Portfolio diff --git a/src/components/Portfolio/Card/index.tsx b/src/components/Portfolio/Card/index.tsx index f21d49a7..7a233b61 100644 --- a/src/components/Portfolio/Card/index.tsx +++ b/src/components/Portfolio/Card/index.tsx @@ -1,6 +1,6 @@ import classNames from 'classnames' import { ReactNode, useMemo } from 'react' -import { NavLink, useParams } from 'react-router-dom' +import { NavLink, useParams, useSearchParams } from 'react-router-dom' import { FormattedNumber } from 'components/FormattedNumber' import Loading from 'components/Loading' @@ -36,6 +36,7 @@ export default function PortfolioCard(props: Props) { const { allAssets: lendingAssets } = useLendingMarketAssetsTableData() const { data } = useBorrowMarketAssetsTableData(false) const { data: hlsStrategies } = useHLSStakingAssets() + const [searchParams] = useSearchParams() const borrowAssets = useMemo(() => data?.allAssets || [], [data]) const [reduceMotion] = useLocalStorage( @@ -111,7 +112,12 @@ export default function PortfolioCard(props: Props) { return ( } /> + } /> {ENABLE_PERPS && } />} } /> } /> @@ -36,6 +36,7 @@ export default function Routes() { } /> } /> + } /> {ENABLE_PERPS && } />} } /> } /> diff --git a/src/components/Switch/SwitchAutoLend.tsx b/src/components/Switch/SwitchAutoLend.tsx index 42254d53..7d711701 100644 --- a/src/components/Switch/SwitchAutoLend.tsx +++ b/src/components/Switch/SwitchAutoLend.tsx @@ -27,15 +27,12 @@ export default function SwitchAutoLend(props: Props) { return } - if (isAutoLendEnabled) { - setIsAutoLendEnabled(false) - disableAutoLend(accountId) - } + setIsAutoLendEnabled(false) + disableAutoLend(accountId) }, [ accountId, disableAutoLend, enableAutoLend, - isAutoLendEnabled, isAutoLendEnabledForAccount, setIsAutoLendEnabled, ]) diff --git a/src/components/Trade/AccountDetailsCard.tsx b/src/components/Trade/AccountDetailsCard.tsx index b091a11c..3f153243 100644 --- a/src/components/Trade/AccountDetailsCard.tsx +++ b/src/components/Trade/AccountDetailsCard.tsx @@ -18,11 +18,14 @@ export default function AccountDetailsCard() { if (account) return ( - +
+ +
) } diff --git a/src/components/Trade/TradeChart/TVChartContainer.tsx b/src/components/Trade/TradeChart/TVChartContainer.tsx index cd759137..e2ecea4c 100644 --- a/src/components/Trade/TradeChart/TVChartContainer.tsx +++ b/src/components/Trade/TradeChart/TVChartContainer.tsx @@ -5,8 +5,8 @@ import DisplayCurrency from 'components/DisplayCurrency' import { FormattedNumber } from 'components/FormattedNumber' import Loading from 'components/Loading' import Text from 'components/Text' -import { DataFeed, PAIR_SEPARATOR } from 'components/Trade/TradeChart/DataFeed' import { disabledFeatures, enabledFeatures, overrides } from 'components/Trade/TradeChart/constants' +import { DataFeed, PAIR_SEPARATOR } from 'components/Trade/TradeChart/DataFeed' import { BN_ZERO } from 'constants/math' import usePrices from 'hooks/usePrices' import useStore from 'store' @@ -156,7 +156,7 @@ export const TVChartContainer = (props: Props) => {
} contentClassName='px-0.5 pb-0.5 h-full' - className='min-h-[55vh]' + className='h-[70dvh] max-h-[980px] min-h-[560px]' >
diff --git a/src/components/Trade/TradeChart/index.tsx b/src/components/Trade/TradeChart/index.tsx index 237aa691..865133fb 100644 --- a/src/components/Trade/TradeChart/index.tsx +++ b/src/components/Trade/TradeChart/index.tsx @@ -45,7 +45,7 @@ export default function TradeChart(props: Props) {
} contentClassName='px-0.5 pb-0.5 h-full' - className='min-h-[55vh]' + className='h-[70dvh] max-h-[980px] min-h-[560px]' >
diff --git a/src/components/Trade/TradeModule/AssetSelector/AssetItem.tsx b/src/components/Trade/TradeModule/AssetSelector/AssetItem.tsx index a1723efe..b3aa58bc 100644 --- a/src/components/Trade/TradeModule/AssetSelector/AssetItem.tsx +++ b/src/components/Trade/TradeModule/AssetSelector/AssetItem.tsx @@ -1,4 +1,7 @@ +import { useMemo } from 'react' + import AssetImage from 'components/Asset/AssetImage' +import AssetSymbol from 'components/Asset/AssetSymbol' import DisplayCurrency from 'components/DisplayCurrency' import { FormattedNumber } from 'components/FormattedNumber' import { StarFilled, StarOutlined } from 'components/Icons' @@ -37,6 +40,13 @@ export default function AssetItem(props: Props) { setFavoriteAssetsDenoms(favoriteAssetsDenoms.filter((item: string) => item !== asset.denom)) } + const capLeft = useMemo(() => { + if (!props.depositCap) return 0 + const percent = props.depositCap.used.dividedBy(props.depositCap.max).multipliedBy(100) + const depositCapLeft = 100 - Math.min(percent.toNumber(), 100) + return depositCapLeft + }, [props.depositCap]) + return (
  • {props.balances.length > 0 && (
    @@ -81,12 +89,16 @@ export default function AssetItem(props: Props) { )}
    )} - {props.depositCap && ( + {props.depositCap && capLeft <= 15 && (
    Cap Left:
    )} diff --git a/src/components/Trade/TradeModule/AssetSelector/AssetList.tsx b/src/components/Trade/TradeModule/AssetSelector/AssetList.tsx index 36d0661c..27675f15 100644 --- a/src/components/Trade/TradeModule/AssetSelector/AssetList.tsx +++ b/src/components/Trade/TradeModule/AssetSelector/AssetList.tsx @@ -3,54 +3,67 @@ import { useMemo } from 'react' import { ChevronDown } from 'components/Icons' import Text from 'components/Text' -import AssetItem from 'components/Trade/TradeModule/AssetSelector/AssetItem' +import { ASSETS } from 'constants/assets' import useCurrentAccount from 'hooks/useCurrentAccount' import useMarketAssets from 'hooks/useMarketAssets' +import useMarketDeposits from 'hooks/useMarketDeposits' +import usePrices from 'hooks/usePrices' import { getMergedBalancesForAsset } from 'utils/accounts' import { byDenom } from 'utils/array' -import { getEnabledMarketAssets } from 'utils/assets' +import { getEnabledMarketAssets, sortAssetsOrPairs } from 'utils/assets' +import AssetSelectorItem from 'components/Trade/TradeModule/AssetSelector/AssetSelectorItem' interface Props { type: 'buy' | 'sell' assets: Asset[] isOpen: boolean toggleOpen: () => void - onChangeAsset: (asset: Asset) => void + onChangeAsset: (asset: Asset | AssetPair) => void } +const baseDenom = ASSETS[0].denom + export default function AssetList(props: Props) { + const { assets, type, isOpen, toggleOpen, onChangeAsset } = props const account = useCurrentAccount() const { data: marketAssets } = useMarketAssets() + const { data: marketDeposits } = useMarketDeposits() + const { data: prices } = usePrices() const balances = useMemo(() => { if (!account) return [] return getMergedBalancesForAsset(account, getEnabledMarketAssets()) }, [account]) + const sortedAssets = useMemo( + () => sortAssetsOrPairs(assets, prices, marketDeposits, balances, baseDenom) as Asset[], + [balances, prices, assets, marketDeposits], + ) + return (
    - {props.isOpen && - (props.assets.length === 0 ? ( + {isOpen && + (sortedAssets.length === 0 ? ( No available assets found ) : (
      - {props.assets.map((asset) => ( - ( + ))}
    diff --git a/src/components/Trade/TradeModule/AssetSelector/AssetOverlay.tsx b/src/components/Trade/TradeModule/AssetSelector/AssetOverlay.tsx index 30dbaeed..06267405 100644 --- a/src/components/Trade/TradeModule/AssetSelector/AssetOverlay.tsx +++ b/src/components/Trade/TradeModule/AssetSelector/AssetOverlay.tsx @@ -1,34 +1,77 @@ -import { useCallback, useMemo } from 'react' +import { useCallback, useMemo, useState } from 'react' +import Button from 'components/Button' import EscButton from 'components/Button/EscButton' import Divider from 'components/Divider' import Overlay from 'components/Overlay' import SearchBar from 'components/SearchBar' import Text from 'components/Text' import AssetList from 'components/Trade/TradeModule/AssetSelector/AssetList' +import PairsList from 'components/Trade/TradeModule/AssetSelector/PairsList' import useFilteredAssets from 'hooks/useFilteredAssets' +import { getAllAssets } from 'utils/assets' interface Props { state: OverlayState buyAsset: Asset sellAsset: Asset - onChangeBuyAsset: (asset: Asset) => void - onChangeSellAsset: (asset: Asset) => void + onChangeBuyAsset?: (asset: Asset) => void + onChangeSellAsset?: (asset: Asset) => void + onChangeTradingPair?: (tradingPair: TradingPair) => void onChangeState: (state: OverlayState) => void } -export default function AssetOverlay(props: Props) { - const { assets, searchString, onChangeSearch } = useFilteredAssets() - const handleClose = useCallback(() => props.onChangeState('closed'), [props]) +interface StablesFilterProps { + stables: Asset[] + selectedStables: Asset[] + onFilter: (stables: Asset[]) => void +} - const handleToggle = useCallback( - () => props.onChangeState(props.state === 'buy' ? 'sell' : 'buy'), - [props], +function StablesFilter(props: StablesFilterProps) { + const { stables, selectedStables, onFilter } = props + const isAllSelected = selectedStables.length > 1 + return ( + <> + +
    +
    + ) +} + +export default function AssetOverlay(props: Props) { + const isPairSelector = !!props.onChangeTradingPair + const { assets, searchString, onChangeSearch } = useFilteredAssets() + const allAssets = getAllAssets() + const stableAssets = useMemo(() => allAssets.filter((asset) => asset.isStable), [allAssets]) + const handleClose = useCallback(() => props.onChangeState('closed'), [props]) + const handleToggle = useCallback(() => props.onChangeState(props.state), [props]) + const [selectedStables, setSelectedStables] = useState([stableAssets[0]]) const buyAssets = useMemo( - () => assets.filter((asset) => asset.denom !== props.sellAsset.denom), - [assets, props.sellAsset], + () => + isPairSelector ? assets : assets.filter((asset) => asset.denom !== props.sellAsset.denom), + [assets, props.sellAsset, isPairSelector], ) const sellAssets = useMemo( @@ -36,14 +79,26 @@ export default function AssetOverlay(props: Props) { [assets, props.buyAsset], ) - function onChangeBuyAsset(asset: Asset) { - props.onChangeBuyAsset(asset) + function onChangeBuyAsset(asset: AssetPair | Asset) { + const selectedAsset = asset as Asset + if (!props.onChangeBuyAsset) return + props.onChangeBuyAsset(selectedAsset) props.onChangeState('sell') onChangeSearch('') } - function onChangeSellAsset(asset: Asset) { - props.onChangeSellAsset(asset) + function onChangeSellAsset(asset: AssetPair | Asset) { + const selectedAsset = asset as Asset + if (!props.onChangeSellAsset) return + props.onChangeSellAsset(selectedAsset) + onChangeSearch('') + } + + function onChangeAssetPair(assetPair: AssetPair | Asset) { + const selectedPair = assetPair as AssetPair + if (!props.onChangeTradingPair) return + props.onChangeTradingPair({ buy: selectedPair.buy.denom, sell: selectedPair.sell.denom }) + props.onChangeState('closed') onChangeSearch('') } @@ -54,9 +109,16 @@ export default function AssetOverlay(props: Props) { setShow={handleClose} >
    - Select asset + {isPairSelector ? 'Select a market' : 'Select asset'}
    + {isPairSelector && ( + + )}
    - - + {isPairSelector ? ( + + ) : ( + <> + + + + )} ) } diff --git a/src/components/Trade/TradeModule/AssetSelector/AssetSelectorItem.tsx b/src/components/Trade/TradeModule/AssetSelector/AssetSelectorItem.tsx new file mode 100644 index 00000000..bf9a0b0a --- /dev/null +++ b/src/components/Trade/TradeModule/AssetSelector/AssetSelectorItem.tsx @@ -0,0 +1,129 @@ +import { useMemo } from 'react' + +import AssetImage from 'components/Asset/AssetImage' +import AssetSymbol from 'components/Asset/AssetSymbol' +import DisplayCurrency from 'components/DisplayCurrency' +import { FormattedNumber } from 'components/FormattedNumber' +import { StarFilled, StarOutlined } from 'components/Icons' +import Text from 'components/Text' +import { LocalStorageKeys } from 'constants/localStorageKeys' +import { BN_ONE, BN_ZERO, MAX_AMOUNT_DECIMALS, MIN_AMOUNT } from 'constants/math' +import useLocalStorage from 'hooks/useLocalStorage' +import { BNCoin } from 'types/classes/BNCoin' +import { byDenom } from 'utils/array' +import { demagnify, formatAmountToPrecision } from 'utils/formatters' + +interface Props { + asset: Asset + sellAsset?: Asset + balances: BNCoin[] + onSelect: (selected: Asset | AssetPair) => void + depositCap?: DepositCap +} +export default function AssetSelectorItem(props: Props) { + const { asset, sellAsset, balances, onSelect, depositCap } = props + + const amount = demagnify(props.balances.find(byDenom(asset.denom))?.amount ?? BN_ZERO, asset) + + const [favoriteAssetsDenoms, setFavoriteAssetsDenoms] = useLocalStorage( + LocalStorageKeys.FAVORITE_ASSETS, + [], + ) + + function handleToggleFavorite(event: React.MouseEvent) { + event.stopPropagation() + + if (!favoriteAssetsDenoms.includes(asset.denom)) { + setFavoriteAssetsDenoms([...favoriteAssetsDenoms, asset.denom]) + return + } + setFavoriteAssetsDenoms(favoriteAssetsDenoms.filter((item: string) => item !== asset.denom)) + } + const formattedAmount = formatAmountToPrecision(amount, MAX_AMOUNT_DECIMALS) + const lowAmount = formattedAmount === 0 ? 0 : Math.max(formattedAmount, MIN_AMOUNT) + + const capLeft = useMemo(() => { + if (!props.depositCap) return 0 + const percent = props.depositCap.used.dividedBy(props.depositCap.max).multipliedBy(100) + const depositCapLeft = 100 - Math.min(percent.toNumber(), 100) + return depositCapLeft + }, [props.depositCap]) + + return ( +
  • + +
  • + ) +} diff --git a/src/components/Trade/TradeModule/AssetSelector/AssetSelectorPair.tsx b/src/components/Trade/TradeModule/AssetSelector/AssetSelectorPair.tsx new file mode 100644 index 00000000..77bcc6e2 --- /dev/null +++ b/src/components/Trade/TradeModule/AssetSelector/AssetSelectorPair.tsx @@ -0,0 +1,59 @@ +import { useCallback } from 'react' + +import Button from 'components/Button' +import { ChevronDown } from 'components/Icons' +import Text from 'components/Text' +import AssetOverlay from 'components/Trade/TradeModule/AssetSelector/AssetOverlay' +import { DEFAULT_SETTINGS } from 'constants/defaultSettings' +import { LocalStorageKeys } from 'constants/localStorageKeys' +import useLocalStorage from 'hooks/useLocalStorage' +import useStore from 'store' + +interface Props { + buyAsset: Asset + sellAsset: Asset +} + +export default function AssetSelectorPair(props: Props) { + const [tradingPairSimple, setTradingPairSimple] = useLocalStorage( + LocalStorageKeys.TRADING_PAIR_SIMPLE, + DEFAULT_SETTINGS.tradingPairSimple, + ) + const { buyAsset, sellAsset } = props + const assetOverlayState = useStore((s) => s.assetOverlayState) + + const onChangeTradingPair = useCallback( + (tradingPair: TradingPair) => { + console.log(tradingPair.buy, tradingPair.sell) + setTradingPairSimple(tradingPair) + }, + [setTradingPairSimple], + ) + + const handleChangeState = useCallback((state: OverlayState) => { + useStore.setState({ assetOverlayState: state }) + }, []) + + return ( +
    + + {buyAsset.symbol}/{sellAsset.symbol} + +
    + ) +} diff --git a/src/components/Trade/TradeModule/AssetSelector/index.tsx b/src/components/Trade/TradeModule/AssetSelector/AssetSelectorSingle.tsx similarity index 74% rename from src/components/Trade/TradeModule/AssetSelector/index.tsx rename to src/components/Trade/TradeModule/AssetSelector/AssetSelectorSingle.tsx index ec2ebcc9..89b3aa1a 100644 --- a/src/components/Trade/TradeModule/AssetSelector/index.tsx +++ b/src/components/Trade/TradeModule/AssetSelector/AssetSelectorSingle.tsx @@ -14,32 +14,31 @@ interface Props { sellAsset: Asset } -export default function AssetSelector(props: Props) { - const [tradingPair, setTradingPair] = useLocalStorage( - LocalStorageKeys.TRADING_PAIR, - DEFAULT_SETTINGS.tradingPair, - ) +export default function AssetSelectorSingle(props: Props) { + const [tradingPairAdvanced, settradingPairAdvanced] = useLocalStorage< + Settings['tradingPairAdvanced'] + >(LocalStorageKeys.TRADING_PAIR_ADVANCED, DEFAULT_SETTINGS.tradingPairAdvanced) const { buyAsset, sellAsset } = props const assetOverlayState = useStore((s) => s.assetOverlayState) const handleSwapAssets = useCallback(() => { - setTradingPair({ buy: sellAsset.denom, sell: buyAsset.denom }) - }, [setTradingPair, sellAsset, buyAsset]) + settradingPairAdvanced({ buy: sellAsset.denom, sell: buyAsset.denom }) + }, [settradingPairAdvanced, sellAsset, buyAsset]) const handleChangeBuyAsset = useCallback( (asset: Asset) => { - setTradingPair({ buy: asset.denom, sell: sellAsset.denom }) + settradingPairAdvanced({ buy: asset.denom, sell: sellAsset.denom }) useStore.setState({ assetOverlayState: 'sell' }) }, - [setTradingPair, sellAsset], + [settradingPairAdvanced, sellAsset], ) const handleChangeSellAsset = useCallback( (asset: Asset) => { - setTradingPair({ buy: buyAsset.denom, sell: asset.denom }) + settradingPairAdvanced({ buy: buyAsset.denom, sell: asset.denom }) useStore.setState({ assetOverlayState: 'closed' }) }, - [setTradingPair, buyAsset], + [settradingPairAdvanced, buyAsset], ) const handleChangeState = useCallback((state: OverlayState) => { @@ -47,7 +46,7 @@ export default function AssetSelector(props: Props) { }, []) return ( -
    +
    Buy Sell diff --git a/src/components/Trade/TradeModule/AssetSelector/PairsList.tsx b/src/components/Trade/TradeModule/AssetSelector/PairsList.tsx new file mode 100644 index 00000000..301fb243 --- /dev/null +++ b/src/components/Trade/TradeModule/AssetSelector/PairsList.tsx @@ -0,0 +1,73 @@ +import { useMemo } from 'react' + +import Text from 'components/Text' +import AssetSelectorItem from 'components/Trade/TradeModule/AssetSelector/AssetSelectorItem' +import { ASSETS } from 'constants/assets' +import useCurrentAccount from 'hooks/useCurrentAccount' +import useMarketAssets from 'hooks/useMarketAssets' +import useMarketDeposits from 'hooks/useMarketDeposits' +import usePrices from 'hooks/usePrices' +import { getMergedBalancesForAsset } from 'utils/accounts' +import { byDenom } from 'utils/array' +import { getEnabledMarketAssets, sortAssetsOrPairs } from 'utils/assets' + +interface Props { + assets: Asset[] + stables: Asset[] + isOpen: boolean + toggleOpen: () => void + onChangeAssetPair: (assetPair: AssetPair | Asset) => void +} + +const baseDenom = ASSETS[0].denom + +export default function PairsList(props: Props) { + const account = useCurrentAccount() + const { data: marketAssets } = useMarketAssets() + const { data: marketDeposits } = useMarketDeposits() + const { data: prices } = usePrices() + const balances = useMemo(() => { + if (!account) return [] + return getMergedBalancesForAsset(account, getEnabledMarketAssets()) + }, [account]) + + const pairs = useMemo(() => { + const tradingPairs: AssetPair[] = [] + props.stables.forEach((stable) => { + props.assets.forEach((buyAsset) => { + if (buyAsset.denom === stable.denom) return + tradingPairs.push({ buy: buyAsset, sell: stable }) + }) + }) + return tradingPairs + }, [props.stables, props.assets]) + + const sortedPairs = useMemo( + () => sortAssetsOrPairs(pairs, prices, marketDeposits, balances, baseDenom) as AssetPair[], + [balances, prices, pairs, marketDeposits], + ) + + return ( +
    + {props.isOpen && + (props.assets.length === 0 ? ( + + No available assets found + + ) : ( +
      + {sortedPairs.map((assetPair) => ( + + ))} +
    + ))} +
    + ) +} diff --git a/src/components/Trade/TradeModule/SwapForm/MarginToggle.tsx b/src/components/Trade/TradeModule/SwapForm/MarginToggle.tsx index b1c17f19..4580ea3b 100644 --- a/src/components/Trade/TradeModule/SwapForm/MarginToggle.tsx +++ b/src/components/Trade/TradeModule/SwapForm/MarginToggle.tsx @@ -12,7 +12,7 @@ interface Props { export default function MarginToggle(props: Props) { return ( -
    +
    Margin (LocalStorageKeys.SLIPPAGE, DEFAULT_SETTINGS.slippage) const sellAssetPrice = usePrice(sellAsset.denom) const swapFee = useSwapFee(route.map((r) => r.pool_id)) const [showSummary, setShowSummary] = useToggle() - const [liquidationPrice, setLiquidationPrice] = useState(null) - const [isUpdatingLiquidationPrice, setIsUpdatingLiquidationPrice] = useState(false) - const debouncedSetLiqPrice = useMemo( - () => debounce(setLiquidationPrice, 1000, { leading: false }), - [], + const { liquidationPrice, isUpdatingLiquidationPrice } = useLiquidationPrice( + props.liquidationPrice, ) const minReceive = useMemo(() => { return buyAmount.times(1 - swapFee).times(1 - slippage) }, [buyAmount, slippage, swapFee]) - useEffect(() => { - setIsUpdatingLiquidationPrice(true) - debouncedSetLiqPrice(props.liquidationPrice) - }, [debouncedSetLiqPrice, props.liquidationPrice]) - - useEffect(() => setIsUpdatingLiquidationPrice(false), [liquidationPrice]) - const swapFeeValue = useMemo(() => { return sellAssetPrice.times(swapFee).times(sellAmount) }, [sellAmount, sellAssetPrice, swapFee]) @@ -90,10 +84,10 @@ export default function TradeSummary(props: Props) { return routeSymbols.join(' -> ') }, [route, sellAsset.symbol]) - const buttonText = useMemo( - () => (route.length ? `Buy ${buyAsset.symbol}` : 'No route found'), - [buyAsset.symbol, route], - ) + const buttonText = useMemo(() => { + if (!isAdvanced && direction === 'sell') return `Sell ${sellAsset.symbol}` + return route.length ? `Buy ${buyAsset.symbol}` : 'No route found' + }, [buyAsset.symbol, route, sellAsset.symbol, isAdvanced, direction]) return (
    s.useMargin) const useAutoRepay = useStore((s) => s.useAutoRepay) const account = useCurrentAccount() const swap = useStore((s) => s.swap) const [slippage] = useLocalStorage(LocalStorageKeys.SLIPPAGE, DEFAULT_SETTINGS.slippage) const { computeMaxSwapAmount } = useHealthComputer(account) + const [orderDirection, setOrderDirection] = useState('buy') const { data: borrowAssets } = useMarketBorrowings() const { data: marketAssets } = useMarketAssets() - const { data: route, isLoading: isRouteLoading } = useSwapRoute(sellAsset.denom, buyAsset.denom) - const isBorrowEnabled = !!marketAssets.find(byDenom(sellAsset.denom))?.borrowEnabled - const isRepayable = !!account?.debts.find(byDenom(buyAsset.denom)) + const [inputAsset, outputAsset] = useMemo(() => { + if (isAdvanced) return [sellAsset, buyAsset] + if (orderDirection === 'buy') return [sellAsset, buyAsset] + return [buyAsset, sellAsset] + }, [buyAsset, sellAsset, orderDirection, isAdvanced]) + const { data: route, isLoading: isRouteLoading } = useSwapRoute( + inputAsset.denom, + outputAsset.denom, + ) + const isBorrowEnabled = !!marketAssets.find(byDenom(inputAsset.denom))?.borrowEnabled + const isRepayable = !!account?.debts.find(byDenom(outputAsset.denom)) const [isMarginChecked, setMarginChecked] = useToggle(isBorrowEnabled ? useMargin : false) const [isAutoRepayChecked, setAutoRepayChecked] = useToggle( isRepayable && ENABLE_AUTO_REPAY ? useAutoRepay : false, ) - const [buyAssetAmount, setBuyAssetAmount] = useState(BN_ZERO) - const [sellAssetAmount, setSellAssetAmount] = useState(BN_ZERO) - const [maxBuyableAmountEstimation, setMaxBuyableAmountEstimation] = useState(BN_ZERO) + const [outputAssetAmount, setOutputAssetAmount] = useState(BN_ZERO) + const [inputAssetAmount, setInputAssetAmount] = useState(BN_ZERO) + const [maxOutputAmountEstimation, setMaxBuyableAmountEstimation] = useState(BN_ZERO) const [selectedOrderType, setSelectedOrderType] = useState('Market') const [isConfirming, setIsConfirming] = useToggle() const [estimatedFee, setEstimatedFee] = useState(defaultFee) @@ -66,117 +81,107 @@ export default function SwapForm(props: Props) { const throttledEstimateExactIn = useMemo(() => asyncThrottle(estimateExactIn, 250), []) const { computeLiquidationPrice } = useHealthComputer(updatedAccount) - const borrowAsset = useMemo( - () => borrowAssets.find(byDenom(sellAsset.denom)), - [borrowAssets, sellAsset.denom], - ) - const depositCapReachedCoins: BNCoin[] = useMemo(() => { - const buyMarketAsset = marketAssets.find(byDenom(buyAsset.denom)) + const outputMarketAsset = marketAssets.find(byDenom(outputAsset.denom)) - if (!buyMarketAsset) return [] + if (!outputMarketAsset) return [] - const depositCapLeft = getCapLeftWithBuffer(buyMarketAsset.cap) - if (buyAssetAmount.isGreaterThan(depositCapLeft)) { - return [BNCoin.fromDenomAndBigNumber(buyAsset.denom, depositCapLeft)] + const depositCapLeft = getCapLeftWithBuffer(outputMarketAsset.cap) + if (outputAssetAmount.isGreaterThan(depositCapLeft)) { + return [BNCoin.fromDenomAndBigNumber(outputAsset.denom, depositCapLeft)] } return [] - }, [marketAssets, buyAsset.denom, buyAssetAmount]) + }, [marketAssets, outputAsset.denom, outputAssetAmount]) - const onChangeSellAmount = useCallback( + const onChangeInputAmount = useCallback( (amount: BigNumber) => { - setSellAssetAmount(amount) - throttledEstimateExactIn( - { denom: sellAsset.denom, amount: amount.toString() }, - buyAsset.denom, - ).then(setBuyAssetAmount) + setInputAssetAmount(amount) + const swapTo = { denom: inputAsset.denom, amount: amount.toString() } + throttledEstimateExactIn(swapTo, outputAsset.denom).then(setOutputAssetAmount) }, - [sellAsset.denom, throttledEstimateExactIn, buyAsset.denom], + [inputAsset.denom, throttledEstimateExactIn, outputAsset.denom], ) - const onChangeBuyAmount = useCallback( + const onChangeOutputAmount = useCallback( (amount: BigNumber) => { - setBuyAssetAmount(amount) + setOutputAssetAmount(amount) const swapFrom = { - denom: buyAsset.denom, + denom: outputAsset.denom, amount: amount.toString(), } - throttledEstimateExactIn(swapFrom, sellAsset.denom).then(setSellAssetAmount) + throttledEstimateExactIn(swapFrom, inputAsset.denom).then(setInputAssetAmount) }, - [buyAsset.denom, throttledEstimateExactIn, sellAsset.denom], + [outputAsset.denom, throttledEstimateExactIn, inputAsset.denom], ) const handleRangeInputChange = useCallback( (value: number) => { - onChangeBuyAmount(BN(value).shiftedBy(buyAsset.decimals).integerValue()) + onChangeOutputAmount(BN(value).shiftedBy(outputAsset.decimals).integerValue()) }, - [onChangeBuyAmount, buyAsset.decimals], + [onChangeOutputAmount, outputAsset.decimals], ) - const [maxSellAmount, sellSideMarginThreshold, marginRatio] = useMemo(() => { - const maxAmount = computeMaxSwapAmount(sellAsset.denom, buyAsset.denom, 'default') + const [maxInputAmount, imputMarginThreshold, marginRatio] = useMemo(() => { + const maxAmount = computeMaxSwapAmount(inputAsset.denom, outputAsset.denom, 'default') const maxAmountOnMargin = computeMaxSwapAmount( - sellAsset.denom, - buyAsset.denom, + inputAsset.denom, + outputAsset.denom, 'margin', ).integerValue() const marginRatio = maxAmount.dividedBy(maxAmountOnMargin) estimateExactIn( { - denom: sellAsset.denom, + denom: inputAsset.denom, amount: (isMarginChecked ? maxAmountOnMargin : maxAmount).toString(), }, - buyAsset.denom, + outputAsset.denom, ).then(setMaxBuyableAmountEstimation) if (isMarginChecked) return [maxAmountOnMargin, maxAmount, marginRatio] - if (sellAssetAmount.isGreaterThan(maxAmount)) onChangeSellAmount(maxAmount) + if (inputAssetAmount.isGreaterThan(maxAmount)) onChangeInputAmount(maxAmount) return [maxAmount, maxAmount, marginRatio] }, [ computeMaxSwapAmount, - sellAsset.denom, - buyAsset.denom, + inputAsset.denom, + outputAsset.denom, isMarginChecked, - onChangeSellAmount, - sellAssetAmount, + onChangeInputAmount, + inputAssetAmount, ]) - const buySideMarginThreshold = useMemo(() => { - return maxBuyableAmountEstimation.multipliedBy(marginRatio) - }, [marginRatio, maxBuyableAmountEstimation]) + const outputSideMarginThreshold = useMemo(() => { + return maxOutputAmountEstimation.multipliedBy(marginRatio) + }, [marginRatio, maxOutputAmountEstimation]) const swapTx = useMemo(() => { - const borrowCoin = sellAssetAmount.isGreaterThan(sellSideMarginThreshold) - ? BNCoin.fromDenomAndBigNumber( - sellAsset.denom, - sellAssetAmount.minus(sellSideMarginThreshold), - ) + const borrowCoin = inputAssetAmount.isGreaterThan(imputMarginThreshold) + ? BNCoin.fromDenomAndBigNumber(inputAsset.denom, inputAssetAmount.minus(imputMarginThreshold)) : undefined return swap({ accountId: account?.id || '', - coinIn: BNCoin.fromDenomAndBigNumber(sellAsset.denom, sellAssetAmount.integerValue()), + coinIn: BNCoin.fromDenomAndBigNumber(inputAsset.denom, inputAssetAmount.integerValue()), reclaim: removedLends[0], borrow: borrowCoin, - denomOut: buyAsset.denom, + denomOut: outputAsset.denom, slippage, - isMax: sellAssetAmount.isEqualTo(maxSellAmount), + isMax: inputAssetAmount.isEqualTo(maxInputAmount), repay: isAutoRepayChecked, }) }, [ removedLends, account?.id, - buyAsset.denom, - sellSideMarginThreshold, - sellAsset.denom, - sellAssetAmount, + outputAsset.denom, + imputMarginThreshold, + inputAsset.denom, + inputAssetAmount, slippage, swap, - maxSellAmount, + maxInputAmount, isAutoRepayChecked, ]) @@ -210,61 +215,10 @@ export default function SwapForm(props: Props) { ) const liquidationPrice = useMemo( - () => computeLiquidationPrice(props.buyAsset.denom), - [computeLiquidationPrice, props.buyAsset.denom], + () => computeLiquidationPrice(outputAsset.denom, 'asset'), + [computeLiquidationPrice, outputAsset.denom], ) - useEffect(() => { - setBuyAssetAmount(BN_ZERO) - setSellAssetAmount(BN_ZERO) - setMarginChecked(isBorrowEnabled ? useMargin : false) - setAutoRepayChecked(isRepayable ? useAutoRepay : false) - simulateTrade( - BNCoin.fromDenomAndBigNumber(buyAsset.denom, BN_ZERO), - BNCoin.fromDenomAndBigNumber(sellAsset.denom, BN_ZERO), - BNCoin.fromDenomAndBigNumber(sellAsset.denom, BN_ZERO), - isAutoLendEnabled && !isAutoRepayChecked ? 'lend' : 'deposit', - isAutoRepayChecked, - ) - }, [ - isBorrowEnabled, - isRepayable, - useMargin, - useAutoRepay, - buyAsset.denom, - sellAsset.denom, - isAutoLendEnabled, - isAutoRepayChecked, - simulateTrade, - setMarginChecked, - setAutoRepayChecked, - ]) - - useEffect(() => { - const removeDepositAmount = sellAssetAmount.isGreaterThanOrEqualTo(sellSideMarginThreshold) - ? sellSideMarginThreshold - : sellAssetAmount - const addDebtAmount = sellAssetAmount.isGreaterThan(sellSideMarginThreshold) - ? sellAssetAmount.minus(sellSideMarginThreshold) - : BN_ZERO - - if (removeDepositAmount.isZero() && addDebtAmount.isZero() && buyAssetAmount.isZero() && modal) - return - const removeCoin = BNCoin.fromDenomAndBigNumber(sellAsset.denom, removeDepositAmount) - const debtCoin = BNCoin.fromDenomAndBigNumber(sellAsset.denom, addDebtAmount) - const addCoin = BNCoin.fromDenomAndBigNumber(buyAsset.denom, buyAssetAmount) - - debouncedUpdateAccount(removeCoin, addCoin, debtCoin) - }, [ - sellAssetAmount, - buyAssetAmount, - sellSideMarginThreshold, - buyAsset.denom, - sellAsset.denom, - debouncedUpdateAccount, - modal, - ]) - useEffect(() => { swapTx.estimateFee().then(setEstimatedFee) }, [swapTx]) @@ -276,24 +230,90 @@ export default function SwapForm(props: Props) { const isSucceeded = await swapTx.execute() if (isSucceeded) { - setSellAssetAmount(BN_ZERO) - setBuyAssetAmount(BN_ZERO) + setInputAssetAmount(BN_ZERO) + setOutputAssetAmount(BN_ZERO) } setIsConfirming(false) } }, [account?.id, swapTx, setIsConfirming]) useEffect(() => { - if (sellAssetAmount.isEqualTo(maxSellAmount) || buyAssetAmount.isZero()) return - if (buyAssetAmount.isEqualTo(maxBuyableAmountEstimation)) setSellAssetAmount(maxSellAmount) - }, [sellAssetAmount, maxSellAmount, buyAssetAmount, maxBuyableAmountEstimation]) + onChangeOutputAmount(BN_ZERO) + onChangeInputAmount(BN_ZERO) + }, [orderDirection, onChangeOutputAmount, onChangeInputAmount]) + + useEffect(() => { + setOutputAssetAmount(BN_ZERO) + setInputAssetAmount(BN_ZERO) + setMarginChecked(isBorrowEnabled ? useMargin : false) + setAutoRepayChecked(isRepayable ? useAutoRepay : false) + simulateTrade( + BNCoin.fromDenomAndBigNumber(inputAsset.denom, BN_ZERO), + BNCoin.fromDenomAndBigNumber(outputAsset.denom, BN_ZERO), + BNCoin.fromDenomAndBigNumber(inputAsset.denom, BN_ZERO), + isAutoLendEnabled && !isAutoRepayChecked ? 'lend' : 'deposit', + isAutoRepayChecked, + ) + }, [ + isBorrowEnabled, + isRepayable, + useMargin, + useAutoRepay, + outputAsset.denom, + inputAsset.denom, + isAutoLendEnabled, + isAutoRepayChecked, + simulateTrade, + setMarginChecked, + setAutoRepayChecked, + ]) + + useEffect(() => { + const removeDepositAmount = inputAssetAmount.isGreaterThanOrEqualTo(imputMarginThreshold) + ? imputMarginThreshold + : inputAssetAmount + const addDebtAmount = inputAssetAmount.isGreaterThan(imputMarginThreshold) + ? inputAssetAmount.minus(imputMarginThreshold) + : BN_ZERO + + if ( + removeDepositAmount.isZero() && + addDebtAmount.isZero() && + outputAssetAmount.isZero() && + modal + ) + return + const removeCoin = BNCoin.fromDenomAndBigNumber(inputAsset.denom, removeDepositAmount) + const addCoin = BNCoin.fromDenomAndBigNumber(outputAsset.denom, outputAssetAmount) + const debtCoin = BNCoin.fromDenomAndBigNumber(inputAsset.denom, addDebtAmount) + + debouncedUpdateAccount(removeCoin, addCoin, debtCoin) + }, [ + inputAssetAmount, + outputAssetAmount, + imputMarginThreshold, + outputAsset.denom, + inputAsset.denom, + debouncedUpdateAccount, + modal, + ]) + + const borrowAsset = useMemo( + () => borrowAssets.find(byDenom(inputAsset.denom)), + [borrowAssets, inputAsset.denom], + ) + + useEffect(() => { + if (inputAssetAmount.isEqualTo(maxInputAmount) || outputAssetAmount.isZero()) return + if (outputAssetAmount.isEqualTo(maxOutputAmountEstimation)) setInputAssetAmount(maxInputAmount) + }, [inputAssetAmount, maxInputAmount, outputAssetAmount, maxOutputAmountEstimation]) const borrowAmount = useMemo( () => - sellAssetAmount.isGreaterThan(sellSideMarginThreshold) - ? sellAssetAmount.minus(sellSideMarginThreshold) + inputAssetAmount.isGreaterThan(imputMarginThreshold) + ? inputAssetAmount.minus(imputMarginThreshold) : BN_ZERO, - [sellAssetAmount, sellSideMarginThreshold], + [inputAssetAmount, imputMarginThreshold], ) const availableLiquidity = useMemo( @@ -303,79 +323,125 @@ export default function SwapForm(props: Props) { const isSwapDisabled = useMemo( () => - sellAssetAmount.isZero() || + inputAssetAmount.isZero() || depositCapReachedCoins.length > 0 || borrowAmount.isGreaterThan(availableLiquidity) || route.length === 0, - [sellAssetAmount, depositCapReachedCoins, borrowAmount, availableLiquidity, route], + [inputAssetAmount, depositCapReachedCoins, borrowAmount, availableLiquidity, route], ) return ( <> - - - - - {isRepayable && ENABLE_AUTO_REPAY && ( - + {isAdvanced ? ( + + ) : ( + + )} + + - )} - -
    - -
    -
    - - - - - - - {borrowAsset && borrowAmount.isGreaterThanOrEqualTo(availableLiquidity) && ( - + {isRepayable && ENABLE_AUTO_REPAY && ( + )} - +
    + +
    +
    + {isAdvanced ? ( + + ) : ( + <> + + + + )} + {!isAdvanced && } + + + + {borrowAsset && borrowAmount.isGreaterThanOrEqualTo(availableLiquidity) && ( + + )} + {isAdvanced ? ( + + ) : ( + <> + +
    + You receive + + {formatValue(outputAssetAmount.toNumber(), { + decimals: outputAsset.decimals, + abbreviated: false, + suffix: ` ${outputAsset.symbol}`, + minDecimals: 0, + maxDecimals: outputAsset.decimals, + })} + +
    + + )} +
    +
    +
    diff --git a/src/components/Trade/TradeModule/index.tsx b/src/components/Trade/TradeModule/index.tsx index 7f74b3b6..5e8b916f 100644 --- a/src/components/Trade/TradeModule/index.tsx +++ b/src/components/Trade/TradeModule/index.tsx @@ -1,26 +1,25 @@ import classNames from 'classnames' -import AssetSelector from 'components/Trade/TradeModule/AssetSelector' import SwapForm from 'components/Trade/TradeModule/SwapForm' interface Props { buyAsset: Asset sellAsset: Asset + isAdvanced: boolean } export default function TradeModule(props: Props) { - const { buyAsset, sellAsset } = props - + const { buyAsset, sellAsset, isAdvanced } = props return (
    - - +
    ) diff --git a/src/components/Wallet/WalletConnectedButton.tsx b/src/components/Wallet/WalletConnectedButton.tsx index 11417723..26288b8f 100644 --- a/src/components/Wallet/WalletConnectedButton.tsx +++ b/src/components/Wallet/WalletConnectedButton.tsx @@ -1,10 +1,10 @@ import { useShuttle } from '@delphi-labs/shuttle-react' import BigNumber from 'bignumber.js' import classNames from 'classnames' -import { useCallback, useEffect, useState } from 'react' -import { useLocation, useNavigate } from 'react-router-dom' -import useClipboard from 'react-use-clipboard' import { resolvePrimaryDomainByAddress } from 'ibc-domains-sdk' +import { useCallback, useEffect, useState } from 'react' +import { useLocation, useNavigate, useSearchParams } from 'react-router-dom' +import useClipboard from 'react-use-clipboard' import Button from 'components/Button' import { CircularProgress } from 'components/CircularProgress' @@ -44,6 +44,7 @@ export default function WalletConnectedButton() { const { data: icnsData, isLoading: isLoadingICNS } = useICNSDomain(address) const navigate = useNavigate() const { pathname } = useLocation() + const [searchParams] = useSearchParams() // --------------- // LOCAL STATE @@ -87,7 +88,7 @@ export default function WalletConnectedButton() { }) } - navigate(getRoute(getPage(pathname))) + navigate(getRoute(getPage(pathname), searchParams)) } useEffect(() => { diff --git a/src/components/Wallet/WalletFetchBalancesAndAccounts.tsx b/src/components/Wallet/WalletFetchBalancesAndAccounts.tsx index 426a19dc..411f6bbd 100644 --- a/src/components/Wallet/WalletFetchBalancesAndAccounts.tsx +++ b/src/components/Wallet/WalletFetchBalancesAndAccounts.tsx @@ -1,5 +1,5 @@ import { Suspense, useEffect, useMemo } from 'react' -import { useLocation, useNavigate, useParams } from 'react-router-dom' +import { useLocation, useNavigate, useParams, useSearchParams } from 'react-router-dom' import AccountCreateFirst from 'components/Account/AccountCreateFirst' import { CircularProgress } from 'components/CircularProgress' @@ -28,6 +28,8 @@ function FetchLoading() { function Content() { const address = useStore((s) => s.address) + const [searchParams] = useSearchParams() + const { address: urlAddress } = useParams() const urlAccountId = useAccountId() const navigate = useNavigate() @@ -48,7 +50,7 @@ function Content() { useEffect(() => { const page = getPage(pathname) if (page === 'portfolio' && urlAddress && urlAddress !== address) { - navigate(getRoute(page, urlAddress as string)) + navigate(getRoute(page, searchParams, urlAddress as string)) useStore.setState({ balances: walletBalances, focusComponent: null }) return } @@ -60,7 +62,7 @@ function Content() { ) { const currentAccountIsHLS = urlAccountId && !accountIds.includes(urlAccountId) const currentAccount = currentAccountIsHLS || !urlAccountId ? accountIds[0] : urlAccountId - navigate(getRoute(page, address, currentAccount)) + navigate(getRoute(page, searchParams, address, currentAccount)) useStore.setState({ balances: walletBalances, focusComponent: null }) } }, [ @@ -72,6 +74,7 @@ function Content() { walletBalances, urlAddress, urlAccountId, + searchParams, ]) if (isLoadingAccounts || isLoadingBalances) return diff --git a/src/constants/assets.ts b/src/constants/assets.ts index 709a3dd4..983883b5 100644 --- a/src/constants/assets.ts +++ b/src/constants/assets.ts @@ -19,6 +19,44 @@ export const ASSETS: Asset[] = [ pythPriceFeedId: '5867f5683c757393a0670ef0f701490950fe93fdb006d181c8265a831ac0c5c6', pythHistoryFeedId: 'Crypto.OSMO/USD', }, + { + symbol: 'USDC.axl', + name: 'Axelar USDC', + id: 'axlUSDC', + denom: 'ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858', + color: '#478edc', + logo: '/images/tokens/axlusdc.svg', + decimals: 6, + hasOraclePrice: true, + isEnabled: true, + isMarket: true, + isDisplayCurrency: true, + isStable: true, + isBorrowEnabled: true, + isAutoLendEnabled: true, + pythPriceFeedId: 'eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a', + pythHistoryFeedId: 'Crypto.USDC/USD', + poolId: 678, + }, + { + symbol: 'USDC', + name: 'Noble', + id: 'USDC', + denom: 'ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4', + color: '#478edc', + logo: '/images/tokens/usdc.svg', + decimals: 6, + hasOraclePrice: true, + isEnabled: true, + isMarket: true, + isDisplayCurrency: true, + isStable: true, + isBorrowEnabled: true, + isAutoLendEnabled: true, + pythPriceFeedId: 'eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a', + pythHistoryFeedId: 'Crypto.USDC/USD', + poolId: ENV.NETWORK === NETWORK.DEVNET ? 678 : 1221, + }, { symbol: 'ATOM', name: 'Atom', @@ -119,44 +157,6 @@ export const ASSETS: Asset[] = [ isEnabled: true, forceFetchPrice: true, }, - { - symbol: 'USDC.axl', - name: 'Axelar USDC', - id: 'axlUSDC', - denom: 'ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858', - color: '#478edc', - logo: '/images/tokens/axlusdc.svg', - decimals: 6, - hasOraclePrice: true, - isEnabled: true, - isMarket: true, - isDisplayCurrency: true, - isStable: true, - isBorrowEnabled: true, - isAutoLendEnabled: true, - pythPriceFeedId: 'eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a', - pythHistoryFeedId: 'Crypto.USDC/USD', - poolId: 678, - }, - { - symbol: 'USDC', - name: 'Noble', - id: 'USDC', - denom: 'ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4', - color: '#478edc', - logo: '/images/tokens/usdc.svg', - decimals: 6, - hasOraclePrice: true, - isEnabled: true, - isMarket: true, - isDisplayCurrency: true, - isStable: true, - isBorrowEnabled: true, - isAutoLendEnabled: true, - pythPriceFeedId: 'eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a', - pythHistoryFeedId: 'Crypto.USDC/USD', - poolId: ENV.NETWORK === NETWORK.DEVNET ? 678 : 1221, - }, { symbol: 'USDT', id: 'USDT', diff --git a/src/constants/defaultSettings.ts b/src/constants/defaultSettings.ts index 43756554..95b4e95e 100644 --- a/src/constants/defaultSettings.ts +++ b/src/constants/defaultSettings.ts @@ -7,7 +7,8 @@ export const DEFAULT_SETTINGS: Settings = { accountSummaryTabs: [true, true], reduceMotion: false, lendAssets: true, - tradingPair: { buy: enabledMarketAssets[0].denom, sell: enabledMarketAssets[1].denom }, + tradingPairSimple: { buy: enabledMarketAssets[0].denom, sell: enabledMarketAssets[1].denom }, + tradingPairAdvanced: { buy: enabledMarketAssets[0].denom, sell: enabledMarketAssets[1].denom }, displayCurrency: ORACLE_DENOM, slippage: 0.02, tutorial: true, diff --git a/src/constants/localStorageKeys.ts b/src/constants/localStorageKeys.ts index bda120b1..12f15681 100644 --- a/src/constants/localStorageKeys.ts +++ b/src/constants/localStorageKeys.ts @@ -1,5 +1,6 @@ export enum LocalStorageKeys { - TRADING_PAIR = 'tradingPair', + TRADING_PAIR_SIMPLE = 'tradingPairSimple', + TRADING_PAIR_ADVANCED = 'tradingPairAdvanced', ACCOUNT_SUMMARY_TABS = 'accountSummaryTabs', DISPLAY_CURRENCY = 'displayCurrency', REDUCE_MOTION = 'reduceMotion', diff --git a/src/hooks/perps/usePerpsMarket.ts b/src/hooks/perps/usePerpsMarket.ts new file mode 100644 index 00000000..5b0490f0 --- /dev/null +++ b/src/hooks/perps/usePerpsMarket.ts @@ -0,0 +1,36 @@ +import { useSearchParams } from 'react-router-dom' +import useSWR from 'swr' + +import { ASSETS } from 'constants/assets' +import { getAssetBySymbol } from 'utils/assets' +import { BN } from 'utils/helpers' + +export default function usePerpsMarket() { + const [searchParams] = useSearchParams() + const perpsMarket = searchParams.get('perpsMarket') || ASSETS[0].symbol + + const asset = getAssetBySymbol(perpsMarket) + + return useSWR( + `perpsMarket/${perpsMarket}`, + async () => { + await delay(3000) + if (!asset) return null + return { + asset, + fundingRate: BN(0.001432), + openInterest: { + long: BN(92901203), + short: BN(129891203), + }, + } as PerpsMarket + }, + { + fallbackData: null, + }, + ) +} + +function delay(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)) +} diff --git a/src/hooks/useHealthComputer.tsx b/src/hooks/useHealthComputer.tsx index 22b4432e..82835f8e 100644 --- a/src/hooks/useHealthComputer.tsx +++ b/src/hooks/useHealthComputer.tsx @@ -24,6 +24,7 @@ import { BorrowTarget, compute_health_js, liquidation_price_js, + LiquidationPriceKind, max_borrow_estimate_js, max_swap_estimate_js, max_withdraw_estimate_js, @@ -198,13 +199,13 @@ export default function useHealthComputer(account?: Account) { ) const computeLiquidationPrice = useCallback( - (denom: string) => { + (denom: string, kind: LiquidationPriceKind) => { if (!healthComputer) return null try { const asset = getAssetByDenom(denom) if (!asset) return null const decimalDiff = asset.decimals - PRICE_ORACLE_DECIMALS - return BN(liquidation_price_js(healthComputer, denom)) + return BN(liquidation_price_js(healthComputer, denom, kind)) .shiftedBy(-VALUE_SCALE_FACTOR) .shiftedBy(decimalDiff) .toNumber() diff --git a/src/hooks/useLiquidationPrice.ts b/src/hooks/useLiquidationPrice.ts new file mode 100644 index 00000000..3947d7cb --- /dev/null +++ b/src/hooks/useLiquidationPrice.ts @@ -0,0 +1,22 @@ +import debounce from 'lodash.debounce' +import { useEffect, useMemo, useState } from 'react' + +export default function useLiquidationPrice(liqPrice: number | null) { + const [liquidationPrice, setLiquidationPrice] = useState(null) + const [isUpdatingLiquidationPrice, setIsUpdatingLiquidationPrice] = useState(false) + const debouncedSetLiqPrice = useMemo( + () => debounce(setLiquidationPrice, 1000, { leading: false }), + [], + ) + + useEffect(() => { + setIsUpdatingLiquidationPrice(true) + debouncedSetLiqPrice(liqPrice) + }, [debouncedSetLiqPrice, liqPrice]) + + useEffect(() => { + setIsUpdatingLiquidationPrice(false) + }, [liquidationPrice]) + + return { liquidationPrice, isUpdatingLiquidationPrice } +} diff --git a/src/pages/PerpsPage.tsx b/src/pages/PerpsPage.tsx index 3a3b8639..96b85367 100644 --- a/src/pages/PerpsPage.tsx +++ b/src/pages/PerpsPage.tsx @@ -7,7 +7,7 @@ export default function PerpsPage() { return (
    -
    +
    diff --git a/src/pages/PortfolioAccountPage.tsx b/src/pages/PortfolioAccountPage.tsx index 84a9b835..6759b276 100644 --- a/src/pages/PortfolioAccountPage.tsx +++ b/src/pages/PortfolioAccountPage.tsx @@ -1,4 +1,4 @@ -import { useNavigate, useParams } from 'react-router-dom' +import { useNavigate, useParams, useSearchParams } from 'react-router-dom' import MigrationBanner from 'components/MigrationBanner' import Balances from 'components/Portfolio/Account/Balances' @@ -12,9 +12,10 @@ export default function PortfolioAccountPage() { const selectedAccountId = useAccountId() const { address, accountId } = useParams() const navigate = useNavigate() + const [searchParams] = useSearchParams() if (!accountId) { - navigate(getRoute('portfolio', address, selectedAccountId)) + navigate(getRoute('portfolio', searchParams, address, selectedAccountId)) return null } diff --git a/src/pages/TradePage.tsx b/src/pages/TradePage.tsx index 9f878560..9be1e1e1 100644 --- a/src/pages/TradePage.tsx +++ b/src/pages/TradePage.tsx @@ -1,4 +1,5 @@ import { useMemo } from 'react' +import { useLocation } from 'react-router-dom' import MigrationBanner from 'components/MigrationBanner' import AccountDetailsCard from 'components/Trade/AccountDetailsCard' @@ -10,30 +11,45 @@ import useLocalStorage from 'hooks/useLocalStorage' import useStore from 'store' import { byDenom } from 'utils/array' import { getEnabledMarketAssets } from 'utils/assets' +import { getPage } from 'utils/route' export default function TradePage() { - const [tradingPair] = useLocalStorage( - LocalStorageKeys.TRADING_PAIR, - DEFAULT_SETTINGS.tradingPair, + const { pathname } = useLocation() + const page = getPage(pathname) + const isAdvanced = useMemo(() => page === 'trade-advanced', [page]) + + const [tradingPairAdvanced] = useLocalStorage( + LocalStorageKeys.TRADING_PAIR_ADVANCED, + DEFAULT_SETTINGS.tradingPairAdvanced, ) + const [tradingPairSimple] = useLocalStorage( + LocalStorageKeys.TRADING_PAIR_SIMPLE, + DEFAULT_SETTINGS.tradingPairSimple, + ) + const enabledMarketAssets = getEnabledMarketAssets() const assetOverlayState = useStore((s) => s.assetOverlayState) const buyAsset = useMemo( - () => enabledMarketAssets.find(byDenom(tradingPair.buy)) ?? enabledMarketAssets[0], - [tradingPair, enabledMarketAssets], + () => + enabledMarketAssets.find( + byDenom(isAdvanced ? tradingPairAdvanced.buy : tradingPairSimple.buy), + ) ?? enabledMarketAssets[0], + [tradingPairAdvanced, tradingPairSimple, enabledMarketAssets, isAdvanced], ) const sellAsset = useMemo( - () => enabledMarketAssets.find(byDenom(tradingPair.sell)) ?? enabledMarketAssets[1], - [tradingPair, enabledMarketAssets], + () => + enabledMarketAssets.find( + byDenom(isAdvanced ? tradingPairAdvanced.sell : tradingPairSimple.sell), + ) ?? enabledMarketAssets[1], + [tradingPairAdvanced, tradingPairSimple, enabledMarketAssets, isAdvanced], ) - return (
    -
    - +
    +
    {assetOverlayState !== 'closed' && ( diff --git a/src/pages/_layout.tsx b/src/pages/_layout.tsx index d10dd1fa..3ce2afbd 100644 --- a/src/pages/_layout.tsx +++ b/src/pages/_layout.tsx @@ -27,7 +27,12 @@ function PageContainer(props: Props) { if (!props.focusComponent) return ( -
    +
    {props.children}
    ) @@ -42,6 +47,7 @@ function PageContainer(props: Props) { export default function Layout({ children }: { children: React.ReactNode }) { const location = useLocation() const focusComponent = useStore((s) => s.focusComponent) + const address = useStore((s) => s.address) const [reduceMotion] = useLocalStorage( LocalStorageKeys.REDUCE_MOTION, DEFAULT_SETTINGS.reduceMotion, @@ -61,11 +67,12 @@ export default function Layout({ children }: { children: React.ReactNode }) {
    asset.denom === denom) @@ -47,3 +51,42 @@ export function getBorrowEnabledAssets() { export function getStakingAssets() { return ASSETS.filter((asset) => asset.isStaking) } + +function isAssetPair(assetPair: Asset | AssetPair): assetPair is AssetPair { + return (assetPair).buy !== undefined +} + +export function sortAssetsOrPairs( + assets: Asset[] | AssetPair[], + prices: BNCoin[], + marketDeposits: BNCoin[], + balances: BNCoin[], + baseDenom: string, +): Asset[] | AssetPair[] { + if (prices.length === 0 || marketDeposits.length === 0) return assets + + return assets.sort((a, b) => { + const assetA = isAssetPair(a) ? a.buy : a + const assetB = isAssetPair(b) ? b.buy : b + + const aDenom = assetA.denom + const bDenom = assetB.denom + const aBalance = balances?.find(byDenom(aDenom))?.amount ?? BN_ZERO + const aPrice = prices?.find(byDenom(aDenom))?.amount ?? BN_ZERO + const bBalance = balances?.find(byDenom(bDenom))?.amount ?? BN_ZERO + const bPrice = prices?.find(byDenom(bDenom))?.amount ?? BN_ZERO + + const aValue = demagnify(aBalance, assetA) * aPrice.toNumber() + const bValue = demagnify(bBalance, assetB) * bPrice.toNumber() + if (aValue > 0 || bValue > 0) return bValue - aValue + if (aDenom === baseDenom) return -1 + if (bDenom === baseDenom) return 1 + + const aMarketDeposit = marketDeposits?.find(byDenom(aDenom))?.amount ?? BN_ZERO + const bMarketDeposit = marketDeposits?.find(byDenom(bDenom))?.amount ?? BN_ZERO + const aMarketValue = demagnify(aMarketDeposit, assetA) * aPrice.toNumber() + const bMarketValue = demagnify(bMarketDeposit, assetB) * bPrice.toNumber() + + return bMarketValue - aMarketValue + }) +} diff --git a/src/utils/health_computer/index.d.ts b/src/utils/health_computer/index.d.ts index f6c5086c..b7a24bbe 100644 --- a/src/utils/health_computer/index.d.ts +++ b/src/utils/health_computer/index.d.ts @@ -40,9 +40,14 @@ export function max_swap_estimate_js( /** * @param {HealthComputer} c * @param {string} denom + * @param {LiquidationPriceKind} kind * @returns {string} */ -export function liquidation_price_js(c: HealthComputer, denom: string): string +export function liquidation_price_js( + c: HealthComputer, + denom: string, + kind: LiquidationPriceKind, +): string export interface HealthComputer { kind: AccountKind positions: Positions @@ -61,6 +66,8 @@ export interface HealthValuesResponse { above_max_ltv: boolean } +export type LiquidationPriceKind = 'asset' | 'debt' + export type Slippage = Decimal export type SwapKind = 'default' | 'margin' @@ -88,7 +95,7 @@ export interface InitOutput { g: number, h: number, ) => void - readonly liquidation_price_js: (a: number, b: number, c: number, d: number) => void + readonly liquidation_price_js: (a: number, b: number, c: number, d: number, e: number) => void readonly allocate: (a: number) => number readonly deallocate: (a: number) => void readonly requires_iterator: () => void diff --git a/src/utils/health_computer/index.js b/src/utils/health_computer/index.js index fe0f1cb6..0f3385b4 100644 --- a/src/utils/health_computer/index.js +++ b/src/utils/health_computer/index.js @@ -233,16 +233,17 @@ export function max_swap_estimate_js(c, from_denom, to_denom, kind, slippage) { /** * @param {HealthComputer} c * @param {string} denom + * @param {LiquidationPriceKind} kind * @returns {string} */ -export function liquidation_price_js(c, denom) { +export function liquidation_price_js(c, denom, kind) { let deferred2_0 let deferred2_1 try { const retptr = wasm.__wbindgen_add_to_stack_pointer(-16) const ptr0 = passStringToWasm0(denom, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc) const len0 = WASM_VECTOR_LEN - wasm.liquidation_price_js(retptr, addHeapObject(c), ptr0, len0) + wasm.liquidation_price_js(retptr, addHeapObject(c), ptr0, len0, addHeapObject(kind)) var r0 = getInt32Memory0()[retptr / 4 + 0] var r1 = getInt32Memory0()[retptr / 4 + 1] deferred2_0 = r0 diff --git a/src/utils/health_computer/index_bg.wasm b/src/utils/health_computer/index_bg.wasm index 9afb93c63d7dabef2ee3f8cacc2bc435b53fdd3a..bbd93b239e325df4314d2f5170be06bec565256c 100644 GIT binary patch delta 67373 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 delta 64881 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 diff --git a/src/utils/health_computer/index_bg.wasm.d.ts b/src/utils/health_computer/index_bg.wasm.d.ts index bcd48262..bc3cc3ff 100644 --- a/src/utils/health_computer/index_bg.wasm.d.ts +++ b/src/utils/health_computer/index_bg.wasm.d.ts @@ -14,7 +14,7 @@ export function max_swap_estimate_js( g: number, h: number, ): void -export function liquidation_price_js(a: number, b: number, c: number, d: number): void +export function liquidation_price_js(a: number, b: number, c: number, d: number, e: number): void export function allocate(a: number): number export function deallocate(a: number): void export function requires_iterator(): void diff --git a/src/utils/math.ts b/src/utils/math.ts index 53cc40b1..ed7be0de 100644 --- a/src/utils/math.ts +++ b/src/utils/math.ts @@ -1,4 +1,4 @@ -import { BN } from './helpers' +import { BN } from 'utils/helpers' export const devideByPotentiallyZero = (numerator: number, denominator: number): number => { if (denominator === 0) return 0 diff --git a/src/utils/messages.ts b/src/utils/messages.ts index c6da505b..ddd3e9ad 100644 --- a/src/utils/messages.ts +++ b/src/utils/messages.ts @@ -1,4 +1,4 @@ -import { formatAmountWithSymbol } from './formatters' +import { formatAmountWithSymbol } from 'utils/formatters' export function getNoBalanceMessage(symbol: string) { return `You don't have an ${symbol} balance in your account.` diff --git a/src/utils/route.ts b/src/utils/route.ts index df38bd2f..1ca2b6a8 100644 --- a/src/utils/route.ts +++ b/src/utils/route.ts @@ -1,4 +1,9 @@ -export function getRoute(page: Page, address?: string, accountId?: string | null) { +export function getRoute( + page: Page, + searchParams: URLSearchParams, + address?: string, + accountId?: string | null, +) { let nextUrl = '' if (address) { @@ -9,10 +14,13 @@ export function getRoute(page: Page, address?: string, accountId?: string | null let url = new URL(nextUrl, 'https://app.marsprotocol.io') + Array.from(searchParams?.entries() || []).map(([key, value]) => + url.searchParams.append(key, value), + ) + if (accountId) { - url.searchParams.append('accountId', accountId) - } else { url.searchParams.delete('accountId') + url.searchParams.append('accountId', accountId) } return url.pathname + url.search @@ -21,6 +29,7 @@ export function getRoute(page: Page, address?: string, accountId?: string | null export function getPage(pathname: string): Page { const pages: Page[] = [ 'trade', + 'trade-advanced', 'perps', 'borrow', 'farm', diff --git a/tailwind.config.js b/tailwind.config.js index f8e3f952..58e0561f 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -4,6 +4,8 @@ const plugin = require('tailwindcss/plugin') module.exports = { content: ['./src/pages/**/*.{js,ts,jsx,tsx}', './src/components/**/*.{js,ts,jsx,tsx}'], safelist: [ + 'border-error', + 'border-success', 'h-2', 'text-3xs', 'text-3xs-caps', @@ -41,12 +43,14 @@ module.exports = { '@nav-3/navigation:inline-block', '@nav-4/navigation:inline-block', '@nav-5/navigation:inline-block', + '@nav-6/navigation:inline-block', '@nav-0/navigation:hidden', '@nav-1/navigation:hidden', '@nav-2/navigation:hidden', '@nav-3/navigation:hidden', '@nav-4/navigation:hidden', '@nav-5/navigation:hidden', + '@nav-6/navigation:hidden', ], theme: { extend: { @@ -141,6 +145,7 @@ module.exports = { 'nav-3': '400px', 'nav-4': '500px', 'nav-5': '600px', + 'nav-6': '650px', }, fontFamily: { sans: ['Inter', 'sans-serif'], diff --git a/yarn.lock b/yarn.lock index 735d00d5..9ed35b1d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8,9 +8,9 @@ integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== "@adobe/css-tools@^4.0.1": - version "4.3.1" - resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.1.tgz" - integrity sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg== + version "4.3.2" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.2.tgz#a6abc715fb6884851fca9dad37fc34739a04fd11" + integrity sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw== "@alloc/quick-lru@^5.2.0": version "5.2.0" @@ -1608,6 +1608,13 @@ tslib "^2.6.0" tsup "^7.1.0" +"@emnapi/runtime@^0.44.0": + version "0.44.0" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-0.44.0.tgz#1ef702f846cfcd559d28eb7673919087ba5b63e3" + integrity sha512-ZX/etZEZw8DR7zAB1eVQT40lNo0jeqpb6dCgOvctB6FIQ5PoXfMuNY8+ayQfu8tNQbAB8gQWSSJupR8NxeiZXw== + dependencies: + tslib "^2.4.0" + "@esbuild/android-arm64@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.14.tgz#d86197e6ff965a187b2ea2704915f596a040ed4b" @@ -2146,6 +2153,119 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== +"@img/sharp-darwin-arm64@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.0.tgz#b3e4ed1887f53faca5e95e3fd9f25181432353ed" + integrity sha512-070tEheekI1LJWTGPC9WlQEa5UoKTXzzlORBHMX4TbfUxMiL336YHR8vBEUNsjse0RJCX8dZ4ZXwT595aEF1ug== + optionalDependencies: + "@img/sharp-libvips-darwin-arm64" "1.0.0" + +"@img/sharp-darwin-x64@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.0.tgz#277714bff6e6d468162146019933a416467f3082" + integrity sha512-pu/nvn152F3qbPeUkr+4e9zVvEhD3jhwzF473veQfMPkOYo9aoWXSfdZH/E6F+nYC3qvFjbxbvdDbUtEbghLqw== + optionalDependencies: + "@img/sharp-libvips-darwin-x64" "1.0.0" + +"@img/sharp-libvips-darwin-arm64@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.0.tgz#8baf27b01dabba524e885c30287e1916ab978de7" + integrity sha512-VzYd6OwnUR81sInf3alj1wiokY50DjsHz5bvfnsFpxs5tqQxESoHtJO6xyksDs3RIkyhMWq2FufXo6GNSU9BMw== + +"@img/sharp-libvips-darwin-x64@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.0.tgz#509113f649d3ea0e99b76d41437fc0049d8ba2f9" + integrity sha512-dD9OznTlHD6aovRswaPNEy8dKtSAmNo4++tO7uuR4o5VxbVAOoEQ1uSmN4iFAdQneTHws1lkTZeiXPrcCkh6IA== + +"@img/sharp-libvips-linux-arm64@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.0.tgz#9e131cc95f9f8aa36da9addee89efead21ad9993" + integrity sha512-xTYThiqEZEZc0PRU90yVtM3KE7lw1bKdnDQ9kCTHWbqWyHOe4NpPOtMGy27YnN51q0J5dqRrvicfPbALIOeAZA== + +"@img/sharp-libvips-linux-arm@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.0.tgz#a529f68a28ab1d219907071c41ace029121d1c4f" + integrity sha512-VwgD2eEikDJUk09Mn9Dzi1OW2OJFRQK+XlBTkUNmAWPrtj8Ly0yq05DFgu1VCMx2/DqCGQVi5A1dM9hTmxf3uw== + +"@img/sharp-libvips-linux-s390x@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.0.tgz#c26aaa9ee58b47ff901bb5f93f29c4ab3f03caf7" + integrity sha512-o9E46WWBC6JsBlwU4QyU9578G77HBDT1NInd+aERfxeOPbk0qBZHgoDsQmA2v9TbqJRWzoBPx1aLOhprBMgPjw== + +"@img/sharp-libvips-linux-x64@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.0.tgz#7a04795fbf2668b9dd7c74bf8326cb779131d809" + integrity sha512-naldaJy4hSVhWBgEjfdBY85CAa4UO+W1nx6a1sWStHZ7EUfNiuBTTN2KUYT5dH1+p/xij1t2QSXfCiFJoC5S/Q== + +"@img/sharp-libvips-linuxmusl-arm64@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.0.tgz#600e7322faa5ce124d3ae2cbf63808ea47678591" + integrity sha512-OdorplCyvmSAPsoJLldtLh3nLxRrkAAAOHsGWGDYfN0kh730gifK+UZb3dWORRa6EusNqCTjfXV4GxvgJ/nPDQ== + +"@img/sharp-libvips-linuxmusl-x64@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.0.tgz#af33a04e75f192c5396c6a41df8b7b7bf15a8006" + integrity sha512-FW8iK6rJrg+X2jKD0Ajhjv6y74lToIBEvkZhl42nZt563FfxkCYacrXZtd+q/sRQDypQLzY5WdLkVTbJoPyqNg== + +"@img/sharp-linux-arm64@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.0.tgz#d9a361c1d5344754f6038cc9d74e1dd4d217f52f" + integrity sha512-dcomVSrtgF70SyOr8RCOCQ8XGVThXwe71A1d8MGA+mXEVRJ/J6/TrCbBEJh9ddcEIIsrnrkolaEvYSHqVhswQw== + optionalDependencies: + "@img/sharp-libvips-linux-arm64" "1.0.0" + +"@img/sharp-linux-arm@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.0.tgz#e0f804033d99ce2af73c78d47eeb118e28b4af41" + integrity sha512-4horD3wMFd5a0ddbDY8/dXU9CaOgHjEHALAddXgafoR5oWq5s8X61PDgsSeh4Qupsdo6ycfPPSSNBrfVQnwwrg== + optionalDependencies: + "@img/sharp-libvips-linux-arm" "1.0.0" + +"@img/sharp-linux-s390x@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.0.tgz#4b6d49f87364c60ae015825746f365385f1c3b54" + integrity sha512-TiVJbx38J2rNVfA309ffSOB+3/7wOsZYQEOlKqOUdWD/nqkjNGrX+YQGz7nzcf5oy2lC+d37+w183iNXRZNngQ== + optionalDependencies: + "@img/sharp-libvips-linux-s390x" "1.0.0" + +"@img/sharp-linux-x64@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.0.tgz#a4fb262f143f468aec974aad6e53d1859a75ec90" + integrity sha512-PaZM4Zi7/Ek71WgTdvR+KzTZpBqrQOFcPe7/8ZoPRlTYYRe43k6TWsf4GVH6XKRLMYeSp8J89RfAhBrSP4itNA== + optionalDependencies: + "@img/sharp-libvips-linux-x64" "1.0.0" + +"@img/sharp-linuxmusl-arm64@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.0.tgz#423a9e5e3ec1e6476dbdfd78dda91c6f062bfd67" + integrity sha512-1QLbbN0zt+32eVrg7bb1lwtvEaZwlhEsY1OrijroMkwAqlHqFj6R33Y47s2XUv7P6Ie1PwCxK/uFnNqMnkd5kg== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64" "1.0.0" + +"@img/sharp-linuxmusl-x64@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.0.tgz#9d0beac9a71cd7d3bc41eef63521e60edc3820f5" + integrity sha512-CecqgB/CnkvCWFhmfN9ZhPGMLXaEBXl4o7WtA6U3Ztrlh/s7FUKX4vNxpMSYLIrWuuzjiaYdfU3+Tdqh1xaHfw== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64" "1.0.0" + +"@img/sharp-wasm32@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.0.tgz#5b085509f04256c43f201552fce5144fe0bd66b9" + integrity sha512-Hn4js32gUX9qkISlemZBUPuMs0k/xNJebUNl/L6djnU07B/HAA2KaxRVb3HvbU5fL242hLOcp0+tR+M8dvJUFw== + dependencies: + "@emnapi/runtime" "^0.44.0" + +"@img/sharp-win32-ia32@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.0.tgz#a89bc502a70e5547cbff9451d06f9962425e7b39" + integrity sha512-5HfcsCZi3l5nPRF2q3bllMVMDXBqEWI3Q8KQONfzl0TferFE5lnsIG0A1YrntMAGqvkzdW6y1Ci1A2uTvxhfzg== + +"@img/sharp-win32-x64@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.0.tgz#bfae1b82608a0d420e4b0b836ddb7dd58eaffa8e" + integrity sha512-i3DtP/2ce1yKFj4OzOnOYltOEL/+dp4dc4dJXJBv6god1AFTcmkaA99H/7SwOmkCOBQkbVvA3lCGm3/5nDtf9Q== + "@improbable-eng/grpc-web@^0.14.1": version "0.14.1" resolved "https://registry.npmjs.org/@improbable-eng/grpc-web/-/grpc-web-0.14.1.tgz" @@ -2682,10 +2802,10 @@ resolved "https://registry.npmjs.org/@next/env/-/env-13.5.4.tgz" integrity sha512-LGegJkMvRNw90WWphGJ3RMHMVplYcOfRWf2Be3td3sUa+1AaxmsYyANsA+znrGCBjXJNi4XAQlSoEfUxs/4kIQ== -"@next/eslint-plugin-next@14.0.0": - version "14.0.0" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.0.0.tgz#b299e61292b8abede7ecb37499feb817385801e6" - integrity sha512-Ye37nNI09V3yt7pzuzSQtwlvuJ2CGzFszHXkcTHHZgNr7EhTMFLipn3VSJChy+e5+ahTdNApPphc3qCPUsn10A== +"@next/eslint-plugin-next@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.0.4.tgz#474fd88d92209270021186043513fbdc4203f5ec" + integrity sha512-U3qMNHmEZoVmHA0j/57nRfi3AscXNvkOnxDmle/69Jz/G0o/gWjXTDdlgILZdrxQ0Lw/jv2mPW8PGy0EGIHXhQ== dependencies: glob "7.1.7" @@ -2974,30 +3094,30 @@ "@noble/hashes" "~1.3.0" "@scure/base" "~1.1.0" -"@sentry-internal/tracing@7.77.0": - version "7.77.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.77.0.tgz#f3d82486f8934a955b3dd2aa54c8d29586e42a37" - integrity sha512-8HRF1rdqWwtINqGEdx8Iqs9UOP/n8E0vXUu3Nmbqj4p5sQPA7vvCfq+4Y4rTqZFc7sNdFpDsRION5iQEh8zfZw== +"@sentry-internal/tracing@7.84.0": + version "7.84.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.84.0.tgz#430da253ee5b075be4ef57f20ea842c0208bc6b0" + integrity sha512-y9bGYA0OM6PEREfd+nk4UURZy29tpIw+7vQwpxWfEVs2fqq0/5TBFX/tKFb8AKUI9lVM8v0bcF0bNSCnuPQZHQ== dependencies: - "@sentry/core" "7.77.0" - "@sentry/types" "7.77.0" - "@sentry/utils" "7.77.0" + "@sentry/core" "7.84.0" + "@sentry/types" "7.84.0" + "@sentry/utils" "7.84.0" -"@sentry/browser@7.77.0": - version "7.77.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.77.0.tgz#155440f1a0d3a1bbd5d564c28d6b0c9853a51d72" - integrity sha512-nJ2KDZD90H8jcPx9BysQLiQW+w7k7kISCWeRjrEMJzjtge32dmHA8G4stlUTRIQugy5F+73cOayWShceFP7QJQ== +"@sentry/browser@7.84.0": + version "7.84.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.84.0.tgz#7c82470f0afbb6178f26127894e40e9ce2b1e6d6" + integrity sha512-X50TlTKY9WzAnHsYc4FYrCWgm+CdVo0h02ggmodVBUpRLUBjj+cs5Q1plov/v/XeorSwmorNEMUu/n+XZNSsrA== dependencies: - "@sentry-internal/tracing" "7.77.0" - "@sentry/core" "7.77.0" - "@sentry/replay" "7.77.0" - "@sentry/types" "7.77.0" - "@sentry/utils" "7.77.0" + "@sentry-internal/tracing" "7.84.0" + "@sentry/core" "7.84.0" + "@sentry/replay" "7.84.0" + "@sentry/types" "7.84.0" + "@sentry/utils" "7.84.0" -"@sentry/cli@^1.74.6": - version "1.75.0" - resolved "https://registry.npmjs.org/@sentry/cli/-/cli-1.75.0.tgz" - integrity sha512-vT8NurHy00GcN8dNqur4CMIYvFH3PaKdkX3qllVvi4syybKqjwoz+aWRCvprbYv0knweneFkLt1SmBWqazUMfA== +"@sentry/cli@^1.77.1": + version "1.77.1" + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.77.1.tgz#ebcf884712ef6c3c75443f491ec16f6a22148aec" + integrity sha512-OtJ7U9LeuPUAY/xow9wwcjM9w42IJIpDtClTKI/RliE685vd/OJUIpiAvebHNthDYpQynvwb/0iuF4fonh+CKw== dependencies: https-proxy-agent "^5.0.0" mkdirp "^0.5.5" @@ -3006,101 +3126,102 @@ proxy-from-env "^1.1.0" which "^2.0.2" -"@sentry/core@7.77.0": - version "7.77.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.77.0.tgz#21100843132beeeff42296c8370cdcc7aa1d8510" - integrity sha512-Tj8oTYFZ/ZD+xW8IGIsU6gcFXD/gfE+FUxUaeSosd9KHwBQNOLhZSsYo/tTVf/rnQI/dQnsd4onPZLiL+27aTg== +"@sentry/core@7.84.0": + version "7.84.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.84.0.tgz#01d33fc452044ffd8ea57b20f60304b9cfa2b9e1" + integrity sha512-tbuwunbBx2kSex15IHCqHDnrMfIlqPc6w/76fwkGqokz3oh9GSEGlLICwmBWL8AypWimUg13IDtFpD0TJTriWA== dependencies: - "@sentry/types" "7.77.0" - "@sentry/utils" "7.77.0" + "@sentry/types" "7.84.0" + "@sentry/utils" "7.84.0" -"@sentry/integrations@7.77.0": - version "7.77.0" - resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.77.0.tgz#f2717e05cb7c69363316ccd34096b2ea07ae4c59" - integrity sha512-P055qXgBHeZNKnnVEs5eZYLdy6P49Zr77A1aWJuNih/EenzMy922GOeGy2mF6XYrn1YJSjEwsNMNsQkcvMTK8Q== +"@sentry/integrations@7.84.0": + version "7.84.0" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.84.0.tgz#3b016903e08f0dade74bbc152ea5605e231e39cd" + integrity sha512-aUu95BhnHSf/W/F4BvsFnf4x+piHiah5a180YTMqWcHMkJr7MnCWNIad9RJuHlcINSfyHtUr5+Z4Bajzqg60lw== dependencies: - "@sentry/core" "7.77.0" - "@sentry/types" "7.77.0" - "@sentry/utils" "7.77.0" + "@sentry/core" "7.84.0" + "@sentry/types" "7.84.0" + "@sentry/utils" "7.84.0" localforage "^1.8.1" -"@sentry/nextjs@^7.77.0": - version "7.77.0" - resolved "https://registry.yarnpkg.com/@sentry/nextjs/-/nextjs-7.77.0.tgz#036b1c45dd106e01d44967c97985464e108922be" - integrity sha512-8tYPBt5luFjrng1sAMJqNjM9sq80q0jbt6yariADU9hEr7Zk8YqFaOI2/Q6yn9dZ6XyytIRtLEo54kk2AO94xw== +"@sentry/nextjs@^7.84.0": + version "7.84.0" + resolved "https://registry.yarnpkg.com/@sentry/nextjs/-/nextjs-7.84.0.tgz#f6ff11049c1934c378863a80d69ff8777fd8f853" + integrity sha512-MjOGR3AZDVYfBQX2jZaxBMl7JaDSbu6uoiycdT+cMCYq722aB9Wv8vUzsCTzzV4/JmCjJFbfSis7S2Vkw7/9FA== dependencies: "@rollup/plugin-commonjs" "24.0.0" - "@sentry/core" "7.77.0" - "@sentry/integrations" "7.77.0" - "@sentry/node" "7.77.0" - "@sentry/react" "7.77.0" - "@sentry/types" "7.77.0" - "@sentry/utils" "7.77.0" - "@sentry/vercel-edge" "7.77.0" - "@sentry/webpack-plugin" "1.20.0" + "@sentry/core" "7.84.0" + "@sentry/integrations" "7.84.0" + "@sentry/node" "7.84.0" + "@sentry/react" "7.84.0" + "@sentry/types" "7.84.0" + "@sentry/utils" "7.84.0" + "@sentry/vercel-edge" "7.84.0" + "@sentry/webpack-plugin" "1.21.0" chalk "3.0.0" resolve "1.22.8" rollup "2.78.0" stacktrace-parser "^0.1.10" -"@sentry/node@7.77.0": - version "7.77.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.77.0.tgz#a247452779a5bcb55724457707286e3e4a29dbbe" - integrity sha512-Ob5tgaJOj0OYMwnocc6G/CDLWC7hXfVvKX/ofkF98+BbN/tQa5poL+OwgFn9BA8ud8xKzyGPxGU6LdZ8Oh3z/g== +"@sentry/node@7.84.0": + version "7.84.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.84.0.tgz#c06167106796b2b83c0a9b52fa56f8ca820034ca" + integrity sha512-Xm3fIXT3TZOQi+6uQBavI8iOehD3PkY7v0y3hog0d4lQTH88vQK9BBsI+jZEq81Em+RG/u7vZNiFo6YMTnWF7Q== dependencies: - "@sentry-internal/tracing" "7.77.0" - "@sentry/core" "7.77.0" - "@sentry/types" "7.77.0" - "@sentry/utils" "7.77.0" + "@sentry-internal/tracing" "7.84.0" + "@sentry/core" "7.84.0" + "@sentry/types" "7.84.0" + "@sentry/utils" "7.84.0" https-proxy-agent "^5.0.0" -"@sentry/react@7.77.0": - version "7.77.0" - resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.77.0.tgz#9da14e4b21eae4b5a6306d39bb7c42ef0827d2c2" - integrity sha512-Q+htKzib5em0MdaQZMmPomaswaU3xhcVqmLi2CxqQypSjbYgBPPd+DuhrXKoWYLDDkkbY2uyfe4Lp3yLRWeXYw== +"@sentry/react@7.84.0": + version "7.84.0" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.84.0.tgz#2cb3192f7fb67b7696e8ece08d67229b193ddaa4" + integrity sha512-VQZrEHwPKCYTSbRYXD2ohXcQg99G1Hgs8eevRUuRpdChmA2e3z/RvT00NlaSNNZrS86wPyKpAK6kickB/eSYrw== dependencies: - "@sentry/browser" "7.77.0" - "@sentry/types" "7.77.0" - "@sentry/utils" "7.77.0" + "@sentry/browser" "7.84.0" + "@sentry/types" "7.84.0" + "@sentry/utils" "7.84.0" hoist-non-react-statics "^3.3.2" -"@sentry/replay@7.77.0": - version "7.77.0" - resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.77.0.tgz#21d242c9cd70a7235237216174873fd140b6eb80" - integrity sha512-M9Ik2J5ekl+C1Och3wzLRZVaRGK33BlnBwfwf3qKjgLDwfKW+1YkwDfTHbc2b74RowkJbOVNcp4m8ptlehlSaQ== +"@sentry/replay@7.84.0": + version "7.84.0" + resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.84.0.tgz#7e17876d9a1802ee33800e2b2cbda4e026c0a2af" + integrity sha512-c4PxT0ZpvkR9zXNfmAk3ojkm6eZ9+NlDze09RFBOCNo69QwIN90hnvbjXFC1+vRIJsfgo78Zr0ya/Wzb3Rog7Q== dependencies: - "@sentry-internal/tracing" "7.77.0" - "@sentry/core" "7.77.0" - "@sentry/types" "7.77.0" - "@sentry/utils" "7.77.0" + "@sentry-internal/tracing" "7.84.0" + "@sentry/core" "7.84.0" + "@sentry/types" "7.84.0" + "@sentry/utils" "7.84.0" -"@sentry/types@7.77.0": - version "7.77.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.77.0.tgz#c5d00fe547b89ccde59cdea59143bf145cee3144" - integrity sha512-nfb00XRJVi0QpDHg+JkqrmEBHsqBnxJu191Ded+Cs1OJ5oPXEW6F59LVcBScGvMqe+WEk1a73eH8XezwfgrTsA== +"@sentry/types@7.84.0": + version "7.84.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.84.0.tgz#e8db86c36c61659c3b2558f0aa8b6a073a756117" + integrity sha512-VqGLIF3JOUrk7yIXjLXJvAORkZL1e3dDX0Q1okRehwyt/5CRE+mdUTeJZkBo9P9mBwgMyvtwklzOGGrzjb4eMA== -"@sentry/utils@7.77.0": - version "7.77.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.77.0.tgz#1f88501f0b8777de31b371cf859d13c82ebe1379" - integrity sha512-NmM2kDOqVchrey3N5WSzdQoCsyDkQkiRxExPaNI2oKQ/jMWHs9yt0tSy7otPBcXs0AP59ihl75Bvm1tDRcsp5g== +"@sentry/utils@7.84.0": + version "7.84.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.84.0.tgz#32861d922fa31e86dd2863a1d9dfc5a369e98952" + integrity sha512-qdUVuxnRBvaf05AU+28R+xYtZmi/Ymf8os3Njq9g4XuA+QEkZLbzmIpRK5W9Ja7vUtjOeg29Xgg43A8znde9LQ== dependencies: - "@sentry/types" "7.77.0" + "@sentry/types" "7.84.0" -"@sentry/vercel-edge@7.77.0": - version "7.77.0" - resolved "https://registry.yarnpkg.com/@sentry/vercel-edge/-/vercel-edge-7.77.0.tgz#6a90a869878e4e78803c4331c30aea841fcc6a73" - integrity sha512-ffddPCgxVeAccPYuH5sooZeHBqDuJ9OIhIRYKoDi4TvmwAzWo58zzZWhRpkHqHgIQdQvhLVZ5F+FSQVWnYSOkw== +"@sentry/vercel-edge@7.84.0": + version "7.84.0" + resolved "https://registry.yarnpkg.com/@sentry/vercel-edge/-/vercel-edge-7.84.0.tgz#8e8d13ae0d0ca2334daba97d688b4e12c1ca905f" + integrity sha512-vabN7aUYdTFTbufoPBnp8DdD3PaaWmlSuGnFQWmAl8AXaR+tB/3wQPfNqcVDdVoyoe8MADHtmU4KHJdMJYgzhg== dependencies: - "@sentry/core" "7.77.0" - "@sentry/types" "7.77.0" - "@sentry/utils" "7.77.0" + "@sentry-internal/tracing" "7.84.0" + "@sentry/core" "7.84.0" + "@sentry/types" "7.84.0" + "@sentry/utils" "7.84.0" -"@sentry/webpack-plugin@1.20.0": - version "1.20.0" - resolved "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-1.20.0.tgz" - integrity sha512-Ssj1mJVFsfU6vMCOM2d+h+KQR7QHSfeIP16t4l20Uq/neqWXZUQ2yvQfe4S3BjdbJXz/X4Rw8Hfy1Sd0ocunYw== +"@sentry/webpack-plugin@1.21.0": + version "1.21.0" + resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-1.21.0.tgz#bbe7cb293751f80246a4a56f9a7dd6de00f14b58" + integrity sha512-x0PYIMWcsTauqxgl7vWUY6sANl+XGKtx7DCVnnY7aOIIlIna0jChTAPANTfA2QrK+VK+4I/4JxatCEZBnXh3Og== dependencies: - "@sentry/cli" "^1.74.6" + "@sentry/cli" "^1.77.1" webpack-sources "^2.0.0 || ^3.0.0" "@sinclair/typebox@^0.27.8": @@ -3130,10 +3251,10 @@ lodash.debounce "^4.0.8" react-merge-refs "^2.0.1" -"@splinetool/runtime@^0.9.482": - version "0.9.482" - resolved "https://registry.npmjs.org/@splinetool/runtime/-/runtime-0.9.482.tgz" - integrity sha512-AqLBmaACtF0gi1Xdt4ts+BMZKlnpgytoLUpa30dzer1s15Fy0Q1sU5v0BEpG29JN0DLEEdCTG3LCfNAg/jWtiQ== +"@splinetool/runtime@^0.9.521": + version "0.9.521" + resolved "https://registry.yarnpkg.com/@splinetool/runtime/-/runtime-0.9.521.tgz#e55b0cda37a29456642229006a5cabbc4d9faada" + integrity sha512-MJvC5ZDD6RYtOFEGiKkFw8q2X5CLc+T81lHymM/wCxAVeJ8MatYpCUtWQuOF/Loai2duYPadOGzZSqth/P9Mdw== dependencies: on-change "^4.0.0" semver-compare "^1.0.0" @@ -3570,10 +3691,10 @@ resolved "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz" integrity sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g== -"@types/debounce-promise@^3.1.7": - version "3.1.7" - resolved "https://registry.npmjs.org/@types/debounce-promise/-/debounce-promise-3.1.7.tgz" - integrity sha512-XzqG8zCd9n33gmusdQo0d4p9iRKg/mZbG52wfHxnuZZyeO68ryOT5xyv9Fk3vLAvQBUsHmSL14Cqpsx4jjzz1Q== +"@types/debounce-promise@^3.1.9": + version "3.1.9" + resolved "https://registry.yarnpkg.com/@types/debounce-promise/-/debounce-promise-3.1.9.tgz#b59346fe5c24636ebe0fb88f2f7e41b888b1cd7c" + integrity sha512-awNxydYSU+E2vL7EiOAMtiSOfL5gUM5X4YSE2A92qpxDJQ/rXz6oMPYBFDcDywlUmvIDI6zsqgq17cGm5CITQw== "@types/estree@*", "@types/estree@^1.0.0": version "1.0.0" @@ -3690,17 +3811,17 @@ dependencies: "@types/react" "*" -"@types/react-helmet@^6.1.9": - version "6.1.9" - resolved "https://registry.yarnpkg.com/@types/react-helmet/-/react-helmet-6.1.9.tgz#e79e0def2ad4047cb67e83c5be7cfb3d2121615a" - integrity sha512-nuOeTefP4yPTWHvjGksCBKb/4hsgJxSX7aSTjTIDFXJIkZ6Wo2Y4/cmE1FO9OlYBrHjKOer/0zLwY7s4qiQBtw== +"@types/react-helmet@^6.1.11": + version "6.1.11" + resolved "https://registry.yarnpkg.com/@types/react-helmet/-/react-helmet-6.1.11.tgz#8cafcafff38f75361f451563ba7b406b0c5d3907" + integrity sha512-0QcdGLddTERotCXo3VFlUSWO3ztraw8nZ6e3zJSgG7apwV5xt+pJUS8ewPBqT4NYB1optGLprNQzFleIY84u/g== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@18.2.33": - version "18.2.33" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.33.tgz#055356243dc4350a9ee6c6a2c07c5cae12e38877" - integrity sha512-v+I7S+hu3PIBoVkKGpSYYpiBT1ijqEzWpzQD62/jm4K74hPpSP7FF9BnKG6+fg2+62weJYkkBWDJlZt5JO/9hg== +"@types/react@*", "@types/react@18.2.41": + version "18.2.41" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.41.tgz#9eea044246bdb10510df89ef7f8422a8b6ad8fb9" + integrity sha512-CwOGr/PiLiNBxEBqpJ7fO3kocP/2SSuC9fpH5K7tusrg4xPSRT/193rzolYwQnTN02We/ATXKnb6GqA5w4fRxw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -4088,12 +4209,12 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.21.3" -ansi-escapes@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz" - integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== +ansi-escapes@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.0.tgz#8a13ce75286f417f1963487d86ba9f90dccf9947" + integrity sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw== dependencies: - type-fest "^1.0.2" + type-fest "^3.0.0" ansi-regex@^5.0.1: version "5.0.1" @@ -4124,7 +4245,7 @@ ansi-styles@^5.0.0: resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-styles@^6.0.0, ansi-styles@^6.1.0: +ansi-styles@^6.0.0, ansi-styles@^6.2.1: version "6.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== @@ -4723,13 +4844,13 @@ cli-cursor@^4.0.0: dependencies: restore-cursor "^4.0.0" -cli-truncate@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz" - integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== +cli-truncate@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== dependencies: slice-ansi "^5.0.0" - string-width "^5.0.0" + string-width "^7.0.0" client-only@0.0.1, client-only@^0.0.1: version "0.0.1" @@ -4793,11 +4914,27 @@ color-name@1.1.3: resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + colorette@^2.0.20: version "2.0.20" resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" @@ -5240,6 +5377,11 @@ detect-browser@5.3.0: resolved "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz" integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== +detect-libc@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" + integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" @@ -5377,11 +5519,6 @@ duplexify@^4.1.2: readable-stream "^3.1.1" stream-shift "^1.0.0" -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - eccrypto@1.1.6: version "1.1.6" resolved "https://registry.npmjs.org/eccrypto/-/eccrypto-1.1.6.tgz" @@ -5417,6 +5554,11 @@ emittery@^0.13.1: resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== +emoji-regex@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" + integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" @@ -5663,12 +5805,12 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-config-next@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.0.0.tgz#c896867c8f08dab65205fb3b4bcc5d9ab8646d08" - integrity sha512-jtXeE+/pGQ3h9n11QyyuPN50kO13GO5XvjU5ZRq6W+XTpOMjyobWmK2s7aowy0FtzA49krJzYzEU9s1RMwoJ6g== +eslint-config-next@^14.0.4: + version "14.0.4" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.0.4.tgz#7cd2c0a3b310203d41cf0dbf9d31f9b0a6235b4a" + integrity sha512-9/xbOHEQOmQtqvQ1UsTQZpnA7SlDMBtuKJ//S4JnoyK3oGLhILKXdBgu/UO7lQo/2xOykQULS1qQ6p2+EpHgAQ== dependencies: - "@next/eslint-plugin-next" "14.0.0" + "@next/eslint-plugin-next" "14.0.4" "@rushstack/eslint-patch" "^1.3.3" "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" eslint-import-resolver-node "^0.3.6" @@ -6267,6 +6409,11 @@ get-caller-file@^2.0.5: resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-east-asian-width@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e" + integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== + get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz" @@ -6732,6 +6879,11 @@ is-arrayish@^0.2.1: resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-async-function@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz" @@ -6807,6 +6959,13 @@ is-fullwidth-code-point@^4.0.0: resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== +is-fullwidth-code-point@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" + integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== + dependencies: + get-east-asian-width "^1.0.0" + is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" @@ -7634,7 +7793,12 @@ lie@3.1.1: dependencies: immediate "~3.0.5" -lilconfig@2.1.0, lilconfig@^2.0.5, lilconfig@^2.1.0: +lilconfig@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.0.0.tgz#f8067feb033b5b74dab4602a5f5029420be749bc" + integrity sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g== + +lilconfig@^2.0.5, lilconfig@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== @@ -7651,33 +7815,33 @@ link-module-alias@^1.2.0: dependencies: chalk "^2.4.1" -lint-staged@^15.0.1: - version "15.0.1" - resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.1.tgz" - integrity sha512-2IU5OWmCaxch0X0+IBF4/v7sutpB+F3qoXbro43pYjQTOo5wumckjxoxn47pQBqqBsCWrD5HnI2uG/zJA7isew== +lint-staged@^15.2.0: + version "15.2.0" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.0.tgz#3111534ca58096a3c8f70b044b6e7fe21b36f859" + integrity sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ== dependencies: chalk "5.3.0" commander "11.1.0" debug "4.3.4" execa "8.0.1" - lilconfig "2.1.0" - listr2 "7.0.1" + lilconfig "3.0.0" + listr2 "8.0.0" micromatch "4.0.5" pidtree "0.6.0" string-argv "0.3.2" - yaml "2.3.2" + yaml "2.3.4" -listr2@7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/listr2/-/listr2-7.0.1.tgz" - integrity sha512-nz+7hwgbDp8eWNoDgzdl4hA/xDSLrNRzPu1TLgOYs6l5Y+Ma6zVWWy9Oyt9TQFONwKoSPoka3H50D3vD5EuNwg== +listr2@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.0.0.tgz#aa7c230995f8ce378585f7c96c0c6d1cefa4700d" + integrity sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg== dependencies: - cli-truncate "^3.1.0" + cli-truncate "^4.0.0" colorette "^2.0.20" eventemitter3 "^5.0.1" - log-update "^5.0.1" + log-update "^6.0.0" rfdc "^1.3.0" - wrap-ansi "^8.1.0" + wrap-ansi "^9.0.0" load-tsconfig@^0.2.3: version "0.2.5" @@ -7740,16 +7904,16 @@ lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-update@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz" - integrity sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw== +log-update@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.0.0.tgz#0ddeb7ac6ad658c944c1de902993fce7c33f5e59" + integrity sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw== dependencies: - ansi-escapes "^5.0.0" + ansi-escapes "^6.2.0" cli-cursor "^4.0.0" - slice-ansi "^5.0.0" - strip-ansi "^7.0.1" - wrap-ansi "^8.0.1" + slice-ansi "^7.0.0" + strip-ansi "^7.1.0" + wrap-ansi "^9.0.0" long@^4.0.0: version "4.0.0" @@ -8664,20 +8828,18 @@ react-draggable@^4.4.6: clsx "^1.1.1" prop-types "^15.8.1" -react-fast-compare@^3.2.0: +react-fast-compare@^3.2.2: version "3.2.2" - resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== -react-helmet-async@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz" - integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== +react-helmet-async@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-2.0.3.tgz#904f79d906f91da6728dab6a062c3b8354930881" + integrity sha512-7/X3ehSCbjCaIljWa39Bb7F1Y2JWM23FN80kLozx2TdgzUmxKDSLN6qu06NG0Srzm8ljGOjgk7r7CXeEOx4MPw== dependencies: - "@babel/runtime" "^7.12.5" invariant "^2.2.4" - prop-types "^15.7.2" - react-fast-compare "^3.2.0" + react-fast-compare "^3.2.2" shallowequal "^1.1.0" react-is@^16.10.2, react-is@^16.13.1, react-is@^16.7.0: @@ -9215,6 +9377,35 @@ shallowequal@^1.1.0: resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== +sharp@^0.33.0: + version "0.33.0" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.0.tgz#95f77cda3684522e210ab55a167dad6cb5fbfe4f" + integrity sha512-99DZKudjm/Rmz+M0/26t4DKpXyywAOJaayGS9boEn7FvgtG0RYBi46uPE2c+obcJRtA3AZa0QwJot63gJQ1F0Q== + dependencies: + color "^4.2.3" + detect-libc "^2.0.2" + semver "^7.5.4" + optionalDependencies: + "@img/sharp-darwin-arm64" "0.33.0" + "@img/sharp-darwin-x64" "0.33.0" + "@img/sharp-libvips-darwin-arm64" "1.0.0" + "@img/sharp-libvips-darwin-x64" "1.0.0" + "@img/sharp-libvips-linux-arm" "1.0.0" + "@img/sharp-libvips-linux-arm64" "1.0.0" + "@img/sharp-libvips-linux-s390x" "1.0.0" + "@img/sharp-libvips-linux-x64" "1.0.0" + "@img/sharp-libvips-linuxmusl-arm64" "1.0.0" + "@img/sharp-libvips-linuxmusl-x64" "1.0.0" + "@img/sharp-linux-arm" "0.33.0" + "@img/sharp-linux-arm64" "0.33.0" + "@img/sharp-linux-s390x" "0.33.0" + "@img/sharp-linux-x64" "0.33.0" + "@img/sharp-linuxmusl-arm64" "0.33.0" + "@img/sharp-linuxmusl-x64" "0.33.0" + "@img/sharp-wasm32" "0.33.0" + "@img/sharp-win32-ia32" "0.33.0" + "@img/sharp-win32-x64" "0.33.0" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" @@ -9263,6 +9454,13 @@ signal-exit@^4.1.0: resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" @@ -9286,6 +9484,14 @@ slice-ansi@^5.0.0: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" +slice-ansi@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" + integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + snake-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz" @@ -9413,14 +9619,14 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.0, string-width@^5.0.1: - version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== +string-width@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.0.0.tgz#14aa1b7aaa126d5b64fa79d3c894da8a9650ba06" + integrity sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw== dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" string.prototype.matchall@^4.0.8: version "4.0.8" @@ -9507,9 +9713,9 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1: +strip-ansi@^7.1.0: version "7.1.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" @@ -9929,16 +10135,16 @@ type-fest@^0.7.1: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -type-fest@^1.0.2: - version "1.4.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== - type-fest@^2.5.2: version "2.19.0" resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== +type-fest@^3.0.0: + version "3.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" + integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== + typed-array-buffer@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz" @@ -10308,14 +10514,14 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== +wrap-ansi@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" + integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" wrappy@1: version "1.0.2" @@ -10383,10 +10589,10 @@ yallist@^4.0.0: resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@2.3.2, yaml@^2.1.1: - version "2.3.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz" - integrity sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg== +yaml@2.3.4, yaml@^2.1.1: + version "2.3.4" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" + integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== yargs-parser@^20.2.2: version "20.2.9"