diff --git a/.env.example b/.env.example index 59830e7ce..1ef6dbcb2 100644 --- a/.env.example +++ b/.env.example @@ -11,6 +11,8 @@ EL_RPC_URLS_17000= EL_RPC_URLS_11155111= EL_RPC_URLS_10= EL_RPC_URLS_11155420= +EL_RPC_URLS_1868=https://rpc.soneium.org +EL_RPC_URLS_1946=https://rpc.minato.soneium.org # IPFS prefill RPC URLs - list of URLs delimited by commas PREFILL_UNSAFE_EL_RPC_URLS_1= @@ -18,6 +20,8 @@ PREFILL_UNSAFE_EL_RPC_URLS_17000= PREFILL_UNSAFE_EL_RPC_URLS_11155111= PREFILL_UNSAFE_EL_RPC_URLS_10= PREFILL_UNSAFE_EL_RPC_URLS_11155420= +PREFILL_UNSAFE_EL_RPC_URLS_1868= +PREFILL_UNSAFE_EL_RPC_URLS_1946= # supported networks for connecting wallet SUPPORTED_CHAINS=1,17000,11155111,1115542 diff --git a/IPFS.json b/IPFS.json index 88a167339..d25b14fc4 100644 --- a/IPFS.json +++ b/IPFS.json @@ -5,7 +5,7 @@ "config": { "enabledWithdrawalDexes": ["one-inch", "paraswap", "bebop"], "multiChainBanner": [ - 324, 10, 42161, 137, 8453, 5000, 59144, 534352, 56, 34443, 48900 + 324, 10, 42161, 137, 8453, 5000, 59144, 534352, 56, 34443, 48900, 1868 ], "featureFlags": {} } diff --git a/assets/icons/chain-toggler/soneium.svg b/assets/icons/chain-toggler/soneium.svg new file mode 100644 index 000000000..977571689 --- /dev/null +++ b/assets/icons/chain-toggler/soneium.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/icons/lido-multichain/soneium.svg b/assets/icons/lido-multichain/soneium.svg new file mode 100644 index 000000000..54c3f2073 --- /dev/null +++ b/assets/icons/lido-multichain/soneium.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/config/get-secret-config.ts b/config/get-secret-config.ts index 4c67c6103..e383b9253 100644 --- a/config/get-secret-config.ts +++ b/config/get-secret-config.ts @@ -14,6 +14,10 @@ export type SecretConfigType = Modify< rpcUrls_10: [string, ...string[]]; rpcUrls_11155420: [string, ...string[]]; + + rpcUrls_1868: [string, ...string[]]; + rpcUrls_1946: [string, ...string[]]; + // Dynamic keys like rpcUrls_ [key: `rpcUrls_${number}`]: string[]; @@ -55,6 +59,15 @@ export const getSecretConfig = (): SecretConfigType => { rpcUrls_11155420: (serverRuntimeConfig.rpcUrls_11155420?.split(',') ?? []) as [string, ...string[]], + rpcUrls_1868: (serverRuntimeConfig.rpcUrls_1868?.split(',') ?? []) as [ + string, + ...string[], + ], + rpcUrls_1946: (serverRuntimeConfig.rpcUrls_1946?.split(',') ?? []) as [ + string, + ...string[], + ], + cspReportOnly: toBoolean(serverRuntimeConfig.cspReportOnly), rateLimit: Number(serverRuntimeConfig.rateLimit) || 100, diff --git a/config/user-config/types.ts b/config/user-config/types.ts index e03070156..944230a0b 100644 --- a/config/user-config/types.ts +++ b/config/user-config/types.ts @@ -9,6 +9,8 @@ export type UserConfigDefaultType = { [CHAINS.Sepolia]: string[]; [CHAINS.OptimismSepolia]: string[]; [CHAINS.Optimism]: string[]; + [CHAINS.Soneium]: string[]; + [CHAINS.SoneiumMinato]: string[]; }; walletconnectProjectId: string | undefined; }; diff --git a/config/user-config/utils.ts b/config/user-config/utils.ts index 937466246..dd2a35210 100644 --- a/config/user-config/utils.ts +++ b/config/user-config/utils.ts @@ -18,6 +18,8 @@ export const getUserConfigDefault = (): UserConfigDefaultType => { [CHAINS.Sepolia]: config.prefillUnsafeElRpcUrls11155111, [CHAINS.Optimism]: config.prefillUnsafeElRpcUrls10, [CHAINS.OptimismSepolia]: config.prefillUnsafeElRpcUrls11155420, + [CHAINS.Soneium]: config.prefillUnsafeElRpcUrls1868, + [CHAINS.SoneiumMinato]: config.prefillUnsafeElRpcUrls1946, }, walletconnectProjectId: config.walletconnectProjectId, }; diff --git a/consts/chains.ts b/consts/chains.ts index dde822a08..dd5d344e8 100644 --- a/consts/chains.ts +++ b/consts/chains.ts @@ -6,6 +6,8 @@ export enum CHAINS { Sepolia = 11155111, Optimism = 10, OptimismSepolia = 11155420, + Soneium = 1868, + SoneiumMinato = 1946, } export enum LIDO_MULTICHAIN_CHAINS { @@ -22,6 +24,7 @@ export enum LIDO_MULTICHAIN_CHAINS { 'Zircuit Chain' = 48900, Unichain = 130, Metis = 1088, + Soneium = 1868, } // TODO: move to @lidofinance/lido-ethereum-sdk package diff --git a/consts/matomo-click-events.ts b/consts/matomo-click-events.ts index d8042113c..11d02c810 100644 --- a/consts/matomo-click-events.ts +++ b/consts/matomo-click-events.ts @@ -35,17 +35,29 @@ export const enum MATOMO_CLICK_EVENTS_TYPES { faqHowCanIUnstakeStEthIntegrations = 'faqHowCanIUnstakeStEthIntegrations', faqHowCanIGetWstethWrapLink = 'faqHowCanIGetWstethWrapLink', faqHowCanIGetWstethIntegrationsLink = 'faqHowCanIGetWstethIntegrationsLink', - faqHowCanIGetWstethOnOptimismWrapLink = 'faqHowCanIGetWstethOnOptimismWrapLink', - faqHowCanIGetWstethOnOptimismBridgeYourWstETHFromEthereumToOptimism = 'faqHowCanIGetWstethOnOptimismBridgeYourWstETHFromEthereumToOptimism', - faqHowCanIGetWstethOnOptimismIntegrations = 'faqHowCanIGetWstethOnOptimismIntegrations', faqHowDoIUnwrapWstethUnwrapLink = 'faqHowDoIUnwrapWstethUnwrapLink', faqHowCanIUseWstethLidoMultichain = 'faqHowCanIUseWstethLidoMultichain', faqHowCanIUseWstethDefiProtocols = 'faqHowCanIUseWstethDefiProtocols', - faqHowCanIUseWstethOnOptimismDefiProtocols = 'faqHowCanIUseWstethOnOptimismDefiProtocols', faqDoINeedToUnwrapMyWstethWithdrawalsTabs = 'faqDoINeedToUnwrapMyWstethWithdrawalsTabs', + + // Optimism + faqHowCanIGetWstethOnOptimismWrapLink = 'faqHowCanIGetWstethOnOptimismWrapLink', + faqHowCanIGetWstethOnOptimismBridgeYourWstETHFromEthereumToOptimism = 'faqHowCanIGetWstethOnOptimismBridgeYourWstETHFromEthereumToOptimism', + faqHowCanIGetWstethOnOptimismIntegrations = 'faqHowCanIGetWstethOnOptimismIntegrations', + faqHowCanIUseWstethOnOptimismDefiProtocols = 'faqHowCanIUseWstethOnOptimismDefiProtocols', faqHowCouldIUnwrapWstETHBackToStETHOnOptimismUnwrapLink = 'faqHowCouldIUnwrapWstETHBackToStETHOnOptimismUnwrapLink', faqWhatHappensIfIWantToUnstakeETHOnEthereumCanIDoThatFromOptimismBridgeYourWstETHOrStETHBack = 'faqWhatHappensIfIWantToUnstakeETHOnEthereumCanIDoThatFromOptimismBridgeYourWstETHOrStETHBack', faqWhatHappensIfIWantToUnstakeETHOnEthereumCanIDoThatFromOptimismWithdrawalsRequestAndClaim = 'faqWhatHappensIfIWantToUnstakeETHOnEthereumCanIDoThatFromOptimismWithdrawalsRequestAndClaim', + + // Soneium + faqHowCanIGetWstethOnSoneiumWrapLink = 'faqHowCanIGetWstethOnSoneiumWrapLink', + faqHowCanIGetWstethOnSoneiumBridgeYourWstETHFromEthereumToSoneium = 'faqHowCanIGetWstethOnSoneiumBridgeYourWstETHFromEthereumToSoneium', + faqHowCanIGetWstethOnSoneiumIntegrations = 'faqHowCanIGetWstethOnSoneiumIntegrations', + faqHowCanIUseWstethOnSoneiumDefiProtocols = 'faqHowCanIUseWstethOnSoneiumDefiProtocols', + faqHowCouldIUnwrapWstETHBackToStETHOnSoneiumUnwrapLink = 'faqHowCouldIUnwrapWstETHBackToStETHOnSoneiumUnwrapLink', + faqWhatHappensIfIWantToUnstakeETHOnEthereumCanIDoThatFromSoneiumBridgeYourWstETHOrStETHBack = 'faqWhatHappensIfIWantToUnstakeETHOnEthereumCanIDoThatFromSoneiumBridgeYourWstETHOrStETHBack', + faqWhatHappensIfIWantToUnstakeETHOnEthereumCanIDoThatFromSoneiumWithdrawalsRequestAndClaim = 'faqWhatHappensIfIWantToUnstakeETHOnEthereumCanIDoThatFromSoneiumWithdrawalsRequestAndClaim', + // /wrap page wrapTokenSelectSTETH = 'wrapTokenSelectSteth', wrapTokenSelectETH = 'wrapTokenSelectEth', @@ -249,17 +261,33 @@ export const MATOMO_CLICK_EVENTS: Record< 'Push «Wrap & Unwrap staking widget» in FAQ How can I get wstETH (Optimism)', 'eth_widget_faq_howgetwsteth_wrap_optimism', ], + [MATOMO_CLICK_EVENTS_TYPES.faqHowCanIGetWstethOnSoneiumWrapLink]: [ + 'Ethereum_Staking_Widget', + 'Push «Wrap & Unwrap staking widget» in FAQ How can I get wstETH (Soneium)', + 'eth_widget_faq_howgetwsteth_wrap_soneium', + ], [MATOMO_CLICK_EVENTS_TYPES.faqHowCanIGetWstethOnOptimismBridgeYourWstETHFromEthereumToOptimism]: [ 'Ethereum_Staking_Widget', 'Push «bridge your wstETH from Ethereum to Optimism» in How can I get wstETH on Optimism?', 'eth_widget_faq_howCanIGetWstethOnOptimism_bridgeYourWstETHFromEthereumToOptimism', ], + [MATOMO_CLICK_EVENTS_TYPES.faqHowCanIGetWstethOnSoneiumBridgeYourWstETHFromEthereumToSoneium]: + [ + 'Ethereum_Staking_Widget', + 'Push «bridge your wstETH from Ethereum to Soneium» in How can I get wstETH on Soneium?', + 'eth_widget_faq_howCanIGetWstethOnSoneium_bridgeYourWstETHFromEthereumToSoneium', + ], [MATOMO_CLICK_EVENTS_TYPES.faqHowCanIGetWstethOnOptimismIntegrations]: [ 'Ethereum_Staking_Widget', 'Push «DEX Lido integrations» in FAQ How can I get wstETH (Optimism)', 'eth_widget_faq_howgetwsteth_dexLidoIntegrations_optimism', ], + [MATOMO_CLICK_EVENTS_TYPES.faqHowCanIGetWstethOnSoneiumIntegrations]: [ + 'Ethereum_Staking_Widget', + 'Push «DEX Lido integrations» in FAQ How can I get wstETH (Soneium)', + 'eth_widget_faq_howgetwsteth_dexLidoIntegrations_soneium', + ], [MATOMO_CLICK_EVENTS_TYPES.faqHowDoIUnwrapWstethUnwrapLink]: [ 'Ethereum_Staking_Widget', 'Push «stake.lido.fi/wrap/unwrap» How do I unwrap wstETH back to stETH?', @@ -275,6 +303,11 @@ export const MATOMO_CLICK_EVENTS: Record< 'Push «L2» How can I use wstETH? (Optimism)', 'eth_widget_faq_howCanIUseWstETH_l2_optimism', ], + [MATOMO_CLICK_EVENTS_TYPES.faqHowCanIUseWstethOnSoneiumDefiProtocols]: [ + 'Ethereum_Staking_Widget', + 'Push «L2» How can I use wstETH? (Soneium)', + 'eth_widget_faq_howCanIUseWstETH_l2_soneium', + ], [MATOMO_CLICK_EVENTS_TYPES.faqHowCanIUseWstethDefiProtocols]: [ 'Ethereum_Staking_Widget', 'Push «DeFi protocols» How can I use wstETH?', @@ -291,18 +324,36 @@ export const MATOMO_CLICK_EVENTS: Record< 'Push «Wrap & Unwrap staking widget» How could I unwrap wstETH back to stETH on Optimism?', 'eth_widget_faq_howCouldIUnwrapWstETHBackToStETHOnOptimismUnwrapLink', ], + [MATOMO_CLICK_EVENTS_TYPES.faqHowCouldIUnwrapWstETHBackToStETHOnSoneiumUnwrapLink]: + [ + 'Ethereum_Staking_Widget', + 'Push «Wrap & Unwrap staking widget» How could I unwrap wstETH back to stETH on Soneium?', + 'eth_widget_faq_howCouldIUnwrapWstETHBackToStETHOnSoneiumUnwrapLink', + ], [MATOMO_CLICK_EVENTS_TYPES.faqWhatHappensIfIWantToUnstakeETHOnEthereumCanIDoThatFromOptimismBridgeYourWstETHOrStETHBack]: [ 'Ethereum_Staking_Widget', 'Push «bridge your wstETH or stETH back» What happens if I want to unstake ETH on Ethereum? Can I do that from Optimism?', 'eth_widget_faq_WhatHappensIfIWantToUnstakeETHOnEthereumCanIDoThatFromOptimismBridgeYourWstETHOrStETHBack', ], + [MATOMO_CLICK_EVENTS_TYPES.faqWhatHappensIfIWantToUnstakeETHOnEthereumCanIDoThatFromSoneiumBridgeYourWstETHOrStETHBack]: + [ + 'Ethereum_Staking_Widget', + 'Push «bridge your wstETH or stETH back» What happens if I want to unstake ETH on Ethereum? Can I do that from Soneium?', + 'eth_widget_faq_WhatHappensIfIWantToUnstakeETHOnEthereumCanIDoThatFromSoneiumBridgeYourWstETHOrStETHBack', + ], [MATOMO_CLICK_EVENTS_TYPES.faqWhatHappensIfIWantToUnstakeETHOnEthereumCanIDoThatFromOptimismWithdrawalsRequestAndClaim]: [ 'Ethereum_Staking_Widget', 'Push «Withdrawals Request and Claim» What happens if I want to unstake ETH on Ethereum? Can I do that from Optimism?', 'eth_widget_faq_WhatHappensIfIWantToUnstakeETHOnEthereumCanIDoThatFromOptimismWithdrawalsRequestAndClaim', ], + [MATOMO_CLICK_EVENTS_TYPES.faqWhatHappensIfIWantToUnstakeETHOnEthereumCanIDoThatFromSoneiumWithdrawalsRequestAndClaim]: + [ + 'Ethereum_Staking_Widget', + 'Push «Withdrawals Request and Claim» What happens if I want to unstake ETH on Ethereum? Can I do that from Soneium?', + 'eth_widget_faq_WhatHappensIfIWantToUnstakeETHOnEthereumCanIDoThatFromSoneiumWithdrawalsRequestAndClaim', + ], // /wrap page [MATOMO_CLICK_EVENTS_TYPES.wrapTokenSelectETH]: [ 'Ethereum_Staking_Widget', diff --git a/env-dynamics.mjs b/env-dynamics.mjs index fbc476ee2..945d64f04 100644 --- a/env-dynamics.mjs +++ b/env-dynamics.mjs @@ -64,6 +64,10 @@ export const prefillUnsafeElRpcUrls11155111 = export const prefillUnsafeElRpcUrls10 = process.env.PREFILL_UNSAFE_EL_RPC_URLS_10?.split(',') ?? []; /** @type string[] */ export const prefillUnsafeElRpcUrls11155420 = process.env.PREFILL_UNSAFE_EL_RPC_URLS_11155420?.split(',') ?? []; +/** @type string[] */ +export const prefillUnsafeElRpcUrls1868 = process.env.PREFILL_UNSAFE_EL_RPC_URLS_1868?.split(',') ?? []; +/** @type string[] */ +export const prefillUnsafeElRpcUrls1946 = process.env.PREFILL_UNSAFE_EL_RPC_URLS_1946?.split(',') ?? []; /** @type boolean */ export const enableQaHelpers = toBoolean(process.env.ENABLE_QA_HELPERS); diff --git a/features/wsteth/shared/wallet/styles.tsx b/features/wsteth/shared/wallet/styles.tsx index c24fb41c6..c005ed48b 100644 --- a/features/wsteth/shared/wallet/styles.tsx +++ b/features/wsteth/shared/wallet/styles.tsx @@ -2,12 +2,18 @@ import { Card } from 'shared/wallet'; import styled from 'styled-components'; interface StyledCardProps { - $redBg?: boolean; + $optimism?: boolean; + $soneium?: boolean; } export const StyledCard = styled(Card)` - background: ${({ $redBg }) => - $redBg - ? 'linear-gradient(52.01deg, #37394A 0%, #1D1E35 0.01%, #B73544 100%)' - : 'linear-gradient(52.01deg, #1b3349 0%, #25697e 100%)'}; + background: ${({ $optimism, $soneium }) => { + if ($optimism) { + return 'linear-gradient(52.01deg, #37394A 0%, #1D1E35 0.01%, #B73544 100%)'; + } + if ($soneium) { + return 'linear-gradient(52.01deg, #9d1451 0.01%, #630876 100%);'; + } + return 'linear-gradient(52.01deg, #1b3349 0%, #25697e 100%)'; + }}; `; diff --git a/features/wsteth/shared/wallet/wallet.tsx b/features/wsteth/shared/wallet/wallet.tsx index 2c5f4c5ab..ee847f109 100644 --- a/features/wsteth/shared/wallet/wallet.tsx +++ b/features/wsteth/shared/wallet/wallet.tsx @@ -1,3 +1,5 @@ +import { useAccount } from 'wagmi'; +import { useConnectorInfo } from 'reef-knot/core-react'; import { Divider, Text } from '@lidofinance/lido-ui'; import { FormatToken } from 'shared/formatters'; @@ -16,10 +18,9 @@ import { CardBalance, CardRow, CardAccount, Fallback } from 'shared/wallet'; import { StyledCard } from './styles'; import { useIsLedgerLive } from 'shared/hooks/useIsLedgerLive'; import { useConfig } from 'config'; -import { useConnectorInfo } from 'reef-knot/core-react'; const WalletComponent = () => { - const { isDappActiveOnL2 } = useDappStatus(); + const { chainType } = useDappStatus(); const ethBalance = useEthereumBalance(); const stethBalance = useStethBalance(); const wstethBalance = useWstethBalance(); @@ -27,8 +28,15 @@ const WalletComponent = () => { const wstethBySteth = useWstethBySteth(stethBalance?.data); const stethByWsteth = useStETHByWstETH(wstethBalance?.data); + const isOptimism = chainType === DAPP_CHAIN_TYPE.Optimism; + const isSoneium = chainType === DAPP_CHAIN_TYPE.Soneium; + return ( - + { const isLedgerLive = useIsLedgerLive(); const { isLedger: isLedgerHardware } = useConnectorInfo(); const { featureFlags } = useConfig().externalConfig; - const { chainType } = useDappStatus(); + const { isChainTypeOnL2 } = useDappStatus(); + const { chain } = useAccount(); - const isLedgerLiveOptimism = - !featureFlags.ledgerLiveL2 && - isLedgerLive && - chainType === DAPP_CHAIN_TYPE.Optimism; - const isLedgerHardwareOptimism = - isLedgerHardware && chainType === DAPP_CHAIN_TYPE.Optimism; + const isLedgerLiveOnL2 = + !featureFlags.ledgerLiveL2 && isLedgerLive && isChainTypeOnL2; + const isLedgerHardwareL2 = isLedgerHardware && isChainTypeOnL2; - if (isLedgerLiveOptimism || isLedgerHardwareOptimism) { - const error = `Optimism is currently not supported in ${isLedgerLiveOptimism ? 'Ledger Live' : 'Ledger Hardware'}.`; + if (isLedgerLiveOnL2 || isLedgerHardwareL2) { + const error = `${chain?.name} is currently not supported in ${isLedgerLiveOnL2 ? 'Ledger Live' : 'Ledger Hardware'}.`; return ; } diff --git a/features/wsteth/shared/wrap-faq/soneium-faq/faq.tsx b/features/wsteth/shared/wrap-faq/soneium-faq/faq.tsx new file mode 100644 index 000000000..6f3e5e541 --- /dev/null +++ b/features/wsteth/shared/wrap-faq/soneium-faq/faq.tsx @@ -0,0 +1,23 @@ +import { + WhatIsWstethOnSoneium, + HowCanIGetWstethOnSoneium, + HowCanIUseWstethOnSoneium, + CanIStakeMyETHDirectlyOnSoneium, + DoIStillGetStakingRewardsWithStETHOrWstETHOnSoneium, + DoINeedToClaimMyStakingRewardsIfIWrapStETHToWstETHOnSoneium, + HowCouldIUnwrapWstETHBackToStETHOnSoneium, + WhatHappensIfIWantToUnstakeETHOnEthereumCanIDoThatFromSoneium, +} from './list'; + +export const SoneiumFAQ = () => ( + <> + + + + + + + + + +); diff --git a/features/wsteth/shared/wrap-faq/soneium-faq/list/can-i-stake-my-eth-directly-on-soneium.tsx b/features/wsteth/shared/wrap-faq/soneium-faq/list/can-i-stake-my-eth-directly-on-soneium.tsx new file mode 100644 index 000000000..552e847c2 --- /dev/null +++ b/features/wsteth/shared/wrap-faq/soneium-faq/list/can-i-stake-my-eth-directly-on-soneium.tsx @@ -0,0 +1,13 @@ +import { FC } from 'react'; +import { Accordion } from '@lidofinance/lido-ui'; + +export const CanIStakeMyETHDirectlyOnSoneium: FC = () => { + return ( + +

+ No, staking in the Lido Protocol is available only on the Ethereum + mainnet. +

+
+ ); +}; diff --git a/features/wsteth/shared/wrap-faq/soneium-faq/list/do-i-need-to-claim-my-staking-rewards-if-i-wrap-steth-to-wsteth-on-soneium.tsx b/features/wsteth/shared/wrap-faq/soneium-faq/list/do-i-need-to-claim-my-staking-rewards-if-i-wrap-steth-to-wsteth-on-soneium.tsx new file mode 100644 index 000000000..717cec765 --- /dev/null +++ b/features/wsteth/shared/wrap-faq/soneium-faq/list/do-i-need-to-claim-my-staking-rewards-if-i-wrap-steth-to-wsteth-on-soneium.tsx @@ -0,0 +1,11 @@ +import { FC } from 'react'; +import { Accordion } from '@lidofinance/lido-ui'; + +export const DoINeedToClaimMyStakingRewardsIfIWrapStETHToWstETHOnSoneium: FC = + () => { + return ( + +

No, staking rewards accrue to wstETH automatically.

+
+ ); + }; diff --git a/features/wsteth/shared/wrap-faq/soneium-faq/list/do-i-still-get-staking-rewards-with-steth-or-wsteth-on-soneium.tsx b/features/wsteth/shared/wrap-faq/soneium-faq/list/do-i-still-get-staking-rewards-with-steth-or-wsteth-on-soneium.tsx new file mode 100644 index 000000000..fa4c3aac2 --- /dev/null +++ b/features/wsteth/shared/wrap-faq/soneium-faq/list/do-i-still-get-staking-rewards-with-steth-or-wsteth-on-soneium.tsx @@ -0,0 +1,17 @@ +import { FC } from 'react'; +import { Accordion } from '@lidofinance/lido-ui'; + +export const DoIStillGetStakingRewardsWithStETHOrWstETHOnSoneium: FC = () => { + return ( + +

+ Yes, wrapped stETH gets staking rewards at the same rate as regular + stETH. When you keep your stETH in a wrapper, you cannot see your daily + staking rewards. However, when you unwrap your wstETH your new stETH + balance will have increased relative to the pre-wrapped amount to + reflect your received rewards, regardless of whether it's held on + Ethereum or Soneium. +

+
+ ); +}; diff --git a/features/wsteth/shared/wrap-faq/soneium-faq/list/how-can-i-get-wsteth.tsx b/features/wsteth/shared/wrap-faq/soneium-faq/list/how-can-i-get-wsteth.tsx new file mode 100644 index 000000000..2bd3e4d39 --- /dev/null +++ b/features/wsteth/shared/wrap-faq/soneium-faq/list/how-can-i-get-wsteth.tsx @@ -0,0 +1,48 @@ +import { FC } from 'react'; +import { Accordion, Link, Link as OuterLink } from '@lidofinance/lido-ui'; + +import { config } from 'config'; +import { WRAP_PATH } from 'consts/urls'; +import { MATOMO_CLICK_EVENTS_TYPES } from 'consts/matomo-click-events'; +import { trackMatomoEvent } from 'utils/track-matomo-event'; +import { LocalLink } from 'shared/components/local-link'; + +export const HowCanIGetWstethOnSoneium: FC = () => { + return ( + +

+ You can wrap your stETH tokens using the{' '} + + trackMatomoEvent( + MATOMO_CLICK_EVENTS_TYPES.faqHowCanIGetWstethOnSoneiumWrapLink, + ) + } + aria-hidden="true" + > + Wrap & Unwrap staking widget + {' '} + on Soneium,{' '} + + bridge your wstETH from Ethereum to Soneium + + , or use the{' '} + + DEX Lido integrations + + . +

+
+ ); +}; diff --git a/features/wsteth/shared/wrap-faq/soneium-faq/list/how-can-i-use-wsteth-on-soneium.tsx b/features/wsteth/shared/wrap-faq/soneium-faq/list/how-can-i-use-wsteth-on-soneium.tsx new file mode 100644 index 000000000..71cf750f9 --- /dev/null +++ b/features/wsteth/shared/wrap-faq/soneium-faq/list/how-can-i-use-wsteth-on-soneium.tsx @@ -0,0 +1,24 @@ +import { FC } from 'react'; +import { Accordion, Link } from '@lidofinance/lido-ui'; + +import { config } from 'config'; +import { MATOMO_CLICK_EVENTS_TYPES } from 'consts/matomo-click-events'; + +export const HowCanIUseWstethOnSoneium: FC = () => { + return ( + +

+ wstETH is useful across{' '} + + DeFi protocols + + , which are based on constant balance tokens. +

+
+ ); +}; diff --git a/features/wsteth/shared/wrap-faq/soneium-faq/list/how-could-i-unwrap-wsteth-back-to-steth-on-soneium.tsx b/features/wsteth/shared/wrap-faq/soneium-faq/list/how-could-i-unwrap-wsteth-back-to-steth-on-soneium.tsx new file mode 100644 index 000000000..d2e4079ec --- /dev/null +++ b/features/wsteth/shared/wrap-faq/soneium-faq/list/how-could-i-unwrap-wsteth-back-to-steth-on-soneium.tsx @@ -0,0 +1,28 @@ +import { FC } from 'react'; +import { Accordion } from '@lidofinance/lido-ui'; +import { WRAP_UNWRAP_PATH } from 'consts/urls'; +import { MATOMO_CLICK_EVENTS_TYPES } from 'consts/matomo-click-events'; +import { LocalLink } from 'shared/components/local-link'; +import { trackMatomoEvent } from 'utils/track-matomo-event'; + +export const HowCouldIUnwrapWstETHBackToStETHOnSoneium: FC = () => { + return ( + +

+ You can unwrap your wstETH tokens using{' '} + + trackMatomoEvent( + MATOMO_CLICK_EVENTS_TYPES.faqHowCouldIUnwrapWstETHBackToStETHOnSoneiumUnwrapLink, + ) + } + aria-hidden="true" + > + Wrap & Unwrap staking widget + + . +

+
+ ); +}; diff --git a/features/wsteth/shared/wrap-faq/soneium-faq/list/index.ts b/features/wsteth/shared/wrap-faq/soneium-faq/list/index.ts new file mode 100644 index 000000000..d519c632e --- /dev/null +++ b/features/wsteth/shared/wrap-faq/soneium-faq/list/index.ts @@ -0,0 +1,8 @@ +export * from './what-is-wsteth'; +export * from './how-can-i-get-wsteth'; +export * from './how-can-i-use-wsteth-on-soneium'; +export * from './can-i-stake-my-eth-directly-on-soneium'; +export * from './do-i-still-get-staking-rewards-with-steth-or-wsteth-on-soneium'; +export * from './do-i-need-to-claim-my-staking-rewards-if-i-wrap-steth-to-wsteth-on-soneium'; +export * from './how-could-i-unwrap-wsteth-back-to-steth-on-soneium'; +export * from './what-happens-if-i-want-to-unstake-eth-on-ethereum-can-i-do-that-from-soneium'; diff --git a/features/wsteth/shared/wrap-faq/soneium-faq/list/what-happens-if-i-want-to-unstake-eth-on-ethereum-can-i-do-that-from-soneium.tsx b/features/wsteth/shared/wrap-faq/soneium-faq/list/what-happens-if-i-want-to-unstake-eth-on-ethereum-can-i-do-that-from-soneium.tsx new file mode 100644 index 000000000..0ecc5c5e8 --- /dev/null +++ b/features/wsteth/shared/wrap-faq/soneium-faq/list/what-happens-if-i-want-to-unstake-eth-on-ethereum-can-i-do-that-from-soneium.tsx @@ -0,0 +1,39 @@ +import { FC } from 'react'; +import { Accordion, Link } from '@lidofinance/lido-ui'; +import { MATOMO_CLICK_EVENTS_TYPES } from 'consts/matomo-click-events'; +import { WITHDRAWALS_REQUEST_PATH } from 'consts/urls'; +import { LocalLink } from 'shared/components/local-link'; +import { trackMatomoEvent } from 'utils/track-matomo-event'; + +export const WhatHappensIfIWantToUnstakeETHOnEthereumCanIDoThatFromSoneium: FC = + () => { + return ( + +

+ You would need to{' '} + + bridge your wstETH or stETH back + {' '} + to Ethereum mainnet first. Once on the mainnet, you can transform your + wstETH or stETH to ETH using the{' '} + + trackMatomoEvent( + MATOMO_CLICK_EVENTS_TYPES.faqWhatHappensIfIWantToUnstakeETHOnEthereumCanIDoThatFromSoneiumWithdrawalsRequestAndClaim, + ) + } + aria-hidden="true" + > + Withdrawals Request and Claim + {' '} + tabs. +

+
+ ); + }; diff --git a/features/wsteth/shared/wrap-faq/soneium-faq/list/what-is-wsteth.tsx b/features/wsteth/shared/wrap-faq/soneium-faq/list/what-is-wsteth.tsx new file mode 100644 index 000000000..a1967262d --- /dev/null +++ b/features/wsteth/shared/wrap-faq/soneium-faq/list/what-is-wsteth.tsx @@ -0,0 +1,17 @@ +import { FC } from 'react'; +import { Accordion } from '@lidofinance/lido-ui'; + +export const WhatIsWstethOnSoneium: FC = () => { + return ( + +

+ wstETH (wrapped stETH) is a non-rebaseable version of stETH, + wstETH's price denominated in stETH changes instead. The wstETH + balance can only be changed upon transfers, minting, and burning. At any + given time, anyone holding wstETH can convert any amount of it to stETH + at a fixed rate, and vice versa. Normally, the rate gets updated once a + day, when stETH undergoes a rebase. +

+
+ ); +}; diff --git a/features/wsteth/shared/wrap-faq/wrap-faq.tsx b/features/wsteth/shared/wrap-faq/wrap-faq.tsx index c2409724f..2da956282 100644 --- a/features/wsteth/shared/wrap-faq/wrap-faq.tsx +++ b/features/wsteth/shared/wrap-faq/wrap-faq.tsx @@ -5,11 +5,12 @@ import { useDappStatus, DAPP_CHAIN_TYPE } from 'modules/web3'; import { EthereumFAQ } from './ethereum-faq/faq'; import { OptimismFAQ } from './optimism-faq/faq'; +import { SoneiumFAQ } from './soneium-faq/faq'; export const faqComponentsMap = new Map([ [DAPP_CHAIN_TYPE.Ethereum, EthereumFAQ], [DAPP_CHAIN_TYPE.Optimism, OptimismFAQ], - // FAQ for other networks + [DAPP_CHAIN_TYPE.Soneium, SoneiumFAQ], ]); export const WrapFaq = () => { diff --git a/features/wsteth/unwrap/hooks/use-unwrap-tx-on-l2-approve.ts b/features/wsteth/unwrap/hooks/use-unwrap-tx-on-l2-approve.ts index 3341d2402..5110876ad 100644 --- a/features/wsteth/unwrap/hooks/use-unwrap-tx-on-l2-approve.ts +++ b/features/wsteth/unwrap/hooks/use-unwrap-tx-on-l2-approve.ts @@ -76,8 +76,8 @@ export const useUnwrapTxOnL2Approve = ({ amount }: UseUnwrapTxApproveArgs) => { isApprovalNeededBeforeUnwrap, isAllowanceLoading, // There are 2 cases when we show the allowance on the unwrap page: - // 1. wallet chain is any Optimism supported chain and chain switcher is Optimism (isDappActiveOnL2) - // 2. or wallet chain is any ETH supported chain, but chain switcher is Optimism (isChainTypeOnL2) + // 1. wallet chain is L2 chain and chain switcher is on L2 chain (isDappActiveOnL2) + // 2. or wallet chain is any ETH supported chain, but chain switcher is on L2 chain (isChainTypeOnL2) isShowAllowance: isDappActiveOnL2 || isChainTypeOnL2, }), [ diff --git a/features/wsteth/wrap/hooks/use-wrap-tx-on-l1-approve.ts b/features/wsteth/wrap/hooks/use-wrap-tx-on-l1-approve.ts index c7ca37d12..41766f421 100644 --- a/features/wsteth/wrap/hooks/use-wrap-tx-on-l1-approve.ts +++ b/features/wsteth/wrap/hooks/use-wrap-tx-on-l1-approve.ts @@ -90,7 +90,7 @@ export const useWrapTxOnL1Approve = ({ // There are 3 cases when we show the allowance on the wrap page: // 1. is wallet not connected (!isWalletConnected) // 2. or wallet chain is any ETH supported chain and chain switcher is ETH (isDappActiveOnL1) - // 3. or wallet chain is any Optimism supported chain, but chain switcher is ETH (!isChainTypeOnL2) + // 3. or wallet chain is L2 chain, but chain switcher is ETH (!isChainTypeOnL2) isShowAllowance: !isWalletConnected || isDappActiveOnL1 || !isChainTypeOnL2, }), diff --git a/global.d.ts b/global.d.ts index 5b3da69ef..b6a18f891 100644 --- a/global.d.ts +++ b/global.d.ts @@ -30,6 +30,8 @@ declare module 'next/config' { rpcUrls_11155111: string | undefined; rpcUrls_10: string | undefined; rpcUrls_11155420: string | undefined; + rpcUrls_1868: string | undefined; + rpcUrls_1946: string | undefined; cspTrustedHosts: string | undefined; cspReportUri: string | undefined; diff --git a/modules/web3/web3-provider/dapp-chain.tsx b/modules/web3/web3-provider/dapp-chain.tsx index b4079e9a8..113277298 100644 --- a/modules/web3/web3-provider/dapp-chain.tsx +++ b/modules/web3/web3-provider/dapp-chain.tsx @@ -19,6 +19,7 @@ import { LidoSDKL2Provider } from './lido-sdk-l2'; export enum DAPP_CHAIN_TYPE { Ethereum = 'Ethereum', Optimism = 'Optimism', + Soneium = 'Soneium', } type DappChainContextValue = { @@ -55,12 +56,16 @@ const ETHEREUM_CHAINS = new Set([ const OPTIMISM_CHAINS = new Set([CHAINS.Optimism, CHAINS.OptimismSepolia]); +export const SONEIUM_CHAINS = new Set([CHAINS.Soneium, CHAINS.SoneiumMinato]); + const getChainTypeByChainId = (chainId?: number): DAPP_CHAIN_TYPE | null => { if (!chainId) return null; if (ETHEREUM_CHAINS.has(chainId)) { return DAPP_CHAIN_TYPE.Ethereum; } else if (OPTIMISM_CHAINS.has(chainId)) { return DAPP_CHAIN_TYPE.Optimism; + } else if (SONEIUM_CHAINS.has(chainId)) { + return DAPP_CHAIN_TYPE.Soneium; } return null; }; @@ -165,7 +170,9 @@ export const SupportL2Chains: React.FC = ({ // At the moment a simple check is enough for us, // however in the future we will either rethink this flag // or use an array or Set (for example with L2_DAPP_CHAINS_TYPE) - isChainTypeOnL2: chainType === DAPP_CHAIN_TYPE.Optimism, + isChainTypeOnL2: + chainType === DAPP_CHAIN_TYPE.Optimism || + chainType === DAPP_CHAIN_TYPE.Soneium, }), [chainType, walletChainId], )} diff --git a/next.config.mjs b/next.config.mjs index a72840494..c4935667e 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -157,9 +157,12 @@ export default withBundleAnalyzer({ rpcUrls_1: process.env.EL_RPC_URLS_1, rpcUrls_17000: process.env.EL_RPC_URLS_17000, rpcUrls_11155111: process.env.EL_RPC_URLS_11155111, - // OP rpcs + // Optimism rpcs rpcUrls_10: process.env.EL_RPC_URLS_10, rpcUrls_11155420: process.env.EL_RPC_URLS_11155420, + // Soneium rpcs + rpcUrls_1868: process.env.EL_RPC_URLS_1868, + rpcUrls_1946: process.env.EL_RPC_URLS_1946, cspTrustedHosts: process.env.CSP_TRUSTED_HOSTS, cspReportUri: process.env.CSP_REPORT_URI, diff --git a/package.json b/package.json index 1e61c1220..c12caede8 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@lidofinance/api-rpc": "^0.48.0", "@lidofinance/eth-api-providers": "^0.48.0", "@lidofinance/eth-providers": "^0.48.0", - "@lidofinance/lido-ethereum-sdk": "4.1.0", + "@lidofinance/lido-ethereum-sdk": "4.2.0-alpha.1", "@lidofinance/lido-ui": "^3.26.0", "@lidofinance/next-api-wrapper": "^0.48.0", "@lidofinance/next-ip-rate-limit": "^0.48.0", @@ -60,8 +60,8 @@ "tiny-async-pool": "^1.2.0", "tiny-invariant": "^1.1.0", "uuid": "^8.3.2", - "viem": "2.21.54", - "wagmi": "2.13.4" + "viem": "2.22.16", + "wagmi": "2.14.9" }, "devDependencies": { "@commitlint/cli": "^17.4.4", diff --git a/pages/api/rpc.ts b/pages/api/rpc.ts index 5aed36e27..12a0a355c 100644 --- a/pages/api/rpc.ts +++ b/pages/api/rpc.ts @@ -76,6 +76,8 @@ const rpc = rpcFactory({ [CHAINS.Sepolia]: secretConfig.rpcUrls_11155111, [CHAINS.Optimism]: secretConfig.rpcUrls_10, [CHAINS.OptimismSepolia]: secretConfig.rpcUrls_11155420, + [CHAINS.Soneium]: secretConfig.rpcUrls_1868, + [CHAINS.SoneiumMinato]: secretConfig.rpcUrls_1946, }, validation: { allowedRPCMethods, diff --git a/scripts/log-environment-variables.mjs b/scripts/log-environment-variables.mjs index 79e1f59b4..b2347765c 100644 --- a/scripts/log-environment-variables.mjs +++ b/scripts/log-environment-variables.mjs @@ -34,6 +34,8 @@ export const secretKeys = [ 'EL_RPC_URLS_11155111', 'EL_RPC_URLS_10', 'EL_RPC_URLS_11155420', + 'EL_RPC_URLS_1868', + 'EL_RPC_URLS_1946' ]; export const logOpenEnvironmentVariables = () => { diff --git a/shared/components/layout/header/components/chain-switcher/chain-switcher.tsx b/shared/components/layout/header/components/chain-switcher/chain-switcher.tsx index 459fd5643..d570ed0f4 100644 --- a/shared/components/layout/header/components/chain-switcher/chain-switcher.tsx +++ b/shared/components/layout/header/components/chain-switcher/chain-switcher.tsx @@ -1,8 +1,7 @@ -import { FC, useState, useRef, ReactNode } from 'react'; +import { FC, useState, ReactNode } from 'react'; import { DAPP_CHAIN_TYPE } from 'modules/web3'; import { useDappStatus } from 'modules/web3'; -import { useClickOutside } from './hooks/use-click-outside'; import { ChainSwitcherOptions } from './components/chain-switcher-options/chain-switcher-options'; import { SelectIconTooltip } from './components/select-icon-tooltip/select-icon-tooltip'; import { @@ -12,28 +11,26 @@ import { ArrowStyle, } from './styles'; -import { ReactComponent as OptimismLogo } from 'assets/icons/chain-toggler/optimism.svg'; import { ReactComponent as EthereumMainnetLogo } from 'assets/icons/chain-toggler/mainnet.svg'; +import { ReactComponent as OptimismLogo } from 'assets/icons/chain-toggler/optimism.svg'; +import { ReactComponent as SoneiumLogo } from 'assets/icons/chain-toggler/soneium.svg'; const iconsMap: Record = { [DAPP_CHAIN_TYPE.Ethereum]: , [DAPP_CHAIN_TYPE.Optimism]: , + [DAPP_CHAIN_TYPE.Soneium]: , }; export const ChainSwitcher: FC = () => { const { isDappActive, chainType, supportedChainTypes, setChainType } = useDappStatus(); const [opened, setOpened] = useState(false); - const selectRef = useRef(null); const isChainTypeUnlocked = supportedChainTypes.length > 1; - useClickOutside(selectRef, () => setOpened(false)); - return ( setOpened((prev) => !prev)} > @@ -49,6 +46,7 @@ export const ChainSwitcher: FC = () => { setChainType(chainType); setOpened(false); }} + setOpened={setOpened} opened={opened} options={iconsMap} /> diff --git a/shared/components/layout/header/components/chain-switcher/components/chain-switcher-options/chain-switcher-options.tsx b/shared/components/layout/header/components/chain-switcher/components/chain-switcher-options/chain-switcher-options.tsx index b2a546bfc..e10cca1da 100644 --- a/shared/components/layout/header/components/chain-switcher/components/chain-switcher-options/chain-switcher-options.tsx +++ b/shared/components/layout/header/components/chain-switcher/components/chain-switcher-options/chain-switcher-options.tsx @@ -1,35 +1,44 @@ -import { FC, ReactNode } from 'react'; +import { FC, ReactNode, useRef } from 'react'; import { DAPP_CHAIN_TYPE } from 'modules/web3'; +import { useClickOutside } from '../../hooks/use-click-outside'; + import { PopoverWrapperStyled, PopupStyled, OptionStyled } from './styles'; interface ChainSwitcherOptionsProps { currentChainType: DAPP_CHAIN_TYPE; onSelect: (chainType: DAPP_CHAIN_TYPE) => void; opened: boolean; + setOpened: (opened: boolean) => void; options: Record; } export const ChainSwitcherOptions: FC = ({ currentChainType, onSelect, + setOpened, opened, options, -}) => ( - // We need the 'PopoverWrapperStyled' for block any events as if you had set 'pointer-events: none' on the body - // while the 'PopupStyled' is opened - <> - - - {Object.entries(options).map(([chainType, icon]) => ( - onSelect(chainType as DAPP_CHAIN_TYPE)} - $active={chainType === currentChainType} - > - {icon} {chainType} - - ))} - - -); +}) => { + const popupRef = useRef(null); + useClickOutside(popupRef, () => setOpened(false)); + + return ( + // We need the 'PopoverWrapperStyled' for block any events as if you had set 'pointer-events: none' on the body + // while the 'PopupStyled' is opened + <> + + + {Object.entries(options).map(([chainType, icon]) => ( + onSelect(chainType as DAPP_CHAIN_TYPE)} + $active={chainType === currentChainType} + > + {icon} {chainType} + + ))} + + + ); +}; diff --git a/shared/components/layout/header/components/chain-switcher/components/chain-switcher-options/styles.tsx b/shared/components/layout/header/components/chain-switcher/components/chain-switcher-options/styles.tsx index 4246cc81a..a84c22fed 100644 --- a/shared/components/layout/header/components/chain-switcher/components/chain-switcher-options/styles.tsx +++ b/shared/components/layout/header/components/chain-switcher/components/chain-switcher-options/styles.tsx @@ -17,6 +17,8 @@ type PopupMenuProps = { const visibleCSS = css` opacity: 1; + visibility: visible; + pointer-events: auto; &[data-placement] { transform: translate(0, 0); @@ -25,6 +27,8 @@ const visibleCSS = css` const hiddenCSS = css` opacity: 0; + visibility: hidden; + pointer-events: none; &[data-placement^='top'] { transform: translateY(6px); @@ -88,6 +92,7 @@ export const OptionStyled = styled.div` color: var(--lido-color-text); transition: opacity 100ms; cursor: pointer; + white-space: nowrap; // Fix the highlight by click -webkit-tap-highlight-color: transparent; diff --git a/shared/wallet/fallback/lido-multichain-fallback/lido-multichain-fallback.tsx b/shared/wallet/fallback/lido-multichain-fallback/lido-multichain-fallback.tsx index f0b44ee91..803d1b1f6 100644 --- a/shared/wallet/fallback/lido-multichain-fallback/lido-multichain-fallback.tsx +++ b/shared/wallet/fallback/lido-multichain-fallback/lido-multichain-fallback.tsx @@ -15,6 +15,7 @@ import { ReactComponent as ModeLogo } from 'assets/icons/lido-multichain/mode.sv import { ReactComponent as ZircuitLogo } from 'assets/icons/lido-multichain/zircuit-logo.svg'; import { ReactComponent as UnichainLogo } from 'assets/icons/lido-multichain/unichain.svg'; import { ReactComponent as MetisLogo } from 'assets/icons/lido-multichain/metis.svg'; +import { ReactComponent as SoneiumLogo } from 'assets/icons/lido-multichain/soneium.svg'; import { config } from 'config'; import { LIDO_MULTICHAIN_CHAINS } from 'consts/chains'; @@ -43,6 +44,7 @@ const multichainLogos = { [LIDO_MULTICHAIN_CHAINS['Zircuit Chain']]: ZircuitLogo, [LIDO_MULTICHAIN_CHAINS.Unichain]: UnichainLogo, [LIDO_MULTICHAIN_CHAINS.Metis]: MetisLogo, + [LIDO_MULTICHAIN_CHAINS.Soneium]: SoneiumLogo, }; const getChainLogo = (chainId: LIDO_MULTICHAIN_CHAINS) => { diff --git a/shared/wallet/fallback/lido-multichain-fallback/styles.tsx b/shared/wallet/fallback/lido-multichain-fallback/styles.tsx index b9ad9bd91..31c325647 100644 --- a/shared/wallet/fallback/lido-multichain-fallback/styles.tsx +++ b/shared/wallet/fallback/lido-multichain-fallback/styles.tsx @@ -87,6 +87,10 @@ export const Wrap = styled((props) => )` return css` background: linear-gradient(52.01deg, #00cfff 0.01%, #1d3fd4 100%); `; + case LIDO_MULTICHAIN_CHAINS.Soneium: + return css` + background: linear-gradient(52.01deg, #9d1451 0.01%, #630876 100%); + `; default: return css` background: linear-gradient( diff --git a/utils/get-chain-color.ts b/utils/get-chain-color.ts index 775e85279..ae0d9fd23 100644 --- a/utils/get-chain-color.ts +++ b/utils/get-chain-color.ts @@ -4,11 +4,12 @@ export const CHAINS_COLORS: { [key in CHAINS]?: string; } = { [CHAINS.Mainnet]: '#29b6af', - [CHAINS.Goerli]: '#3099f2', [CHAINS.Holesky]: '#AA346A', [CHAINS.Sepolia]: '#FFD700', [CHAINS.Optimism]: '#da3737', [CHAINS.OptimismSepolia]: '#da3737', + [CHAINS.Soneium]: '#630876', + [CHAINS.SoneiumMinato]: '#630876', }; export const CHAIN_COLOR_FALLBACK = '#7a8aa0'; diff --git a/yarn.lock b/yarn.lock index 19fcc1225..4dede07b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2312,10 +2312,10 @@ resolved "https://registry.yarnpkg.com/@lidofinance/eth-providers/-/eth-providers-0.48.0.tgz#217279cc8433968531283b985617b981d59a8393" integrity sha512-ItzIN9psHu8stf8MTAmNaXmKyaVnsYzQ10zdvdX6TM56TcFRlxidTnR5UVeOObtr1Bm/pz61GYCOZkUI6q3aAw== -"@lidofinance/lido-ethereum-sdk@4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@lidofinance/lido-ethereum-sdk/-/lido-ethereum-sdk-4.1.0.tgz#8eb307279bdfa5dabd706615a694c055464abf15" - integrity sha512-EIJ9tYzIzVKrEd2suRPQCxihOOiqJAULQN6JdkG0OIrfg3QKkmIGljjy3b2i3SCuPHZLMhGiBNcjfaLugUHUeA== +"@lidofinance/lido-ethereum-sdk@4.2.0-alpha.1": + version "4.2.0-alpha.1" + resolved "https://registry.yarnpkg.com/@lidofinance/lido-ethereum-sdk/-/lido-ethereum-sdk-4.2.0-alpha.1.tgz#4f3b43fa483edfb2193b4e3cb45e736f6d247c41" + integrity sha512-5NDpWIBa4daDsHNK3Uoj6iILfHySx2rIfZVi1MV6B6ly7CNzwCD/5WBU1Qfko4BvJicRIuD37tE6yw6hk4oquA== dependencies: "@ethersproject/bytes" "^5.7.0" graphql "^16.8.1" @@ -2491,23 +2491,23 @@ utf-8-validate "^5.0.2" uuid "^8.3.2" -"@metamask/sdk-install-modal-web@0.31.1": - version "0.31.1" - resolved "https://registry.yarnpkg.com/@metamask/sdk-install-modal-web/-/sdk-install-modal-web-0.31.1.tgz#c08ddeb6d8e5a21344477a3f395ebc66952f0bcd" - integrity sha512-J83K6jN2V3xkTb+/5eyASatlgqHdpzjkTVU6cC+Z/YA9cE32zX8vE0EQweGmExgv+kJ5zz/BiqSZZbMfuilRfQ== +"@metamask/sdk-install-modal-web@0.31.5": + version "0.31.5" + resolved "https://registry.yarnpkg.com/@metamask/sdk-install-modal-web/-/sdk-install-modal-web-0.31.5.tgz#b5e903b63f936b9ae795f31137b4c9f0873c382d" + integrity sha512-ZfrVkPAabfH4AIxcTlxQN5oyyzzVXFTLZrm1/BJ+X632d9MiyAVHNtiqa9EZpZYkZGk2icmDVP+xCpvJmVOVpQ== dependencies: "@paulmillr/qr" "^0.2.1" -"@metamask/sdk@0.31.1": - version "0.31.1" - resolved "https://registry.yarnpkg.com/@metamask/sdk/-/sdk-0.31.1.tgz#111f2eeba9f40d1bc358b4bd60bdf5b423d78daf" - integrity sha512-olU3TYRAxIZP5ZXDmi5Y53zXikkPySNiTuBI4QD+2hWYomVlMV2SjOKHSRR6gPuI+fFEg/Z+ImrxDthQfMODwA== +"@metamask/sdk@0.31.5": + version "0.31.5" + resolved "https://registry.yarnpkg.com/@metamask/sdk/-/sdk-0.31.5.tgz#804b68382d9f4c74ab0296f1b5c54143622ef2c8" + integrity sha512-i7wteqO/fU2JWQrMZz+addHokYThHYznp4nYXviv+QysdxGVgAYvcW/PBA+wpeP3veX7QGfNqMPgSsZbBrASYw== dependencies: "@babel/runtime" "^7.26.0" "@metamask/onboarding" "^1.0.1" "@metamask/providers" "16.1.0" "@metamask/sdk-communication-layer" "0.31.0" - "@metamask/sdk-install-modal-web" "0.31.1" + "@metamask/sdk-install-modal-web" "0.31.5" "@paulmillr/qr" "^0.2.1" bowser "^2.9.0" cross-fetch "^4.0.0" @@ -2719,19 +2719,12 @@ dependencies: "@noble/hashes" "1.4.0" -"@noble/curves@1.7.0", "@noble/curves@~1.7.0": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.7.0.tgz#0512360622439256df892f21d25b388f52505e45" - integrity sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw== +"@noble/curves@1.8.1", "@noble/curves@~1.8.1": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.8.1.tgz#19bc3970e205c99e4bdb1c64a4785706bce497ff" + integrity sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ== dependencies: - "@noble/hashes" "1.6.0" - -"@noble/curves@^1.4.0": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" - integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== - dependencies: - "@noble/hashes" "1.4.0" + "@noble/hashes" "1.7.1" "@noble/curves@^1.6.0": version "1.6.0" @@ -2740,6 +2733,13 @@ dependencies: "@noble/hashes" "1.5.0" +"@noble/curves@~1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.7.0.tgz#0512360622439256df892f21d25b388f52505e45" + integrity sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw== + dependencies: + "@noble/hashes" "1.6.0" + "@noble/hashes@1.4.0", "@noble/hashes@^1.3.1", "@noble/hashes@^1.4.0", "@noble/hashes@~1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" @@ -2755,10 +2755,10 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.0.tgz#d4bfb516ad6e7b5111c216a5cc7075f4cf19e6c5" integrity sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ== -"@noble/hashes@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.1.tgz#df6e5943edcea504bac61395926d6fd67869a0d5" - integrity sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w== +"@noble/hashes@1.7.1", "@noble/hashes@~1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.1.tgz#5738f6d765710921e7a751e00c20ae091ed8db0f" + integrity sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -3121,10 +3121,10 @@ dependencies: tiny-invariant "^1.1.0" -"@safe-global/safe-apps-provider@0.18.4": - version "0.18.4" - resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.4.tgz#53df912aa20d933f6b14c5bcb0737a8cd47def57" - integrity sha512-SWYeG3gyTO6wGHMSokfHakZ9isByn2mHsM0VohIorYFFEyGGmJ89btnTm+DqDUSoQtvWAatZB7XNy6CaYMvqtg== +"@safe-global/safe-apps-provider@0.18.5": + version "0.18.5" + resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.5.tgz#745a932bda3739a8a298ae44ec6c465f6c4773b7" + integrity sha512-9v9wjBi3TwLsEJ3C2ujYoexp3pFJ0omDLH/GX91e2QB+uwCKTBYyhxFSrTQ9qzoyQd+bfsk4gjOGW87QcJhf7g== dependencies: "@safe-global/safe-apps-sdk" "^9.1.0" events "^3.3.0" @@ -3152,6 +3152,11 @@ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.1.tgz#dd0b2a533063ca612c17aa9ad26424a2ff5aa865" integrity sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ== +"@scure/base@~1.2.2", "@scure/base@~1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.4.tgz#002eb571a35d69bdb4c214d0995dff76a8dcd2a9" + integrity sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ== + "@scure/bip32@1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" @@ -3161,7 +3166,16 @@ "@noble/hashes" "~1.4.0" "@scure/base" "~1.1.6" -"@scure/bip32@1.6.0", "@scure/bip32@^1.5.0": +"@scure/bip32@1.6.2": + version "1.6.2" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.6.2.tgz#093caa94961619927659ed0e711a6e4bf35bffd0" + integrity sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw== + dependencies: + "@noble/curves" "~1.8.1" + "@noble/hashes" "~1.7.1" + "@scure/base" "~1.2.2" + +"@scure/bip32@^1.5.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.6.0.tgz#6dbc6b4af7c9101b351f41231a879d8da47e0891" integrity sha512-82q1QfklrUUdXJzjuRU7iG7D7XiFx5PHYVS0+oeNKhyDLT7WPqs6pBcM2W5ZdwOwKCwoE1Vy1se+DHjcXwCYnA== @@ -3178,7 +3192,15 @@ "@noble/hashes" "~1.4.0" "@scure/base" "~1.1.6" -"@scure/bip39@1.5.0", "@scure/bip39@^1.4.0": +"@scure/bip39@1.5.4": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.5.4.tgz#07fd920423aa671be4540d59bdd344cc1461db51" + integrity sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA== + dependencies: + "@noble/hashes" "~1.7.1" + "@scure/base" "~1.2.4" + +"@scure/bip39@^1.4.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.5.0.tgz#c8f9533dbd787641b047984356531d84485f19be" integrity sha512-Dop+ASYhnrwm9+HA/HwXg7j2ZqM6yk2fyLWb5znexjctFY3+E+eU8cIWI0Pql0Qx4hPZCijlGq4OL71g+Uz30A== @@ -3990,22 +4012,22 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -"@wagmi/connectors@5.5.3": - version "5.5.3" - resolved "https://registry.yarnpkg.com/@wagmi/connectors/-/connectors-5.5.3.tgz#0bf4778ce66f0bd646f86b4479ef24054e409ebd" - integrity sha512-ADXcNuNtONh4PNzs5tWiYzl77P4UohXC7ozYecGvbn3Fkdk6x4tfsF9Wy3Ag5WcVbbp89MPpJ2+VK2ckBgtLAg== +"@wagmi/connectors@5.7.5": + version "5.7.5" + resolved "https://registry.yarnpkg.com/@wagmi/connectors/-/connectors-5.7.5.tgz#59c4d3abfcb342aa4640749c7a0dcf96dcd5089d" + integrity sha512-btqHHUSTzg4BZe9at/7SnRPv4cz8O3pisbeZBh0qxKz7PVm+9vRxY0bSala3xQPDcS0PRTB30Vn/+lM73GCjbw== dependencies: "@coinbase/wallet-sdk" "4.2.3" - "@metamask/sdk" "0.31.1" - "@safe-global/safe-apps-provider" "0.18.4" + "@metamask/sdk" "0.31.5" + "@safe-global/safe-apps-provider" "0.18.5" "@safe-global/safe-apps-sdk" "9.1.0" "@walletconnect/ethereum-provider" "2.17.0" cbw-sdk "npm:@coinbase/wallet-sdk@3.9.3" -"@wagmi/core@2.15.2": - version "2.15.2" - resolved "https://registry.yarnpkg.com/@wagmi/core/-/core-2.15.2.tgz#5bc934b4bca0d7fac1062c920a5366716f069613" - integrity sha512-4Bu1JA3HqtKvmBBsesvJ3HyqyLk69XYP0lwmG8jFqa5osfqn9iD8pvjsq5VHbIus+ZFM/UL6ydp9WWdtPNjH7w== +"@wagmi/core@2.16.3": + version "2.16.3" + resolved "https://registry.yarnpkg.com/@wagmi/core/-/core-2.16.3.tgz#abbff0a19e75beaad56ffb90da772641552d49c3" + integrity sha512-SVovoWHaQ2AIkmGf+ucNijT6AHXcTMffFcLmcFF6++y21x+ge7Gkh3UoJiU91SDDv8n08eTQ9jbyia3GEgU5jQ== dependencies: eventemitter3 "5.0.1" mipd "0.0.7" @@ -4306,10 +4328,10 @@ abitype@1.0.5: resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.5.tgz#29d0daa3eea867ca90f7e4123144c1d1270774b6" integrity sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw== -abitype@1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.7.tgz#876a0005d211e1c9132825d45bcee7b46416b284" - integrity sha512-ZfYYSktDQUwc2eduYu8C4wOs+RDPmnRYMh7zNfzeMtGGgb0U+6tLGjixUic6mXf5xKKCcgT5Qp6cv39tOARVFw== +abitype@1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.8.tgz#3554f28b2e9d6e9f35eb59878193eabd1b9f46ba" + integrity sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg== abitype@^1.0.6: version "1.0.6" @@ -8794,10 +8816,10 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== -ox@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ox/-/ox-0.1.2.tgz#0f791be2ccabeaf4928e6d423498fe1c8094e560" - integrity sha512-ak/8K0Rtphg9vnRJlbOdaX9R7cmxD2MiSthjWGaQdMk3D7hrAlDoM+6Lxn7hN52Za3vrXfZ7enfke/5WjolDww== +ox@0.6.7: + version "0.6.7" + resolved "https://registry.yarnpkg.com/ox/-/ox-0.6.7.tgz#afd53f2ecef68b8526660e9d29dee6e6b599a832" + integrity sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA== dependencies: "@adraffy/ens-normalize" "^1.10.1" "@noble/curves" "^1.6.0" @@ -10774,6 +10796,11 @@ use-sync-external-store@1.2.0: resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== +use-sync-external-store@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz#adbc795d8eeb47029963016cefdf89dc799fcebc" + integrity sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw== + utf-8-validate@^5.0.2: version "5.0.10" resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" @@ -10847,19 +10874,18 @@ vary@^1: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -viem@2.21.54: - version "2.21.54" - resolved "https://registry.yarnpkg.com/viem/-/viem-2.21.54.tgz#76d6f86ab8809078f1ac140ac1a2beadbc86b9f6" - integrity sha512-G9mmtbua3UtnVY9BqAtWdNp+3AO+oWhD0B9KaEsZb6gcrOWgmA4rz02yqEMg+qW9m6KgKGie7q3zcHqJIw6AqA== +viem@2.22.16: + version "2.22.16" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.22.16.tgz#f23e3a92284df3d05434d21fbf40b76b8f0b01b6" + integrity sha512-Eb4Ggna2fblb0oHBmy5XZ3Q4cN6fEmKxVpIWHjmAbtYVC9IfbZ28Z1/yZP2oOgvyRrostNndmnR298pgarBVGw== dependencies: - "@noble/curves" "1.7.0" - "@noble/hashes" "1.6.1" - "@scure/bip32" "1.6.0" - "@scure/bip39" "1.5.0" - abitype "1.0.7" + "@noble/curves" "1.8.1" + "@noble/hashes" "1.7.1" + "@scure/bip32" "1.6.2" + "@scure/bip39" "1.5.4" + abitype "1.0.8" isows "1.0.6" - ox "0.1.2" - webauthn-p256 "0.0.10" + ox "0.6.7" ws "8.18.0" viem@^2.1.1: @@ -10876,14 +10902,14 @@ viem@^2.1.1: isows "1.0.4" ws "8.17.1" -wagmi@2.13.4: - version "2.13.4" - resolved "https://registry.yarnpkg.com/wagmi/-/wagmi-2.13.4.tgz#5b2f11e907f4f66d5c22ebda113047643622ed9f" - integrity sha512-3/a6AZEZEJIZvxqHDv9e7R/pYYbi/oABogVOYnYN/ijI2WILD/09TjVYWXEzQCXtiNnimaTIWuGW6u/NKSAzFA== +wagmi@2.14.9: + version "2.14.9" + resolved "https://registry.yarnpkg.com/wagmi/-/wagmi-2.14.9.tgz#44c47ac6fc119e5ce40bee2c4e4dd5069a0d651a" + integrity sha512-nDJ5hwPaiVpn/8Bi82m5K4BCqDiOSnOV976p/jKXt0svQABGdAxUxej0UgDRoVlrp+NutmejN+SyQKmhV477/A== dependencies: - "@wagmi/connectors" "5.5.3" - "@wagmi/core" "2.15.2" - use-sync-external-store "1.2.0" + "@wagmi/connectors" "5.7.5" + "@wagmi/core" "2.16.3" + use-sync-external-store "1.4.0" walker@^1.0.8: version "1.0.8" @@ -10892,14 +10918,6 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" -webauthn-p256@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/webauthn-p256/-/webauthn-p256-0.0.10.tgz#877e75abe8348d3e14485932968edf3325fd2fdd" - integrity sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA== - dependencies: - "@noble/curves" "^1.4.0" - "@noble/hashes" "^1.4.0" - "webextension-polyfill@>=0.10.0 <1.0": version "0.12.0" resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.12.0.tgz#f62c57d2cd42524e9fbdcee494c034cae34a3d69"