Commit b90d6b5a authored by lynn's avatar lynn Committed by GitHub

feat: amplitude swap fixes (#4627)

* init

* add back txn completed event
parent db5c6f82
...@@ -15,7 +15,8 @@ export enum EventName { ...@@ -15,7 +15,8 @@ export enum EventName {
SWAP_MAX_TOKEN_AMOUNT_SELECTED = 'Swap Max Token Amount Selected', SWAP_MAX_TOKEN_AMOUNT_SELECTED = 'Swap Max Token Amount Selected',
SWAP_PRICE_UPDATE_ACKNOWLEDGED = 'Swap Price Update Acknowledged', SWAP_PRICE_UPDATE_ACKNOWLEDGED = 'Swap Price Update Acknowledged',
SWAP_QUOTE_RECEIVED = 'Swap Quote Received', SWAP_QUOTE_RECEIVED = 'Swap Quote Received',
SWAP_SUBMITTED = 'Swap Submitted', SWAP_SIGNED = 'Swap Signed',
SWAP_SUBMITTED_BUTTON_CLICKED = 'Swap Submit Button Clicked',
SWAP_TOKENS_REVERSED = 'Swap Tokens Reversed', SWAP_TOKENS_REVERSED = 'Swap Tokens Reversed',
SWAP_TRANSACTION_COMPLETED = 'Swap Transaction Completed', SWAP_TRANSACTION_COMPLETED = 'Swap Transaction Completed',
TOKEN_IMPORTED = 'Token Imported', TOKEN_IMPORTED = 'Token Imported',
......
import { Trans } from '@lingui/macro' import { Trans } from '@lingui/macro'
import { Trade } from '@uniswap/router-sdk' import { Trade } from '@uniswap/router-sdk'
import { Currency, CurrencyAmount, Percent, Token, TradeType } from '@uniswap/sdk-core' import { Currency, CurrencyAmount, Percent, Token, TradeType } from '@uniswap/sdk-core'
import { sendAnalyticsEvent } from 'components/AmplitudeAnalytics'
import { ModalName } from 'components/AmplitudeAnalytics/constants' import { ModalName } from 'components/AmplitudeAnalytics/constants'
import { EventName } from 'components/AmplitudeAnalytics/constants'
import { Trace } from 'components/AmplitudeAnalytics/Trace' import { Trace } from 'components/AmplitudeAnalytics/Trace'
import { ReactNode, useCallback, useMemo, useState } from 'react' import { formatPercentInBasisPointsNumber, formatToDecimal, getTokenAddress } from 'components/AmplitudeAnalytics/utils'
import { ReactNode, useCallback, useEffect, useMemo, useState } from 'react'
import { InterfaceTrade } from 'state/routing/types' import { InterfaceTrade } from 'state/routing/types'
import { computeRealizedPriceImpact } from 'utils/prices'
import { tradeMeaningfullyDiffers } from 'utils/tradeMeaningFullyDiffer' import { tradeMeaningfullyDiffers } from 'utils/tradeMeaningFullyDiffer'
import TransactionConfirmationModal, { import TransactionConfirmationModal, {
...@@ -14,6 +18,27 @@ import TransactionConfirmationModal, { ...@@ -14,6 +18,27 @@ import TransactionConfirmationModal, {
import SwapModalFooter from './SwapModalFooter' import SwapModalFooter from './SwapModalFooter'
import SwapModalHeader from './SwapModalHeader' import SwapModalHeader from './SwapModalHeader'
const formatAnalyticsEventProperties = ({
trade,
txHash,
}: {
trade: InterfaceTrade<Currency, Currency, TradeType>
txHash: string
}) => ({
transaction_hash: txHash,
token_in_address: getTokenAddress(trade.inputAmount.currency),
token_out_address: getTokenAddress(trade.outputAmount.currency),
token_in_symbol: trade.inputAmount.currency.symbol,
token_out_symbol: trade.outputAmount.currency.symbol,
token_in_amount: formatToDecimal(trade.inputAmount, trade.inputAmount.currency.decimals),
token_out_amount: formatToDecimal(trade.outputAmount, trade.outputAmount.currency.decimals),
price_impact_basis_points: formatPercentInBasisPointsNumber(computeRealizedPriceImpact(trade)),
chain_id:
trade.inputAmount.currency.chainId === trade.outputAmount.currency.chainId
? trade.inputAmount.currency.chainId
: undefined,
})
export default function ConfirmSwapModal({ export default function ConfirmSwapModal({
trade, trade,
originalTrade, originalTrade,
...@@ -48,6 +73,7 @@ export default function ConfirmSwapModal({ ...@@ -48,6 +73,7 @@ export default function ConfirmSwapModal({
// shouldLogModalCloseEvent lets the child SwapModalHeader component know when modal has been closed // shouldLogModalCloseEvent lets the child SwapModalHeader component know when modal has been closed
// and an event triggered by modal closing should be logged. // and an event triggered by modal closing should be logged.
const [shouldLogModalCloseEvent, setShouldLogModalCloseEvent] = useState(false) const [shouldLogModalCloseEvent, setShouldLogModalCloseEvent] = useState(false)
const [lastTxnHashLogged, setLastTxnHashLogged] = useState<string | null>(null)
const showAcceptChanges = useMemo( const showAcceptChanges = useMemo(
() => Boolean(trade && originalTrade && tradeMeaningfullyDiffers(trade, originalTrade)), () => Boolean(trade && originalTrade && tradeMeaningfullyDiffers(trade, originalTrade)),
[originalTrade, trade] [originalTrade, trade]
...@@ -121,8 +147,15 @@ export default function ConfirmSwapModal({ ...@@ -121,8 +147,15 @@ export default function ConfirmSwapModal({
[onModalDismiss, modalBottom, modalHeader, swapErrorMessage] [onModalDismiss, modalBottom, modalHeader, swapErrorMessage]
) )
useEffect(() => {
if (!attemptingTxn && isOpen && txHash && trade && txHash !== lastTxnHashLogged) {
sendAnalyticsEvent(EventName.SWAP_SIGNED, formatAnalyticsEventProperties({ trade, txHash }))
setLastTxnHashLogged(txHash)
}
}, [attemptingTxn, isOpen, txHash, trade, lastTxnHashLogged])
return ( return (
<Trace modal={ModalName.CONFIRM_SWAP} shouldLogImpression={isOpen}> <Trace modal={ModalName.CONFIRM_SWAP}>
<TransactionConfirmationModal <TransactionConfirmationModal
isOpen={isOpen} isOpen={isOpen}
onDismiss={onModalDismiss} onDismiss={onModalDismiss}
......
...@@ -132,7 +132,7 @@ export default function SwapModalFooter({ ...@@ -132,7 +132,7 @@ export default function SwapModalFooter({
<TraceEvent <TraceEvent
events={[Event.onClick]} events={[Event.onClick]}
element={ElementName.CONFIRM_SWAP_BUTTON} element={ElementName.CONFIRM_SWAP_BUTTON}
name={EventName.SWAP_SUBMITTED} name={EventName.SWAP_SUBMITTED_BUTTON_CLICKED}
properties={formatAnalyticsEventProperties({ properties={formatAnalyticsEventProperties({
trade, trade,
hash, hash,
......
...@@ -78,6 +78,7 @@ export default function Updater() { ...@@ -78,6 +78,7 @@ export default function Updater() {
}, },
}) })
) )
const tx = transactions[chainId]?.[hash] const tx = transactions[chainId]?.[hash]
if (tx.info.type === TransactionType.SWAP && trade) { if (tx.info.type === TransactionType.SWAP && trade) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment