From a391ba4bdd06e4fdf86517d63144590583db2fab Mon Sep 17 00:00:00 2001
From: Bayological <6872903+bayological@users.noreply.github.com>
Date: Mon, 16 Dec 2024 12:32:05 +0100
Subject: [PATCH 2/5] Release 2.3.2 (#170)
### Release Summary
This release for the following
- https://github.com/mento-protocol/mento-web/pull/166
- https://github.com/mento-protocol/mento-web/pull/165
---
package.json | 2 +-
src/components/nav/BalancesSummary.tsx | 10 ++++-
src/components/nav/NetworkModal.tsx | 16 ++++++--
src/config/consts.ts | 4 ++
src/features/swap/SwapConfirm.tsx | 53 ++++++++++++++++++++-----
src/features/swap/useAllowance.tsx | 43 ++++++++++++++++++++
src/features/swap/useSwapTransaction.ts | 4 +-
7 files changed, 116 insertions(+), 16 deletions(-)
create mode 100644 src/features/swap/useAllowance.tsx
diff --git a/package.json b/package.json
index b163f4b..5def85c 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@mento-protocol/mento-web",
- "version": "2.3.1",
+ "version": "2.3.2",
"description": "A simple DApp for Celo Mento exchanges",
"keywords": [
"Celo",
diff --git a/src/components/nav/BalancesSummary.tsx b/src/components/nav/BalancesSummary.tsx
index 033c041..38ce044 100644
--- a/src/components/nav/BalancesSummary.tsx
+++ b/src/components/nav/BalancesSummary.tsx
@@ -13,10 +13,16 @@ export function BalancesSummary() {
{tokenIds.map((id) => {
const balance = fromWeiRounded(balances[id], Tokens[id].decimals)
if (balance !== '0') {
+ const token = Tokens[id]
// TODO: @bayo Either revert this !== 0 check or add some animation for when balances are loading
return (
-
-
+
)
diff --git a/src/components/nav/NetworkModal.tsx b/src/components/nav/NetworkModal.tsx
index daf45c3..a75f02b 100644
--- a/src/components/nav/NetworkModal.tsx
+++ b/src/components/nav/NetworkModal.tsx
@@ -16,6 +16,7 @@ interface Props {
}
export function NetworkModal({ isOpen, close }: Props) {
+ const baseLocator = 'networkModal'
const latestBlock = useAppSelector((s) => s.block.latestBlock)
const chainId = useChainId()
const currentChain = chainIdToChain[chainId]
@@ -46,7 +47,10 @@ export function NetworkModal({ isOpen, close }: Props) {
Connected to:
-
+
{currentChain?.name || 'Unknown'}
@@ -55,7 +59,10 @@ export function NetworkModal({ isOpen, close }: Props) {
Block Number:
-
+
{latestBlock?.number || 'Unknown'}
@@ -64,7 +71,10 @@ export function NetworkModal({ isOpen, close }: Props) {
Node Rpc Url:
-
+
{shortenUrl(currentChain?.rpcUrl) || 'Unknown'}
diff --git a/src/config/consts.ts b/src/config/consts.ts
index 5c46d1d..a395c60 100644
--- a/src/config/consts.ts
+++ b/src/config/consts.ts
@@ -19,3 +19,7 @@ export const MAX_GAS_LIMIT = '10000000' // 10 million
export const MIN_ROUNDED_VALUE = 0.0001
export const DISPLAY_DECIMALS = 4
export const MAX_EXCHANGE_SPREAD = 0.1 // 10%
+
+export const ERC20_ABI = [
+ 'function allowance(address owner, address spender) view returns (uint256)',
+]
diff --git a/src/features/swap/SwapConfirm.tsx b/src/features/swap/SwapConfirm.tsx
index e64ad83..e2aa73f 100644
--- a/src/features/swap/SwapConfirm.tsx
+++ b/src/features/swap/SwapConfirm.tsx
@@ -1,3 +1,4 @@
+import BigNumber from 'bignumber.js'
import Lottie from 'lottie-react'
import { SVGProps, useEffect, useState } from 'react'
import mentoLoaderBlue from 'src/animations/Mentoloader_blue.json'
@@ -8,6 +9,7 @@ import { TokenId, Tokens } from 'src/config/tokens'
import { useAppDispatch, useAppSelector } from 'src/features/store/hooks'
import { setConfirmView, setFormValues } from 'src/features/swap/swapSlice'
import { SwapFormValues } from 'src/features/swap/types'
+import { useAllowance } from 'src/features/swap/useAllowance'
import { useApproveTransaction } from 'src/features/swap/useApproveTransaction'
import { useSwapQuote } from 'src/features/swap/useSwapQuote'
import { useSwapTransaction } from 'src/features/swap/useSwapTransaction'
@@ -90,6 +92,21 @@ export function SwapConfirmCard({ formValues }: Props) {
)
const [isApproveConfirmed, setApproveConfirmed] = useState(false)
+ const { allowance, isLoading: isAllowanceLoading } = useAllowance(chainId, fromTokenId, address)
+ const needsApproval = !isAllowanceLoading && new BigNumber(allowance).lte(approveAmount)
+ const skipApprove = !isAllowanceLoading && !needsApproval
+
+ logger.info(`Allowance loading: ${isAllowanceLoading}`)
+ logger.info(`Needs approval: ${needsApproval}`)
+
+ useEffect(() => {
+ if (skipApprove) {
+ // Enables swap transaction preparation when approval isn't needed
+ // See useSwapTransaction hook for more details
+ setApproveConfirmed(true)
+ }
+ }, [skipApprove])
+
const { sendSwapTx, isSwapTxLoading, isSwapTxSuccess } = useSwapTransaction(
chainId,
fromTokenId,
@@ -104,13 +121,29 @@ export function SwapConfirmCard({ formValues }: Props) {
const onSubmit = async () => {
if (!rate || !amountWei || !address || !isConnected) return
+ setIsModalOpen(true)
+
+ if (skipApprove && sendSwapTx) {
+ try {
+ logger.info('Skipping approve, sending swap tx directly')
+ const swapResult = await sendSwapTx()
+ const swapReceipt = await swapResult.wait(1)
+ logger.info(`Tx receipt received for swap: ${swapReceipt?.transactionHash}`)
+ toastToYourSuccess('Swap Complete!', swapReceipt?.transactionHash, chainId)
+ dispatch(setFormValues(null))
+ } catch (error) {
+ logger.error('Failed to execute swap', error)
+ } finally {
+ setIsModalOpen(false)
+ }
+ return
+ }
+
if (!sendApproveTx || isApproveTxSuccess || isApproveTxLoading) {
logger.debug('Approve already started or finished, ignoring submit')
return
}
- setIsModalOpen(true)
-
try {
logger.info('Sending approve tx')
const approveResult = await sendApproveTx()
@@ -207,7 +240,7 @@ export function SwapConfirmCard({ formValues }: Props) {
close={() => setIsModalOpen(false)}
width="max-w-[432px]"
>
-
+
)
@@ -271,7 +304,7 @@ const ChevronRight = (props: SVGProps
) => (
)
-const MentoLogoLoader = () => {
+const MentoLogoLoader = ({ needsApproval }: { needsApproval: boolean }) => {
const { connector } = useAccount()
return (
@@ -286,12 +319,14 @@ const MentoLogoLoader = () => {
-
- Sending two transactions: Approve and Swap
+
+ {needsApproval
+ ? 'Sending two transactions: Approve and Swap'
+ : 'Sending swap transaction'}
+
+
+ {`Sign with ${connector?.name || 'wallet'} to proceed`}
-
{`Sign with ${
- connector?.name || 'wallet'
- } to proceed`}
>
)
diff --git a/src/features/swap/useAllowance.tsx b/src/features/swap/useAllowance.tsx
new file mode 100644
index 0000000..467bab6
--- /dev/null
+++ b/src/features/swap/useAllowance.tsx
@@ -0,0 +1,43 @@
+import { useQuery } from '@tanstack/react-query'
+import { Contract } from 'ethers'
+import { ERC20_ABI } from 'src/config/consts'
+import { BrokerAddresses } from 'src/config/exchanges'
+import { TokenId, getTokenAddress } from 'src/config/tokens'
+import { getProvider } from 'src/features/providers'
+import { logger } from 'src/utils/logger'
+
+async function fetchAllowance(
+ tokenAddr: string,
+ accountAddress: string,
+ chainId: number
+): Promise
{
+ logger.info(`Fetching allowance for token ${tokenAddr} on chain ${chainId}`)
+ const provider = getProvider(chainId)
+ const contract = new Contract(tokenAddr, ERC20_ABI, provider)
+ const brokerAddress = BrokerAddresses[chainId as keyof typeof BrokerAddresses]
+
+ const allowance = await contract.allowance(accountAddress, brokerAddress)
+ logger.info(`Allowance: ${allowance.toString()}`)
+ return allowance.toString()
+}
+
+export function useAllowance(chainId: number, tokenId: TokenId, accountAddress?: string) {
+ const { data: allowance, isLoading } = useQuery(
+ ['tokenAllowance', chainId, tokenId, accountAddress],
+ async () => {
+ if (!accountAddress) return '0'
+ const tokenAddr = getTokenAddress(tokenId, chainId)
+ return fetchAllowance(tokenAddr, accountAddress, chainId)
+ },
+ {
+ retry: false,
+ enabled: Boolean(accountAddress && chainId && tokenId),
+ staleTime: 5000, // Consider allowance stale after 5 seconds
+ }
+ )
+
+ return {
+ allowance: allowance || '0',
+ isLoading,
+ }
+}
diff --git a/src/features/swap/useSwapTransaction.ts b/src/features/swap/useSwapTransaction.ts
index 6680883..3532161 100644
--- a/src/features/swap/useSwapTransaction.ts
+++ b/src/features/swap/useSwapTransaction.ts
@@ -36,8 +36,10 @@ export function useSwapTransaction(
!isApproveConfirmed ||
new BigNumber(amountInWei).lte(0) ||
new BigNumber(thresholdAmountInWei).lte(0)
- )
+ ) {
+ logger.debug('Skipping swap transaction')
return null
+ }
const sdk = await getMentoSdk(chainId)
const fromTokenAddr = getTokenAddress(fromToken, chainId)
const toTokenAddr = getTokenAddress(toToken, chainId)
From 37676a5f442779e6155f79f675c8a5679dfb31dc Mon Sep 17 00:00:00 2001
From: Bayological <6872903+bayological@users.noreply.github.com>
Date: Tue, 17 Dec 2024 14:02:32 +0000
Subject: [PATCH 3/5] Release 2.3.3 (#172)
---
package.json | 2 +-
src/features/swap/SwapForm.tsx | 2 +-
src/features/swap/useSwapQuote.ts | 2 +-
src/utils/amount.ts | 6 +++---
4 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/package.json b/package.json
index 5def85c..4f15f72 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@mento-protocol/mento-web",
- "version": "2.3.2",
+ "version": "2.3.3",
"description": "A simple DApp for Celo Mento exchanges",
"keywords": [
"Celo",
diff --git a/src/features/swap/SwapForm.tsx b/src/features/swap/SwapForm.tsx
index 3da54fd..370ce6d 100644
--- a/src/features/swap/SwapForm.tsx
+++ b/src/features/swap/SwapForm.tsx
@@ -332,7 +332,7 @@ function SubmitButton() {
const showLongError = typeof error === 'string' && error?.length > 50
return (
-
+
{showLongError ? (
{error}
) : null}
diff --git a/src/features/swap/useSwapQuote.ts b/src/features/swap/useSwapQuote.ts
index 5510006..f6842ba 100644
--- a/src/features/swap/useSwapQuote.ts
+++ b/src/features/swap/useSwapQuote.ts
@@ -48,7 +48,7 @@ export function useSwapQuote(
quoteWei = (await mento.getAmountIn(fromTokenAddr, toTokenAddr, amountWeiBN)).toString()
}
- const quote = fromWei(quoteWei, quoteDecimals).toString()
+ const quote = fromWei(quoteWei, quoteDecimals)
const rateIn = calcExchangeRate(amountWei, amountDecimals, quoteWei, quoteDecimals)
const rate = isSwapIn ? rateIn : invertExchangeRate(rateIn)
diff --git a/src/utils/amount.ts b/src/utils/amount.ts
index b5eb359..f3a98d6 100644
--- a/src/utils/amount.ts
+++ b/src/utils/amount.ts
@@ -11,11 +11,11 @@ export type NumberT = BigNumber.Value
export function fromWei(
value: NumberT | null | undefined,
decimals = STANDARD_TOKEN_DECIMALS
-): number {
- if (!value) return 0
+): string {
+ if (!value) return '0'
const valueString = value.toString().trim()
const flooredValue = new BigNumber(valueString).toFixed(0, BigNumber.ROUND_FLOOR)
- return parseFloat(formatUnits(flooredValue, decimals))
+ return formatUnits(flooredValue, decimals)
}
// Similar to fromWei above but rounds to set number of decimals
From 88c11a9a0913796dea744555bf967badbb4fcd08 Mon Sep 17 00:00:00 2001
From: Ryan Noble
Date: Wed, 18 Dec 2024 12:43:37 +0200
Subject: [PATCH 4/5] Feat: adding balance check logic (#169)
### Description
This PR adds a check to ensure that the balance has loaded as part of
the submit logic
### Related issues
### Checklist before requesting a review
- [x] I have performed a self-review of my own code
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] The PR title follows the
[conventions](https://www.notion.so/Git-Branching-and-Commit-Message-Conventions-18f66f7d06444cfcbac5725ffbc7c04a?pvs=4#9355048863c549ef92fe210a8a1298aa)
- [ ] I have run the [regression
tests](https://www.notion.so/Mento-Web-App-Regression-Tests-37bd43a7da8d4e38b65993320a33d557)
---------
Co-authored-by: Bayological <6872903+bayological@users.noreply.github.com>
Co-authored-by: Gabriel Temsten <57184013+gabrieltemtsen@users.noreply.github.com>
Co-authored-by: Andrew718PLTS
Co-authored-by: Andrew718PLTS
---
src/features/swap/SwapForm.tsx | 4 ++--
src/features/swap/useFormValidator.ts | 5 +++--
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/features/swap/SwapForm.tsx b/src/features/swap/SwapForm.tsx
index 370ce6d..b8e567f 100644
--- a/src/features/swap/SwapForm.tsx
+++ b/src/features/swap/SwapForm.tsx
@@ -60,7 +60,7 @@ export function SwapFormCard() {
}
function SwapForm() {
- const balances = useAppSelector((s) => s.account.balances)
+ const { balances, lastUpdated } = useAppSelector((s) => s.account)
const { showSlippage } = useAppSelector((s) => s.swap)
const dispatch = useAppDispatch()
@@ -68,7 +68,7 @@ function SwapForm() {
dispatch(setFormValues(values))
dispatch(setConfirmView(true)) // Switch to confirm view
}
- const validateForm = useFormValidator(balances)
+ const validateForm = useFormValidator(balances, lastUpdated)
const storedFormValues = useAppSelector((s) => s.swap.formValues) // Get stored form values
const initialFormValues = storedFormValues || initialValues // Use stored values if they exist
diff --git a/src/features/swap/useFormValidator.ts b/src/features/swap/useFormValidator.ts
index 410731f..4f26f1a 100644
--- a/src/features/swap/useFormValidator.ts
+++ b/src/features/swap/useFormValidator.ts
@@ -9,11 +9,12 @@ import { areAmountsNearlyEqual, parseAmount, toWei } from 'src/utils/amount'
import { logger } from 'src/utils/logger'
import { useChainId } from 'wagmi'
-export function useFormValidator(balances: AccountBalances) {
+export function useFormValidator(balances: AccountBalances, lastUpdated: number | null) {
const chainId = useChainId()
return useCallback(
(values?: SwapFormValues): Promise> => {
return (async () => {
+ if (!lastUpdated) return { fromTokenId: 'Balance still loading' }
if (!values || !values.amount) return { amount: 'Amount Required' }
const parsedAmount = parseAmount(values.amount)
if (!parsedAmount) return { amount: 'Amount is Invalid' }
@@ -33,7 +34,7 @@ export function useFormValidator(balances: AccountBalances) {
return {}
})
},
- [balances, chainId]
+ [balances, chainId, lastUpdated]
)
}
From ffafb172b39c7bcc27279772a4bb6d2c1b010d70 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 19 Dec 2024 08:02:27 +0100
Subject: [PATCH 5/5] chore(deps): bump next from 13.5.7-canary.37 to 14.2.15
(#174)
Bumps [next](https://github.com/vercel/next.js) from 13.5.7-canary.37 to
14.2.15.
Commits
[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=next&package-manager=npm_and_yarn&previous-version=13.5.7-canary.37&new-version=14.2.15)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/mento-protocol/mento-web/network/alerts).
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ryan Noble
---
package.json | 2 +-
yarn.lock | 145 ++++++++++++++++++++++++++-------------------------
2 files changed, 74 insertions(+), 73 deletions(-)
diff --git a/package.json b/package.json
index 4f15f72..5105a33 100644
--- a/package.json
+++ b/package.json
@@ -45,7 +45,7 @@
"frappe-charts": "^1.6.2",
"jsbi": "^4.3.0",
"lottie-react": "^2.4.0",
- "next": "13.5.7-canary.37",
+ "next": "14.2.15",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-redux": "^8.1.0",
diff --git a/yarn.lock b/yarn.lock
index 1cf8c82..e8e44b5 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1940,7 +1940,7 @@ __metadata:
jest: ^29.5.0
jsbi: ^4.3.0
lottie-react: ^2.4.0
- next: 13.5.7-canary.37
+ next: 14.2.15
postcss: ^8.4.32
prettier: ^2.8.8
react: ^18.2.0
@@ -2124,10 +2124,10 @@ __metadata:
languageName: node
linkType: hard
-"@next/env@npm:13.5.7-canary.37":
- version: 13.5.7-canary.37
- resolution: "@next/env@npm:13.5.7-canary.37"
- checksum: cbeba53f806a30fdbbbaa48785b0784702953d2e4e3a7bc6a14cb7e6e6e005232050cc627368b233257b1d60bcc41af5cfd6d0ee789497e4c4736f40e3956177
+"@next/env@npm:14.2.15":
+ version: 14.2.15
+ resolution: "@next/env@npm:14.2.15"
+ checksum: bf794604ee62e86ca092120c790815c0caf367009966baa14e75dbd8454a59df524327539d5febc7da42841c3bf6a10443ae0f95280599352a8def56291857fd
languageName: node
linkType: hard
@@ -2140,65 +2140,65 @@ __metadata:
languageName: node
linkType: hard
-"@next/swc-darwin-arm64@npm:13.5.7-canary.37":
- version: 13.5.7-canary.37
- resolution: "@next/swc-darwin-arm64@npm:13.5.7-canary.37"
+"@next/swc-darwin-arm64@npm:14.2.15":
+ version: 14.2.15
+ resolution: "@next/swc-darwin-arm64@npm:14.2.15"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
-"@next/swc-darwin-x64@npm:13.5.7-canary.37":
- version: 13.5.7-canary.37
- resolution: "@next/swc-darwin-x64@npm:13.5.7-canary.37"
+"@next/swc-darwin-x64@npm:14.2.15":
+ version: 14.2.15
+ resolution: "@next/swc-darwin-x64@npm:14.2.15"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
-"@next/swc-linux-arm64-gnu@npm:13.5.7-canary.37":
- version: 13.5.7-canary.37
- resolution: "@next/swc-linux-arm64-gnu@npm:13.5.7-canary.37"
+"@next/swc-linux-arm64-gnu@npm:14.2.15":
+ version: 14.2.15
+ resolution: "@next/swc-linux-arm64-gnu@npm:14.2.15"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
-"@next/swc-linux-arm64-musl@npm:13.5.7-canary.37":
- version: 13.5.7-canary.37
- resolution: "@next/swc-linux-arm64-musl@npm:13.5.7-canary.37"
+"@next/swc-linux-arm64-musl@npm:14.2.15":
+ version: 14.2.15
+ resolution: "@next/swc-linux-arm64-musl@npm:14.2.15"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
-"@next/swc-linux-x64-gnu@npm:13.5.7-canary.37":
- version: 13.5.7-canary.37
- resolution: "@next/swc-linux-x64-gnu@npm:13.5.7-canary.37"
+"@next/swc-linux-x64-gnu@npm:14.2.15":
+ version: 14.2.15
+ resolution: "@next/swc-linux-x64-gnu@npm:14.2.15"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
-"@next/swc-linux-x64-musl@npm:13.5.7-canary.37":
- version: 13.5.7-canary.37
- resolution: "@next/swc-linux-x64-musl@npm:13.5.7-canary.37"
+"@next/swc-linux-x64-musl@npm:14.2.15":
+ version: 14.2.15
+ resolution: "@next/swc-linux-x64-musl@npm:14.2.15"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
-"@next/swc-win32-arm64-msvc@npm:13.5.7-canary.37":
- version: 13.5.7-canary.37
- resolution: "@next/swc-win32-arm64-msvc@npm:13.5.7-canary.37"
+"@next/swc-win32-arm64-msvc@npm:14.2.15":
+ version: 14.2.15
+ resolution: "@next/swc-win32-arm64-msvc@npm:14.2.15"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
-"@next/swc-win32-ia32-msvc@npm:13.5.7-canary.37":
- version: 13.5.7-canary.37
- resolution: "@next/swc-win32-ia32-msvc@npm:13.5.7-canary.37"
+"@next/swc-win32-ia32-msvc@npm:14.2.15":
+ version: 14.2.15
+ resolution: "@next/swc-win32-ia32-msvc@npm:14.2.15"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
-"@next/swc-win32-x64-msvc@npm:13.5.7-canary.37":
- version: 13.5.7-canary.37
- resolution: "@next/swc-win32-x64-msvc@npm:13.5.7-canary.37"
+"@next/swc-win32-x64-msvc@npm:14.2.15":
+ version: 14.2.15
+ resolution: "@next/swc-win32-x64-msvc@npm:14.2.15"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
@@ -2633,12 +2633,20 @@ __metadata:
languageName: node
linkType: hard
-"@swc/helpers@npm:0.5.2":
- version: 0.5.2
- resolution: "@swc/helpers@npm:0.5.2"
+"@swc/counter@npm:^0.1.3":
+ version: 0.1.3
+ resolution: "@swc/counter@npm:0.1.3"
+ checksum: df8f9cfba9904d3d60f511664c70d23bb323b3a0803ec9890f60133954173047ba9bdeabce28cd70ba89ccd3fd6c71c7b0bd58be85f611e1ffbe5d5c18616598
+ languageName: node
+ linkType: hard
+
+"@swc/helpers@npm:0.5.5":
+ version: 0.5.5
+ resolution: "@swc/helpers@npm:0.5.5"
dependencies:
+ "@swc/counter": ^0.1.3
tslib: ^2.4.0
- checksum: 51d7e3d8bd56818c49d6bfbd715f0dbeedc13cf723af41166e45c03e37f109336bbcb57a1f2020f4015957721aeb21e1a7fff281233d797ff7d3dd1f447fa258
+ checksum: d4f207b191e54b29460804ddf2984ba6ece1d679a0b2f6a9c765dcf27bba92c5769e7965668a4546fb9f1021eaf0ff9be4bf5c235ce12adcd65acdfe77187d11
languageName: node
linkType: hard
@@ -4652,13 +4660,20 @@ __metadata:
languageName: node
linkType: hard
-"caniuse-lite@npm:^1.0.30001400, caniuse-lite@npm:^1.0.30001406, caniuse-lite@npm:^1.0.30001449, caniuse-lite@npm:^1.0.30001464":
+"caniuse-lite@npm:^1.0.30001400, caniuse-lite@npm:^1.0.30001449, caniuse-lite@npm:^1.0.30001464":
version: 1.0.30001568
resolution: "caniuse-lite@npm:1.0.30001568"
checksum: 7092aaa246dc8531fbca5b47be91e92065db7e5c04cc9e3d864e848f8f1be769ac6754429e843a5e939f7331a771e8b0a1bc3b13495c66b748c65e2f5bdb1220
languageName: node
linkType: hard
+"caniuse-lite@npm:^1.0.30001579":
+ version: 1.0.30001690
+ resolution: "caniuse-lite@npm:1.0.30001690"
+ checksum: f2c1b595f15d8de4d9ccd155d61ac9f00ac62f1515870505a0186266fd52aef169fcddc90d8a4814e52b77107244806466fadc2c216662f23f1022a430e735ee
+ languageName: node
+ linkType: hard
+
"case@npm:^1.6.3":
version: 1.6.3
resolution: "case@npm:1.6.3"
@@ -6376,13 +6391,6 @@ __metadata:
languageName: node
linkType: hard
-"glob-to-regexp@npm:^0.4.1":
- version: 0.4.1
- resolution: "glob-to-regexp@npm:0.4.1"
- checksum: e795f4e8f06d2a15e86f76e4d92751cf8bbfcf0157cea5c2f0f35678a8195a750b34096b1256e436f0cebc1883b5ff0888c47348443e69546a5a87f9e1eb1167
- languageName: node
- linkType: hard
-
"glob@npm:7.1.6":
version: 7.1.6
resolution: "glob@npm:7.1.6"
@@ -6490,7 +6498,7 @@ __metadata:
languageName: node
linkType: hard
-"graceful-fs@npm:^4.1.2":
+"graceful-fs@npm:^4.2.11":
version: 4.2.11
resolution: "graceful-fs@npm:4.2.11"
checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7
@@ -8448,28 +8456,29 @@ __metadata:
languageName: node
linkType: hard
-"next@npm:13.5.7-canary.37":
- version: 13.5.7-canary.37
- resolution: "next@npm:13.5.7-canary.37"
+"next@npm:14.2.15":
+ version: 14.2.15
+ resolution: "next@npm:14.2.15"
dependencies:
- "@next/env": 13.5.7-canary.37
- "@next/swc-darwin-arm64": 13.5.7-canary.37
- "@next/swc-darwin-x64": 13.5.7-canary.37
- "@next/swc-linux-arm64-gnu": 13.5.7-canary.37
- "@next/swc-linux-arm64-musl": 13.5.7-canary.37
- "@next/swc-linux-x64-gnu": 13.5.7-canary.37
- "@next/swc-linux-x64-musl": 13.5.7-canary.37
- "@next/swc-win32-arm64-msvc": 13.5.7-canary.37
- "@next/swc-win32-ia32-msvc": 13.5.7-canary.37
- "@next/swc-win32-x64-msvc": 13.5.7-canary.37
- "@swc/helpers": 0.5.2
+ "@next/env": 14.2.15
+ "@next/swc-darwin-arm64": 14.2.15
+ "@next/swc-darwin-x64": 14.2.15
+ "@next/swc-linux-arm64-gnu": 14.2.15
+ "@next/swc-linux-arm64-musl": 14.2.15
+ "@next/swc-linux-x64-gnu": 14.2.15
+ "@next/swc-linux-x64-musl": 14.2.15
+ "@next/swc-win32-arm64-msvc": 14.2.15
+ "@next/swc-win32-ia32-msvc": 14.2.15
+ "@next/swc-win32-x64-msvc": 14.2.15
+ "@swc/helpers": 0.5.5
busboy: 1.6.0
- caniuse-lite: ^1.0.30001406
+ caniuse-lite: ^1.0.30001579
+ graceful-fs: ^4.2.11
postcss: 8.4.31
styled-jsx: 5.1.1
- watchpack: 2.4.0
peerDependencies:
"@opentelemetry/api": ^1.1.0
+ "@playwright/test": ^1.41.2
react: ^18.2.0
react-dom: ^18.2.0
sass: ^1.3.0
@@ -8495,11 +8504,13 @@ __metadata:
peerDependenciesMeta:
"@opentelemetry/api":
optional: true
+ "@playwright/test":
+ optional: true
sass:
optional: true
bin:
next: dist/bin/next
- checksum: 1b10587ee764d86e4a9135359fdf6d636f549326518a8c45efdbc6fc55ad8dd4e3214d6db7bc0ec35992b87c07ae34da4452a794c16a60e1aa59d5f324ce0183
+ checksum: bed22817ea82c679e78c1f1e6530991ae89f3c51d547a876dddcda4a3b34cbb970af7c714793e1a1f0a1974859ccc97e10b5aceb61e9807ea94318116e8e7dd6
languageName: node
linkType: hard
@@ -11068,16 +11079,6 @@ __metadata:
languageName: node
linkType: hard
-"watchpack@npm:2.4.0":
- version: 2.4.0
- resolution: "watchpack@npm:2.4.0"
- dependencies:
- glob-to-regexp: ^0.4.1
- graceful-fs: ^4.1.2
- checksum: 23d4bc58634dbe13b86093e01c6a68d8096028b664ab7139d58f0c37d962d549a940e98f2f201cecdabd6f9c340338dc73ef8bf094a2249ef582f35183d1a131
- languageName: node
- linkType: hard
-
"webextension-polyfill-ts@npm:^0.22.0":
version: 0.22.0
resolution: "webextension-polyfill-ts@npm:0.22.0"