From 5b68ec62e225a83b2792482072ce3ebab2059e8f Mon Sep 17 00:00:00 2001 From: Alex Connolly Date: Sun, 26 Jul 2026 04:53:53 +1000 Subject: [PATCH] refactor(checkout-widgets): remove Segment react-analytics Drop product analytics from checkout widgets: remove @imtbl/react-analytics, Segment, analytics-provider, and all track/page/identify call sites. Host widget events are unchanged. Co-authored-by: Cursor --- packages/checkout/widgets-lib/package.json | 2 - .../ConnectLoader/ConnectLoader.tsx | 16 - .../FormComponents/SelectForm/SelectForm.tsx | 20 +- .../SelectInput/SelectInput.tsx | 13 +- .../RouteOptionsDrawer/RouteOptionsDrawer.tsx | 28 +- .../components/Transactions/ChangeWallet.tsx | 13 +- .../ClaimWithdrawalInProgress.tsx | 11 - .../Transactions/NoTransactions.tsx | 10 - .../TransactionItemWithdrawPending.tsx | 14 +- .../components/Transactions/Transactions.tsx | 30 +- .../src/components/Transak/TransakIframe.tsx | 6 - .../components/Transak/useTransakEvents.ts | 71 +- .../WalletDrawer/ConnectWalletDrawer.tsx | 37 +- .../WalletDrawer/PayWithWalletDrawer.tsx | 1 - .../CustomAnalyticsProvider.tsx | 22 - .../SegmentAnalyticsProvider.ts | 41 - .../analytics-provider/SetupAnalytics.tsx | 35 - .../ViewContextTestComponent.tsx | 29 +- .../src/lib/analytics/identifyUser.test.ts | 44 - .../src/lib/analytics/identifyUser.ts | 26 - .../src/lib/squid/hooks/useExecute.ts | 23 +- .../src/views/top-up/TopUpView.tsx | 61 +- .../src/widgets/add-tokens/AddTokensRoot.tsx | 57 +- .../widgets/add-tokens/AddTokensWidget.tsx | 19 +- .../add-tokens/components/TokenDrawerMenu.tsx | 20 +- .../src/widgets/add-tokens/hooks/useError.tsx | 19 +- .../add-tokens/hooks/useErrorHandler.ts | 14 +- .../widgets/add-tokens/views/AddTokens.tsx | 162 +-- .../src/widgets/add-tokens/views/Review.tsx | 100 +- .../src/widgets/bridge/BridgeWidget.tsx | 35 - .../src/widgets/bridge/BridgeWidgetRoot.tsx | 35 +- .../widgets/bridge/components/BridgeForm.tsx | 20 - .../bridge/components/BridgeReviewSummary.tsx | 50 +- .../components/WalletAndNetworkSelector.tsx | 125 +- .../bridge/views/ApproveTransaction.tsx | 16 +- .../src/widgets/bridge/views/Bridge.tsx | 17 +- .../src/widgets/bridge/views/BridgeReview.tsx | 13 +- .../widgets/bridge/views/ClaimWithdrawal.tsx | 11 - .../widgets/bridge/views/MoveInProgress.tsx | 24 - .../views/WalletNetworkSelectionView.tsx | 13 +- .../src/widgets/connect/ConnectWidget.tsx | 20 +- .../src/widgets/connect/ConnectWidgetRoot.tsx | 31 +- .../widgets/connect/components/WalletList.tsx | 63 +- .../widgets/connect/views/ConnectWallet.tsx | 13 +- .../widgets/connect/views/ReadyToConnect.tsx | 31 +- .../connect/views/SwitchNetworkEth.tsx | 25 +- .../connect/views/SwitchNetworkZkEVM.tsx | 18 - .../immutable-commerce/CommerceWidgetRoot.tsx | 36 +- .../src/widgets/on-ramp/OnRampWidget.tsx | 2 - .../src/widgets/on-ramp/OnRampWidgetRoot.tsx | 47 +- .../src/widgets/on-ramp/views/OnRampMain.tsx | 92 +- .../widgets/purchase/PurchaseWidgetRoot.tsx | 45 +- .../PurchaseConnectWalletDrawer.tsx | 36 +- .../PurchaseDeliverToWalletDrawer.tsx | 1 - .../PurchasePayWithWalletDrawer.tsx | 2 - .../RouteOptionsDrawer.tsx | 31 +- .../widgets/purchase/components/WithCard.tsx | 4 - .../src/widgets/purchase/views/Purchase.tsx | 3 +- .../src/widgets/sale/SaleWidget.tsx | 2 - .../src/widgets/sale/SaleWidgetRoot.tsx | 65 +- .../widgets/sale/components/OrderReview.tsx | 31 +- .../src/widgets/sale/components/WithCard.tsx | 2 - .../src/widgets/sale/hooks/useSaleEvents.ts | 188 +-- .../src/widgets/sale/views/OrderSummary.tsx | 17 +- .../src/widgets/sale/views/PayWithCard.tsx | 50 +- .../src/widgets/sale/views/PayWithCoins.tsx | 13 +- .../src/widgets/sale/views/PaymentMethods.tsx | 9 +- .../src/widgets/sale/views/SaleErrorView.tsx | 2 +- .../src/widgets/swap/SwapWidget.tsx | 24 - .../src/widgets/swap/SwapWidgetRoot.tsx | 59 +- .../src/widgets/swap/components/Fees.tsx | 2 +- .../src/widgets/swap/components/SwapForm.tsx | 142 +- .../swap/views/ApproveERC20Onboarding.tsx | 37 +- .../src/widgets/swap/views/SwapCoins.tsx | 17 - .../src/widgets/swap/views/SwapInProgress.tsx | 14 - .../src/widgets/transfer/TransferForm.tsx | 28 +- .../src/widgets/transfer/TransferWidget.tsx | 24 +- .../src/widgets/wallet/WalletWidgetRoot.tsx | 49 +- .../components/BalanceItem/BalanceItem.tsx | 51 +- .../components/NetworkMenu/NetworkMenu.tsx | 13 - .../WalletAddress/WalletAddress.tsx | 13 - .../src/widgets/wallet/views/CoinInfo.tsx | 13 +- .../src/widgets/wallet/views/Settings.tsx | 16 +- .../widgets/wallet/views/WalletBalances.tsx | 24 - packages/checkout/widgets-lib/tsconfig.json | 1 - pnpm-lock.yaml | 1269 ----------------- 86 files changed, 322 insertions(+), 3656 deletions(-) delete mode 100644 packages/checkout/widgets-lib/src/context/analytics-provider/CustomAnalyticsProvider.tsx delete mode 100644 packages/checkout/widgets-lib/src/context/analytics-provider/SegmentAnalyticsProvider.ts delete mode 100644 packages/checkout/widgets-lib/src/context/analytics-provider/SetupAnalytics.tsx delete mode 100644 packages/checkout/widgets-lib/src/lib/analytics/identifyUser.test.ts delete mode 100644 packages/checkout/widgets-lib/src/lib/analytics/identifyUser.ts diff --git a/packages/checkout/widgets-lib/package.json b/packages/checkout/widgets-lib/package.json index 2515c19db2..a8670b9be4 100644 --- a/packages/checkout/widgets-lib/package.json +++ b/packages/checkout/widgets-lib/package.json @@ -24,7 +24,6 @@ "@imtbl/cryptofiat": "workspace:*", "@imtbl/dex-sdk": "workspace:*", "@imtbl/passport": "workspace:*", - "@imtbl/react-analytics": "0.3.4-alpha", "@rive-app/react-canvas-lite": "^4.9.0", "@walletconnect/ethereum-provider": "^2.11.1", "@walletconnect/modal": "^2.6.2", @@ -51,7 +50,6 @@ "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-replace": "catalog:toolchain", "@rollup/plugin-typescript": "^11.1.6", - "@segment/analytics-next": "^1.53.2", "@swc/core": "catalog:toolchain", "@swc/jest": "catalog:toolchain", "@testing-library/jest-dom": "catalog:testing", diff --git a/packages/checkout/widgets-lib/src/components/ConnectLoader/ConnectLoader.tsx b/packages/checkout/widgets-lib/src/components/ConnectLoader/ConnectLoader.tsx index 64d366701c..6b620e4ce7 100644 --- a/packages/checkout/widgets-lib/src/components/ConnectLoader/ConnectLoader.tsx +++ b/packages/checkout/widgets-lib/src/components/ConnectLoader/ConnectLoader.tsx @@ -22,8 +22,6 @@ import { LoadingView } from '../../views/loading/LoadingView'; import ConnectWidget from '../../widgets/connect/ConnectWidget'; import { ConnectWidgetViews } from '../../context/view-context/ConnectViewContextTypes'; import { StrongCheckoutWidgetsConfig } from '../../lib/withDefaultWidgetConfig'; -import { useAnalytics } from '../../context/analytics-provider/SegmentAnalyticsProvider'; -import { identifyUser } from '../../lib/analytics/identifyUser'; export interface ConnectLoaderProps { children?: React.ReactNode; @@ -77,9 +75,6 @@ export function ConnectLoader({ const { connectionStatus, deepLink, provider, } = connectLoaderState; - - const { identify, user } = useAnalytics(); - const hasNoWalletProviderNameAndNoBrowserProvider = (localProvider?: WrappedBrowserProvider): boolean => { if (!walletProviderName && !localProvider) { connectLoaderDispatch({ @@ -211,17 +206,6 @@ export function ConnectLoader({ } catch (err) { return; } - - try { - // WT-1698 Analytics - Identify user here then progress to widget - // TODO: Identify user should be separated out into a use Effect with only the provider (from connect loader state) as dependency - const userData = user ? await user() : undefined; - const anonymousId = userData?.anonymousId(); - await identifyUser(identify, browserProvider!, { anonymousId }); - } catch (err) { - return; - } - // The user is connected and the widget will be shown connectLoaderDispatch({ payload: { diff --git a/packages/checkout/widgets-lib/src/components/FormComponents/SelectForm/SelectForm.tsx b/packages/checkout/widgets-lib/src/components/FormComponents/SelectForm/SelectForm.tsx index 2e779499ba..52948db007 100644 --- a/packages/checkout/widgets-lib/src/components/FormComponents/SelectForm/SelectForm.tsx +++ b/packages/checkout/widgets-lib/src/components/FormComponents/SelectForm/SelectForm.tsx @@ -8,7 +8,6 @@ import { TokenImage } from '../../TokenImage/TokenImage'; import { FormControlWrapper } from '../FormControlWrapper/FormControlWrapper'; import { CoinSelector } from '../../CoinSelector/CoinSelector'; import { CoinSelectorOptionProps } from '../../CoinSelector/CoinSelectorOption'; -import { useAnalytics, UserJourney } from '../../../context/analytics-provider/SegmentAnalyticsProvider'; interface SelectFormProps { testId: string; @@ -21,11 +20,7 @@ interface SelectFormProps { disabled?: boolean; onSelectChange: (value: string) => void; coinSelectorHeading: string; - defaultTokenImage: string; - userJourney: UserJourney; - screen: string; - control: string; - environment?: Environment; + defaultTokenImage: string;environment?: Environment; theme: WidgetTheme, themeOverrides: ThemeOverrides, } @@ -42,14 +37,10 @@ export function SelectForm({ selectedOption, coinSelectorHeading, defaultTokenImage, - userJourney, - screen, - control, environment = Environment.PRODUCTION, theme, themeOverrides, }: SelectFormProps) { - const { track } = useAnalytics(); const [coinSelectorOpen, setCoinSelectorOpen] = useState(false); const coinSelectorOptions = useMemo(() => options.map((option) => ({ ...option, @@ -71,14 +62,7 @@ export function SelectForm({ const openCoinSelector = useCallback(() => { setCoinSelectorOpen(true); - track({ - userJourney, - screen, - control, - controlType: 'Select', - action: 'Opened', - }); - }, [setCoinSelectorOpen, track]); + }, [setCoinSelectorOpen]); return ( diff --git a/packages/checkout/widgets-lib/src/components/FormComponents/SelectInput/SelectInput.tsx b/packages/checkout/widgets-lib/src/components/FormComponents/SelectInput/SelectInput.tsx index 66a59f4dad..ee8147a0d4 100644 --- a/packages/checkout/widgets-lib/src/components/FormComponents/SelectInput/SelectInput.tsx +++ b/packages/checkout/widgets-lib/src/components/FormComponents/SelectInput/SelectInput.tsx @@ -9,7 +9,6 @@ import { import { SelectForm } from '../SelectForm/SelectForm'; import { InputMode, TextInputForm, TextInputType } from '../TextInputForm/TextInputForm'; import { CoinSelectorOptionProps } from '../../CoinSelector/CoinSelectorOption'; -import { UserJourney } from '../../../context/analytics-provider/SegmentAnalyticsProvider'; interface SelectInputProps { testId: string; @@ -34,11 +33,7 @@ interface SelectInputProps { textInputMaxButtonClick?: () => void; onSelectChange: (value: OptionKey) => void; selectedOption?: OptionKey; - defaultTokenImage: string; - userJourney: UserJourney; - screen: string; - control: string; - environment?: Environment; + defaultTokenImage: string;environment?: Environment; theme: WidgetTheme; themeOverrides: ThemeOverrides; } @@ -67,9 +62,6 @@ export function SelectInput({ selectedOption, coinSelectorHeading, defaultTokenImage, - userJourney, - screen, - control, environment, theme, themeOverrides, @@ -88,9 +80,6 @@ export function SelectInput({ selectedOption={selectedOption} coinSelectorHeading={coinSelectorHeading} defaultTokenImage={defaultTokenImage} - control={control} - userJourney={userJourney} - screen={screen} environment={environment} theme={theme} themeOverrides={themeOverrides} diff --git a/packages/checkout/widgets-lib/src/components/RouteOptionsDrawer/RouteOptionsDrawer.tsx b/packages/checkout/widgets-lib/src/components/RouteOptionsDrawer/RouteOptionsDrawer.tsx index 9dca7db538..416d8616e0 100644 --- a/packages/checkout/widgets-lib/src/components/RouteOptionsDrawer/RouteOptionsDrawer.tsx +++ b/packages/checkout/widgets-lib/src/components/RouteOptionsDrawer/RouteOptionsDrawer.tsx @@ -2,11 +2,10 @@ import { Drawer, EllipsizedText, MenuItem, } from '@biom3/react'; import { motion } from 'framer-motion'; -import { useContext, useEffect, useRef } from 'react'; +import { useContext, useRef } from 'react'; import { Checkout } from '@imtbl/checkout-sdk'; import { useTranslation } from 'react-i18next'; -import { useAnalytics, UserJourney } from '../../context/analytics-provider/SegmentAnalyticsProvider'; import { useProvidersContext } from '../../context/providers-context/ProvidersContext'; import { listVariants } from '../../lib/animation/listAnimation'; import { RouteData } from '../../lib/squid/types'; @@ -42,10 +41,8 @@ export function RouteOptionsDrawer({ insufficientBalance, }: OptionsDrawerProps) { const { t } = useTranslation(); - const { track } = useAnalytics(); - const { - addTokensState: { id, chains }, + addTokensState: { chains }, } = useContext(AddTokensContext); const { @@ -59,27 +56,6 @@ export function RouteOptionsDrawer({ onRouteClick(route); }; - useEffect(() => { - if (!visible) { - return; - } - - track({ - userJourney: UserJourney.ADD_TOKENS, - screen: 'InputScreen', - control: 'RoutesMenu', - controlType: 'MenuItem', - action: 'Opened', - extras: { - contextId: id, - showOnrampOption: Boolean(showOnrampOption), - showSwapOption: Boolean(showSwapOption), - insufficientBalance: Boolean(insufficientBalance), - routesAvailable: routes?.length ?? 0, - }, - }); - }, [visible]); - return ( (false); const { isWalletConnectEnabled, getWalletLogoUrl } = useWalletConnect(); - const { track } = useAnalytics(); const walletAddress = from?.walletAddress || ''; const walletProviderInfo = from?.walletProviderInfo; const handleChangeWalletClick = () => { - track({ - userJourney: UserJourney.BRIDGE, - screen: BridgeWidgetViews.TRANSACTIONS, - controlType: 'Button', - control: 'Pressed', - }); onChangeWalletClick(); }; diff --git a/packages/checkout/widgets-lib/src/components/Transactions/ClaimWithdrawalInProgress.tsx b/packages/checkout/widgets-lib/src/components/Transactions/ClaimWithdrawalInProgress.tsx index d7ac21e3df..b7506d2862 100644 --- a/packages/checkout/widgets-lib/src/components/Transactions/ClaimWithdrawalInProgress.tsx +++ b/packages/checkout/widgets-lib/src/components/Transactions/ClaimWithdrawalInProgress.tsx @@ -1,7 +1,6 @@ import { useContext, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { TransactionResponse } from 'ethers'; -import { UserJourney, useAnalytics } from '../../context/analytics-provider/SegmentAnalyticsProvider'; import { ViewActions, ViewContext } from '../../context/view-context/ViewContext'; import { BridgeWidgetViews } from '../../context/view-context/BridgeViewContextTypes'; import { LoadingView } from '../../views/loading/LoadingView'; @@ -13,16 +12,6 @@ interface ClaimWithdrawalInProgressProps { export function ClaimWithdrawalInProgress({ transactionResponse }: ClaimWithdrawalInProgressProps) { const { t } = useTranslation(); const { viewDispatch } = useContext(ViewContext); - - const { page } = useAnalytics(); - - useEffect(() => { - page({ - userJourney: UserJourney.BRIDGE, - screen: 'ClaimWithdrawalInProgress', - }); - }, []); - useEffect(() => { if (!transactionResponse) return; diff --git a/packages/checkout/widgets-lib/src/components/Transactions/NoTransactions.tsx b/packages/checkout/widgets-lib/src/components/Transactions/NoTransactions.tsx index 828b8b1b9b..150d88b386 100644 --- a/packages/checkout/widgets-lib/src/components/Transactions/NoTransactions.tsx +++ b/packages/checkout/widgets-lib/src/components/Transactions/NoTransactions.tsx @@ -4,7 +4,6 @@ import { import { Checkout } from '@imtbl/checkout-sdk'; import { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; -import { UserJourney, useAnalytics } from '../../context/analytics-provider/SegmentAnalyticsProvider'; import { PASSPORT_URL } from '../../lib'; import { noTransactionsBodyStyle, noTransactionsContainerStyle, passportBodyStyle, containerStyles, @@ -24,7 +23,6 @@ export function NoTransactions( changeWallet, }: NoTransactionsProps, ) { - const { page } = useAnalytics(); const { t } = useTranslation(); const [passportLink, setPassportLink] = useState(''); @@ -32,14 +30,6 @@ export function NoTransactions( if (!checkout) return; setPassportLink(PASSPORT_URL[checkout.config.environment]); }, [checkout]); - - useEffect(() => { - page({ - userJourney: UserJourney.BRIDGE, - screen: 'NoTransactions', - }); - }, []); - return ( diff --git a/packages/checkout/widgets-lib/src/components/Transactions/TransactionItemWithdrawPending.tsx b/packages/checkout/widgets-lib/src/components/Transactions/TransactionItemWithdrawPending.tsx index 005a8787e4..54f86c7da4 100644 --- a/packages/checkout/widgets-lib/src/components/Transactions/TransactionItemWithdrawPending.tsx +++ b/packages/checkout/widgets-lib/src/components/Transactions/TransactionItemWithdrawPending.tsx @@ -10,7 +10,6 @@ import { import { useContext, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { Environment } from '@imtbl/config'; -import { UserJourney, useAnalytics } from '../../context/analytics-provider/SegmentAnalyticsProvider'; import { Transaction, TransactionStatus } from '../../lib/clients/checkoutApiType'; import { BridgeWidgetViews } from '../../context/view-context/BridgeViewContextTypes'; import { ViewActions, ViewContext } from '../../context/view-context/ViewContext'; @@ -37,9 +36,7 @@ export function TransactionItemWithdrawPending({ defaultTokenImage, environment, }: TransactionItemWithdrawPendingProps) { - const { viewDispatch } = useContext(ViewContext); - const { track } = useAnalytics(); - const translation = useTranslation(); + const { viewDispatch } = useContext(ViewContext); const translation = useTranslation(); const dateNowUnixMs = useMemo(() => new Date().getTime(), []); const withdrawalReadyDate = useMemo( () => (transaction.details.current_status.withdrawal_ready_at @@ -141,15 +138,6 @@ export function TransactionItemWithdrawPending({ borderTopRightRadius: '0', borderTopLeftRadius: '0', }} - onExpandChange={ - (expanded) => expanded - && track({ - userJourney: UserJourney.BRIDGE, - screen: 'TransactionItem', - control: 'Accordion', - controlType: 'Button', - }) - } > diff --git a/packages/checkout/widgets-lib/src/components/Transactions/Transactions.tsx b/packages/checkout/widgets-lib/src/components/Transactions/Transactions.tsx index e7cdab58d1..088974f73d 100644 --- a/packages/checkout/widgets-lib/src/components/Transactions/Transactions.tsx +++ b/packages/checkout/widgets-lib/src/components/Transactions/Transactions.tsx @@ -34,10 +34,6 @@ import { CryptoFiatActions, CryptoFiatContext, } from '../../context/crypto-fiat-context/CryptoFiatContext'; -import { - UserJourney, - useAnalytics, -} from '../../context/analytics-provider/SegmentAnalyticsProvider'; import { BridgeActions, BridgeContext, @@ -111,11 +107,7 @@ export function Transactions({ const { bridgeDispatch, bridgeState: { checkout, from, tokenBridge }, - } = useContext(BridgeContext); - const { page } = useAnalytics(); - const { t } = useTranslation(); - const { track } = useAnalytics(); - + } = useContext(BridgeContext); const { t } = useTranslation(); const [loading, setLoading] = useState(true); const [knownTokenMap, setKnownTokenMap] = useState< KnownNetworkMap | undefined @@ -269,16 +261,6 @@ export function Transactions({ const handleWalletChange = useCallback( async (event: WalletChangeEvent) => { - track({ - userJourney: UserJourney.BRIDGE, - screen: 'EmptyStateNotConnected', - control: 'WalletProvider', - controlType: 'Select', - extras: { - walletProviderName: event.providerDetail.info.name, - }, - }); - try { let changeAccount = false; if (event.providerDetail.info.rdns === WalletProviderRdns.METAMASK) { @@ -311,7 +293,7 @@ export function Transactions({ setShowWalletDrawer(false); } }, - [checkout, bridgeDispatch, track], + [checkout, bridgeDispatch], ); const handleBackButtonClick = () => { @@ -384,14 +366,6 @@ export function Transactions({ setLoading(false); })(); }, [from, checkout, fetchData]); - - useEffect(() => { - page({ - userJourney: UserJourney.BRIDGE, - screen: 'Transactions', - }); - }, [page]); - return ( (null); const { onLoad, initialised } = useTransakEvents({ - userJourney: UserJourney.SALE, ref: iframeRef, - walletAddress, - isPassportWallet, onOpen, onOrderCreated, onOrderProcessing, diff --git a/packages/checkout/widgets-lib/src/components/Transak/useTransakEvents.ts b/packages/checkout/widgets-lib/src/components/Transak/useTransakEvents.ts index c97044dc52..b28e53a4b8 100644 --- a/packages/checkout/widgets-lib/src/components/Transak/useTransakEvents.ts +++ b/packages/checkout/widgets-lib/src/components/Transak/useTransakEvents.ts @@ -1,15 +1,8 @@ import { RefObject, useCallback, useEffect, useRef, useState, } from 'react'; -import { StandardAnalyticsActions } from '@imtbl/react-analytics'; - import * as url from 'url'; import { TransakEvent, TransakEvents, TransakStatuses } from './TransakEvents'; -import { - AnalyticsControlTypes, - UserJourney, - useAnalytics, -} from '../../context/analytics-provider/SegmentAnalyticsProvider'; export const TRANSAK_ORIGIN = ['global.transak.com', 'global-stg.transak.com']; const FAILED_TO_LOAD_TIMEOUT_IN_MS = 10000; @@ -25,54 +18,13 @@ export type TransakEventHandlers = { failedToLoadTimeoutInMs?: number; }; -type AnalyticEvent = { - screen: string; - userJourney?: UserJourney; - control: string; - controlType: AnalyticsControlTypes; - action?: StandardAnalyticsActions; - [key: string]: unknown; -}; - -const ANALYTICS_EVENTS: Record = { - [TransakEvents.TRANSAK_WIDGET_OPEN]: { - screen: 'InputScreen', - control: 'TransakWidgetOpen', - controlType: 'IframeEvent', - }, - [TransakEvents.TRANSAK_ORDER_CREATED]: { - screen: 'InputScreen', - control: 'OrderCreated', - controlType: 'IframeEvent', - }, - [`${TransakEvents.TRANSAK_ORDER_SUCCESSFUL}${TransakStatuses.PROCESSING}`]: { - screen: 'OrderInProgress', - control: 'PaymentProcessing', - controlType: 'IframeEvent', - }, - [`${TransakEvents.TRANSAK_ORDER_SUCCESSFUL}${TransakStatuses.COMPLETED}`]: { - screen: 'Success', - control: 'PaymentCompleted', - controlType: 'IframeEvent', - }, - [TransakEvents.TRANSAK_ORDER_FAILED]: { - screen: 'Failure', - control: 'PaymentFailed', - controlType: 'IframeEvent', - }, -}; - type UseTransakEventsProps = { - userJourney: UserJourney; ref: RefObject | undefined; - walletAddress: string; - isPassportWallet: boolean; } & TransakEventHandlers; export const useTransakEvents = (props: UseTransakEventsProps) => { - const { track } = useAnalytics(); const { - userJourney, ref, walletAddress, isPassportWallet, failedToLoadTimeoutInMs, onFailedToLoad, + ref, failedToLoadTimeoutInMs, onFailedToLoad, } = props; const [initialised, setInitialsed] = useState(false); const failedToLoadTimeout = failedToLoadTimeoutInMs || FAILED_TO_LOAD_TIMEOUT_IN_MS; @@ -96,26 +48,6 @@ export const useTransakEvents = (props: UseTransakEventsProps) => { } }; - const handleAnalyticsEvent = useCallback((event: TransakEvent) => { - const type = event.event_id as TransakEvents; - const key = [TransakEvents.TRANSAK_ORDER_SUCCESSFUL].includes(type) - ? `${type}${event.data.status}` - : type; - - const eventData = ANALYTICS_EVENTS?.[key] || {}; - - if (Object.keys(eventData).length >= 0) { - track({ - ...eventData, - userJourney, - extras: { - walletAddress, - isPassportWallet, - }, - }); - } - }, []); - const handleEvents = useCallback((event: TransakEvent) => { switch (event.event_id) { case TransakEvents.TRANSAK_WIDGET_INITIALISED: @@ -151,7 +83,6 @@ export const useTransakEvents = (props: UseTransakEventsProps) => { if (!isTransakEvent) return; - handleAnalyticsEvent(event.data); handleEvents(event.data); console.log('@@@ Transak event', event); // eslint-disable-line no-console diff --git a/packages/checkout/widgets-lib/src/components/WalletDrawer/ConnectWalletDrawer.tsx b/packages/checkout/widgets-lib/src/components/WalletDrawer/ConnectWalletDrawer.tsx index 540c43f2b3..b4c38c8afc 100644 --- a/packages/checkout/widgets-lib/src/components/WalletDrawer/ConnectWalletDrawer.tsx +++ b/packages/checkout/widgets-lib/src/components/WalletDrawer/ConnectWalletDrawer.tsx @@ -9,12 +9,7 @@ import { import { MenuItemProps } from '@biom3/react'; import { WalletDrawer } from './WalletDrawer'; import { WalletChangeEvent } from './WalletDrawerEvents'; -import { identifyUser } from '../../lib/analytics/identifyUser'; -import { getProviderSlugFromRdns, isPassportProvider } from '../../lib/provider'; -import { - useAnalytics, - UserJourney, -} from '../../context/analytics-provider/SegmentAnalyticsProvider'; +import { isPassportProvider } from '../../lib/provider'; import { ProvidersContextActions, useProvidersContext, @@ -25,7 +20,7 @@ import { ConnectEIP6963ProviderError, } from '../../lib/connectEIP6963Provider'; import { EOAWarningDrawer } from '../EOAWarningDrawer/EOAWarningDrawer'; -import { removeSpace } from '../../lib/utils'; +import { } from '../../lib/utils'; type ConnectWalletDrawerProps = { heading: string; @@ -45,7 +40,6 @@ type ConnectWalletDrawerProps = { rdns: string; }[]; getShouldRequestWalletPermissions?: (providerInfo: EIP6963ProviderInfo) => boolean | undefined; - shouldIdentifyUser?: boolean; drawerBackground: string | undefined; }; @@ -61,16 +55,12 @@ export function ConnectWalletDrawer({ menuItemSize = 'small', disabledOptions = [], getShouldRequestWalletPermissions, - shouldIdentifyUser = true, drawerBackground, }: ConnectWalletDrawerProps) { const { providersState: { checkout, fromProvider, lockedToProvider }, providersDispatch, } = useProvidersContext(); - - const { identify, track, user } = useAnalytics(); - const prevWalletChangeEvent = useRef(); const [showUnableToConnectDrawer, setShowUnableToConnectDrawer] = useState(false); @@ -110,20 +100,6 @@ export function ConnectWalletDrawer({ const handleWalletConnection = async (event: WalletChangeEvent) => { const { providerDetail } = event; const { info } = providerDetail; - - // Trigger analytics connect wallet, menu item, with wallet details - track({ - userJourney: UserJourney.CONNECT, - screen: 'ConnectWallet', - control: removeSpace(info.name), - controlType: 'MenuItem', - extras: { - providerType, - wallet: getProviderSlugFromRdns(info.rdns), - walletRdns: info.rdns, - }, - }); - if (info.rdns === WalletProviderRdns.PASSPORT) { const { isConnected } = await checkout.checkIsWalletConnected({ provider: new WrappedBrowserProvider(providerDetail.provider!), @@ -148,15 +124,6 @@ export function ConnectWalletDrawer({ checkout, shouldRequestWalletPermissions, ); - - // Identify connected wallet, retaining current anonymousId - if (shouldIdentifyUser) { - const userData = user ? await user() : undefined; - const anonymousId = userData?.anonymousId(); - - await identifyUser(identify, provider, { anonymousId }); - } - // Store selected provider as fromProvider in context address = await setProviderInContext(provider, providerDetail.info); diff --git a/packages/checkout/widgets-lib/src/components/WalletDrawer/PayWithWalletDrawer.tsx b/packages/checkout/widgets-lib/src/components/WalletDrawer/PayWithWalletDrawer.tsx index 2bb3dbfd5b..f4e73ed9a6 100644 --- a/packages/checkout/widgets-lib/src/components/WalletDrawer/PayWithWalletDrawer.tsx +++ b/packages/checkout/widgets-lib/src/components/WalletDrawer/PayWithWalletDrawer.tsx @@ -80,7 +80,6 @@ export function PayWithWalletDrawer({ disabledOptions={disabledOptions} bottomSlot={payWithCardItem} onConnect={handleOnConnect} - shouldIdentifyUser={false} drawerBackground={drawerBackground} /> ); diff --git a/packages/checkout/widgets-lib/src/context/analytics-provider/CustomAnalyticsProvider.tsx b/packages/checkout/widgets-lib/src/context/analytics-provider/CustomAnalyticsProvider.tsx deleted file mode 100644 index af5ae633bc..0000000000 --- a/packages/checkout/widgets-lib/src/context/analytics-provider/CustomAnalyticsProvider.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { Checkout } from '@imtbl/checkout-sdk'; -import { - AnalyticsProvider, -} from './SegmentAnalyticsProvider'; -import { SetupAnalytics } from './SetupAnalytics'; - -type CustomAnalyticsProps = { - children: React.ReactNode; - checkout: Checkout; -}; - -export function CustomAnalyticsProvider( - { children, checkout }: CustomAnalyticsProps, -) { - return ( - - - {children} - - - ); -} diff --git a/packages/checkout/widgets-lib/src/context/analytics-provider/SegmentAnalyticsProvider.ts b/packages/checkout/widgets-lib/src/context/analytics-provider/SegmentAnalyticsProvider.ts deleted file mode 100644 index a04f70f198..0000000000 --- a/packages/checkout/widgets-lib/src/context/analytics-provider/SegmentAnalyticsProvider.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { - createAnalytics, - StandardAnalyticsControlTypes, -} from '@imtbl/react-analytics'; -import type { PropsWithChildren, ReactElement } from 'react'; - -export enum UserJourney { - CONNECT = 'Connect', - WALLET = 'Wallet', - ON_RAMP = 'OnRamp', - SWAP = 'Swap', - BRIDGE = 'Bridge', - SALE = 'PrimarySale', - ADD_TOKENS = 'AddTokens', - PURCHASE = 'Purchase', - TRANSFER = 'Transfer', -} - -export type AnalyticsControlTypes = - | StandardAnalyticsControlTypes - | 'IframeEvent' - | 'Event'; - -const productName = 'checkout'; - -const analytics = createAnalytics< - UserJourney, - string, - string, - AnalyticsControlTypes ->({ - writeKey: '', - appName: productName, - storageKeyPrefix: 'checkoutWidgets', -}); - -// Explicit annotation: createAnalytics returns emotion JSX.Element, which is not portable -export const AnalyticsProvider = analytics.AnalyticsProvider as ( - props: PropsWithChildren, -) => ReactElement; -export const useAnalytics = analytics.useAnalytics; diff --git a/packages/checkout/widgets-lib/src/context/analytics-provider/SetupAnalytics.tsx b/packages/checkout/widgets-lib/src/context/analytics-provider/SetupAnalytics.tsx deleted file mode 100644 index 09e74e56e2..0000000000 --- a/packages/checkout/widgets-lib/src/context/analytics-provider/SetupAnalytics.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { useCallback, useEffect } from 'react'; -import { Checkout, TelemetryConfig } from '@imtbl/checkout-sdk'; -import { useAnalytics } from './SegmentAnalyticsProvider'; - -type SetupAnalyticsProps = { - children: React.ReactNode; - checkout: Checkout -}; - -export function SetupAnalytics( - { children, checkout }: SetupAnalyticsProps, -) { - const { updateWriteKey } = useAnalytics(); - - const telemetry = useCallback(async () => { - try { - return await checkout?.config?.remote.getConfig('telemetry'); - } catch (err: any) { - // eslint-disable-next-line no-console - console.error('unable to fetch telemetry config: ', err); - } - return undefined; - }, [checkout]); - - useEffect(() => { - (async () => { - const config = await telemetry() as TelemetryConfig; - if (!config) return; - updateWriteKey(config.segmentPublishableKey); - })(); - }, [telemetry]); - - // eslint-disable-next-line react/jsx-no-useless-fragment - return (<>{children}); -} diff --git a/packages/checkout/widgets-lib/src/context/view-context/test-components/ViewContextTestComponent.tsx b/packages/checkout/widgets-lib/src/context/view-context/test-components/ViewContextTestComponent.tsx index a21b8f2053..a9ab179385 100644 --- a/packages/checkout/widgets-lib/src/context/view-context/test-components/ViewContextTestComponent.tsx +++ b/packages/checkout/widgets-lib/src/context/view-context/test-components/ViewContextTestComponent.tsx @@ -1,10 +1,9 @@ import React from 'react'; -import { Checkout, WidgetTheme } from '@imtbl/checkout-sdk'; +import { WidgetTheme } from '@imtbl/checkout-sdk'; import { I18nextProvider } from 'react-i18next'; import { Environment } from '@imtbl/config'; import { ThemeProvider } from '../../../components/ThemeProvider/ThemeProvider'; import { withDefaultWidgetConfigs } from '../../../lib/withDefaultWidgetConfig'; -import { CustomAnalyticsProvider } from '../../analytics-provider/CustomAnalyticsProvider'; import i18n from '../../../i18n'; export interface TestProps { @@ -24,19 +23,19 @@ export function ViewContextTestComponent({ children, theme }: TestProps) { }); return ( - - - {children} - - + + + {children} + + ); } diff --git a/packages/checkout/widgets-lib/src/lib/analytics/identifyUser.test.ts b/packages/checkout/widgets-lib/src/lib/analytics/identifyUser.test.ts deleted file mode 100644 index d101c2c187..0000000000 --- a/packages/checkout/widgets-lib/src/lib/analytics/identifyUser.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { WrappedBrowserProvider } from '@imtbl/checkout-sdk'; -import { identifyUser } from './identifyUser'; - -describe('identifyUser', () => { - let provider; - let identify; - beforeEach(() => { - jest.resetAllMocks(); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - identify = jest.fn().mockReturnValue({}); - }); - - it('should identify a user by their wallet address and add properties isMetaMask and isPassportWallet', async () => { - provider = { - getSigner: jest.fn().mockReturnValue({ - getAddress: jest.fn().mockResolvedValue('0xtest'), - }), - ethereumProvider: { - isMetaMask: true, - request: jest.fn(), - }, - } as any as WrappedBrowserProvider; - - await identifyUser(identify, provider); - expect(identify).toBeCalledWith('0xtest', { isMetaMask: true, isPassportWallet: false }, undefined); - }); - - it('should correctly identify users wallet as Passport', async () => { - const options = { foo: 'bar' }; - - provider = { - getSigner: jest.fn().mockReturnValue({ - getAddress: jest.fn().mockResolvedValue('0xtest'), - }), - send: jest.fn(), - ethereumProvider: { - isPassport: true, - request: jest.fn(), - }, - } as any as WrappedBrowserProvider; - await identifyUser(identify, provider, options); - expect(identify).toBeCalledWith('0xtest', { isMetaMask: false, isPassportWallet: true }, options); - }); -}); diff --git a/packages/checkout/widgets-lib/src/lib/analytics/identifyUser.ts b/packages/checkout/widgets-lib/src/lib/analytics/identifyUser.ts deleted file mode 100644 index 9696507ce4..0000000000 --- a/packages/checkout/widgets-lib/src/lib/analytics/identifyUser.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { WrappedBrowserProvider } from '@imtbl/checkout-sdk'; -import { isMetaMaskProvider, isPassportProvider } from '../provider'; - -/** - * identifyUser - function to identify a user by their wallet address and call the function to raise analytics - * @param identify - The identify function from the useAnalytics() hook - * @param provider - the WrappedBrowserProvider used to find the user's walletAddress - * @param options - additional options to pass to the identify function - */ -export async function identifyUser( - identify: (id: string, attributes: Record, options?: Record) => void, - provider: WrappedBrowserProvider, - options?: Record, -) { - // WT-1698 Analytics - Identify user here then progress to widget - const walletAddress = (await (await provider.getSigner()).getAddress()).toLowerCase(); - const isMetaMask = isMetaMaskProvider(provider); - const isPassport = isPassportProvider(provider); - try { - identify(walletAddress, { - isMetaMask, - isPassportWallet: isPassport, - }, options); - // eslint-disable-next-line no-console - } catch (error: any) { console.error('analytics: unable to identify user: ', error); } -} diff --git a/packages/checkout/widgets-lib/src/lib/squid/hooks/useExecute.ts b/packages/checkout/widgets-lib/src/lib/squid/hooks/useExecute.ts index 791055cca2..c6c39e3bce 100644 --- a/packages/checkout/widgets-lib/src/lib/squid/hooks/useExecute.ts +++ b/packages/checkout/widgets-lib/src/lib/squid/hooks/useExecute.ts @@ -9,18 +9,15 @@ import { EIP6963ProviderInfo, WrappedBrowserProvider } from '@imtbl/checkout-sdk import { isSquidNativeToken } from '../functions/isSquidNativeToken'; import { retry } from '../../retry'; import { withMetricsAsync } from '../../metrics'; -import { useAnalytics, UserJourney } from '../../../context/analytics-provider/SegmentAnalyticsProvider'; import { isRejectedError } from '../../../functions/errorType'; import { callApprove, callExecute } from '../functions/execute'; const TRANSACTION_NOT_COMPLETED = 'transaction not completed'; export const useExecute = ( - userJourney: UserJourney, + flowPrefix: 'AddTokens' | 'Purchase', onTransactionError?: (err: unknown) => void, ) => { - const { user } = useAnalytics(); - const getAllowance = async ( provider: WrappedBrowserProvider, routeResponse: RouteResponse, @@ -53,16 +50,6 @@ export const useExecute = ( return undefined; } }; - - const getAnonymousId = async () => { - try { - const userData = await user(); - return userData?.anonymousId() ?? undefined; - } catch (error) { - return undefined; - } - }; - const approve = async ( fromProviderInfo: EIP6963ProviderInfo, provider: WrappedBrowserProvider, @@ -72,8 +59,8 @@ export const useExecute = ( if (!isSquidNativeToken(routeResponse?.route?.params.fromToken)) { return await withMetricsAsync( (flow) => callApprove(flow, fromProviderInfo, provider, routeResponse), - `${userJourney}_Approve`, - await getAnonymousId(), + `${flowPrefix}_Approve`, + undefined, (error) => (isRejectedError(error) ? 'rejected' : ''), ); } @@ -96,8 +83,8 @@ export const useExecute = ( try { return await withMetricsAsync( (flow) => callExecute(flow, squid, fromProviderInfo, provider, routeResponse), - `${userJourney}_Execute`, - await getAnonymousId(), + `${flowPrefix}_Execute`, + undefined, (error) => (isRejectedError(error) ? 'rejected' : ''), ); } catch (error) { diff --git a/packages/checkout/widgets-lib/src/views/top-up/TopUpView.tsx b/packages/checkout/widgets-lib/src/views/top-up/TopUpView.tsx index d2ba1d72c2..c574e94ec3 100644 --- a/packages/checkout/widgets-lib/src/views/top-up/TopUpView.tsx +++ b/packages/checkout/widgets-lib/src/views/top-up/TopUpView.tsx @@ -2,7 +2,6 @@ import { Body, Box, Heading } from '@biom3/react'; import { ReactNode, useContext, useEffect, useMemo, useState, } from 'react'; -import { StandardAnalyticsControlTypes } from '@imtbl/react-analytics'; import { Checkout, GasEstimateBridgeToL2Result, @@ -12,13 +11,9 @@ import { } from '@imtbl/checkout-sdk'; import { Environment } from '@imtbl/config'; import { useTranslation } from 'react-i18next'; -import { - UserJourney, - useAnalytics, -} from '../../context/analytics-provider/SegmentAnalyticsProvider'; import { DEFAULT_TOKEN_SYMBOLS } from '../../context/crypto-fiat-context/CryptoFiatProvider'; import { BridgeWidgetViews } from '../../context/view-context/BridgeViewContextTypes'; -import { useMount } from '../../hooks/useMount'; +import { } from '../../hooks/useMount'; import { HeaderNavigation } from '../../components/Header/HeaderNavigation'; import { SimpleLayout } from '../../components/SimpleLayout/SimpleLayout'; import { @@ -50,11 +45,7 @@ interface TopUpViewProps { showSwapOption: boolean; showBridgeOption: boolean; tokenAddress?: string; - amount?: string; - analytics: { - userJourney: UserJourney; - }; - onCloseButtonClick: () => void; + amount?: string; onCloseButtonClick: () => void; onBackButtonClick?: () => void; heading?: [key: string, options?: $Dictionary]; subheading?: [key: string, options?: $Dictionary]; @@ -84,15 +75,12 @@ export function TopUpView({ showBridgeOption, tokenAddress, amount, - analytics, onCloseButtonClick, onBackButtonClick, heading, subheading, }: TopUpViewProps) { const { t } = useTranslation(); - const { userJourney } = analytics; - const { viewDispatch } = useContext(ViewContext); const { cryptoFiatState, cryptoFiatDispatch } = useContext(CryptoFiatContext); @@ -110,9 +98,6 @@ export function TopUpView({ const title = heading ? t(...heading) : t('views.TOP_UP_VIEW.header.title'); const description = subheading ? t(...subheading) : null; - - const { page, track } = useAnalytics(); - const isSwapAvailable = useAsyncMemo(async () => { if (!checkout) return undefined; try { @@ -121,11 +106,6 @@ export function TopUpView({ return false; } }, [checkout]); - - useMount(() => { - page({ userJourney, screen: 'TopUp' }); - }); - useEffect(() => { if (!cryptoFiatDispatch) return; cryptoFiatDispatch({ @@ -161,21 +141,6 @@ export function TopUpView({ setOnRampFeesPercentage(onRampFees); })(); }, [checkout !== undefined]); - - const localTrack = ( - control: string, - extras: any, - controlType: StandardAnalyticsControlTypes = 'Button', - ) => { - track({ - userJourney, - screen: 'TopUp', - control, - controlType, - extras, - }); - }; - const onClickSwap = () => { if (widgetEvent === IMTBLWidgetEvents.IMTBL_SWAP_WIDGET_EVENT) { const data = { @@ -192,9 +157,7 @@ export function TopUpView({ data, }, }, - }); - localTrack('Swap', { ...data, widgetEvent }); - return; + }); return; } const data = { @@ -203,7 +166,6 @@ export function TopUpView({ amount: '', }; orchestrationEvents.sendRequestSwapEvent(eventTarget, widgetEvent, data); - localTrack('Swap', { ...data, widgetEvent }); }; const onClickBridge = () => { @@ -221,9 +183,7 @@ export function TopUpView({ data, }, }, - }); - localTrack('Bridge', { ...data, widgetEvent }); - return; + }); return; } const data = { @@ -231,7 +191,6 @@ export function TopUpView({ amount: '', }; orchestrationEvents.sendRequestBridgeEvent(eventTarget, widgetEvent, data); - localTrack('Bridge', { ...data, widgetEvent }); }; const onClickOnRamp = () => { @@ -249,9 +208,7 @@ export function TopUpView({ data, }, }, - }); - localTrack('OnRamp', { ...data, widgetEvent }); - return; + }); return; } const data = { @@ -259,18 +216,10 @@ export function TopUpView({ amount: amount ?? '', }; orchestrationEvents.sendRequestOnrampEvent(eventTarget, widgetEvent, data); - localTrack('OnRamp', { ...data, widgetEvent }); }; const onClickAdvancedOptions = () => { const toolkitBaseUrl = TOOLKIT_BASE_URL[environment]; - const data = { - tokenAddress: tokenAddress ?? '', - amount: amount ?? '', - }; - - localTrack('AdvancedOptions', { ...data, widgetEvent }); - window.open(`${toolkitBaseUrl}/squid-bridge/`, '_blank'); }; diff --git a/packages/checkout/widgets-lib/src/widgets/add-tokens/AddTokensRoot.tsx b/packages/checkout/widgets-lib/src/widgets/add-tokens/AddTokensRoot.tsx index 782d1e79fa..28d4afb54c 100644 --- a/packages/checkout/widgets-lib/src/widgets/add-tokens/AddTokensRoot.tsx +++ b/packages/checkout/widgets-lib/src/widgets/add-tokens/AddTokensRoot.tsx @@ -8,7 +8,6 @@ import { } from '@imtbl/checkout-sdk'; import React, { Suspense } from 'react'; import { Base } from '../BaseWidgetRoot'; -import { CustomAnalyticsProvider } from '../../context/analytics-provider/CustomAnalyticsProvider'; import { HandoverProvider } from '../../context/handover-context/HandoverProvider'; import i18n from '../../i18n'; import { LoadingView } from '../../views/loading/LoadingView'; @@ -71,35 +70,35 @@ export class AddTokens extends Base { this.reactRoot.render( - - - - - + + + + + } - > - - - - - - + > + + + + + + , ); } diff --git a/packages/checkout/widgets-lib/src/widgets/add-tokens/AddTokensWidget.tsx b/packages/checkout/widgets-lib/src/widgets/add-tokens/AddTokensWidget.tsx index 9d70e77abc..a6a51bfc47 100644 --- a/packages/checkout/widgets-lib/src/widgets/add-tokens/AddTokensWidget.tsx +++ b/packages/checkout/widgets-lib/src/widgets/add-tokens/AddTokensWidget.tsx @@ -25,10 +25,6 @@ import { import { AddTokens } from './views/AddTokens'; import { ErrorView } from '../../views/error/ErrorView'; import { useSquid } from '../../lib/squid/hooks/useSquid'; -import { - useAnalytics, - UserJourney, -} from '../../context/analytics-provider/SegmentAnalyticsProvider'; import { fetchChains } from '../../lib/squid/functions/fetchChains'; import { StrongCheckoutWidgetsConfig } from '../../lib/withDefaultWidgetConfig'; import { Review } from './views/Review'; @@ -65,8 +61,6 @@ export default function AddTokensWidget({ history: [{ type: AddTokensWidgetViews.ADD_TOKENS }], }); const { t } = useTranslation(); - const { page } = useAnalytics(); - const viewReducerValues = useMemo( () => ({ viewState, @@ -130,7 +124,7 @@ export default function AddTokensWidget({ useEffect(() => { if (config.environment !== Environment.PRODUCTION) { - showErrorHandover(AddTokensErrorTypes.ENVIRONMENT_ERROR, { contextId: id }); + showErrorHandover(AddTokensErrorTypes.ENVIRONMENT_ERROR); } }, [config, id]); @@ -151,7 +145,7 @@ export default function AddTokensWidget({ const isInvalidToAmount = toAmount && !amountInputValidation(toAmount); if (isInvalidToTokenAddress || isInvalidToAmount) { - showErrorHandover(AddTokensErrorTypes.INVALID_PARAMETERS, { contextId: id }); + showErrorHandover(AddTokensErrorTypes.INVALID_PARAMETERS); } }, [toTokenAddress, toAmount, id]); @@ -281,15 +275,6 @@ export default function AddTokensWidget({ actionText={t('views.ERROR_VIEW.actionText')} onActionClick={errorAction} onCloseClick={() => sendAddTokensCloseEvent(eventTarget)} - errorEventAction={() => { - page({ - userJourney: UserJourney.ADD_TOKENS, - screen: 'Error', - extras: { - contextId: id, - }, - }); - }} /> )} {viewState.view.type diff --git a/packages/checkout/widgets-lib/src/widgets/add-tokens/components/TokenDrawerMenu.tsx b/packages/checkout/widgets-lib/src/widgets/add-tokens/components/TokenDrawerMenu.tsx index 11f2f708bd..859e4d0cfe 100644 --- a/packages/checkout/widgets-lib/src/widgets/add-tokens/components/TokenDrawerMenu.tsx +++ b/packages/checkout/widgets-lib/src/widgets/add-tokens/components/TokenDrawerMenu.tsx @@ -32,10 +32,6 @@ import { getTokenImageByAddress, isNativeToken, } from '../../../lib/utils'; -import { - useAnalytics, - UserJourney, -} from '../../../context/analytics-provider/SegmentAnalyticsProvider'; import { AddTokensErrorTypes } from '../types'; import { TokenImage } from '../../../components/TokenImage/TokenImage'; import { PULSE_SHADOW } from '../utils/animation'; @@ -62,9 +58,7 @@ export function TokenDrawerMenu({ const defaultTokenImage = getDefaultTokenImage( checkout?.config.environment, config.theme, - ); - const { track } = useAnalytics(); - const { t } = useTranslation(); + ); const { t } = useTranslation(); const setSelectedToken = (token: TokenInfo | undefined) => { addTokensDispatch({ @@ -77,16 +71,6 @@ export function TokenDrawerMenu({ const handleTokenChange = useCallback( (token: TokenInfo) => { - track({ - userJourney: UserJourney.ADD_TOKENS, - screen: 'InputScreen', - control: 'TokensMenu', - controlType: 'MenuItem', - extras: { - contextId: addTokensState.id, - tokenAddress: token?.address, - }, - }); setSelectedToken(token); setVisible(false); setSearchValue(''); @@ -188,7 +172,7 @@ export function TokenDrawerMenu({ }); } } catch (error) { - showErrorHandover(AddTokensErrorTypes.SERVICE_BREAKDOWN, { contextId: addTokensState.id, error }); + showErrorHandover(AddTokensErrorTypes.SERVICE_BREAKDOWN); } })(); }, [addTokensState.tokens, checkout, toTokenAddress]); diff --git a/packages/checkout/widgets-lib/src/widgets/add-tokens/hooks/useError.tsx b/packages/checkout/widgets-lib/src/widgets/add-tokens/hooks/useError.tsx index 191a553dac..cd27919522 100644 --- a/packages/checkout/widgets-lib/src/widgets/add-tokens/hooks/useError.tsx +++ b/packages/checkout/widgets-lib/src/widgets/add-tokens/hooks/useError.tsx @@ -11,10 +11,6 @@ import { ViewContext, } from '../../../context/view-context/ViewContext'; import { AddTokensWidgetViews } from '../../../context/view-context/AddTokensViewContextTypes'; -import { - useAnalytics, - UserJourney, -} from '../../../context/analytics-provider/SegmentAnalyticsProvider'; import { RiveStateMachineInput } from '../../../types/HandoverTypes'; import { useHandover } from '../../../lib/hooks/useHandover'; import { APPROVE_TXN_ANIMATION } from '../../../lib/squid/config'; @@ -30,10 +26,7 @@ interface ErrorConfig { } export const useError = (environment: Environment) => { - const { viewDispatch } = useContext(ViewContext); - - const { page } = useAnalytics(); - const { t } = useTranslation(); + const { viewDispatch } = useContext(ViewContext); const { t } = useTranslation(); const { addHandover, closeHandover } = useHandover({ id: HandoverTarget.GLOBAL, }); @@ -151,17 +144,7 @@ export const useError = (environment: Environment) => { const showErrorHandover = ( errorType: AddTokensErrorTypes, - data?: Record, ) => { - page({ - userJourney: UserJourney.ADD_TOKENS, - screen: 'Error', - extras: { - errorType, - ...data, - }, - }); - addHandover({ animationUrl: getRemoteRive(environment, APPROVE_TXN_ANIMATION), inputValue: RiveStateMachineInput.ERROR, diff --git a/packages/checkout/widgets-lib/src/widgets/add-tokens/hooks/useErrorHandler.ts b/packages/checkout/widgets-lib/src/widgets/add-tokens/hooks/useErrorHandler.ts index 2342eb0aed..9def06a240 100644 --- a/packages/checkout/widgets-lib/src/widgets/add-tokens/hooks/useErrorHandler.ts +++ b/packages/checkout/widgets-lib/src/widgets/add-tokens/hooks/useErrorHandler.ts @@ -1,16 +1,11 @@ import { useContext } from 'react'; -import { AddTokensError, AddTokensErrorTypes } from '../types'; +import { AddTokensErrorTypes } from '../types'; import { EventTargetContext } from '../../../context/event-target-context/EventTargetContext'; import { sendAddTokensFailedEvent } from '../AddTokensWidgetEvents'; import { useError } from './useError'; -import { AddTokensContext } from '../context/AddTokensContext'; import { useProvidersContext } from '../../../context/providers-context/ProvidersContext'; export const useErrorHandler = () => { - const { - addTokensState: { id: contextId }, - } = useContext(AddTokensContext); - const { providersState: { checkout, @@ -56,12 +51,7 @@ export const useErrorHandler = () => { errorType = AddTokensErrorTypes.UNRECOGNISED_CHAIN; } - const error: AddTokensError = { - type: errorType, - data: { error: err }, - }; - - showErrorHandover(errorType, { contextId, error }); + showErrorHandover(errorType); }; return { onTransactionError }; diff --git a/packages/checkout/widgets-lib/src/widgets/add-tokens/views/AddTokens.tsx b/packages/checkout/widgets-lib/src/widgets/add-tokens/views/AddTokens.tsx index dfc58616ff..ae39df8f79 100644 --- a/packages/checkout/widgets-lib/src/widgets/add-tokens/views/AddTokens.tsx +++ b/packages/checkout/widgets-lib/src/widgets/add-tokens/views/AddTokens.tsx @@ -28,9 +28,9 @@ import { useState, } from 'react'; import { useTranslation } from 'react-i18next'; -import { ActionType } from '@0xsquid/squid-types'; import { trackFlow } from '@imtbl/metrics'; import { parseUnits } from 'ethers/utils'; +import { v4 as uuidv4 } from 'uuid'; import { SimpleLayout } from '../../../components/SimpleLayout/SimpleLayout'; import { EventTargetContext } from '../../../context/event-target-context/EventTargetContext'; import { @@ -46,7 +46,7 @@ import { import type { StrongCheckoutWidgetsConfig } from '../../../lib/withDefaultWidgetConfig'; import { useRoutes } from '../../../lib/squid/hooks/useRoutes'; import { AddTokensWidgetViews } from '../../../context/view-context/AddTokensViewContextTypes'; -import { AddTokensErrorTypes, AddTokensExperiments } from '../types'; +import { AddTokensErrorTypes } from '../types'; import { DeliverToWalletDrawer } from '../../../components/WalletDrawer/DeliverToWalletDrawer'; import { PayWithWalletDrawer } from '../../../components/WalletDrawer/PayWithWalletDrawer'; import { useInjectedProviders } from '../../../lib/hooks/useInjectedProviders'; @@ -54,10 +54,6 @@ import { getProviderSlugFromRdns } from '../../../lib/provider'; import { useProvidersContext } from '../../../context/providers-context/ProvidersContext'; import { sendConnectProviderSuccessEvent } from '../AddTokensWidgetEvents'; import { convertToUsd } from '../../../lib/squid/functions/convertToUsd'; -import { - useAnalytics, - UserJourney, -} from '../../../context/analytics-provider/SegmentAnalyticsProvider'; import { validateToAmount } from '../functions/amountValidation'; import { OnboardingDrawer } from '../components/OnboardingDrawer'; import { useError } from '../hooks/useError'; @@ -66,14 +62,12 @@ import { TokenDrawerMenu } from '../components/TokenDrawerMenu'; import { PULSE_SHADOW } from '../utils/animation'; import { RouteData } from '../../../lib/squid/types'; import { SQUID_NATIVE_TOKEN, TOOLKIT_SQUID_URL } from '../../../lib/squid/config'; -import { identifyUser } from '../../../lib/analytics/identifyUser'; import { NotEnoughGasDrawer } from '../../../components/NotEnoughGasDrawer/NotEnoughGasDrawer'; import { SelectedWallet } from '../../../components/SelectedWallet/SelectedWallet'; import { RouteOptionsDrawer } from '../../../components/RouteOptionsDrawer/RouteOptionsDrawer'; import { SelectedRouteOption } from '../../../components/SelectedRouteOption/SelectedRouteOption'; import { getFormattedAmounts } from '../../../functions/getFormattedNumber'; import { checkSanctionedAddresses } from '../../../functions/checkSanctionedAddresses'; -import { RouteError } from '../../../lib/squid/RouteError'; interface AddTokensProps { checkout: Checkout; @@ -120,15 +114,7 @@ export function AddTokens({ selectedRouteData, selectedToken, isSwapAvailable, - experiments, } = addTokensState; - - const { - track, - page, - identify, - user, - } = useAnalytics(); const { viewDispatch } = useContext(ViewContext); const { t } = useTranslation(); @@ -188,31 +174,6 @@ export function AddTokens({ }, [selectedAmount, inputValue]); const setSelectedRouteData = (route: RouteData | undefined) => { - if (route) { - track({ - userJourney: UserJourney.ADD_TOKENS, - screen: 'InputScreen', - control: 'RoutesMenu', - controlType: 'MenuItem', - extras: { - contextId: id, - toTokenAddress: route.amountData.toToken.address, - toTokenChainId: route.amountData.toToken.chainId, - toTokenSymbol: route.amountData.toToken.symbol, - fromTokenAddress: route.amountData.fromToken.address, - fromTokenChainId: route.amountData.fromToken.chainId, - fromTokenSymbol: route.amountData.fromToken.symbol, - toAmount: route.amountData.toAmount, - fromAmount: route.amountData.fromAmount, - isBridge: route.amountData.toToken.chainId !== route.amountData.fromToken.chainId, - isSwap: route.amountData.toToken.chainId === route.amountData.fromToken.chainId, - hasEmbeddedSwap: !!route.route.route.estimate.actions.find( - (action) => action.type === ActionType.SWAP, - ), - isInsufficientGas: route.isInsufficientGas, - }, - }); - } addTokensDispatch({ payload: { type: AddTokensActions.SET_SELECTED_ROUTE_DATA, @@ -229,17 +190,6 @@ export function AddTokens({ if (amount > 0) { setSelectedAmount(value); - - track({ - userJourney: UserJourney.ADD_TOKENS, - screen: 'InputScreen', - control: 'AmountInput', - controlType: 'TextInput', - extras: { - contextId: id, - toAmount: value, - }, - }); } else { setSelectedAmount(''); } @@ -282,12 +232,7 @@ export function AddTokens({ useEffect(() => { if (!lockedToProvider) { return; } - (async () => { - const userData = user ? await user() : undefined; - const anonymousId = userData?.anonymousId(); - - await identifyUser(identify, toProvider!, { anonymousId }); - })(); + (async () => { })(); }, [toProvider, lockedToProvider]); const toChain = useMemo( @@ -296,20 +241,8 @@ export function AddTokens({ ); useEffect(() => { - if (!id || isSwapAvailable === undefined) { return; } - - page({ - userJourney: UserJourney.ADD_TOKENS, - screen: 'InputScreen', - extras: { - contextId: id, - toAmount, - toTokenAddress, - geoBlocked: !isSwapAvailable, - }, - }).then((ctx) => { - trackFlow('commerce', `addTokensLoaded_${ctx.event.messageId}`); - }); + if (!id || isSwapAvailable === undefined) return; + trackFlow('commerce', `addTokensLoaded_${uuidv4()}`); }, [id, isSwapAvailable]); useEffect(() => { @@ -364,32 +297,8 @@ export function AddTokens({ if (availableRoutes.length === 0) { setInsufficientBalance(true); } - - track({ - userJourney: UserJourney.ADD_TOKENS, - screen: 'InputScreen', - control: 'RoutesMenu', - controlType: 'MenuItem', - action: 'Request', - extras: { - contextId: id, - routesAvailable: availableRoutes.length, - geoBlocked: !isSwapAvailable, - }, - }); - } catch (error) { - if (error instanceof RouteError && error.data) { - track({ - userJourney: UserJourney.ADD_TOKENS, - screen: 'Routes', - action: 'Failed', - extras: { - contextId: id, - message: error.message, - ...error.data, - }, - }); - } + } catch { + // Route errors are reflected by the empty routes state. } setFetchingRoutes(false); @@ -417,24 +326,13 @@ export function AddTokens({ setOnRampAllowedTokens(tokenResponse.tokens); } } catch (error) { - showErrorHandover(AddTokensErrorTypes.SERVICE_BREAKDOWN, { contextId: id, error }); + showErrorHandover(AddTokensErrorTypes.SERVICE_BREAKDOWN); } }; fetchOnRampTokens(); }, [checkout, id]); const sendRequestOnRampEvent = async () => { - track({ - userJourney: UserJourney.ADD_TOKENS, - screen: 'InputScreen', - control: 'PayWithCardMenu', - controlType: 'MenuItem', - extras: { - contextId: id, - tokenAddress: selectedToken?.address ?? '', - amount: selectedAmount ?? '', - }, - }); const data = { tokenAddress: selectedToken?.address ?? '', amount: selectedAmount ?? '', @@ -501,23 +399,6 @@ export function AddTokens({ return; } - - track({ - userJourney: UserJourney.ADD_TOKENS, - screen: 'InputScreen', - control: 'Review', - controlType: 'Button', - extras: { - contextId: id, - toTokenAddress: selectedRouteData.amountData.toToken.address, - toTokenChainId: selectedRouteData.amountData.toToken.chainId, - fromTokenAddress: selectedRouteData.amountData.fromToken.address, - fromTokenChainId: selectedRouteData.amountData.fromToken.chainId, - toAmount: selectedRouteData.amountData.toAmount, - fromAmount: selectedRouteData.amountData.fromAmount, - }, - }); - viewDispatch({ payload: { type: ViewActions.UPDATE_VIEW, @@ -575,19 +456,6 @@ export function AddTokens({ provider: WrappedBrowserProvider, providerInfo: EIP6963ProviderInfo, ) => { - track({ - userJourney: UserJourney.ADD_TOKENS, - screen: 'InputScreen', - control: 'WalletsMenu', - controlType: 'MenuItem', - extras: { - contextId: id, - providerType, - providerName: providerInfo.name, - providerRdns: providerInfo.rdns, - providerUuid: providerInfo.uuid, - }, - }); sendConnectProviderSuccessEvent( eventTarget, providerType, @@ -606,20 +474,6 @@ export function AddTokens({ return undefined; }; - useEffect(() => { - if (!id || !experiments) return; - - track({ - userJourney: UserJourney.ADD_TOKENS, - screen: 'Experiments', - action: 'Started', - extras: { - contextId: id, - preselectedToken: experiments[AddTokensExperiments.PRESELECTED_TOKEN] || 'none', - }, - }); - }, [id, experiments]); - useEffect(() => { if (selectedRouteData?.isInsufficientGas) { setShowNotEnoughGasDrawer(true); diff --git a/packages/checkout/widgets-lib/src/widgets/add-tokens/views/Review.tsx b/packages/checkout/widgets-lib/src/widgets/add-tokens/views/Review.tsx index ea92233ecc..f589d3064b 100644 --- a/packages/checkout/widgets-lib/src/widgets/add-tokens/views/Review.tsx +++ b/packages/checkout/widgets-lib/src/widgets/add-tokens/views/Review.tsx @@ -14,9 +14,9 @@ import { Sticker, useInterval, } from '@biom3/react'; -import { ChainId } from '@imtbl/checkout-sdk'; import { trackFlow } from '@imtbl/metrics'; import { t } from 'i18next'; +import { v4 as uuidv4 } from 'uuid'; import { useCallback, useContext, @@ -38,11 +38,6 @@ import { useExecute } from '../../../lib/squid/hooks/useExecute'; import { useRoutes } from '../../../lib/squid/hooks/useRoutes'; import { AddTokensContext } from '../context/AddTokensContext'; import { AddTokensErrorTypes } from '../types'; - -import { - useAnalytics, - UserJourney, -} from '../../../context/analytics-provider/SegmentAnalyticsProvider'; import { useProvidersContext } from '../../../context/providers-context/ProvidersContext'; import { getRouteChains } from '../../../lib/squid/functions/getRouteChains'; import { getTotalRouteFees } from '../../../lib/squid/functions/getTotalRouteFees'; @@ -60,7 +55,6 @@ import { } from '../../../lib/squid/config'; import { verifyAndSwitchChain } from '../../../lib/squid/functions/verifyAndSwitchChain'; import { useError } from '../hooks/useError'; -import { FromAmountData } from '../../../lib/squid/types'; import { sendAddTokensSuccessEvent, } from '../AddTokensWidgetEvents'; @@ -90,12 +84,9 @@ export function Review({ onCloseButtonClick, }: ReviewProps) { const { viewDispatch } = useContext(ViewContext); - - const { track, page } = useAnalytics(); - const { addTokensState: { - id, squid, chains, tokens, + squid, chains, tokens, }, } = useContext(AddTokensContext); @@ -112,7 +103,6 @@ export function Review({ } = useContext(EventTargetContext); const [route, setRoute] = useState(); - const [amountData, setAmountData] = useState(); const [proceedDisabled, setProceedDisabled] = useState(true); const [showFeeBreakdown, setShowFeeBreakdown] = useState(false); const [showSecuringQuote, setShowSecuringQuote] = useState(false); @@ -124,21 +114,7 @@ export function Review({ const { getAllowance, approve, execute, getStatus, - } = useExecute(UserJourney.ADD_TOKENS, onTransactionError); - - useEffect(() => { - page({ - userJourney: UserJourney.ADD_TOKENS, - screen: 'Review', - extras: { - contextId: id, - toAmount: data.toAmount, - toChainId: data.toChainId, - toTokenAddress: data.toTokenAddress, - }, - }); - }, [id]); - + } = useExecute('AddTokens', onTransactionError); const getFromAmountAndRoute = async () => { if (!squid || !tokens) return; @@ -170,14 +146,10 @@ export function Review({ false, ); setRoute(routeResponse.route); - setAmountData(updatedAmountData); setProceedDisabled(false); setShowSecuringQuote(false); if (routeResponse?.route === undefined) { - showErrorHandover(AddTokensErrorTypes.ROUTE_ERROR, { - contextId: id, - error: 'Failed to obtain final route', - }); + showErrorHandover(AddTokensErrorTypes.ROUTE_ERROR); } }; @@ -197,20 +169,6 @@ export function Review({ ); const openFeeBreakdown = () => { - const feesToken = route?.route.estimate.feeCosts?.[0]?.token; - track({ - userJourney: UserJourney.ADD_TOKENS, - screen: 'Review', - control: 'FeeBreakdown', - controlType: 'Button', - extras: { - contextId: id, - feesToken: feesToken?.symbol, - totalAmount: feesToken ? getFormattedNumber(totalFees, feesToken.decimals) : null, - totalFiatAmount: getFormattedAmounts(totalFeesUsd), - }, - }); - setShowFeeBreakdown(true); }; @@ -268,32 +226,10 @@ export function Review({ } let currentFromAddress = ''; - track({ - userJourney: UserJourney.ADD_TOKENS, - screen: 'Review', - control: 'Proceed', - controlType: 'Button', - extras: { - contextId: id, - toTokenAddress: route.route.params.toToken, - toTokenChainId: route.route.params.toChain, - fromTokenAddress: route.route.params.fromToken, - fromTokenChainId: route.route.params.fromChain, - fromAddress: route.route.params.fromAddress, - toAddress: route.route.params.toAddress, - estimatedRouteDuration: route.route.estimate.estimatedRouteDuration, - fromAmount: amountData?.fromAmount, - toAmount: amountData?.toAmount, - }, - }); - try { currentFromAddress = await (await fromProvider.getSigner()).getAddress(); } catch (error) { - showErrorHandover(AddTokensErrorTypes.PROVIDER_ERROR, { - contextId: id, - error, - }); + showErrorHandover(AddTokensErrorTypes.PROVIDER_ERROR); return; } @@ -338,31 +274,7 @@ export function Review({ const executeTxnReceipt = await execute(squid, fromProviderInfo, changeableProvider, route); if (executeTxnReceipt) { - track({ - userJourney: UserJourney.ADD_TOKENS, - screen: 'FundsAdded', - action: 'Succeeded', - extras: { - contextId: id, - ...(route.route.params.fromChain !== ChainId.IMTBL_ZKEVM_MAINNET.toString() - && { txHash: executeTxnReceipt.hash }), - ...(route.route.params.fromChain === ChainId.IMTBL_ZKEVM_MAINNET.toString() - && { immutableZkEVMTxHash: executeTxnReceipt.hash }), - toTokenAddress: route.route.params.toToken, - toTokenChainId: route.route.params.toChain, - fromTokenAddress: route.route.params.fromToken, - fromTokenChainId: route.route.params.fromChain, - fromAmount: amountData?.fromAmount, - fromAddress: route.route.params.fromAddress, - toAddress: route.route.params.toAddress, - toAmount: amountData?.toAmount, - fromTokenSymbol: amountData?.fromToken.symbol, - toTokenSymbol: amountData?.toToken.symbol, - }, - }).then((ctx) => { - trackFlow('commerce', `addTokensFundsAdded_${ctx.event.messageId}`); - }); - + trackFlow('commerce', `addTokensFundsAdded_${uuidv4()}`); sendAddTokensSuccessEvent(eventTarget, executeTxnReceipt.hash); if (toChain === fromChain) { diff --git a/packages/checkout/widgets-lib/src/widgets/bridge/BridgeWidget.tsx b/packages/checkout/widgets-lib/src/widgets/bridge/BridgeWidget.tsx index ef07839868..0379bdd4ce 100644 --- a/packages/checkout/widgets-lib/src/widgets/bridge/BridgeWidget.tsx +++ b/packages/checkout/widgets-lib/src/widgets/bridge/BridgeWidget.tsx @@ -26,7 +26,6 @@ import { CryptoFiatProvider } from '../../context/crypto-fiat-context/CryptoFiat import { StatusView } from '../../components/Status/StatusView'; import { StatusType } from '../../components/Status/StatusType'; import { Transactions } from '../../components/Transactions/Transactions'; -import { UserJourney, useAnalytics } from '../../context/analytics-provider/SegmentAnalyticsProvider'; import { TopUpView } from '../../views/top-up/TopUpView'; import { ClaimWithdrawalInProgress } from '../../components/Transactions/ClaimWithdrawalInProgress'; import { getDefaultTokenImage } from '../../lib/utils'; @@ -89,9 +88,6 @@ export default function BridgeWidget({ } = config; const defaultTokenImage = getDefaultTokenImage(checkout.config.environment, theme); const { eventTargetState: { eventTarget } } = useContext(EventTargetContext); - - const { page } = useAnalytics(); - const [viewState, viewDispatch] = useReducer( viewReducer, { @@ -237,15 +233,6 @@ export default function BridgeWidget({ if (viewState.view.type === BridgeWidgetViews.BRIDGE_FAILURE) { reason = viewState.view.reason; } - - page({ - userJourney: UserJourney.BRIDGE, - screen: 'Failed', - extras: { - reason, - }, - }); - sendBridgeFailedEvent(eventTarget, reason); }} /> @@ -273,17 +260,10 @@ export default function BridgeWidget({ actionText={t('views.ERROR_VIEW.actionText')} onActionClick={goBackToWalletNetworkSelectorClearState} onCloseClick={() => sendBridgeWidgetCloseEvent(eventTarget)} - errorEventAction={() => { - page({ - userJourney: UserJourney.BRIDGE, - screen: 'Error', - }); - }} /> )} {viewState.view.type === SharedViews.TOP_UP_VIEW && ( { - page({ - userJourney: UserJourney.BRIDGE, - screen: 'ClaimWithdrawalSuccess', - }); sendBridgeClaimWithdrawalSuccessEvent( eventTarget, (viewState.view as BridgeClaimWithdrawalSuccess).transactionHash, @@ -322,17 +298,6 @@ export default function BridgeWidget({ statusText={t('views.CLAIM_WITHDRAWAL.IN_PROGRESS.failure.text')} actionText={t('views.CLAIM_WITHDRAWAL.IN_PROGRESS.failure.actionText')} onRenderEvent={() => { - let reason = ''; - if (viewState.view.type === BridgeWidgetViews.CLAIM_WITHDRAWAL_FAILURE) { - reason = viewState.view.reason; - } - page({ - userJourney: UserJourney.BRIDGE, - screen: 'ClaimWithdrawalFailure', - extras: { - reason, - }, - }); sendBridgeClaimWithdrawalFailedEvent( eventTarget, (viewState.view as BridgeClaimWithdrawalFailure).transactionHash, diff --git a/packages/checkout/widgets-lib/src/widgets/bridge/BridgeWidgetRoot.tsx b/packages/checkout/widgets-lib/src/widgets/bridge/BridgeWidgetRoot.tsx index 4fc15d7c65..f7242e4e17 100644 --- a/packages/checkout/widgets-lib/src/widgets/bridge/BridgeWidgetRoot.tsx +++ b/packages/checkout/widgets-lib/src/widgets/bridge/BridgeWidgetRoot.tsx @@ -10,7 +10,6 @@ import { import { Base } from '../BaseWidgetRoot'; import { isValidWalletProvider, isValidAmount, isValidAddress } from '../../lib/validations/widgetValidators'; import { ThemeProvider } from '../../components/ThemeProvider/ThemeProvider'; -import { CustomAnalyticsProvider } from '../../context/analytics-provider/CustomAnalyticsProvider'; import { LoadingView } from '../../views/loading/LoadingView'; import { HandoverProvider } from '../../context/handover-context/HandoverProvider'; import i18n from '../../i18n'; @@ -65,23 +64,23 @@ export class Bridge extends Base { this.reactRoot.render( - - - - }> - - - - - + + + + }> + + + + + , ); } diff --git a/packages/checkout/widgets-lib/src/widgets/bridge/components/BridgeForm.tsx b/packages/checkout/widgets-lib/src/widgets/bridge/components/BridgeForm.tsx index 1d2f08e410..a5f10b82a2 100644 --- a/packages/checkout/widgets-lib/src/widgets/bridge/components/BridgeForm.tsx +++ b/packages/checkout/widgets-lib/src/widgets/bridge/components/BridgeForm.tsx @@ -14,7 +14,6 @@ import { import { useTranslation } from 'react-i18next'; import { Environment } from '@imtbl/config'; import { trackError } from '@imtbl/metrics'; -import { UserJourney, useAnalytics } from '../../../context/analytics-provider/SegmentAnalyticsProvider'; import { amountInputValidation } from '../../../lib/validations/amountInputValidations'; import { BridgeActions, BridgeContext } from '../context/BridgeContext'; import { @@ -81,9 +80,6 @@ export function BridgeForm(props: BridgeFormProps) { theme, themeOverrides, } = props; - - const { track } = useAnalytics(); - // Form state const [formAmount, setFormAmount] = useState(defaultAmount || ''); const [amountError, setAmountError] = useState(''); @@ -314,18 +310,6 @@ export function BridgeForm(props: BridgeFormProps) { }, }); } - - track({ - userJourney: UserJourney.BRIDGE, - screen: 'TokenAmount', - control: 'Review', - controlType: 'Button', - extras: { - tokenAddress: formToken.token.address, - amount: formAmount, - }, - }); - bridgeDispatch({ payload: { type: BridgeActions.SET_TOKEN_AND_AMOUNT, @@ -350,7 +334,6 @@ export function BridgeForm(props: BridgeFormProps) { formToken, from, getRiskAssessment, - track, viewDispatch, ]); @@ -376,9 +359,6 @@ export function BridgeForm(props: BridgeFormProps) { {(!defaultTokenAddress || !isTokenBalancesLoading) && ( (undefined); @@ -400,38 +392,6 @@ export function BridgeReviewSummary() { // eslint-disable-next-line no-console console.error('Current network check failed', err); } - - track({ - userJourney: UserJourney.BRIDGE, - screen: 'Summary', - control: 'Submit', - controlType: 'Button', - extras: { - fromWalletAddress: fromAddress, - fromNetwork, - fromWallet: { - address: fromAddress, - rdns: from?.walletProviderInfo?.rdns, - uuid: from?.walletProviderInfo?.uuid, - isPassportWallet: isPassportProvider(from?.browserProvider), - isMetaMask: isMetaMaskProvider(from?.browserProvider), - }, - toWalletAddress: toAddress, - toNetwork, - toWallet: { - address: toAddress, - rdns: to?.walletProviderInfo?.rdns, - uuid: to?.walletProviderInfo?.uuid, - isPassportWallet: isPassportProvider(to?.browserProvider), - isMetaMask: isMetaMaskProvider(to?.browserProvider), - }, - amount, - fiatAmount: fromFiatAmount, - tokenAddress: token?.address, - moveType: isTransfer ? 'transfer' : 'bridge', - }, - }); - viewDispatch({ payload: { type: ViewActions.UPDATE_VIEW, @@ -589,14 +549,6 @@ export function BridgeReviewSummary() { gasFeeFiatValue={gasFeeFiatValue} gasFeeToken={estimates?.token} fees={formatFeeBreakdown()} - onFeesClick={() => { - track({ - userJourney: UserJourney.BRIDGE, - screen: 'MoveCoins', - control: 'ViewFees', - controlType: 'Button', - }); - }} sx={{ borderTopRightRadius: '0', borderTopLeftRadius: '0' }} loading={loading} /> diff --git a/packages/checkout/widgets-lib/src/widgets/bridge/components/WalletAndNetworkSelector.tsx b/packages/checkout/widgets-lib/src/widgets/bridge/components/WalletAndNetworkSelector.tsx index 1d43c5e0b6..0bbcec0257 100644 --- a/packages/checkout/widgets-lib/src/widgets/bridge/components/WalletAndNetworkSelector.tsx +++ b/packages/checkout/widgets-lib/src/widgets/bridge/components/WalletAndNetworkSelector.tsx @@ -18,17 +18,13 @@ import { useTranslation } from 'react-i18next'; import { BridgeWidgetViews } from '../../../context/view-context/BridgeViewContextTypes'; import { connectToProvider, getWalletProviderNameByProvider, - isMetaMaskProvider, + isPassportProvider, isWalletConnectProvider, } from '../../../lib/provider'; import { getChainNameById } from '../../../lib/chains'; import { ViewActions, ViewContext } from '../../../context/view-context/ViewContext'; import { abbreviateAddress } from '../../../lib/addressUtils'; -import { - useAnalytics, - UserJourney, -} from '../../../context/analytics-provider/SegmentAnalyticsProvider'; import { bridgeHeadingStyles, brigdeWalletWrapperStyles, @@ -52,9 +48,6 @@ export function WalletAndNetworkSelector({ themeOverrides }: { themeOverrides: T const { viewDispatch } = useContext(ViewContext); const { providers } = useInjectedProviders({ checkout }); const { environment } = checkout.config; - - const { track } = useAnalytics(); - // add default state from context values // if user has clicked back button const defaultFromBrowserProvider = from?.browserProvider ?? null; @@ -158,32 +151,10 @@ export function WalletAndNetworkSelector({ themeOverrides }: { themeOverrides: T setFromWalletBrowserProvider(provider); const address = await (await provider!.getSigner()).getAddress(); setFromWalletAddress(address.toLowerCase()); - - track({ - userJourney: UserJourney.BRIDGE, - screen: 'WalletAndNetwork', - control: 'FromWallet', - controlType: 'Select', - extras: { - walletAddress: address.toLowerCase(), - }, - }); - /** if Passport skip from network selector and default to zkEVM */ if (isPassportProvider(provider)) { setFromNetwork(imtblZkEvmNetworkChainId); - setFromWalletDrawerOpen(false); - - track({ - userJourney: UserJourney.BRIDGE, - screen: 'WalletAndNetwork', - control: 'FromNetwork', - controlType: 'Select', - extras: { - chainId: imtblZkEvmNetworkChainId, - }, - }); - return; + setFromWalletDrawerOpen(false); return; } /** @@ -224,16 +195,6 @@ export function WalletAndNetworkSelector({ themeOverrides }: { themeOverrides: T clearToWalletSelections(); setFromNetworkDrawerOpen(false); setFromNetwork(chainId); - - track({ - userJourney: UserJourney.BRIDGE, - screen: 'WalletAndNetwork', - control: 'FromNetwork', - controlType: 'Select', - extras: { - chainId, - }, - }); }, [checkout, fromWalletBrowserProvider], ); @@ -243,16 +204,6 @@ export function WalletAndNetworkSelector({ themeOverrides }: { themeOverrides: T if (!toWalletBrowserProvider) return; setToNetworkDrawerOpen(false); setToNetwork(chainId); - - track({ - userJourney: UserJourney.BRIDGE, - screen: 'WalletAndNetwork', - control: 'ToNetwork', - controlType: 'Select', - extras: { - chainId, - }, - }); }, [checkout, toWalletBrowserProvider], ); @@ -265,16 +216,6 @@ export function WalletAndNetworkSelector({ themeOverrides }: { themeOverrides: T : imtblZkEvmNetworkChainId; setToNetwork(theToNetwork); setToWalletDrawerOpen(false); - - track({ - userJourney: UserJourney.BRIDGE, - screen: 'WalletAndNetwork', - control: 'ToNetwork', - controlType: 'Select', - extras: { - chainId: theToNetwork, - }, - }); }, [fromWalletAddress, fromNetwork]); const handleWalletConnectToWalletConnection = useCallback( @@ -286,16 +227,6 @@ export function WalletAndNetworkSelector({ themeOverrides }: { themeOverrides: T .then((address) => { setToWalletAddress(address.toLowerCase()); handleSettingToNetwork(address.toLowerCase()); - - track({ - userJourney: UserJourney.BRIDGE, - screen: 'WalletAndNetwork', - control: 'ToWallet', - controlType: 'Select', - extras: { - walletAddress: address.toLowerCase(), - }, - }); }); }, [handleSettingToNetwork], @@ -309,18 +240,7 @@ export function WalletAndNetworkSelector({ themeOverrides }: { themeOverrides: T setToWallet(event); const address = await (await fromWalletBrowserProvider!.getSigner()).getAddress(); setToWalletAddress(address.toLowerCase()); - handleSettingToNetwork(address.toLowerCase()); - - track({ - userJourney: UserJourney.BRIDGE, - screen: 'WalletAndNetwork', - control: 'ToWallet', - controlType: 'Select', - extras: { - walletAddress: address.toLowerCase(), - }, - }); - return; + handleSettingToNetwork(address.toLowerCase()); return; } try { @@ -336,16 +256,6 @@ export function WalletAndNetworkSelector({ themeOverrides }: { themeOverrides: T setToWalletBrowserProvider(connectedProvider); setToWalletAddress(address.toLowerCase()); handleSettingToNetwork(address.toLowerCase()); - - track({ - userJourney: UserJourney.BRIDGE, - screen: 'WalletAndNetwork', - control: 'ToWallet', - controlType: 'Select', - extras: { - walletAddress: address.toLowerCase(), - }, - }); } } catch (error) { // eslint-disable-next-line no-console @@ -399,35 +309,6 @@ export function WalletAndNetworkSelector({ themeOverrides }: { themeOverrides: T }, }, }); - - track({ - userJourney: UserJourney.BRIDGE, - screen: 'WalletAndNetwork', - control: 'Next', - controlType: 'Button', - extras: { - fromWalletAddress, - fromNetwork, - fromWallet: { - address: fromWalletAddress, - rdns: fromWallet?.providerDetail.info.rdns, - uuid: fromWallet?.providerDetail.info.uuid, - isPassportWallet: isPassportProvider(fromWalletBrowserProvider), - isMetaMask: isMetaMaskProvider(fromWalletBrowserProvider), - }, - toWalletAddress, - toNetwork, - toWallet: { - address: toWalletAddress, - rdns: toWallet?.providerDetail.info.rdns, - uuid: toWallet?.providerDetail.info.uuid, - isPassportWallet: isPassportProvider(toWalletBrowserProvider), - isMetaMask: isMetaMaskProvider(toWalletBrowserProvider), - }, - moveType: fromNetwork && fromNetwork === toNetwork ? 'transfer' : 'bridge', - }, - }); - viewDispatch({ payload: { type: ViewActions.UPDATE_VIEW, diff --git a/packages/checkout/widgets-lib/src/widgets/bridge/views/ApproveTransaction.tsx b/packages/checkout/widgets-lib/src/widgets/bridge/views/ApproveTransaction.tsx index a665b7e9f8..48f59a9f91 100644 --- a/packages/checkout/widgets-lib/src/widgets/bridge/views/ApproveTransaction.tsx +++ b/packages/checkout/widgets-lib/src/widgets/bridge/views/ApproveTransaction.tsx @@ -2,14 +2,13 @@ import { Box } from '@biom3/react'; import { useCallback, useContext, - useEffect, + useState, } from 'react'; import { CheckoutErrorType } from '@imtbl/checkout-sdk'; import { ApproveBridgeResponse, BridgeTxResponse } from '@imtbl/bridge-sdk'; import { useTranslation } from 'react-i18next'; import { parseUnits } from 'ethers'; -import { UserJourney, useAnalytics } from '../../../context/analytics-provider/SegmentAnalyticsProvider'; import { SimpleLayout } from '../../../components/SimpleLayout/SimpleLayout'; import { HeaderNavigation } from '../../../components/Header/HeaderNavigation'; import { sendBridgeWidgetCloseEvent } from '../BridgeWidgetEvents'; @@ -49,19 +48,6 @@ export function ApproveTransaction({ bridgeTransaction }: ApproveTransactionProp } = bridgeState; const { viewDispatch } = useContext(ViewContext); const { eventTargetState: { eventTarget } } = useContext(EventTargetContext); - - const { page } = useAnalytics(); - - useEffect(() => { - page({ - userJourney: UserJourney.BRIDGE, - screen: 'ApproveTransaction', - extras: { - moveType: bridgeTransaction ? 'bridge' : 'transfer', - }, - }); - }, []); - // Local state const [actionDisabled, setActionDisabled] = useState(false); const [txProcessing, setTxProcessing] = useState(false); diff --git a/packages/checkout/widgets-lib/src/widgets/bridge/views/Bridge.tsx b/packages/checkout/widgets-lib/src/widgets/bridge/views/Bridge.tsx index 73c143a7a6..43ad89a45a 100644 --- a/packages/checkout/widgets-lib/src/widgets/bridge/views/Bridge.tsx +++ b/packages/checkout/widgets-lib/src/widgets/bridge/views/Bridge.tsx @@ -6,7 +6,6 @@ import { } from 'react'; import { ThemeOverrides, TokenFilterTypes, WidgetTheme } from '@imtbl/checkout-sdk'; import { useTranslation } from 'react-i18next'; -import { UserJourney, useAnalytics } from '../../../context/analytics-provider/SegmentAnalyticsProvider'; import { sendBridgeWidgetCloseEvent } from '../BridgeWidgetEvents'; import { SimpleLayout } from '../../../components/SimpleLayout/SimpleLayout'; import { HeaderNavigation } from '../../../components/Header/HeaderNavigation'; @@ -40,21 +39,7 @@ export function Bridge({ const { eventTargetState: { eventTarget } } = useContext(EventTargetContext); const [isTokenBalancesLoading, setIsTokenBalancesLoading] = useState(false); const showBackButton = true; - - const { page } = useAnalytics(); - - useEffect(() => { - if (amount || tokenAddress) { - page({ - userJourney: UserJourney.BRIDGE, - screen: 'TokenAmount', - extras: { - amount, - tokenAddress, - }, - }); - } - }, []); + useEffect(() => { }, []); // This is used to refresh the balances after the Bridge widget // has been loaded so that processing transfers will be eventually diff --git a/packages/checkout/widgets-lib/src/widgets/bridge/views/BridgeReview.tsx b/packages/checkout/widgets-lib/src/widgets/bridge/views/BridgeReview.tsx index 9bfb96b605..ec37a1e260 100644 --- a/packages/checkout/widgets-lib/src/widgets/bridge/views/BridgeReview.tsx +++ b/packages/checkout/widgets-lib/src/widgets/bridge/views/BridgeReview.tsx @@ -1,26 +1,15 @@ -import { useContext, useEffect } from 'react'; +import { useContext } from 'react'; import { useTranslation } from 'react-i18next'; import { HeaderNavigation } from '../../../components/Header/HeaderNavigation'; import { SimpleLayout } from '../../../components/SimpleLayout/SimpleLayout'; import { FooterLogo } from '../../../components/Footer/FooterLogo'; import { EventTargetContext } from '../../../context/event-target-context/EventTargetContext'; -import { UserJourney, useAnalytics } from '../../../context/analytics-provider/SegmentAnalyticsProvider'; import { sendBridgeWidgetCloseEvent } from '../BridgeWidgetEvents'; import { BridgeReviewSummary } from '../components/BridgeReviewSummary'; export function BridgeReview() { const { t } = useTranslation(); const { eventTargetState: { eventTarget } } = useContext(EventTargetContext); - - const { page } = useAnalytics(); - - useEffect(() => { - page({ - userJourney: UserJourney.BRIDGE, - screen: 'Review', - }); - }, []); - return ( { - page({ - userJourney: UserJourney.BRIDGE, - screen: 'ClaimWithdrawal', - }); - }, []); - const [txProcessing, setTxProcessing] = useState(false); const [loading, setLoading] = useState(false); const [hasWithdrawError, setHasWithdrawError] = useState(false); diff --git a/packages/checkout/widgets-lib/src/widgets/bridge/views/MoveInProgress.tsx b/packages/checkout/widgets-lib/src/widgets/bridge/views/MoveInProgress.tsx index e9316e7d0b..4fe9982f08 100644 --- a/packages/checkout/widgets-lib/src/widgets/bridge/views/MoveInProgress.tsx +++ b/packages/checkout/widgets-lib/src/widgets/bridge/views/MoveInProgress.tsx @@ -1,7 +1,6 @@ import { useContext, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { Badge, ButtCon } from '@biom3/react'; -import { UserJourney, useAnalytics } from '../../../context/analytics-provider/SegmentAnalyticsProvider'; import { ButtonNavigationStyles } from '../../../components/Header/HeaderStyles'; import { BridgeWidgetViews } from '../../../context/view-context/BridgeViewContextTypes'; import { ViewActions, ViewContext } from '../../../context/view-context/ViewContext'; @@ -13,8 +12,6 @@ import { sendBridgeTransactionSentEvent, sendBridgeWidgetCloseEvent } from '../B import { FooterLogo } from '../../../components/Footer/FooterLogo'; import { EventTargetContext } from '../../../context/event-target-context/EventTargetContext'; import { BridgeContext } from '../context/BridgeContext'; -import { calculateCryptoToFiat } from '../../../lib/utils'; -import { CryptoFiatContext } from '../../../context/crypto-fiat-context/CryptoFiatContext'; export interface MoveInProgressProps { transactionHash: string; @@ -24,17 +21,10 @@ export interface MoveInProgressProps { export function MoveInProgress({ transactionHash, isTransfer }: MoveInProgressProps) { const { t } = useTranslation(); const { eventTargetState: { eventTarget } } = useContext(EventTargetContext); - const { page } = useAnalytics(); - - const { cryptoFiatState } = useContext(CryptoFiatContext); const { viewDispatch } = useContext(ViewContext); const { bridgeState: { checkout, - from, - to, - token, - amount, }, } = useContext(BridgeContext); @@ -43,20 +33,6 @@ export function MoveInProgress({ transactionHash, isTransfer }: MoveInProgressPr eventTarget, transactionHash, ); - - const fiatAmount = calculateCryptoToFiat(amount, token?.symbol ?? '', cryptoFiatState.conversions); - page({ - userJourney: UserJourney.BRIDGE, - screen: 'InProgress', - extras: { - fromWalletAddress: from?.walletAddress, - toWalletAddress: to?.walletAddress, - amount, - fiatAmount, - tokenAddress: token?.address, - moveType: isTransfer ? 'transfer' : 'bridge', - }, - }); }, []); return ( diff --git a/packages/checkout/widgets-lib/src/widgets/bridge/views/WalletNetworkSelectionView.tsx b/packages/checkout/widgets-lib/src/widgets/bridge/views/WalletNetworkSelectionView.tsx index c1df76b629..7a64b445c6 100644 --- a/packages/checkout/widgets-lib/src/widgets/bridge/views/WalletNetworkSelectionView.tsx +++ b/packages/checkout/widgets-lib/src/widgets/bridge/views/WalletNetworkSelectionView.tsx @@ -1,4 +1,4 @@ -import { useContext, useEffect } from 'react'; +import { useContext } from 'react'; import { ButtCon } from '@biom3/react'; import { useTranslation } from 'react-i18next'; import { IMTBLWidgetEvents, ThemeOverrides } from '@imtbl/checkout-sdk'; @@ -9,7 +9,6 @@ import { EventTargetContext } from '../../../context/event-target-context/EventT import { BridgeWidgetViews } from '../../../context/view-context/BridgeViewContextTypes'; import { ButtonNavigationStyles } from '../../../components/Header/HeaderStyles'; import { ViewActions, ViewContext } from '../../../context/view-context/ViewContext'; -import { UserJourney, useAnalytics } from '../../../context/analytics-provider/SegmentAnalyticsProvider'; import { sendBridgeWidgetCloseEvent } from '../BridgeWidgetEvents'; import { WalletAndNetworkSelector } from '../components/WalletAndNetworkSelector'; import { orchestrationEvents } from '../../../lib/orchestrationEvents'; @@ -26,16 +25,6 @@ export function WalletNetworkSelectionView({ const { viewDispatch } = useContext(ViewContext); const { eventTargetState: { eventTarget } } = useContext(EventTargetContext); - - const { page } = useAnalytics(); - - useEffect(() => { - page({ - userJourney: UserJourney.BRIDGE, - screen: 'WalletNetworkSelection', - }); - }, []); - return ( ({ viewState, viewDispatch }), [viewState, viewDispatch], ); - - const { identify, page, user } = useAnalytics(); - const targetChain = targetChainId ?? checkout.config.l2ChainId; useEffect(() => { @@ -176,19 +171,8 @@ export default function ConnectWidget({ }, [isWalletConnectEnabled, ethereumProvider]); const handleConnectSuccess = useCallback(async () => { - if (!provider) return; - // WT-1698 Analytics - Identify user here - page({ - userJourney: UserJourney.CONNECT, - screen: 'ConnectSuccess', - }); - // Set up EIP-1193 provider event listeners for widget root instances + if (!provider) return; // Set up EIP-1193 provider event listeners for widget root instances addProviderListenersForWidgetRoot(provider); - - const userData = user ? await user() : undefined; - const anonymousId = userData?.anonymousId(); - - await identifyUser(identify, provider, { anonymousId }); sendProviderUpdatedEvent({ provider }); // Find the wallet provider info via injected with Passport and MetaMask fallbacks @@ -206,7 +190,7 @@ export default function ConnectWidget({ return; } sendConnectSuccessEvent(eventTarget, provider, walletProviderName ?? undefined, walletProviderInfo); - }, [provider, identify]); + }, [provider]); return ( diff --git a/packages/checkout/widgets-lib/src/widgets/connect/ConnectWidgetRoot.tsx b/packages/checkout/widgets-lib/src/widgets/connect/ConnectWidgetRoot.tsx index 52847456eb..655361135b 100644 --- a/packages/checkout/widgets-lib/src/widgets/connect/ConnectWidgetRoot.tsx +++ b/packages/checkout/widgets-lib/src/widgets/connect/ConnectWidgetRoot.tsx @@ -3,7 +3,6 @@ import { ConnectWidgetParams, IMTBLWidgetEvents, WidgetProperties, WidgetType, } from '@imtbl/checkout-sdk'; import { ThemeProvider } from '../../components/ThemeProvider/ThemeProvider'; -import { CustomAnalyticsProvider } from '../../context/analytics-provider/CustomAnalyticsProvider'; import { LoadingView } from '../../views/loading/LoadingView'; import { getChainNameById } from '../../lib/chains'; import { HandoverProvider } from '../../context/handover-context/HandoverProvider'; @@ -46,21 +45,21 @@ export class Connect extends Base { this.reactRoot.render( - - - - }> - - - - - + + + + }> + + + + + , ); } diff --git a/packages/checkout/widgets-lib/src/widgets/connect/components/WalletList.tsx b/packages/checkout/widgets-lib/src/widgets/connect/components/WalletList.tsx index 8ccff73ff0..f3cd79a51d 100644 --- a/packages/checkout/widgets-lib/src/widgets/connect/components/WalletList.tsx +++ b/packages/checkout/widgets-lib/src/widgets/connect/components/WalletList.tsx @@ -28,10 +28,6 @@ import { ViewActions, ViewContext, } from '../../../context/view-context/ViewContext'; -import { - useAnalytics, - UserJourney, -} from '../../../context/analytics-provider/SegmentAnalyticsProvider'; import { useWalletConnect } from '../../../lib/hooks/useWalletConnect'; import { useInjectedProviders } from '../../../lib/hooks/useInjectedProviders'; import { walletListStyle } from './WalletListStyles'; @@ -48,9 +44,8 @@ import { WalletDrawer } from '../../../components/WalletDrawer/WalletDrawer'; import { WalletChangeEvent } from '../../../components/WalletDrawer/WalletDrawerEvents'; import { WalletConnectItem } from './WalletConnectItem'; import { BrowserWalletItem } from './BrowserWalletItem'; -import { identifyUser } from '../../../lib/analytics/identifyUser'; import { NonPassportWarningDrawer } from './NonPassportWarningDrawer'; -import { removeSpace } from '../../../lib/utils'; +import { } from '../../../lib/utils'; export interface WalletListProps { targetWalletRdns?: string; @@ -83,9 +78,7 @@ export function WalletList(props: WalletListProps) { connectDispatch, connectState: { checkout }, } = useContext(ConnectContext); - const { viewDispatch } = useContext(ViewContext); - const { track, identify, user } = useAnalytics(); - const { providers } = useInjectedProviders({ checkout }); + const { viewDispatch } = useContext(ViewContext); const { providers } = useInjectedProviders({ checkout }); const [showWalletDrawer, setShowWalletDrawer] = useState(false); const { isWalletConnectEnabled, openWalletConnectModal } = useWalletConnect(); const walletConnectItemRef = useRef(null); @@ -191,13 +184,7 @@ export function WalletList(props: WalletListProps) { }); // Set up EIP-1193 provider event listeners for widget root instances - addProviderListenersForWidgetRoot(connectResult.provider); - - const userData = user ? await user() : undefined; - const anonymousId = userData?.anonymousId(); - await identifyUser(identify, connectResult.provider, { anonymousId }); - - selectBrowserProvider( + addProviderListenersForWidgetRoot(connectResult.provider); selectBrowserProvider( browserProvider, getProviderSlugFromRdns(providerDetail.info.rdns), ); @@ -258,12 +245,6 @@ export function WalletList(props: WalletListProps) { }; const handleWalletConnectConnection = async () => { - track({ - userJourney: UserJourney.CONNECT, - screen: 'ConnectWallet', - control: 'WalletConnect', - controlType: 'MenuItem', - }); await openWalletConnectModal({ connectCallback, restoreSession: false, @@ -272,19 +253,7 @@ export function WalletList(props: WalletListProps) { const handleWalletChange = async (event: WalletChangeEvent) => { const { providerDetail } = event; - setChosenProviderDetail(providerDetail); - track({ - userJourney: UserJourney.CONNECT, - screen: 'ConnectWallet', - control: removeSpace(providerDetail.info.name), - controlType: 'MenuItem', - extras: { - wallet: getProviderSlugFromRdns(providerDetail.info.rdns), - walletRdns: providerDetail.info.rdns, - walletUuid: providerDetail.info.uuid, - }, - }); - await selectProviderDetail(providerDetail); + setChosenProviderDetail(providerDetail); await selectProviderDetail(providerDetail); setShowWalletDrawer(false); }; @@ -303,21 +272,9 @@ export function WalletList(props: WalletListProps) { setShowChangedYourMindDrawer(false); setShowUnableToConnectDrawer(false); - setChosenProviderDetail(providerDetail); - track({ - userJourney: UserJourney.CONNECT, - screen: 'ConnectWallet', - control: removeSpace(providerDetail.info.name), - controlType: 'MenuItem', - extras: { - wallet: getProviderSlugFromRdns(providerDetail.info.rdns), - walletRdns: providerDetail.info.rdns, - walletUuid: providerDetail.info.uuid, - }, - }); - await selectProviderDetail(providerDetail); + setChosenProviderDetail(providerDetail); await selectProviderDetail(providerDetail); }, - [track, checkout], + [checkout], ); const onChosenProviderDetailChange = useCallback(() => { @@ -326,14 +283,8 @@ export function WalletList(props: WalletListProps) { }, [chosenProviderDetail]); const onBrowserWalletsClick = useCallback(() => { - track({ - userJourney: UserJourney.CONNECT, - screen: 'ConnectWallet', - control: 'BrowserWallets', - controlType: 'MenuItem', - }); setShowWalletDrawer(true); - }, [track]); + }, []); useEffect(() => { // Auto-trigger wallet connection via rdns diff --git a/packages/checkout/widgets-lib/src/widgets/connect/views/ConnectWallet.tsx b/packages/checkout/widgets-lib/src/widgets/connect/views/ConnectWallet.tsx index afbd652bae..62fd226b01 100644 --- a/packages/checkout/widgets-lib/src/widgets/connect/views/ConnectWallet.tsx +++ b/packages/checkout/widgets-lib/src/widgets/connect/views/ConnectWallet.tsx @@ -1,4 +1,4 @@ -import { useContext, useEffect } from 'react'; +import { useContext } from 'react'; import { Body, Box, Heading } from '@biom3/react'; import { useTranslation } from 'react-i18next'; import { ChainId, ThemeOverrides } from '@imtbl/checkout-sdk'; @@ -7,7 +7,6 @@ import { HeaderNavigation } from '../../../components/Header/HeaderNavigation'; import { SimpleLayout } from '../../../components/SimpleLayout/SimpleLayout'; import { WalletList } from '../components/WalletList'; import { ConnectContext } from '../context/ConnectContext'; -import { UserJourney, useAnalytics } from '../../../context/analytics-provider/SegmentAnalyticsProvider'; export interface ConnectWalletProps { targetWalletRdns?: string, @@ -36,16 +35,6 @@ export function ConnectWallet({ const { connectState: { sendCloseEvent }, } = useContext(ConnectContext); - - const { page } = useAnalytics(); - - useEffect(() => { - page({ - userJourney: UserJourney.CONNECT, - screen: 'ConnectWallet', - }); - }, []); - return ( { - page({ - userJourney: UserJourney.CONNECT, - screen: 'ReadyToConnect', - }); - }, []); - // make sure wallet provider name is set if coming directly to this screen // and not through the wallet list useEffect(() => { @@ -127,13 +113,6 @@ export function ReadyToConnect({ targetChainId, allowedChains }: ReadyToConnectP setLoading(true); try { - track({ - userJourney: UserJourney.CONNECT, - screen: 'ReadyToConnect', - control: 'Connect', - controlType: 'Button', - }); - let changeAccount = false; if (isMetaMaskProvider(provider)) { changeAccount = true; @@ -145,13 +124,7 @@ export function ReadyToConnect({ targetChainId, allowedChains }: ReadyToConnectP }); // Set up EIP-1193 provider event listeners for widget root instances - addProviderListenersForWidgetRoot(connectResult.provider); - - const userData = user ? await user() : undefined; - const anonymousId = userData?.anonymousId(); - await identifyUser(identify, connectResult.provider, { anonymousId }); - - connectDispatch({ + addProviderListenersForWidgetRoot(connectResult.provider); connectDispatch({ payload: { type: ConnectActions.SET_PROVIDER, provider: connectResult.provider, @@ -164,7 +137,7 @@ export function ReadyToConnect({ targetChainId, allowedChains }: ReadyToConnectP setLoading(false); setFooterButtonTextKey(`${textView()}.footer.buttonText2`); } - }, [checkout, provider, connectDispatch, viewDispatch, identify]); + }, [checkout, provider, connectDispatch, viewDispatch]); return ( { - page({ - userJourney: UserJourney.CONNECT, - screen: 'SwitchNetworkEth', - }); - }, []); - const switchNetwork = useCallback(async () => { - if (!provider || !checkout) return; - - track({ - userJourney: UserJourney.CONNECT, - screen: 'SwitchNetworkEth', - control: 'Switch', - controlType: 'Button', - }); - try { + if (!provider || !checkout) return; try { const switchRes = await checkout.switchNetwork({ provider, chainId: checkout.config.l1ChainId, @@ -65,7 +46,7 @@ export function SwitchNetworkEth() { } catch (err: any) { setButtonTextKey(t('views.SWITCH_NETWORK.eth.button.retryText')); } - }, [provider, checkout, track]); + }, [provider, checkout]); return ( { - page({ - userJourney: UserJourney.CONNECT, - screen: 'SwitchNetworkZkEVM', - }); - }, []); - useEffect(() => { if (!provider || !checkout) return; @@ -65,14 +55,6 @@ export function SwitchNetworkZkEVM() { const switchNetwork = useCallback(async () => { if (!provider || !checkout) return; - - track({ - userJourney: UserJourney.CONNECT, - screen: 'SwitchNetworkZkEVM', - control: 'Switch', - controlType: 'Button', - }); - if (!provider.send) return; const currentChainId = await provider.send('eth_chainId', []) as `0x${string}`; diff --git a/packages/checkout/widgets-lib/src/widgets/immutable-commerce/CommerceWidgetRoot.tsx b/packages/checkout/widgets-lib/src/widgets/immutable-commerce/CommerceWidgetRoot.tsx index cf5f4ce178..50e077c95a 100644 --- a/packages/checkout/widgets-lib/src/widgets/immutable-commerce/CommerceWidgetRoot.tsx +++ b/packages/checkout/widgets-lib/src/widgets/immutable-commerce/CommerceWidgetRoot.tsx @@ -19,7 +19,6 @@ import { import React, { Suspense } from 'react'; import { isAddress } from 'ethers'; import { ThemeProvider } from '../../components/ThemeProvider/ThemeProvider'; -import { CustomAnalyticsProvider } from '../../context/analytics-provider/CustomAnalyticsProvider'; import { HandoverProvider } from '../../context/handover-context/HandoverProvider'; import { LoadingView } from '../../views/loading/LoadingView'; import { Base } from '../BaseWidgetRoot'; @@ -305,25 +304,24 @@ export class CommerceWidgetRoot extends Base { const { t } = i18n; this.reactRoot.render( - - - - + + + } - > - - - - - , + > + + + + + , ); } } diff --git a/packages/checkout/widgets-lib/src/widgets/on-ramp/OnRampWidget.tsx b/packages/checkout/widgets-lib/src/widgets/on-ramp/OnRampWidget.tsx index de846641e5..f38b61f230 100644 --- a/packages/checkout/widgets-lib/src/widgets/on-ramp/OnRampWidget.tsx +++ b/packages/checkout/widgets-lib/src/widgets/on-ramp/OnRampWidget.tsx @@ -3,7 +3,6 @@ import { } from 'react'; import { IMTBLWidgetEvents, OnRampWidgetParams, OnrampWidgetConfiguration } from '@imtbl/checkout-sdk'; import { useTranslation } from 'react-i18next'; -import { UserJourney } from '../../context/analytics-provider/SegmentAnalyticsProvider'; import { NATIVE } from '../../lib'; import { StrongCheckoutWidgetsConfig } from '../../lib/withDefaultWidgetConfig'; import { @@ -149,7 +148,6 @@ export default function OnRampWidget({ {viewState.view.type === SharedViews.TOP_UP_VIEW && ( { this.reactRoot.render( - - - - sendOnRampWidgetCloseEvent(window)} - goBackEvent={() => this.goBackEvent(window)} - showBackButton={this.parameters.showBackButton} - > - }> - - - - - - + + + + sendOnRampWidgetCloseEvent(window)} + goBackEvent={() => this.goBackEvent(window)} + showBackButton={this.parameters.showBackButton} + > + }> + + + + + + , ); } diff --git a/packages/checkout/widgets-lib/src/widgets/on-ramp/views/OnRampMain.tsx b/packages/checkout/widgets-lib/src/widgets/on-ramp/views/OnRampMain.tsx index 83fa969f6f..397ec73b90 100644 --- a/packages/checkout/widgets-lib/src/widgets/on-ramp/views/OnRampMain.tsx +++ b/packages/checkout/widgets-lib/src/widgets/on-ramp/views/OnRampMain.tsx @@ -21,10 +21,6 @@ import { } from '../../../context/view-context/ViewContext'; import { OnRampWidgetViews } from '../../../context/view-context/OnRampViewContextTypes'; import { boxMainStyle, containerStyle } from './onRampStyles'; -import { - useAnalytics, - UserJourney, -} from '../../../context/analytics-provider/SegmentAnalyticsProvider'; import { TransakEventData, TransakEvents, @@ -34,7 +30,6 @@ import { ConnectLoaderContext } from '../../../context/connect-loader-context/Co import { EventTargetContext } from '../../../context/event-target-context/EventTargetContext'; import { TRANSAK_ORIGIN } from '../../../components/Transak/useTransakEvents'; import { orchestrationEvents } from '../../../lib/orchestrationEvents'; -import { isPassportProvider } from '../../../lib/provider'; const transakIframeId = 'transak-iframe'; const IN_PROGRESS_VIEW_DELAY_MS = 6000; // 6 second @@ -80,17 +75,6 @@ function useWidgetUrl( return widgetUrl; } -function useWalletAddress(provider: WrappedBrowserProvider | undefined) { - const [userWalletAddress, setUserWalletAddress] = useState(undefined); - - useEffect(() => { - if (!provider) return; - provider.getSigner().then((signer) => signer.getAddress()).then(setUserWalletAddress); - }, [provider]); - - return userWalletAddress; -} - export function OnRampMain({ passport, showIframe, @@ -111,12 +95,9 @@ export function OnRampMain({ const { t } = useTranslation(); const { viewState, viewDispatch } = useContext(ViewContext); const widgetUrl = useWidgetUrl(checkout, provider, tokenAddress, tokenAmount, passport, showMenu, customSubTitle); - const userWalletAddress = useWalletAddress(provider); const eventTimer = useRef(); - const isPassport = !!passport && isPassportProvider(provider); - const openedFromTopUpView = useMemo( () => viewState.history.length > 2 && viewState.history[viewState.history.length - 2].type @@ -125,76 +106,6 @@ export function OnRampMain({ ); const showBack = showBackButton || openedFromTopUpView; - - const { track } = useAnalytics(); - - const trackSegmentEvents = useCallback(async ( - event: TransakEventData, - walletAddress: string, - ) => { - const miscProps = { - userId: walletAddress.toLowerCase(), - isPassportWallet: isPassport, - }; - switch (event.event_id) { - case TransakEvents.TRANSAK_WIDGET_OPEN: - track({ - userJourney: UserJourney.ON_RAMP, - screen: 'InputScreen', - control: 'TransakWidgetOpen', - controlType: 'IframeEvent', - extras: { ...miscProps }, - }); // checkoutOnRampInputScreen_TransakWidgetOpenIframeEvent - break; - case TransakEvents.TRANSAK_ORDER_CREATED: - track({ - userJourney: UserJourney.ON_RAMP, - screen: 'InputScreen', - control: 'OrderCreated', - controlType: 'IframeEvent', - extras: { ...miscProps }, - }); // checkoutOnRampInputScreen_OrderCreatedIframeEvent - break; - case TransakEvents.TRANSAK_ORDER_SUCCESSFUL: - if (event.data.status === TransakStatuses.PROCESSING) { - // user paid - track({ - userJourney: UserJourney.ON_RAMP, - screen: 'OrderInProgress', - control: 'PaymentProcessing', - controlType: 'IframeEvent', - extras: { - ...miscProps, - transactionHash: event.data.transactionHash, - }, - }); // checkoutOnRampOrderInProgress_PaymentProcessingIframeEvent - } - if (event.data.status === TransakStatuses.COMPLETED) { - track({ - userJourney: UserJourney.ON_RAMP, - screen: 'Success', - control: 'PaymentCompleted', - controlType: 'IframeEvent', - extras: { - ...miscProps, - transactionHash: event.data.transactionHash, - }, - }); // checkoutOnRampSuccess_PaymentCompletedIframeEvent - } - break; - case TransakEvents.TRANSAK_ORDER_FAILED: // payment failed - track({ - userJourney: UserJourney.ON_RAMP, - screen: 'Failure', - control: 'PaymentFailed', - controlType: 'IframeEvent', - extras: { ...miscProps }, - }); // checkoutOnRampFailure_PaymentFailedIframeEvent - break; - default: - } - }, [isPassport, track]); - const transakEventHandler = useCallback((event: TransakEventData) => { if (eventTimer.current) clearTimeout(eventTimer.current); @@ -291,7 +202,6 @@ export function OnRampMain({ && host && TRANSAK_ORIGIN.includes(host) ) { - trackSegmentEvents(event.data, userWalletAddress ?? ''); transakEventHandler(event.data); } }; @@ -302,7 +212,7 @@ export function OnRampMain({ return () => { window.removeEventListener('message', handleTransakEvents); }; - }, [trackSegmentEvents, transakEventHandler, userWalletAddress]); + }, [transakEventHandler]); return ( diff --git a/packages/checkout/widgets-lib/src/widgets/purchase/PurchaseWidgetRoot.tsx b/packages/checkout/widgets-lib/src/widgets/purchase/PurchaseWidgetRoot.tsx index e9fa2baf3a..bf264db7fc 100644 --- a/packages/checkout/widgets-lib/src/widgets/purchase/PurchaseWidgetRoot.tsx +++ b/packages/checkout/widgets-lib/src/widgets/purchase/PurchaseWidgetRoot.tsx @@ -9,7 +9,6 @@ import { import React, { Suspense } from 'react'; import { Base } from '../BaseWidgetRoot'; import i18n from '../../i18n'; -import { CustomAnalyticsProvider } from '../../context/analytics-provider/CustomAnalyticsProvider'; import { ThemeProvider } from '../../components/ThemeProvider/ThemeProvider'; import { HandoverProvider } from '../../context/handover-context/HandoverProvider'; import { ProvidersContextProvider } from '../../context/providers-context/ProvidersContext'; @@ -70,29 +69,29 @@ export class Purchase extends Base { this.reactRoot.render( - - - - - + + + + + } - > - - - - - - + > + + + + + + , ); } diff --git a/packages/checkout/widgets-lib/src/widgets/purchase/components/PurchaseConnectWalletDrawer.tsx b/packages/checkout/widgets-lib/src/widgets/purchase/components/PurchaseConnectWalletDrawer.tsx index 991e500cc0..b10fa000c3 100644 --- a/packages/checkout/widgets-lib/src/widgets/purchase/components/PurchaseConnectWalletDrawer.tsx +++ b/packages/checkout/widgets-lib/src/widgets/purchase/components/PurchaseConnectWalletDrawer.tsx @@ -12,12 +12,10 @@ import { MenuItemProps } from '@biom3/react'; import { UnableToConnectDrawer } from '../../../components/UnableToConnectDrawer/UnableToConnectDrawer'; import { WalletDrawer } from '../../../components/WalletDrawer/WalletDrawer'; import { WalletChangeEvent } from '../../../components/WalletDrawer/WalletDrawerEvents'; -import { useAnalytics, UserJourney } from '../../../context/analytics-provider/SegmentAnalyticsProvider'; import { useProvidersContext, ProvidersContextActions } from '../../../context/providers-context/ProvidersContext'; -import { identifyUser } from '../../../lib/analytics/identifyUser'; import { ConnectEIP6963ProviderError, connectEIP6963Provider } from '../../../lib/connectEIP6963Provider'; -import { getProviderSlugFromRdns } from '../../../lib/provider'; -import { removeSpace } from '../../../lib/utils'; +import { } from '../../../lib/provider'; +import { } from '../../../lib/utils'; type PurchaseConnectWalletDrawerProps = { heading: string; @@ -28,7 +26,6 @@ type PurchaseConnectWalletDrawerProps = { providerInfo: EIP6963ProviderInfo ) => void; onError?: (errorType: ConnectEIP6963ProviderError) => void; - providerType: 'from' | 'to'; walletOptions: EIP6963ProviderDetail[]; bottomSlot?: ReactNode; menuItemSize?: MenuItemProps['size']; @@ -36,7 +33,6 @@ type PurchaseConnectWalletDrawerProps = { label: string; rdns: string; }[]; - shouldIdentifyUser?: boolean; drawerBackground: string | undefined; }; @@ -46,21 +42,16 @@ export function PurchaseConnectWalletDrawer({ onClose, onConnect, onError, - providerType, walletOptions, bottomSlot, menuItemSize = 'small', disabledOptions = [], - shouldIdentifyUser = true, drawerBackground, }: PurchaseConnectWalletDrawerProps) { const { providersState: { checkout }, providersDispatch, } = useProvidersContext(); - - const { identify, track, user } = useAnalytics(); - const prevWalletChangeEvent = useRef(); const [showUnableToConnectDrawer, setShowUnableToConnectDrawer] = useState(false); @@ -94,20 +85,6 @@ export function PurchaseConnectWalletDrawer({ const handleWalletConnection = async (event: WalletChangeEvent) => { const { providerDetail } = event; const { info } = providerDetail; - - // Trigger analytics connect wallet, menu item, with wallet details - track({ - userJourney: UserJourney.CONNECT, - screen: 'ConnectWallet', - control: removeSpace(info.name), - controlType: 'MenuItem', - extras: { - providerType, - wallet: getProviderSlugFromRdns(info.rdns), - walletRdns: info.rdns, - }, - }); - if (info.rdns === WalletProviderRdns.PASSPORT) { const { isConnected } = await checkout.checkIsWalletConnected({ provider: new WrappedBrowserProvider(providerDetail.provider!), @@ -126,15 +103,6 @@ export function PurchaseConnectWalletDrawer({ checkout, true, ); - - // Identify connected wallet, retaining current anonymousId - if (shouldIdentifyUser) { - const userData = user ? await user() : undefined; - const anonymousId = userData?.anonymousId(); - - await identifyUser(identify, provider, { anonymousId }); - } - // Store selected provider as fromProvider in context address = await setProviderInContext(provider, providerDetail.info); diff --git a/packages/checkout/widgets-lib/src/widgets/purchase/components/PurchaseDeliverToWalletDrawer.tsx b/packages/checkout/widgets-lib/src/widgets/purchase/components/PurchaseDeliverToWalletDrawer.tsx index 76af5d4e26..69775d3865 100644 --- a/packages/checkout/widgets-lib/src/widgets/purchase/components/PurchaseDeliverToWalletDrawer.tsx +++ b/packages/checkout/widgets-lib/src/widgets/purchase/components/PurchaseDeliverToWalletDrawer.tsx @@ -38,7 +38,6 @@ export function PurchaseDeliverToWalletDrawer({ heading={t('drawers.wallet.deliverToHeading')} visible={visible} onClose={onClose} - providerType="to" walletOptions={walletOptions} onConnect={handleOnConnect} drawerBackground={drawerBackground} diff --git a/packages/checkout/widgets-lib/src/widgets/purchase/components/PurchasePayWithWalletDrawer.tsx b/packages/checkout/widgets-lib/src/widgets/purchase/components/PurchasePayWithWalletDrawer.tsx index bd7dad8550..874b17cb5d 100644 --- a/packages/checkout/widgets-lib/src/widgets/purchase/components/PurchasePayWithWalletDrawer.tsx +++ b/packages/checkout/widgets-lib/src/widgets/purchase/components/PurchasePayWithWalletDrawer.tsx @@ -75,12 +75,10 @@ export function PurchasePayWithWalletDrawer({ } visible={visible} onClose={onClose} - providerType="from" walletOptions={walletOptions} disabledOptions={disabledOptions} bottomSlot={payWithCardItem} onConnect={handleOnConnect} - shouldIdentifyUser={false} drawerBackground={drawerBackground} /> ); diff --git a/packages/checkout/widgets-lib/src/widgets/purchase/components/PurchaseRouteOptionsDrawer/RouteOptionsDrawer.tsx b/packages/checkout/widgets-lib/src/widgets/purchase/components/PurchaseRouteOptionsDrawer/RouteOptionsDrawer.tsx index 6cd4ba9bbd..699ffeb3dc 100644 --- a/packages/checkout/widgets-lib/src/widgets/purchase/components/PurchaseRouteOptionsDrawer/RouteOptionsDrawer.tsx +++ b/packages/checkout/widgets-lib/src/widgets/purchase/components/PurchaseRouteOptionsDrawer/RouteOptionsDrawer.tsx @@ -3,10 +3,9 @@ import { } from '@biom3/react'; import { motion } from 'framer-motion'; import { - useContext, useEffect, useRef, useState, + useRef, useState, } from 'react'; import { Checkout } from '@imtbl/checkout-sdk'; -import { useAnalytics, UserJourney } from '../../../../context/analytics-provider/SegmentAnalyticsProvider'; import { useProvidersContext } from '../../../../context/providers-context/ProvidersContext'; import { listVariants } from '../../../../lib/animation/listAnimation'; import { Chain, RouteData } from '../../../../lib/squid/types'; @@ -14,7 +13,6 @@ import { DirectCryptoPayData, DirectCryptoPayOptionType, FiatOptionType, SquidRouteOptionType, } from '../../types'; import { RouteOptions } from './RouteOptions'; -import { PurchaseContext } from '../../context/PurchaseContext'; type OptionsDrawerProps = { checkout: Checkout; @@ -53,12 +51,6 @@ export function RouteOptionsDrawer({ insufficientBalance, directCryptoPayRoutes, }: OptionsDrawerProps) { - const { track } = useAnalytics(); - - const { - purchaseState: { id }, - } = useContext(PurchaseContext); - const { providersState: { fromProviderInfo, fromAddress }, } = useProvidersContext(); @@ -84,27 +76,6 @@ export function RouteOptionsDrawer({ onChangeWalletClick(); }; - useEffect(() => { - if (!visible) { - return; - } - - track({ - userJourney: UserJourney.PURCHASE, - screen: 'InputScreen', - control: 'RoutesMenu', - controlType: 'MenuItem', - action: 'Opened', - extras: { - contextId: id, - showOnrampOption: Boolean(showOnrampOption), - showSwapOption: Boolean(showSwapOption), - insufficientBalance: Boolean(insufficientBalance), - routesAvailable: routes?.length ?? 0, - }, - }); - }, [visible]); - return ( txn.methodCall.startsWith('execute')); @@ -73,7 +70,6 @@ export function WithCard(props: WithCardProps) { type="nft-checkout" email={recipientEmail} walletAddress={recipientAddress} - isPassportWallet={isPassportWallet} exchangeScreenTitle={t('views.PAY_WITH_CARD.screenTitle')} nftData={nftData} calldata={executeTxn.rawData} diff --git a/packages/checkout/widgets-lib/src/widgets/purchase/views/Purchase.tsx b/packages/checkout/widgets-lib/src/widgets/purchase/views/Purchase.tsx index cbbfe15d6a..12eca284a0 100644 --- a/packages/checkout/widgets-lib/src/widgets/purchase/views/Purchase.tsx +++ b/packages/checkout/widgets-lib/src/widgets/purchase/views/Purchase.tsx @@ -14,7 +14,6 @@ import { } from 'react'; import { TokenBalance } from '@0xsquid/sdk/dist/types'; import { SimpleLayout } from '../../../components/SimpleLayout/SimpleLayout'; -import { UserJourney } from '../../../context/analytics-provider/SegmentAnalyticsProvider'; import { CryptoFiatContext, CryptoFiatActions } from '../../../context/crypto-fiat-context/CryptoFiatContext'; import { EventTargetContext } from '../../../context/event-target-context/EventTargetContext'; import { useProvidersContext } from '../../../context/providers-context/ProvidersContext'; @@ -124,7 +123,7 @@ export function Purchase({ const { getAllowance, approve, execute, getStatus, - } = useExecute(UserJourney.PURCHASE, (err) => { + } = useExecute('Purchase', (err) => { // eslint-disable-next-line no-console console.log('useExecute err', err); }); diff --git a/packages/checkout/widgets-lib/src/widgets/sale/SaleWidget.tsx b/packages/checkout/widgets-lib/src/widgets/sale/SaleWidget.tsx index ae9a4a54c4..1deb872e65 100644 --- a/packages/checkout/widgets-lib/src/widgets/sale/SaleWidget.tsx +++ b/packages/checkout/widgets-lib/src/widgets/sale/SaleWidget.tsx @@ -33,7 +33,6 @@ import { PaymentMethods } from './views/PaymentMethods'; import { SaleErrorView } from './views/SaleErrorView'; import { CryptoFiatProvider } from '../../context/crypto-fiat-context/CryptoFiatProvider'; import { TopUpView } from '../../views/top-up/TopUpView'; -import { UserJourney } from '../../context/analytics-provider/SegmentAnalyticsProvider'; import { sendSaleWidgetCloseEvent } from './SaleWidgetEvents'; import { EventTargetContext } from '../../context/event-target-context/EventTargetContext'; import { OrderSummary } from './views/OrderSummary'; @@ -171,7 +170,6 @@ export default function SaleWidget(props: SaleWidgetProps) { )} {viewState.view.type === SharedViews.TOP_UP_VIEW && ( { this.reactRoot.render( - - - - { - sendSaleWidgetCloseEvent(window); - }} - > - + + + + { + sendSaleWidgetCloseEvent(window); + }} + > + } - > - + - - - - - + /> + + + + + , ); } diff --git a/packages/checkout/widgets-lib/src/widgets/sale/components/OrderReview.tsx b/packages/checkout/widgets-lib/src/widgets/sale/components/OrderReview.tsx index 6106eabbe1..65c12b38cd 100644 --- a/packages/checkout/widgets-lib/src/widgets/sale/components/OrderReview.tsx +++ b/packages/checkout/widgets-lib/src/widgets/sale/components/OrderReview.tsx @@ -10,8 +10,7 @@ import { TransactionRequirement, } from '@imtbl/checkout-sdk'; import { - OrderSummarySubViews, - SaleWidgetViews, + } from '../../../context/view-context/SaleViewContextTypes'; import { calculateCryptoToFiat, tokenValueFormat } from '../../../lib/utils'; import { HeaderNavigation } from '../../../components/Header/HeaderNavigation'; @@ -29,8 +28,6 @@ import { } from '../functions/fundingBalanceFees'; import { FeesDisplay, OrderFees } from './OrderFees'; import { useSaleContext } from '../context/SaleContextProvider'; -import { getPaymentTokenDetails } from '../utils/analytics'; -import { useMount } from '../../../hooks/useMount'; type OrderReviewProps = { collectionName: string; @@ -67,7 +64,7 @@ export function OrderReview({ selectedCurrency, config: { theme, environment }, } = useSaleContext(); - const { sendSelectedPaymentToken, sendViewFeesEvent, sendPageView } = useSaleEvent(); + const { sendSelectedPaymentToken } = useSaleEvent(); const [showCoinsDrawer, setShowCoinsDrawer] = useState(false); const [selectedCurrencyIndex, setSelectedCurrencyIndex] = useState(0); @@ -92,7 +89,6 @@ export function OrderReview({ setSelectedCurrencyIndex(selectedIndex); sendSelectedPaymentToken( - OrderSummarySubViews.REVIEW_ORDER, fundingBalances[selectedIndex], conversions, ); @@ -175,27 +171,6 @@ export function OrderReview({ }); }, [gasFees, fundingBalance, conversions]); - // Trigger page loaded event - useMount( - () => { - const tokens = fundingBalances.map((fb) => getPaymentTokenDetails(fb, conversions)); - sendPageView(SaleWidgetViews.ORDER_SUMMARY, { - subView: OrderSummarySubViews.REVIEW_ORDER, - tokens, - items, - collectionName, - }); - // checkoutPrimarySaleOrderSummaryViewed - }, - () => Boolean( - items.length - && fundingBalances.length - && !loadingBalances - && conversions.size, - ), - [items, fundingBalances, loadingBalances, conversions], - ); - const multiple = items.length > 1; const withFees = transactionFees.formattedFees.length > 0; @@ -257,7 +232,6 @@ export function OrderReview({ borderTopWidth: 'base.border.size.200', borderTopColor: 'base.color.translucent.inverse.1000', }} - onFeesClick={() => sendViewFeesEvent(SaleWidgetViews.ORDER_SUMMARY)} /> )} @@ -274,7 +248,6 @@ export function OrderReview({ borderTopWidth: 'base.border.size.100', borderTopColor: 'base.color.translucent.emphasis.400', }} - onFeesClick={() => sendViewFeesEvent(SaleWidgetViews.ORDER_SUMMARY)} /> )} { - const { track, page } = useAnalytics(); - const { - recipientAddress: userId, - signResponse, - paymentMethod, - } = useSaleContext(); + const { paymentMethod } = useSaleContext(); const { eventTargetState: { eventTarget }, } = useContext(EventTargetContext); - const defaultView = SaleWidgetViews.PAYMENT_METHODS; - const commonProps = { - location: 'web', - userJourney: UserJourney.SALE, - }; - const userProps = { - userId, - paymentMethod, - }; - const orderProps = { - amount: signResponse?.order.totalAmount, - currency: signResponse?.order.currency.name, - }; - const sendCloseEvent = ( - screen: string = defaultView, - controlType: AnalyticsControlTypes = 'Button', - action: StandardAnalyticsActions = 'Pressed', - ) => { - track({ - ...commonProps, - screen: toPascalCase(screen), - control: 'Close', - controlType, - action, - extras: { - ...userProps, - }, - }); + const sendCloseEvent = () => { sendSaleWidgetCloseEvent(eventTarget); }; const sendSuccessEvent = ( - screen: string = defaultView, transactions: ExecutedTransaction[] = [], tokenIds: string[] = [], details: Record = {}, ) => { - track({ - ...commonProps, - screen: toPascalCase(screen), - control: 'Success', - controlType: 'Event', - action: 'Succeeded', - extras: { - ...details, - ...userProps, - transactions: toStringifyTransactions(transactions), - ...orderProps, - paymentMethod, - tokenIds, - }, - }); sendSaleSuccessEvent( eventTarget, paymentMethod, @@ -97,25 +41,8 @@ export const useSaleEvent = () => { reason: string, error: Record, transactions: ExecutedTransaction[] = [], - screen: string = defaultView, details: Record = {}, ) => { - track({ - ...commonProps, - screen: toPascalCase(screen || defaultView), - control: 'Fail', - controlType: 'Event', - action: 'Failed', - extras: { - ...details, - transactions: toStringifyTransactions(transactions), - ...error, - ...orderProps, - ...userProps, - paymentMethod, - reason, - }, - }); sendSaleFailedEvent( eventTarget, reason, @@ -130,133 +57,24 @@ export const useSaleEvent = () => { sendSaleTransactionSuccessEvent(eventTarget, paymentMethod, [transaction]); }; - const sendSelectedPaymentMethod = ( - type: SalePaymentTypes, - screen: string, - ) => { - track({ - ...commonProps, - screen: toPascalCase(screen), - control: 'Select', - controlType: 'MenuItem', - extras: { - paymentMethod: type, - }, - }); + const sendSelectedPaymentMethod = (type: SalePaymentTypes) => { sendSalePaymentMethodEvent(eventTarget, type); }; const sendSelectedPaymentToken = ( - screen: string, fundingBalance: FundingBalance, conversions: Map, ) => { const details = getPaymentTokenDetails(fundingBalance, conversions); - track({ - ...commonProps, - screen: toPascalCase(screen), - control: 'Select', - controlType: 'MenuItem', - extras: { - ...details, - }, - }); sendSalePaymentTokenEvent(eventTarget, details); }; - const sendPageView = (screen: string, data?: Record) => { - page({ - ...commonProps, - screen: toPascalCase(screen), - action: 'Viewed', - extras: { ...data }, - }); - }; - - const sendOrderCreated = ( - screen: string, - details: Record, - ) => { - track({ - ...commonProps, - screen: toPascalCase(screen), - control: 'OrderCreated', - controlType: 'Event', - extras: { - ...details, - }, - }); - }; - - const sendProceedToPay = ( - screen: string, - fundingBalance: FundingBalance, - conversions: Map, - controlType: AnalyticsControlTypes = 'Button', - action: StandardAnalyticsActions = 'Pressed', - ) => { - track({ - ...commonProps, - screen: toPascalCase(screen), - control: 'ProceedToPay', - controlType, - action, - extras: { - ...userProps, - ...getPaymentTokenDetails(fundingBalance, conversions), - }, - }); - }; - - const sendInsufficientFunds = ( - screen: string, - txRequirements: any, - controlType: AnalyticsControlTypes = 'Event', - action: StandardAnalyticsActions = 'Viewed', - ) => { - track({ - ...commonProps, - screen: toPascalCase(screen), - control: 'InsufficientFunds', - controlType, - action, - extras: { - ...userProps, - ...txRequirements, - }, - }); - }; - - const sendViewFeesEvent = ( - screen: string, - controlType: AnalyticsControlTypes = 'Button', - action: StandardAnalyticsActions = 'Pressed', - ) => { - track({ - ...commonProps, - screen: toPascalCase(screen), - control: 'ViewFees', - controlType, - action, - extras: { - ...userProps, - }, - }); - }; - return { - track, - page, - sendPageView, sendCloseEvent, sendSuccessEvent, sendFailedEvent, sendTransactionSuccessEvent, - sendOrderCreated, sendSelectedPaymentMethod, sendSelectedPaymentToken, - sendProceedToPay, - sendViewFeesEvent, - sendInsufficientFunds, }; }; diff --git a/packages/checkout/widgets-lib/src/widgets/sale/views/OrderSummary.tsx b/packages/checkout/widgets-lib/src/widgets/sale/views/OrderSummary.tsx index 27a19eb4ff..f290b55ae8 100644 --- a/packages/checkout/widgets-lib/src/widgets/sale/views/OrderSummary.tsx +++ b/packages/checkout/widgets-lib/src/widgets/sale/views/OrderSummary.tsx @@ -44,7 +44,7 @@ type OrderSummaryProps = { export function OrderSummary({ subView }: OrderSummaryProps) { const { t } = useTranslation(); - const { sendFailedEvent, sendProceedToPay, sendInsufficientFunds } = useSaleEvent(); + const { sendFailedEvent } = useSaleEvent(); const { fromTokenAddress, collectionName, @@ -138,7 +138,7 @@ export function OrderSummary({ subView }: OrderSummaryProps) { if (riskAssessment && isSingleAddressSanctioned(riskAssessment, address)) { const error = new Error('Sanctioned address'); - sendFailedEvent(error.message, {}, [], undefined, { riskAssessment, paymentMethod }); + sendFailedEvent(error.message, {}, [], { riskAssessment, paymentMethod }); viewDispatch({ payload: { @@ -153,13 +153,6 @@ export function OrderSummary({ subView }: OrderSummaryProps) { return; } - sendProceedToPay( - SaleWidgetViews.ORDER_SUMMARY, - fundingBalance, - cryptoFiatState.conversions, - ); - // checkoutPrimarySaleProceedToPay - if (type === FundingBalanceType.SUFFICIENT) { signAndProceed(fundingItem.token.address); return; @@ -237,12 +230,6 @@ export function OrderSummary({ subView }: OrderSummaryProps) { ); setPaymentMethod(undefined); - // Send analytics event to track insufficient funds - sendInsufficientFunds( - SaleWidgetViews.ORDER_SUMMARY, - data, - ); - closeHandover(); viewDispatch({ payload: { diff --git a/packages/checkout/widgets-lib/src/widgets/sale/views/PayWithCard.tsx b/packages/checkout/widgets-lib/src/widgets/sale/views/PayWithCard.tsx index 9c0dedde4c..e5d34a57d5 100644 --- a/packages/checkout/widgets-lib/src/widgets/sale/views/PayWithCard.tsx +++ b/packages/checkout/widgets-lib/src/widgets/sale/views/PayWithCard.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react'; +import { useState } from 'react'; import { Box, LoadingOverlay } from '@biom3/react'; import { useTranslation } from 'react-i18next'; @@ -6,12 +6,10 @@ import { HeaderNavigation } from '../../../components/Header/HeaderNavigation'; import { SimpleLayout } from '../../../components/SimpleLayout/SimpleLayout'; import { WithCard } from '../components/WithCard'; import { useSaleContext } from '../context/SaleContextProvider'; -import { SaleWidgetViews } from '../../../context/view-context/SaleViewContextTypes'; import { useSaleEvent } from '../hooks/useSaleEvents'; import { SaleErrorTypes } from '../types'; export function PayWithCard() { - const { sendPageView } = useSaleEvent(); const [initialised, setInitialised] = useState(false); const { goBackToPaymentMethods, @@ -19,7 +17,7 @@ export function PayWithCard() { signResponse: signData, signTokenIds, } = useSaleContext(); - const { sendOrderCreated, sendCloseEvent, sendSuccessEvent } = useSaleEvent(); + const { sendCloseEvent, sendSuccessEvent } = useSaleEvent(); const { t } = useTranslation(); const onInit = () => setInitialised(true); @@ -64,49 +62,10 @@ export function PayWithCard() { transactionId: signData?.transactionId, }; - sendSuccessEvent(SaleWidgetViews.SALE_SUCCESS, [], signTokenIds, details); // checkoutPrimarySaleSaleSuccess_SuccessEventSucceeded - sendCloseEvent(SaleWidgetViews.SALE_SUCCESS); // checkoutPrimarySaleSaleSuccess_CloseButtonPressed + sendSuccessEvent([], signTokenIds, details); + sendCloseEvent(); }; - const onOrderCreated = (data: Record = {}) => { - const { - id: orderId, - status: orderStatus, - cryptoAmount, - cryptoCurrency, - fiatAmount, - fiatAmountInUsd, - amountPaid, - totalFeeInFiat, - paymentOptionId: paymentOption, - userId, - userKycType, - walletAddress, - nftAssetInfo, - } = data; - const { nftDataBase64, quantity } = nftAssetInfo || ({} as any); - sendOrderCreated(SaleWidgetViews.PAY_WITH_CARD, { - orderId, - orderStatus, - cryptoAmount, - cryptoCurrency, - fiatAmount, - fiatAmountInUsd, - amountPaid, - totalFeeInFiat, - paymentOption, - userId, - userKycType, - walletAddress, - nftDataBase64, - quantity, - signData, - transactionId: signData?.transactionId, - }); // checkoutPrimarySalePayWithCard_OrderCreatedEvent - }; - - useEffect(() => sendPageView(SaleWidgetViews.PAY_WITH_CARD), []); // checkoutPrimarySalePayWithCardViewed - return ( diff --git a/packages/checkout/widgets-lib/src/widgets/sale/views/PayWithCoins.tsx b/packages/checkout/widgets-lib/src/widgets/sale/views/PayWithCoins.tsx index 0c82cacf5f..a3a77eeb96 100644 --- a/packages/checkout/widgets-lib/src/widgets/sale/views/PayWithCoins.tsx +++ b/packages/checkout/widgets-lib/src/widgets/sale/views/PayWithCoins.tsx @@ -14,7 +14,6 @@ import { import { useHandover } from '../../../lib/hooks/useHandover'; import { HandoverTarget } from '../../../context/handover-context/HandoverContext'; import { HandoverContent } from '../../../components/Handover/HandoverContent'; -import { SaleWidgetViews } from '../../../context/view-context/SaleViewContextTypes'; import { isPassportProvider } from '../../../lib/provider'; import { errorToString, getRemoteRive } from '../../../lib/utils'; import { HandoverDuration } from '../../../context/handover-context/HandoverProvider'; @@ -55,7 +54,6 @@ export function PayWithCoins() { const { t } = useTranslation(); const { - sendPageView, sendTransactionSuccessEvent, sendFailedEvent, sendCloseEvent, @@ -89,7 +87,7 @@ export function PayWithCoins() { }, (error, txns) => { const details = { transactionId: signResponse?.transactionId }; - sendFailedEvent(error.toString(), error, txns, undefined, details); // checkoutPrimarySalePaymentMethods_FailEventFailed + sendFailedEvent(error.toString(), error, txns, details); goToErrorView(error.type, error.data); }, onTxnStepExecuteAll, @@ -114,7 +112,7 @@ export function PayWithCoins() { const details = { transactionId: signResponse?.transactionId, }; - sendFailedEvent(err.toString(), err, txns, undefined, details); // checkoutPrimarySalePaymentMethods_FailEventFailed + sendFailedEvent(err.toString(), err, txns, details); goToErrorView(err.type, err.data); }, onTxnStepExecuteNextTransaction, @@ -142,8 +140,6 @@ export function PayWithCoins() { environment, ]); - useEffect(() => sendPageView(SaleWidgetViews.PAY_WITH_COINS), []); // checkoutPrimarySalePayWithCoinsViewed - useEffect(() => { if (!provider || filteredTransactions.length === 0) return; @@ -183,12 +179,11 @@ export function PayWithCoins() { ), onClose: () => { sendSuccessEvent( - SaleWidgetViews.SALE_SUCCESS, executeResponse?.transactions, signTokenIds, details, - ); // checkoutPrimarySaleSaleSuccess_SuccessEventSucceeded - sendCloseEvent(SaleWidgetViews.SALE_SUCCESS); // checkoutPrimarySaleSaleSuccess_CloseButtonPressed + ); + sendCloseEvent(); }, }); } diff --git a/packages/checkout/widgets-lib/src/widgets/sale/views/PaymentMethods.tsx b/packages/checkout/widgets-lib/src/widgets/sale/views/PaymentMethods.tsx index 9048fd6507..0704d55314 100644 --- a/packages/checkout/widgets-lib/src/widgets/sale/views/PaymentMethods.tsx +++ b/packages/checkout/widgets-lib/src/widgets/sale/views/PaymentMethods.tsx @@ -33,9 +33,7 @@ export function PaymentMethods() { disabledPaymentTypes, hideExcludedPaymentTypes, } = useSaleContext(); - const { - sendPageView, sendCloseEvent, sendSelectedPaymentMethod, - } = useSaleEvent(); + const { sendCloseEvent, sendSelectedPaymentMethod } = useSaleEvent(); const handleOptionClick = (type: SalePaymentTypes) => { setPaymentMethod(type); @@ -43,7 +41,7 @@ export function PaymentMethods() { useEffect(() => { if (paymentMethod) { - sendSelectedPaymentMethod(paymentMethod, SaleWidgetViews.PAYMENT_METHODS); // checkoutPrimarySalePaymentMethods_SelectMenuItem + sendSelectedPaymentMethod(paymentMethod); } if ( @@ -85,7 +83,6 @@ export function PaymentMethods() { } }, [paymentMethod]); - useEffect(() => sendPageView(SaleWidgetViews.PAYMENT_METHODS), []); // checkoutPrimarySalePaymentMethodsViewed useEffect(() => { if (!invalidParameters) return; goToErrorView(SaleErrorTypes.INVALID_PARAMETERS); @@ -96,7 +93,7 @@ export function PaymentMethods() { testId="payment-methods" header={( sendCloseEvent(SaleWidgetViews.PAYMENT_METHODS)} // checkoutPrimarySalePaymentMethods_CloseButtonPressed + onCloseButtonClick={sendCloseEvent} /> )} footer={} diff --git a/packages/checkout/widgets-lib/src/widgets/sale/views/SaleErrorView.tsx b/packages/checkout/widgets-lib/src/widgets/sale/views/SaleErrorView.tsx index e7adb2eaa2..6bc3be128e 100644 --- a/packages/checkout/widgets-lib/src/widgets/sale/views/SaleErrorView.tsx +++ b/packages/checkout/widgets-lib/src/widgets/sale/views/SaleErrorView.tsx @@ -90,7 +90,7 @@ export function SaleErrorView({ const details = { transactionId: signResponse?.transactionId, }; - sendFailedEvent(err.toString(), err, txns, undefined, details); + sendFailedEvent(err.toString(), err, txns, details); setCurrentErrorType(SaleErrorTypes.TRANSACTION_FAILED); }, onTxnStepExecuteNextTransaction, diff --git a/packages/checkout/widgets-lib/src/widgets/swap/SwapWidget.tsx b/packages/checkout/widgets-lib/src/widgets/swap/SwapWidget.tsx index bbc26eda8b..c50673c7a7 100644 --- a/packages/checkout/widgets-lib/src/widgets/swap/SwapWidget.tsx +++ b/packages/checkout/widgets-lib/src/widgets/swap/SwapWidget.tsx @@ -50,7 +50,6 @@ import { TopUpView } from '../../views/top-up/TopUpView'; import { ConnectLoaderContext } from '../../context/connect-loader-context/ConnectLoaderContext'; import { EventTargetContext } from '../../context/event-target-context/EventTargetContext'; import { getAllowedBalances } from '../../lib/balance'; -import { UserJourney, useAnalytics } from '../../context/analytics-provider/SegmentAnalyticsProvider'; import { ServiceUnavailableErrorView } from '../../views/error/ServiceUnavailableErrorView'; import { ServiceUnavailableToRegionErrorView } from '../../views/error/ServiceUnavailableToRegionErrorView'; import { ServiceType } from '../../views/error/serviceTypes'; @@ -95,9 +94,6 @@ export default function SwapWidget({ history: [], }); const [swapState, swapDispatch] = useReducer(swapReducer, initialSwapState); - - const { page } = useAnalytics(); - const [errorViewLoading, setErrorViewLoading] = useState(false); const swapReducerValues = useMemo( @@ -281,16 +277,6 @@ export default function SwapWidget({ statusText={t('views.SWAP.success.text')} actionText={t('views.SWAP.success.actionText')} onRenderEvent={() => { - page({ - userJourney: UserJourney.SWAP, - screen: 'SwapSuccess', - extras: { - fromTokenAddress: viewState.view.data?.fromTokenAddress, - fromAmount: viewState.view.data?.fromAmount, - toTokenAddress: viewState.view.data?.toTokenAddress, - toAmount: viewState.view.data?.toAmount, - }, - }); sendSwapSuccessEvent( eventTarget, (viewState.view as SwapSuccessView).data.transactionHash, @@ -306,10 +292,6 @@ export default function SwapWidget({ statusText={t('views.SWAP.failed.text')} actionText={t('views.SWAP.failed.actionText')} onRenderEvent={() => { - page({ - userJourney: UserJourney.SWAP, - screen: 'SwapFailed', - }); sendSwapFailedEvent(eventTarget, 'Transaction failed'); }} onActionClick={() => { @@ -335,11 +317,6 @@ export default function SwapWidget({ statusText={t('views.SWAP.rejected.text')} actionText={t('views.SWAP.rejected.actionText')} onRenderEvent={() => { - page({ - userJourney: UserJourney.SWAP, - screen: 'PriceSurge', - extras: viewState.view.data, - }); sendSwapRejectedEvent(eventTarget, 'Price surge'); }} onActionClick={() => { @@ -392,7 +369,6 @@ export default function SwapWidget({ )} {viewState.view.type === SharedViews.TOP_UP_VIEW && ( { this.reactRoot!.render( - - - - sendSwapWidgetCloseEvent(window)} - > - }> - - - - - - + + + + sendSwapWidgetCloseEvent(window)} + > + }> + + + + + + , ); } diff --git a/packages/checkout/widgets-lib/src/widgets/swap/components/Fees.tsx b/packages/checkout/widgets-lib/src/widgets/swap/components/Fees.tsx index 81d7ec3816..e3890866c7 100644 --- a/packages/checkout/widgets-lib/src/widgets/swap/components/Fees.tsx +++ b/packages/checkout/widgets-lib/src/widgets/swap/components/Fees.tsx @@ -16,7 +16,7 @@ interface FeesProps { gasFeeToken?: TokenInfo; feeFiatValue: number | null; fees: FormattedFee[]; - onFeesClick: () => void; + onFeesClick?: () => void; loading: boolean; sx?: SxProps; } diff --git a/packages/checkout/widgets-lib/src/widgets/swap/components/SwapForm.tsx b/packages/checkout/widgets-lib/src/widgets/swap/components/SwapForm.tsx index 3f433b122a..6aa1163854 100644 --- a/packages/checkout/widgets-lib/src/widgets/swap/components/SwapForm.tsx +++ b/packages/checkout/widgets-lib/src/widgets/swap/components/SwapForm.tsx @@ -15,7 +15,6 @@ import { useTranslation } from 'react-i18next'; import { Environment } from '@imtbl/config'; import { formatUnits, parseEther, parseUnits } from 'ethers'; import { motion } from 'framer-motion'; -import { UserJourney, useAnalytics } from '../../../context/analytics-provider/SegmentAnalyticsProvider'; import { NetworkSwitchDrawer } from '../../../components/NetworkSwitchDrawer/NetworkSwitchDrawer'; import { amountInputValidation as textInputValidator } from '../../../lib/validations/amountInputValidations'; import { SwapContext } from '../context/SwapContext'; @@ -116,8 +115,6 @@ export function SwapForm({ const [direction, setDirection] = useState(SwapDirection.FROM); const [loading, setLoading] = useState(false); - const { track } = useAnalytics(); - // Form State const [fromAmount, setFromAmount] = useState(data?.fromAmount || ''); const [fromAmountError, setFromAmountError] = useState(''); @@ -239,20 +236,7 @@ export function SwapForm({ const onQuoteError = useCallback((error: any) => { setQuoteError(error); - track({ - userJourney: UserJourney.SWAP, - screen: 'SwapCoins', - control: 'UnableToSwapDrawer', - controlType: 'Button', - extras: { - fromToken, - toToken, - fromAmount, - toAmount, - error: 'message' in error ? error.message : error, - }, - }); - }, [track, fromToken, toToken, fromAmount, toAmount]); + }, [fromToken, toToken, fromAmount, toAmount]); const tokensOptionsTo = useMemo(() => allowedTokens .map( @@ -569,18 +553,6 @@ export function SwapForm({ setFromToken(selected.token); setFromBalance(selected.formattedBalance); setFromTokenError(''); - - track({ - userJourney: UserJourney.SWAP, - screen: 'SwapCoins', - control: 'SelectFrom', - controlType: 'Select', - extras: { - fromBalance: selected.formattedBalance, - fromToken: selected.token, - fromAmount, - }, - }); }, [toToken]); const onFromTextInputFocus = () => { @@ -598,18 +570,6 @@ export function SwapForm({ setLoading(true); } setFromAmount(value); - - track({ - userJourney: UserJourney.SWAP, - screen: 'SwapCoins', - control: 'InputFrom', - controlType: 'TextInput', - extras: { - fromBalance, - fromToken, - fromAmount: value, - }, - }); }; const textInputMaxButtonClick = () => { @@ -628,16 +588,6 @@ export function SwapForm({ } else { setFromAmount(fromBalanceTruncated); } - track({ - userJourney: UserJourney.SWAP, - screen: 'SwapCoins', - control: 'MaxFrom', - controlType: 'Button', - extras: { - fromBalance, - fromBalanceTruncated, - }, - }); }; // ------------// @@ -653,17 +603,6 @@ export function SwapForm({ setToToken(selected); setToTokenError(''); - - track({ - userJourney: UserJourney.SWAP, - screen: 'SwapCoins', - control: 'SelectTo', - controlType: 'Select', - extras: { - toToken: selected, - toAmount, - }, - }); }, [fromToken]); const onToTextInputFocus = () => { @@ -682,23 +621,11 @@ export function SwapForm({ setLoading(true); } setToAmount(value); - - track({ - userJourney: UserJourney.SWAP, - screen: 'SwapCoins', - control: 'InputTo', - controlType: 'TextInput', - extras: { - toToken, - toAmount: value, - }, - }); }; const reverseTokens = () => { const currentFromToken = fromToken; const currentToToken = toToken; - const currentFromAmount = fromAmount; const currentToAmount = toAmount; setReverseRotation((prev) => (prev === 0 ? 180 : 0)); @@ -731,20 +658,6 @@ export function SwapForm({ setToToken(currentFromToken); setToAmount(fromAmount); } - - track({ - userJourney: UserJourney.SWAP, - screen: 'SwapCoins', - control: 'Flip', - controlType: 'Button', - extras: { - fromToken: currentFromToken, - fromAmount: currentFromAmount, - toToken: currentToToken, - toAmount: currentToAmount, - isCurrentToTokenInSellList, - }, - }); }; const openNotEnoughImxDrawer = () => { @@ -777,24 +690,6 @@ export function SwapForm({ || validateToTokenError || (validateFromAmountError && direction === SwapDirection.FROM) || (validateToAmountError && direction === SwapDirection.TO)) isSwapFormValid = false; - - track({ - userJourney: UserJourney.SWAP, - screen: 'SwapCoins', - control: 'FormValid', - controlType: 'Button', - extras: { - isSwapFormValid, - swapFromAddress: fromToken?.address, - swapFromAmount: fromAmount, - swapFromTokenSymbol: fromToken?.symbol, - swapToAddress: toToken?.address, - swapToAmount: toAmount, - swapToTokenSymbol: toToken?.symbol, - autoProceed, - }, - }); - return isSwapFormValid; }; @@ -823,26 +718,7 @@ export function SwapForm({ if (!quote) return; const transaction = quote; - const isValid = SwapFormValidator(); - // Tracking swap from data here and is valid or not to understand behaviour - track({ - userJourney: UserJourney.SWAP, - screen: 'SwapCoins', - control: 'Swap', - controlType: 'Button', - extras: { - swapFromAddress: fromToken?.address, - swapFromAmount: fromAmount, - swapFromTokenSymbol: fromToken?.symbol, - swapToAddress: toToken?.address, - swapToAmount: toAmount, - swapToTokenSymbol: toToken?.symbol, - isSwapFormValid: isValid, - hasFundsForGas: !insufficientFundsForGas, - autoProceed, - }, - }); - if (!isValid) return; + const isValid = SwapFormValidator(); if (!isValid) return; if (!checkout || !provider || !transaction) return; if (insufficientFundsForGas) { cancelAutoProceed(); @@ -1006,9 +882,6 @@ export function SwapForm({ : undefined} coinSelectorHeading={t('views.SWAP.swapForm.from.selectorTitle')} defaultTokenImage={defaultTokenImage} - control="FromToken" - userJourney={UserJourney.SWAP} - screen="SwapCoins" environment={checkout?.config.environment} theme={theme} themeOverrides={themeOverrides} @@ -1085,9 +958,6 @@ export function SwapForm({ : undefined} coinSelectorHeading={t('views.SWAP.swapForm.to.selectorTitle')} defaultTokenImage={defaultTokenImage} - control="ToToken" - userJourney={UserJourney.SWAP} - screen="SwapCoins" environment={checkout?.config.environment} theme={theme} themeOverrides={themeOverrides} @@ -1098,14 +968,6 @@ export function SwapForm({ feeFiatValue={feeFiatValue} gasFeeToken={gasFeeToken} fees={formattedFees} - onFeesClick={() => { - track({ - userJourney: UserJourney.SWAP, - screen: 'SwapCoins', - control: 'ViewFees', - controlType: 'Button', - }); - }} sx={{ paddingBottom: '0', }} diff --git a/packages/checkout/widgets-lib/src/widgets/swap/views/ApproveERC20Onboarding.tsx b/packages/checkout/widgets-lib/src/widgets/swap/views/ApproveERC20Onboarding.tsx index ce59e3d4e4..cecf6c2ad9 100644 --- a/packages/checkout/widgets-lib/src/widgets/swap/views/ApproveERC20Onboarding.tsx +++ b/packages/checkout/widgets-lib/src/widgets/swap/views/ApproveERC20Onboarding.tsx @@ -1,6 +1,6 @@ import { Box } from '@biom3/react'; import { - useCallback, useContext, useEffect, useMemo, useState, + useCallback, useContext, useMemo, useState, } from 'react'; import { CheckoutError, CheckoutErrorType, TokenInfo } from '@imtbl/checkout-sdk'; import { useTranslation } from 'react-i18next'; @@ -22,16 +22,12 @@ import { ConnectLoaderContext } from '../../../context/connect-loader-context/Co import { SpendingCapHero } from '../../../components/Hero/SpendingCapHero'; import { WalletApproveHero } from '../../../components/Hero/WalletApproveHero'; import { EventTargetContext } from '../../../context/event-target-context/EventTargetContext'; -import { UserJourney, useAnalytics } from '../../../context/analytics-provider/SegmentAnalyticsProvider'; import { isPassportProvider } from '../../../lib/provider'; export interface ApproveERC20Props { data: ApproveERC20SwapData; } -const APPROVE_SPENDING = 'ApproveSpending'; -const APPROVE_SWAP = 'ApproveSwap'; - export function ApproveERC20Onboarding({ data }: ApproveERC20Props) { const { t } = useTranslation(); const { swapState: { allowedTokens } } = useContext(SwapContext); @@ -51,19 +47,6 @@ export function ApproveERC20Onboarding({ data }: ApproveERC20Props) { // reject transaction flags const [rejectedSpending, setRejectedSpending] = useState(false); const [rejectedSwap, setRejectedSwap] = useState(false); - - const { page, track } = useAnalytics(); - - useEffect(() => { - page({ - userJourney: UserJourney.SWAP, - screen: noApprovalTransaction ? APPROVE_SWAP : APPROVE_SPENDING, - extras: { - swapFormInfo: data.swapFormInfo, - }, - }); - }, []); - // Get symbol from swap info for approve amount text const fromToken = useMemo( () => allowedTokens.find( @@ -152,15 +135,6 @@ export function ApproveERC20Onboarding({ data }: ApproveERC20Props) { const handleApproveSpendingClick = useCallback(async () => { if (loading) return; - track({ - userJourney: UserJourney.SWAP, - screen: APPROVE_SPENDING, - control: APPROVE_SPENDING, - controlType: 'Button', - extras: { - autoProceed: data.autoProceed, - }, - }); setLoading(true); if (!checkout || !provider) { @@ -256,15 +230,6 @@ export function ApproveERC20Onboarding({ data }: ApproveERC20Props) { const handleApproveSwapClick = useCallback(async () => { if (loading) return; - track({ - userJourney: UserJourney.SWAP, - screen: APPROVE_SWAP, - control: APPROVE_SWAP, - controlType: 'Button', - extras: { - autoProceed: data.autoProceed, - }, - }); setLoading(true); if (!checkout || !provider) { diff --git a/packages/checkout/widgets-lib/src/widgets/swap/views/SwapCoins.tsx b/packages/checkout/widgets-lib/src/widgets/swap/views/SwapCoins.tsx index fdf80f041c..9068637878 100644 --- a/packages/checkout/widgets-lib/src/widgets/swap/views/SwapCoins.tsx +++ b/packages/checkout/widgets-lib/src/widgets/swap/views/SwapCoins.tsx @@ -19,7 +19,6 @@ import { SwapContext } from '../context/SwapContext'; import { NotEnoughImx } from '../../../components/NotEnoughImx/NotEnoughImx'; import { IMX_TOKEN_SYMBOL } from '../../../lib'; import { EventTargetContext } from '../../../context/event-target-context/EventTargetContext'; -import { UserJourney, useAnalytics } from '../../../context/analytics-provider/SegmentAnalyticsProvider'; import { isPassportProvider } from '../../../lib/provider'; import { LoadingView } from '../../../views/loading/LoadingView'; import { orchestrationEvents } from '../../../lib/orchestrationEvents'; @@ -70,22 +69,6 @@ export function SwapCoins({ } = useContext(ConnectLoaderContext); const [showNotEnoughImxDrawer, setShowNotEnoughImxDrawer] = useState(false); - - const { page } = useAnalytics(); - - useEffect(() => { - page({ - userJourney: UserJourney.SWAP, - screen: 'SwapCoins', - extras: { - fromAmount, - toAmount, - fromTokenAddress, - toTokenAddress, - }, - }); - }, []); - useEffect(() => { if (hasZeroBalance(tokenBalances, IMX_TOKEN_SYMBOL) && !isPassportProvider(provider)) { setShowNotEnoughImxDrawer(true); diff --git a/packages/checkout/widgets-lib/src/widgets/swap/views/SwapInProgress.tsx b/packages/checkout/widgets-lib/src/widgets/swap/views/SwapInProgress.tsx index 931c4d99f3..90ae2c4015 100644 --- a/packages/checkout/widgets-lib/src/widgets/swap/views/SwapInProgress.tsx +++ b/packages/checkout/widgets-lib/src/widgets/swap/views/SwapInProgress.tsx @@ -10,7 +10,6 @@ import { SwapWidgetViews, } from '../../../context/view-context/SwapViewContextTypes'; import { LoadingView } from '../../../views/loading/LoadingView'; -import { UserJourney, useAnalytics } from '../../../context/analytics-provider/SegmentAnalyticsProvider'; interface SwapInProgressProps { transactionResponse: TransactionResponse; @@ -23,19 +22,6 @@ export function SwapInProgress({ }: SwapInProgressProps) { const { t } = useTranslation(); const { viewDispatch } = useContext(ViewContext); - - const { page } = useAnalytics(); - - useEffect(() => { - page({ - userJourney: UserJourney.SWAP, - screen: 'SwapInProgress', - extras: { - swapFormInfo: swapForm, - }, - }); - }, []); - useEffect(() => { (async () => { try { diff --git a/packages/checkout/widgets-lib/src/widgets/transfer/TransferForm.tsx b/packages/checkout/widgets-lib/src/widgets/transfer/TransferForm.tsx index 6e133564ce..51869cdc95 100644 --- a/packages/checkout/widgets-lib/src/widgets/transfer/TransferForm.tsx +++ b/packages/checkout/widgets-lib/src/widgets/transfer/TransferForm.tsx @@ -10,7 +10,6 @@ import { SelectInput } from '../../components/FormComponents/SelectInput/SelectI import { TextInputForm } from '../../components/FormComponents/TextInputForm/TextInputForm'; import { HeaderNavigation } from '../../components/Header/HeaderNavigation'; import { SimpleLayout } from '../../components/SimpleLayout/SimpleLayout'; -import { useAnalytics, UserJourney } from '../../context/analytics-provider/SegmentAnalyticsProvider'; import { CryptoFiatContext } from '../../context/crypto-fiat-context/CryptoFiatContext'; import { EventTargetContext } from '../../context/event-target-context/EventTargetContext'; import { orchestrationEvents } from '../../lib/orchestrationEvents'; @@ -42,9 +41,7 @@ export function TransferForm({ title: string; coinAmountTitle: string; }) { - const { t } = useTranslation(); - const { track } = useAnalytics(); - const { eventTargetState: { eventTarget } } = useContext(EventTargetContext); + const { t } = useTranslation(); const { eventTargetState: { eventTarget } } = useContext(EventTargetContext); const { cryptoFiatState } = useContext(CryptoFiatContext); const tokenOptions = useMemo( @@ -88,36 +85,20 @@ export function TransferForm({ const handleTokenChange = useCallback( (optionKey: OptionKey) => { - track({ - screen: 'TransferToken', - userJourney: UserJourney.TRANSFER, - control: 'SelectToken', - controlType: 'Select', - extras: { token: optionKey }, - }); if (typeof optionKey !== 'string') throw new Error('Invalid token address'); setViewState((s) => ({ ...s, tokenAddress: optionKey, amountError: '' })); }, - [setViewState, track], + [setViewState], ); const handleMaxButtonClick = useCallback(() => { if (!token) throw new Error('Token not found'); if (!token.balance) throw new Error('Token balance not found'); - - track({ - screen: 'TransferToken', - userJourney: UserJourney.TRANSFER, - control: 'Max', - controlType: 'Button', - extras: { token: token.id, amount: token.balance.fullBalance }, - }); - setViewState((s) => { if (!token.balance) throw new Error('Token balance not found'); return { ...s, amount: token.balance.fullBalance }; }); - }, [token, setViewState, track]); + }, [token, setViewState]); const handleRecipientAddressChange = useCallback((value: string) => { setViewState((s) => ({ ...s, toAddress: value, toAddressError: '' })); @@ -188,9 +169,6 @@ export function TransferForm({ onSelectChange={handleTokenChange} selectedOption={token?.id} defaultTokenImage={defaultTokenImage} - userJourney={UserJourney.TRANSFER} - screen="TransferToken" - control="Token" theme={config.theme} themeOverrides={config.themeOverrides} /> diff --git a/packages/checkout/widgets-lib/src/widgets/transfer/TransferWidget.tsx b/packages/checkout/widgets-lib/src/widgets/transfer/TransferWidget.tsx index c05139432f..2854348bec 100644 --- a/packages/checkout/widgets-lib/src/widgets/transfer/TransferWidget.tsx +++ b/packages/checkout/widgets-lib/src/widgets/transfer/TransferWidget.tsx @@ -10,10 +10,6 @@ import { CloudImage, Stack, useTheme } from '@biom3/react'; import { isAddress, isError, parseUnits } from 'ethers'; import { StrongCheckoutWidgetsConfig } from '../../lib/withDefaultWidgetConfig'; import { LoadingView } from '../../views/loading/LoadingView'; -import { - useAnalytics, - UserJourney, -} from '../../context/analytics-provider/SegmentAnalyticsProvider'; import { ConnectLoaderContext } from '../../context/connect-loader-context/ConnectLoaderContext'; import { getRemoteImage } from '../../lib/utils'; import { @@ -41,8 +37,6 @@ function TransferWidgetInner(props: TransferWidgetInputs) { const { t } = useTranslation(); const { cryptoFiatDispatch } = useContext(CryptoFiatContext); const { eventTargetState: { eventTarget } } = useContext(EventTargetContext); - const { track } = useAnalytics(); - const { connectLoaderState: { checkout, provider }, } = useContext(ConnectLoaderContext); @@ -89,15 +83,6 @@ function TransferWidgetInner(props: TransferWidgetInputs) { const onSend = useCallback(async () => { if (viewState.type !== 'FORM') throw new Error('Unexpected state'); - - track({ - screen: 'TransferToken', - userJourney: UserJourney.TRANSFER, - control: 'Send', - controlType: 'Button', - extras: { token: viewState.tokenAddress, amount: viewState.amount }, - }); - if (!isAddress(viewState.toAddress)) { setViewState((s) => ({ ...s, toAddressError: 'Invalid wallet address' })); return; @@ -177,13 +162,6 @@ function TransferWidgetInner(props: TransferWidgetInputs) { && 'code' in e.error && e.error.code === TRANSACTION_CANCELLED_ERROR_CODE ) { - track({ - screen: 'TransferToken', - userJourney: UserJourney.TRANSFER, - control: 'TranactionCancel', - controlType: 'Event', - extras: { token: viewState.tokenAddress, amount: viewState.amount }, - }); sendRejectedEvent(eventTarget, 'Transaction cancelled'); } else { // eslint-disable-next-line no-console @@ -192,7 +170,7 @@ function TransferWidgetInner(props: TransferWidgetInputs) { setViewState({ ...viewState, type: 'FORM' }); // TODO: We should be showing a failed view here } } - }, [viewState, eventTarget, track]); + }, [viewState, eventTarget]); switch (viewState.type) { case 'INITIALISING': diff --git a/packages/checkout/widgets-lib/src/widgets/wallet/WalletWidgetRoot.tsx b/packages/checkout/widgets-lib/src/widgets/wallet/WalletWidgetRoot.tsx index 42b8051fea..e2adfe9919 100644 --- a/packages/checkout/widgets-lib/src/widgets/wallet/WalletWidgetRoot.tsx +++ b/packages/checkout/widgets-lib/src/widgets/wallet/WalletWidgetRoot.tsx @@ -12,7 +12,6 @@ import { Base } from '../BaseWidgetRoot'; import { ConnectLoader, ConnectLoaderParams } from '../../components/ConnectLoader/ConnectLoader'; import { isValidWalletProvider } from '../../lib/validations/widgetValidators'; import { ThemeProvider } from '../../components/ThemeProvider/ThemeProvider'; -import { CustomAnalyticsProvider } from '../../context/analytics-provider/CustomAnalyticsProvider'; import { LoadingView } from '../../views/loading/LoadingView'; import { HandoverProvider } from '../../context/handover-context/HandoverProvider'; import { sendWalletWidgetCloseEvent } from './WalletWidgetEvents'; @@ -79,32 +78,32 @@ export class Wallet extends Base { this.reactRoot.render( - - - - sendWalletWidgetCloseEvent(window)} - > - + + + + sendWalletWidgetCloseEvent(window)} + > + } - > - + - - - - - + showNetworkMenu: this.properties.config?.showNetworkMenu!, + }} + /> + + + + + , ); } diff --git a/packages/checkout/widgets-lib/src/widgets/wallet/components/BalanceItem/BalanceItem.tsx b/packages/checkout/widgets-lib/src/widgets/wallet/components/BalanceItem/BalanceItem.tsx index f394efc818..6d9a0f529f 100644 --- a/packages/checkout/widgets-lib/src/widgets/wallet/components/BalanceItem/BalanceItem.tsx +++ b/packages/checkout/widgets-lib/src/widgets/wallet/components/BalanceItem/BalanceItem.tsx @@ -18,10 +18,6 @@ import { formatZeroAmount, tokenValueFormat } from '../../../../lib/utils'; import { ConnectLoaderContext } from '../../../../context/connect-loader-context/ConnectLoaderContext'; import { isPassportProvider } from '../../../../lib/provider'; import { EventTargetContext } from '../../../../context/event-target-context/EventTargetContext'; -import { - UserJourney, - useAnalytics, -} from '../../../../context/analytics-provider/SegmentAnalyticsProvider'; export interface BalanceItemProps { balanceInfo: BalanceInfo; @@ -34,9 +30,7 @@ export function BalanceItem({ theme, bridgeToL2OnClick, }: BalanceItemProps) { - const { connectLoaderState } = useContext(ConnectLoaderContext); - const { track } = useAnalytics(); - const { checkout, provider } = connectLoaderState; + const { connectLoaderState } = useContext(ConnectLoaderContext); const { checkout, provider } = connectLoaderState; const fiatAmount = `≈ USD $${formatZeroAmount(balanceInfo.fiatAmount)}`; const { walletState } = useContext(WalletContext); const { supportedTopUps, network } = walletState; @@ -126,17 +120,6 @@ export function BalanceItem({ ]); const handleAddTokenClick = () => { - track({ - userJourney: UserJourney.WALLET, - screen: 'WalletBalances', - control: 'AddTokens', - controlType: 'Button', - extras: { - tokenSymbol: balanceInfo.symbol, - tokenAddress: balanceInfo.address, - }, - }); - if (isAddTokensEnabled) { orchestrationEvents.sendRequestAddTokensEvent( eventTarget, @@ -184,18 +167,6 @@ export function BalanceItem({ { - track({ - userJourney: UserJourney.WALLET, - screen: 'WalletBalances', - control: 'BalanceItem', - controlType: 'Button', - extras: { - tokenSymbol: balanceInfo.symbol, - tokenAddress: balanceInfo.address, - }, - }); - }} > { - track({ - userJourney: UserJourney.WALLET, - screen: 'WalletBalances', - control: 'SwapTokens', - controlType: 'Button', - extras: { - tokenSymbol: balanceInfo.symbol, - tokenAddress: balanceInfo.address, - }, - }); orchestrationEvents.sendRequestSwapEvent( eventTarget, IMTBLWidgetEvents.IMTBL_WALLET_WIDGET_EVENT, @@ -237,16 +198,6 @@ export function BalanceItem({ testId="balance-item-move-option" sx={ShowMenuItem(isBridgeEnabled)} onClick={() => { - track({ - userJourney: UserJourney.WALLET, - screen: 'WalletBalances', - control: 'MoveTokens', - controlType: 'Button', - extras: { - tokenSymbol: balanceInfo.symbol, - tokenAddress: balanceInfo.address, - }, - }); bridgeToL2OnClick(balanceInfo.address); }} > diff --git a/packages/checkout/widgets-lib/src/widgets/wallet/components/NetworkMenu/NetworkMenu.tsx b/packages/checkout/widgets-lib/src/widgets/wallet/components/NetworkMenu/NetworkMenu.tsx index 540112a4c5..dacbec1aeb 100644 --- a/packages/checkout/widgets-lib/src/widgets/wallet/components/NetworkMenu/NetworkMenu.tsx +++ b/packages/checkout/widgets-lib/src/widgets/wallet/components/NetworkMenu/NetworkMenu.tsx @@ -33,7 +33,6 @@ import { ConnectLoaderContext, } from '../../../../context/connect-loader-context/ConnectLoaderContext'; import { EventTargetContext } from '../../../../context/event-target-context/EventTargetContext'; -import { UserJourney, useAnalytics } from '../../../../context/analytics-provider/SegmentAnalyticsProvider'; export function NetworkMenu() { const { t } = useTranslation(); @@ -46,21 +45,9 @@ export function NetworkMenu() { const [allowedNetworks, setNetworks] = useState( [], ); - const { track } = useAnalytics(); - const switchNetwork = useCallback( async (chainId: ChainId) => { if (!checkout || !provider || !network || Number(network.chainId) === chainId) return; - track({ - userJourney: UserJourney.WALLET, - screen: 'WalletBalances', - control: 'SwitchNetwork', - controlType: 'Button', - extras: { - chainId, - }, - }); - try { const switchNetworkResult = await checkout.switchNetwork({ provider, diff --git a/packages/checkout/widgets-lib/src/widgets/wallet/components/WalletAddress/WalletAddress.tsx b/packages/checkout/widgets-lib/src/widgets/wallet/components/WalletAddress/WalletAddress.tsx index 13de7a920e..af07b41add 100644 --- a/packages/checkout/widgets-lib/src/widgets/wallet/components/WalletAddress/WalletAddress.tsx +++ b/packages/checkout/widgets-lib/src/widgets/wallet/components/WalletAddress/WalletAddress.tsx @@ -6,10 +6,6 @@ import { import { useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { WrappedBrowserProvider } from '@imtbl/checkout-sdk'; -import { - UserJourney, - useAnalytics, -} from '../../../../context/analytics-provider/SegmentAnalyticsProvider'; import { getWalletLogoByName } from '../../../../lib/logoUtils'; import { getWalletProviderNameByProvider, isPassportProvider } from '../../../../lib/provider'; import { abbreviateWalletAddress } from '../../../../lib/utils'; @@ -36,9 +32,6 @@ export function WalletAddress({ const [isCopied, setIsCopied] = useState(false); const { t } = useTranslation(); - - const { track } = useAnalytics(); - const ctaIcon = useMemo(() => { if (isPassportProvider(provider) && !showL1Warning) { return 'ShowPassword'; @@ -57,12 +50,6 @@ export function WalletAddress({ const handleIconClick = async () => { if (walletAddress && ctaIcon === 'CopyText') { - track({ - userJourney: UserJourney.WALLET, - screen: 'Settings', - control: 'CopyWalletAddress', - controlType: 'Button', - }); navigator.clipboard.writeText(walletAddress); setIsCopied(true); setTimeout(() => setIsCopied(false), 1000); diff --git a/packages/checkout/widgets-lib/src/widgets/wallet/views/CoinInfo.tsx b/packages/checkout/widgets-lib/src/widgets/wallet/views/CoinInfo.tsx index c53861bef3..2b43c956a3 100644 --- a/packages/checkout/widgets-lib/src/widgets/wallet/views/CoinInfo.tsx +++ b/packages/checkout/widgets-lib/src/widgets/wallet/views/CoinInfo.tsx @@ -1,4 +1,4 @@ -import { useContext, useEffect } from 'react'; +import { useContext } from 'react'; import { Link } from '@biom3/react'; import { useTranslation } from 'react-i18next'; import { FooterLogo } from '../../../components/Footer/FooterLogo'; @@ -9,22 +9,11 @@ import { IMXCoinsHero } from '../../../components/Hero/IMXCoinsHero'; import { ConnectLoaderContext } from '../../../context/connect-loader-context/ConnectLoaderContext'; import { isPassportProvider } from '../../../lib/provider'; import { FAQS_LINK } from '../../../lib'; -import { UserJourney, useAnalytics } from '../../../context/analytics-provider/SegmentAnalyticsProvider'; export function CoinInfo() { const { t } = useTranslation(); const { connectLoaderState: { provider } } = useContext(ConnectLoaderContext); const isPassport = isPassportProvider(provider); - - const { page } = useAnalytics(); - - useEffect(() => { - page({ - userJourney: UserJourney.WALLET, - screen: 'CoinInfo', - }); - }, []); - return ( { - page({ - userJourney: UserJourney.WALLET, - screen: 'Settings', - }); - }, []); - // disconnect all Wallet Connect pairings and disconnect the provider // so that restoreSession doesn't pick up the previous sessions const handleWCDisconnect = async () => { diff --git a/packages/checkout/widgets-lib/src/widgets/wallet/views/WalletBalances.tsx b/packages/checkout/widgets-lib/src/widgets/wallet/views/WalletBalances.tsx index d0665a0da5..b02de0cdcc 100644 --- a/packages/checkout/widgets-lib/src/widgets/wallet/views/WalletBalances.tsx +++ b/packages/checkout/widgets-lib/src/widgets/wallet/views/WalletBalances.tsx @@ -29,7 +29,6 @@ import { import { orchestrationEvents } from '../../../lib/orchestrationEvents'; import { ConnectLoaderContext } from '../../../context/connect-loader-context/ConnectLoaderContext'; import { EventTargetContext } from '../../../context/event-target-context/EventTargetContext'; -import { UserJourney, useAnalytics } from '../../../context/analytics-provider/SegmentAnalyticsProvider'; import { BalanceInfo, mapTokenBalancesWithConversions } from '../functions/tokenBalances'; import { isPassportProvider } from '../../../lib/provider'; @@ -60,9 +59,6 @@ export function WalletBalances({ const { conversions } = cryptoFiatState; const isPassport = isPassportProvider(provider); const enableNetworkMenu = !isPassport && showNetworkMenu; - - const { track, page } = useAnalytics(); - const balanceInfos: BalanceInfo[] = useMemo( () => { if (!network?.chainId) return []; @@ -71,14 +67,6 @@ export function WalletBalances({ }, [tokenBalances, conversions, network?.chainId], ); - - useEffect(() => { - page({ - userJourney: UserJourney.WALLET, - screen: 'WalletBalances', - }); - }, []); - useEffect(() => { (async () => { if (!checkout) return; @@ -120,12 +108,6 @@ export function WalletBalances({ }, [checkout, network, supportedTopUps]); const handleAddCoinsClick = () => { - track({ - userJourney: UserJourney.WALLET, - screen: 'WalletBalances', - control: 'AddCoins', - controlType: 'Button', - }); orchestrationEvents.sendRequestAddTokensEvent(eventTarget, IMTBLWidgetEvents.IMTBL_WALLET_WIDGET_EVENT, {}); }; @@ -148,12 +130,6 @@ export function WalletBalances({ sx={ButtonNavigationStyles()} iconVariant="bold" onClick={() => { - track({ - userJourney: UserJourney.WALLET, - screen: 'WalletBalances', - control: 'Settings', - controlType: 'Button', - }); viewDispatch({ payload: { type: ViewActions.UPDATE_VIEW, diff --git a/packages/checkout/widgets-lib/tsconfig.json b/packages/checkout/widgets-lib/tsconfig.json index 93d16f6de4..536f23057e 100644 --- a/packages/checkout/widgets-lib/tsconfig.json +++ b/packages/checkout/widgets-lib/tsconfig.json @@ -12,7 +12,6 @@ "jsxImportSource": "@emotion/react", "experimentalDecorators": true, "types": [ - "@segment/analytics-next", "jest", "node" ], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 091bef2a36..e60469a3b5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -622,9 +622,6 @@ importers: '@imtbl/passport': specifier: workspace:* version: link:../../passport/sdk - '@imtbl/react-analytics': - specifier: 0.3.4-alpha - version: 0.3.4-alpha(encoding@0.1.13)(supports-color@8.1.1) '@rive-app/react-canvas-lite': specifier: ^4.9.0 version: 4.9.0(react@19.2.8) @@ -698,9 +695,6 @@ importers: '@rollup/plugin-typescript': specifier: ^11.1.6 version: 11.1.6(@typescript/typescript6@6.0.2)(rollup@4.28.0)(tslib@2.8.1) - '@segment/analytics-next': - specifier: ^1.53.2 - version: 1.54.0(encoding@0.1.13)(supports-color@8.1.1) '@swc/core': specifier: catalog:toolchain version: 1.15.46 @@ -2971,9 +2965,6 @@ packages: '@imtbl/image-resizer-utils@0.0.3': resolution: {integrity: sha512-/EOJKMJF4gD/Dv0qNhpUTpp2AgWeQ7XgYK9Xjl+xP2WWgaarNv1SHe1aeqSb8aZT5W7wSXdUGzn6TIxNsuCWGw==} - '@imtbl/react-analytics@0.3.4-alpha': - resolution: {integrity: sha512-4VWvfm8RZtpLub7+x2D2wNQ507nIVBCSAPA7B5lxdb0cKrHEujM6Y/HScMImHZHvgjUFQT1jiD9b2BL/DS43Pg==} - '@ioredis/commands@1.2.0': resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} @@ -3186,10 +3177,6 @@ packages: resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} engines: {node: '>=8'} - '@lukeed/uuid@2.0.1': - resolution: {integrity: sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==} - engines: {node: '>=8'} - '@metamask/detect-provider@2.0.0': resolution: {integrity: sha512-sFpN+TX13E9fdBDh9lvQeZdJn4qYoRb/6QF2oZZK/Pn559IhCFacPMU1rMuqyXoFQF3JSJfii2l98B87QDPeCQ==} engines: {node: '>=14.0.0'} @@ -4813,28 +4800,6 @@ packages: '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@segment/analytics-core@1.3.0': - resolution: {integrity: sha512-ujScWZH49NK1hYlp2/EMw45nOPEh+pmTydAnR6gSkRNucZD4fuinvpPL03rmFCw8ibaMuKLAdgPJfQ0gkLKZ5A==} - - '@segment/analytics-next@1.54.0': - resolution: {integrity: sha512-KJ1sZswWab0KkufhXHF+Gjscm/sZmHdLybvOASe9smRDhnyaqmDxZqCWJnwS8LVIhy7mG4DvPynpyj8TL2JLdQ==} - - '@segment/analytics.js-video-plugins@0.2.1': - resolution: {integrity: sha512-lZwCyEXT4aaHBLNK433okEKdxGAuyrVmop4BpQqQSJuRz0DglPZgd9B/XjiiWs1UyOankg2aNYMN3VcS8t4eSQ==} - - '@segment/facade@3.4.10': - resolution: {integrity: sha512-xVQBbB/lNvk/u8+ey0kC/+g8pT3l0gCT8O2y9Z+StMMn3KAFAQ9w8xfgef67tJybktOKKU7pQGRPolRM1i1pdA==} - - '@segment/isodate-traverse@1.1.1': - resolution: {integrity: sha512-+G6e1SgAUkcq0EDMi+SRLfT48TNlLPF3QnSgFGVs0V9F3o3fq/woQ2rHFlW20W0yy5NnCUH0QGU3Am2rZy/E3w==} - - '@segment/isodate@1.0.3': - resolution: {integrity: sha512-BtanDuvJqnACFkeeYje7pWULVv8RgZaqKHWwGFnL/g/TH/CcZjkIVTfGDp/MAxmilYHUkrX70SqwnYSTNEaN7A==} - - '@segment/tsub@2.0.0': - resolution: {integrity: sha512-NzkBK8GwPsyQ74AceLjENbUoaFrObnzEKOX4ko2wZDuIyK+DnDm3B//8xZYI2LCKt+wUD55l6ygfjCoVs8RMWw==} - hasBin: true - '@sentry/core@5.30.0': resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} engines: {node: '>=6'} @@ -4964,517 +4929,6 @@ packages: '@stablelib/x25519@1.0.3': resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} - '@stdlib/array-float32@0.0.6': - resolution: {integrity: sha512-QgKT5UaE92Rv7cxfn7wBKZAlwFFHPla8eXsMFsTGt5BiL4yUy36lwinPUh4hzybZ11rw1vifS3VAPuk6JP413Q==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/array-float64@0.0.6': - resolution: {integrity: sha512-oE8y4a84LyBF1goX5//sU1mOjet8gLI0/6wucZcjg+j/yMmNV1xFu84Az9GOGmFSE6Ze6lirGOhfBeEWNNNaJg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/array-uint16@0.0.6': - resolution: {integrity: sha512-/A8Tr0CqJ4XScIDRYQawosko8ha1Uy+50wsTgJhjUtXDpPRp7aUjmxvYkbe7Rm+ImYYbDQVix/uCiPAFQ8ed4Q==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/array-uint32@0.0.6': - resolution: {integrity: sha512-2hFPK1Fg7obYPZWlGDjW9keiIB6lXaM9dKmJubg/ergLQCsJQJZpYsG6mMAfTJi4NT1UF4jTmgvyKD+yf0D9cA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/array-uint8@0.0.7': - resolution: {integrity: sha512-qYJQQfGKIcky6TzHFIGczZYTuVlut7oO+V8qUBs7BJC9TwikVnnOmb3hY3jToY4xaoi5p9OvgdJKPInhyIhzFg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/assert-has-float32array-support@0.0.8': - resolution: {integrity: sha512-Yrg7K6rBqwCzDWZ5bN0VWLS5dNUWcoSfUeU49vTERdUmZID06J069CDc07UUl8vfQWhFgBWGocH3rrpKm1hi9w==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/assert-has-float64array-support@0.0.8': - resolution: {integrity: sha512-UVQcoeWqgMw9b8PnAmm/sgzFnuWkZcNhJoi7xyMjbiDV/SP1qLCrvi06mq86cqS3QOCma1fEayJdwgteoXyyuw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/assert-has-node-buffer-support@0.0.8': - resolution: {integrity: sha512-fgI+hW4Yg4ciiv4xVKH+1rzdV7e5+6UKgMnFbc1XDXHcxLub3vOr8+H6eDECdAIfgYNA7X0Dxa/DgvX9dwDTAQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/assert-has-own-property@0.0.7': - resolution: {integrity: sha512-3YHwSWiUqGlTLSwxAWxrqaD1PkgcJniGyotJeIt5X0tSNmSW0/c9RWroCImTUUB3zBkyBJ79MyU9Nf4Qgm59fQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/assert-has-symbol-support@0.0.8': - resolution: {integrity: sha512-PoQ9rk8DgDCuBEkOIzGGQmSnjtcdagnUIviaP5YskB45/TJHXseh4NASWME8FV77WFW9v/Wt1MzKFKMzpDFu4Q==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/assert-has-tostringtag-support@0.0.9': - resolution: {integrity: sha512-UTsqdkrnQ7eufuH5BeyWOJL3ska3u5nvDWKqw3onNNZ2mvdgkfoFD7wHutVGzAA2rkTsSJAMBHVwWLsm5SbKgw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/assert-has-uint16array-support@0.0.8': - resolution: {integrity: sha512-vqFDn30YrtzD+BWnVqFhB130g3cUl2w5AdOxhIkRkXCDYAM5v7YwdNMJEON+D4jI8YB4D5pEYjqKweYaCq4nyg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/assert-has-uint32array-support@0.0.8': - resolution: {integrity: sha512-tJtKuiFKwFSQQUfRXEReOVGXtfdo6+xlshSfwwNWXL1WPP2LrceoiUoQk7zMCMT6VdbXgGH92LDjVcPmSbH4Xw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/assert-has-uint8array-support@0.0.8': - resolution: {integrity: sha512-ie4vGTbAS/5Py+LLjoSQi0nwtYBp+WKk20cMYCzilT0rCsBI/oez0RqHrkYYpmt4WaJL4eJqC+/vfQ5NsI7F5w==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/assert-is-array@0.0.7': - resolution: {integrity: sha512-/o6KclsGkNcZ5hiROarsD9XUs6xQMb4lTwF6O71UHbKWTtomEF/jD0rxLvlvj0BiCxfKrReddEYd2CnhUyskMA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/assert-is-big-endian@0.0.7': - resolution: {integrity: sha512-BvutsX84F76YxaSIeS5ZQTl536lz+f+P7ew68T1jlFqxBhr4v7JVYFmuf24U040YuK1jwZ2sAq+bPh6T09apwQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/assert-is-boolean@0.0.8': - resolution: {integrity: sha512-PRCpslMXSYqFMz1Yh4dG2K/WzqxTCtlKbgJQD2cIkAtXux4JbYiXCtepuoV7l4Wv1rm0a1eU8EqNPgnOmWajGw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/assert-is-buffer@0.0.8': - resolution: {integrity: sha512-SYmGwOXkzZVidqUyY1IIx6V6QnSL36v3Lcwj8Rvne/fuW0bU2OomsEBzYCFMvcNgtY71vOvgZ9VfH3OppvV6eA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/assert-is-float32array@0.0.8': - resolution: {integrity: sha512-Phk0Ze7Vj2/WLv5Wy8Oo7poZIDMSTiTrEnc1t4lBn3Svz2vfBXlvCufi/i5d93vc4IgpkdrOEwfry6nldABjNQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/assert-is-float64array@0.0.8': - resolution: {integrity: sha512-UC0Av36EEYIgqBbCIz1lj9g7qXxL5MqU1UrWun+n91lmxgdJ+Z77fHy75efJbJlXBf6HXhcYXECIsc0u3SzyDQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/assert-is-function@0.0.8': - resolution: {integrity: sha512-M55Dt2njp5tnY8oePdbkKBRIypny+LpCMFZhEjJIxjLE4rA6zSlHs1yRMqD4PmW+Wl9WTeEM1GYO4AQHl1HAjA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/assert-is-little-endian@0.0.7': - resolution: {integrity: sha512-SPObC73xXfDXY0dOewXR0LDGN3p18HGzm+4K8azTj6wug0vpRV12eB3hbT28ybzRCa6TAKUjwM/xY7Am5QzIlA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/assert-is-number@0.0.7': - resolution: {integrity: sha512-mNV4boY1cUOmoWWfA2CkdEJfXA6YvhcTvwKC0Fzq+HoFFOuTK/scpTd9HanUyN6AGBlWA8IW+cQ1ZwOT3XMqag==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/assert-is-object-like@0.0.8': - resolution: {integrity: sha512-pe9selDPYAu/lYTFV5Rj4BStepgbzQCr36b/eC8EGSJh6gMgRXgHVv0R+EbdJ69KNkHvKKRjnWj0A/EmCwW+OA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/assert-is-object@0.0.8': - resolution: {integrity: sha512-ooPfXDp9c7w+GSqD2NBaZ/Du1JRJlctv+Abj2vRJDcDPyrnRTb1jmw+AuPgcW7Ca7op39JTbArI+RVHm/FPK+Q==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/assert-is-plain-object@0.0.7': - resolution: {integrity: sha512-t/CEq2a083ajAgXgSa5tsH8l3kSoEqKRu1qUwniVLFYL4RGv3615CrpJUDQKVtEX5S/OKww5q0Byu3JidJ4C5w==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/assert-is-regexp-string@0.0.9': - resolution: {integrity: sha512-FYRJJtH7XwXEf//X6UByUC0Eqd0ZYK5AC8or5g5m5efQrgr2lOaONHyDQ3Scj1A2D6QLIJKZc9XBM4uq5nOPXA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/assert-is-regexp@0.0.7': - resolution: {integrity: sha512-ty5qvLiqkDq6AibHlNJe0ZxDJ9Mg896qolmcHb69mzp64vrsORnPPOTzVapAq0bEUZbXoypeijypLPs9sCGBSQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/assert-is-string@0.0.8': - resolution: {integrity: sha512-Uk+bR4cglGBbY0q7O7HimEJiW/DWnO1tSzr4iAGMxYgf+VM2PMYgI5e0TLy9jOSOzWon3YS39lc63eR3a9KqeQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/assert-is-uint16array@0.0.8': - resolution: {integrity: sha512-M+qw7au+qglRXcXHjvoUZVLlGt1mPjuKudrVRto6KL4+tDsP2j+A89NDP3Fz8/XIUD+5jhj+65EOKHSMvDYnng==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/assert-is-uint32array@0.0.8': - resolution: {integrity: sha512-cnZi2DicYcplMnkJ3dBxBVKsRNFjzoGpmG9A6jXq4KH5rFl52SezGAXSVY9o5ZV7bQGaF5JLyCLp6n9Y74hFGg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/assert-is-uint8array@0.0.8': - resolution: {integrity: sha512-8cqpDQtjnJAuVtRkNAktn45ixq0JHaGJxVsSiK79k7GRggvMI6QsbzO6OvcLnZ/LimD42FmgbLd13Yc2esDmZw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/assert-tools-array-function@0.0.7': - resolution: {integrity: sha512-3lqkaCIBMSJ/IBHHk4NcCnk2NYU52tmwTYbbqhAmv7vim8rZPNmGfj3oWkzrCsyCsyTF7ooD+In2x+qTmUbCtQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/buffer-ctor@0.0.7': - resolution: {integrity: sha512-4IyTSGijKUQ8+DYRaKnepf9spvKLZ+nrmZ+JrRcB3FrdTX/l9JDpggcUcC/Fe+A4KIZOnClfxLn6zfIlkCZHNA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/buffer-from-string@0.0.8': - resolution: {integrity: sha512-Dws5ZbK2M9l4Bkn/ODHFm3lNZ8tWko+NYXqGS/UH/RIQv3PGp+1tXFUSvjwjDneM6ppjQVExzVedUH1ftABs9A==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/cli-ctor@0.0.3': - resolution: {integrity: sha512-0zCuZnzFyxj66GoF8AyIOhTX5/mgGczFvr6T9h4mXwegMZp8jBC/ZkOGMwmp+ODLBTvlcnnDNpNFkDDyR6/c2g==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/complex-float32@0.0.7': - resolution: {integrity: sha512-POCtQcBZnPm4IrFmTujSaprR1fcOFr/MRw2Mt7INF4oed6b1nzeG647K+2tk1m4mMrMPiuXCdvwJod4kJ0SXxQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/complex-float64@0.0.8': - resolution: {integrity: sha512-lUJwsXtGEziOWAqCcnKnZT4fcVoRsl6t6ECaCJX45Z7lAc70yJLiwUieLWS5UXmyoADHuZyUXkxtI4oClfpnaw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/complex-reim@0.0.6': - resolution: {integrity: sha512-28WXfPSIFMtHb0YgdatkGS4yxX5sPYea5MiNgqPv3E78+tFcg8JJG52NQ/MviWP2wsN9aBQAoCPeu8kXxSPdzA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/complex-reimf@0.0.1': - resolution: {integrity: sha512-P9zu05ZW2i68Oppp3oHelP7Tk0D7tGBL0hGl1skJppr2vY9LltuNbeYI3C96tQe/7Enw/5GyAWgxoQI4cWccQA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/constants-float64-exponent-bias@0.0.8': - resolution: {integrity: sha512-IzBJQw9hYgWCki7VoC/zJxEA76Nmf8hmY+VkOWnJ8IyfgTXClgY8tfDGS1cc4l/hCOEllxGp9FRvVdn24A5tKQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/constants-float64-high-word-abs-mask@0.0.1': - resolution: {integrity: sha512-1vy8SUyMHFBwqUUVaZFA7r4/E3cMMRKSwsaa/EZ15w7Kmc01W/ZmaaTLevRcIdACcNgK+8i8813c8H7LScXNcQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/constants-float64-high-word-exponent-mask@0.0.8': - resolution: {integrity: sha512-z28/EQERc0VG7N36bqdvtrRWjFc8600PKkwvl/nqx6TpKAzMXNw55BS1xT4C28Sa9Z7uBWeUj3UbIFedbkoyMw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/constants-float64-high-word-sign-mask@0.0.1': - resolution: {integrity: sha512-hmTr5caK1lh1m0eyaQqt2Vt3y+eEdAx57ndbADEbXhxC9qSGd0b4bLSzt/Xp4MYBYdQkHAE/BlkgUiRThswhCg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/constants-float64-max-base2-exponent-subnormal@0.0.8': - resolution: {integrity: sha512-YGBZykSiXFebznnJfWFDwhho2Q9xhUWOL+X0lZJ4ItfTTo40W6VHAyNYz98tT/gJECFype0seNzzo1nUxCE7jQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/constants-float64-max-base2-exponent@0.0.8': - resolution: {integrity: sha512-xBAOtso1eiy27GnTut2difuSdpsGxI8dJhXupw0UukGgvy/3CSsyNm+a1Suz/dhqK4tPOTe5QboIdNMw5IgXKQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/constants-float64-min-base2-exponent-subnormal@0.0.8': - resolution: {integrity: sha512-bt81nBus/91aEqGRQBenEFCyWNsf8uaxn4LN1NjgkvY92S1yVxXFlC65fJHsj9FTqvyZ+uj690/gdMKUDV3NjQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/constants-float64-ninf@0.0.8': - resolution: {integrity: sha512-bn/uuzCne35OSLsQZJlNrkvU1/40spGTm22g1+ZI1LL19J8XJi/o4iupIHRXuLSTLFDBqMoJlUNphZlWQ4l8zw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/constants-float64-pinf@0.0.8': - resolution: {integrity: sha512-I3R4rm2cemoMuiDph07eo5oWZ4ucUtpuK73qBJiJPDQKz8fSjSe4wJBAigq2AmWYdd7yJHsl5NJd8AgC6mP5Qw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/constants-float64-smallest-normal@0.0.8': - resolution: {integrity: sha512-Qwxpn5NA3RXf+mQcffCWRcsHSPTUQkalsz0+JDpblDszuz2XROcXkOdDr5LKgTAUPIXsjOgZzTsuRONENhsSEg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/constants-uint16-max@0.0.7': - resolution: {integrity: sha512-7TPoku7SlskA67mAm7mykIAjeEnkQJemw1cnKZur0mT5W4ryvDR6iFfL9xBiByVnWYq/+ei7DHbOv6/2b2jizw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/constants-uint32-max@0.0.7': - resolution: {integrity: sha512-8+NK0ewqc1vnEZNqzwFJgFSy3S543Eft7i8WyW/ygkofiqEiLAsujvYMHzPAB8/3D+PYvjTSe37StSwRwvQ6uw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/constants-uint8-max@0.0.7': - resolution: {integrity: sha512-fqV+xds4jgwFxwWu08b8xDuIoW6/D4/1dtEjZ1sXVeWR7nf0pjj1cHERq4kdkYxsvOGu+rjoR3MbjzpFc4fvSw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/fs-exists@0.0.8': - resolution: {integrity: sha512-mZktcCxiLmycCJefm1+jbMTYkmhK6Jk1ShFmUVqJvs+Ps9/2EEQXfPbdEniLoVz4HeHLlcX90JWobUEghOOnAQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/fs-read-file@0.0.8': - resolution: {integrity: sha512-pIZID/G91+q7ep4x9ECNC45+JT2j0+jdz/ZQVjCHiEwXCwshZPEvxcPQWb9bXo6coOY+zJyX5TwBIpXBxomWFg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/fs-resolve-parent-path@0.0.8': - resolution: {integrity: sha512-ok1bTWsAziChibQE3u7EoXwbCQUDkFjjRAHSxh7WWE5JEYVJQg1F0o3bbjRr4D/wfYYPWLAt8AFIKBUDmWghpg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/math-base-assert-is-infinite@0.0.9': - resolution: {integrity: sha512-JuPDdmxd+AtPWPHu9uaLvTsnEPaZODZk+zpagziNbDKy8DRiU1cy+t+QEjB5WizZt0A5MkuxDTjZ/8/sG5GaYQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/math-base-assert-is-nan@0.0.8': - resolution: {integrity: sha512-m+gCVBxLFW8ZdAfdkATetYMvM7sPFoMKboacHjb1pe21jHQqVb+/4bhRSDg6S7HGX7/8/bSzEUm9zuF7vqK5rQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/math-base-napi-binary@0.0.8': - resolution: {integrity: sha512-B8d0HBPhfXefbdl/h0h5c+lM2sE+/U7Fb7hY/huVeoQtBtEx0Jbx/qKvPSVxMjmWCKfWlbPpbgKpN5GbFgLiAg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/math-base-napi-unary@0.0.9': - resolution: {integrity: sha512-2WNKhjCygkGMp0RgjaD7wAHJTqPZmuVW7yPOc62Tnz2U+Ad8q/tcOcN+uvq2dtKsAGr1HDMIQxZ/XrrThMePyA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/math-base-special-abs@0.0.6': - resolution: {integrity: sha512-FaaMUnYs2qIVN3kI5m/qNlBhDnjszhDOzEhxGEoQWR/k0XnxbCsTyjNesR2DkpiKuoAXAr9ojoDe2qBYdirWoQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/math-base-special-copysign@0.0.7': - resolution: {integrity: sha512-7Br7oeuVJSBKG8BiSk/AIRFTBd2sbvHdV3HaqRj8tTZHX8BQomZ3Vj4Qsiz3kPyO4d6PpBLBTYlGTkSDlGOZJA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/math-base-special-ldexp@0.0.5': - resolution: {integrity: sha512-RLRsPpCdcJZMhwb4l4B/FsmGfEPEWAsik6KYUkUSSHb7ok/gZWt8LgVScxGMpJMpl5IV0v9qG4ZINVONKjX5KA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/number-ctor@0.0.7': - resolution: {integrity: sha512-kXNwKIfnb10Ro3RTclhAYqbE3DtIXax+qpu0z1/tZpI2vkmTfYDQLno2QJrzJsZZgdeFtXIws+edONN9kM34ow==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/number-float64-base-exponent@0.0.6': - resolution: {integrity: sha512-wLXsG+cvynmapoffmj5hVNDH7BuHIGspBcTCdjPaD+tnqPDIm03qV5Z9YBhDh91BdOCuPZQ8Ovu2WBpX+ySeGg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/number-float64-base-from-words@0.0.6': - resolution: {integrity: sha512-r0elnekypCN831aw9Gp8+08br8HHAqvqtc5uXaxEh3QYIgBD/QM5qSb3b7WSAQ0ZxJJKdoykupODWWBkWQTijg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/number-float64-base-get-high-word@0.0.6': - resolution: {integrity: sha512-jSFSYkgiG/IzDurbwrDKtWiaZeSEJK8iJIsNtbPG1vOIdQMRyw+t0bf3Kf3vuJu/+bnSTvYZLqpCO6wzT/ve9g==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/number-float64-base-normalize@0.0.9': - resolution: {integrity: sha512-+rm7RQJEj8zHkqYFE2a6DgNQSB5oKE/IydHAajgZl40YB91BoYRYf/ozs5/tTwfy2Fc04+tIpSfFtzDr4ZY19Q==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/number-float64-base-to-float32@0.0.7': - resolution: {integrity: sha512-PNUSi6+cqfFiu4vgFljUKMFY2O9PxI6+T+vqtIoh8cflf+PjSGj3v4QIlstK9+6qU40eGR5SHZyLTWdzmNqLTQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/number-float64-base-to-words@0.0.7': - resolution: {integrity: sha512-7wsYuq+2MGp9rAkTnQ985rah7EJI9TfgHrYSSd4UIu4qIjoYmWIKEhIDgu7/69PfGrls18C3PxKg1pD/v7DQTg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/os-byte-order@0.0.7': - resolution: {integrity: sha512-rRJWjFM9lOSBiIX4zcay7BZsqYBLoE32Oz/Qfim8cv1cN1viS5D4d3DskRJcffw7zXDnG3oZAOw5yZS0FnlyUg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/os-float-word-order@0.0.7': - resolution: {integrity: sha512-gXIcIZf+ENKP7E41bKflfXmPi+AIfjXW/oU+m8NbP3DQasqHaZa0z5758qvnbO8L1lRJb/MzLOkIY8Bx/0cWEA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/process-cwd@0.0.8': - resolution: {integrity: sha512-GHINpJgSlKEo9ODDWTHp0/Zc/9C/qL92h5Mc0QlIFBXAoUjy6xT4FB2U16wCNZMG3eVOzt5+SjmCwvGH0Wbg3Q==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/process-read-stdin@0.0.7': - resolution: {integrity: sha512-nep9QZ5iDGrRtrZM2+pYAvyCiYG4HfO0/9+19BiLJepjgYq4GKeumPAQo22+1xawYDL7Zu62uWzYszaVZcXuyw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/regexp-eol@0.0.7': - resolution: {integrity: sha512-BTMpRWrmlnf1XCdTxOrb8o6caO2lmu/c80XSyhYCi1DoizVIZnqxOaN5yUJNCr50g28vQ47PpsT3Yo7J3SdlRA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/regexp-extended-length-path@0.0.7': - resolution: {integrity: sha512-z6uqzMWq3WPDKbl4MIZJoNA5ZsYLQI9G3j2TIvhU8X2hnhlku8p4mvK9F+QmoVvgPxKliwNnx/DAl7ltutSDKw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/regexp-function-name@0.0.7': - resolution: {integrity: sha512-MaiyFUUqkAUpUoz/9F6AMBuMQQfA9ssQfK16PugehLQh4ZtOXV1LhdY8e5Md7SuYl9IrvFVg1gSAVDysrv5ZMg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/regexp-regexp@0.0.8': - resolution: {integrity: sha512-S5PZICPd/XRcn1dncVojxIDzJsHtEleuJHHD7ji3o981uPHR7zI2Iy9a1eV2u7+ABeUswbI1Yuix6fXJfcwV1w==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/streams-node-stdin@0.0.7': - resolution: {integrity: sha512-gg4lgrjuoG3V/L29wNs32uADMCqepIcmoOFHJCTAhVe0GtHDLybUVnLljaPfdvmpPZmTvmusPQtIcscbyWvAyg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/string-base-format-interpolate@0.0.4': - resolution: {integrity: sha512-8FC8+/ey+P5hf1B50oXpXzRzoAgKI1rikpyKZ98Xmjd5rcbSq3NWYi8TqOF8mUHm9hVZ2CXWoNCtEe2wvMQPMg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/string-base-format-tokenize@0.0.4': - resolution: {integrity: sha512-+vMIkheqAhDeT/iF5hIQo95IMkt5IzC68eR3CxW1fhc48NMkKFE2UfN73ET8fmLuOanLo/5pO2E90c2G7PExow==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/string-format@0.0.3': - resolution: {integrity: sha512-1jiElUQXlI/tTkgRuzJi9jUz/EjrO9kzS8VWHD3g7gdc3ZpxlA5G9JrIiPXGw/qmZTi0H1pXl6KmX+xWQEQJAg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/string-lowercase@0.0.9': - resolution: {integrity: sha512-tXFFjbhIlDak4jbQyV1DhYiSTO8b1ozS2g/LELnsKUjIXECDKxGFyWYcz10KuyAWmFotHnCJdIm8/blm2CfDIA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/string-replace@0.0.11': - resolution: {integrity: sha512-F0MY4f9mRE5MSKpAUfL4HLbJMCbG6iUTtHAWnNeAXIvUX1XYIw/eItkA58R9kNvnr1l5B08bavnjrgTJGIKFFQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/types@0.0.14': - resolution: {integrity: sha512-AP3EI9/il/xkwUazcoY+SbjtxHRrheXgSbWZdEGD+rWpEgj6n2i63hp6hTOpAB5NipE0tJwinQlDGOuQ1lCaCw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/utils-constructor-name@0.0.8': - resolution: {integrity: sha512-GXpyNZwjN8u3tyYjL2GgGfrsxwvfogUC3gg7L7NRZ1i86B6xmgfnJUYHYOUnSfB+R531ET7NUZlK52GxL7P82Q==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/utils-convert-path@0.0.8': - resolution: {integrity: sha512-GNd8uIswrcJCctljMbmjtE4P4oOjhoUIfMvdkqfSrRLRY+ZqPB2xM+yI0MQFfUq/0Rnk/xtESlGSVLz9ZDtXfA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/utils-define-nonenumerable-read-only-property@0.0.7': - resolution: {integrity: sha512-c7dnHDYuS4Xn3XBRWIQBPcROTtP/4lkcFyq0FrQzjXUjimfMgHF7cuFIIob6qUTnU8SOzY9p0ydRR2QJreWE6g==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/utils-define-property@0.0.9': - resolution: {integrity: sha512-pIzVvHJvVfU/Lt45WwUAcodlvSPDDSD4pIPc9WmIYi4vnEBA9U7yHtiNz2aTvfGmBMTaLYTVVFIXwkFp+QotMA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/utils-escape-regexp-string@0.0.9': - resolution: {integrity: sha512-E+9+UDzf2mlMLgb+zYrrPy2FpzbXh189dzBJY6OG+XZqEJAXcjWs7DURO5oGffkG39EG5KXeaQwDXUavcMDCIw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/utils-get-prototype-of@0.0.7': - resolution: {integrity: sha512-fCUk9lrBO2ELrq+/OPJws1/hquI4FtwG0SzVRH6UJmJfwb1zoEFnjcwyDAy+HWNVmo3xeRLsrz6XjHrJwer9pg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/utils-global@0.0.7': - resolution: {integrity: sha512-BBNYBdDUz1X8Lhfw9nnnXczMv9GztzGpQ88J/6hnY7PHJ71av5d41YlijWeM9dhvWjnH9I7HNE3LL7R07yw0kA==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/utils-library-manifest@0.0.8': - resolution: {integrity: sha512-IOQSp8skSRQn9wOyMRUX9Hi0j/P5v5TvD8DJWTqtE8Lhr8kVVluMBjHfvheoeKHxfWAbNHSVpkpFY/Bdh/SHgQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - hasBin: true - - '@stdlib/utils-native-class@0.0.8': - resolution: {integrity: sha512-0Zl9me2V9rSrBw/N8o8/9XjmPUy8zEeoMM0sJmH3N6C9StDsYTjXIAMPGzYhMEWaWHvGeYyNteFK2yDOVGtC3w==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/utils-next-tick@0.0.8': - resolution: {integrity: sha512-l+hPl7+CgLPxk/gcWOXRxX/lNyfqcFCqhzzV/ZMvFCYLY/wI9lcWO4xTQNMALY2rp+kiV+qiAiO9zcO+hewwUg==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/utils-noop@0.0.14': - resolution: {integrity: sha512-A5faFEUfszMgd93RCyB+aWb62hQxgP+dZ/l9rIOwNWbIrCYNwSuL4z50lNJuatnwwU4BQ4EjQr+AmBsnvuLcyQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/utils-regexp-from-string@0.0.9': - resolution: {integrity: sha512-3rN0Mcyiarl7V6dXRjFAUMacRwe0/sYX7ThKYurf0mZkMW9tjTP+ygak9xmL9AL0QQZtbrFFwWBrDO+38Vnavw==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - - '@stdlib/utils-type-of@0.0.8': - resolution: {integrity: sha512-b4xqdy3AnnB7NdmBBpoiI67X4vIRxvirjg3a8BfhM5jPr2k0njby1jAbG9dUxJvgAV6o32S4kjUgfIdjEYpTNQ==} - engines: {node: '>=0.10.0', npm: '>2.7.0'} - os: [aix, darwin, freebsd, linux, macos, openbsd, sunos, win32, windows] - '@swc-node/core@1.15.0': resolution: {integrity: sha512-WAerrrl087WgenB92XG4Th2t0NQFfMNLYSe0sW2cEMMqM/LQmP4rozsDJl0vuzTrbewjpKQryxFXI+aYig/dBg==} engines: {node: '>= 10'} @@ -7516,9 +6970,6 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - docker-compose@0.24.8: resolution: {integrity: sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw==} engines: {node: '>= 6.0.0'} @@ -7579,10 +7030,6 @@ packages: resolution: {gitHosted: true, integrity: sha512-cTKz9+PTVIvBARdhqEpjgxSzvzYPj5vV5gAcJWnh4pfkIywTbZdBbvagyBjjnd6AzdW8i7NIFG7YyPd8sHiR2g==, tarball: https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0} version: 1.0.0 - dset@3.1.2: - resolution: {integrity: sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==} - engines: {node: '>=4'} - dts-resolver@3.0.0: resolution: {integrity: sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==} engines: {node: ^22.18.0 || >=24.0.0} @@ -9232,10 +8679,6 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - js-cookie@3.0.1: - resolution: {integrity: sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==} - engines: {node: '>=12'} - js-levenshtein@1.1.6: resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} engines: {node: '>=0.10.0'} @@ -9885,9 +9328,6 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - new-date@1.0.3: - resolution: {integrity: sha512-0fsVvQPbo2I18DT2zVHpezmeeNYV2JaJSrseiHLc17GNOxJzUdx5mvSigPu8LtIfZSij5i1wXnXFspEs2CD6hA==} - next-auth@5.0.0-beta.30: resolution: {integrity: sha512-+c51gquM3F6nMVmoAusRJ7RIoY0K4Ts9HCCwyy/BRoe4mp3msZpOzYMyb5LAYc1wSo74PMQkGDcaghIO7W6Xjg==} peerDependencies: @@ -10073,9 +9513,6 @@ packages: oauth4webapi@3.8.3: resolution: {integrity: sha512-pQ5BsX3QRTgnt5HxgHwgunIRaDXBdkT23tf8dfzmtTIL2LTpdmxgbpbBm0VgFWAIDlezQvQCTgnVIUmHupXHxw==} - obj-case@0.2.1: - resolution: {integrity: sha512-PquYBBTy+Y6Ob/O2574XHhDtHJlV1cJHMCgW+rDRc9J5hhmRelJB3k5dTK/3cVmFVtzvAKuENeuLpoyTzMzkOg==} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -11328,9 +10765,6 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} - spark-md5@3.0.2: - resolution: {integrity: sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==} - spawn-command@0.0.2: resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} @@ -11639,9 +11073,6 @@ packages: resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} engines: {node: '>=0.6.0'} - tiny-hashes@1.0.1: - resolution: {integrity: sha512-knIN5zj4fl7kW4EBU5sLP20DWUvi/rVouvJezV0UAym2DkQaqm365Nyc8F3QEiOvunNDMxR8UhcXd1d5g+Wg1g==} - tiny-invariant@1.3.1: resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} @@ -11978,9 +11409,6 @@ packages: unenv@1.9.0: resolution: {integrity: sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==} - unfetch@3.1.2: - resolution: {integrity: sha512-L0qrK7ZeAudGiKYw6nzFjnJ2D5WHblUBwmHIqtPS6oKUd+Hcpk7/hKsSmcHsTlpd1TbTNsiRBUKRq3bHLNIqIw==} - unfetch@4.2.0: resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} @@ -14436,14 +13864,6 @@ snapshots: dependencies: buffer: 6.0.3 - '@imtbl/react-analytics@0.3.4-alpha(encoding@0.1.13)(supports-color@8.1.1)': - dependencies: - '@segment/analytics-next': 1.54.0(encoding@0.1.13)(supports-color@8.1.1) - react: 19.2.8 - transitivePeerDependencies: - - encoding - - supports-color - '@ioredis/commands@1.2.0': {} '@isaacs/cliui@8.0.2': @@ -14861,10 +14281,6 @@ snapshots: '@lukeed/csprng@1.1.0': {} - '@lukeed/uuid@2.0.1': - dependencies: - '@lukeed/csprng': 1.1.0 - '@metamask/detect-provider@2.0.0': {} '@metamask/eth-sig-util@4.0.1': @@ -16537,55 +15953,6 @@ snapshots: '@sec-ant/readable-stream@0.4.1': optional: true - '@segment/analytics-core@1.3.0': - dependencies: - '@lukeed/uuid': 2.0.1 - dset: 3.1.2 - tslib: 2.8.1 - - '@segment/analytics-next@1.54.0(encoding@0.1.13)(supports-color@8.1.1)': - dependencies: - '@lukeed/uuid': 2.0.1 - '@segment/analytics-core': 1.3.0 - '@segment/analytics.js-video-plugins': 0.2.1 - '@segment/facade': 3.4.10 - '@segment/tsub': 2.0.0(supports-color@8.1.1) - dset: 3.1.2 - js-cookie: 3.0.1 - node-fetch: 2.7.0(encoding@0.1.13) - spark-md5: 3.0.2 - tslib: 2.6.3 - unfetch: 4.2.0 - transitivePeerDependencies: - - encoding - - supports-color - - '@segment/analytics.js-video-plugins@0.2.1': - dependencies: - unfetch: 3.1.2 - - '@segment/facade@3.4.10': - dependencies: - '@segment/isodate-traverse': 1.1.1 - inherits: 2.0.4 - new-date: 1.0.3 - obj-case: 0.2.1 - - '@segment/isodate-traverse@1.1.1': - dependencies: - '@segment/isodate': 1.0.3 - - '@segment/isodate@1.0.3': {} - - '@segment/tsub@2.0.0(supports-color@8.1.1)': - dependencies: - '@stdlib/math-base-special-ldexp': 0.0.5(supports-color@8.1.1) - dlv: 1.1.3 - dset: 3.1.2 - tiny-hashes: 1.0.1 - transitivePeerDependencies: - - supports-color - '@sentry/core@5.30.0': dependencies: '@sentry/hub': 5.30.0 @@ -16767,624 +16134,6 @@ snapshots: '@stablelib/random': 1.0.2 '@stablelib/wipe': 1.0.1 - '@stdlib/array-float32@0.0.6(supports-color@8.1.1)': - dependencies: - '@stdlib/assert-has-float32array-support': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/array-float64@0.0.6': - dependencies: - '@stdlib/assert-has-float64array-support': 0.0.8 - - '@stdlib/array-uint16@0.0.6': - dependencies: - '@stdlib/assert-has-uint16array-support': 0.0.8 - - '@stdlib/array-uint32@0.0.6': - dependencies: - '@stdlib/assert-has-uint32array-support': 0.0.8 - - '@stdlib/array-uint8@0.0.7': - dependencies: - '@stdlib/assert-has-uint8array-support': 0.0.8 - - '@stdlib/assert-has-float32array-support@0.0.8(supports-color@8.1.1)': - dependencies: - '@stdlib/assert-is-float32array': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/constants-float64-pinf': 0.0.8(supports-color@8.1.1) - '@stdlib/fs-read-file': 0.0.8 - transitivePeerDependencies: - - supports-color - - '@stdlib/assert-has-float64array-support@0.0.8': - dependencies: - '@stdlib/assert-is-float64array': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - - '@stdlib/assert-has-node-buffer-support@0.0.8': - dependencies: - '@stdlib/assert-is-buffer': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - - '@stdlib/assert-has-own-property@0.0.7': {} - - '@stdlib/assert-has-symbol-support@0.0.8': - dependencies: - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - - '@stdlib/assert-has-tostringtag-support@0.0.9': - dependencies: - '@stdlib/assert-has-symbol-support': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - - '@stdlib/assert-has-uint16array-support@0.0.8': - dependencies: - '@stdlib/assert-is-uint16array': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/constants-uint16-max': 0.0.7 - '@stdlib/fs-read-file': 0.0.8 - - '@stdlib/assert-has-uint32array-support@0.0.8': - dependencies: - '@stdlib/assert-is-uint32array': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/constants-uint32-max': 0.0.7 - '@stdlib/fs-read-file': 0.0.8 - - '@stdlib/assert-has-uint8array-support@0.0.8': - dependencies: - '@stdlib/assert-is-uint8array': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/constants-uint8-max': 0.0.7 - '@stdlib/fs-read-file': 0.0.8 - - '@stdlib/assert-is-array@0.0.7': - dependencies: - '@stdlib/utils-native-class': 0.0.8 - - '@stdlib/assert-is-big-endian@0.0.7': - dependencies: - '@stdlib/array-uint16': 0.0.6 - '@stdlib/array-uint8': 0.0.7 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - - '@stdlib/assert-is-boolean@0.0.8': - dependencies: - '@stdlib/assert-has-tostringtag-support': 0.0.9 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - '@stdlib/utils-native-class': 0.0.8 - - '@stdlib/assert-is-buffer@0.0.8': - dependencies: - '@stdlib/assert-is-object-like': 0.0.8 - - '@stdlib/assert-is-float32array@0.0.8': - dependencies: - '@stdlib/utils-native-class': 0.0.8 - - '@stdlib/assert-is-float64array@0.0.8': - dependencies: - '@stdlib/utils-native-class': 0.0.8 - - '@stdlib/assert-is-function@0.0.8': - dependencies: - '@stdlib/utils-type-of': 0.0.8 - - '@stdlib/assert-is-little-endian@0.0.7': - dependencies: - '@stdlib/array-uint16': 0.0.6 - '@stdlib/array-uint8': 0.0.7 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - - '@stdlib/assert-is-number@0.0.7': - dependencies: - '@stdlib/assert-has-tostringtag-support': 0.0.9 - '@stdlib/number-ctor': 0.0.7 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - '@stdlib/utils-native-class': 0.0.8 - - '@stdlib/assert-is-object-like@0.0.8': - dependencies: - '@stdlib/assert-tools-array-function': 0.0.7 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - - '@stdlib/assert-is-object@0.0.8': - dependencies: - '@stdlib/assert-is-array': 0.0.7 - - '@stdlib/assert-is-plain-object@0.0.7': - dependencies: - '@stdlib/assert-has-own-property': 0.0.7 - '@stdlib/assert-is-function': 0.0.8 - '@stdlib/assert-is-object': 0.0.8 - '@stdlib/utils-get-prototype-of': 0.0.7 - '@stdlib/utils-native-class': 0.0.8 - - '@stdlib/assert-is-regexp-string@0.0.9': - dependencies: - '@stdlib/assert-is-string': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - '@stdlib/process-read-stdin': 0.0.7 - '@stdlib/regexp-eol': 0.0.7 - '@stdlib/regexp-regexp': 0.0.8 - '@stdlib/streams-node-stdin': 0.0.7 - - '@stdlib/assert-is-regexp@0.0.7': - dependencies: - '@stdlib/assert-has-tostringtag-support': 0.0.9 - '@stdlib/utils-native-class': 0.0.8 - - '@stdlib/assert-is-string@0.0.8': - dependencies: - '@stdlib/assert-has-tostringtag-support': 0.0.9 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - '@stdlib/utils-native-class': 0.0.8 - - '@stdlib/assert-is-uint16array@0.0.8': - dependencies: - '@stdlib/utils-native-class': 0.0.8 - - '@stdlib/assert-is-uint32array@0.0.8': - dependencies: - '@stdlib/utils-native-class': 0.0.8 - - '@stdlib/assert-is-uint8array@0.0.8': - dependencies: - '@stdlib/utils-native-class': 0.0.8 - - '@stdlib/assert-tools-array-function@0.0.7': - dependencies: - '@stdlib/assert-is-array': 0.0.7 - - '@stdlib/buffer-ctor@0.0.7': - dependencies: - '@stdlib/assert-has-node-buffer-support': 0.0.8 - - '@stdlib/buffer-from-string@0.0.8': - dependencies: - '@stdlib/assert-is-function': 0.0.8 - '@stdlib/assert-is-string': 0.0.8 - '@stdlib/buffer-ctor': 0.0.7 - '@stdlib/string-format': 0.0.3 - - '@stdlib/cli-ctor@0.0.3': - dependencies: - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - '@stdlib/utils-noop': 0.0.14 - minimist: 1.2.8 - - '@stdlib/complex-float32@0.0.7(supports-color@8.1.1)': - dependencies: - '@stdlib/assert-is-number': 0.0.7 - '@stdlib/number-float64-base-to-float32': 0.0.7(supports-color@8.1.1) - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - '@stdlib/utils-define-property': 0.0.9 - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/complex-float64@0.0.8(supports-color@8.1.1)': - dependencies: - '@stdlib/assert-is-number': 0.0.7 - '@stdlib/complex-float32': 0.0.7(supports-color@8.1.1) - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - '@stdlib/utils-define-property': 0.0.9 - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/complex-reim@0.0.6(supports-color@8.1.1)': - dependencies: - '@stdlib/array-float64': 0.0.6 - '@stdlib/complex-float64': 0.0.8(supports-color@8.1.1) - '@stdlib/types': 0.0.14 - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/complex-reimf@0.0.1(supports-color@8.1.1)': - dependencies: - '@stdlib/array-float32': 0.0.6(supports-color@8.1.1) - '@stdlib/complex-float32': 0.0.7(supports-color@8.1.1) - '@stdlib/types': 0.0.14 - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/constants-float64-exponent-bias@0.0.8(supports-color@8.1.1)': - dependencies: - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/constants-float64-high-word-abs-mask@0.0.1(supports-color@8.1.1)': - dependencies: - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/constants-float64-high-word-exponent-mask@0.0.8(supports-color@8.1.1)': - dependencies: - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/constants-float64-high-word-sign-mask@0.0.1(supports-color@8.1.1)': - dependencies: - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/constants-float64-max-base2-exponent-subnormal@0.0.8(supports-color@8.1.1)': - dependencies: - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/constants-float64-max-base2-exponent@0.0.8(supports-color@8.1.1)': - dependencies: - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/constants-float64-min-base2-exponent-subnormal@0.0.8(supports-color@8.1.1)': - dependencies: - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/constants-float64-ninf@0.0.8(supports-color@8.1.1)': - dependencies: - '@stdlib/number-ctor': 0.0.7 - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/constants-float64-pinf@0.0.8(supports-color@8.1.1)': - dependencies: - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/constants-float64-smallest-normal@0.0.8(supports-color@8.1.1)': - dependencies: - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/constants-uint16-max@0.0.7': {} - - '@stdlib/constants-uint32-max@0.0.7': {} - - '@stdlib/constants-uint8-max@0.0.7': {} - - '@stdlib/fs-exists@0.0.8': - dependencies: - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - '@stdlib/process-cwd': 0.0.8 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - - '@stdlib/fs-read-file@0.0.8': - dependencies: - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - - '@stdlib/fs-resolve-parent-path@0.0.8': - dependencies: - '@stdlib/assert-has-own-property': 0.0.7 - '@stdlib/assert-is-function': 0.0.8 - '@stdlib/assert-is-plain-object': 0.0.7 - '@stdlib/assert-is-string': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-exists': 0.0.8 - '@stdlib/fs-read-file': 0.0.8 - '@stdlib/process-cwd': 0.0.8 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - - '@stdlib/math-base-assert-is-infinite@0.0.9(supports-color@8.1.1)': - dependencies: - '@stdlib/constants-float64-ninf': 0.0.8(supports-color@8.1.1) - '@stdlib/constants-float64-pinf': 0.0.8(supports-color@8.1.1) - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/math-base-assert-is-nan@0.0.8(supports-color@8.1.1)': - dependencies: - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/math-base-napi-binary@0.0.8(supports-color@8.1.1)': - dependencies: - '@stdlib/complex-float32': 0.0.7(supports-color@8.1.1) - '@stdlib/complex-float64': 0.0.8(supports-color@8.1.1) - '@stdlib/complex-reim': 0.0.6(supports-color@8.1.1) - '@stdlib/complex-reimf': 0.0.1(supports-color@8.1.1) - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/math-base-napi-unary@0.0.9(supports-color@8.1.1)': - dependencies: - '@stdlib/complex-float32': 0.0.7(supports-color@8.1.1) - '@stdlib/complex-float64': 0.0.8(supports-color@8.1.1) - '@stdlib/complex-reim': 0.0.6(supports-color@8.1.1) - '@stdlib/complex-reimf': 0.0.1(supports-color@8.1.1) - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/math-base-special-abs@0.0.6(supports-color@8.1.1)': - dependencies: - '@stdlib/math-base-napi-unary': 0.0.9(supports-color@8.1.1) - '@stdlib/number-float64-base-to-words': 0.0.7(supports-color@8.1.1) - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/math-base-special-copysign@0.0.7(supports-color@8.1.1)': - dependencies: - '@stdlib/constants-float64-high-word-abs-mask': 0.0.1(supports-color@8.1.1) - '@stdlib/constants-float64-high-word-sign-mask': 0.0.1(supports-color@8.1.1) - '@stdlib/math-base-napi-binary': 0.0.8(supports-color@8.1.1) - '@stdlib/number-float64-base-from-words': 0.0.6(supports-color@8.1.1) - '@stdlib/number-float64-base-get-high-word': 0.0.6(supports-color@8.1.1) - '@stdlib/number-float64-base-to-words': 0.0.7(supports-color@8.1.1) - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/math-base-special-ldexp@0.0.5(supports-color@8.1.1)': - dependencies: - '@stdlib/constants-float64-exponent-bias': 0.0.8(supports-color@8.1.1) - '@stdlib/constants-float64-max-base2-exponent': 0.0.8(supports-color@8.1.1) - '@stdlib/constants-float64-max-base2-exponent-subnormal': 0.0.8(supports-color@8.1.1) - '@stdlib/constants-float64-min-base2-exponent-subnormal': 0.0.8(supports-color@8.1.1) - '@stdlib/constants-float64-ninf': 0.0.8(supports-color@8.1.1) - '@stdlib/constants-float64-pinf': 0.0.8(supports-color@8.1.1) - '@stdlib/math-base-assert-is-infinite': 0.0.9(supports-color@8.1.1) - '@stdlib/math-base-assert-is-nan': 0.0.8(supports-color@8.1.1) - '@stdlib/math-base-special-copysign': 0.0.7(supports-color@8.1.1) - '@stdlib/number-float64-base-exponent': 0.0.6(supports-color@8.1.1) - '@stdlib/number-float64-base-from-words': 0.0.6(supports-color@8.1.1) - '@stdlib/number-float64-base-normalize': 0.0.9(supports-color@8.1.1) - '@stdlib/number-float64-base-to-words': 0.0.7(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/number-ctor@0.0.7': {} - - '@stdlib/number-float64-base-exponent@0.0.6(supports-color@8.1.1)': - dependencies: - '@stdlib/constants-float64-exponent-bias': 0.0.8(supports-color@8.1.1) - '@stdlib/constants-float64-high-word-exponent-mask': 0.0.8(supports-color@8.1.1) - '@stdlib/number-float64-base-get-high-word': 0.0.6(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/number-float64-base-from-words@0.0.6(supports-color@8.1.1)': - dependencies: - '@stdlib/array-float64': 0.0.6 - '@stdlib/array-uint32': 0.0.6 - '@stdlib/assert-is-little-endian': 0.0.7 - '@stdlib/number-float64-base-to-words': 0.0.7(supports-color@8.1.1) - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/number-float64-base-get-high-word@0.0.6(supports-color@8.1.1)': - dependencies: - '@stdlib/array-float64': 0.0.6 - '@stdlib/array-uint32': 0.0.6 - '@stdlib/assert-is-little-endian': 0.0.7 - '@stdlib/number-float64-base-to-words': 0.0.7(supports-color@8.1.1) - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/number-float64-base-normalize@0.0.9(supports-color@8.1.1)': - dependencies: - '@stdlib/constants-float64-smallest-normal': 0.0.8(supports-color@8.1.1) - '@stdlib/math-base-assert-is-infinite': 0.0.9(supports-color@8.1.1) - '@stdlib/math-base-assert-is-nan': 0.0.8(supports-color@8.1.1) - '@stdlib/math-base-special-abs': 0.0.6(supports-color@8.1.1) - '@stdlib/types': 0.0.14 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/number-float64-base-to-float32@0.0.7(supports-color@8.1.1)': - dependencies: - '@stdlib/array-float32': 0.0.6(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/number-float64-base-to-words@0.0.7(supports-color@8.1.1)': - dependencies: - '@stdlib/array-float64': 0.0.6 - '@stdlib/array-uint32': 0.0.6 - '@stdlib/assert-is-little-endian': 0.0.7 - '@stdlib/os-byte-order': 0.0.7(supports-color@8.1.1) - '@stdlib/os-float-word-order': 0.0.7(supports-color@8.1.1) - '@stdlib/types': 0.0.14 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/os-byte-order@0.0.7(supports-color@8.1.1)': - dependencies: - '@stdlib/assert-is-big-endian': 0.0.7 - '@stdlib/assert-is-little-endian': 0.0.7 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/os-float-word-order@0.0.7(supports-color@8.1.1)': - dependencies: - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - '@stdlib/os-byte-order': 0.0.7(supports-color@8.1.1) - '@stdlib/utils-library-manifest': 0.0.8(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@stdlib/process-cwd@0.0.8': - dependencies: - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - - '@stdlib/process-read-stdin@0.0.7': - dependencies: - '@stdlib/assert-is-function': 0.0.8 - '@stdlib/assert-is-string': 0.0.8 - '@stdlib/buffer-ctor': 0.0.7 - '@stdlib/buffer-from-string': 0.0.8 - '@stdlib/streams-node-stdin': 0.0.7 - '@stdlib/utils-next-tick': 0.0.8 - - '@stdlib/regexp-eol@0.0.7': - dependencies: - '@stdlib/assert-has-own-property': 0.0.7 - '@stdlib/assert-is-boolean': 0.0.8 - '@stdlib/assert-is-plain-object': 0.0.7 - '@stdlib/assert-is-string': 0.0.8 - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - - '@stdlib/regexp-extended-length-path@0.0.7': - dependencies: - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - - '@stdlib/regexp-function-name@0.0.7': - dependencies: - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - - '@stdlib/regexp-regexp@0.0.8': - dependencies: - '@stdlib/utils-define-nonenumerable-read-only-property': 0.0.7 - - '@stdlib/streams-node-stdin@0.0.7': {} - - '@stdlib/string-base-format-interpolate@0.0.4': {} - - '@stdlib/string-base-format-tokenize@0.0.4': {} - - '@stdlib/string-format@0.0.3': - dependencies: - '@stdlib/string-base-format-interpolate': 0.0.4 - '@stdlib/string-base-format-tokenize': 0.0.4 - - '@stdlib/string-lowercase@0.0.9': - dependencies: - '@stdlib/assert-is-string': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - '@stdlib/process-read-stdin': 0.0.7 - '@stdlib/streams-node-stdin': 0.0.7 - '@stdlib/string-format': 0.0.3 - - '@stdlib/string-replace@0.0.11': - dependencies: - '@stdlib/assert-is-function': 0.0.8 - '@stdlib/assert-is-regexp': 0.0.7 - '@stdlib/assert-is-regexp-string': 0.0.9 - '@stdlib/assert-is-string': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - '@stdlib/process-read-stdin': 0.0.7 - '@stdlib/regexp-eol': 0.0.7 - '@stdlib/streams-node-stdin': 0.0.7 - '@stdlib/string-format': 0.0.3 - '@stdlib/utils-escape-regexp-string': 0.0.9 - '@stdlib/utils-regexp-from-string': 0.0.9 - - '@stdlib/types@0.0.14': {} - - '@stdlib/utils-constructor-name@0.0.8': - dependencies: - '@stdlib/assert-is-buffer': 0.0.8 - '@stdlib/regexp-function-name': 0.0.7 - '@stdlib/utils-native-class': 0.0.8 - - '@stdlib/utils-convert-path@0.0.8': - dependencies: - '@stdlib/assert-is-string': 0.0.8 - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-read-file': 0.0.8 - '@stdlib/process-read-stdin': 0.0.7 - '@stdlib/regexp-eol': 0.0.7 - '@stdlib/regexp-extended-length-path': 0.0.7 - '@stdlib/streams-node-stdin': 0.0.7 - '@stdlib/string-lowercase': 0.0.9 - '@stdlib/string-replace': 0.0.11 - - '@stdlib/utils-define-nonenumerable-read-only-property@0.0.7': - dependencies: - '@stdlib/types': 0.0.14 - '@stdlib/utils-define-property': 0.0.9 - - '@stdlib/utils-define-property@0.0.9': - dependencies: - '@stdlib/types': 0.0.14 - - '@stdlib/utils-escape-regexp-string@0.0.9': - dependencies: - '@stdlib/assert-is-string': 0.0.8 - '@stdlib/string-format': 0.0.3 - - '@stdlib/utils-get-prototype-of@0.0.7': - dependencies: - '@stdlib/assert-is-function': 0.0.8 - '@stdlib/utils-native-class': 0.0.8 - - '@stdlib/utils-global@0.0.7': - dependencies: - '@stdlib/assert-is-boolean': 0.0.8 - - '@stdlib/utils-library-manifest@0.0.8(supports-color@8.1.1)': - dependencies: - '@stdlib/cli-ctor': 0.0.3 - '@stdlib/fs-resolve-parent-path': 0.0.8 - '@stdlib/utils-convert-path': 0.0.8 - debug: 2.6.9(supports-color@8.1.1) - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - - '@stdlib/utils-native-class@0.0.8': - dependencies: - '@stdlib/assert-has-own-property': 0.0.7 - '@stdlib/assert-has-tostringtag-support': 0.0.9 - - '@stdlib/utils-next-tick@0.0.8': {} - - '@stdlib/utils-noop@0.0.14': {} - - '@stdlib/utils-regexp-from-string@0.0.9': - dependencies: - '@stdlib/assert-is-string': 0.0.8 - '@stdlib/regexp-regexp': 0.0.8 - '@stdlib/string-format': 0.0.3 - - '@stdlib/utils-type-of@0.0.8': - dependencies: - '@stdlib/utils-constructor-name': 0.0.8 - '@stdlib/utils-global': 0.0.7 - '@swc-node/core@1.15.0(@swc/core@1.15.46)(@swc/types@0.1.27)': dependencies: '@swc/core': 1.15.46 @@ -19797,8 +18546,6 @@ snapshots: dependencies: path-type: 4.0.0 - dlv@1.1.3: {} - docker-compose@0.24.8: dependencies: yaml: 2.9.0 @@ -19855,8 +18602,6 @@ snapshots: ds-test@https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0: {} - dset@3.1.2: {} - dts-resolver@3.0.0(oxc-resolver@11.24.2): optionalDependencies: oxc-resolver: 11.24.2 @@ -22285,8 +21030,6 @@ snapshots: joycon@3.1.1: {} - js-cookie@3.0.1: {} - js-levenshtein@1.1.6: {} js-sha3@0.8.0: {} @@ -22992,10 +21735,6 @@ snapshots: neo-async@2.6.2: {} - new-date@1.0.3: - dependencies: - '@segment/isodate': 1.0.3 - next-auth@5.0.0-beta.30(next@15.5.10)(react@19.2.8): dependencies: '@auth/core': 0.41.0 @@ -23323,8 +22062,6 @@ snapshots: oauth4webapi@3.8.3: {} - obj-case@0.2.1: {} - object-assign@4.1.1: {} object-copy@0.1.0: @@ -24788,8 +23525,6 @@ snapshots: source-map@0.7.4: {} - spark-md5@3.0.2: {} - spawn-command@0.0.2: {} spdx-correct@3.2.0: @@ -25150,8 +23885,6 @@ snapshots: dependencies: setimmediate: 1.0.5 - tiny-hashes@1.0.1: {} - tiny-invariant@1.3.1: {} tiny-lru@11.2.5: {} @@ -25480,8 +24213,6 @@ snapshots: node-fetch-native: 1.6.2 pathe: 1.1.2 - unfetch@3.1.2: {} - unfetch@4.2.0: {} unicode-canonical-property-names-ecmascript@2.0.0: {}