diff --git a/apps/bob-pay/package.json b/apps/bob-pay/package.json index 995bf9995..5f352528f 100644 --- a/apps/bob-pay/package.json +++ b/apps/bob-pay/package.json @@ -39,6 +39,7 @@ "@yudiel/react-qr-scanner": "^2.0.4", "@zerodev/sdk": "^5.3.4", "big.js": "catalog:", + "bitcoin-address-validation": "^2.2.3", "date-fns": "catalog:", "graphql-request": "catalog:", "negotiator": "catalog:", diff --git a/apps/bob-pay/src/lib/form/yup.custom.ts b/apps/bob-pay/src/lib/form/yup.custom.ts index 48840f5ce..400f44129 100644 --- a/apps/bob-pay/src/lib/form/yup.custom.ts +++ b/apps/bob-pay/src/lib/form/yup.custom.ts @@ -2,7 +2,7 @@ import Big from 'big.js'; import * as yup from 'yup'; import { AnyObject, Maybe } from 'yup/lib/types'; -import { isValidBTCAddress, BitcoinNetwork } from '@gobob/utils'; +import { validate, Network as BitcoinNetwork } from 'bitcoin-address-validation'; import { isAddress } from 'viem'; yup.addMethod(yup.string, 'requiredAmount', function (action: string, customMessage?: string) { @@ -73,7 +73,7 @@ yup.addMethod( yup.addMethod(yup.string, 'btcAddress', function (network: BitcoinNetwork, customMessage?: string) { return this.test('btcAddress', (value, ctx) => { - if (!value || !isValidBTCAddress(value, network)) { + if (!value || !validate(value, network)) { const message = customMessage || 'Please enter a valid address'; return ctx.createError({ message }); diff --git a/apps/evm/package.json b/apps/evm/package.json index 3e6b06403..7b84e3885 100644 --- a/apps/evm/package.json +++ b/apps/evm/package.json @@ -17,12 +17,17 @@ }, "dependencies": { "@binance/w3w-wagmi-connector-v2": "1.2.4-alpha.0", + "@dynamic-labs/bitcoin": "^3.6.2", + "@dynamic-labs/ethereum": "^3.6.2", + "@dynamic-labs/iconic": "^3.6.2", + "@dynamic-labs/sdk-react-core": "^3.6.2", + "@dynamic-labs/wagmi-connector": "^3.6.2", + "@dynamic-labs/wallet-book": "^3.8.5", "@gobob/bob-sdk": "^3.1.0", "@gobob/chains": "workspace:^", "@gobob/currency": "workspace:^", "@gobob/hooks": "workspace:^", "@gobob/icons": "workspace:^", - "@gobob/sats-wagmi": "workspace:^", "@gobob/tokens": "workspace:^", "@gobob/ui": "workspace:^", "@gobob/utils": "workspace:^", @@ -33,12 +38,16 @@ "@react-aria/interactions": "catalog:", "@react-aria/label": "^3.7.6", "@react-aria/utils": "catalog:", + "@scure/base": "^1.1.9", + "@scure/btc-signer": "^1.4.0", "@sentry/nextjs": "catalog:", - "@tanstack/react-store": "catalog:", "@tanstack/react-query": "catalog:", + "@tanstack/react-store": "catalog:", "@vercel/kv": "catalog:", "@wagmi/core": "catalog:", "big.js": "catalog:", + "bitcoin-address-validation": "catalog:", + "boring-avatars": "^1.11.2", "date-fns": "catalog:", "graphql-request": "catalog:", "lottie-react": "^2.4.0", @@ -46,16 +55,17 @@ "next": "catalog:", "react": "catalog:", "react-dom": "catalog:", - "react-jazzicon": "^1.0.4", "react-multi-carousel": "^2.8.5", "react-otp-input": "^3.1.1", + "react-qr-code": "^2.0.12", "siwe": "^2.1.4", "styled-components": "catalog:", "use-count-up": "^3.0.1", "usehooks-ts": "catalog:", + "vaul": "^1.1.1", "viem": "catalog:", - "yup": "catalog:", - "wagmi": "catalog:" + "wagmi": "catalog:", + "yup": "catalog:" }, "devDependencies": { "@gobob/test-utils": "workspace:^", diff --git a/apps/evm/public/assets/fonts/eurostar-black-extended.ttf b/apps/evm/public/assets/fonts/eurostar-black-extended.ttf deleted file mode 100644 index 496507515..000000000 Binary files a/apps/evm/public/assets/fonts/eurostar-black-extended.ttf and /dev/null differ diff --git a/apps/evm/src/app/[lang]/(bridge)/bridge/components/BridgeForm/BobBridgeForm.tsx b/apps/evm/src/app/[lang]/(bridge)/bridge/components/BridgeForm/BobBridgeForm.tsx index c3fb3bedd..d7aeb092e 100644 --- a/apps/evm/src/app/[lang]/(bridge)/bridge/components/BridgeForm/BobBridgeForm.tsx +++ b/apps/evm/src/app/[lang]/(bridge)/bridge/components/BridgeForm/BobBridgeForm.tsx @@ -19,7 +19,7 @@ import { BridgeAlert } from './BridgeAlert'; import { l1StandardBridgeAbi } from '@/abis/L1StandardBridge.abi'; import { l2StandardBridgeAbi } from '@/abis/L2StandardBridge.abi'; -import { AuthButton } from '@/connect-ui'; +import { AuthButton } from '@/components'; import { L1_CHAIN, L2_CHAIN } from '@/constants'; import { bridgeContracts } from '@/constants/bridge'; import { diff --git a/apps/evm/src/app/[lang]/(bridge)/bridge/components/BridgeForm/BtcBridgeForm.tsx b/apps/evm/src/app/[lang]/(bridge)/bridge/components/BridgeForm/BtcBridgeForm.tsx index acc14cdf3..c3fd2b8ef 100644 --- a/apps/evm/src/app/[lang]/(bridge)/bridge/components/BridgeForm/BtcBridgeForm.tsx +++ b/apps/evm/src/app/[lang]/(bridge)/bridge/components/BridgeForm/BtcBridgeForm.tsx @@ -13,7 +13,7 @@ import { useAccount } from 'wagmi'; import { BtcTokenInput, GatewayGasSwitch, GatewayTransactionDetails } from '../../../components'; import { useGateway, useGatewayForm } from '../../../hooks'; -import { AuthButton } from '@/connect-ui'; +import { AuthButton } from '@/components'; import { isProd } from '@/constants'; import { TokenData } from '@/hooks'; import { BRIDGE_RECIPIENT, BridgeFormValues } from '@/lib/form/bridge'; diff --git a/apps/evm/src/app/[lang]/(bridge)/bridge/page.tsx b/apps/evm/src/app/[lang]/(bridge)/bridge/page.tsx index ed53cfd4f..03960c6ea 100644 --- a/apps/evm/src/app/[lang]/(bridge)/bridge/page.tsx +++ b/apps/evm/src/app/[lang]/(bridge)/bridge/page.tsx @@ -1,11 +1,10 @@ -import { Metadata } from 'next'; import { t } from '@lingui/macro'; +import { Metadata } from 'next'; import { Bridge } from './Bridge'; -import { withLinguiPage } from '@/i18n/withLigui'; import { getI18nInstance } from '@/i18n/appRouterI18n'; -import { PageLangParam } from '@/i18n/withLigui'; +import { PageLangParam, withLinguiPage } from '@/i18n/withLigui'; export function generateMetadata({ params }: PageLangParam): Metadata { const i18n = getI18nInstance(params.lang); diff --git a/apps/evm/src/app/[lang]/(bridge)/components/BridgeStatus/BridgeStatus.style.tsx b/apps/evm/src/app/[lang]/(bridge)/components/BridgeStatus/BridgeStatus.style.tsx index a557467ac..3e0907038 100644 --- a/apps/evm/src/app/[lang]/(bridge)/components/BridgeStatus/BridgeStatus.style.tsx +++ b/apps/evm/src/app/[lang]/(bridge)/components/BridgeStatus/BridgeStatus.style.tsx @@ -1,7 +1,7 @@ import { P } from '@gobob/ui'; import styled from 'styled-components'; -import { AuthButton } from '@/connect-ui'; +import { AuthButton } from '@/components'; const StyledTimePill = styled(P)` padding: ${({ theme }) => `${theme.spacing('xs')} ${theme.spacing('lg')}`}; diff --git a/apps/evm/src/app/[lang]/(bridge)/components/GatewayTransactionDetails/GatewayTransactionDetails.tsx b/apps/evm/src/app/[lang]/(bridge)/components/GatewayTransactionDetails/GatewayTransactionDetails.tsx index 58da037c9..943d706d5 100644 --- a/apps/evm/src/app/[lang]/(bridge)/components/GatewayTransactionDetails/GatewayTransactionDetails.tsx +++ b/apps/evm/src/app/[lang]/(bridge)/components/GatewayTransactionDetails/GatewayTransactionDetails.tsx @@ -1,5 +1,4 @@ import { Currency, CurrencyAmount } from '@gobob/currency'; -import { useAccount as useSatsAccount } from '@gobob/sats-wagmi'; import { BITCOIN } from '@gobob/tokens'; import { Alert, @@ -27,6 +26,7 @@ import { GatewayFeeSettingsModal } from './GatewayFeeSettingsModal'; import { StyledDlGroup, StyledDt } from './GatewayTransactionDetails.style'; import { AmountLabel } from '@/components'; +import { useBtcAccount } from '@/hooks'; import { GatewayTransactionType } from '@/types'; type GatewayTransactionDetailsProps = { @@ -50,7 +50,7 @@ const GatewayTransactionDetails = ({ }: GatewayTransactionDetailsProps): JSX.Element => { const { i18n } = useLingui(); - const { address: btcAddress } = useSatsAccount(); + const { address: btcAddress } = useBtcAccount(); const [isOpen, setOpen] = useState(false); diff --git a/apps/evm/src/app/[lang]/(bridge)/hooks/tests/useGateway.test.tsx b/apps/evm/src/app/[lang]/(bridge)/hooks/tests/useGateway.test.tsx index 0d9030cc3..ce26c2458 100644 --- a/apps/evm/src/app/[lang]/(bridge)/hooks/tests/useGateway.test.tsx +++ b/apps/evm/src/app/[lang]/(bridge)/hooks/tests/useGateway.test.tsx @@ -1,10 +1,10 @@ -import { useAccount as useSatsAccount } from '@gobob/sats-wagmi'; import { act, renderHook } from '@testing-library/react-hooks'; import { describe, expect, it, Mock, vi } from 'vitest'; import { useAccount } from 'wagmi'; import { useGateway } from '../useGateway'; +import { useBtcAccount, useBtcSignAllInputs } from '@/hooks'; import { wrapper } from '@/test-utils'; import { GatewayTransactionType } from '@/types'; @@ -17,12 +17,13 @@ vi.mock(import('wagmi'), async (importOriginal) => { }; }); -vi.mock(import('@gobob/sats-wagmi'), async (importOriginal) => { +vi.mock(import('@/hooks'), async (importOriginal) => { const actual = await importOriginal(); return { ...actual, - useAccount: vi.fn() + useBtcAccount: vi.fn(), + useBtcSignAllInputs: vi.fn() }; }); @@ -31,7 +32,8 @@ describe('useGateway', () => { vi.clearAllMocks(); (useAccount as Mock).mockReturnValue({ address: '0x123456789abcdef' }); - (useSatsAccount as Mock).mockReturnValue({ connector: vi.fn() }); + (useBtcAccount as Mock).mockReturnValue({ address: 'bc1qaddress' }); + (useBtcSignAllInputs as Mock).mockReturnValue({ mutateAsync: () => '0x0001111000' }); }); it('should initialize correctly with default settings', () => { diff --git a/apps/evm/src/app/[lang]/(bridge)/hooks/tests/useGatewayForm.test.ts b/apps/evm/src/app/[lang]/(bridge)/hooks/tests/useGatewayForm.test.ts index b1c9c2874..c513ccb18 100644 --- a/apps/evm/src/app/[lang]/(bridge)/hooks/tests/useGatewayForm.test.ts +++ b/apps/evm/src/app/[lang]/(bridge)/hooks/tests/useGatewayForm.test.ts @@ -1,11 +1,10 @@ -import { useAccount as useSatsAccount } from '@gobob/sats-wagmi'; import { act, renderHook } from '@testing-library/react-hooks'; import { Mock, vi } from 'vitest'; import { useAccount } from 'wagmi'; import { useGatewayForm } from '../useGatewayForm'; -import { useIsContract } from '@/hooks'; +import { useBtcAccount, useIsContract } from '@/hooks'; import { BRIDGE_AMOUNT, BRIDGE_ASSET, BRIDGE_RECIPIENT } from '@/lib/form/bridge'; vi.mock(import('wagmi'), async (importOriginal) => { @@ -26,12 +25,12 @@ vi.mock(import('@/hooks'), async (importOriginal) => { }; }); -vi.mock(import('@gobob/sats-wagmi'), async (importOriginal) => { +vi.mock(import('@/hooks'), async (importOriginal) => { const actual = await importOriginal(); return { ...actual, - useAccount: vi.fn() + useBtcAccount: vi.fn() }; }); @@ -48,7 +47,7 @@ describe('useGatewayForm', () => { beforeEach(() => { (useAccount as Mock).mockReturnValue({ address: '0x123' }); (useIsContract as Mock).mockReturnValue({ isContract: false }); - (useSatsAccount as Mock).mockReturnValue({ address: 'bc1qaddress' }); + (useBtcAccount as Mock).mockReturnValue({ address: 'bc1qaddress' }); }); it('should initialize with correct default values', () => { diff --git a/apps/evm/src/app/[lang]/(bridge)/hooks/useGateway.ts b/apps/evm/src/app/[lang]/(bridge)/hooks/useGateway.ts index 44b148e53..5ba05b45e 100644 --- a/apps/evm/src/app/[lang]/(bridge)/hooks/useGateway.ts +++ b/apps/evm/src/app/[lang]/(bridge)/hooks/useGateway.ts @@ -2,14 +2,6 @@ import { GatewayQuoteParams } from '@gobob/bob-sdk'; import { Bitcoin, CurrencyAmount, ERC20Token } from '@gobob/currency'; -import { - BtcAddressType, - FeeRateReturnType, - useAccount as useSatsAccount, - useBalance as useSatsBalance, - useFeeEstimate as useSatsFeeEstimate, - useFeeRate as useSatsFeeRate -} from '@gobob/sats-wagmi'; import { BITCOIN } from '@gobob/tokens'; import { toast } from '@gobob/ui'; import { t } from '@lingui/macro'; @@ -27,8 +19,17 @@ import { Dispatch, SetStateAction, useCallback, useEffect, useMemo, useState } f import { DebouncedState, useDebounceValue } from 'usehooks-ts'; import { Address, isAddress } from 'viem'; import { useAccount } from 'wagmi'; +import { AddressType } from 'bitcoin-address-validation'; import { INTERVAL } from '@/constants'; +import { + BtcFeeRateReturnType, + useBtcAccount, + useBtcBalance, + useBtcFeeEstimate, + useBtcFeeRate, + useBtcSignAllInputs +} from '@/hooks'; import { gatewaySDK } from '@/lib/bob-sdk'; import { bridgeKeys } from '@/lib/react-query'; import { @@ -80,7 +81,7 @@ const getBalanceAmount = ( return availableBalance; }; -const feeRatesSelect = ({ esplora, memPool }: FeeRateReturnType): GatewayTransactionSpeedData => { +const feeRatesSelect = ({ esplora, memPool }: BtcFeeRateReturnType): GatewayTransactionSpeedData => { return { fastest: Math.ceil(Math.min(esplora[2], memPool.fastestFee)), fast: Math.ceil(Math.min(esplora[4], memPool.halfHourFee)), @@ -163,8 +164,8 @@ const useGateway = ({ params, onError, onMutate, onSuccess }: UseGatewayLiquidit const { address: evmAddress } = useAccount(); - const { address: btcAddress, connector: satsConnector, addressType: btcAddressType } = useSatsAccount(); - const { data: satsBalance } = useSatsBalance(); + const { address: btcAddress, publicKey: btcPublicKey, addressType: btcAddressType } = useBtcAccount(); + const { data: satsBalance } = useBtcBalance(); const [isTopUpEnabled, setTopUpEnabled] = useState(true); const [selectedFee, setSelectedFee] = useState({ speed: GatewayTransactionSpeed.SLOW }); @@ -173,7 +174,7 @@ const useGateway = ({ params, onError, onMutate, onSuccess }: UseGatewayLiquidit const minAmount = useMemo(() => getMinAmount(isTopUpEnabled), [isTopUpEnabled]); - const isTapRootAddress = btcAddressType === BtcAddressType.p2tr; + const isTapRootAddress = btcAddressType === AddressType.p2tr; const liquidityQueryEnabled = Boolean( params.toChain && params.toToken && params.type === GatewayTransactionType.STAKE ? params.strategyAddress : true @@ -211,7 +212,7 @@ const useGateway = ({ params, onError, onMutate, onSuccess }: UseGatewayLiquidit } }); - const feeRatesQueryResult = useSatsFeeRate({ + const feeRatesQueryResult = useBtcFeeRate({ query: { select: feeRatesSelect } @@ -220,12 +221,12 @@ const useGateway = ({ params, onError, onMutate, onSuccess }: UseGatewayLiquidit const feeRate = selectedFee.speed === 'custom' ? selectedFee.networkRate : feeRatesQueryResult.data?.[selectedFee.speed]; - const feeEstimateQueryResult = useSatsFeeEstimate({ + const feeEstimateQueryResult = useBtcFeeEstimate({ opReturnData: evmAddress, feeRate: feeRate, query: { enabled: Boolean(satsBalance && satsBalance.total > 0n && evmAddress), - select: (data) => CurrencyAmount.fromRawAmount(BITCOIN, data.amount) + select: (data) => CurrencyAmount.fromRawAmount(BITCOIN, data.amount || 0) } }); @@ -306,10 +307,12 @@ const useGateway = ({ params, onError, onMutate, onSuccess }: UseGatewayLiquidit } }); + const { mutateAsync: signAllInputsAsync } = useBtcSignAllInputs(); + const mutation = useMutation({ mutationKey: bridgeKeys.btcDeposit(evmAddress, btcAddress), mutationFn: async ({ evmAddress }: { evmAddress: Address | string }): Promise => { - if (!satsConnector) { + if (!btcAddress || !btcPublicKey) { throw new Error('Connector missing'); } @@ -322,7 +325,7 @@ const useGateway = ({ params, onError, onMutate, onSuccess }: UseGatewayLiquidit } if (!params.toChain) { - throw new Error('Something went wrong'); + throw new Error('Missing toChain'); } if (!isAddress(evmAddress)) { @@ -345,13 +348,17 @@ const useGateway = ({ params, onError, onMutate, onSuccess }: UseGatewayLiquidit ...DEFAULT_GATEWAY_QUOTE_PARAMS, toChain: params.toChain, toUserAddress: evmAddress, - fromUserAddress: satsConnector.paymentAddress!, - fromUserPublicKey: satsConnector.publicKey, + fromUserAddress: btcAddress, + fromUserPublicKey: btcPublicKey, gasRefill: isTopUpEnabled ? GAS_REFILL : 0, feeRate }); - const bitcoinTxHex = await satsConnector.signAllInputs(psbtBase64!); + if (!psbtBase64) { + throw new Error('Failed to start order'); + } + + const bitcoinTxHex = await signAllInputsAsync(psbtBase64); // NOTE: user does not broadcast the tx, that is done by // the relayer after it is validated diff --git a/apps/evm/src/app/[lang]/(bridge)/hooks/useGatewayForm.ts b/apps/evm/src/app/[lang]/(bridge)/hooks/useGatewayForm.ts index d30b3a98a..622b3474c 100644 --- a/apps/evm/src/app/[lang]/(bridge)/hooks/useGatewayForm.ts +++ b/apps/evm/src/app/[lang]/(bridge)/hooks/useGatewayForm.ts @@ -1,6 +1,5 @@ 'use client'; -import { useAccount as useSatsAccount } from '@gobob/sats-wagmi'; import { useForm } from '@gobob/ui'; import Big from 'big.js'; import { useEffect } from 'react'; @@ -8,7 +7,7 @@ import { useAccount } from 'wagmi'; import { UseGatewayQueryDataReturnType } from './useGateway'; -import { useIsContract } from '@/hooks'; +import { useBtcAccount, useIsContract } from '@/hooks'; import { BRIDGE_AMOUNT, BRIDGE_ASSET, @@ -31,7 +30,7 @@ const useGatewayForm = ({ query, defaultAsset, onSubmit }: UseGatewayFormProps) const { isContract: isSmartAccount } = useIsContract({ address: evmAddress }); - const { address: btcAddress } = useSatsAccount(); + const { address: btcAddress } = useBtcAccount(); useEffect(() => { if (!query.fee.estimate.data || !form.values[BRIDGE_AMOUNT]) return; diff --git a/apps/evm/src/app/[lang]/(bridge)/stake/components/StakeForm/BtcStakeForm.tsx b/apps/evm/src/app/[lang]/(bridge)/stake/components/StakeForm/BtcStakeForm.tsx index 8333fe91b..0b49cf6cb 100644 --- a/apps/evm/src/app/[lang]/(bridge)/stake/components/StakeForm/BtcStakeForm.tsx +++ b/apps/evm/src/app/[lang]/(bridge)/stake/components/StakeForm/BtcStakeForm.tsx @@ -12,7 +12,7 @@ import { useGateway, useGatewayForm } from '../../../hooks'; import { StrategyData } from './StakeForm'; -import { AuthButton } from '@/connect-ui'; +import { AuthButton } from '@/components'; import { BRIDGE_RECIPIENT, BridgeFormValues } from '@/lib/form/bridge'; import { GatewayTransactionType, InitGatewayTransaction } from '@/types'; diff --git a/apps/evm/src/app/[lang]/index.css b/apps/evm/src/app/[lang]/index.css index efc40e805..72463c89b 100644 --- a/apps/evm/src/app/[lang]/index.css +++ b/apps/evm/src/app/[lang]/index.css @@ -1,8 +1,3 @@ -@font-face { - font-family: eurostar; - src: url(/assets/fonts/eurostar-black-extended.ttf); -} - :root { font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; line-height: 1.5; diff --git a/apps/evm/src/app/[lang]/layout.tsx b/apps/evm/src/app/[lang]/layout.tsx index d98cc4b1e..dd91113ef 100644 --- a/apps/evm/src/app/[lang]/layout.tsx +++ b/apps/evm/src/app/[lang]/layout.tsx @@ -1,25 +1,22 @@ +import { t } from '@lingui/macro'; import { Metadata } from 'next'; import { headers } from 'next/headers'; -import { Inter, Chakra_Petch } from 'next/font/google'; -import { PropsWithChildren } from 'react'; -import { t } from '@lingui/macro'; import { userAgentFromString } from 'next/server'; +import { PropsWithChildren } from 'react'; import { cookieToInitialState } from 'wagmi'; +import './index.css'; +import { inter } from '../fonts'; import linguiConfig from '../../../lingui.config'; -import './index.css'; import { Providers } from './providers'; +import { isProd } from '@/constants'; import { allMessages, getI18nInstance } from '@/i18n/appRouterI18n'; import { LinguiClientProvider } from '@/i18n/provider'; import { PageLangParam, withLinguiLayout } from '@/i18n/withLigui'; -import { UserAgentProvider } from '@/user-agent/provider'; import { getConfig } from '@/lib/wagmi'; -import { isProd } from '@/constants'; - -const inter = Inter({ subsets: ['latin'], display: 'swap' }); -const chakraPetch = Chakra_Petch({ subsets: ['latin'], display: 'swap', weight: '700' }); +import { UserAgentProvider } from '@/user-agent/provider'; export async function generateStaticParams() { return linguiConfig.locales.map((lang) => ({ lang })); @@ -69,7 +66,7 @@ export default withLinguiLayout(function LangLayout({ children, params: { lang } const initialState = cookieToInitialState(getConfig({ isProd }), headers().get('cookie')); return ( - +
diff --git a/apps/evm/src/app/[lang]/nested-providers.tsx b/apps/evm/src/app/[lang]/nested-providers.tsx index 0e198d844..9ea8c196e 100644 --- a/apps/evm/src/app/[lang]/nested-providers.tsx +++ b/apps/evm/src/app/[lang]/nested-providers.tsx @@ -10,8 +10,7 @@ import { useLocalStorage } from 'usehooks-ts'; import { isAddressEqual } from 'viem'; import { useAccount, useAccountEffect, useChainId, useConfig, useSwitchChain } from 'wagmi'; -import { Header, Layout, Sidebar } from '@/components'; -import { ConnectProvider } from '@/connect-ui'; +import { Header, Layout, ReceiveModal, Sidebar } from '@/components'; import { isClient, L2_CHAIN, LocalStorageKey } from '@/constants'; import { useBalances, useGetUser, useLogout, useTokens } from '@/hooks'; import { StyledComponentsRegistry } from '@/lib/styled-components'; @@ -136,18 +135,17 @@ export function NestedProviders({ children }: PropsWithChildren) { return ( - - - - - - - - -
- {children} - - + + + + + + + + +
+ {children} + ); diff --git a/apps/evm/src/app/[lang]/providers.tsx b/apps/evm/src/app/[lang]/providers.tsx index fe4d008c4..6ce88db0e 100644 --- a/apps/evm/src/app/[lang]/providers.tsx +++ b/apps/evm/src/app/[lang]/providers.tsx @@ -1,14 +1,18 @@ 'use client'; -import { SatsWagmiConfig } from '@gobob/sats-wagmi'; +import { BitcoinWalletConnectors } from '@dynamic-labs/bitcoin'; +import { EthereumWalletConnectors } from '@dynamic-labs/ethereum'; +import { BitcoinIcon, EthereumIcon } from '@dynamic-labs/iconic'; +import { DynamicContextProvider, FilterChain } from '@dynamic-labs/sdk-react-core'; +import { DynamicWagmiConnector } from '@dynamic-labs/wagmi-connector'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { PropsWithChildren, useState } from 'react'; import { State, WagmiProvider } from 'wagmi'; import { NestedProviders } from './nested-providers'; -import { bitcoinNetwork, INTERVAL, isProd } from '@/constants'; import { getConfig } from '@/lib/wagmi'; +import { ExternalLinks, INTERVAL, isProd } from '@/constants'; import { FetchError } from '@/types/fetch'; export function Providers({ initialState, children }: PropsWithChildren<{ initialState: State | undefined }>) { @@ -38,15 +42,53 @@ export function Providers({ initialState, children }: PropsWithChildren<{ initia } }) ); - const [config] = useState(() => getConfig({ isProd })); + const [config] = useState(() => getConfig({ isProd, multiInjectedProviderDiscovery: false })); return ( - - - - {children} - - - + }, + walletsFilter: FilterChain('EVM'), + recommendedWallets: [ + { + walletKey: 'okxwallet' + } + ] + }, + { + label: { icon: }, + walletsFilter: FilterChain('BTC') + } + ] + } + } + ] + } + }} + theme='dark' + > + + + {/* */} + + {children} + + + + ); } diff --git a/apps/evm/src/app/[lang]/sign-up/SignUp.style.tsx b/apps/evm/src/app/[lang]/sign-up/SignUp.style.tsx index e2da72410..7e743c0ea 100644 --- a/apps/evm/src/app/[lang]/sign-up/SignUp.style.tsx +++ b/apps/evm/src/app/[lang]/sign-up/SignUp.style.tsx @@ -4,10 +4,10 @@ import styled, { css } from 'styled-components'; const StyledH1 = styled(H1)` ${({ theme }) => { return css` - ${theme.typography('2xl')} + ${theme.typography('3xl')} @media ${theme.breakpoints.up('s')} { - ${theme.typography('3xl')} + ${theme.typography('4xl')} } `; }} diff --git a/apps/evm/src/app/[lang]/sign-up/SignUp.tsx b/apps/evm/src/app/[lang]/sign-up/SignUp.tsx index 01918b13c..0cc516bb4 100644 --- a/apps/evm/src/app/[lang]/sign-up/SignUp.tsx +++ b/apps/evm/src/app/[lang]/sign-up/SignUp.tsx @@ -1,28 +1,29 @@ 'use client'; -import { ChainId } from '@gobob/chains'; -import { Button, Divider, Flex, P, toast } from '@gobob/ui'; +import { useDynamicContext } from '@dynamic-labs/sdk-react-core'; +import { Button, Divider, Flex, P } from '@gobob/ui'; import { Trans, t } from '@lingui/macro'; import { useLingui } from '@lingui/react'; import { useMutation } from '@tanstack/react-query'; import { useParams, useRouter } from 'next/navigation'; import { FormEventHandler, Suspense, useEffect, useState } from 'react'; -import { useAccount, useSwitchChain } from 'wagmi'; +import { useAccount, useAccountEffect } from 'wagmi'; import { Auditors, HighlightText, ReferralInput } from './components'; import { StyledAuthCard, StyledH1 } from './SignUp.style'; import { Geoblock, LoginSection, Main } from '@/components'; -import { useConnectModal } from '@/connect-ui'; -import { L1_CHAIN, L2_CHAIN, RoutesPath, isValidChain } from '@/constants'; +import { RoutesPath } from '@/constants'; import { useGetUser, useSignUp } from '@/hooks'; import { fusionKeys } from '@/lib/react-query'; import { apiClient } from '@/utils'; +import { chakraPetch } from '@/app/fonts'; const SignUp = (): JSX.Element | null => { - const { address, chain } = useAccount(); - const { switchChainAsync } = useSwitchChain(); - const { open } = useConnectModal(); + const { address } = useAccount(); + + const { setShowAuthFlow, setSelectedTabIndex } = useDynamicContext(); + const { i18n } = useLingui(); const router = useRouter(); @@ -31,6 +32,8 @@ const SignUp = (): JSX.Element | null => { const [referalCode, setReferalCode] = useState(''); + const [isConnecting, setConnecting] = useState(false); + const { mutate: signUp, isPending: isLoadingSignUp } = useSignUp(); const { @@ -54,6 +57,16 @@ const SignUp = (): JSX.Element | null => { setReferalCode(code); }; + useAccountEffect({ + onConnect: () => { + if (isConnecting && address) { + signUp(address); + + setConnecting(false); + } + } + }); + const handleSubmit: FormEventHandler = async (e) => { e.preventDefault(); @@ -62,24 +75,12 @@ const SignUp = (): JSX.Element | null => { } if (!address) { - return open({ - onConnectEvm: async ({ address, connector }) => { - if (!address) return; - if (!isValidChain((await connector?.getChainId()) as ChainId)) { - const chain = await connector?.switchChain?.({ chainId: L2_CHAIN }); - - if (!chain) { - return toast.error(Something went wrong. Please try connecting your wallet again.); - } - } - - return signUp(address); - } - }); - } + setSelectedTabIndex(1); + setShowAuthFlow(true); + + setConnecting(true); - if (!chain || (chain && !isValidChain(chain?.id))) { - await switchChainAsync({ chainId: L1_CHAIN }); + return; } return signUp(address); @@ -95,7 +96,7 @@ const SignUp = (): JSX.Element | null => { paddingY={{ base: '4xl', md: '6xl' }} > - + THE FIRST HYBRID L2
diff --git a/apps/evm/src/app/fonts.ts b/apps/evm/src/app/fonts.ts new file mode 100644 index 000000000..ab2463cd5 --- /dev/null +++ b/apps/evm/src/app/fonts.ts @@ -0,0 +1,5 @@ +import { Chakra_Petch, Inter } from 'next/font/google'; + +export const inter = Inter({ subsets: ['latin'], display: 'swap' }); + +export const chakraPetch = Chakra_Petch({ subsets: ['latin'], display: 'swap', weight: '700' }); diff --git a/apps/evm/src/components/AuthButton/AuthButton.tsx b/apps/evm/src/components/AuthButton/AuthButton.tsx new file mode 100644 index 000000000..5788f2612 --- /dev/null +++ b/apps/evm/src/components/AuthButton/AuthButton.tsx @@ -0,0 +1,109 @@ +'use client'; + +import { useDynamicContext, useDynamicModals } from '@dynamic-labs/sdk-react-core'; +import { ChainId, getChainName } from '@gobob/chains'; +import { Button, ButtonProps } from '@gobob/ui'; +import { Trans } from '@lingui/macro'; +import { useIsClient } from 'usehooks-ts'; +import { useAccount, useSwitchChain } from 'wagmi'; + +import { useBtcAccount } from '@/hooks'; + +type Props = { + chain?: ChainId; + isBtcAuthRequired?: boolean; + isEvmAuthRequired?: boolean; + isSilentSwitch?: boolean; + shouldPressAfterSwitch?: boolean; +}; + +type InheritAttrs = Omit; + +type AuthButtonProps = Props & InheritAttrs; + +const AuthButton = ({ + onPress, + onClick, + disabled, + children, + type, + chain: chainProp, + isEvmAuthRequired = true, + isBtcAuthRequired, + isSilentSwitch, + shouldPressAfterSwitch, + ...props +}: AuthButtonProps) => { + const isClient = useIsClient(); + + const { chain, address: evmAddress } = useAccount(); + const { switchChainAsync, isPending: isSwitchNetworkLoading } = useSwitchChain(); + + const { setShowAuthFlow, setSelectedTabIndex } = useDynamicContext(); + const { setShowLinkNewWalletModal } = useDynamicModals(); + + const { address: btcAddress } = useBtcAccount(); + + if (!isClient) { + return ( + + ); + } + + // Comes first because if the connection includes evm, the priority is always evm + if (isEvmAuthRequired && !evmAddress) { + const handlePress = (): void => { + setSelectedTabIndex(1); + setShowAuthFlow(true); + }; + + return ( + + ); + } + + if (isEvmAuthRequired && chainProp && chain?.id !== chainProp) { + const name = getChainName(chainProp); + const capitalizedName = name.charAt(0).toUpperCase() + name.slice(1); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const handlePress = async (e: any) => { + switchChainAsync?.({ chainId: chainProp }); + + if (shouldPressAfterSwitch) { + onPress?.(e); + } + }; + + return ( + + ); + } + + if (isBtcAuthRequired && !btcAddress) { + const handlePress = (): void => { + setSelectedTabIndex(2); + setShowLinkNewWalletModal(true); + }; + + return ( + + ); + } + + return ( + + ); +}; + +export { AuthButton }; diff --git a/apps/evm/src/connect-ui/component/AuthButton/__tests__/AuthButton.test.tsx b/apps/evm/src/components/AuthButton/__tests__/AuthButton.test.tsx similarity index 100% rename from apps/evm/src/connect-ui/component/AuthButton/__tests__/AuthButton.test.tsx rename to apps/evm/src/components/AuthButton/__tests__/AuthButton.test.tsx diff --git a/apps/evm/src/components/AuthButton/index.tsx b/apps/evm/src/components/AuthButton/index.tsx new file mode 100644 index 000000000..d9a49eae5 --- /dev/null +++ b/apps/evm/src/components/AuthButton/index.tsx @@ -0,0 +1 @@ +export { AuthButton } from './AuthButton'; diff --git a/apps/evm/src/components/ChainAsset/ChainAsset.style.tsx b/apps/evm/src/components/ChainAsset/ChainAsset.style.tsx new file mode 100644 index 000000000..48cee303c --- /dev/null +++ b/apps/evm/src/components/ChainAsset/ChainAsset.style.tsx @@ -0,0 +1,23 @@ +import { Flex } from '@gobob/ui'; +import styled from 'styled-components'; + +const StyledWrapper = styled(Flex)` + position: relative; + display: inline-flex; + width: max-content; + height: fit-content; +`; + +const StyledChain = styled.span` + display: inline-flex; + position: absolute; + bottom: 0; + right: 0; + border: 2px solid ${({ theme }) => theme.color('grey-400')}; + background-color: ${({ theme }) => theme.color('grey-400')}; + border-radius: ${({ theme }) => theme.rounded('full')}; + overflow: hidden; + transform: translate(25%, 25%); +`; + +export { StyledWrapper, StyledChain }; diff --git a/apps/evm/src/components/ChainAsset/ChainAsset.tsx b/apps/evm/src/components/ChainAsset/ChainAsset.tsx new file mode 100644 index 000000000..4fe6f8d84 --- /dev/null +++ b/apps/evm/src/components/ChainAsset/ChainAsset.tsx @@ -0,0 +1,28 @@ +import { ChainId } from '@gobob/chains'; +import { FlexProps } from '@gobob/ui'; +import { ReactNode } from 'react'; + +import { ChainLogo } from '../ChainLogo'; +import { ChainLogoProps } from '../ChainLogo/ChainLogo'; + +import { StyledChain, StyledWrapper } from './ChainAsset.style'; + +type Props = { + chainId?: ChainId | 'BTC'; + asset: ReactNode; + chainProps?: Omit; + chainLogo?: ReactNode; +}; + +type InheritAttrs = Omit; + +type ChainAssetProps = Props & InheritAttrs; + +const ChainAsset = ({ asset, chainId, chainLogo, chainProps, ...props }: ChainAssetProps) => ( + + {asset} + {chainLogo || (chainId ? : undefined)} + +); + +export { ChainAsset }; diff --git a/apps/evm/src/components/ChainAsset/index.tsx b/apps/evm/src/components/ChainAsset/index.tsx new file mode 100644 index 000000000..01bc90fd1 --- /dev/null +++ b/apps/evm/src/components/ChainAsset/index.tsx @@ -0,0 +1 @@ +export { ChainAsset } from './ChainAsset'; diff --git a/apps/evm/src/components/ChainLogo/ChainLogo.tsx b/apps/evm/src/components/ChainLogo/ChainLogo.tsx index ac5923f61..a3964d628 100644 --- a/apps/evm/src/components/ChainLogo/ChainLogo.tsx +++ b/apps/evm/src/components/ChainLogo/ChainLogo.tsx @@ -39,3 +39,4 @@ const ChainLogo = ({ chainId, ...props }: ChainLogoProps) => { }; export { ChainLogo }; +export type { ChainLogoProps }; diff --git a/apps/evm/src/components/ConnectButton/ConnectButton.style.tsx b/apps/evm/src/components/ConnectButton/ConnectButton.style.tsx new file mode 100644 index 000000000..f4430f455 --- /dev/null +++ b/apps/evm/src/components/ConnectButton/ConnectButton.style.tsx @@ -0,0 +1,101 @@ +import styled, { css } from 'styled-components'; +import { Drawer } from 'vaul'; + +const StyledContent = styled(Drawer.Content)` + ${({ theme }) => { + return css` + display: flex; + position: fixed; + right: 0; + bottom: 0; + left: 0; + margin-top: 6rem; + flex-direction: column; + outline-style: none; + height: calc(100% - 72px); + + @media ${theme.breakpoints.up('s')} { + top: 0.5rem; + right: 0.5rem; + bottom: 0.5rem; + left: unset; + height: 100%; + margin-top: 0; + + width: 310px; + --initial-transform: calc(100% + 8px); + } + `; + }} +`; + +const StyledUnderlay = styled(Drawer.Overlay)` + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: rgba(0, 0, 0, 0.6); +`; + +const StyledMobileContentWrapper = styled.div` + ${({ theme }) => { + return css` + background: ${theme.color('grey-400')}; + border: 1px solid ${theme.color('grey-300')}; + border-top-right-radius: ${theme.rounded('xl')}; + border-top-left-radius: ${theme.rounded('xl')}; + overflow-y: auto; + padding: 1rem; + flex: 1 1 0%; + + @media ${theme.breakpoints.up('md')} { + border-radius: ${theme.rounded('xl')}; + } + `; + }} +`; + +const StyledTrigger = styled(Drawer.Trigger)` + background-color: transparent; + cursor: pointer; + border: 0; + padding: 0; + appearance: none; + text-align: left; + text-decoration: none; + color: inherit; + touch-action: manipulation; + align-items: center; + justify-content: center; + border: 0px solid; + white-space: nowrap; + + user-select: none; + + ${({ theme }) => { + const { hover } = theme.button.variant.ghost.color.default; + + return css` + ${theme.button.base} + ${theme.button.size.s} + ${theme.button.variant.ghost.color.default.base} + &:hover:not([disabled]) { + ${hover} + } + + &:active:not([disabled]) { + ${theme.button.active} + } + + &[aria-disabled='true'], + &[disabled] { + pointer-events: none; + cursor: not-allowed; + ${theme.button.disabled} + } + `; + }} +`; + +export { StyledContent, StyledTrigger, StyledUnderlay, StyledMobileContentWrapper }; diff --git a/apps/evm/src/components/ConnectButton/ConnectButton.tsx b/apps/evm/src/components/ConnectButton/ConnectButton.tsx new file mode 100644 index 000000000..5ddeea58d --- /dev/null +++ b/apps/evm/src/components/ConnectButton/ConnectButton.tsx @@ -0,0 +1,102 @@ +'use client'; + +import { isEthereumWallet } from '@dynamic-labs/ethereum'; +import { useDynamicContext, useDynamicEvents, useIsLoggedIn, useSwitchWallet } from '@dynamic-labs/sdk-react-core'; +import { Button } from '@gobob/ui'; +import { Trans } from '@lingui/macro'; +import { useStore } from '@tanstack/react-store'; +import { useState } from 'react'; +import { useTheme } from 'styled-components'; +import { useMediaQuery } from 'usehooks-ts'; +import { Drawer } from 'vaul'; +import { isBitcoinWallet } from '@dynamic-labs/bitcoin'; + +import { ProfileDrawer } from '../ProfileDrawer'; +import { ProfileTag } from '../ProfileTag'; + +import { StyledContent, StyledMobileContentWrapper, StyledTrigger, StyledUnderlay } from './ConnectButton.style'; + +import { useDynamicWallets } from '@/hooks'; +import { store } from '@/lib/store'; + +const ConnectButton = (): JSX.Element => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('s')); + + const isReceiveModalOpen = useStore(store, (state) => state.shared.isReceiveModalOpen); + + const [isOpen, setOpen] = useState(false); + + const { setShowAuthFlow, handleUnlinkWallet } = useDynamicContext(); + const switchWallet = useSwitchWallet(); + const isLoggedIn = useIsLoggedIn(); + + const { btcWallet, evmWallet } = useDynamicWallets(); + + const isLoading = isLoggedIn && !(btcWallet || evmWallet); + + useDynamicEvents('walletAdded', async (newWallet, userWallets) => { + const otherWallets = userWallets.filter((wallet) => wallet.id !== newWallet.id); + + // Only newWallet is conencted + if (!otherWallets.length) return; + + if (isEthereumWallet(newWallet)) { + await switchWallet(newWallet.id); + + const evmWallet = otherWallets.find((wallet) => isEthereumWallet(wallet)); + + // unlink if there is another evm wallet + if (evmWallet) { + handleUnlinkWallet(evmWallet.id); + } + } + + if (isBitcoinWallet(newWallet)) { + const btcWallet = otherWallets.find((wallet) => isBitcoinWallet(wallet) && wallet.id !== newWallet.id); + + // unlink if there is another btc wallet + if (btcWallet) { + handleUnlinkWallet(btcWallet.id); + } + } + }); + + if (!isLoggedIn) { + const handleConnect = () => { + setShowAuthFlow(true); + }; + + return ( + + ); + } + + const handleClose = () => setOpen(false); + + return ( + + + + + + + + + + + + + + + ); +}; + +export { ConnectButton }; diff --git a/apps/evm/src/components/ConnectButton/index.tsx b/apps/evm/src/components/ConnectButton/index.tsx new file mode 100644 index 000000000..d5457ba77 --- /dev/null +++ b/apps/evm/src/components/ConnectButton/index.tsx @@ -0,0 +1 @@ +export { ConnectButton } from './ConnectButton'; diff --git a/apps/evm/src/components/CopyAddress/CopyAddress.tsx b/apps/evm/src/components/CopyAddress/CopyAddress.tsx new file mode 100644 index 000000000..ee3b10569 --- /dev/null +++ b/apps/evm/src/components/CopyAddress/CopyAddress.tsx @@ -0,0 +1,71 @@ +'use client'; + +import { Check, CopyClipboard, Flex, Span, SpanProps, Tooltip, UnstyledButton } from '@gobob/ui'; +import { useCopyToClipboard } from 'usehooks-ts'; +import { mergeProps } from '@react-aria/utils'; +import { Trans } from '@lingui/macro'; +import { useHover } from '@react-aria/interactions'; + +import { useIntervalTooltip } from '@/hooks'; + +type Props = { + address: string; + truncatedAddress?: string; + hideIcon?: boolean; + iconVisibility?: 'hide' | 'always' | 'hover'; +}; +type InheritAttrs = Omit; + +type CopyAddressProps = Props & InheritAttrs; + +const CopyAddress = ({ truncatedAddress, address, iconVisibility = 'always', ...props }: CopyAddressProps) => { + const [, copy] = useCopyToClipboard(); + const { buttonProps, tooltipProps } = useIntervalTooltip(); + + const { isHovered, hoverProps } = useHover({ isDisabled: iconVisibility !== 'hover' }); + + const handleCopy = () => copy(address || ''); + + const showIcon = isHovered || iconVisibility === 'always'; + + return ( + + + Copied +
+ } + > + + + {truncatedAddress || address} + {showIcon && ( + + + + )} + + + + ); +}; + +export { CopyAddress }; diff --git a/apps/evm/src/components/CopyAddress/index.tsx b/apps/evm/src/components/CopyAddress/index.tsx new file mode 100644 index 000000000..752cf0041 --- /dev/null +++ b/apps/evm/src/components/CopyAddress/index.tsx @@ -0,0 +1 @@ +export { CopyAddress } from './CopyAddress'; diff --git a/apps/evm/src/components/CopyButton/CopyButton.tsx b/apps/evm/src/components/CopyButton/CopyButton.tsx new file mode 100644 index 000000000..1401a3af8 --- /dev/null +++ b/apps/evm/src/components/CopyButton/CopyButton.tsx @@ -0,0 +1,41 @@ +'use client'; + +import { Button, ButtonProps, Check, CopyClipboard, Flex, IconProps, Tooltip } from '@gobob/ui'; +import { Trans } from '@lingui/macro'; +import { mergeProps } from '@react-aria/utils'; +import { useCopyToClipboard } from 'usehooks-ts'; + +import { useIntervalTooltip } from '@/hooks'; + +type Props = { + value: string; + iconProps?: IconProps; +}; +type InheritAttrs = Omit; + +type CopyButtonProps = Props & InheritAttrs; + +const CopyButton = ({ value, iconProps, ...props }: CopyButtonProps) => { + const [, copy] = useCopyToClipboard(); + const { buttonProps, tooltipProps } = useIntervalTooltip(); + + const handleCopy = () => copy(value || ''); + + return ( + + + Copied + + } + > + + + ); +}; + +export { CopyButton }; diff --git a/apps/evm/src/components/CopyButton/index.tsx b/apps/evm/src/components/CopyButton/index.tsx new file mode 100644 index 000000000..983aa363e --- /dev/null +++ b/apps/evm/src/components/CopyButton/index.tsx @@ -0,0 +1 @@ +export { CopyButton } from './CopyButton'; diff --git a/apps/evm/src/components/Layout/Header.tsx b/apps/evm/src/components/Layout/Header.tsx index eaa5352fd..92df6c073 100644 --- a/apps/evm/src/components/Layout/Header.tsx +++ b/apps/evm/src/components/Layout/Header.tsx @@ -5,7 +5,6 @@ import { Button, EllipsisHorizontal, Flex, - FlexProps, Popover, PopoverBody, PopoverContent, @@ -13,10 +12,11 @@ import { useMediaQuery } from '@gobob/ui'; import { t, Trans } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; import { useState } from 'react'; import { useTheme } from 'styled-components'; -import { useLingui } from '@lingui/react'; +import { ConnectButton } from '../ConnectButton'; import { Logo } from '../Logo'; import { SocialsGroup } from '../SocialsGroup'; @@ -26,18 +26,12 @@ import { useLayoutContext } from './LayoutContext'; import { Nav } from './Nav'; import { NavItem } from './NavItem'; -import { ConnectWallet } from '@/connect-ui'; -import { DocsLinks, RoutesPath } from '@/constants'; +import { ExternalLinks, RoutesPath } from '@/constants'; import { useUserAgent } from '@/user-agent'; -type Props = { isTestnet?: boolean; isFusion?: boolean }; - -type InheritAttrs = Omit; - -type HeaderProps = Props & InheritAttrs; - -const Header = ({ isTestnet, isFusion, ...props }: HeaderProps): JSX.Element => { +const Header = (): JSX.Element => { const { i18n } = useLingui(); + const { setSidebarOpen } = useLayoutContext(); const [isOpen, setOpen] = useState(false); @@ -48,7 +42,7 @@ const Header = ({ isTestnet, isFusion, ...props }: HeaderProps): JSX.Element => const isMobile = isMobileViewport || isMobileUserAgent; return ( - + - diff --git a/apps/evm/src/components/LoginButton/LoginButton.tsx b/apps/evm/src/components/LoginButton/LoginButton.tsx index de2f70605..2f3d1b48f 100644 --- a/apps/evm/src/components/LoginButton/LoginButton.tsx +++ b/apps/evm/src/components/LoginButton/LoginButton.tsx @@ -1,42 +1,40 @@ -import { ChainId } from '@gobob/chains'; -import { Button, ButtonProps, toast } from '@gobob/ui'; -import { Trans } from '@lingui/macro'; +import { useDynamicContext } from '@dynamic-labs/sdk-react-core'; +import { Button, ButtonProps } from '@gobob/ui'; import { mergeProps } from '@react-aria/utils'; -import { useAccount, useSwitchChain } from 'wagmi'; +import { useState } from 'react'; +import { useAccount, useAccountEffect } from 'wagmi'; -import { useConnectModal } from '@/connect-ui'; -import { L1_CHAIN, L2_CHAIN, isValidChain } from '@/constants'; import { useLogin } from '@/hooks'; type LoginButtonProps = ButtonProps; const LoginButton = (props: LoginButtonProps): JSX.Element => { - const { switchChainAsync } = useSwitchChain(); - const { open } = useConnectModal(); - const { address, chain } = useAccount(); + const { address } = useAccount(); + + const { setShowAuthFlow, setSelectedTabIndex } = useDynamicContext(); + + const [isConnecting, setConnecting] = useState(false); + + useAccountEffect({ + onConnect: (data) => { + if (isConnecting) { + login(data.address); + + setConnecting(false); + } + } + }); const { mutate: login, isPending: isLoadingLogin } = useLogin(); const handlePress = async () => { if (!address) { - return open({ - onConnectEvm: async ({ address, connector }) => { - if (!address) return; - if (!isValidChain((await connector?.getChainId()) as ChainId)) { - const chain = await connector?.switchChain?.({ chainId: L2_CHAIN }); - - if (!chain) { - return toast.error(Something went wrong. Please try connecting your wallet again.); - } - } - - return login(address); - } - }); - } + setSelectedTabIndex(1); + setShowAuthFlow(true); + + setConnecting(true); - if (!chain || (chain && !isValidChain(chain?.id))) { - await switchChainAsync?.({ chainId: L1_CHAIN }); + return; } return login(address); diff --git a/apps/evm/src/components/Logo/Logo.tsx b/apps/evm/src/components/Logo/Logo.tsx index 2ee8362ed..8306d110c 100644 --- a/apps/evm/src/components/Logo/Logo.tsx +++ b/apps/evm/src/components/Logo/Logo.tsx @@ -7,9 +7,9 @@ import { useParams } from 'next/navigation'; import { StyledBadge, StyledLogo } from './Logo.style'; +import { isProd } from '@/constants'; + type Props = { - isTestnet?: boolean; - isFusion?: boolean; onPress?: () => void; hidden?: boolean; }; @@ -18,7 +18,7 @@ type InheritAttrs = Omit; type LogoProps = Props & InheritAttrs; -const Logo = ({ isTestnet, isFusion, href = '/', onPress, hidden, ...props }: LogoProps) => { +const Logo = ({ href = '/', onPress, hidden, ...props }: LogoProps) => { const { i18n } = useLingui(); const params = useParams(); @@ -36,13 +36,8 @@ const Logo = ({ isTestnet, isFusion, href = '/', onPress, hidden, ...props }: Lo BOB - {isFusion && ( - - FUSION - - )} - {isTestnet && ( + {!isProd && ( Testnet diff --git a/apps/evm/src/components/ProfileDrawer/ProfileBtcWallet.tsx b/apps/evm/src/components/ProfileDrawer/ProfileBtcWallet.tsx new file mode 100644 index 000000000..3441b9360 --- /dev/null +++ b/apps/evm/src/components/ProfileDrawer/ProfileBtcWallet.tsx @@ -0,0 +1,42 @@ +'use client'; + +import { WalletIcon } from '@dynamic-labs/wallet-book'; +import { CurrencyAmount } from '@gobob/currency'; +import { BTC } from '@gobob/icons'; +import { BITCOIN } from '@gobob/tokens'; +import { truncateBtcAddress } from '@gobob/utils'; +import { Trans } from '@lingui/macro'; + +import { ProfileWallet } from './ProfileWallet'; + +import { useBtcAccount, useBtcBalance, useDynamicWallets } from '@/hooks'; + +type ProfileBtcWalletProps = { + onPressConnect: () => void; + onUnlink: (id: string) => void; +}; + +const ProfileBtcWallet = ({ onPressConnect, onUnlink }: ProfileBtcWalletProps): JSX.Element | null => { + const { data: btcBalance } = useBtcBalance(); + const { address: btcAddress, connector: btcConnector } = useBtcAccount(); + const { btcWallet, evmWallet } = useDynamicWallets(); + + return ( + } + balanceLabel={`${CurrencyAmount.fromRawAmount(BITCOIN, btcBalance?.total || 0).toSignificant()} BTC`} + connectLabel={Connect BTC Wallet} + isRemovable={!!evmWallet} + truncatedAddress={truncateBtcAddress(btcAddress || '')} + walletAvatar={ + btcConnector && + } + walletId={btcWallet?.id} + onPressConnect={onPressConnect} + onUnlink={onUnlink} + /> + ); +}; + +export { ProfileBtcWallet }; diff --git a/apps/evm/src/components/ProfileDrawer/ProfileDrawer.style.tsx b/apps/evm/src/components/ProfileDrawer/ProfileDrawer.style.tsx new file mode 100644 index 000000000..81656521e --- /dev/null +++ b/apps/evm/src/components/ProfileDrawer/ProfileDrawer.style.tsx @@ -0,0 +1,8 @@ +import { Card } from '@gobob/ui'; +import styled from 'styled-components'; + +const StyledWalletCard = styled(Card)` + min-height: 3.375rem; +`; + +export { StyledWalletCard }; diff --git a/apps/evm/src/components/ProfileDrawer/ProfileDrawer.tsx b/apps/evm/src/components/ProfileDrawer/ProfileDrawer.tsx new file mode 100644 index 000000000..cd1fae0d9 --- /dev/null +++ b/apps/evm/src/components/ProfileDrawer/ProfileDrawer.tsx @@ -0,0 +1,133 @@ +'use client'; + +import { useDynamicContext, useDynamicModals, useSwitchWallet } from '@dynamic-labs/sdk-react-core'; +import { Button, Card, Flex, P, Power, QrCode, Skeleton, SolidCreditCard, Tooltip } from '@gobob/ui'; +import { useAccount } from 'wagmi'; + +import { ProfileTag } from '../ProfileTag'; + +import { ProfileBtcWallet } from './ProfileBtcWallet'; +import { ProfileEvmWallet } from './ProfileEvmWallet'; +import { ProfileTokenList } from './ProfileTokenList'; + +import { chakraPetch } from '@/app/fonts'; +import { ExternalLinks, L1_CHAIN } from '@/constants'; +import { useDynamicWallets, useTotalBalance } from '@/hooks'; +import { store } from '@/lib/store'; + +type ProfileDrawerProps = { + onClose: () => void; +}; + +const ProfileDrawer = ({ onClose }: ProfileDrawerProps): JSX.Element => { + const { handleLogOut } = useDynamicContext(); + const { chainId = L1_CHAIN } = useAccount(); + const { handleUnlinkWallet, setSelectedTabIndex, primaryWallet } = useDynamicContext(); + const switchWallet = useSwitchWallet(); + const { setShowLinkNewWalletModal } = useDynamicModals(); + const { evmWallet } = useDynamicWallets(); + + const { formatted, isPending: isBalancePending } = useTotalBalance(chainId); + + const handleLogout = () => { + setSelectedTabIndex(0); + handleLogOut(); + onClose(); + }; + + const handleConnectEvmWallet = () => { + setSelectedTabIndex(1); + setShowLinkNewWalletModal(true); + onClose(); + }; + + const handleConnectBtcWallet = () => { + setSelectedTabIndex(2); + setShowLinkNewWalletModal(true); + onClose(); + }; + + const handlePressBuy = () => { + window.open(ExternalLinks.BANXA, '_blank', 'noreferrer'); + + onClose(); + }; + + const handlePressReceive = () => + store.setState((state) => ({ + ...state, + shared: { + ...state.shared, + isReceiveModalOpen: true + } + })); + + const handleUnlinkBtc = async (walletId: string) => { + if (!evmWallet || !primaryWallet) return; + + if (walletId === primaryWallet?.id) { + await switchWallet(evmWallet.id); + } + + handleUnlinkWallet(walletId); + }; + + return ( + + + + + + + + {isBalancePending ? ( + + ) : ( +

+ {formatted} +

+ )} + + + +

+ Buy +

+
+ + +

+ Receive +

+
+
+ + + + + + + +
+ ); +}; + +export { ProfileDrawer }; diff --git a/apps/evm/src/components/ProfileDrawer/ProfileEvmWallet.tsx b/apps/evm/src/components/ProfileDrawer/ProfileEvmWallet.tsx new file mode 100644 index 000000000..d8febb7e8 --- /dev/null +++ b/apps/evm/src/components/ProfileDrawer/ProfileEvmWallet.tsx @@ -0,0 +1,83 @@ +'use client'; + +import { WalletIcon } from '@dynamic-labs/wallet-book'; +import { getCapitalizedChainName } from '@gobob/chains'; +import { ETH } from '@gobob/icons'; +import { ArrowPath, Flex, Tooltip, UnstyledButton } from '@gobob/ui'; +import { truncateEthAddress } from '@gobob/utils'; +import { Trans } from '@lingui/macro'; +import { useHover } from '@react-aria/interactions'; +import { mergeProps } from '@react-aria/utils'; +import { useAccount, useSwitchChain } from 'wagmi'; + +import { ChainAsset } from '../ChainAsset'; + +import { ProfileWallet, ProfileWalletProps } from './ProfileWallet'; + +import { L1_CHAIN, L2_CHAIN } from '@/constants'; +import { useBalances, useDynamicWallets } from '@/hooks'; + +type ProfileEvmWalletProps = Pick & { + chainId: number; +}; + +const ProfileEvmWallet = ({ chainId, onPressConnect }: ProfileEvmWalletProps): JSX.Element | null => { + const { getBalance } = useBalances(chainId); + const { evmWallet, btcWallet } = useDynamicWallets(); + const { address } = useAccount(); + + const { switchChain } = useSwitchChain(); + + const otherChain = chainId === L1_CHAIN ? L2_CHAIN : L1_CHAIN; + + const { hoverProps, isHovered } = useHover({ isDisabled: !evmWallet }); + + return ( + Switch to {getCapitalizedChainName(otherChain)}}> + switchChain({ chainId: otherChain }) })}> + + + {isHovered && ( + + + + )} +
+ } + chainId={isHovered ? otherChain : chainId} + chainProps={{ size: 'xs' }} + /> + + + ) : ( + + ) + } + balanceLabel={`${getBalance('ETH')?.toSignificant()} ETH`} + connectLabel={Connect EVM Wallet} + isRemovable={!!btcWallet} + truncatedAddress={truncateEthAddress(address || '')} + walletAvatar={ + evmWallet && + } + walletId={evmWallet?.id} + onPressConnect={onPressConnect} + /> + ); +}; + +export { ProfileEvmWallet }; diff --git a/apps/evm/src/components/ProfileDrawer/ProfileTokenList.tsx b/apps/evm/src/components/ProfileDrawer/ProfileTokenList.tsx new file mode 100644 index 000000000..2820d4f76 --- /dev/null +++ b/apps/evm/src/components/ProfileDrawer/ProfileTokenList.tsx @@ -0,0 +1,81 @@ +import { CurrencyAmount } from '@gobob/currency'; +import { usePrices } from '@gobob/hooks'; +import { BITCOIN } from '@gobob/tokens'; +import { Card, Flex, P } from '@gobob/ui'; +import { Trans } from '@lingui/macro'; + +import { ProfileTokenListItem } from './ProfileTokenListItem'; + +import { useBalances, useBtcBalance, useDynamicWallets, useTokens } from '@/hooks'; +import { calculateAmountUSD } from '@/utils'; + +type ProfileTokenListProps = { + chainId: number; +}; + +const ProfileTokenList = ({ chainId }: ProfileTokenListProps): JSX.Element => { + const { data: tokens } = useTokens(chainId); + const { getBalance } = useBalances(chainId); + + const { btcWallet } = useDynamicWallets(); + + const { data: btcBalance } = useBtcBalance(); + + const { getPrice } = usePrices(); + + const list = tokens + ?.map((token) => ({ token, balance: getBalance(token.currency.symbol) })) + .filter((item) => item.balance?.greaterThan(0) && item.token.currency.isToken); + + const ethData = tokens?.find((item) => item.currency.isNative); + const ethBalance = ethData && getBalance(ethData.raw.symbol); + + return ( + + +

+ Wallet +

+
+ {ethBalance && ethData && ( + + )} + + {!!list?.length && ( +

+ Tokens +

+ )} + {list?.map((item) => ( + + ))} +
+ ); +}; + +export { ProfileTokenList }; diff --git a/apps/evm/src/components/ProfileDrawer/ProfileTokenListItem.tsx b/apps/evm/src/components/ProfileDrawer/ProfileTokenListItem.tsx new file mode 100644 index 000000000..811502047 --- /dev/null +++ b/apps/evm/src/components/ProfileDrawer/ProfileTokenListItem.tsx @@ -0,0 +1,42 @@ +import { Avatar, Flex, P, Skeleton, useCurrencyFormatter } from '@gobob/ui'; + +import { ChainAsset } from '@/components'; + +type ProfileTokenListItemProps = { + chainId?: number; + name: string; + logoUrl: string; + balance?: string | number; + symbol: string; + amountUSD?: number; +}; + +const ProfileTokenListItem = ({ chainId, amountUSD, balance, logoUrl, name, symbol }: ProfileTokenListItemProps) => { + const format = useCurrencyFormatter(); + + return ( + + {chainId ? ( + } + chainId={chainId} + chainProps={{ size: 'xs' }} + /> + ) : ( + + )} + +

{name}

+ {balance !== undefined && amountUSD !== undefined ? ( +

+ {balance} {symbol} ({format(amountUSD)}) +

+ ) : ( + + )} +
+
+ ); +}; + +export { ProfileTokenListItem }; diff --git a/apps/evm/src/components/ProfileDrawer/ProfileWallet.tsx b/apps/evm/src/components/ProfileDrawer/ProfileWallet.tsx new file mode 100644 index 000000000..0102ea470 --- /dev/null +++ b/apps/evm/src/components/ProfileDrawer/ProfileWallet.tsx @@ -0,0 +1,113 @@ +'use client'; + +import { Button, Card, ChevronRight, Flex, LinkSlash, Span, Spinner, Tooltip } from '@gobob/ui'; +import { Trans } from '@lingui/macro'; +import { ReactNode, useState } from 'react'; + +import { CopyAddress } from '../CopyAddress'; + +import { StyledWalletCard } from './ProfileDrawer.style'; + +type ProfileWalletProps = { + onPressConnect: () => void; + onUnlink?: (id: string) => void; + avatar: ReactNode; + balanceLabel: ReactNode; + walletAvatar?: ReactNode; + address?: string; + truncatedAddress?: string; + connectLabel: ReactNode; + walletId?: string; + isRemovable?: boolean; +}; + +const ProfileWallet = ({ + onPressConnect, + onUnlink, + avatar, + balanceLabel, + walletAvatar, + address, + truncatedAddress, + connectLabel, + walletId, + isRemovable +}: ProfileWalletProps): JSX.Element | null => { + const [prevWallet, setPrevWallet] = useState(walletId); + const [isDisconnecting, setDisconnecting] = useState(false); + + if (walletId !== prevWallet) { + setPrevWallet(walletId); + setDisconnecting(false); + } + + if (!walletId || !address || !truncatedAddress) { + return ( + + + {avatar} + + {connectLabel} + + + + + ); + } + + const handleUnlink = () => { + onUnlink?.(walletId); + setDisconnecting(true); + }; + + return ( + + + {avatar} + + + {balanceLabel} + + + {walletAvatar} + + + + + {isRemovable && onUnlink && ( + Unlink wallet}> + + + )} + + ); +}; + +export { ProfileWallet }; +export type { ProfileWalletProps }; diff --git a/apps/evm/src/components/ProfileDrawer/index.ts b/apps/evm/src/components/ProfileDrawer/index.ts new file mode 100644 index 000000000..bb784747a --- /dev/null +++ b/apps/evm/src/components/ProfileDrawer/index.ts @@ -0,0 +1 @@ +export { ProfileDrawer } from './ProfileDrawer'; diff --git a/apps/evm/src/components/ProfileTag/ProfileTag.tsx b/apps/evm/src/components/ProfileTag/ProfileTag.tsx new file mode 100644 index 000000000..5d7cde2ac --- /dev/null +++ b/apps/evm/src/components/ProfileTag/ProfileTag.tsx @@ -0,0 +1,92 @@ +'use client'; + +import { useDynamicContext, useIsLoggedIn } from '@dynamic-labs/sdk-react-core'; +import { Flex, Skeleton, Span, SpanProps } from '@gobob/ui'; +import { truncateBtcAddress, truncateEthAddress } from '@gobob/utils'; +import ProfileAvatar from 'boring-avatars'; +import { useAccount } from 'wagmi'; + +import { ChainAsset } from '../ChainAsset'; +import { CopyAddress } from '../CopyAddress'; + +import { useBtcAccount, useDynamicWallets } from '@/hooks'; + +const sizeMap = { + s: { + icon: '1.5rem', + text: 's', + chain: 'xxs' + }, + md: { + icon: '2rem', + text: 'md', + chain: 'xs' + } +} as const; + +const ProfileTag = ({ + size = 's', + hideAddress, + labelProps, + isCopyEnabled +}: { + size?: 's' | 'md'; + hideAddress?: boolean; + labelProps?: SpanProps; + isCopyEnabled?: boolean; +}) => { + const { user, sdkHasLoaded } = useDynamicContext(); + + const { evmWallet } = useDynamicWallets(); + + const { chain } = useAccount(); + const { address: btcAddress } = useBtcAccount(); + const isLoggedIn = useIsLoggedIn(); + + const isLoading = !sdkHasLoaded || (isLoggedIn && !(evmWallet?.address || btcAddress)); + + if (isLoading) { + return ( + + + {!hideAddress && } + + ); + } + + const address = evmWallet?.address || btcAddress; + + const truncatedAddress = evmWallet?.address + ? truncateEthAddress(evmWallet?.address) + : btcAddress + ? truncateBtcAddress(btcAddress) + : undefined; + + return ( + + {user?.userId ? ( + } + chainId={chain?.id} + chainProps={{ size: sizeMap[size].chain }} + style={{ pointerEvents: 'none' }} + /> + ) : undefined} + {hideAddress ? undefined : isCopyEnabled ? ( + + ) : ( + + {truncatedAddress} + + )} + + ); +}; + +export { ProfileTag }; diff --git a/apps/evm/src/components/ProfileTag/index.tsx b/apps/evm/src/components/ProfileTag/index.tsx new file mode 100644 index 000000000..0af92c5d2 --- /dev/null +++ b/apps/evm/src/components/ProfileTag/index.tsx @@ -0,0 +1 @@ +export { ProfileTag } from './ProfileTag'; diff --git a/apps/evm/src/components/ReceiveModal/ReceiveModal.tsx b/apps/evm/src/components/ReceiveModal/ReceiveModal.tsx new file mode 100644 index 000000000..de01a4931 --- /dev/null +++ b/apps/evm/src/components/ReceiveModal/ReceiveModal.tsx @@ -0,0 +1,208 @@ +import { + ArrowLeft, + Button, + Card, + Flex, + Modal, + ModalBody, + ModalHeader, + P, + QrCode, + Span, + UnstyledButton +} from '@gobob/ui'; +import QRCode from 'react-qr-code'; +import { useAccount } from 'wagmi'; +import { Trans } from '@lingui/macro'; +import { useState } from 'react'; +import { useStore } from '@tanstack/react-store'; +import { truncateBtcAddress, truncateEthAddress } from '@gobob/utils'; +import { BTC, ETH } from '@gobob/icons'; +import { WalletIcon } from '@dynamic-labs/wallet-book'; +import { ChainId } from '@gobob/chains'; + +import { Chain } from '../Chain'; +import { ChainAsset } from '../ChainAsset/ChainAsset'; +import { CopyButton } from '../CopyButton'; +import { CopyAddress } from '../CopyAddress'; + +import { useBtcAccount, useDynamicWallets } from '@/hooks'; +import { L1_CHAIN, L2_CHAIN } from '@/constants'; +import { store } from '@/lib/store'; + +enum ReceiveSteps { + Main = 'main', + EVM = 'evm', + BTC = 'btc' +} + +const ReceiveModal = (): JSX.Element => { + const isReceiveModalOpen = useStore(store, (state) => state.shared.isReceiveModalOpen); + + const [step, setStep] = useState(ReceiveSteps.Main); + const { evmWallet } = useDynamicWallets(); + const { address: evmAddress } = useAccount(); + const { address: btcAddress, connector: btcConnector } = useBtcAccount(); + + const address = (step === ReceiveSteps.EVM ? evmAddress : btcAddress) || ''; + + const shortAddress = + step === ReceiveSteps.EVM + ? truncateEthAddress(evmAddress || '') + : btcAddress + ? truncateBtcAddress(btcAddress) + : undefined; + + const handleClose = () => { + setStep(ReceiveSteps.Main); + store.setState((state) => ({ + ...state, + shared: { + ...state.shared, + isReceiveModalOpen: false + } + })); + }; + + return ( + + + {step === ReceiveSteps.Main ? ( + Receive crypto + ) : ( + setStep(ReceiveSteps.Main)}> + + + + Back + + + + )} + + + {step === ReceiveSteps.Main && ( + +

+ Fund your wallet(s) by transferring crypto from another wallet or account. +

+ + {evmAddress && ( + + + } + chainId={ChainId.ETHEREUM} + chainLogo={ + evmWallet && ( + + ) + } + /> + + {truncateEthAddress(evmAddress)} + + + + + + + + )} + {btcAddress && ( + + + } + chainId={ChainId.ETHEREUM} + chainLogo={ + btcConnector && ( + + ) + } + /> + + {truncateBtcAddress(btcAddress)} + + + + + + + + + )} + +
+ )} + {step !== ReceiveSteps.Main && ( + <> + + + + + {step === ReceiveSteps.EVM && ( + +

+ You can receive tokens on our supported networks +

+ + + + +
+ )} + + )} +
+
+ ); +}; + +export { ReceiveModal }; diff --git a/apps/evm/src/components/ReceiveModal/index.tsx b/apps/evm/src/components/ReceiveModal/index.tsx new file mode 100644 index 000000000..7aee75edb --- /dev/null +++ b/apps/evm/src/components/ReceiveModal/index.tsx @@ -0,0 +1 @@ +export { ReceiveModal } from './ReceiveModal'; diff --git a/apps/evm/src/components/SignUpButton/SignUpButton.tsx b/apps/evm/src/components/SignUpButton/SignUpButton.tsx index 762c11bd5..1e29d5bbb 100644 --- a/apps/evm/src/components/SignUpButton/SignUpButton.tsx +++ b/apps/evm/src/components/SignUpButton/SignUpButton.tsx @@ -1,42 +1,40 @@ -import { ChainId } from '@gobob/chains'; -import { Button, ButtonProps, toast } from '@gobob/ui'; -import { Trans } from '@lingui/macro'; +import { useDynamicContext } from '@dynamic-labs/sdk-react-core'; +import { Button, ButtonProps } from '@gobob/ui'; import { mergeProps } from '@react-aria/utils'; -import { useAccount, useSwitchChain } from 'wagmi'; +import { useState } from 'react'; +import { useAccount, useAccountEffect } from 'wagmi'; -import { useConnectModal } from '@/connect-ui'; -import { L2_CHAIN, isValidChain } from '@/constants'; import { useSignUp } from '@/hooks'; type SignUpButtonProps = ButtonProps; const SignUpButton = (props: SignUpButtonProps): JSX.Element => { - const { switchChainAsync } = useSwitchChain(); - const { open } = useConnectModal(); - const { address, chain } = useAccount(); + const { address } = useAccount(); + + const { setShowAuthFlow, setSelectedTabIndex } = useDynamicContext(); + + const [isConnecting, setConnecting] = useState(false); const { mutate: signUp, isPending: isSigningUp } = useSignUp(); + useAccountEffect({ + onConnect: () => { + if (isConnecting && address) { + signUp(address); + + setConnecting(false); + } + } + }); + const handlePress = async () => { if (!address) { - return open({ - onConnectEvm: async ({ address, connector }) => { - if (!address) return; - if (!isValidChain((await connector?.getChainId()) as ChainId)) { - const chain = await connector?.switchChain?.({ chainId: L2_CHAIN }); - - if (!chain) { - return toast.error(Something went wrong. Please try connecting your wallet again.); - } - } - - return signUp(address); - } - }); - } + setSelectedTabIndex(1); + setShowAuthFlow(true); + + setConnecting(true); - if (!chain || (chain && !isValidChain(chain?.id))) { - await switchChainAsync({ chainId: L2_CHAIN }); + return; } return signUp(address); diff --git a/apps/evm/src/components/SocialsGroup/SocialsGroup.tsx b/apps/evm/src/components/SocialsGroup/SocialsGroup.tsx index 0ccfd7a9e..d2402db0c 100644 --- a/apps/evm/src/components/SocialsGroup/SocialsGroup.tsx +++ b/apps/evm/src/components/SocialsGroup/SocialsGroup.tsx @@ -3,7 +3,7 @@ import { Discord, Twitter } from '@gobob/icons'; import { t, Trans } from '@lingui/macro'; import { useLingui } from '@lingui/react'; -import { DocsLinks } from '@/constants'; +import { ExternalLinks } from '@/constants'; type Props = { showDocs?: boolean; @@ -27,23 +27,18 @@ const SocialsGroup = ({ {showDocs && ( )} diff --git a/apps/evm/src/components/WithdrawModal/WithdrawForm.tsx b/apps/evm/src/components/WithdrawModal/WithdrawForm.tsx index d24d88927..1b3e53cfe 100644 --- a/apps/evm/src/components/WithdrawModal/WithdrawForm.tsx +++ b/apps/evm/src/components/WithdrawModal/WithdrawForm.tsx @@ -10,7 +10,7 @@ import { useMemo } from 'react'; import { isAddressEqual } from 'viem'; import { useAccount, usePublicClient, useWriteContract } from 'wagmi'; -import { AuthButton } from '@/connect-ui'; +import { AuthButton } from '@/components'; import { contracts, ContractType, L1_CHAIN } from '@/constants'; import { useLockedTokens } from '@/hooks'; diff --git a/apps/evm/src/components/index.ts b/apps/evm/src/components/index.ts index 8d1b42f95..973664013 100644 --- a/apps/evm/src/components/index.ts +++ b/apps/evm/src/components/index.ts @@ -1,11 +1,15 @@ export * from './AmountLabel'; +export * from './AuthButton'; export * from './Chain'; +export * from './ChainAsset'; export * from './ChainLogo'; +export * from './CopyAddress'; export * from './Geoblock'; export * from './Layout'; -export * from './LoginSection'; -export * from './Trapezoid'; -export * from './WithdrawAlert'; export * from './LoginButton'; +export * from './LoginSection'; +export * from './ReceiveModal'; export * from './SignUpButton'; export * from './SpiceAmount'; +export * from './Trapezoid'; +export * from './WithdrawAlert'; diff --git a/apps/evm/src/connect-ui/component/AuthButton/AuthButton.tsx b/apps/evm/src/connect-ui/component/AuthButton/AuthButton.tsx deleted file mode 100644 index d0304312b..000000000 --- a/apps/evm/src/connect-ui/component/AuthButton/AuthButton.tsx +++ /dev/null @@ -1,114 +0,0 @@ -'use client'; - -import { ChainId, getChainName } from '@gobob/chains'; -import { useAccount as useSatsAccount } from '@gobob/sats-wagmi'; -import { Button, ButtonProps } from '@gobob/ui'; -import { t } from '@lingui/macro'; -import { useLingui } from '@lingui/react'; -import { useIsClient } from 'usehooks-ts'; -import { useAccount, useSwitchChain } from 'wagmi'; - -import { useConnectModal } from '../..'; - -type Props = { - chain?: ChainId; - isBtcAuthRequired?: boolean; - isEvmAuthRequired?: boolean; - isSilentSwitch?: boolean; - shouldPressAfterSwitch?: boolean; -}; - -type InheritAttrs = Omit; - -type AuthButtonProps = Props & InheritAttrs; - -const AuthButton = ({ - onPress, - onClick, - disabled, - children, - type, - chain: chainProp, - isEvmAuthRequired = true, - isBtcAuthRequired, - isSilentSwitch, - shouldPressAfterSwitch, - ...props -}: AuthButtonProps) => { - const { address, chain } = useAccount(); - const { address: btcAddress } = useSatsAccount(); - const { switchChainAsync, isPending: isSwitchNetworkLoading } = useSwitchChain(); - const isClient = useIsClient(); - const { i18n } = useLingui(); - - const { open, type: connectType } = useConnectModal(); - - const inferredProps = { onPress, onClick, disabled, children, type, ...props }; - - if (!isClient) { - const buttonProps = { - onPress: () => open(), - children: t(i18n)`Loading...`, - ...props - }; - - return - Select EVM Wallet - - ) : step === 'btc' ? ( - - - Select Bitcoin Wallet - - ) : ( - Connect Wallet - ); - - return ( - { - // MEMO: handles not allowing modal to be closed when connector modals are open - const ledgerModal = document.getElementById('ModalWrapper'); - - if (ledgerModal) return false; - - if (el.tagName.toLocaleLowerCase() === 'wcm-modal') return false; - - const walletConnect = document.querySelector('[class*="connect-dialog"]'); - - if (walletConnect?.contains(el)) return false; - - return true; - }} - onClose={handleClose} - > - - {modalHeader} - - - {type === 'both' && !step && ( - <> -

- - On BOB, you have the option to link both your EVM and BTC wallets. For optimal functionality, - it's advised to connect wallets from both networks. - -

-

- By clicking ‘Connect’ you acknowledge and agree to the - - Terms of Service - {' '} - and that you have read and understood our - - Privacy policy - - . -

- - {connector && address ? ( - - ) : ( - Connect your EVM Wallet (Mandatory)} - onPress={() => setStep('evm')} - /> - )} - {btcWalletConnector && btcWalletAddress ? ( - - ) : ( - Connect your Bitcoin Wallet (Optional)} - onPress={() => setStep('btc')} - /> - )} - - - )} - {(step === 'evm' || type === 'evm') && ( - - )} - {(step === 'btc' || type === 'btc') && ( - - )} -
- {!step && ( - - - - )} -
- ); - } -); - -ConnectModal.displayName = 'ConnectModal'; - -export { ConnectModal }; -export type { ConnectBtcHandler, ConnectEvmHandler, ConnectModalProps }; diff --git a/apps/evm/src/connect-ui/component/ConnectModal/ConnectWalletCard.tsx b/apps/evm/src/connect-ui/component/ConnectModal/ConnectWalletCard.tsx deleted file mode 100644 index e736d76a0..000000000 --- a/apps/evm/src/connect-ui/component/ConnectModal/ConnectWalletCard.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { ArrowRight, CardProps, Flex, P } from '@gobob/ui'; -import { ReactNode } from 'react'; - -import { StyledConnectWalletCard } from './ConnectModal.style'; - -type Props = { label: ReactNode }; - -type InheritAttrs = Omit; - -type ConnectWalletCardProps = Props & InheritAttrs; - -// FIXME: Card when disabled -const ConnectWalletCard = ({ label, isDisabled, ...props }: ConnectWalletCardProps) => { - return ( - - {/* Added Flex with padding just to match height of related component */} - -

- {label} -

-
- -
- ); -}; - -export { ConnectWalletCard }; diff --git a/apps/evm/src/connect-ui/component/ConnectModal/ConnectedWalletSection.tsx b/apps/evm/src/connect-ui/component/ConnectModal/ConnectedWalletSection.tsx deleted file mode 100644 index 0e0880eab..000000000 --- a/apps/evm/src/connect-ui/component/ConnectModal/ConnectedWalletSection.tsx +++ /dev/null @@ -1,58 +0,0 @@ -'use client'; - -import { Avatar, Button, Card, DocumentDuplicate, Flex, P, Power, Span, Strong, UnstyledButton } from '@gobob/ui'; -import { truncateBtcAddress, truncateEthAddress } from '@gobob/utils'; -import { useCopyToClipboard } from 'usehooks-ts'; -import { Trans } from '@lingui/macro'; - -import { WalletType } from '../../types'; -import { WalletIcon } from '../WalletIcon'; - -type ConnectedWalletSectionProps = { - type: WalletType; - address: string; - icon?: string; - wallet: string; - onDisconnect: () => void; -}; - -const ConnectedWalletSection = ({ type, icon, onDisconnect, address, wallet }: ConnectedWalletSectionProps) => { - const [, copy] = useCopyToClipboard(); - - return ( - - - {icon ? : } - -

- - Connected with {wallet} - -

- copy(address)}> - - - {type === 'evm' ? truncateEthAddress(address) : truncateBtcAddress(address)} - - - - -
-
- -
- ); -}; - -export { ConnectedWalletSection }; diff --git a/apps/evm/src/connect-ui/component/ConnectModal/EvmWalletList.tsx b/apps/evm/src/connect-ui/component/ConnectModal/EvmWalletList.tsx deleted file mode 100644 index d6712d084..000000000 --- a/apps/evm/src/connect-ui/component/ConnectModal/EvmWalletList.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import { Avatar, Flex, List, ListItem, ListProps, Spinner } from '@gobob/ui'; -import { t } from '@lingui/macro'; -import { useLingui } from '@lingui/react'; -import { Connector } from 'wagmi'; - -import { WalletIcon } from '../WalletIcon'; - -enum WalletId { - OkexWallet = 'com.okex.wallet', - CoinbaseWalletSDK = 'coinbaseWalletSDK', - CoinbaseWallet = 'com.coinbase.wallet', - MetaMaskMobile = 'io.metamask' -} - -type PlaceholderConnector = { - id: string; - name: string; - href: string; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - icon?: any; -}; - -const okxPlaceholder: PlaceholderConnector = { - id: WalletId.OkexWallet, - name: 'OKX Wallet', - href: 'https://www.okx.com/web3' -}; - -type Props = { - connector?: Connector; - connectors: readonly Connector[]; - pendingConnector?: Connector; -}; - -type InheritAttrs = Omit; - -type EvmWalletListProps = Props & InheritAttrs; - -const EvmWalletList = ({ - onSelectionChange, - pendingConnector, - connectors: connectorsProp, - connector, - ...props -}: EvmWalletListProps) => { - const { i18n } = useLingui(); - - const okxConnector = connectorsProp.find((c) => c.id === WalletId.OkexWallet) || okxPlaceholder; - - const hasCoinbaseConnector = connectorsProp.some((el) => el.id === WalletId.CoinbaseWallet); - - const wagmiConnectors = connectorsProp.filter( - (c) => !((c.id === WalletId.CoinbaseWalletSDK && hasCoinbaseConnector) || c.id === okxConnector.id) - ); - - const connectors = [okxConnector, ...wagmiConnectors]; - - const disabledKeys = pendingConnector - ? connectors.filter((c) => c.id !== pendingConnector.id).map((c) => c.id) - : undefined; - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const handleSelectionChange = (key: any) => { - const [selectedKey] = [...key]; - - if (selectedKey === WalletId.OkexWallet && !connectorsProp.some((c) => c.id === WalletId.OkexWallet)) { - window.open(okxPlaceholder.href, '_blank', 'noreferrer'); - } else { - onSelectionChange?.(key); - } - }; - - return ( - - {connectors.map((connector) => ( - - - {(connector as Connector)?.icon ? ( - - ) : ( - - )} - {connector.name} - - {connector.id === pendingConnector?.id && } - - ))} - - ); -}; - -export { EvmWalletList }; diff --git a/apps/evm/src/connect-ui/component/ConnectModal/index.tsx b/apps/evm/src/connect-ui/component/ConnectModal/index.tsx deleted file mode 100644 index bfb0c157e..000000000 --- a/apps/evm/src/connect-ui/component/ConnectModal/index.tsx +++ /dev/null @@ -1,2 +0,0 @@ -export { ConnectModal } from './ConnectModal'; -export type { ConnectModalProps, ConnectBtcHandler, ConnectEvmHandler } from './ConnectModal'; diff --git a/apps/evm/src/connect-ui/component/ConnectWallet/ConnectWallet.style.tsx b/apps/evm/src/connect-ui/component/ConnectWallet/ConnectWallet.style.tsx deleted file mode 100644 index 89e65d25f..000000000 --- a/apps/evm/src/connect-ui/component/ConnectWallet/ConnectWallet.style.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { Flex } from '@gobob/ui'; -import styled from 'styled-components'; - -const StyledWallets = styled(Flex)` - > :not(:last-child) { - // Coin one covers 30% of coin two - margin-right: -6px; - } -`; - -export { StyledWallets }; diff --git a/apps/evm/src/connect-ui/component/ConnectWallet/ConnectWallet.tsx b/apps/evm/src/connect-ui/component/ConnectWallet/ConnectWallet.tsx deleted file mode 100644 index 098350c09..000000000 --- a/apps/evm/src/connect-ui/component/ConnectWallet/ConnectWallet.tsx +++ /dev/null @@ -1,88 +0,0 @@ -'use client'; - -import { SatsConnector, useAccount as useSatsAccount } from '@gobob/sats-wagmi'; -import { Avatar, Button, ButtonProps, Flex, Skeleton, Span } from '@gobob/ui'; -import { Trans } from '@lingui/macro'; -import { chain } from '@react-aria/utils'; -import { useIsClient } from 'usehooks-ts'; -import { Connector, useAccount, useConnect } from 'wagmi'; -import { Address } from 'viem'; - -import { useConnectModal } from '../../providers'; -import { ConnectType } from '../../types'; -import { EvmAddressLabel } from '../EvmAddressLabel'; -import { WalletIcon } from '../WalletIcon'; - -import { StyledWallets } from './ConnectWallet.style'; - -const Label = ({ - address, - isPending, - btcConnector, - evmConnector, - connectType -}: { - address?: Address; - isPending?: boolean; - evmConnector?: Connector; - btcConnector?: SatsConnector; - connectType: ConnectType; -}) => { - const isClient = useIsClient(); - - if (!isClient) return ; - - if (!evmConnector && !btcConnector) return Connect Wallet; - - if (isPending) return Authorize Wallet; - - if (connectType === 'evm' && address) { - return ; - } - - return ( - - - {evmConnector && - (evmConnector.icon ? ( - - ) : ( - - ))} - {btcConnector && - (btcConnector.icon ? ( - - ) : ( - - ))} - - - Wallet - - - ); -}; - -type ConnectWalletProps = ButtonProps; - -const ConnectWallet = ({ onPress, variant = 'outline', ...props }: ConnectWalletProps): JSX.Element => { - const { isPending } = useConnect(); - const { connector: evmConnector, address } = useAccount(); - const { connector: btcConnector } = useSatsAccount(); - const { open, type: connectType } = useConnectModal(); - - return ( - - ); -}; - -export { ConnectWallet }; -export type { ConnectWalletProps }; diff --git a/apps/evm/src/connect-ui/component/ConnectWallet/__tests__/ConnectWallet.test.tsx b/apps/evm/src/connect-ui/component/ConnectWallet/__tests__/ConnectWallet.test.tsx deleted file mode 100644 index 299904af7..000000000 --- a/apps/evm/src/connect-ui/component/ConnectWallet/__tests__/ConnectWallet.test.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { BOBUIProvider } from '@gobob/ui'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { render } from '@testing-library/react'; -import { WagmiProvider } from 'wagmi'; - -import { ConnectWallet } from '..'; - -import { LinguiClientProvider } from '@/i18n/provider'; -import { getConfig } from '@/lib/wagmi'; - -describe('ConnectWallet', () => { - it('should render correctly', () => { - const { unmount } = render(, { - wrapper: ({ children }) => ( - - - - {children} - - - - ) - }); - - expect(() => unmount()).not.toThrow(); - }); -}); diff --git a/apps/evm/src/connect-ui/component/ConnectWallet/index.tsx b/apps/evm/src/connect-ui/component/ConnectWallet/index.tsx deleted file mode 100644 index 6c553fc48..000000000 --- a/apps/evm/src/connect-ui/component/ConnectWallet/index.tsx +++ /dev/null @@ -1,2 +0,0 @@ -export type { ConnectWalletProps } from './ConnectWallet'; -export { ConnectWallet } from './ConnectWallet'; diff --git a/apps/evm/src/connect-ui/component/EvmAddressLabel/EvmAddressLabel.tsx b/apps/evm/src/connect-ui/component/EvmAddressLabel/EvmAddressLabel.tsx deleted file mode 100644 index f467f2a14..000000000 --- a/apps/evm/src/connect-ui/component/EvmAddressLabel/EvmAddressLabel.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { truncateEthAddress } from '@gobob/utils'; -import { Flex, FlexProps, Span } from '@gobob/ui'; -import Jazzicon, { jsNumberForAddress } from 'react-jazzicon'; - -type Props = { address: string }; - -type InheritAttrs = Omit; - -type EvmAddressLabelProps = Props & InheritAttrs; - -const EvmAddressLabel = ({ - address, - alignItems = 'center', - gap = 's', - ...props -}: EvmAddressLabelProps): JSX.Element => ( - - - {truncateEthAddress(address)} - -); - -export { EvmAddressLabel }; -export type { EvmAddressLabelProps }; diff --git a/apps/evm/src/connect-ui/component/EvmAddressLabel/index.tsx b/apps/evm/src/connect-ui/component/EvmAddressLabel/index.tsx deleted file mode 100644 index 7a42da41c..000000000 --- a/apps/evm/src/connect-ui/component/EvmAddressLabel/index.tsx +++ /dev/null @@ -1,2 +0,0 @@ -export type { EvmAddressLabelProps } from './EvmAddressLabel'; -export { EvmAddressLabel } from './EvmAddressLabel'; diff --git a/apps/evm/src/connect-ui/component/WalletIcon/WalletIcon.tsx b/apps/evm/src/connect-ui/component/WalletIcon/WalletIcon.tsx deleted file mode 100644 index d76328902..000000000 --- a/apps/evm/src/connect-ui/component/WalletIcon/WalletIcon.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { IconProps, Wallet } from '@gobob/ui'; -import { - BinanceWeb3Wallet, - CoinbaseWallet, - LeatherWallet, - Ledger, - Metamask, - OKXWallet, - RabbyWallet, - TalismanWallet, - TrustWallet, - UnisatWallet, - WalletConnect, - Xverse -} from '@gobob/icons'; - -const Icons: Record = { - Injected: Wallet, - 'Binance Web3 Wallet': BinanceWeb3Wallet, - MetaMask: Metamask, - 'Trust Wallet': TrustWallet, - WalletConnect: WalletConnect, - WalletConnectLegacy: WalletConnect, - 'Coinbase Wallet': CoinbaseWallet, - Ledger: Ledger, - Xverse: Xverse, - Leather: LeatherWallet, - UniSat: UnisatWallet, - Talisman: TalismanWallet, - 'OKX Wallet': OKXWallet, - Rabby: RabbyWallet -}; - -type WalletIconProps = Omit & { name: string }; - -const WalletIcon = ({ name, ...props }: WalletIconProps) => { - const Icon = name in Icons ? Icons[name] : Icons.Injected; - - if (!Icon) return null; - - return ; -}; - -export { WalletIcon }; -export type { WalletIconProps }; diff --git a/apps/evm/src/connect-ui/component/WalletIcon/index.tsx b/apps/evm/src/connect-ui/component/WalletIcon/index.tsx deleted file mode 100644 index 07a6ecc21..000000000 --- a/apps/evm/src/connect-ui/component/WalletIcon/index.tsx +++ /dev/null @@ -1,2 +0,0 @@ -export { WalletIcon } from './WalletIcon'; -export type { WalletIconProps } from './WalletIcon'; diff --git a/apps/evm/src/connect-ui/component/index.ts b/apps/evm/src/connect-ui/component/index.ts deleted file mode 100644 index 1d528216f..000000000 --- a/apps/evm/src/connect-ui/component/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './AuthButton'; -export * from './ConnectModal'; -export * from './ConnectWallet'; -export * from './EvmAddressLabel'; -export * from './WalletIcon'; diff --git a/apps/evm/src/connect-ui/index.ts b/apps/evm/src/connect-ui/index.ts deleted file mode 100644 index 283f90d64..000000000 --- a/apps/evm/src/connect-ui/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './component'; -export * from './providers'; -export * from './types'; diff --git a/apps/evm/src/connect-ui/providers/connect.tsx b/apps/evm/src/connect-ui/providers/connect.tsx deleted file mode 100644 index e9aae3992..000000000 --- a/apps/evm/src/connect-ui/providers/connect.tsx +++ /dev/null @@ -1,86 +0,0 @@ -'use client'; - -import { FC, ReactNode, RefObject, createContext, useContext, useRef, useState } from 'react'; -import { mergeProps } from '@react-aria/utils'; - -import { ConnectType } from '../types'; -import { ConnectBtcHandler, ConnectEvmHandler, ConnectModal, ConnectModalProps } from '../component'; - -type UseConnectModalProps = { onOpen?: () => void; onClose?: () => void }; - -type OpenFnOptions = { - onConnectEvm?: ConnectEvmHandler; - onConnectBtc?: ConnectBtcHandler; -}; - -type ConnectData = { - ref: RefObject | null; - isOpen: boolean; - type: ConnectType; - open: (options?: OpenFnOptions) => void; - close: () => void; -}; - -const ConnectContext = createContext({ - ref: null, - isOpen: false, - type: 'both', - open: () => {}, - close: () => {} -}); - -const useConnectModal = (): ConnectData => { - const context = useContext(ConnectContext); - - if (context === undefined) { - throw new Error('useConnectModal must be used within a ConnectProvider!'); - } - - return context; -}; - -type ConnectWalletContextProps = { - children: ReactNode; - type?: ConnectType; - modalProps?: Partial>; -}; - -const ConnectProvider: FC = ({ children, type = 'both', modalProps }) => { - const [state, setState] = useState<{ - isOpen: boolean; - onConnectEvm?: ConnectEvmHandler; - onConnectBtc?: ConnectBtcHandler; - }>({ - isOpen: false - }); - - const ref = useRef(null); - - const handleOpen = (options?: OpenFnOptions) => { - setState({ - isOpen: true, - onConnectBtc: options?.onConnectBtc, - onConnectEvm: options?.onConnectEvm - }); - }; - - const handleClose = () => { - setState((s) => ({ ...s, isOpen: false, onConnectEvm: undefined, onConnectBtc: undefined })); - }; - - return ( - - {children} - - - ); -}; - -export { ConnectProvider, useConnectModal }; -export type { UseConnectModalProps }; diff --git a/apps/evm/src/connect-ui/providers/index.ts b/apps/evm/src/connect-ui/providers/index.ts deleted file mode 100644 index b1dbc5c5c..000000000 --- a/apps/evm/src/connect-ui/providers/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './connect'; diff --git a/apps/evm/src/connect-ui/types/connect.ts b/apps/evm/src/connect-ui/types/connect.ts deleted file mode 100644 index dabbdedae..000000000 --- a/apps/evm/src/connect-ui/types/connect.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type WalletType = 'evm' | 'btc'; - -export type ConnectType = WalletType | 'both'; diff --git a/apps/evm/src/connect-ui/types/index.ts b/apps/evm/src/connect-ui/types/index.ts deleted file mode 100644 index b1dbc5c5c..000000000 --- a/apps/evm/src/connect-ui/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './connect'; diff --git a/apps/evm/src/connect-ui/types/styled-components.d.ts b/apps/evm/src/connect-ui/types/styled-components.d.ts deleted file mode 100644 index 596b831c8..000000000 --- a/apps/evm/src/connect-ui/types/styled-components.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Theme } from '@gobob/ui'; - -declare module 'styled-components' { - export interface DefaultTheme extends Theme {} -} diff --git a/apps/evm/src/constants/bitcoin.ts b/apps/evm/src/constants/bitcoin.ts index 0a5b68576..8eaa1041e 100644 --- a/apps/evm/src/constants/bitcoin.ts +++ b/apps/evm/src/constants/bitcoin.ts @@ -1,8 +1,6 @@ -import { isTestnetChainId } from '@gobob/chains'; -import { Network } from '@gobob/sats-wagmi'; +import { Network } from 'bitcoin-address-validation'; +import { isProd } from './chain'; -import { L1_CHAIN, isProd } from './chain'; - -export const bitcoinNetwork = isTestnetChainId(L1_CHAIN) ? Network.testnet : Network.mainnet; +export const bitcoinNetwork = isProd ? Network.mainnet : Network.testnet; export const mempoolUrl = isProd ? 'https://mempool.space' : 'https://mempool.space/testnet'; diff --git a/apps/evm/src/constants/chain.ts b/apps/evm/src/constants/chain.ts index 7000d88d5..38487f0f9 100644 --- a/apps/evm/src/constants/chain.ts +++ b/apps/evm/src/constants/chain.ts @@ -21,11 +21,9 @@ if (!L2_CHAIN || !validL2Chains.includes(L2_CHAIN) || (isL1Testnet && !isTestnet throw new Error('Missing or invalid L2 chain'); } -const isValidChain = (chainId: ChainId) => chainId === L1_CHAIN || chainId === L2_CHAIN; - const isProd = !isL1Testnet; const chainL1: Chain = isProd ? mainnet : sepolia; const chainL2: Chain = isProd ? bob : bobSepolia; -export { chainL1, chainL2, isProd, isValidChain, L1_CHAIN, L2_CHAIN }; +export { chainL1, chainL2, isProd, L1_CHAIN, L2_CHAIN }; diff --git a/apps/evm/src/constants/links.ts b/apps/evm/src/constants/links.ts index 04f08c246..c9412ff96 100644 --- a/apps/evm/src/constants/links.ts +++ b/apps/evm/src/constants/links.ts @@ -1,6 +1,12 @@ -const DocsLinks = { - HOME: 'https://docs.gobob.xyz/', - OP_STACK: 'https://docs.gobob.xyz/docs/learn/bob-stack/op-stack' +const ExternalLinks = { + HOMEPAGE: 'https://gobob.xyz/', + DOCS: 'https://docs.gobob.xyz/', + TERMS_OF_SERVICE: + 'https://cdn.prod.website-files.com/6620e8932695794632789d89/668eaca0c8c67436ee679ca0_GoBob%20-%20Terms%20of%20Service%20(LW%20draft%207-9)(149414568.5).pdf', + SAFE: 'https://safe.gobob.xyz/welcome', + DISCORD: 'https://discord.gg/gobob', + X: 'https://x.com/build_on_bob', + BANXA: 'https://checkout.banxa.com/?coinType=ETH&fiatType=EUR&blockchain=BOB' }; -export { DocsLinks }; +export { ExternalLinks }; diff --git a/apps/evm/src/hooks/btc/index.ts b/apps/evm/src/hooks/btc/index.ts new file mode 100644 index 000000000..34d846acc --- /dev/null +++ b/apps/evm/src/hooks/btc/index.ts @@ -0,0 +1,5 @@ +export * from './useAccount'; +export * from './useBalance'; +export * from './useFeeEstimate'; +export * from './useFeeRate'; +export * from './useSignAllInputs'; diff --git a/apps/evm/src/hooks/btc/useAccount.tsx b/apps/evm/src/hooks/btc/useAccount.tsx new file mode 100644 index 000000000..9a47fdde5 --- /dev/null +++ b/apps/evm/src/hooks/btc/useAccount.tsx @@ -0,0 +1,33 @@ +'use client'; + +import { getAddressInfo } from 'bitcoin-address-validation'; +import { useMemo } from 'react'; + +import { useDynamicWallets } from '../dynamic'; + +const useBtcAccount = () => { + const { btcWallet } = useDynamicWallets(); + + const paymentAddress = btcWallet?.additionalAddresses.find((address) => address.type === 'payment'); + + const btcAddress = useMemo( + () => + paymentAddress + ? { address: paymentAddress.address, publicKey: paymentAddress.publicKey } + : btcWallet?.additionalAddresses.find((additionalAddress) => additionalAddress.address === btcWallet.address), + [btcWallet?.additionalAddresses, btcWallet?.address, paymentAddress] + ); + + const addressType = useMemo(() => (btcAddress ? getAddressInfo(btcAddress.address).type : undefined), [btcAddress]); + + return { + address: btcAddress?.address, + publicKey: btcAddress?.publicKey, + addressType, + connector: btcWallet?.connector, + additionalAddresses: btcWallet?.additionalAddresses, + isAuthenticated: btcWallet?.isAuthenticated + }; +}; + +export { useBtcAccount }; diff --git a/apps/evm/src/hooks/btc/useBalance.tsx b/apps/evm/src/hooks/btc/useBalance.tsx new file mode 100644 index 000000000..ddaf41d54 --- /dev/null +++ b/apps/evm/src/hooks/btc/useBalance.tsx @@ -0,0 +1,39 @@ +'use client'; + +import { EsploraClient } from '@gobob/bob-sdk'; +import { useQuery, UseQueryOptions } from '@tanstack/react-query'; + +import { useBtcAccount } from './useAccount'; + +import { bitcoinNetwork, INTERVAL } from '@/constants'; + +type GetBtcBalanceReturnType = { confirmed: bigint; unconfirmed: bigint; total: bigint }; + +type UseBtcBalanceProps = Omit< + UseQueryOptions, + 'initialData' | 'queryFn' | 'queryKey' | 'enabled' +>; + +const useBtcBalance = (props: UseBtcBalanceProps = {}) => { + const { address } = useBtcAccount(); + + return useQuery({ + enabled: Boolean(address), + queryKey: ['sats-balance', bitcoinNetwork, address], + refetchInterval: INTERVAL.SECONDS_30, + queryFn: async () => { + if (!address) { + return { confirmed: BigInt(0), unconfirmed: BigInt(0), total: BigInt(0) }; + } + + const esploraClient = new EsploraClient(bitcoinNetwork); + + const { confirmed, unconfirmed, total } = await esploraClient.getBalance(address); + + return { confirmed: BigInt(confirmed), unconfirmed: BigInt(unconfirmed), total: BigInt(total) }; + }, + ...props + }); +}; + +export { useBtcBalance }; diff --git a/apps/evm/src/hooks/btc/useFeeEstimate.tsx b/apps/evm/src/hooks/btc/useFeeEstimate.tsx new file mode 100644 index 000000000..612e2230c --- /dev/null +++ b/apps/evm/src/hooks/btc/useFeeEstimate.tsx @@ -0,0 +1,54 @@ +'use client'; + +import { estimateTxFee } from '@gobob/bob-sdk'; +import { UndefinedInitialDataOptions, useQuery } from '@tanstack/react-query'; + +import { useBtcAccount } from './useAccount'; +import { useBtcFeeRate } from './useFeeRate'; + +import { bitcoinNetwork, INTERVAL } from '@/constants'; + +type UseBtcFeeEstimateReturnType = { amount: bigint; feeRate: number }; + +type UseBtcFeeEstimateProps = { + query?: Omit< + UndefinedInitialDataOptions, + 'queryKey' | 'queryFn' + >; + amount?: number; + opReturnData?: string; + confirmationTarget?: number; + feeRate?: number; +}; + +function useBtcFeeEstimate({ + amount, + opReturnData, + feeRate: feeRateProp, + query +}: UseBtcFeeEstimateProps = {}) { + const { address, publicKey } = useBtcAccount(); + const { data: feeRateData } = useBtcFeeRate(); + + const enabled = Boolean(feeRateData && address && (query?.enabled !== undefined ? query.enabled : true)); + + const feeRate = feeRateProp || feeRateData?.esplora[6]; + + return useQuery({ + queryKey: ['sats-fee-estimate', amount, address, opReturnData, bitcoinNetwork, feeRate], + queryFn: async () => { + if (!address || !feeRate) { + throw new Error('Failed to estimate fee'); + } + + return { feeRate, amount: await estimateTxFee(address, amount, publicKey, opReturnData, feeRate) }; + }, + refetchOnWindowFocus: false, + refetchOnMount: false, + refetchInterval: INTERVAL.MINUTE, + ...query, + enabled + }); +} + +export { useBtcFeeEstimate }; diff --git a/apps/evm/src/hooks/btc/useFeeRate.tsx b/apps/evm/src/hooks/btc/useFeeRate.tsx new file mode 100644 index 000000000..42f5f5ff3 --- /dev/null +++ b/apps/evm/src/hooks/btc/useFeeRate.tsx @@ -0,0 +1,46 @@ +'use client'; + +import { EsploraClient, EsploraFeeEstimates, MempoolClient, MempoolRecomendedFee } from '@gobob/bob-sdk'; +import { UndefinedInitialDataOptions, useQuery } from '@tanstack/react-query'; + +import { bitcoinNetwork, INTERVAL } from '@/constants'; + +type BtcFeeRateReturnType = { + memPool: Record; + esplora: Record; +}; + +type UseBtcFeeRateProps = { + rate?: keyof BtcFeeRateReturnType; + query?: Omit< + UndefinedInitialDataOptions, + 'queryKey' | 'queryFn' + >; +}; + +function useBtcFeeRate({ query }: UseBtcFeeRateProps = {}) { + return useQuery({ + queryKey: ['sats-fee-rate', bitcoinNetwork], + queryFn: async () => { + const memPoolClient = new MempoolClient(bitcoinNetwork); + const esploraClient = new EsploraClient(bitcoinNetwork); + + const [memPoolFeeRate, esploraFeeRate] = await Promise.all([ + memPoolClient.getRecommendedFees(), + esploraClient.getFeeEstimates() + ]); + + return { + memPool: memPoolFeeRate, + esplora: esploraFeeRate + }; + }, + refetchOnWindowFocus: false, + refetchOnMount: false, + refetchInterval: INTERVAL.MINUTE, + ...query + }); +} + +export { useBtcFeeRate }; +export type { BtcFeeRateReturnType }; diff --git a/apps/evm/src/hooks/btc/useSignAllInputs.tsx b/apps/evm/src/hooks/btc/useSignAllInputs.tsx new file mode 100644 index 000000000..9f462da27 --- /dev/null +++ b/apps/evm/src/hooks/btc/useSignAllInputs.tsx @@ -0,0 +1,64 @@ +'use client'; + +import { base64 } from '@scure/base'; +import { Transaction } from '@scure/btc-signer'; +import { useMutation, UseMutationOptions } from '@tanstack/react-query'; + +import { useDynamicWallets } from '../dynamic'; + +import { useBtcAccount } from './useAccount'; + +import { bitcoinNetwork } from '@/constants'; + +type UseBtcSignAllInputsProps = { + mutation?: Omit, 'mutationFn' | 'mutationKey'>; +}; + +function useBtcSignAllInputs({ mutation }: UseBtcSignAllInputsProps = {}) { + const { btcWallet } = useDynamicWallets(); + + const { address: btcAddress } = useBtcAccount(); + + return useMutation({ + mutationKey: ['sats-sign-all-inputs', bitcoinNetwork], + mutationFn: async (psbtBase64: string) => { + if (!btcWallet || !btcAddress) { + throw new Error('BTC Wallet not connected'); + } + + // Sign all inputs with the payment address + const unsignedTx = Transaction.fromPSBT(base64.decode(psbtBase64)); + const inputLength = unsignedTx.inputsLength; + const inputsToSign = Array.from({ length: inputLength }, (_, i) => i); + const psbt = unsignedTx.toPSBT(0); + + // Define the parameters for signing the PSBT + const params = { + allowedSighash: [1], + unsignedPsbtBase64: base64.encode(psbt), + signature: [ + { + address: btcAddress, + signingIndexes: inputsToSign + } + ] + }; + + // Request the wallet to sign the PSBT + const signedPsbt = await btcWallet.signPsbt(params); + + if (!signedPsbt) { + throw new Error('Not signed'); + } + + const signedTx = Transaction.fromPSBT(base64.decode(signedPsbt.signedPsbt)); + + signedTx.finalize(); + + return signedTx.hex; + }, + ...mutation + }); +} + +export { useBtcSignAllInputs }; diff --git a/apps/evm/src/hooks/dynamic/index.ts b/apps/evm/src/hooks/dynamic/index.ts new file mode 100644 index 000000000..57ea3c35e --- /dev/null +++ b/apps/evm/src/hooks/dynamic/index.ts @@ -0,0 +1 @@ +export * from './useDynamicWallets'; diff --git a/apps/evm/src/hooks/dynamic/useDynamicWallets.tsx b/apps/evm/src/hooks/dynamic/useDynamicWallets.tsx new file mode 100644 index 000000000..6d7feaddd --- /dev/null +++ b/apps/evm/src/hooks/dynamic/useDynamicWallets.tsx @@ -0,0 +1,16 @@ +'use client'; + +import { isEthereumWallet } from '@dynamic-labs/ethereum'; +import { isBitcoinWallet } from '@dynamic-labs/bitcoin'; +import { useUserWallets } from '@dynamic-labs/sdk-react-core'; + +const useDynamicWallets = () => { + const userWallets = useUserWallets(); + + return { + evmWallet: userWallets.find((wallet) => isEthereumWallet(wallet)), + btcWallet: userWallets.find((wallet) => isBitcoinWallet(wallet)) + }; +}; + +export { useDynamicWallets }; diff --git a/apps/evm/src/hooks/index.ts b/apps/evm/src/hooks/index.ts index 3957406d3..fe695b920 100644 --- a/apps/evm/src/hooks/index.ts +++ b/apps/evm/src/hooks/index.ts @@ -7,6 +7,7 @@ export * from './useGeoblock'; export * from './useGetStrategies'; export * from './useGetUser'; export * from './useHaltedLockedTokens'; +export * from './useIntervalTooltip'; export * from './useIsContract'; export * from './useLockedTokens'; export * from './useLogin'; @@ -15,7 +16,10 @@ export * from './useLotteryRoll'; export * from './useLotteryStats'; export * from './usePublicClient'; export * from './useSignUp'; +export * from './useSubscribeBalances'; export * from './useTokens'; export * from './useTotalBalance'; export * from './useWalletClient'; -export * from './useSubscribeBalances'; + +export * from './btc'; +export * from './dynamic'; diff --git a/apps/evm/src/hooks/useIntervalTooltip.ts b/apps/evm/src/hooks/useIntervalTooltip.ts new file mode 100644 index 000000000..3e4dfbf13 --- /dev/null +++ b/apps/evm/src/hooks/useIntervalTooltip.ts @@ -0,0 +1,28 @@ +import { useState } from 'react'; +import { useInterval } from 'usehooks-ts'; + +type UseIntervalTooltipProps = { + delay?: number; +}; + +const useIntervalTooltip = ({ delay = 1000 }: UseIntervalTooltipProps = {}) => { + const [isOpen, setOpen] = useState(false); + + useInterval( + () => { + // Your custom logic here + setOpen(false); + }, + // Delay in milliseconds or null to stop it + isOpen ? delay : null + ); + + return { + buttonProps: { onPress: () => setOpen(true) }, + tooltipProps: { + isOpen + } + }; +}; + +export { useIntervalTooltip }; diff --git a/apps/evm/src/hooks/useTotalBalance.ts b/apps/evm/src/hooks/useTotalBalance.ts index 4e537d921..94509fc1f 100644 --- a/apps/evm/src/hooks/useTotalBalance.ts +++ b/apps/evm/src/hooks/useTotalBalance.ts @@ -2,30 +2,43 @@ import { ChainId } from '@gobob/chains'; import { usePrices } from '@gobob/hooks'; import { useCurrencyFormatter, useLocale } from '@gobob/ui'; import Big from 'big.js'; -import { useMemo } from 'react'; +import { CurrencyAmount } from '@gobob/currency'; +import { BITCOIN } from '@gobob/tokens'; import { useBalances } from './useBalances'; +import { useBtcBalance } from './btc'; +import { useDynamicWallets } from './dynamic'; + +import { calculateAmountUSD } from '@/utils'; const useTotalBalance = (chainId: ChainId) => { const { getPrice } = usePrices(); - const { balances } = useBalances(chainId); + const { balances, isPending: isEvmBalancePending } = useBalances(chainId); + + const { btcWallet, evmWallet } = useDynamicWallets(); + const { data: btcBalance, isPending: isBtcBalancePending } = useBtcBalance(); + const format = useCurrencyFormatter(); const { locale } = useLocale(); - return useMemo(() => { - const total = Object.values(balances).reduce( - (total, balance) => total.plus(new Big(balance.toExact()).mul(getPrice(balance.currency.symbol) || 0).toNumber()), - new Big(0) - ); - - return { - formatted: format(total.toNumber()), - compact: Intl.NumberFormat(locale, { notation: 'compact', style: 'currency', currency: 'USD' }).format( - total.toNumber() - ), - amount: total - }; - }, [balances, format, getPrice, locale]); + const total = Object.values(balances).reduce( + (total, balance) => total.plus(calculateAmountUSD(balance, getPrice(balance.currency.symbol) || 0)), + new Big( + calculateAmountUSD( + CurrencyAmount.fromRawAmount(BITCOIN, btcBalance?.total.toString() || 0), + getPrice(BITCOIN.symbol) + ) + ) + ); + + return { + isPending: (evmWallet ? isEvmBalancePending : false) || (btcWallet ? isBtcBalancePending : false), + formatted: format(total.toNumber()), + compact: Intl.NumberFormat(locale, { notation: 'compact', style: 'currency', currency: 'USD' }).format( + total.toNumber() + ), + amount: total + }; }; export { useTotalBalance }; diff --git a/apps/evm/src/lib/form/yup.custom.ts b/apps/evm/src/lib/form/yup.custom.ts index 48840f5ce..400f44129 100644 --- a/apps/evm/src/lib/form/yup.custom.ts +++ b/apps/evm/src/lib/form/yup.custom.ts @@ -2,7 +2,7 @@ import Big from 'big.js'; import * as yup from 'yup'; import { AnyObject, Maybe } from 'yup/lib/types'; -import { isValidBTCAddress, BitcoinNetwork } from '@gobob/utils'; +import { validate, Network as BitcoinNetwork } from 'bitcoin-address-validation'; import { isAddress } from 'viem'; yup.addMethod(yup.string, 'requiredAmount', function (action: string, customMessage?: string) { @@ -73,7 +73,7 @@ yup.addMethod( yup.addMethod(yup.string, 'btcAddress', function (network: BitcoinNetwork, customMessage?: string) { return this.test('btcAddress', (value, ctx) => { - if (!value || !isValidBTCAddress(value, network)) { + if (!value || !validate(value, network)) { const message = customMessage || 'Please enter a valid address'; return ctx.createError({ message }); diff --git a/apps/evm/src/lib/store.ts b/apps/evm/src/lib/store.ts index 2b62f13d2..227123038 100644 --- a/apps/evm/src/lib/store.ts +++ b/apps/evm/src/lib/store.ts @@ -2,6 +2,10 @@ import { Store as StoreLib } from '@tanstack/react-store'; import { BridgeTransaction } from '../types'; +type SharedStore = { + isReceiveModalOpen: boolean; +}; + type BridgeStore = { transactions: { isInitialLoading: boolean; @@ -18,11 +22,15 @@ type StakeStore = { }; type Store = { + shared: SharedStore; bridge: BridgeStore; stake: StakeStore; }; const store = new StoreLib({ + shared: { + isReceiveModalOpen: false + }, bridge: { transactions: { isInitialLoading: true, diff --git a/apps/evm/src/locales/en.po b/apps/evm/src/locales/en.po index ccbe6d520..20f23192a 100644 --- a/apps/evm/src/locales/en.po +++ b/apps/evm/src/locales/en.po @@ -84,11 +84,15 @@ msgstr "404 Error" msgid "7 days" msgstr "7 days" -#: src/components/Layout/Header.tsx:105 +#: src/components/Layout/Header.tsx:106 #: src/components/Layout/Sidebar.tsx:66 msgid "About" msgstr "About" +#: src/components/ProfileDrawer/ProfileDrawer.tsx:112 +#~ msgid "Activity" +#~ msgstr "Activity" + #: src/app/[lang]/(bridge)/components/GatewayTransactionDetails/GatewayFeeSettingsModal.tsx:106 msgid "Adjusting the fee rate affects how quickly your Bitcoin transaction is confirmed. Lower fees may lead to significant delays in confirmation time." msgstr "Adjusting the fee rate affects how quickly your Bitcoin transaction is confirmed. Lower fees may lead to significant delays in confirmation time." @@ -111,16 +115,16 @@ msgid "Amount" msgstr "Amount" #: src/app/[lang]/(bridge)/components/BannerCarousel/OKXCryptopediaBanner.tsx:26 -msgid "An Exclusive Bitcoin Staking and DeFi Campaign" -msgstr "An Exclusive Bitcoin Staking and DeFi Campaign" +#~ msgid "An Exclusive Bitcoin Staking and DeFi Campaign" +#~ msgstr "An Exclusive Bitcoin Staking and DeFi Campaign" #: src/components/BannerCarousel/BinanceCampaignBanner.tsx:25 #~ msgid "An exclusive quest campaign." #~ msgstr "An exclusive quest campaign." #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:260 -msgid "and that you have read and understood our" -msgstr "and that you have read and understood our" +#~ msgid "and that you have read and understood our" +#~ msgstr "and that you have read and understood our" #: src/app/[lang]/(bridge)/components/GatewayTransactionDetails/GatewayFeeSettingsModal.tsx:180 msgid "Apply" @@ -131,7 +135,7 @@ msgid "Approve" msgstr "Approve" #: src/app/[lang]/apps/page.tsx:14 -#: src/components/Layout/Header.tsx:70 +#: src/components/Layout/Header.tsx:71 #: src/components/Layout/Sidebar.tsx:45 msgid "Apps" msgstr "Apps" @@ -166,8 +170,8 @@ msgid "Audited by" msgstr "Audited by" #: src/connect-ui/component/ConnectWallet/ConnectWallet.tsx:37 -msgid "Authorize Wallet" -msgstr "Authorize Wallet" +#~ msgid "Authorize Wallet" +#~ msgstr "Authorize Wallet" #: src/app/[lang]/fusion/components/Strategies/Strategies.tsx:41 #: src/app/[lang]/fusion/components/Strategies/Strategies.tsx:108 @@ -176,6 +180,10 @@ msgstr "Authorize Wallet" msgid "Babylon points" msgstr "Babylon points" +#: src/components/ReceiveModal/ReceiveModal.tsx:78 +msgid "Back" +msgstr "Back" + #: src/app/[lang]/wallet/components/TokenTable/TokenTable.tsx:111 #~ msgid "Balance" #~ msgstr "Balance" @@ -205,8 +213,8 @@ msgid "BOB Bridge" msgstr "BOB Bridge" #: src/app/[lang]/(bridge)/components/BannerCarousel/OKXCryptopediaBanner.tsx:22 -msgid "BOB Ecosystem on OKX Cryptopedia" -msgstr "BOB Ecosystem on OKX Cryptopedia" +#~ msgid "BOB Ecosystem on OKX Cryptopedia" +#~ msgstr "BOB Ecosystem on OKX Cryptopedia" #: src/app/[lang]/(bridge)/components/BannerCarousel/FusionBanner.tsx:22 #: src/app/[lang]/fusion/Fusion.tsx:92 @@ -222,11 +230,11 @@ msgstr "BOB Gateway allows you to swap BTC on Bitcoin to ETH on BOB" #~ msgstr "BOB Gateway allows you to swap BTC on Bitcoin to ETH on BOB." #: src/app/[lang]/(bridge)/components/BannerCarousel/OnrampBanner.tsx:17 -msgid "BOB Gateway is live!" -msgstr "BOB Gateway is live!" +#~ msgid "BOB Gateway is live!" +#~ msgstr "BOB Gateway is live!" -#: src/app/[lang]/layout.tsx:33 -#: src/app/[lang]/layout.tsx:52 +#: src/app/[lang]/layout.tsx:30 +#: src/app/[lang]/layout.tsx:49 msgid "BOB is a hybrid L2 that combines the security of Bitcoin with the versatility of Ethereum" msgstr "BOB is a hybrid L2 that combines the security of Bitcoin with the versatility of Ethereum" @@ -238,9 +246,9 @@ msgstr "BOB TVL Progress" #~ msgid "BOB Wallet" #~ msgstr "BOB Wallet" -#: src/app/[lang]/(bridge)/bridge/page.tsx:14 +#: src/app/[lang]/(bridge)/bridge/page.tsx:13 #: src/app/[lang]/page.tsx:15 -#: src/components/Layout/Header.tsx:67 +#: src/components/Layout/Header.tsx:68 #: src/components/Layout/Sidebar.tsx:42 msgid "Bridge" msgstr "Bridge" @@ -288,8 +296,8 @@ msgid "BTC LST Lending" msgstr "BTC LST Lending" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:252 -msgid "By clicking ‘Connect’ you acknowledge and agree to the" -msgstr "By clicking ‘Connect’ you acknowledge and agree to the" +#~ msgid "By clicking ‘Connect’ you acknowledge and agree to the" +#~ msgstr "By clicking ‘Connect’ you acknowledge and agree to the" #: src/app/[lang]/wallet/components/ReceiveTokenModal/ReceiveTokenModal.tsx:79 #: src/app/[lang]/wallet/components/SendTokenModal/SendTokenModal.tsx:255 @@ -314,8 +322,8 @@ msgstr "Checking Allowance" #: src/connect-ui/component/ConnectModal/BtcWalletList.tsx:39 #: src/connect-ui/component/ConnectModal/EvmWalletList.tsx:76 -msgid "choose available wallets" -msgstr "choose available wallets" +#~ msgid "choose available wallets" +#~ msgstr "choose available wallets" #: src/app/[lang]/fusion/components/Strategies/Strategies.tsx:179 msgid "Chose any of the existing liquid staking provider to mint your BTC LST." @@ -332,7 +340,7 @@ msgstr "Click the <0/> icon next to your favourite apps" msgid "Close" msgstr "Close" -#: src/app/[lang]/sign-up/SignUp.tsx:106 +#: src/app/[lang]/sign-up/SignUp.tsx:107 msgid "Combining liquidity and security from Bitcoin and Ethereum. Mainnet live!" msgstr "Combining liquidity and security from Bitcoin and Ethereum. Mainnet live!" @@ -367,8 +375,8 @@ msgstr "Complete a variety of on- and off-chain quests using Intract and the BOB msgid "Congratulations you won!<0/>Take a screenshot to share with your friends!" msgstr "Congratulations you won!<0/>Take a screenshot to share with your friends!" -#: src/connect-ui/component/AuthButton/AuthButton.tsx:94 -#: src/connect-ui/component/AuthButton/AuthButton.tsx:107 +#: src/components/AuthButton/AuthButton.tsx:97 +#: src/components/ProfileDrawer/ProfileBtcWallet.tsx:52 msgid "Connect BTC Wallet" msgstr "Connect BTC Wallet" @@ -377,26 +385,31 @@ msgid "Connect BTC wallet to access fee rate settings." msgstr "Connect BTC wallet to access fee rate settings." #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:135 -msgid "Connect request is already pending" -msgstr "Connect request is already pending" +#~ msgid "Connect request is already pending" +#~ msgstr "Connect request is already pending" -#: src/connect-ui/component/AuthButton/AuthButton.tsx:63 -#: src/connect-ui/component/ConnectModal/ConnectModal.tsx:214 -#: src/connect-ui/component/ConnectWallet/ConnectWallet.tsx:35 +#: src/components/AuthButton/AuthButton.tsx:64 +#: src/components/ConnectButton/ConnectButton.tsx:46 +#: src/components/ProfileDrawer/ProfileDrawer.tsx:43 msgid "Connect Wallet" msgstr "Connect Wallet" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:296 -msgid "Connect your Bitcoin Wallet (Optional)" -msgstr "Connect your Bitcoin Wallet (Optional)" +#~ msgid "Connect your Bitcoin Wallet (Optional)" +#~ msgstr "Connect your Bitcoin Wallet (Optional)" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:281 -msgid "Connect your EVM Wallet (Mandatory)" -msgstr "Connect your EVM Wallet (Mandatory)" +#~ msgid "Connect your EVM Wallet (Mandatory)" +#~ msgstr "Connect your EVM Wallet (Mandatory)" #: src/connect-ui/component/ConnectModal/ConnectedWalletSection.tsx:37 -msgid "Connected with <0>{wallet}" -msgstr "Connected with <0>{wallet}" +#~ msgid "Connected with <0>{wallet}" +#~ msgstr "Connected with <0>{wallet}" + +#: src/components/CopyAddress/CopyAddress.tsx:37 +#: src/components/CopyButton/CopyButton.tsx:30 +msgid "Copied" +msgstr "Copied" #: src/app/[lang]/wallet/components/ReceiveTokenModal/ReceiveTokenModal.tsx:89 #~ msgid "Copy Address" @@ -455,7 +468,7 @@ msgstr "Deposit your BTC LSTs into <0>Satoshi Protocol to mint satUSD and de msgid "Deposit your BTC LSTs into <0>Satoshi Protocol to mint satUSD." msgstr "Deposit your BTC LSTs into <0>Satoshi Protocol to mint satUSD." -#: src/components/Layout/Header.tsx:102 +#: src/components/Layout/Header.tsx:103 #: src/components/Layout/Sidebar.tsx:63 msgid "Dev" msgstr "Dev" @@ -472,7 +485,7 @@ msgstr "DEX Liquidity Provisioning" msgid "Diamond" msgstr "Diamond" -#: src/app/[lang]/nested-providers.tsx:60 +#: src/app/[lang]/nested-providers.tsx:59 msgid "Disconnected" msgstr "Disconnected" @@ -548,14 +561,14 @@ msgstr "Estimated within the next block" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:138 #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:174 -msgid "Failed to connect to {0}" -msgstr "Failed to connect to {0}" +#~ msgid "Failed to connect to {0}" +#~ msgstr "Failed to connect to {0}" #: src/app/[lang]/(bridge)/components/BridgeStatus/WithdrawStatus.tsx:107 msgid "Failed to finalize." msgstr "Failed to finalize." -#: src/app/[lang]/(bridge)/hooks/useGateway.ts:234 +#: src/app/[lang]/(bridge)/hooks/useGateway.ts:235 msgid "Failed to get estimated fee" msgstr "Failed to get estimated fee" @@ -617,15 +630,19 @@ msgstr "Follow us on X" msgid "Follow us on X for updates" msgstr "Follow us on X for updates" +#: src/components/ReceiveModal/ReceiveModal.tsx:88 +msgid "Fund your wallet(s) by transferring crypto from another wallet or account." +msgstr "Fund your wallet(s) by transferring crypto from another wallet or account." + #: src/app/[lang]/fusion/page.tsx:16 -#: src/components/Layout/Header.tsx:76 +#: src/components/Layout/Header.tsx:77 #: src/components/Layout/Sidebar.tsx:51 msgid "Fusion" msgstr "Fusion" #: src/components/Logo/Logo.tsx:41 -msgid "FUSION" -msgstr "FUSION" +#~ msgid "FUSION" +#~ msgstr "FUSION" #: src/app/[lang]/fusion/components/WelcomeBackModal/WelcomeBackModal.tsx:43 msgid "Fusion season 3 is your last ever chance to harvest Spice. Stake your Bitcoin for the highest multipliers and refer a friend to receive a share of all the Spice they collect." @@ -662,14 +679,14 @@ msgstr "Get tickets" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:189 #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:203 -msgid "go back" -msgstr "go back" +#~ msgid "go back" +#~ msgstr "go back" #: src/app/[lang]/404/NotFound.tsx:30 msgid "Go Back" msgstr "Go Back" -#: src/app/[lang]/nested-providers.tsx:75 +#: src/app/[lang]/nested-providers.tsx:74 msgid "Got it!" msgstr "Got it!" @@ -741,7 +758,7 @@ msgstr "If you already own BTC LSTs on other chains, you can bridge them over to msgid "Input Token" msgstr "Input Token" -#: src/app/[lang]/sign-up/SignUp.tsx:115 +#: src/app/[lang]/sign-up/SignUp.tsx:116 msgid "Invalid referral code. You can try again, or proceed without one." msgstr "Invalid referral code. You can try again, or proceed without one." @@ -817,7 +834,7 @@ msgstr "Lending, Restaking, CDP *" #~ msgid "Liquid Staking" #~ msgstr "Liquid Staking" -#: src/connect-ui/component/AuthButton/AuthButton.tsx:51 +#: src/components/AuthButton/AuthButton.tsx:50 msgid "Loading..." msgstr "Loading..." @@ -889,7 +906,7 @@ msgstr "Mint satUSD and supply it into a lending market on BOB" msgid "Multipliers" msgstr "Multipliers" -#: src/components/Layout/Header.tsx:108 +#: src/components/Layout/Header.tsx:109 #: src/components/Layout/Sidebar.tsx:54 msgid "Multisig" msgstr "Multisig" @@ -922,7 +939,7 @@ msgstr "navigate to Common Prefix audit" msgid "navigate to discord" msgstr "navigate to discord" -#: src/app/[lang]/(bridge)/components/BannerCarousel/BannerCarousel.tsx:90 +#: src/app/[lang]/(bridge)/components/BannerCarousel/BannerCarousel.tsx:61 msgid "navigate to ecosystem section in fusion page" msgstr "navigate to ecosystem section in fusion page" @@ -996,18 +1013,18 @@ msgid "Not your lucky day... yet!" msgstr "Not your lucky day... yet!" #: src/app/[lang]/(bridge)/components/BannerCarousel/OKXCryptopediaBanner.tsx:30 -msgid "OKX Cryptopedia" -msgstr "OKX Cryptopedia" +#~ msgid "OKX Cryptopedia" +#~ msgstr "OKX Cryptopedia" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:246 -msgid "On BOB, you have the option to link both your EVM and BTC wallets. For optimal functionality, it's advised to connect wallets from both networks." -msgstr "On BOB, you have the option to link both your EVM and BTC wallets. For optimal functionality, it's advised to connect wallets from both networks." +#~ msgid "On BOB, you have the option to link both your EVM and BTC wallets. For optimal functionality, it's advised to connect wallets from both networks." +#~ msgstr "On BOB, you have the option to link both your EVM and BTC wallets. For optimal functionality, it's advised to connect wallets from both networks." #: src/app/[lang]/fusion/components/WelcomeBackModal/WelcomeBackModal.tsx:68 msgid "Once complete, your season 3 score will be added to seasons 1 and 2 to calculate your final Spice harvest." msgstr "Once complete, your season 3 score will be added to seasons 1 and 2 to calculate your final Spice harvest." -#: src/components/Layout/Header.tsx:55 +#: src/components/Layout/Header.tsx:56 msgid "open drawer" msgstr "open drawer" @@ -1063,7 +1080,7 @@ msgstr "Please note:" msgid "Points" msgstr "Points" -#: src/app/[lang]/sign-up/SignUp.tsx:102 +#: src/app/[lang]/sign-up/SignUp.tsx:103 msgid "POWERED BY BTC & ETH" msgstr "POWERED BY BTC & ETH" @@ -1073,8 +1090,8 @@ msgid "Preparing..." msgstr "Preparing..." #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:266 -msgid "Privacy policy" -msgstr "Privacy policy" +#~ msgid "Privacy policy" +#~ msgstr "Privacy policy" #: src/app/[lang]/(bridge)/components/GatewayTransactionDetails/GatewayTransactionDetails.tsx:121 msgid "Protocol Fee" @@ -1129,6 +1146,10 @@ msgstr "Receive" #~ msgid "Receive {ticker}" #~ msgstr "Receive {ticker}" +#: src/components/ReceiveModal/ReceiveModal.tsx:72 +msgid "Receive crypto" +msgstr "Receive crypto" + #: src/app/[lang]/(bridge)/bridge/components/BridgeForm/BobBridgeForm.tsx:483 #: src/app/[lang]/(bridge)/bridge/components/BridgeForm/BtcBridgeForm.tsx:136 #: src/app/[lang]/(bridge)/stake/components/StakeForm/BtcStakeForm.tsx:86 @@ -1205,12 +1226,12 @@ msgid "Security Review by Bitcoin Layers" msgstr "Security Review by Bitcoin Layers" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:211 -msgid "Select Bitcoin Wallet" -msgstr "Select Bitcoin Wallet" +#~ msgid "Select Bitcoin Wallet" +#~ msgstr "Select Bitcoin Wallet" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:197 -msgid "Select EVM Wallet" -msgstr "Select EVM Wallet" +#~ msgid "Select EVM Wallet" +#~ msgstr "Select EVM Wallet" #: src/app/[lang]/(bridge)/components/TransactionDetails/TransactionDetails.tsx:119 msgid "select gas token" @@ -1262,7 +1283,7 @@ msgstr "Share on X" msgid "Share this link with a friend and when they sign up, you will receive 15% of their Spice harvest as a bonus, plus 7% of the Spice harvest of anyone they refer" msgstr "Share this link with a friend and when they sign up, you will receive 15% of their Spice harvest as a bonus, plus 7% of the Spice harvest of anyone they refer" -#: src/components/Layout/Header.tsx:83 +#: src/components/Layout/Header.tsx:84 msgid "Show secondary navigation" msgstr "Show secondary navigation" @@ -1288,8 +1309,8 @@ msgstr "Something went wrong. Please try again later." #: src/app/[lang]/sign-up/SignUp.tsx:72 #: src/components/LoginButton/LoginButton.tsx:29 #: src/components/SignUpButton/SignUpButton.tsx:29 -msgid "Something went wrong. Please try connecting your wallet again." -msgstr "Something went wrong. Please try connecting your wallet again." +#~ msgid "Something went wrong. Please try connecting your wallet again." +#~ msgstr "Something went wrong. Please try connecting your wallet again." #: src/app/[lang]/404/NotFound.tsx:23 msgid "Sorry, the page you are looking for doesn't exist or has been moved. Here are some helpful links:" @@ -1369,7 +1390,7 @@ msgstr "Spice styled background" #: src/app/[lang]/(bridge)/stake/components/StakeForm/BtcStakeForm.tsx:97 #: src/app/[lang]/(bridge)/stake/components/StakeTable/StakeTable.tsx:97 #: src/app/[lang]/(bridge)/stake/page.tsx:14 -#: src/components/Layout/Header.tsx:73 +#: src/components/Layout/Header.tsx:74 #: src/components/Layout/Sidebar.tsx:48 msgid "Stake" msgstr "Stake" @@ -1416,7 +1437,7 @@ msgid "Start Harvesting" msgstr "Start Harvesting" #: src/app/[lang]/fusion/components/UserInfo/UserInfo.tsx:297 -#: src/app/[lang]/sign-up/SignUp.tsx:127 +#: src/app/[lang]/sign-up/SignUp.tsx:128 msgid "Start Harvesting Spice" msgstr "Start Harvesting Spice" @@ -1488,11 +1509,11 @@ msgstr "Supply the newly minted satUSD into a <0>lending protocol on BOB." msgid "Support your favourite BOB apps" msgstr "Support your favourite BOB apps" -#: src/connect-ui/component/AuthButton/AuthButton.tsx:84 +#: src/components/AuthButton/AuthButton.tsx:84 msgid "Switch to {capitalizedName}" msgstr "Switch to {capitalizedName}" -#: src/components/Layout/Header.tsx:99 +#: src/components/Layout/Header.tsx:100 #: src/components/Layout/Sidebar.tsx:60 msgid "T&Cs" msgstr "T&Cs" @@ -1502,10 +1523,10 @@ msgid "Take em home" msgstr "Take em home" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:258 -msgid "Terms of Service" -msgstr "Terms of Service" +#~ msgid "Terms of Service" +#~ msgstr "Terms of Service" -#: src/components/Logo/Logo.tsx:47 +#: src/components/Logo/Logo.tsx:42 msgid "Testnet" msgstr "Testnet" @@ -1514,15 +1535,15 @@ msgid "Thank you for your understanding and we hope to be able to serve you in a msgstr "Thank you for your understanding and we hope to be able to serve you in a more decentralized future. The BOB L2 network itself is fully decentralized, cannot be censored and all code is open source." #: src/app/[lang]/(bridge)/components/BannerCarousel/OnrampBanner.tsx:21 -msgid "The fastest and easiest way to bridge BTC to BOB." -msgstr "The fastest and easiest way to bridge BTC to BOB." +#~ msgid "The fastest and easiest way to bridge BTC to BOB." +#~ msgstr "The fastest and easiest way to bridge BTC to BOB." #: src/app/[lang]/fusion/components/WelcomeBackModal/WelcomeBackModal.tsx:39 #: src/app/[lang]/fusion/components/WelcomeModal/WelcomeModal.tsx:24 msgid "The final season" msgstr "The final season" -#: src/app/[lang]/sign-up/SignUp.tsx:99 +#: src/app/[lang]/sign-up/SignUp.tsx:100 msgid "THE FIRST HYBRID L2" msgstr "THE FIRST HYBRID L2" @@ -1694,6 +1715,10 @@ msgstr "Unfortunately, is not possible to bridge to BOB using smart accounts. We msgid "Unknown" msgstr "Unknown" +#: src/components/ProfileDrawer/ProfileBtcWallet.tsx:93 +msgid "Unlink wallet" +msgstr "Unlink wallet" + #: src/app/[lang]/(bridge)/stake/Stake.tsx:106 #~ msgid "Unstake" #~ msgstr "Unstake" @@ -1744,7 +1769,6 @@ msgid "Use your Spice total to support your favourite BOB builders. Winners will msgstr "Use your Spice total to support your favourite BOB builders. Winners will be announced each week." #: src/app/[lang]/(bridge)/bridge/components/BridgeForm/BobBridgeForm.tsx:132 -#: src/connect-ui/component/ConnectModal/ConnectModal.tsx:131 #: src/hooks/useLogin.ts:46 #: src/hooks/useSignUp.ts:49 msgid "User rejected the request" @@ -1809,7 +1833,7 @@ msgstr "Waiting for approval" msgid "Waiting for confirmation" msgstr "Waiting for confirmation" -#: src/connect-ui/component/ConnectWallet/ConnectWallet.tsx:60 +#: src/components/ProfileDrawer/ProfileTokenList.tsx:37 msgid "Wallet" msgstr "Wallet" @@ -1877,11 +1901,15 @@ msgstr "You" msgid "You can change your votes at any time before the end of the weekly voting period" msgstr "You can change your votes at any time before the end of the weekly voting period" +#: src/components/ReceiveModal/ReceiveModal.tsx:197 +msgid "You can receive tokens on our supported networks" +msgstr "You can receive tokens on our supported networks" + #: src/app/[lang]/fusion/components/LotterySections/LotteryModal/LotteryModal.tsx:103 msgid "You Have 0 Tickets" msgstr "You Have 0 Tickets" -#: src/app/[lang]/nested-providers.tsx:67 +#: src/app/[lang]/nested-providers.tsx:66 msgid "You have switched your account mid session. Simply switch back the original account and login to have access to your funds again." msgstr "You have switched your account mid session. Simply switch back the original account and login to have access to your funds again." @@ -1939,7 +1967,7 @@ msgstr "Your assets will be delivered shortly, with an estimated arrival time of msgid "Your available balance may differ from your wallet balance due to network fees and available liquidity" msgstr "Your available balance may differ from your wallet balance due to network fees and available liquidity" -#: src/app/[lang]/nested-providers.tsx:64 +#: src/app/[lang]/nested-providers.tsx:63 msgid "Your funds are safe!" msgstr "Your funds are safe!" diff --git a/apps/evm/src/locales/zh.po b/apps/evm/src/locales/zh.po index 775bcec86..a956cb005 100644 --- a/apps/evm/src/locales/zh.po +++ b/apps/evm/src/locales/zh.po @@ -84,11 +84,15 @@ msgstr "404 错误" msgid "7 days" msgstr "" -#: src/components/Layout/Header.tsx:105 +#: src/components/Layout/Header.tsx:106 #: src/components/Layout/Sidebar.tsx:66 msgid "About" msgstr "关于" +#: src/components/ProfileDrawer/ProfileDrawer.tsx:112 +#~ msgid "Activity" +#~ msgstr "" + #: src/app/[lang]/(bridge)/components/GatewayTransactionDetails/GatewayFeeSettingsModal.tsx:106 msgid "Adjusting the fee rate affects how quickly your Bitcoin transaction is confirmed. Lower fees may lead to significant delays in confirmation time." msgstr "" @@ -111,16 +115,16 @@ msgid "Amount" msgstr "" #: src/app/[lang]/(bridge)/components/BannerCarousel/OKXCryptopediaBanner.tsx:26 -msgid "An Exclusive Bitcoin Staking and DeFi Campaign" -msgstr "" +#~ msgid "An Exclusive Bitcoin Staking and DeFi Campaign" +#~ msgstr "" #: src/components/BannerCarousel/BinanceCampaignBanner.tsx:25 #~ msgid "An exclusive quest campaign." #~ msgstr "" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:260 -msgid "and that you have read and understood our" -msgstr "" +#~ msgid "and that you have read and understood our" +#~ msgstr "" #: src/app/[lang]/(bridge)/components/GatewayTransactionDetails/GatewayFeeSettingsModal.tsx:180 msgid "Apply" @@ -131,7 +135,7 @@ msgid "Approve" msgstr "通过" #: src/app/[lang]/apps/page.tsx:14 -#: src/components/Layout/Header.tsx:70 +#: src/components/Layout/Header.tsx:71 #: src/components/Layout/Sidebar.tsx:45 msgid "Apps" msgstr "" @@ -166,8 +170,8 @@ msgid "Audited by" msgstr "审计" #: src/connect-ui/component/ConnectWallet/ConnectWallet.tsx:37 -msgid "Authorize Wallet" -msgstr "" +#~ msgid "Authorize Wallet" +#~ msgstr "" #: src/app/[lang]/fusion/components/Strategies/Strategies.tsx:41 #: src/app/[lang]/fusion/components/Strategies/Strategies.tsx:108 @@ -176,6 +180,10 @@ msgstr "" msgid "Babylon points" msgstr "Babylon积分" +#: src/components/ReceiveModal/ReceiveModal.tsx:78 +msgid "Back" +msgstr "" + #: src/app/[lang]/wallet/components/TokenTable/TokenTable.tsx:111 #~ msgid "Balance" #~ msgstr "余额" @@ -205,8 +213,8 @@ msgid "BOB Bridge" msgstr "" #: src/app/[lang]/(bridge)/components/BannerCarousel/OKXCryptopediaBanner.tsx:22 -msgid "BOB Ecosystem on OKX Cryptopedia" -msgstr "" +#~ msgid "BOB Ecosystem on OKX Cryptopedia" +#~ msgstr "" #: src/app/[lang]/(bridge)/components/BannerCarousel/FusionBanner.tsx:22 #: src/app/[lang]/fusion/Fusion.tsx:92 @@ -222,11 +230,11 @@ msgstr "" #~ msgstr "" #: src/app/[lang]/(bridge)/components/BannerCarousel/OnrampBanner.tsx:17 -msgid "BOB Gateway is live!" -msgstr "" +#~ msgid "BOB Gateway is live!" +#~ msgstr "" -#: src/app/[lang]/layout.tsx:33 -#: src/app/[lang]/layout.tsx:52 +#: src/app/[lang]/layout.tsx:30 +#: src/app/[lang]/layout.tsx:49 msgid "BOB is a hybrid L2 that combines the security of Bitcoin with the versatility of Ethereum" msgstr "" @@ -238,9 +246,9 @@ msgstr "BOB TVL进度" #~ msgid "BOB Wallet" #~ msgstr "BOB 钱包" -#: src/app/[lang]/(bridge)/bridge/page.tsx:14 +#: src/app/[lang]/(bridge)/bridge/page.tsx:13 #: src/app/[lang]/page.tsx:15 -#: src/components/Layout/Header.tsx:67 +#: src/components/Layout/Header.tsx:68 #: src/components/Layout/Sidebar.tsx:42 msgid "Bridge" msgstr "桥" @@ -288,8 +296,8 @@ msgid "BTC LST Lending" msgstr "BTC LST借贷" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:252 -msgid "By clicking ‘Connect’ you acknowledge and agree to the" -msgstr "" +#~ msgid "By clicking ‘Connect’ you acknowledge and agree to the" +#~ msgstr "" #: src/app/[lang]/wallet/components/ReceiveTokenModal/ReceiveTokenModal.tsx:79 #: src/app/[lang]/wallet/components/SendTokenModal/SendTokenModal.tsx:255 @@ -314,8 +322,8 @@ msgstr "" #: src/connect-ui/component/ConnectModal/BtcWalletList.tsx:39 #: src/connect-ui/component/ConnectModal/EvmWalletList.tsx:76 -msgid "choose available wallets" -msgstr "" +#~ msgid "choose available wallets" +#~ msgstr "" #: src/app/[lang]/fusion/components/Strategies/Strategies.tsx:179 msgid "Chose any of the existing liquid staking provider to mint your BTC LST." @@ -332,7 +340,7 @@ msgstr "点击 <0/> 你喜爱应用旁边的图标" msgid "Close" msgstr "" -#: src/app/[lang]/sign-up/SignUp.tsx:106 +#: src/app/[lang]/sign-up/SignUp.tsx:107 msgid "Combining liquidity and security from Bitcoin and Ethereum. Mainnet live!" msgstr "结合比特币和以太坊的流动性和安全性。= 主网已上线!。" @@ -367,8 +375,8 @@ msgstr "完成各种链上和链下任务,使用Intract和BOB Stake来额外 msgid "Congratulations you won!<0/>Take a screenshot to share with your friends!" msgstr "" -#: src/connect-ui/component/AuthButton/AuthButton.tsx:94 -#: src/connect-ui/component/AuthButton/AuthButton.tsx:107 +#: src/components/AuthButton/AuthButton.tsx:97 +#: src/components/ProfileDrawer/ProfileBtcWallet.tsx:52 msgid "Connect BTC Wallet" msgstr "连接比特币钱包" @@ -377,25 +385,30 @@ msgid "Connect BTC wallet to access fee rate settings." msgstr "" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:135 -msgid "Connect request is already pending" -msgstr "" +#~ msgid "Connect request is already pending" +#~ msgstr "" -#: src/connect-ui/component/AuthButton/AuthButton.tsx:63 -#: src/connect-ui/component/ConnectModal/ConnectModal.tsx:214 -#: src/connect-ui/component/ConnectWallet/ConnectWallet.tsx:35 +#: src/components/AuthButton/AuthButton.tsx:64 +#: src/components/ConnectButton/ConnectButton.tsx:46 +#: src/components/ProfileDrawer/ProfileDrawer.tsx:43 msgid "Connect Wallet" msgstr "连接钱包" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:296 -msgid "Connect your Bitcoin Wallet (Optional)" -msgstr "" +#~ msgid "Connect your Bitcoin Wallet (Optional)" +#~ msgstr "" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:281 -msgid "Connect your EVM Wallet (Mandatory)" -msgstr "" +#~ msgid "Connect your EVM Wallet (Mandatory)" +#~ msgstr "" #: src/connect-ui/component/ConnectModal/ConnectedWalletSection.tsx:37 -msgid "Connected with <0>{wallet}" +#~ msgid "Connected with <0>{wallet}" +#~ msgstr "" + +#: src/components/CopyAddress/CopyAddress.tsx:37 +#: src/components/CopyButton/CopyButton.tsx:30 +msgid "Copied" msgstr "" #: src/app/[lang]/wallet/components/ReceiveTokenModal/ReceiveTokenModal.tsx:89 @@ -455,7 +468,7 @@ msgstr "将你的BTC LSTs存入 <0>将你的BTC LSTs存入 以铸造satUSD msgid "Deposit your BTC LSTs into <0>Satoshi Protocol to mint satUSD." msgstr "将你的BTC LSTs存入 <0>Satoshi协议 以铸造satUSD。" -#: src/components/Layout/Header.tsx:102 +#: src/components/Layout/Header.tsx:103 #: src/components/Layout/Sidebar.tsx:63 msgid "Dev" msgstr "开发者" @@ -472,7 +485,7 @@ msgstr "为DEX提供流动性" msgid "Diamond" msgstr "" -#: src/app/[lang]/nested-providers.tsx:60 +#: src/app/[lang]/nested-providers.tsx:59 msgid "Disconnected" msgstr "" @@ -548,14 +561,14 @@ msgstr "" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:138 #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:174 -msgid "Failed to connect to {0}" -msgstr "" +#~ msgid "Failed to connect to {0}" +#~ msgstr "" #: src/app/[lang]/(bridge)/components/BridgeStatus/WithdrawStatus.tsx:107 msgid "Failed to finalize." msgstr "" -#: src/app/[lang]/(bridge)/hooks/useGateway.ts:234 +#: src/app/[lang]/(bridge)/hooks/useGateway.ts:235 msgid "Failed to get estimated fee" msgstr "" @@ -617,15 +630,19 @@ msgstr "" msgid "Follow us on X for updates" msgstr "" +#: src/components/ReceiveModal/ReceiveModal.tsx:88 +msgid "Fund your wallet(s) by transferring crypto from another wallet or account." +msgstr "" + #: src/app/[lang]/fusion/page.tsx:16 -#: src/components/Layout/Header.tsx:76 +#: src/components/Layout/Header.tsx:77 #: src/components/Layout/Sidebar.tsx:51 msgid "Fusion" msgstr "Fusion" #: src/components/Logo/Logo.tsx:41 -msgid "FUSION" -msgstr "FUSION" +#~ msgid "FUSION" +#~ msgstr "FUSION" #: src/app/[lang]/fusion/components/WelcomeBackModal/WelcomeBackModal.tsx:43 msgid "Fusion season 3 is your last ever chance to harvest Spice. Stake your Bitcoin for the highest multipliers and refer a friend to receive a share of all the Spice they collect." @@ -662,14 +679,14 @@ msgstr "" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:189 #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:203 -msgid "go back" -msgstr "" +#~ msgid "go back" +#~ msgstr "" #: src/app/[lang]/404/NotFound.tsx:30 msgid "Go Back" msgstr "返回" -#: src/app/[lang]/nested-providers.tsx:75 +#: src/app/[lang]/nested-providers.tsx:74 msgid "Got it!" msgstr "" @@ -741,7 +758,7 @@ msgstr "如果你已经在其他链上拥有BTC LSTs,你可以将它们跨链 msgid "Input Token" msgstr "" -#: src/app/[lang]/sign-up/SignUp.tsx:115 +#: src/app/[lang]/sign-up/SignUp.tsx:116 msgid "Invalid referral code. You can try again, or proceed without one." msgstr "" @@ -817,7 +834,7 @@ msgstr "借贷、再质押、抵押债仓(CDP) *" #~ msgid "Liquid Staking" #~ msgstr "" -#: src/connect-ui/component/AuthButton/AuthButton.tsx:51 +#: src/components/AuthButton/AuthButton.tsx:50 msgid "Loading..." msgstr "" @@ -889,7 +906,7 @@ msgstr "铸造satUSD并将其供应到BOB上的借贷市场" msgid "Multipliers" msgstr "收益倍数" -#: src/components/Layout/Header.tsx:108 +#: src/components/Layout/Header.tsx:109 #: src/components/Layout/Sidebar.tsx:54 msgid "Multisig" msgstr "多签" @@ -922,7 +939,7 @@ msgstr "" msgid "navigate to discord" msgstr "" -#: src/app/[lang]/(bridge)/components/BannerCarousel/BannerCarousel.tsx:90 +#: src/app/[lang]/(bridge)/components/BannerCarousel/BannerCarousel.tsx:61 msgid "navigate to ecosystem section in fusion page" msgstr "" @@ -996,18 +1013,18 @@ msgid "Not your lucky day... yet!" msgstr "" #: src/app/[lang]/(bridge)/components/BannerCarousel/OKXCryptopediaBanner.tsx:30 -msgid "OKX Cryptopedia" -msgstr "" +#~ msgid "OKX Cryptopedia" +#~ msgstr "" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:246 -msgid "On BOB, you have the option to link both your EVM and BTC wallets. For optimal functionality, it's advised to connect wallets from both networks." -msgstr "" +#~ msgid "On BOB, you have the option to link both your EVM and BTC wallets. For optimal functionality, it's advised to connect wallets from both networks." +#~ msgstr "" #: src/app/[lang]/fusion/components/WelcomeBackModal/WelcomeBackModal.tsx:68 msgid "Once complete, your season 3 score will be added to seasons 1 and 2 to calculate your final Spice harvest." msgstr "第3季结束后,你的得分将与第1季和第2季的得分合并,用于计算你的最终Spice收获。" -#: src/components/Layout/Header.tsx:55 +#: src/components/Layout/Header.tsx:56 msgid "open drawer" msgstr "" @@ -1063,7 +1080,7 @@ msgstr "请注意:" msgid "Points" msgstr "" -#: src/app/[lang]/sign-up/SignUp.tsx:102 +#: src/app/[lang]/sign-up/SignUp.tsx:103 msgid "POWERED BY BTC & ETH" msgstr "比特币 + 以太坊共同驱动" @@ -1073,8 +1090,8 @@ msgid "Preparing..." msgstr "" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:266 -msgid "Privacy policy" -msgstr "" +#~ msgid "Privacy policy" +#~ msgstr "" #: src/app/[lang]/(bridge)/components/GatewayTransactionDetails/GatewayTransactionDetails.tsx:121 msgid "Protocol Fee" @@ -1129,6 +1146,10 @@ msgstr "接收" #~ msgid "Receive {ticker}" #~ msgstr "接收 {ticker}" +#: src/components/ReceiveModal/ReceiveModal.tsx:72 +msgid "Receive crypto" +msgstr "" + #: src/app/[lang]/(bridge)/bridge/components/BridgeForm/BobBridgeForm.tsx:483 #: src/app/[lang]/(bridge)/bridge/components/BridgeForm/BtcBridgeForm.tsx:136 #: src/app/[lang]/(bridge)/stake/components/StakeForm/BtcStakeForm.tsx:86 @@ -1205,12 +1226,12 @@ msgid "Security Review by Bitcoin Layers" msgstr "" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:211 -msgid "Select Bitcoin Wallet" -msgstr "" +#~ msgid "Select Bitcoin Wallet" +#~ msgstr "" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:197 -msgid "Select EVM Wallet" -msgstr "" +#~ msgid "Select EVM Wallet" +#~ msgstr "" #: src/app/[lang]/(bridge)/components/TransactionDetails/TransactionDetails.tsx:119 msgid "select gas token" @@ -1262,7 +1283,7 @@ msgstr "" msgid "Share this link with a friend and when they sign up, you will receive 15% of their Spice harvest as a bonus, plus 7% of the Spice harvest of anyone they refer" msgstr "与朋友分享此链接,当他们注册时,你将获得他们Spice收获的15%作为奖励,以及他们推荐的任何人的Spice收获的7%" -#: src/components/Layout/Header.tsx:83 +#: src/components/Layout/Header.tsx:84 msgid "Show secondary navigation" msgstr "" @@ -1288,8 +1309,8 @@ msgstr "" #: src/app/[lang]/sign-up/SignUp.tsx:72 #: src/components/LoginButton/LoginButton.tsx:29 #: src/components/SignUpButton/SignUpButton.tsx:29 -msgid "Something went wrong. Please try connecting your wallet again." -msgstr "" +#~ msgid "Something went wrong. Please try connecting your wallet again." +#~ msgstr "" #: src/app/[lang]/404/NotFound.tsx:23 msgid "Sorry, the page you are looking for doesn't exist or has been moved. Here are some helpful links:" @@ -1369,7 +1390,7 @@ msgstr "" #: src/app/[lang]/(bridge)/stake/components/StakeForm/BtcStakeForm.tsx:97 #: src/app/[lang]/(bridge)/stake/components/StakeTable/StakeTable.tsx:97 #: src/app/[lang]/(bridge)/stake/page.tsx:14 -#: src/components/Layout/Header.tsx:73 +#: src/components/Layout/Header.tsx:74 #: src/components/Layout/Sidebar.tsx:48 msgid "Stake" msgstr "質押" @@ -1416,7 +1437,7 @@ msgid "Start Harvesting" msgstr "开始收获" #: src/app/[lang]/fusion/components/UserInfo/UserInfo.tsx:297 -#: src/app/[lang]/sign-up/SignUp.tsx:127 +#: src/app/[lang]/sign-up/SignUp.tsx:128 msgid "Start Harvesting Spice" msgstr "开始收获Spice" @@ -1488,11 +1509,11 @@ msgstr "将新铸造的satUSD供应到 <0>BOB上的借贷协议 。" msgid "Support your favourite BOB apps" msgstr "支持你喜爱的BOB应用" -#: src/connect-ui/component/AuthButton/AuthButton.tsx:84 +#: src/components/AuthButton/AuthButton.tsx:84 msgid "Switch to {capitalizedName}" msgstr "" -#: src/components/Layout/Header.tsx:99 +#: src/components/Layout/Header.tsx:100 #: src/components/Layout/Sidebar.tsx:60 msgid "T&Cs" msgstr "条款与条件" @@ -1502,10 +1523,10 @@ msgid "Take em home" msgstr "回到主页" #: src/connect-ui/component/ConnectModal/ConnectModal.tsx:258 -msgid "Terms of Service" -msgstr "" +#~ msgid "Terms of Service" +#~ msgstr "" -#: src/components/Logo/Logo.tsx:47 +#: src/components/Logo/Logo.tsx:42 msgid "Testnet" msgstr "" @@ -1514,15 +1535,15 @@ msgid "Thank you for your understanding and we hope to be able to serve you in a msgstr "" #: src/app/[lang]/(bridge)/components/BannerCarousel/OnrampBanner.tsx:21 -msgid "The fastest and easiest way to bridge BTC to BOB." -msgstr "" +#~ msgid "The fastest and easiest way to bridge BTC to BOB." +#~ msgstr "" #: src/app/[lang]/fusion/components/WelcomeBackModal/WelcomeBackModal.tsx:39 #: src/app/[lang]/fusion/components/WelcomeModal/WelcomeModal.tsx:24 msgid "The final season" msgstr "最终季 - 不容错过!" -#: src/app/[lang]/sign-up/SignUp.tsx:99 +#: src/app/[lang]/sign-up/SignUp.tsx:100 msgid "THE FIRST HYBRID L2" msgstr "首个混合型二层" @@ -1690,6 +1711,10 @@ msgstr "很抱歉,目前智能账户还不能跨链到BOB。我们正在努力 msgid "Unknown" msgstr "" +#: src/components/ProfileDrawer/ProfileBtcWallet.tsx:93 +msgid "Unlink wallet" +msgstr "" + #: src/app/[lang]/(bridge)/stake/Stake.tsx:106 #~ msgid "Unstake" #~ msgstr "" @@ -1740,7 +1765,6 @@ msgid "Use your Spice total to support your favourite BOB builders. Winners will msgstr "用你的Spice总数来支持你最喜爱的BOB构建者。获胜者将每周公布。" #: src/app/[lang]/(bridge)/bridge/components/BridgeForm/BobBridgeForm.tsx:132 -#: src/connect-ui/component/ConnectModal/ConnectModal.tsx:131 #: src/hooks/useLogin.ts:46 #: src/hooks/useSignUp.ts:49 msgid "User rejected the request" @@ -1805,7 +1829,7 @@ msgstr "" msgid "Waiting for confirmation" msgstr "" -#: src/connect-ui/component/ConnectWallet/ConnectWallet.tsx:60 +#: src/components/ProfileDrawer/ProfileTokenList.tsx:37 msgid "Wallet" msgstr "钱包" @@ -1873,11 +1897,15 @@ msgstr "" msgid "You can change your votes at any time before the end of the weekly voting period" msgstr "你可以在每周投票期结束前随时更改你的投票" +#: src/components/ReceiveModal/ReceiveModal.tsx:197 +msgid "You can receive tokens on our supported networks" +msgstr "" + #: src/app/[lang]/fusion/components/LotterySections/LotteryModal/LotteryModal.tsx:103 msgid "You Have 0 Tickets" msgstr "" -#: src/app/[lang]/nested-providers.tsx:67 +#: src/app/[lang]/nested-providers.tsx:66 msgid "You have switched your account mid session. Simply switch back the original account and login to have access to your funds again." msgstr "" @@ -1935,7 +1963,7 @@ msgstr "" msgid "Your available balance may differ from your wallet balance due to network fees and available liquidity" msgstr "" -#: src/app/[lang]/nested-providers.tsx:64 +#: src/app/[lang]/nested-providers.tsx:63 msgid "Your funds are safe!" msgstr "" diff --git a/apps/evm/src/test-utils/wrapper.tsx b/apps/evm/src/test-utils/wrapper.tsx index 7bc83287e..8190dc2d8 100644 --- a/apps/evm/src/test-utils/wrapper.tsx +++ b/apps/evm/src/test-utils/wrapper.tsx @@ -1,21 +1,31 @@ -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { getConfig } from '@/lib/wagmi'; +import { BitcoinWalletConnectors } from '@dynamic-labs/bitcoin'; +import { EthereumWalletConnectors } from '@dynamic-labs/ethereum'; +import { DynamicContextProvider } from '@dynamic-labs/sdk-react-core'; import { BOBUIProvider } from '@gobob/ui'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { PropsWithChildren } from 'react'; import { WagmiProvider } from 'wagmi'; import { LinguiClientProvider } from '@/i18n/provider'; -import { getConfig } from '@/lib/wagmi'; export const wrapper = ({ children }: PropsWithChildren) => { const queryClient = new QueryClient(); return ( - + - {children} + + {children} + - + ); }; diff --git a/packages/sats-wagmi/package.json b/packages/sats-wagmi/package.json deleted file mode 100644 index 0dd4a29ff..000000000 --- a/packages/sats-wagmi/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "@gobob/sats-wagmi", - "version": "0.0.0", - "description": "Bob UI library.", - "homepage": "https://github.com/bob-collective/bob-ui#readme", - "license": "MIT", - "keywords": [ - "bob", - "btc wallet connector", - "btc wallet connector hooks", - "btc wallet connector config" - ], - "main": "src/index.ts", - "files": [ - "dist" - ], - "sideEffects": false, - "publishConfig": { - "access": "public" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/bob-collective/bob-ui.git", - "directory": "packages/components" - }, - "bugs": { - "url": "https://github.com/bob-collective/bob-ui/issues" - }, - "scripts": { - "lint": "eslint .", - "lint:fix": "eslint . --ext ts,tsx --fix", - "clean": "rimraf dist .turbo", - "typecheck": "tsc --noEmit" - }, - "dependencies": { - "@gobob/sats-wagmi": "^0.3.17" - } -} diff --git a/packages/sats-wagmi/src/index.ts b/packages/sats-wagmi/src/index.ts deleted file mode 100644 index 6795350fd..000000000 --- a/packages/sats-wagmi/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@gobob/sats-wagmi'; diff --git a/packages/sats-wagmi/tsconfig.json b/packages/sats-wagmi/tsconfig.json deleted file mode 100644 index ef7b23bd9..000000000 --- a/packages/sats-wagmi/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "baseUrl": ".", - "declaration": false - }, - "include": ["src"] -} diff --git a/packages/ui/src/components/Drawer/Drawer.style.tsx b/packages/ui/src/components/Drawer/Drawer.style.tsx index eaf1f2c40..cc7ded1e8 100644 --- a/packages/ui/src/components/Drawer/Drawer.style.tsx +++ b/packages/ui/src/components/Drawer/Drawer.style.tsx @@ -12,7 +12,7 @@ type StyledDialogProps = { }; const StyledModal = styled.div` - transform: ${({ $isOpen }) => ($isOpen ? 'translateX(100%)' : 'translateX(0%)')}; + transform: ${({ $isOpen }) => ($isOpen ? 'translateX(-100%)' : 'translateX(0%)')}; ${({ $isOpen }) => overlayCSS(!!$isOpen)} visibility: visible; @@ -26,11 +26,11 @@ const StyledModal = styled.div` position: fixed; top: 0; bottom: 0; - left: auto; - right: 100%; + right: auto; + left: 100%; height: 100%; - max-width: 300px; + max-width: 320px; width: 100%; transition: transform ${({ $isOpen }) => ($isOpen ? '250ms' : '100ms')} ease-in-out; diff --git a/packages/ui/src/components/Icon/Icon.style.tsx b/packages/ui/src/components/Icon/Icon.style.tsx index d25749ae7..9af1ba859 100644 --- a/packages/ui/src/components/Icon/Icon.style.tsx +++ b/packages/ui/src/components/Icon/Icon.style.tsx @@ -28,12 +28,16 @@ const StyledIcon = styled.svg` overflow: hidden; ${({ theme, $size, $color, $width, $height }) => css` ${getResponsiveCSS(theme, $size, $color)} - width: ${$width && typeof $width === 'string' && ($width.includes('em') || $width.includes('rem')) - ? $width - : `${$width}px`}; - height: ${$height && typeof $height === 'string' && ($height.includes('em') || $height.includes('rem')) - ? $height - : `${$height}px`}; + width: ${$width + ? typeof $width === 'string' && ($width.includes('em') || $width.includes('rem')) + ? $width + : `${$width}px` + : undefined}; + height: ${$height + ? typeof $height === 'string' && ($height.includes('em') || $height.includes('rem')) + ? $height + : `${$height}px` + : undefined}; `} `; diff --git a/packages/ui/src/icons/ArrowPath.tsx b/packages/ui/src/icons/ArrowPath.tsx new file mode 100644 index 000000000..e3ecfd8be --- /dev/null +++ b/packages/ui/src/icons/ArrowPath.tsx @@ -0,0 +1,25 @@ +import { forwardRef } from 'react'; + +import { Icon, IconProps } from '../components'; + +const ArrowPath = forwardRef((props, ref) => ( + + + +)); + +ArrowPath.displayName = 'ArrowPath'; + +export { ArrowPath }; diff --git a/packages/ui/src/icons/CopyClipboard.tsx b/packages/ui/src/icons/CopyClipboard.tsx new file mode 100644 index 000000000..678bc81f3 --- /dev/null +++ b/packages/ui/src/icons/CopyClipboard.tsx @@ -0,0 +1,16 @@ +import { forwardRef } from 'react'; + +import { Icon, IconProps } from '../components'; + +const CopyClipboard = forwardRef((props, ref) => ( + + + +)); + +CopyClipboard.displayName = 'CopyClipboard'; + +export { CopyClipboard }; diff --git a/packages/ui/src/icons/CreditCard.tsx b/packages/ui/src/icons/CreditCard.tsx new file mode 100644 index 000000000..812fa23c4 --- /dev/null +++ b/packages/ui/src/icons/CreditCard.tsx @@ -0,0 +1,17 @@ +import { forwardRef } from 'react'; + +import { Icon, IconProps } from '../components'; + +const CreditCard = forwardRef((props, ref) => ( + + + +)); + +CreditCard.displayName = 'CreditCard'; + +export { CreditCard }; diff --git a/packages/ui/src/icons/LinkSlash.tsx b/packages/ui/src/icons/LinkSlash.tsx new file mode 100644 index 000000000..104208670 --- /dev/null +++ b/packages/ui/src/icons/LinkSlash.tsx @@ -0,0 +1,25 @@ +import { forwardRef } from 'react'; + +import { Icon, IconProps } from '../components'; + +const LinkSlash = forwardRef((props, ref) => ( + + + +)); + +LinkSlash.displayName = 'LinkSlash'; + +export { LinkSlash }; diff --git a/packages/ui/src/icons/SolidCreditCard.tsx b/packages/ui/src/icons/SolidCreditCard.tsx new file mode 100644 index 000000000..75f3dc325 --- /dev/null +++ b/packages/ui/src/icons/SolidCreditCard.tsx @@ -0,0 +1,18 @@ +import { forwardRef } from 'react'; + +import { Icon, IconProps } from '../components'; + +const SolidCreditCard = forwardRef((props, ref) => ( + + + + +)); + +SolidCreditCard.displayName = 'SolidCreditCard'; + +export { SolidCreditCard }; diff --git a/packages/ui/src/icons/index.ts b/packages/ui/src/icons/index.ts index c271d3641..8403a2653 100644 --- a/packages/ui/src/icons/index.ts +++ b/packages/ui/src/icons/index.ts @@ -2,6 +2,7 @@ export { ArrowDown } from './ArrowDown'; export { ArrowDownCircle } from './ArrowDownCircle'; export { ArrowLeft } from './ArrowLeft'; export { ArrowLongRight } from './ArrowLongRight'; +export { ArrowPath } from './ArrowPath'; export { ArrowPathRoundedSquare } from './ArrowPathRoundedSquare'; export { ArrowRight } from './ArrowRight'; export { ArrowRightCircle } from './ArrowRightCircle'; @@ -22,11 +23,14 @@ export { ChevronLeft } from './ChevronLeft'; export { ChevronRight } from './ChevronRight'; export { Clock } from './Clock'; export { Cog } from './Cog'; +export { CopyClipboard } from './CopyClipboard'; +export { CreditCard } from './CreditCard'; export { DocumentDuplicate } from './DocumentDuplicate'; export { EllipsisHorizontal } from './EllipsisHorizontal'; export { EllipsisVertical } from './EllipsisVertical'; export { ExclamationCircle } from './ExclamationCircle'; export { InformationCircle } from './InformationCircle'; +export { LinkSlash } from './LinkSlash'; export { ListBullet } from './ListBullet'; export { PencilSquare } from './PencilSquare'; export { Photo } from './Photo'; @@ -37,6 +41,7 @@ export { PuzzlePiece } from './PuzzlePiece'; export { QrCode } from './QrCode'; export { QuestionMarkCircle } from './QuestionMarkCircle'; export { SolidClock } from './SolidClock'; +export { SolidCreditCard } from './SolidCreditCard'; export { SolidDocumentDuplicate } from './SolidDocumentDuplicate'; export { SolidGift } from './SolidGift'; export { SolidInformationCircle } from './SolidInformationCircle'; diff --git a/packages/utils/package.json b/packages/utils/package.json index ac72b9dea..37d0ccf86 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -33,8 +33,5 @@ }, "devDependencies": { "vitest": "^1.5.2" - }, - "dependencies": { - "bitcoin-address-validation": "^2.2.3" } } diff --git a/packages/utils/src/address.ts b/packages/utils/src/address.ts deleted file mode 100644 index 89fcd764c..000000000 --- a/packages/utils/src/address.ts +++ /dev/null @@ -1 +0,0 @@ -export { validate as isValidBTCAddress, Network as BitcoinNetwork } from 'bitcoin-address-validation'; diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index cf4d0fbac..a9aaced1c 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,2 +1 @@ -export * from './address'; export * from './truncate'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4bc149b2b..f1c1c54f1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -81,6 +81,9 @@ catalogs: big.js: specifier: ^6.2.1 version: 6.2.1 + bitcoin-address-validation: + specifier: ^2.2.3 + version: 2.2.3 date-fns: specifier: ^3.2.0 version: 3.6.0 @@ -278,7 +281,7 @@ importers: version: 3.4.6(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.0(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) '@dynamic-labs/wagmi-connector': specifier: ^v3.0.0-alpha.29 - version: 3.4.6(y7yabcwxunvndnqj5goiw6opim) + version: 3.4.6(f3so2qmd3s3yrbp7bciqlibck4) '@gobob/chains': specifier: workspace:^ version: link:../../packages/chains @@ -336,6 +339,9 @@ importers: big.js: specifier: 'catalog:' version: 6.2.1 + bitcoin-address-validation: + specifier: ^2.2.3 + version: 2.2.3 date-fns: specifier: 'catalog:' version: 3.6.0 @@ -441,7 +447,25 @@ importers: dependencies: '@binance/w3w-wagmi-connector-v2': specifier: 1.2.4-alpha.0 - version: 1.2.4-alpha.0(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.2)(typescript@5.4.5))(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.12.30(@tanstack/query-core@5.44.0)(@tanstack/react-query@5.44.0(react@18.3.1))(@types/node@20.14.2)(@types/react@18.3.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(terser@5.31.1)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)) + version: 1.2.4-alpha.0(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.2)(typescript@5.4.5))(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.12.30(@tanstack/query-core@5.44.0)(@tanstack/react-query@5.44.0(react@18.3.1))(@types/node@20.14.2)(@types/react@18.3.3)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(terser@5.31.1)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)) + '@dynamic-labs/bitcoin': + specifier: ^3.6.2 + version: 3.9.2(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5) + '@dynamic-labs/ethereum': + specifier: ^3.6.2 + version: 3.9.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@types/react@18.3.3)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) + '@dynamic-labs/iconic': + specifier: ^3.6.2 + version: 3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dynamic-labs/sdk-react-core': + specifier: ^3.6.2 + version: 3.9.2(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + '@dynamic-labs/wagmi-connector': + specifier: ^3.6.2 + version: 3.9.2(5ui24d4myeik74pck2vvoxfbre) + '@dynamic-labs/wallet-book': + specifier: ^3.8.5 + version: 3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@gobob/bob-sdk': specifier: ^3.1.0 version: 3.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -457,9 +481,6 @@ importers: '@gobob/icons': specifier: workspace:^ version: link:../../packages/icons - '@gobob/sats-wagmi': - specifier: workspace:^ - version: link:../../packages/sats-wagmi '@gobob/tokens': specifier: workspace:^ version: link:../../packages/tokens @@ -490,6 +511,12 @@ importers: '@react-aria/utils': specifier: 'catalog:' version: 3.25.3(react@18.3.1) + '@scure/base': + specifier: ^1.1.9 + version: 1.1.9 + '@scure/btc-signer': + specifier: ^1.4.0 + version: 1.5.0 '@sentry/nextjs': specifier: 'catalog:' version: 8.30.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(next@14.2.15(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.92.0(esbuild@0.18.20)) @@ -508,6 +535,12 @@ importers: big.js: specifier: 'catalog:' version: 6.2.1 + bitcoin-address-validation: + specifier: 'catalog:' + version: 2.2.3 + boring-avatars: + specifier: ^1.11.2 + version: 1.11.2 date-fns: specifier: 'catalog:' version: 3.6.0 @@ -529,15 +562,15 @@ importers: react-dom: specifier: ^18.2.0 version: 18.3.1(react@18.3.1) - react-jazzicon: - specifier: ^1.0.4 - version: 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-multi-carousel: specifier: ^2.8.5 version: 2.8.5 react-otp-input: specifier: ^3.1.1 version: 3.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-qr-code: + specifier: ^2.0.12 + version: 2.0.14(react@18.3.1) siwe: specifier: ^2.1.4 version: 2.3.2(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) @@ -550,12 +583,15 @@ importers: usehooks-ts: specifier: 'catalog:' version: 3.1.0(react@18.3.1) + vaul: + specifier: ^1.1.1 + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) viem: specifier: 'catalog:' version: 2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) wagmi: specifier: 'catalog:' - version: 2.12.30(@tanstack/query-core@5.44.0)(@tanstack/react-query@5.44.0(react@18.3.1))(@types/node@20.14.2)(@types/react@18.3.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(terser@5.31.1)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) + version: 2.12.30(@tanstack/query-core@5.44.0)(@tanstack/react-query@5.44.0(react@18.3.1))(@types/node@20.14.2)(@types/react@18.3.3)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(terser@5.31.1)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) yup: specifier: 'catalog:' version: 0.32.11 @@ -665,12 +701,6 @@ importers: specifier: 'catalog:' version: 6.1.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - packages/sats-wagmi: - dependencies: - '@gobob/sats-wagmi': - specifier: ^0.3.17 - version: 0.3.17(@tanstack/react-query@5.44.0(react@18.3.1))(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@5.0.10) - packages/test-utils: dependencies: '@testing-library/jest-dom': @@ -866,10 +896,6 @@ importers: version: 6.1.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1) packages/utils: - dependencies: - bitcoin-address-validation: - specifier: ^2.2.3 - version: 2.2.3 devDependencies: vitest: specifier: ^1.5.2 @@ -1660,9 +1686,8 @@ packages: viem: 2.x wagmi: 2.x - '@bitcoin-js/tiny-secp256k1-asmjs@2.2.3': - resolution: {integrity: sha512-arFPdEZi9RIiaG76OZswTnAU0KfuiLwGw2VNfD66LKhzlbfOnX1o1WI/GI3qm9UbjG/0QOzZu/KmTNvL79x/DQ==} - engines: {node: '>=14.0.0'} + '@btckit/types@0.0.19': + resolution: {integrity: sha512-APoOfYSg9SRR4CMXL606IDtpgh+ZD3kS/+iY0BkUALD6HvXo2pVw20L5YYIc+HrgMcF6WN0TH7TXdVs+Vu+kww==} '@coinbase/wallet-sdk@3.9.3': resolution: {integrity: sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==} @@ -1791,14 +1816,28 @@ packages: '@dynamic-labs/assert-package-version@3.4.6': resolution: {integrity: sha512-Z1gAk6E0cH1ZOx4PoLNWKct4n1Swx8Y7zAIg4RW4EhervvK9bWjvh2D2mdkK00WrZH55KSpQFo2MZ9lTqeQJSw==} + '@dynamic-labs/assert-package-version@3.9.2': + resolution: {integrity: sha512-Il3zJUIkccVeob3g+ROjCMGPSx2EB8dKnRassqIvnmkeqG+kzvTS+jEnOiwTInjRK1kzoJ6dj9/Prq9xR2wz1g==} + + '@dynamic-labs/bitcoin@3.9.2': + resolution: {integrity: sha512-9hTPUmizKBqagXAa13HE6EXtm+u4m8IIlXaA7ooEMRmvYMseB/7vbSAam96WOT1DeHYbelTBCZE5yncGkRSb/Q==} + '@dynamic-labs/embedded-wallet-evm@3.4.6': resolution: {integrity: sha512-ejyNC4dJYEJvIbu3wErMTjNHqEROiHykAOZNAg9ESiA/tlAgNuvm7nnfgu+zu0fE3fTZ7xjbLKwZWtGbyHOyXg==} peerDependencies: viem: ^2.7.6 + '@dynamic-labs/embedded-wallet-evm@3.9.2': + resolution: {integrity: sha512-oLAcY4LTOHWjluy9qfNYoZyblPt+hXPWo/CE1DWwF4OYO7BMFV7zCmP6CouJ5t/+troaG6DvQDJdigryvhYbig==} + peerDependencies: + viem: ^2.7.12 + '@dynamic-labs/embedded-wallet@3.4.6': resolution: {integrity: sha512-lYqCLH7LC5euXrfn4mEp4MxP7dSz4KC6yGxR3BQpXeAnuPdDbg7kT69RwTJbFwHqXYi3F5lmAojqv08iR6QGhg==} + '@dynamic-labs/embedded-wallet@3.9.2': + resolution: {integrity: sha512-b6LpvXcqPRHsqICicIh65x1GhLZA4y4q28kDNaueFdH7h4yn2ck3oeLgGpZM5jo4ZeOBNCsFXugNMOj/zPIDBg==} + '@dynamic-labs/ethereum-aa@3.4.6': resolution: {integrity: sha512-Hcua/IFcbfzB4AuX7+BrpaS+mcnc1wU3zATO6X7P6+4sllymJUL7seJL4lsdRorhbEZI4RTXFXtSSoj/C9Pekg==} peerDependencies: @@ -1816,46 +1855,98 @@ packages: '@dynamic-labs/wallet-connector-core': 3.4.6 viem: ^2.7.6 + '@dynamic-labs/ethereum-core@3.9.2': + resolution: {integrity: sha512-hVuMriuTrdNs88nTamk0d9TeoW8W+qdq7OyuVoDV3Nzi/gJT+fRGwao+MC3HoggmQs2bizSO6lRIiFjXlnHZdA==} + peerDependencies: + '@dynamic-labs/assert-package-version': 3.9.2 + '@dynamic-labs/logger': 3.9.2 + '@dynamic-labs/rpc-providers': 3.9.2 + '@dynamic-labs/types': 3.9.2 + '@dynamic-labs/utils': 3.9.2 + '@dynamic-labs/wallet-book': 3.9.2 + '@dynamic-labs/wallet-connector-core': 3.9.2 + viem: ^2.7.12 + '@dynamic-labs/ethereum@3.4.6': resolution: {integrity: sha512-w3/y5ON+g5S7nPqXpEPkqY8APl16hC8YF1CQnnqaoo3Rd3hzpsm/E8Esug3YuYf9Xea1MauZC0cs7w9k+owUjg==} peerDependencies: viem: ^2.7.6 + '@dynamic-labs/ethereum@3.9.2': + resolution: {integrity: sha512-F8MhLZ8narzsSNb5HaQY74wPIsxTS6DWmAZgTX1F9ktoKKg50/7+ro8xxMwCvg5N40u2zZFjgaRlDcBJolTDIQ==} + peerDependencies: + viem: ^2.7.12 + '@dynamic-labs/iconic@3.4.6': resolution: {integrity: sha512-+Mz3sbPYorMgKTQ0jyYpPy6h+EyuXQt8Pz94maBIr1GR2DXHam4rLqTbg6MZQmeLKoj1Ob8EDpz7AcUs0/LKKA==} peerDependencies: react: ^18.2.0 react-dom: ^18.2.0 + '@dynamic-labs/iconic@3.9.2': + resolution: {integrity: sha512-oLwI0zx2L8dSBLRQbMpbn70eUdCmywx+rbdHJzayquL2KBrImXUHaO3ZTEz3l0CatxyVUNzLCNmsM9MJY2YfXQ==} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + '@dynamic-labs/logger@3.4.6': resolution: {integrity: sha512-i96TtRCgn7LJOG+KsQrvSog+2SJqHwuuulP0K4bFgHhTVBbR467ZXZskC0IdAc6sOHdrOqcxL9UNfawW/9ikvQ==} peerDependencies: eventemitter3: 5.0.1 + '@dynamic-labs/logger@3.9.2': + resolution: {integrity: sha512-FmTuVG9YjttL8RL9eBlW3XbunPl7Frag+QQkwpV0+rgThRhCydafFQ/FQxj2EiyyHgPyeQGLN1FaIa+9FfSd3A==} + peerDependencies: + eventemitter3: 5.0.1 + '@dynamic-labs/multi-wallet@3.4.6': resolution: {integrity: sha512-VXLIEIKuv74Hmd4EMoviQe7zdxC5VcL+BBIjESRWFQWo8rlqlBh9FX/KZ8hg13LWwnLrYdpeG+FOs5iyHlrPMw==} + '@dynamic-labs/multi-wallet@3.9.2': + resolution: {integrity: sha512-TSKiXlYcIJJQFWxpapCFL8TkBNCFcAL8sTX67TQSXXpSUfCDqPAQEcTTr9KbVdILLZpWuWiXgbxPXpgz7q8Heg==} + '@dynamic-labs/rpc-providers@3.4.6': resolution: {integrity: sha512-xaEdGBMb8RIWAOKr4L8kyrj0go9XPG+fZK32hRRn2FVo01DeT2E5z4WEawRfwhQBrFmp9geXU4Frf/oHAEAxkQ==} + '@dynamic-labs/rpc-providers@3.9.2': + resolution: {integrity: sha512-J2XFW/49hHZa0/+rxuNeh0hIuTR9GpRCvaSyLpGMAmySrG/crxZs89Fl3rXS4s9lJOXgQakarpee8cIDS3S97w==} + '@dynamic-labs/sdk-api-core@0.0.559': resolution: {integrity: sha512-7vuJbm/6cYk+FE9mUwi4wvwKihm8X/PRavqW4o1tcOVAZPkkcsgEnB0ZeX+jbHgij7gk5Zp3OJFd5Y903VZ0tw==} + '@dynamic-labs/sdk-api-core@0.0.570': + resolution: {integrity: sha512-jviShTv9f/DaQiYjTfvMM9vF4+qsf8CNgzkx+hKD+vAsK5bxx604aFzTJofdtN8XSz0fuKNSrJfpIpcgoNXulQ==} + '@dynamic-labs/sdk-react-core@3.4.6': resolution: {integrity: sha512-1cJkfuLjm4NkoSWckK+9c/lYvVuqwarcgX6EN081CJmi93biswOYsxGZypxXahUpaEbplrAv8ZRXKUCi0SFdWQ==} peerDependencies: react: ^18.2.0 react-dom: ^18.2.0 + '@dynamic-labs/sdk-react-core@3.9.2': + resolution: {integrity: sha512-WWR+ZB7bpXSDCumJ2t6eH2Fu9CDbJZWu1a/qBN4VY3nSqK2YW4XairJRiI6NROpgJy4QSG1E9z00Coh9/Dk7gA==} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + '@dynamic-labs/store@3.4.6': resolution: {integrity: sha512-KCgdClT0MxEU0YeS9/bF2FsCxerH7Ab815wj5B6Yo+HjGbn0rYJdB7or731+SLk8zYje67fVjqlF1d5Q4UliNw==} + '@dynamic-labs/store@3.9.2': + resolution: {integrity: sha512-lQQ2np9No9M6XQbKIULYr6EbX1o28Mt8/1l6FDptqLTsF84izX94BWSop7Otbjw0POCRMGTeyLP+OKJlAU7+BA==} + '@dynamic-labs/types@3.4.6': resolution: {integrity: sha512-kOho9zD7eOX8dyiIQILLl0MYi7P+g1m5jdjOO6uzwykLc7E78u21I9FfVkkIoJNkiY7Jx3HJUNbZDmJG51Clow==} + '@dynamic-labs/types@3.9.2': + resolution: {integrity: sha512-hqX63R0TGP5y/1Pm+BXQ4oZMnzfVOK6PBL5j6F9XUTYLOSs+UPCqL4MAFY0pY5E1x7o47BPie5rY52PABrQylw==} + '@dynamic-labs/utils@3.4.6': resolution: {integrity: sha512-20Lg6C7hpNqtEmJluOqOr3QiwTEjY6nffKa6D38vop1kT8uJo+XCP3wc2O+S9FYy3FQHhqCm21HA6x17cmoiHw==} + '@dynamic-labs/utils@3.9.2': + resolution: {integrity: sha512-7lggMGdGdXoikd/R5KVhhvUBqiL7zzCc02FjrSOz6e2OltpAgpxExfpDmBCPe+X/IPme1SygkctnNwu5grxpSg==} + '@dynamic-labs/wagmi-connector@3.4.6': resolution: {integrity: sha512-OncjVnoqRxN9cwjDfii52AkI9CVZOuEUyAYqLlcVwzaU4rmbaDbxvbeY5ElPN/7baQDBk+FWbuhQmwoIrkkf3g==} peerDependencies: @@ -1872,12 +1963,34 @@ packages: viem: ^2.7.6 wagmi: ^2.5.7 + '@dynamic-labs/wagmi-connector@3.9.2': + resolution: {integrity: sha512-X+IHpMo/59vUCYyk29gDmjhSSbHuvCdUc3Sxs8A+gXCArTX2aZ3I09PQctqk6PGUC7gTHjwQwNeWJjlHYmRkTQ==} + peerDependencies: + '@dynamic-labs/assert-package-version': 3.9.2 + '@dynamic-labs/ethereum-core': 3.9.2 + '@dynamic-labs/logger': 3.9.2 + '@dynamic-labs/rpc-providers': 3.9.2 + '@dynamic-labs/sdk-react-core': 3.9.2 + '@dynamic-labs/types': 3.9.2 + '@dynamic-labs/wallet-connector-core': 3.9.2 + '@wagmi/core': ^2.6.4 + eventemitter3: 5.0.1 + react: ^18.2.0 + viem: ^2.7.12 + wagmi: ^2.5.7 + '@dynamic-labs/wallet-book@3.4.6': resolution: {integrity: sha512-Q6MwCI1ZdDHSyCx548AOfenCL6tyjHj+ao1o91+uVJ+KwPkwl1yfWXSSeAKfYOFSB2i3jYFoSdQtqfZyLVT6DA==} peerDependencies: react: ^18.2.0 react-dom: ^18.2.0 + '@dynamic-labs/wallet-book@3.9.2': + resolution: {integrity: sha512-st0VZxyWN+Fn2EC+depNA9QNS58rPF2quNiHWy59/NAK6UleKk7pTWCdPBTAIHxA3pxzBISoIJPvYIbjbKURng==} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + '@dynamic-labs/wallet-connector-core@3.4.6': resolution: {integrity: sha512-SJv5M+L55APmRLXUMo7Y94c+ecZZxP6kqdS2zgp+7gRBLZzlLQkOKXExvVfzWzINqXOlUXwNuemeEy5bgHXkeA==} peerDependencies: @@ -1889,9 +2002,23 @@ packages: '@dynamic-labs/wallet-book': 3.4.6 eventemitter3: 5.0.1 + '@dynamic-labs/wallet-connector-core@3.9.2': + resolution: {integrity: sha512-bMIZB2EmhsM/rhir1sJEN/m3Z6pZf7fMdvWxHG5j9kdj8B84RyVup3+MOX6iQy5z0rffwt42/uAj6qScztqtwA==} + peerDependencies: + '@dynamic-labs/assert-package-version': 3.9.2 + '@dynamic-labs/logger': 3.9.2 + '@dynamic-labs/rpc-providers': 3.9.2 + '@dynamic-labs/types': 3.9.2 + '@dynamic-labs/utils': 3.9.2 + '@dynamic-labs/wallet-book': 3.9.2 + eventemitter3: 5.0.1 + '@dynamic-labs/webauthn@3.4.6': resolution: {integrity: sha512-CoepRl57kdQId9RRvEawbcqhWoeF5a3kVBd8up+8I4eah/dDHXrselH370d16EsDyaDIlu+1DB68uOwhH9sW/Q==} + '@dynamic-labs/webauthn@3.9.2': + resolution: {integrity: sha512-gAovsmJSeOAtREr6lsCW/TNsLWcv+6GOGtlcc/0zIh7jZQ2Uq9fgUeJitO1WpFtOZVYdeKGAZ/XkfivPhEthBw==} + '@ecies/ciphers@0.2.1': resolution: {integrity: sha512-ezMihhjW24VNK/2qQR7lH8xCQY24nk0XHF/kwJ1OuiiY5iEwQXOcKVSy47fSoHPRG8gVGXcK5SgtONDk5xMwtQ==} engines: {bun: '>=1', deno: '>=2', node: '>=16'} @@ -2452,13 +2579,6 @@ packages: '@gobob/bob-sdk@3.1.0': resolution: {integrity: sha512-pFuUSBROw5IcAxcgVyk7gdUTW1XomXorNxeIjC4m328ChtZ9cZqK0DKVVT7xVkwcC67+hkzFKVqGsFvTwFqQDw==} - '@gobob/sats-wagmi@0.3.17': - resolution: {integrity: sha512-XegzclOjrF9a8ipZuzuqkxF++RwnT/vU7kAoWEKc4aIBpRfqHw23vk6zvAIMhHhesi4i/IHMa/vKcOj5W0Z4+g==} - peerDependencies: - '@tanstack/react-query': '>=5.0.0' - react: ^18.2.0 - react-dom: ^18.2.0 - '@graphql-typed-document-node/core@3.2.0': resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: @@ -2835,10 +2955,6 @@ packages: resolution: {integrity: sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg==} engines: {node: '>=16.0.0'} - '@metamask/object-multiplex@1.3.0': - resolution: {integrity: sha512-czcQeVYdSNtabd+NcYQnrM69MciiJyd1qvKH8WM2Id3C0ZiUUX5Xa/MK+/VUk633DBhVOwdNzAKIQ33lGyA+eQ==} - engines: {node: '>=12.0.0'} - '@metamask/object-multiplex@2.0.0': resolution: {integrity: sha512-+ItrieVZie3j2LfYE0QkdW3dsEMfMEp419IGx1zyeLqjRZ14iQUPRO0H6CGgfAAoC0x6k2PfCAGRwJUA9BMrqA==} engines: {node: ^16.20 || ^18.16 || >=20} @@ -2846,10 +2962,6 @@ packages: '@metamask/onboarding@1.0.1': resolution: {integrity: sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==} - '@metamask/providers@12.0.0': - resolution: {integrity: sha512-NkrSvOF8v8kDz9f2TY1AYK19hJdpYbYhbXWhjmmmXrSMYotn+o7ZV1b1Yd0fqD/HKVL0Vd2BWBUT9U0ggIDTEA==} - engines: {node: '>=16.0.0'} - '@metamask/providers@16.1.0': resolution: {integrity: sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g==} engines: {node: ^18.18 || >=20} @@ -3017,6 +3129,10 @@ packages: resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==} engines: {node: ^14.21.3 || >=16} + '@noble/curves@1.7.0': + resolution: {integrity: sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==} + engines: {node: ^14.21.3 || >=16} + '@noble/hashes@1.3.2': resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} engines: {node: '>= 16'} @@ -3029,6 +3145,14 @@ packages: resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} engines: {node: ^14.21.3 || >=16} + '@noble/hashes@1.6.0': + resolution: {integrity: sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.6.1': + resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==} + engines: {node: ^14.21.3 || >=16} + '@noble/secp256k1@1.7.1': resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} @@ -3349,6 +3473,9 @@ packages: '@radix-ui/primitive@1.0.1': resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + '@radix-ui/primitive@1.1.0': + resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} + '@radix-ui/react-arrow@1.0.3': resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} peerDependencies: @@ -3384,6 +3511,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-compose-refs@1.1.0': + resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-context@1.0.1': resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} peerDependencies: @@ -3393,6 +3529,28 @@ packages: '@types/react': optional: true + '@radix-ui/react-context@1.1.1': + resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.2': + resolution: {integrity: sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^18.2.0 + react-dom: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-direction@1.0.1': resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} peerDependencies: @@ -3415,6 +3573,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-dismissable-layer@1.1.1': + resolution: {integrity: sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^18.2.0 + react-dom: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-focus-guards@1.0.1': resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} peerDependencies: @@ -3424,6 +3595,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-focus-guards@1.1.1': + resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-focus-scope@1.0.3': resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} peerDependencies: @@ -3437,6 +3617,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-focus-scope@1.1.0': + resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^18.2.0 + react-dom: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-id@1.0.1': resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} peerDependencies: @@ -3446,6 +3639,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-id@1.1.0': + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-popper@1.1.2': resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} peerDependencies: @@ -3472,6 +3674,32 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-portal@1.1.2': + resolution: {integrity: sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^18.2.0 + react-dom: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.1': + resolution: {integrity: sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^18.2.0 + react-dom: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-primitive@1.0.3': resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: @@ -3485,6 +3713,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-primitive@2.0.0': + resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^18.2.0 + react-dom: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-roving-focus@1.0.4': resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} peerDependencies: @@ -3533,6 +3774,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-slot@1.1.0': + resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-toggle-group@1.0.4': resolution: {integrity: sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==} peerDependencies: @@ -3581,6 +3831,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-callback-ref@1.1.0': + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-controllable-state@1.0.1': resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} peerDependencies: @@ -3590,6 +3849,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-escape-keydown@1.0.3': resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} peerDependencies: @@ -3599,6 +3867,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-escape-keydown@1.1.0': + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-layout-effect@1.0.1': resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} peerDependencies: @@ -3608,6 +3885,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-layout-effect@1.1.0': + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-previous@1.0.1': resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} peerDependencies: @@ -4391,9 +4677,24 @@ packages: resolution: {integrity: sha512-N9Y2CKPBVbc8FbOKzqepy8TJUY2VILX7bmxV4ruByLJvR9PBnGvGfnOhw975cDn6PmSziXL0RaUWHpSW23rsng==} engines: {node: '>=16'} + '@sats-connect/core@0.2.2': + resolution: {integrity: sha512-nl3zPnV1UBllYAniDfhM/oSFGQ2qy4cCg1YwxJZ+RQMwlTMrVh2f3lJ//dIIo9RgQPrtHpwrAaaWW0VpfqDQbg==} + + '@sats-connect/make-default-provider-config@0.0.5': + resolution: {integrity: sha512-b/v4IeDEde5DqFOdMbMmf3B0t/lxlKnY04f3YIUWe1khOg3S6VdcK9Mqva+WUOsJHBTIA5b4hK7CqfMjx1Ic+w==} + peerDependencies: + '@sats-connect/core': '*' + typescript: 5.4.4 + + '@sats-connect/ui@0.0.6': + resolution: {integrity: sha512-H3bFFhr9CcY1oNosNi/QJszmMHSht4U19bUWfM3vzayAKgV4ebY6iUnRK5g3p2rVLLWVzlpaw1J9m+7JWwyBfA==} + '@scure/base@1.1.9': resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + '@scure/base@1.2.1': + resolution: {integrity: sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==} + '@scure/bip32@1.3.2': resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} @@ -4412,8 +4713,8 @@ packages: '@scure/bip39@1.4.0': resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} - '@scure/btc-signer@1.3.2': - resolution: {integrity: sha512-BmcQHvxaaShKwgbFC0vDk0xzqbMhNtNmgXm6u7cz07FNtGsVItUuHow6NbgHmc+oJSBZJRym5dz8+Uu0JoEJhQ==} + '@scure/btc-signer@1.5.0': + resolution: {integrity: sha512-KCtq5z73/VthxeXrxgWgZNgOz6tXaSRr1+mMPCec5+S2G3aDLnh+uLM/l4imBWFm5cTppKG0ZmEk0N2thC7WVA==} '@sentry-internal/browser-utils@8.30.0': resolution: {integrity: sha512-pwX+awNWaxSOAsBLVLqc1+Hw+Fm1Nci9mbKFA6Ed5YzCG049PnBVQwugpmx2dcyyCqJpORhcIqb9jHdCkYmCiA==} @@ -5532,6 +5833,14 @@ packages: typescript: optional: true + '@wallet-standard/app@1.0.1': + resolution: {integrity: sha512-LnLYq2Vy2guTZ8GQKKSXQK3+FRGPil75XEdkZqE6fiLixJhZJoJa5hT7lXxwe0ykVTt9LEThdTbOpT7KadS26Q==} + engines: {node: '>=16'} + + '@wallet-standard/base@1.0.1': + resolution: {integrity: sha512-1To3ekMfzhYxe0Yhkpri+Fedq0SYcfrOfJi3vbLjMwF2qiKPjTGLwZkf2C9ftdQmxES+hmxhBzTwF4KgcOwf8w==} + engines: {node: '>=16'} + '@walletconnect/core@2.11.2': resolution: {integrity: sha512-bB4SiXX8hX3/hyBfVPC5gwZCXCl+OPj+/EDVM71iAO3TDsh78KPbrVAbDnnsbHzZVHlsMohtXX3j5XVsheN3+g==} @@ -5589,21 +5898,12 @@ packages: '@walletconnect/logger@2.1.2': resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==} - '@walletconnect/modal-core@2.6.2': - resolution: {integrity: sha512-cv8ibvdOJQv2B+nyxP9IIFdxvQznMz8OOr/oR/AaUZym4hjXNL/l1a2UlSQBXrVjo3xxbouMxLb3kBsHoYP2CA==} - '@walletconnect/modal-core@2.7.0': resolution: {integrity: sha512-oyMIfdlNdpyKF2kTJowTixZSo0PGlCJRdssUN/EZdA6H6v03hZnf09JnwpljZNfir2M65Dvjm/15nGrDQnlxSA==} - '@walletconnect/modal-ui@2.6.2': - resolution: {integrity: sha512-rbdstM1HPGvr7jprQkyPggX7rP4XiCG85ZA+zWBEX0dVQg8PpAgRUqpeub4xQKDgY7pY/xLRXSiCVdWGqvG2HA==} - '@walletconnect/modal-ui@2.7.0': resolution: {integrity: sha512-gERYvU7D7K1ANCN/8vUgsE0d2hnRemfAFZ2novm9aZBg7TEd/4EgB+AqbJ+1dc7GhOL6dazckVq78TgccHb7mQ==} - '@walletconnect/modal@2.6.2': - resolution: {integrity: sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA==} - '@walletconnect/modal@2.7.0': resolution: {integrity: sha512-RQVt58oJ+rwqnPcIvRFeMGKuXb9qkgSmwz4noF8JZGUym3gUAzVs+uW2NQ1Owm9XOJAV+sANrtJ+VoVq1ftElw==} @@ -6092,9 +6392,6 @@ packages: async-mutex@0.2.6: resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} - async-retry@1.3.3: - resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} - async@2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} @@ -6143,6 +6440,9 @@ packages: axios@1.7.2: resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + axios@1.7.4: + resolution: {integrity: sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==} + axobject-query@3.2.1: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} @@ -6212,9 +6512,6 @@ packages: barcode-detector@2.2.11: resolution: {integrity: sha512-N50XZ6Rav2sxTgHXOc38/mkpVJMan11GZ8Yqi1pPMZpTJSXuZ/FpIee6OtLehZX/Vs4ZOzGbp1DgXzFCfKggWA==} - base-x@3.0.10: - resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} - base-x@4.0.0: resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} @@ -6259,13 +6556,13 @@ packages: resolution: {integrity: sha512-mdFV5+/v0XyNYXjBS6CQPLo9ekCx4gtKZFnJm5PMto7Fs9hTTDpkkzOB7/FtluRI6JbUUAu+snTYfJRgHLZbZQ==} engines: {node: '>=8.0.0'} - bip32@4.0.0: - resolution: {integrity: sha512-aOGy88DDlVUhspIXJN+dVEtclhIsfAUppD43V0j40cPTld3pv/0X/MlrZSZ6jowIaQQzFwP8M6rFU2z2mVYjDQ==} - engines: {node: '>=6.0.0'} - bitcoin-address-validation@2.2.3: resolution: {integrity: sha512-1uGCGl26Ye8JG5qcExtFLQfuib6qEZWNDo1ZlLlwp/z7ygUFby3IxolgEfgMGaC+LG9csbVASLcH8fRLv7DIOg==} + bitcoinjs-lib@6.1.5: + resolution: {integrity: sha512-yuf6xs9QX/E8LWE2aMJPNd0IxGofwfuVOiYdNUESkc+2bHHVKjhJd8qewqapeoolh9fihzHGoDCB5Vkr57RZCQ==} + engines: {node: '>=8.0.0'} + bitcoinjs-lib@6.1.6: resolution: {integrity: sha512-Fk8+Vc+e2rMoDU5gXkW9tD+313rhkm5h6N9HfZxXvYU9LedttVvmXKTgd9k5rsQJjkSfsv6XRM8uhJv94SrvcA==} engines: {node: '>=8.0.0'} @@ -6304,6 +6601,9 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + boring-avatars@1.11.2: + resolution: {integrity: sha512-3+wkwPeObwS4R37FGXMYViqc4iTrIRj5yzfX9Qy4mnpZ26sX41dGMhsAgmKks1r/uufY1pl4vpgzMWHYfJRb2A==} + bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} @@ -6358,15 +6658,9 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - bs58@5.0.0: resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} - bs58check@2.1.2: - resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} - bs58check@3.0.1: resolution: {integrity: sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==} @@ -7769,10 +8063,6 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - extension-port-stream@2.1.1: - resolution: {integrity: sha512-qknp5o5rj2J9CRKfVB8KJr+uXQlrojNZzdESUPhKYLXf97TPcGf6qWWKmpsNNtUyOdzFhab1ON0jzouNxHHvow==} - engines: {node: '>=12.0.0'} - extension-port-stream@3.0.0: resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} engines: {node: '>=12.0.0'} @@ -9129,10 +9419,6 @@ packages: resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} engines: {node: '>=10.0.0'} - json-rpc-middleware-stream@4.2.3: - resolution: {integrity: sha512-4iFb0yffm5vo3eFKDbQgke9o17XBcLQ2c3sONrXSbcOLzP8LTojqo8hRGVgtJShhm5q4ZDSNq039fAx9o65E1w==} - engines: {node: '>=14.0.0'} - json-rpc-random-id@1.0.1: resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} @@ -9357,6 +9643,9 @@ packages: lodash.mergewith@4.6.2: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + lodash.omit@4.5.0: + resolution: {integrity: sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==} + lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} @@ -9552,9 +9841,6 @@ packages: resolution: {integrity: sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==} engines: {node: '>= 7.6.0'} - mersenne-twister@1.1.0: - resolution: {integrity: sha512-mUYWsMKNrm4lfygPkL3OfGzOPTR2DBlTkBNHM//F6hGp8cLThY897crAlk3/Jo17LEOOjQUrNAx6DvgO77QJkA==} - methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} @@ -9620,8 +9906,8 @@ packages: micro-ftch@0.3.1: resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} - micro-packed@0.6.3: - resolution: {integrity: sha512-VmVkyc7lIzAq/XCPFuLc/CwQ7Ehs5XDK3IwqsZHiBIDttAI9Gs7go6Lv4lNRuAIKrGKcRTtthFKUNyHS0S4wJQ==} + micro-packed@0.7.0: + resolution: {integrity: sha512-GJB99Ox8AI3C2Xr9DFalmHjYaJTUwh6w18jqnOKJEU9fpR9uZaRGCE8xjSS4b9yH2KDmW2BdPR8BylzfYVBIdg==} micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} @@ -10422,9 +10708,6 @@ packages: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} - preact@10.22.0: - resolution: {integrity: sha512-RRurnSjJPj4rp5K6XoP45Ui33ncb7e4H7WiOHVpjbkvqvA3U+N8Z6Qbo0AE6leGYBV66n8EhEaFixvIu3SkxFw==} - preact@10.24.3: resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==} @@ -10748,12 +11031,6 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-jazzicon@1.0.4: - resolution: {integrity: sha512-/3kWv5vtAhI18GBFoqjpxRTtL+EImuB73PAC02r/zJQ6E+PAUmoBx8edYvTCIYHwS01uFf6N3elTDqSrVPwg4w==} - peerDependencies: - react: ^18.2.0 - react-dom: ^18.2.0 - react-loading-skeleton@3.5.0: resolution: {integrity: sha512-gxxSyLbrEAdXTKgfbpBEFZCO/P153DnqSCQau2+o6lNy1jgMRr2MmRmOzMmyrwSaSYLRB8g7b0waYPmUjz7IhQ==} peerDependencies: @@ -10841,6 +11118,16 @@ packages: '@types/react': optional: true + react-remove-scroll@2.6.0: + resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + react-shallow-renderer@16.15.0: resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} peerDependencies: @@ -11141,8 +11428,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sats-connect@1.4.1: - resolution: {integrity: sha512-IDGbgZS+NmURyQ01pUBnDgTuHx7uF9lUrDqKU7+M2YpDLe5NDIkc7oyXh3r+lDWnwfAGCyO31L1tK1+xgT9ThQ==} + sats-connect@2.8.0: + resolution: {integrity: sha512-eYdpPoAXn6ud1hMZnQGowO1F0f9fS3jmE5Hq1F3VxXUbAvT2YmA72PBtG6QN/cdMuFZ5x1ce6I/fl270WSXqjw==} saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} @@ -12121,10 +12408,6 @@ packages: engines: {node: '>=0.8.0'} hasBin: true - uint8array-tools@0.0.7: - resolution: {integrity: sha512-vrrNZJiusLWoFWBqz5Y5KMCgP9W9hnjZHzZiZRT8oNAkq3d5Z5Oe76jAvVVSRh4U8GGR90N2X1dWtrhvx6L8UQ==} - engines: {node: '>=14.0.0'} - uint8arrays@3.1.0: resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} @@ -12380,6 +12663,9 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + valibot@0.33.2: + resolution: {integrity: sha512-ZpFWuI+bs5+PP66q4zVFn4e4t/s5jmMw5iPBZmGUoi8iQqXyU9YY/BLCAyk62Z/bNS8qdUNBEyx52952qdqW3w==} + valid-url@1.0.9: resolution: {integrity: sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==} @@ -12405,6 +12691,12 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vaul@1.1.1: + resolution: {integrity: sha512-+ejzF6ffQKPcfgS7uOrGn017g39F8SO4yLPXbBhpC7a0H+oPqPna8f1BUfXaz8eU4+pxbQcmjxW+jWBSbxjaFg==} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + verror@1.10.0: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} @@ -12726,9 +13018,6 @@ packages: engines: {node: '>=8'} hasBin: true - wif@2.0.6: - resolution: {integrity: sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==} - wildcard@2.0.1: resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} @@ -14005,12 +14294,12 @@ snapshots: hash.js: 1.1.7 js-base64: 3.7.7 - '@binance/w3w-wagmi-connector-v2@1.2.4-alpha.0(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.2)(typescript@5.4.5))(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.12.30(@tanstack/query-core@5.44.0)(@tanstack/react-query@5.44.0(react@18.3.1))(@types/node@20.14.2)(@types/react@18.3.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(terser@5.31.1)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))': + '@binance/w3w-wagmi-connector-v2@1.2.4-alpha.0(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.2)(typescript@5.4.5))(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.12.30(@tanstack/query-core@5.44.0)(@tanstack/react-query@5.44.0(react@18.3.1))(@types/node@20.14.2)(@types/react@18.3.3)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(terser@5.31.1)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))': dependencies: '@binance/w3w-ethereum-provider': 1.1.8-alpha.0(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.2)(typescript@5.4.5))(utf-8-validate@5.0.10) '@binance/w3w-utils': 1.1.4 viem: 2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) - wagmi: 2.12.30(@tanstack/query-core@5.44.0)(@tanstack/react-query@5.44.0(react@18.3.1))(@types/node@20.14.2)(@types/react@18.3.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(terser@5.31.1)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) + wagmi: 2.12.30(@tanstack/query-core@5.44.0)(@tanstack/react-query@5.44.0(react@18.3.1))(@types/node@20.14.2)(@types/react@18.3.3)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(terser@5.31.1)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) transitivePeerDependencies: - bufferutil - debug @@ -14018,9 +14307,7 @@ snapshots: - ts-node - utf-8-validate - '@bitcoin-js/tiny-secp256k1-asmjs@2.2.3': - dependencies: - uint8array-tools: 0.0.7 + '@btckit/types@0.0.19': {} '@coinbase/wallet-sdk@3.9.3': dependencies: @@ -14042,7 +14329,7 @@ snapshots: clsx: 1.2.1 eventemitter3: 5.0.1 keccak: 3.0.4 - preact: 10.22.0 + preact: 10.24.3 sha.js: 2.4.11 '@coinbase/wallet-sdk@4.2.1(@types/node@20.14.2)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.31.1)': @@ -14305,6 +14592,35 @@ snapshots: transitivePeerDependencies: - eventemitter3 + '@dynamic-labs/assert-package-version@3.9.2(eventemitter3@5.0.1)': + dependencies: + '@dynamic-labs/logger': 3.9.2(eventemitter3@5.0.1) + transitivePeerDependencies: + - eventemitter3 + + '@dynamic-labs/bitcoin@3.9.2(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5)': + dependencies: + '@btckit/types': 0.0.19 + '@dynamic-labs/assert-package-version': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/sdk-api-core': 0.0.570 + '@dynamic-labs/types': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/utils': 3.9.2 + '@dynamic-labs/wallet-book': 3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dynamic-labs/wallet-connector-core': 3.9.2(@dynamic-labs/assert-package-version@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/types@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/utils@3.9.2)(@dynamic-labs/wallet-book@3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eventemitter3@5.0.1) + '@wallet-standard/app': 1.0.1 + '@wallet-standard/base': 1.0.1 + bitcoinjs-lib: 6.1.5 + eventemitter3: 5.0.1 + jsontokens: 4.0.1 + sats-connect: 2.8.0(typescript@5.4.5) + transitivePeerDependencies: + - '@dynamic-labs/logger' + - '@dynamic-labs/rpc-providers' + - debug + - react + - react-dom + - typescript + '@dynamic-labs/embedded-wallet-evm@3.4.6(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@dynamic-labs/logger@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.4.6(eventemitter3@5.0.1))(@types/react@18.3.3)(bufferutil@4.0.8)(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))': dependencies: '@dynamic-labs/assert-package-version': 3.4.6(eventemitter3@5.0.1) @@ -14336,6 +14652,37 @@ snapshots: - supports-color - utf-8-validate + '@dynamic-labs/embedded-wallet-evm@3.9.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@types/react@18.3.3)(bufferutil@4.0.8)(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))': + dependencies: + '@dynamic-labs/assert-package-version': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/embedded-wallet': 3.9.2(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/types@3.9.2(eventemitter3@5.0.1))(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dynamic-labs/ethereum-core': 3.9.2(@dynamic-labs/assert-package-version@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/types@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/utils@3.9.2)(@dynamic-labs/wallet-book@3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@dynamic-labs/wallet-connector-core@3.9.2(@dynamic-labs/assert-package-version@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/types@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/utils@3.9.2)(@dynamic-labs/wallet-book@3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eventemitter3@5.0.1))(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) + '@dynamic-labs/sdk-api-core': 0.0.570 + '@dynamic-labs/types': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/utils': 3.9.2 + '@dynamic-labs/wallet-book': 3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dynamic-labs/wallet-connector-core': 3.9.2(@dynamic-labs/assert-package-version@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/types@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/utils@3.9.2)(@dynamic-labs/wallet-book@3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eventemitter3@5.0.1) + '@dynamic-labs/webauthn': 3.9.2(eventemitter3@5.0.1) + '@turnkey/api-key-stamper': 0.4.1 + '@turnkey/http': 2.12.2 + '@turnkey/iframe-stamper': 2.0.0 + '@turnkey/viem': 0.4.26(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) + '@turnkey/webauthn-stamper': 0.5.0 + viem: 2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) + transitivePeerDependencies: + - '@babel/core' + - '@babel/preset-env' + - '@dynamic-labs/logger' + - '@dynamic-labs/rpc-providers' + - '@types/react' + - bufferutil + - encoding + - eventemitter3 + - react + - react-dom + - supports-color + - utf-8-validate + '@dynamic-labs/embedded-wallet@3.4.6(@dynamic-labs/rpc-providers@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/types@3.4.6(eventemitter3@5.0.1))(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@dynamic-labs/assert-package-version': 3.4.6(eventemitter3@5.0.1) @@ -14357,6 +14704,27 @@ snapshots: - react - react-dom + '@dynamic-labs/embedded-wallet@3.9.2(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/types@3.9.2(eventemitter3@5.0.1))(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@dynamic-labs/assert-package-version': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/logger': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/sdk-api-core': 0.0.570 + '@dynamic-labs/utils': 3.9.2 + '@dynamic-labs/wallet-book': 3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dynamic-labs/wallet-connector-core': 3.9.2(@dynamic-labs/assert-package-version@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/types@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/utils@3.9.2)(@dynamic-labs/wallet-book@3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eventemitter3@5.0.1) + '@dynamic-labs/webauthn': 3.9.2(eventemitter3@5.0.1) + '@turnkey/api-key-stamper': 0.4.1 + '@turnkey/http': 2.12.2 + '@turnkey/iframe-stamper': 2.0.0 + '@turnkey/webauthn-stamper': 0.5.0 + transitivePeerDependencies: + - '@dynamic-labs/rpc-providers' + - '@dynamic-labs/types' + - encoding + - eventemitter3 + - react + - react-dom + '@dynamic-labs/ethereum-aa@3.4.6(@dynamic-labs/rpc-providers@3.4.6(eventemitter3@5.0.1))(@zerodev/webauthn-key@5.3.3(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)))(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))': dependencies: '@dynamic-labs/assert-package-version': 3.4.6(eventemitter3@5.0.1) @@ -14391,6 +14759,30 @@ snapshots: '@dynamic-labs/wallet-connector-core': 3.4.6(@dynamic-labs/assert-package-version@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/logger@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/types@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/utils@3.4.6)(@dynamic-labs/wallet-book@3.4.6(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eventemitter3@5.0.1) viem: 2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) + '@dynamic-labs/ethereum-core@3.9.2(@dynamic-labs/assert-package-version@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/logger@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/types@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/utils@3.4.6)(@dynamic-labs/wallet-book@3.4.6(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@dynamic-labs/wallet-connector-core@3.4.6(@dynamic-labs/assert-package-version@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/logger@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/types@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/utils@3.4.6)(@dynamic-labs/wallet-book@3.4.6(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eventemitter3@5.0.1))(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))': + dependencies: + '@dynamic-labs/assert-package-version': 3.4.6(eventemitter3@5.0.1) + '@dynamic-labs/logger': 3.4.6(eventemitter3@5.0.1) + '@dynamic-labs/rpc-providers': 3.4.6(eventemitter3@5.0.1) + '@dynamic-labs/sdk-api-core': 0.0.570 + '@dynamic-labs/types': 3.4.6(eventemitter3@5.0.1) + '@dynamic-labs/utils': 3.4.6 + '@dynamic-labs/wallet-book': 3.4.6(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dynamic-labs/wallet-connector-core': 3.4.6(@dynamic-labs/assert-package-version@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/logger@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/types@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/utils@3.4.6)(@dynamic-labs/wallet-book@3.4.6(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eventemitter3@5.0.1) + viem: 2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) + + '@dynamic-labs/ethereum-core@3.9.2(@dynamic-labs/assert-package-version@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/types@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/utils@3.9.2)(@dynamic-labs/wallet-book@3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@dynamic-labs/wallet-connector-core@3.9.2(@dynamic-labs/assert-package-version@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/types@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/utils@3.9.2)(@dynamic-labs/wallet-book@3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eventemitter3@5.0.1))(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))': + dependencies: + '@dynamic-labs/assert-package-version': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/logger': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/rpc-providers': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/sdk-api-core': 0.0.570 + '@dynamic-labs/types': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/utils': 3.9.2 + '@dynamic-labs/wallet-book': 3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dynamic-labs/wallet-connector-core': 3.9.2(@dynamic-labs/assert-package-version@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/types@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/utils@3.9.2)(@dynamic-labs/wallet-book@3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eventemitter3@5.0.1) + viem: 2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) + '@dynamic-labs/ethereum@3.4.6(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@dynamic-labs/logger@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.4.6(eventemitter3@5.0.1))(@types/react@18.3.3)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))': dependencies: '@coinbase/wallet-sdk': 4.0.4 @@ -14433,6 +14825,48 @@ snapshots: - uWebSockets.js - utf-8-validate + '@dynamic-labs/ethereum@3.9.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@types/react@18.3.3)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))': + dependencies: + '@coinbase/wallet-sdk': 4.0.4 + '@dynamic-labs/assert-package-version': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/embedded-wallet-evm': 3.9.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@types/react@18.3.3)(bufferutil@4.0.8)(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) + '@dynamic-labs/ethereum-core': 3.9.2(@dynamic-labs/assert-package-version@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/types@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/utils@3.9.2)(@dynamic-labs/wallet-book@3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@dynamic-labs/wallet-connector-core@3.9.2(@dynamic-labs/assert-package-version@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/types@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/utils@3.9.2)(@dynamic-labs/wallet-book@3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eventemitter3@5.0.1))(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) + '@dynamic-labs/types': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/utils': 3.9.2 + '@dynamic-labs/wallet-book': 3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dynamic-labs/wallet-connector-core': 3.9.2(@dynamic-labs/assert-package-version@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/types@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/utils@3.9.2)(@dynamic-labs/wallet-book@3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eventemitter3@5.0.1) + '@walletconnect/ethereum-provider': 2.11.2(@types/react@18.3.3)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.10.6(@upstash/redis@1.34.3)(@vercel/kv@3.0.0) + buffer: 6.0.3 + eventemitter3: 5.0.1 + viem: 2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@babel/core' + - '@babel/preset-env' + - '@capacitor/preferences' + - '@dynamic-labs/logger' + - '@dynamic-labs/rpc-providers' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - ioredis + - react + - react-dom + - supports-color + - uWebSockets.js + - utf-8-validate + '@dynamic-labs/iconic@3.4.6(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@dynamic-labs/assert-package-version': 3.4.6(eventemitter3@5.0.1) @@ -14443,10 +14877,24 @@ snapshots: transitivePeerDependencies: - eventemitter3 + '@dynamic-labs/iconic@3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@dynamic-labs/assert-package-version': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/logger': 3.9.2(eventemitter3@5.0.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + sharp: 0.33.2 + transitivePeerDependencies: + - eventemitter3 + '@dynamic-labs/logger@3.4.6(eventemitter3@5.0.1)': dependencies: eventemitter3: 5.0.1 + '@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1)': + dependencies: + eventemitter3: 5.0.1 + '@dynamic-labs/multi-wallet@3.4.6(@dynamic-labs/logger@3.4.6(eventemitter3@5.0.1))(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@dynamic-labs/assert-package-version': 3.4.6(eventemitter3@5.0.1) @@ -14463,6 +14911,22 @@ snapshots: - react - react-dom + '@dynamic-labs/multi-wallet@3.9.2(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@dynamic-labs/assert-package-version': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/rpc-providers': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/sdk-api-core': 0.0.570 + '@dynamic-labs/types': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/utils': 3.9.2 + '@dynamic-labs/wallet-book': 3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dynamic-labs/wallet-connector-core': 3.9.2(@dynamic-labs/assert-package-version@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/types@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/utils@3.9.2)(@dynamic-labs/wallet-book@3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eventemitter3@5.0.1) + tslib: 2.4.1 + transitivePeerDependencies: + - '@dynamic-labs/logger' + - eventemitter3 + - react + - react-dom + '@dynamic-labs/rpc-providers@3.4.6(eventemitter3@5.0.1)': dependencies: '@dynamic-labs/assert-package-version': 3.4.6(eventemitter3@5.0.1) @@ -14470,8 +14934,17 @@ snapshots: transitivePeerDependencies: - eventemitter3 + '@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1)': + dependencies: + '@dynamic-labs/assert-package-version': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/types': 3.9.2(eventemitter3@5.0.1) + transitivePeerDependencies: + - eventemitter3 + '@dynamic-labs/sdk-api-core@0.0.559': {} + '@dynamic-labs/sdk-api-core@0.0.570': {} + '@dynamic-labs/sdk-react-core@3.4.6(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.0(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': dependencies: '@dynamic-labs/assert-package-version': 3.4.6(eventemitter3@5.0.1) @@ -14501,6 +14974,36 @@ snapshots: - '@types/react' - react-native + '@dynamic-labs/sdk-react-core@3.9.2(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)': + dependencies: + '@dynamic-labs/assert-package-version': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/iconic': 3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dynamic-labs/logger': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/multi-wallet': 3.9.2(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dynamic-labs/rpc-providers': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/sdk-api-core': 0.0.570 + '@dynamic-labs/store': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/types': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/utils': 3.9.2 + '@dynamic-labs/wallet-book': 3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dynamic-labs/wallet-connector-core': 3.9.2(@dynamic-labs/assert-package-version@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/types@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/utils@3.9.2)(@dynamic-labs/wallet-book@3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eventemitter3@5.0.1) + '@hcaptcha/react-hcaptcha': 1.4.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + bs58: 5.0.0 + country-list: 2.3.0 + eventemitter3: 5.0.1 + formik: 2.2.9(react@18.3.1) + i18next: 23.4.6 + qrcode: 1.5.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-focus-lock: 2.9.2(@types/react@18.3.3)(react@18.3.1) + react-i18next: 13.5.0(i18next@23.4.6)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + react-international-phone: 4.2.5(react@18.3.1) + yup: 0.32.11 + transitivePeerDependencies: + - '@types/react' + - react-native + '@dynamic-labs/store@3.4.6(eventemitter3@5.0.1)': dependencies: '@dynamic-labs/assert-package-version': 3.4.6(eventemitter3@5.0.1) @@ -14508,6 +15011,13 @@ snapshots: transitivePeerDependencies: - eventemitter3 + '@dynamic-labs/store@3.9.2(eventemitter3@5.0.1)': + dependencies: + '@dynamic-labs/assert-package-version': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/logger': 3.9.2(eventemitter3@5.0.1) + transitivePeerDependencies: + - eventemitter3 + '@dynamic-labs/types@3.4.6(eventemitter3@5.0.1)': dependencies: '@dynamic-labs/assert-package-version': 3.4.6(eventemitter3@5.0.1) @@ -14515,6 +15025,13 @@ snapshots: transitivePeerDependencies: - eventemitter3 + '@dynamic-labs/types@3.9.2(eventemitter3@5.0.1)': + dependencies: + '@dynamic-labs/assert-package-version': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/sdk-api-core': 0.0.570 + transitivePeerDependencies: + - eventemitter3 + '@dynamic-labs/utils@3.4.6': dependencies: '@dynamic-labs/assert-package-version': 3.4.6(eventemitter3@5.0.1) @@ -14525,10 +15042,20 @@ snapshots: eventemitter3: 5.0.1 tldts: 6.0.16 - '@dynamic-labs/wagmi-connector@3.4.6(y7yabcwxunvndnqj5goiw6opim)': + '@dynamic-labs/utils@3.9.2': + dependencies: + '@dynamic-labs/assert-package-version': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/logger': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/sdk-api-core': 0.0.570 + '@dynamic-labs/types': 3.9.2(eventemitter3@5.0.1) + buffer: 6.0.3 + eventemitter3: 5.0.1 + tldts: 6.0.16 + + '@dynamic-labs/wagmi-connector@3.4.6(f3so2qmd3s3yrbp7bciqlibck4)': dependencies: '@dynamic-labs/assert-package-version': 3.4.6(eventemitter3@5.0.1) - '@dynamic-labs/ethereum-core': 3.4.6(@dynamic-labs/assert-package-version@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/logger@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/types@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/utils@3.4.6)(@dynamic-labs/wallet-book@3.4.6(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@dynamic-labs/wallet-connector-core@3.4.6(@dynamic-labs/assert-package-version@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/logger@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/types@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/utils@3.4.6)(@dynamic-labs/wallet-book@3.4.6(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eventemitter3@5.0.1))(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) + '@dynamic-labs/ethereum-core': 3.9.2(@dynamic-labs/assert-package-version@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/logger@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/types@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/utils@3.4.6)(@dynamic-labs/wallet-book@3.4.6(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@dynamic-labs/wallet-connector-core@3.4.6(@dynamic-labs/assert-package-version@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/logger@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/types@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/utils@3.4.6)(@dynamic-labs/wallet-book@3.4.6(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eventemitter3@5.0.1))(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) '@dynamic-labs/logger': 3.4.6(eventemitter3@5.0.1) '@dynamic-labs/rpc-providers': 3.4.6(eventemitter3@5.0.1) '@dynamic-labs/sdk-react-core': 3.4.6(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.0(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) @@ -14540,6 +15067,21 @@ snapshots: viem: 2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) wagmi: 2.12.30(@tanstack/query-core@5.44.0)(@tanstack/react-query@5.44.0(react@18.3.1))(@types/node@20.14.2)(@types/react@18.3.3)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-dom@18.3.1(react@18.3.1))(react-native@0.74.0(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(terser@5.31.1)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) + '@dynamic-labs/wagmi-connector@3.9.2(5ui24d4myeik74pck2vvoxfbre)': + dependencies: + '@dynamic-labs/assert-package-version': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/ethereum-core': 3.9.2(@dynamic-labs/assert-package-version@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/types@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/utils@3.9.2)(@dynamic-labs/wallet-book@3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@dynamic-labs/wallet-connector-core@3.9.2(@dynamic-labs/assert-package-version@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/types@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/utils@3.9.2)(@dynamic-labs/wallet-book@3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eventemitter3@5.0.1))(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) + '@dynamic-labs/logger': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/rpc-providers': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/sdk-react-core': 3.9.2(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1) + '@dynamic-labs/types': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/wallet-connector-core': 3.9.2(@dynamic-labs/assert-package-version@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/types@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/utils@3.9.2)(@dynamic-labs/wallet-book@3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eventemitter3@5.0.1) + '@wagmi/core': 2.14.5(@tanstack/query-core@5.44.0)(@types/react@18.3.3)(react@18.3.1)(typescript@5.4.5)(use-sync-external-store@1.2.2(react@18.3.1))(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) + eventemitter3: 5.0.1 + react: 18.3.1 + viem: 2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8) + wagmi: 2.12.30(@tanstack/query-core@5.44.0)(@tanstack/react-query@5.44.0(react@18.3.1))(@types/node@20.14.2)(@types/react@18.3.3)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(terser@5.31.1)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) + '@dynamic-labs/wallet-book@3.4.6(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@dynamic-labs/assert-package-version': 3.4.6(eventemitter3@5.0.1) @@ -14553,6 +15095,19 @@ snapshots: transitivePeerDependencies: - eventemitter3 + '@dynamic-labs/wallet-book@3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@dynamic-labs/assert-package-version': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/iconic': 3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dynamic-labs/logger': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/utils': 3.9.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + util: 0.12.5 + zod: 3.22.4 + transitivePeerDependencies: + - eventemitter3 + '@dynamic-labs/wallet-connector-core@3.4.6(@dynamic-labs/assert-package-version@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/logger@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/types@3.4.6(eventemitter3@5.0.1))(@dynamic-labs/utils@3.4.6)(@dynamic-labs/wallet-book@3.4.6(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eventemitter3@5.0.1)': dependencies: '@dynamic-labs/assert-package-version': 3.4.6(eventemitter3@5.0.1) @@ -14564,6 +15119,17 @@ snapshots: '@dynamic-labs/wallet-book': 3.4.6(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) eventemitter3: 5.0.1 + '@dynamic-labs/wallet-connector-core@3.9.2(@dynamic-labs/assert-package-version@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/logger@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/rpc-providers@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/types@3.9.2(eventemitter3@5.0.1))(@dynamic-labs/utils@3.9.2)(@dynamic-labs/wallet-book@3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(eventemitter3@5.0.1)': + dependencies: + '@dynamic-labs/assert-package-version': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/logger': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/rpc-providers': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/sdk-api-core': 0.0.570 + '@dynamic-labs/types': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/utils': 3.9.2 + '@dynamic-labs/wallet-book': 3.9.2(eventemitter3@5.0.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + eventemitter3: 5.0.1 + '@dynamic-labs/webauthn@3.4.6(eventemitter3@5.0.1)': dependencies: '@dynamic-labs/assert-package-version': 3.4.6(eventemitter3@5.0.1) @@ -14573,6 +15139,15 @@ snapshots: transitivePeerDependencies: - eventemitter3 + '@dynamic-labs/webauthn@3.9.2(eventemitter3@5.0.1)': + dependencies: + '@dynamic-labs/assert-package-version': 3.9.2(eventemitter3@5.0.1) + '@dynamic-labs/logger': 3.9.2(eventemitter3@5.0.1) + '@simplewebauthn/browser': 9.0.1 + '@simplewebauthn/types': 9.0.1 + transitivePeerDependencies: + - eventemitter3 + '@ecies/ciphers@0.2.1(@noble/ciphers@1.0.0)': dependencies: '@noble/ciphers': 1.0.0 @@ -15034,7 +15609,7 @@ snapshots: '@gobob/bob-sdk@3.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@scure/base': 1.1.9 - '@scure/btc-signer': 1.3.2 + '@scure/btc-signer': 1.5.0 bitcoin-address-validation: 2.2.3 bitcoinjs-lib: 6.1.6 ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -15042,29 +15617,6 @@ snapshots: - bufferutil - utf-8-validate - '@gobob/sats-wagmi@0.3.17(@tanstack/react-query@5.44.0(react@18.3.1))(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@5.0.10)': - dependencies: - '@bitcoin-js/tiny-secp256k1-asmjs': 2.2.3 - '@gobob/bob-sdk': 3.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@metamask/providers': 12.0.0 - '@scure/base': 1.1.9 - '@scure/btc-signer': 1.3.2 - '@tanstack/react-query': 5.44.0(react@18.3.1) - async-retry: 1.3.3 - bip32: 4.0.0 - bitcoin-address-validation: 2.2.3 - bitcoinjs-lib: 6.1.6 - bs58check: 2.1.2 - clean-package: 2.2.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - sats-connect: 1.4.1 - usehooks-ts: 3.1.0(react@18.3.1) - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - '@graphql-typed-document-node/core@3.2.0(graphql@16.8.1)': dependencies: graphql: 16.8.1 @@ -15531,12 +16083,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@metamask/object-multiplex@1.3.0': - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - readable-stream: 2.3.8 - '@metamask/object-multiplex@2.0.0': dependencies: once: 1.4.0 @@ -15546,23 +16092,6 @@ snapshots: dependencies: bowser: 2.11.0 - '@metamask/providers@12.0.0': - dependencies: - '@metamask/json-rpc-engine': 7.3.3 - '@metamask/object-multiplex': 1.3.0 - '@metamask/rpc-errors': 6.3.0 - '@metamask/safe-event-emitter': 3.1.1 - '@metamask/utils': 8.5.0 - detect-browser: 5.3.0 - extension-port-stream: 2.1.1 - fast-deep-equal: 3.1.3 - is-stream: 2.0.1 - json-rpc-middleware-stream: 4.2.3 - pump: 3.0.0 - webextension-polyfill: 0.10.0 - transitivePeerDependencies: - - supports-color - '@metamask/providers@16.1.0': dependencies: '@metamask/json-rpc-engine': 8.0.2 @@ -15814,12 +16343,20 @@ snapshots: dependencies: '@noble/hashes': 1.5.0 + '@noble/curves@1.7.0': + dependencies: + '@noble/hashes': 1.6.0 + '@noble/hashes@1.3.2': {} '@noble/hashes@1.4.0': {} '@noble/hashes@1.5.0': {} + '@noble/hashes@1.6.0': {} + + '@noble/hashes@1.6.1': {} + '@noble/secp256k1@1.7.1': {} '@nodelib/fs.scandir@2.1.5': @@ -16174,6 +16711,8 @@ snapshots: dependencies: '@babel/runtime': 7.24.7 + '@radix-ui/primitive@1.1.0': {} + '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 @@ -16204,6 +16743,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + '@radix-ui/react-context@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 @@ -16211,6 +16756,34 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + '@radix-ui/react-context@1.1.1(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + + '@radix-ui/react-dialog@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.3)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.3)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + '@radix-ui/react-direction@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 @@ -16232,6 +16805,19 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 + '@radix-ui/react-dismissable-layer@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + '@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 @@ -16239,6 +16825,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + '@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + '@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 @@ -16251,6 +16843,17 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 + '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + '@radix-ui/react-id@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 @@ -16259,6 +16862,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + '@radix-ui/react-id@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + '@radix-ui/react-popper@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 @@ -16288,6 +16898,26 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 + '@radix-ui/react-portal@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-presence@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 @@ -16298,6 +16928,15 @@ snapshots: '@types/react': 18.3.3 '@types/react-dom': 18.3.0 + '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + '@types/react-dom': 18.3.0 + '@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 @@ -16364,6 +17003,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + '@radix-ui/react-slot@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + '@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 @@ -16415,6 +17061,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 @@ -16423,6 +17075,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 @@ -16431,6 +17090,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 @@ -16438,6 +17104,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.3)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.3 + '@radix-ui/react-use-previous@1.0.1(@types/react@18.3.3)(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 @@ -17888,8 +18560,30 @@ snapshots: '@safe-global/safe-gateway-typescript-sdk@3.21.2': {} + '@sats-connect/core@0.2.2': + dependencies: + axios: 1.7.4 + bitcoin-address-validation: 2.2.3 + buffer: 6.0.3 + jsontokens: 4.0.1 + lodash.omit: 4.5.0 + valibot: 0.33.2 + transitivePeerDependencies: + - debug + + '@sats-connect/make-default-provider-config@0.0.5(@sats-connect/core@0.2.2)(typescript@5.4.5)': + dependencies: + '@sats-connect/core': 0.2.2 + '@sats-connect/ui': 0.0.6 + bowser: 2.11.0 + typescript: 5.4.5 + + '@sats-connect/ui@0.0.6': {} + '@scure/base@1.1.9': {} + '@scure/base@1.2.1': {} + '@scure/bip32@1.3.2': dependencies: '@noble/curves': 1.2.0 @@ -17923,12 +18617,12 @@ snapshots: '@noble/hashes': 1.5.0 '@scure/base': 1.1.9 - '@scure/btc-signer@1.3.2': + '@scure/btc-signer@1.5.0': dependencies: - '@noble/curves': 1.4.0 - '@noble/hashes': 1.4.0 - '@scure/base': 1.1.9 - micro-packed: 0.6.3 + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 + '@scure/base': 1.2.1 + micro-packed: 0.7.0 '@sentry-internal/browser-utils@8.30.0': dependencies: @@ -19873,7 +20567,7 @@ snapshots: - utf-8-validate - zod - '@wagmi/connectors@5.3.8(@types/node@20.14.2)(@types/react@18.3.3)(@vercel/kv@3.0.0)(@wagmi/core@2.14.5(@tanstack/query-core@5.44.0)(@types/react@18.3.3)(react@18.3.1)(typescript@5.4.5)(use-sync-external-store@1.2.2(react@18.3.1))(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(terser@5.31.1)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)': + '@wagmi/connectors@5.3.8(@types/node@20.14.2)(@types/react@18.3.3)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(@wagmi/core@2.14.5(@tanstack/query-core@5.44.0)(@types/react@18.3.3)(react@18.3.1)(typescript@5.4.5)(use-sync-external-store@1.2.2(react@18.3.1))(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(terser@5.31.1)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)': dependencies: '@coinbase/wallet-sdk': 4.2.1(@types/node@20.14.2)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(terser@5.31.1) '@metamask/sdk': 0.30.1(bufferutil@4.0.8)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) @@ -19953,6 +20647,12 @@ snapshots: - react - use-sync-external-store + '@wallet-standard/app@1.0.1': + dependencies: + '@wallet-standard/base': 1.0.1 + + '@wallet-standard/base@1.0.1': {} + '@walletconnect/core@2.11.2(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@walletconnect/heartbeat': 1.2.1 @@ -20037,7 +20737,7 @@ snapshots: '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/modal': 2.6.2(@types/react@18.3.3)(react@18.3.1) + '@walletconnect/modal': 2.7.0(@types/react@18.3.3)(react@18.3.1) '@walletconnect/sign-client': 2.11.2(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@walletconnect/types': 2.11.2(@upstash/redis@1.34.3)(@vercel/kv@3.0.0) '@walletconnect/universal-provider': 2.11.2(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -20186,13 +20886,6 @@ snapshots: '@walletconnect/safe-json': 1.0.2 pino: 7.11.0 - '@walletconnect/modal-core@2.6.2(@types/react@18.3.3)(react@18.3.1)': - dependencies: - valtio: 1.11.2(@types/react@18.3.3)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - react - '@walletconnect/modal-core@2.7.0(@types/react@18.3.3)(react@18.3.1)': dependencies: valtio: 1.11.2(@types/react@18.3.3)(react@18.3.1) @@ -20200,16 +20893,6 @@ snapshots: - '@types/react' - react - '@walletconnect/modal-ui@2.6.2(@types/react@18.3.3)(react@18.3.1)': - dependencies: - '@walletconnect/modal-core': 2.6.2(@types/react@18.3.3)(react@18.3.1) - lit: 2.8.0 - motion: 10.16.2 - qrcode: 1.5.3 - transitivePeerDependencies: - - '@types/react' - - react - '@walletconnect/modal-ui@2.7.0(@types/react@18.3.3)(react@18.3.1)': dependencies: '@walletconnect/modal-core': 2.7.0(@types/react@18.3.3)(react@18.3.1) @@ -20220,14 +20903,6 @@ snapshots: - '@types/react' - react - '@walletconnect/modal@2.6.2(@types/react@18.3.3)(react@18.3.1)': - dependencies: - '@walletconnect/modal-core': 2.6.2(@types/react@18.3.3)(react@18.3.1) - '@walletconnect/modal-ui': 2.6.2(@types/react@18.3.3)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - react - '@walletconnect/modal@2.7.0(@types/react@18.3.3)(react@18.3.1)': dependencies: '@walletconnect/modal-core': 2.7.0(@types/react@18.3.3)(react@18.3.1) @@ -20991,10 +21666,6 @@ snapshots: dependencies: tslib: 2.6.3 - async-retry@1.3.3: - dependencies: - retry: 0.13.1 - async@2.6.4: dependencies: lodash: 4.17.21 @@ -21043,6 +21714,14 @@ snapshots: transitivePeerDependencies: - debug + axios@1.7.4: + dependencies: + follow-redirects: 1.15.6(debug@4.3.5) + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + axobject-query@3.2.1: dependencies: dequal: 2.0.3 @@ -21146,10 +21825,6 @@ snapshots: '@types/dom-webcodecs': 0.1.13 zxing-wasm: 1.2.14 - base-x@3.0.10: - dependencies: - safe-buffer: 5.2.1 - base-x@4.0.0: {} base58-js@1.0.5: {} @@ -21180,19 +21855,21 @@ snapshots: bip174@2.1.1: {} - bip32@4.0.0: - dependencies: - '@noble/hashes': 1.5.0 - '@scure/base': 1.1.9 - typeforce: 1.18.0 - wif: 2.0.6 - bitcoin-address-validation@2.2.3: dependencies: base58-js: 1.0.5 bech32: 2.0.0 sha256-uint8array: 0.10.7 + bitcoinjs-lib@6.1.5: + dependencies: + '@noble/hashes': 1.5.0 + bech32: 2.0.0 + bip174: 2.1.1 + bs58check: 3.0.1 + typeforce: 1.18.0 + varuint-bitcoin: 1.1.2 + bitcoinjs-lib@6.1.6: dependencies: '@noble/hashes': 1.5.0 @@ -21249,6 +21926,8 @@ snapshots: boolbase@1.0.0: {} + boring-avatars@1.11.2: {} + bowser@2.11.0: {} bplist-parser@0.2.0: @@ -21332,20 +22011,10 @@ snapshots: node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.1) - bs58@4.0.1: - dependencies: - base-x: 3.0.10 - bs58@5.0.0: dependencies: base-x: 4.0.0 - bs58check@2.1.2: - dependencies: - bs58: 4.0.1 - create-hash: 1.2.0 - safe-buffer: 5.2.1 - bs58check@3.0.1: dependencies: '@noble/hashes': 1.5.0 @@ -23194,10 +23863,6 @@ snapshots: extend@3.0.2: {} - extension-port-stream@2.1.1: - dependencies: - webextension-polyfill: 0.10.0 - extension-port-stream@3.0.0: dependencies: readable-stream: 4.5.2 @@ -24776,12 +25441,6 @@ snapshots: '@metamask/safe-event-emitter': 2.0.0 eth-rpc-errors: 4.0.3 - json-rpc-middleware-stream@4.2.3: - dependencies: - '@metamask/safe-event-emitter': 3.1.1 - json-rpc-engine: 6.1.0 - readable-stream: 2.3.8 - json-rpc-random-id@1.0.1: {} json-schema-traverse@0.4.1: {} @@ -25051,6 +25710,8 @@ snapshots: lodash.mergewith@4.6.2: {} + lodash.omit@4.5.0: {} + lodash.once@4.1.1: {} lodash.snakecase@4.1.1: {} @@ -25246,8 +25907,6 @@ snapshots: treeify: 1.1.0 web3-utils: 1.10.4 - mersenne-twister@1.1.0: {} - methods@1.1.2: {} metro-babel-transformer@0.80.9: @@ -25419,9 +26078,9 @@ snapshots: micro-ftch@0.3.1: {} - micro-packed@0.6.3: + micro-packed@0.7.0: dependencies: - '@scure/base': 1.1.9 + '@scure/base': 1.2.1 micromatch@4.0.5: dependencies: @@ -26238,8 +26897,6 @@ snapshots: dependencies: xtend: 4.0.2 - preact@10.22.0: {} - preact@10.24.3: {} prelude-ls@1.2.1: {} @@ -26569,6 +27226,16 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-native: 0.74.0(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10) + react-i18next@13.5.0(i18next@23.4.6)(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1): + dependencies: + '@babel/runtime': 7.24.7 + html-parse-stringify: 3.0.1 + i18next: 23.4.6 + react: 18.3.1 + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + react-native: 0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10) + react-international-phone@4.2.5(react@18.3.1): dependencies: react: 18.3.1 @@ -26581,12 +27248,6 @@ snapshots: react-is@18.3.1: {} - react-jazzicon@1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - mersenne-twister: 1.1.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-loading-skeleton@3.5.0(react@18.3.1): dependencies: react: 18.3.1 @@ -26750,6 +27411,17 @@ snapshots: optionalDependencies: '@types/react': 18.3.3 + react-remove-scroll@2.6.0(@types/react@18.3.3)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.3)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.3)(react@18.3.1) + tslib: 2.6.3 + use-callback-ref: 1.3.2(@types/react@18.3.3)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.3)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + react-shallow-renderer@16.15.0(react@18.3.1): dependencies: object-assign: 4.1.1 @@ -27121,11 +27793,14 @@ snapshots: safer-buffer@2.1.2: {} - sats-connect@1.4.1: + sats-connect@2.8.0(typescript@5.4.5): dependencies: - jsontokens: 4.0.1 - process: 0.11.10 - util: 0.12.5 + '@sats-connect/core': 0.2.2 + '@sats-connect/make-default-provider-config': 0.0.5(@sats-connect/core@0.2.2)(typescript@5.4.5) + '@sats-connect/ui': 0.0.6 + transitivePeerDependencies: + - debug + - typescript saxes@6.0.0: dependencies: @@ -28193,8 +28868,6 @@ snapshots: uglify-js@3.18.0: optional: true - uint8array-tools@0.0.7: {} - uint8arrays@3.1.0: dependencies: multiformats: 9.9.0 @@ -28421,6 +29094,8 @@ snapshots: v8-compile-cache-lib@3.0.1: {} + valibot@0.33.2: {} + valid-url@1.0.9: {} validate-npm-package-license@3.0.4: @@ -28442,6 +29117,15 @@ snapshots: vary@1.1.2: {} + vaul@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@radix-ui/react-dialog': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + verror@1.10.0: dependencies: assert-plus: 1.0.0 @@ -28697,10 +29381,10 @@ snapshots: - utf-8-validate - zod - wagmi@2.12.30(@tanstack/query-core@5.44.0)(@tanstack/react-query@5.44.0(react@18.3.1))(@types/node@20.14.2)(@types/react@18.3.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(terser@5.31.1)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8): + wagmi@2.12.30(@tanstack/query-core@5.44.0)(@tanstack/react-query@5.44.0(react@18.3.1))(@types/node@20.14.2)(@types/react@18.3.3)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(bufferutil@4.0.8)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(terser@5.31.1)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8): dependencies: '@tanstack/react-query': 5.44.0(react@18.3.1) - '@wagmi/connectors': 5.3.8(@types/node@20.14.2)(@types/react@18.3.3)(@vercel/kv@3.0.0)(@wagmi/core@2.14.5(@tanstack/query-core@5.44.0)(@types/react@18.3.3)(react@18.3.1)(typescript@5.4.5)(use-sync-external-store@1.2.2(react@18.3.1))(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(terser@5.31.1)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) + '@wagmi/connectors': 5.3.8(@types/node@20.14.2)(@types/react@18.3.3)(@upstash/redis@1.34.3)(@vercel/kv@3.0.0)(@wagmi/core@2.14.5(@tanstack/query-core@5.44.0)(@types/react@18.3.3)(react@18.3.1)(typescript@5.4.5)(use-sync-external-store@1.2.2(react@18.3.1))(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(jsdom@25.0.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(react-dom@18.3.1(react@18.3.1))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.3.3)(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(terser@5.31.1)(typescript@5.4.5)(utf-8-validate@5.0.10)(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) '@wagmi/core': 2.14.5(@tanstack/query-core@5.44.0)(@types/react@18.3.3)(react@18.3.1)(typescript@5.4.5)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.40(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)) react: 18.3.1 use-sync-external-store: 1.2.0(react@18.3.1) @@ -28979,10 +29663,6 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - wif@2.0.6: - dependencies: - bs58check: 2.1.2 - wildcard@2.0.1: {} word-wrap@1.2.5: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index aec8c3fd9..6ece54806 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -43,6 +43,8 @@ catalog: viem: ^2.21.35 '@wagmi/core': ^2.11.0 + bitcoin-address-validation: ^2.2.3 + '@tanstack/react-store': ^0.5.6 '@tanstack/react-query': ^5.35.1