@relayprotocol/relay-kit-ui 11.0.3 → 11.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/_cjs/src/components/common/TransactionModal/TransactionModalRenderer.js +6 -0
  2. package/_cjs/src/components/common/TransactionModal/TransactionModalRenderer.js.map +1 -1
  3. package/_cjs/src/components/widgets/FeeBreakdown.js +1 -1
  4. package/_cjs/src/components/widgets/FeeBreakdown.js.map +1 -1
  5. package/_cjs/src/components/widgets/PriceImpactTooltip.js +3 -2
  6. package/_cjs/src/components/widgets/PriceImpactTooltip.js.map +1 -1
  7. package/_cjs/src/constants/walletCompatibility.js +2 -1
  8. package/_cjs/src/constants/walletCompatibility.js.map +1 -1
  9. package/_cjs/src/utils/quote.js +17 -5
  10. package/_cjs/src/utils/quote.js.map +1 -1
  11. package/_cjs/src/utils/relayTransaction.js +4 -3
  12. package/_cjs/src/utils/relayTransaction.js.map +1 -1
  13. package/_cjs/src/utils/solana.js +1 -1
  14. package/_cjs/src/utils/solana.js.map +1 -1
  15. package/_cjs/src/version.js +1 -1
  16. package/_cjs/src/version.js.map +1 -1
  17. package/_cjs/tsconfig.build.tsbuildinfo +1 -1
  18. package/_esm/src/components/common/TransactionModal/TransactionModalRenderer.js +8 -0
  19. package/_esm/src/components/common/TransactionModal/TransactionModalRenderer.js.map +1 -1
  20. package/_esm/src/components/widgets/FeeBreakdown.js +1 -1
  21. package/_esm/src/components/widgets/FeeBreakdown.js.map +1 -1
  22. package/_esm/src/components/widgets/PriceImpactTooltip.js +4 -2
  23. package/_esm/src/components/widgets/PriceImpactTooltip.js.map +1 -1
  24. package/_esm/src/constants/walletCompatibility.js +2 -1
  25. package/_esm/src/constants/walletCompatibility.js.map +1 -1
  26. package/_esm/src/utils/quote.js +20 -6
  27. package/_esm/src/utils/quote.js.map +1 -1
  28. package/_esm/src/utils/relayTransaction.js +11 -3
  29. package/_esm/src/utils/relayTransaction.js.map +1 -1
  30. package/_esm/src/utils/solana.js +1 -1
  31. package/_esm/src/utils/solana.js.map +1 -1
  32. package/_esm/src/version.js +1 -1
  33. package/_esm/src/version.js.map +1 -1
  34. package/_esm/tsconfig.build.tsbuildinfo +1 -1
  35. package/_types/src/components/common/TransactionModal/TransactionModalRenderer.d.ts.map +1 -1
  36. package/_types/src/components/widgets/FeeBreakdown.d.ts.map +1 -1
  37. package/_types/src/components/widgets/PriceImpactTooltip.d.ts.map +1 -1
  38. package/_types/src/constants/walletCompatibility.d.ts.map +1 -1
  39. package/_types/src/utils/quote.d.ts.map +1 -1
  40. package/_types/src/utils/relayTransaction.d.ts +6 -0
  41. package/_types/src/utils/relayTransaction.d.ts.map +1 -1
  42. package/_types/src/utils/solana.d.ts.map +1 -1
  43. package/_types/src/version.d.ts +1 -1
  44. package/_types/tsconfig.build.tsbuildinfo +1 -1
  45. package/package.json +1 -1
@@ -116,6 +116,14 @@ export const TransactionModalRenderer = ({ open, slippageTolerance, wallet, step
116
116
  if (!transaction) {
117
117
  return 2500;
118
118
  }
119
+ // Keep polling until the request reaches a terminal status so the
120
+ // success view can replace quoted values with the final actual ones
121
+ const isTerminalStatus = transaction.status === 'success' ||
122
+ transaction.status === 'failure' ||
123
+ transaction.status === 'refund';
124
+ if (!isTerminalStatus) {
125
+ return 2500;
126
+ }
119
127
  // If this is a refund but outTxs is not populated yet, keep polling
120
128
  const isRefund = transaction.status === 'refund' ||
121
129
  transaction.data?.refundCurrencyData;
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionModalRenderer.js","sourceRoot":"","sources":["../../../../../src/components/common/TransactionModal/TransactionModalRenderer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n type FC,\n useMemo,\n useState,\n useEffect,\n type ReactNode,\n type SetStateAction,\n type Dispatch\n} from 'react'\nimport { type Address } from 'viem'\nimport {\n type AdaptedWallet,\n type Execute,\n type ExecuteStep,\n type ExecuteStepItem\n} from '@relayprotocol/relay-sdk'\nimport {\n calculateFillTime,\n extractDepositRequestId\n} from '../../../utils/relayTransaction.js'\nimport type { Token } from '../../../types/index.js'\nimport { useRequests } from '@relayprotocol/relay-kit-hooks'\nimport { useRelayClient } from '../../../hooks/index.js'\nimport {\n calculatePriceTimeEstimate,\n isGasSponsored\n} from '../../../utils/quote.js'\nexport enum TransactionProgressStep {\n Confirmation,\n Submitted,\n Success,\n Error\n}\n\nexport type TxHashes = {\n txHash: string\n chainId: number\n isBatchTx?: boolean\n}[]\n\nexport type ChildrenProps = {\n wallet?: AdaptedWallet\n progressStep: TransactionProgressStep\n setProgressStep: Dispatch<SetStateAction<TransactionProgressStep>>\n currentStep?: ExecuteStep | null\n setCurrentStep: Dispatch<SetStateAction<ExecuteStep | undefined | null>>\n currentStepItem: ExecuteStepItem | null | undefined\n setCurrentStepItem: Dispatch<\n SetStateAction<ExecuteStepItem | null | undefined>\n >\n quote: Execute | null\n swapError: Error | null\n setSwapError: Dispatch<SetStateAction<Error | null>>\n steps: Execute['steps'] | null\n waitingForSteps: boolean\n allTxHashes: TxHashes\n setAllTxHashes: Dispatch<SetStateAction<TxHashes>>\n transaction: ReturnType<typeof useRequests>['data']['0']\n seconds: number\n fillTime: string\n requestId: string | null\n isLoadingTransaction: boolean\n isAutoSlippage: boolean\n timeEstimate?: { time: number; formattedTime: string }\n isGasSponsored: boolean\n currentCheckStatus?: ExecuteStepItem['checkStatus']\n}\n\ntype Props = {\n open: boolean\n address?: Address | string\n fromToken?: Token\n toToken?: Token\n slippageTolerance?: string\n wallet?: AdaptedWallet\n steps: Execute['steps'] | null\n quote: Execute | null\n swapError: Error | null\n setSwapError: Dispatch<SetStateAction<Error | null>>\n children: (props: ChildrenProps) => ReactNode\n onSuccess?: (quote: Execute, steps: Execute['steps']) => void\n onValidating?: (quote: Execute) => void\n}\n\nexport const TransactionModalRenderer: FC<Props> = ({\n open,\n slippageTolerance,\n wallet,\n steps,\n quote,\n swapError,\n setSwapError,\n children,\n onSuccess,\n onValidating\n}) => {\n const relayClient = useRelayClient()\n const chainId = quote?.details?.currencyIn?.currency?.chainId || 1\n\n const [progressStep, setProgressStep] = useState(\n TransactionProgressStep.Confirmation\n )\n const [currentStep, setCurrentStep] = useState<\n null | NonNullable<Execute['steps']>['0']\n >()\n const [currentStepItem, setCurrentStepItem] = useState<\n null | NonNullable<NonNullable<Execute['steps']>['0']['items']>['0']\n >()\n const [allTxHashes, setAllTxHashes] = useState<TxHashes>([])\n const [waitingForSteps, setWaitingForSteps] = useState(false)\n const [hasStartedValidation, setHasStartedValidation] = useState(false)\n\n useEffect(() => {\n if (!open) {\n setHasStartedValidation(false)\n }\n }, [open])\n\n useEffect(() => {\n if (swapError) {\n setProgressStep(TransactionProgressStep.Error)\n return\n }\n if (!steps) {\n return\n }\n\n const executableSteps = steps.filter(\n (step) => step.items && step.items.length > 0\n )\n\n let stepCount = executableSteps.length\n let txHashes: TxHashes = []\n let currentStep: NonNullable<Execute['steps']>['0'] | null = null\n let currentStepItem:\n | NonNullable<Execute['steps'][0]['items']>[0]\n | undefined\n\n for (const step of executableSteps) {\n for (const item of step.items || []) {\n if (item.txHashes && item.txHashes.length > 0) {\n txHashes = item.txHashes.concat([...txHashes])\n }\n if (item.internalTxHashes && item.internalTxHashes.length > 0) {\n txHashes = item.internalTxHashes.concat([...txHashes])\n }\n if (item.status === 'incomplete') {\n currentStep = step\n currentStepItem = item\n\n break // Exit the inner loop once the first incomplete item is found\n }\n }\n if (currentStep && currentStepItem) break // Exit the outer loop if the current step and item have been found\n }\n\n setAllTxHashes(txHashes)\n\n if (\n !hasStartedValidation &&\n (txHashes.length > 0 || currentStepItem?.isValidatingSignature == true) &&\n progressStep === TransactionProgressStep.Confirmation\n ) {\n onValidating?.(quote as Execute)\n setHasStartedValidation(true)\n }\n\n if (!currentStep) {\n currentStep = executableSteps[stepCount - 1]\n }\n\n setCurrentStep(currentStep)\n setCurrentStepItem(currentStepItem)\n\n const isBitcoinDestination =\n quote?.details?.currencyOut?.currency?.chainId === 8253038\n\n const allStepsComplete = steps.every(\n (step) =>\n !step.items ||\n step.items.length == 0 ||\n step.items?.every((item) => {\n if (isBitcoinDestination && item.checkStatus === 'submitted') {\n return true\n }\n return item.status === 'complete'\n })\n )\n\n const hasPendingItems = steps.some((step) =>\n step.items?.some((item) => item.checkStatus === 'pending')\n )\n\n const hasSubmittedItems = steps.some((step) =>\n step.items?.some((item) => item.checkStatus === 'submitted')\n )\n\n // Check if any step items are still validating\n const hasValidatingItems = steps.some((step) =>\n step.items?.some(\n (item) =>\n item.isValidatingSignature === true ||\n item.progressState === 'validating'\n )\n )\n\n // Transition to Submitted state when items are pending or submitted\n if (\n (hasPendingItems || hasSubmittedItems) &&\n progressStep === TransactionProgressStep.Confirmation &&\n !hasValidatingItems\n ) {\n setProgressStep(TransactionProgressStep.Submitted)\n onValidating?.(quote as Execute)\n }\n\n // Only show success if all steps are complete\n if (allStepsComplete && progressStep !== TransactionProgressStep.Success) {\n setProgressStep(TransactionProgressStep.Success)\n onSuccess?.(quote as Execute, steps)\n }\n }, [steps, swapError])\n\n const requestId = useMemo(() => extractDepositRequestId(steps), [steps])\n\n // Fetch Success Tx\n const { data: transactions, isInitialLoading: isLoadingTransaction } =\n useRequests(\n (progressStep === TransactionProgressStep.Success ||\n progressStep === TransactionProgressStep.Error) &&\n requestId\n ? { id: requestId }\n : undefined,\n relayClient?.baseApiUrl,\n {\n enabled:\n (progressStep === TransactionProgressStep.Success ||\n progressStep === TransactionProgressStep.Error) &&\n (requestId || allTxHashes[0])\n ? true\n : false,\n refetchInterval(query) {\n if (query.state.dataUpdateCount > 10) {\n return 0\n }\n const transaction = query.state.data?.pages[0].requests?.[0]\n if (!transaction) {\n return 2500\n }\n // If this is a refund but outTxs is not populated yet, keep polling\n const isRefund =\n transaction.status === 'refund' ||\n transaction.data?.refundCurrencyData\n if (\n isRefund &&\n (!transaction.data?.outTxs || transaction.data.outTxs.length === 0)\n ) {\n return 2500\n }\n return 0\n }\n }\n )\n const transaction = transactions[0]\n const { fillTime, seconds } = calculateFillTime(transaction)\n\n const isAutoSlippage = slippageTolerance === undefined\n const timeEstimate = calculatePriceTimeEstimate(quote?.details)\n const _isGasSponsored = isGasSponsored(quote as Execute)\n\n return (\n <>\n {children({\n wallet,\n progressStep,\n setProgressStep,\n currentStep,\n setCurrentStep,\n currentStepItem,\n setCurrentStepItem,\n quote,\n steps,\n waitingForSteps,\n swapError,\n setSwapError,\n allTxHashes,\n setAllTxHashes,\n transaction,\n fillTime,\n seconds,\n requestId,\n isLoadingTransaction,\n isAutoSlippage,\n timeEstimate,\n isGasSponsored: _isGasSponsored,\n currentCheckStatus: currentStepItem?.checkStatus\n })}\n </>\n )\n}\n"]}
1
+ {"version":3,"file":"TransactionModalRenderer.js","sourceRoot":"","sources":["../../../../../src/components/common/TransactionModal/TransactionModalRenderer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n type FC,\n useMemo,\n useState,\n useEffect,\n type ReactNode,\n type SetStateAction,\n type Dispatch\n} from 'react'\nimport { type Address } from 'viem'\nimport {\n type AdaptedWallet,\n type Execute,\n type ExecuteStep,\n type ExecuteStepItem\n} from '@relayprotocol/relay-sdk'\nimport {\n calculateFillTime,\n extractDepositRequestId\n} from '../../../utils/relayTransaction.js'\nimport type { Token } from '../../../types/index.js'\nimport { useRequests } from '@relayprotocol/relay-kit-hooks'\nimport { useRelayClient } from '../../../hooks/index.js'\nimport {\n calculatePriceTimeEstimate,\n isGasSponsored\n} from '../../../utils/quote.js'\nexport enum TransactionProgressStep {\n Confirmation,\n Submitted,\n Success,\n Error\n}\n\nexport type TxHashes = {\n txHash: string\n chainId: number\n isBatchTx?: boolean\n}[]\n\nexport type ChildrenProps = {\n wallet?: AdaptedWallet\n progressStep: TransactionProgressStep\n setProgressStep: Dispatch<SetStateAction<TransactionProgressStep>>\n currentStep?: ExecuteStep | null\n setCurrentStep: Dispatch<SetStateAction<ExecuteStep | undefined | null>>\n currentStepItem: ExecuteStepItem | null | undefined\n setCurrentStepItem: Dispatch<\n SetStateAction<ExecuteStepItem | null | undefined>\n >\n quote: Execute | null\n swapError: Error | null\n setSwapError: Dispatch<SetStateAction<Error | null>>\n steps: Execute['steps'] | null\n waitingForSteps: boolean\n allTxHashes: TxHashes\n setAllTxHashes: Dispatch<SetStateAction<TxHashes>>\n transaction: ReturnType<typeof useRequests>['data']['0']\n seconds: number\n fillTime: string\n requestId: string | null\n isLoadingTransaction: boolean\n isAutoSlippage: boolean\n timeEstimate?: { time: number; formattedTime: string }\n isGasSponsored: boolean\n currentCheckStatus?: ExecuteStepItem['checkStatus']\n}\n\ntype Props = {\n open: boolean\n address?: Address | string\n fromToken?: Token\n toToken?: Token\n slippageTolerance?: string\n wallet?: AdaptedWallet\n steps: Execute['steps'] | null\n quote: Execute | null\n swapError: Error | null\n setSwapError: Dispatch<SetStateAction<Error | null>>\n children: (props: ChildrenProps) => ReactNode\n onSuccess?: (quote: Execute, steps: Execute['steps']) => void\n onValidating?: (quote: Execute) => void\n}\n\nexport const TransactionModalRenderer: FC<Props> = ({\n open,\n slippageTolerance,\n wallet,\n steps,\n quote,\n swapError,\n setSwapError,\n children,\n onSuccess,\n onValidating\n}) => {\n const relayClient = useRelayClient()\n const chainId = quote?.details?.currencyIn?.currency?.chainId || 1\n\n const [progressStep, setProgressStep] = useState(\n TransactionProgressStep.Confirmation\n )\n const [currentStep, setCurrentStep] = useState<\n null | NonNullable<Execute['steps']>['0']\n >()\n const [currentStepItem, setCurrentStepItem] = useState<\n null | NonNullable<NonNullable<Execute['steps']>['0']['items']>['0']\n >()\n const [allTxHashes, setAllTxHashes] = useState<TxHashes>([])\n const [waitingForSteps, setWaitingForSteps] = useState(false)\n const [hasStartedValidation, setHasStartedValidation] = useState(false)\n\n useEffect(() => {\n if (!open) {\n setHasStartedValidation(false)\n }\n }, [open])\n\n useEffect(() => {\n if (swapError) {\n setProgressStep(TransactionProgressStep.Error)\n return\n }\n if (!steps) {\n return\n }\n\n const executableSteps = steps.filter(\n (step) => step.items && step.items.length > 0\n )\n\n let stepCount = executableSteps.length\n let txHashes: TxHashes = []\n let currentStep: NonNullable<Execute['steps']>['0'] | null = null\n let currentStepItem:\n | NonNullable<Execute['steps'][0]['items']>[0]\n | undefined\n\n for (const step of executableSteps) {\n for (const item of step.items || []) {\n if (item.txHashes && item.txHashes.length > 0) {\n txHashes = item.txHashes.concat([...txHashes])\n }\n if (item.internalTxHashes && item.internalTxHashes.length > 0) {\n txHashes = item.internalTxHashes.concat([...txHashes])\n }\n if (item.status === 'incomplete') {\n currentStep = step\n currentStepItem = item\n\n break // Exit the inner loop once the first incomplete item is found\n }\n }\n if (currentStep && currentStepItem) break // Exit the outer loop if the current step and item have been found\n }\n\n setAllTxHashes(txHashes)\n\n if (\n !hasStartedValidation &&\n (txHashes.length > 0 || currentStepItem?.isValidatingSignature == true) &&\n progressStep === TransactionProgressStep.Confirmation\n ) {\n onValidating?.(quote as Execute)\n setHasStartedValidation(true)\n }\n\n if (!currentStep) {\n currentStep = executableSteps[stepCount - 1]\n }\n\n setCurrentStep(currentStep)\n setCurrentStepItem(currentStepItem)\n\n const isBitcoinDestination =\n quote?.details?.currencyOut?.currency?.chainId === 8253038\n\n const allStepsComplete = steps.every(\n (step) =>\n !step.items ||\n step.items.length == 0 ||\n step.items?.every((item) => {\n if (isBitcoinDestination && item.checkStatus === 'submitted') {\n return true\n }\n return item.status === 'complete'\n })\n )\n\n const hasPendingItems = steps.some((step) =>\n step.items?.some((item) => item.checkStatus === 'pending')\n )\n\n const hasSubmittedItems = steps.some((step) =>\n step.items?.some((item) => item.checkStatus === 'submitted')\n )\n\n // Check if any step items are still validating\n const hasValidatingItems = steps.some((step) =>\n step.items?.some(\n (item) =>\n item.isValidatingSignature === true ||\n item.progressState === 'validating'\n )\n )\n\n // Transition to Submitted state when items are pending or submitted\n if (\n (hasPendingItems || hasSubmittedItems) &&\n progressStep === TransactionProgressStep.Confirmation &&\n !hasValidatingItems\n ) {\n setProgressStep(TransactionProgressStep.Submitted)\n onValidating?.(quote as Execute)\n }\n\n // Only show success if all steps are complete\n if (allStepsComplete && progressStep !== TransactionProgressStep.Success) {\n setProgressStep(TransactionProgressStep.Success)\n onSuccess?.(quote as Execute, steps)\n }\n }, [steps, swapError])\n\n const requestId = useMemo(() => extractDepositRequestId(steps), [steps])\n\n // Fetch Success Tx\n const { data: transactions, isInitialLoading: isLoadingTransaction } =\n useRequests(\n (progressStep === TransactionProgressStep.Success ||\n progressStep === TransactionProgressStep.Error) &&\n requestId\n ? { id: requestId }\n : undefined,\n relayClient?.baseApiUrl,\n {\n enabled:\n (progressStep === TransactionProgressStep.Success ||\n progressStep === TransactionProgressStep.Error) &&\n (requestId || allTxHashes[0])\n ? true\n : false,\n refetchInterval(query) {\n if (query.state.dataUpdateCount > 10) {\n return 0\n }\n const transaction = query.state.data?.pages[0].requests?.[0]\n if (!transaction) {\n return 2500\n }\n // Keep polling until the request reaches a terminal status so the\n // success view can replace quoted values with the final actual ones\n const isTerminalStatus =\n transaction.status === 'success' ||\n transaction.status === 'failure' ||\n transaction.status === 'refund'\n if (!isTerminalStatus) {\n return 2500\n }\n // If this is a refund but outTxs is not populated yet, keep polling\n const isRefund =\n transaction.status === 'refund' ||\n transaction.data?.refundCurrencyData\n if (\n isRefund &&\n (!transaction.data?.outTxs || transaction.data.outTxs.length === 0)\n ) {\n return 2500\n }\n return 0\n }\n }\n )\n const transaction = transactions[0]\n const { fillTime, seconds } = calculateFillTime(transaction)\n\n const isAutoSlippage = slippageTolerance === undefined\n const timeEstimate = calculatePriceTimeEstimate(quote?.details)\n const _isGasSponsored = isGasSponsored(quote as Execute)\n\n return (\n <>\n {children({\n wallet,\n progressStep,\n setProgressStep,\n currentStep,\n setCurrentStep,\n currentStepItem,\n setCurrentStepItem,\n quote,\n steps,\n waitingForSteps,\n swapError,\n setSwapError,\n allTxHashes,\n setAllTxHashes,\n transaction,\n fillTime,\n seconds,\n requestId,\n isLoadingTransaction,\n isAutoSlippage,\n timeEstimate,\n isGasSponsored: _isGasSponsored,\n currentCheckStatus: currentStepItem?.checkStatus\n })}\n </>\n )\n}\n"]}
@@ -52,7 +52,7 @@ const FeeBreakdown = ({ feeBreakdown, isFetchingQuote, quote, toToken, fromToken
52
52
  }, children: [_jsx(FontAwesomeIcon, { icon: faClock, width: 16 }), _jsxs(Text, { style: "subtitle2", children: ["~ ", timeEstimate?.formattedTime] })] }))
53
53
  },
54
54
  {
55
- title: 'Network cost',
55
+ title: 'Deposit gas',
56
56
  value: (_jsxs(Flex, { align: "center", className: "relay:gap-1", children: [_jsx(FontAwesomeIcon, { icon: faGasPump, width: 16, className: "relay:text-[#C1C8CD]" }), _jsx(Text, { style: "subtitle2", children: originGasFeeFormatted })] }))
57
57
  },
58
58
  {
@@ -1 +1 @@
1
- {"version":3,"file":"FeeBreakdown.js","sourceRoot":"","sources":["../../../../src/components/widgets/FeeBreakdown.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState, type FC } from 'react'\nimport { Box, Button, Flex, Text } from '../primitives/index.js'\nimport type { ChildrenProps } from './SwapWidgetRenderer.js'\nimport { formatBN, formatDollar } from '../../utils/numbers.js'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faGasPump } from '@fortawesome/free-solid-svg-icons/faGasPump'\nimport { faChevronDown } from '@fortawesome/free-solid-svg-icons/faChevronDown'\nimport FetchingQuoteLoader from '../widgets/FetchingQuoteLoader.js'\nimport type { RelayChain } from '@relayprotocol/relay-sdk'\nimport {\n CollapsibleContent,\n CollapsibleRoot,\n CollapsibleTrigger\n} from '../primitives/Collapsible.js'\nimport { faClock } from '@fortawesome/free-solid-svg-icons/faClock'\nimport { faInfoCircle } from '@fortawesome/free-solid-svg-icons/faInfoCircle'\nimport { PriceImpactTooltip } from './PriceImpactTooltip.js'\nimport { getSlippageRating, ratingToColor } from '../../utils/slippage.js'\nimport Tooltip from '../primitives/Tooltip.js'\nimport React from 'react'\nimport { cn } from '../../utils/cn.js'\n\ntype Props = Pick<\n ChildrenProps,\n | 'feeBreakdown'\n | 'isFetchingQuote'\n | 'quote'\n | 'toToken'\n | 'fromToken'\n | 'timeEstimate'\n> & {\n toChain?: RelayChain\n isSingleChainLocked?: boolean\n fromChainWalletVMSupported?: boolean\n isAutoSlippage: boolean\n slippageInputBps?: string\n error?: any\n onOpenSlippageConfig?: () => void\n}\n\nconst formatSwapRate = (rate: number) => {\n return rate >= 1 ? formatBN(rate, 2, 18, false) : formatBN(rate, 4, 18, false)\n}\n\nconst FeeBreakdown: FC<Props> = ({\n feeBreakdown,\n isFetchingQuote,\n quote,\n toToken,\n fromToken,\n toChain,\n timeEstimate,\n isSingleChainLocked,\n fromChainWalletVMSupported,\n isAutoSlippage,\n slippageInputBps,\n error,\n onOpenSlippageConfig\n}) => {\n const [isOpen, setIsOpen] = useState(false)\n const swapRate = quote?.details?.rate\n const isFixedRate = quote?.details?.isFixedRate\n const originGasFee = feeBreakdown?.breakdown?.find(\n (fee) => fee.id === 'origin-gas'\n )\n const originGasFeeFormatted = formatDollar(\n Math.abs(originGasFee?.usd.value ?? 0)\n )\n\n const [rateMode, setRateMode] = useState<'input' | 'output'>('input')\n const isHighPriceImpact = Number(quote?.details?.totalImpact?.percent) < -3.5\n\n const isSameChain = toToken?.chainId === fromToken?.chainId\n const originSlippageTolerance =\n quote?.details?.slippageTolerance?.origin?.percent\n const destinationSlippageTolerance =\n quote?.details?.slippageTolerance?.destination?.percent\n const quoteSlippage = isFixedRate\n ? '0'\n : ((isSameChain\n ? destinationSlippageTolerance === '0'\n ? originSlippageTolerance\n : destinationSlippageTolerance\n : destinationSlippageTolerance) ?? '0')\n const slippageInputNumber = Number(\n (Number(slippageInputBps ?? '0') / 100).toFixed(2)\n )\n const slippage = `${Math.max(Number(quoteSlippage), slippageInputNumber)}`\n\n const slippageRating = getSlippageRating(slippage)\n const slippageRatingColor = ratingToColor[slippageRating]\n const minimumAmountFormatted = quote?.details?.currencyOut?.minimumAmount\n ? formatBN(\n quote.details.currencyOut.minimumAmount,\n 6,\n toToken?.decimals,\n false\n )\n : undefined\n\n const breakdown = [\n {\n title: 'Estimated time',\n value: (\n <Flex\n align=\"center\"\n className=\"relay:gap-1\"\n style={{\n color:\n timeEstimate && timeEstimate.time <= 30\n ? 'var(--relay-colors-grass-9)'\n : 'var(--relay-colors-amber-9)'\n }}\n >\n <FontAwesomeIcon icon={faClock} width={16} />\n <Text style=\"subtitle2\">~ {timeEstimate?.formattedTime}</Text>\n </Flex>\n )\n },\n {\n title: 'Network cost',\n value: (\n <Flex align=\"center\" className=\"relay:gap-1\">\n <FontAwesomeIcon\n icon={faGasPump}\n width={16}\n className=\"relay:text-[#C1C8CD]\"\n />\n <Text style=\"subtitle2\">{originGasFeeFormatted}</Text>\n </Flex>\n )\n },\n {\n title: 'Price Impact',\n value: (\n <PriceImpactTooltip\n feeBreakdown={feeBreakdown}\n tooltipProps={{ side: 'top', align: 'end' }}\n >\n {\n <div>\n <Flex\n align=\"center\"\n className=\"relay:gap-1 relay:text-[color:var(--relay-colors-gray8)]\"\n >\n <Text\n style=\"subtitle2\"\n className={cn(\n isHighPriceImpact &&\n 'relay:text-[color:var(--relay-colors-red11)]'\n )}\n >\n {feeBreakdown?.totalFees?.priceImpactPercentage}\n </Text>\n <FontAwesomeIcon\n icon={faInfoCircle}\n width={14}\n height={14}\n className=\"relay:inline-block relay:ml-[4px]\"\n />\n </Flex>\n </div>\n }\n </PriceImpactTooltip>\n )\n }\n ]\n\n if (!feeBreakdown) {\n if (isFetchingQuote) {\n return (\n <Box\n id={'fee-breakdown-section'}\n className=\"relay:rounded-[var(--relay-radii-widget-card-border-radius)] relay:bg-[var(--relay-colors-widget-background)] relay:border-widget-card relay:overflow-hidden relay:mb-[var(--relay-spacing-widget-card-section-gutter)]\"\n >\n <div className=\"relay:mt-0 relay:mb-0 relay:px-3 relay:py-[12px] relay:w-full relay:flex relay:justify-center\">\n <FetchingQuoteLoader isLoading={isFetchingQuote} containerClassName=\"relay:!my-0 relay:!py-0\" />\n </div>\n </Box>\n )\n } else {\n return null\n }\n }\n\n return (\n <Flex\n className=\"relay:rounded-[var(--relay-radii-widget-card-border-radius)] relay:bg-[var(--relay-colors-widget-background)] relay:overflow-hidden relay:mb-[var(--relay-spacing-widget-card-section-gutter)] relay:border-widget-card\"\n direction=\"column\"\n >\n <Flex justify=\"between\" align=\"center\" className=\"relay:p-3 relay:pb-0\">\n <Text style=\"subtitle2\">Max Slippage</Text>\n <Flex align=\"center\" className=\"relay:gap-2\">\n {isAutoSlippage ? (\n <Button\n aria-label=\"Auto\"\n className=\"relay:font-medium relay:px-[6px] relay:py-[2px] relay:min-h-0 relay:leading-[20px] relay:bg-[var(--relay-colors-widget-selector-background)] relay:border-none relay:hover:bg-[var(--relay-colors-widget-selector-hover-background)]\"\n style={{ fontSize: '12px' }}\n color=\"white\"\n size=\"none\"\n onClick={(e) => {\n e.preventDefault()\n onOpenSlippageConfig?.()\n }}\n >\n Auto\n </Button>\n ) : null}\n <Tooltip\n side=\"top\"\n align=\"end\"\n content={\n minimumAmountFormatted ? (\n <Flex direction=\"row\" className=\"relay:gap-2\">\n <Text style=\"subtitle2\" color=\"subtle\">\n Min. received\n </Text>\n <Text style=\"subtitle2\">\n {minimumAmountFormatted} {toToken?.symbol}\n </Text>\n </Flex>\n ) : null\n }\n >\n <Text style=\"subtitle2\">\n <span\n style={{\n color: slippageRatingColor\n ? `var(--relay-colors-${slippageRatingColor})`\n : undefined\n }}\n >\n {slippage}%\n </span>\n </Text>\n </Tooltip>\n </Flex>\n </Flex>\n <CollapsibleRoot open={isOpen} onOpenChange={setIsOpen}>\n <CollapsibleTrigger id={'fee-breakdown-section'}>\n <Flex\n justify=\"between\"\n align=\"center\"\n className=\"relay:flex-row relay:gap-2 relay:w-full relay:p-3\"\n >\n <span\n className=\"relay:cursor-pointer relay:shrink relay:overflow-hidden relay:h-[21px]\"\n onClick={(e) => {\n setRateMode(rateMode === 'input' ? 'output' : 'input')\n e.preventDefault()\n }}\n >\n <ConversionRate\n fromToken={fromToken}\n toToken={toToken}\n rate={Number(swapRate)}\n isInputMode={rateMode === 'input'}\n />\n </span>\n\n <Flex\n className=\"relay:gap-2 relay:shrink-0\"\n style={{\n color:\n timeEstimate && timeEstimate.time <= 30\n ? 'var(--relay-colors-grass-9)'\n : 'var(--relay-colors-amber-9)'\n }}\n align=\"center\"\n >\n {!isOpen && timeEstimate && timeEstimate?.time !== 0 ? (\n <>\n <FontAwesomeIcon icon={faClock} width={16} />\n <Text style=\"subtitle2\" className=\"relay:shrink-0\">\n ~ {timeEstimate?.formattedTime}\n </Text>\n <Flex\n justify=\"center\"\n align=\"center\"\n className=\"relay:text-[color:var(--relay-colors-gray6)] relay:h-[4px]\"\n >\n &#8226;\n </Flex>\n </>\n ) : null}\n {!isOpen && (\n <>\n <FontAwesomeIcon\n icon={faGasPump}\n width={16}\n className=\"relay:text-[#C1C8CD]\"\n />\n <Text style=\"subtitle2\" className=\"relay:shrink-0\">\n {originGasFeeFormatted}\n </Text>\n </>\n )}\n <div\n className=\"relay:ml-2 relay:transition-transform relay:duration-300 relay:text-[color:var(--relay-colors-gray9)]\"\n style={{\n transform: isOpen ? 'rotate(-180deg)' : 'rotate(0)'\n }}\n >\n <FontAwesomeIcon icon={faChevronDown} width={12} />\n </div>\n </Flex>\n </Flex>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <Flex\n direction=\"column\"\n className=\"relay:px-3 relay:pb-3 relay:pt-0 relay:gap-2 relay:bg-[var(--relay-colors-widget-background)]\"\n >\n {breakdown.map((item) => {\n return (\n <React.Fragment key={item.title}>\n <Flex\n justify=\"between\"\n align=\"center\"\n className=\"relay:w-full relay:gap-4\"\n >\n <Text\n style=\"subtitle2\"\n color={'subtle'}\n className=\"relay:self-start\"\n >\n {item.title}\n </Text>\n {item.value}\n </Flex>\n </React.Fragment>\n )\n })}\n </Flex>\n </CollapsibleContent>\n </CollapsibleRoot>\n </Flex>\n )\n}\n\nexport default FeeBreakdown\n\ntype ConversionRateProps = {\n fromToken?: { symbol: string }\n toToken?: { symbol: string }\n rate: number\n isInputMode: boolean\n}\n\nconst ConversionRate: FC<ConversionRateProps> = ({\n fromToken,\n toToken,\n rate,\n isInputMode\n}) => {\n const displayRate = isInputMode ? rate : 1 / rate\n const fromSymbol = isInputMode ? fromToken?.symbol : toToken?.symbol\n const toSymbol = isInputMode ? toToken?.symbol : fromToken?.symbol\n\n const rateText = `1 ${fromSymbol} = ${formatSwapRate(displayRate)} ${toSymbol}`\n const shouldShowTooltip = rateText.length > 22\n\n const content = (\n <div className=\"relay:w-full relay:min-w-0\">\n <Text style=\"subtitle2\" ellipsify>\n {rateText}\n </Text>\n </div>\n )\n\n if (shouldShowTooltip) {\n return (\n <Tooltip\n content={<Text style=\"subtitle2\">{rateText}</Text>}\n asChild={true}\n >\n {content}\n </Tooltip>\n )\n }\n\n return content\n}\n"]}
1
+ {"version":3,"file":"FeeBreakdown.js","sourceRoot":"","sources":["../../../../src/components/widgets/FeeBreakdown.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState, type FC } from 'react'\nimport { Box, Button, Flex, Text } from '../primitives/index.js'\nimport type { ChildrenProps } from './SwapWidgetRenderer.js'\nimport { formatBN, formatDollar } from '../../utils/numbers.js'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faGasPump } from '@fortawesome/free-solid-svg-icons/faGasPump'\nimport { faChevronDown } from '@fortawesome/free-solid-svg-icons/faChevronDown'\nimport FetchingQuoteLoader from '../widgets/FetchingQuoteLoader.js'\nimport type { RelayChain } from '@relayprotocol/relay-sdk'\nimport {\n CollapsibleContent,\n CollapsibleRoot,\n CollapsibleTrigger\n} from '../primitives/Collapsible.js'\nimport { faClock } from '@fortawesome/free-solid-svg-icons/faClock'\nimport { faInfoCircle } from '@fortawesome/free-solid-svg-icons/faInfoCircle'\nimport { PriceImpactTooltip } from './PriceImpactTooltip.js'\nimport { getSlippageRating, ratingToColor } from '../../utils/slippage.js'\nimport Tooltip from '../primitives/Tooltip.js'\nimport React from 'react'\nimport { cn } from '../../utils/cn.js'\n\ntype Props = Pick<\n ChildrenProps,\n | 'feeBreakdown'\n | 'isFetchingQuote'\n | 'quote'\n | 'toToken'\n | 'fromToken'\n | 'timeEstimate'\n> & {\n toChain?: RelayChain\n isSingleChainLocked?: boolean\n fromChainWalletVMSupported?: boolean\n isAutoSlippage: boolean\n slippageInputBps?: string\n error?: any\n onOpenSlippageConfig?: () => void\n}\n\nconst formatSwapRate = (rate: number) => {\n return rate >= 1 ? formatBN(rate, 2, 18, false) : formatBN(rate, 4, 18, false)\n}\n\nconst FeeBreakdown: FC<Props> = ({\n feeBreakdown,\n isFetchingQuote,\n quote,\n toToken,\n fromToken,\n toChain,\n timeEstimate,\n isSingleChainLocked,\n fromChainWalletVMSupported,\n isAutoSlippage,\n slippageInputBps,\n error,\n onOpenSlippageConfig\n}) => {\n const [isOpen, setIsOpen] = useState(false)\n const swapRate = quote?.details?.rate\n const isFixedRate = quote?.details?.isFixedRate\n const originGasFee = feeBreakdown?.breakdown?.find(\n (fee) => fee.id === 'origin-gas'\n )\n const originGasFeeFormatted = formatDollar(\n Math.abs(originGasFee?.usd.value ?? 0)\n )\n\n const [rateMode, setRateMode] = useState<'input' | 'output'>('input')\n const isHighPriceImpact = Number(quote?.details?.totalImpact?.percent) < -3.5\n\n const isSameChain = toToken?.chainId === fromToken?.chainId\n const originSlippageTolerance =\n quote?.details?.slippageTolerance?.origin?.percent\n const destinationSlippageTolerance =\n quote?.details?.slippageTolerance?.destination?.percent\n const quoteSlippage = isFixedRate\n ? '0'\n : ((isSameChain\n ? destinationSlippageTolerance === '0'\n ? originSlippageTolerance\n : destinationSlippageTolerance\n : destinationSlippageTolerance) ?? '0')\n const slippageInputNumber = Number(\n (Number(slippageInputBps ?? '0') / 100).toFixed(2)\n )\n const slippage = `${Math.max(Number(quoteSlippage), slippageInputNumber)}`\n\n const slippageRating = getSlippageRating(slippage)\n const slippageRatingColor = ratingToColor[slippageRating]\n const minimumAmountFormatted = quote?.details?.currencyOut?.minimumAmount\n ? formatBN(\n quote.details.currencyOut.minimumAmount,\n 6,\n toToken?.decimals,\n false\n )\n : undefined\n\n const breakdown = [\n {\n title: 'Estimated time',\n value: (\n <Flex\n align=\"center\"\n className=\"relay:gap-1\"\n style={{\n color:\n timeEstimate && timeEstimate.time <= 30\n ? 'var(--relay-colors-grass-9)'\n : 'var(--relay-colors-amber-9)'\n }}\n >\n <FontAwesomeIcon icon={faClock} width={16} />\n <Text style=\"subtitle2\">~ {timeEstimate?.formattedTime}</Text>\n </Flex>\n )\n },\n {\n title: 'Deposit gas',\n value: (\n <Flex align=\"center\" className=\"relay:gap-1\">\n <FontAwesomeIcon\n icon={faGasPump}\n width={16}\n className=\"relay:text-[#C1C8CD]\"\n />\n <Text style=\"subtitle2\">{originGasFeeFormatted}</Text>\n </Flex>\n )\n },\n {\n title: 'Price Impact',\n value: (\n <PriceImpactTooltip\n feeBreakdown={feeBreakdown}\n tooltipProps={{ side: 'top', align: 'end' }}\n >\n {\n <div>\n <Flex\n align=\"center\"\n className=\"relay:gap-1 relay:text-[color:var(--relay-colors-gray8)]\"\n >\n <Text\n style=\"subtitle2\"\n className={cn(\n isHighPriceImpact &&\n 'relay:text-[color:var(--relay-colors-red11)]'\n )}\n >\n {feeBreakdown?.totalFees?.priceImpactPercentage}\n </Text>\n <FontAwesomeIcon\n icon={faInfoCircle}\n width={14}\n height={14}\n className=\"relay:inline-block relay:ml-[4px]\"\n />\n </Flex>\n </div>\n }\n </PriceImpactTooltip>\n )\n }\n ]\n\n if (!feeBreakdown) {\n if (isFetchingQuote) {\n return (\n <Box\n id={'fee-breakdown-section'}\n className=\"relay:rounded-[var(--relay-radii-widget-card-border-radius)] relay:bg-[var(--relay-colors-widget-background)] relay:border-widget-card relay:overflow-hidden relay:mb-[var(--relay-spacing-widget-card-section-gutter)]\"\n >\n <div className=\"relay:mt-0 relay:mb-0 relay:px-3 relay:py-[12px] relay:w-full relay:flex relay:justify-center\">\n <FetchingQuoteLoader\n isLoading={isFetchingQuote}\n containerClassName=\"relay:!my-0 relay:!py-0\"\n />\n </div>\n </Box>\n )\n } else {\n return null\n }\n }\n\n return (\n <Flex\n className=\"relay:rounded-[var(--relay-radii-widget-card-border-radius)] relay:bg-[var(--relay-colors-widget-background)] relay:overflow-hidden relay:mb-[var(--relay-spacing-widget-card-section-gutter)] relay:border-widget-card\"\n direction=\"column\"\n >\n <Flex justify=\"between\" align=\"center\" className=\"relay:p-3 relay:pb-0\">\n <Text style=\"subtitle2\">Max Slippage</Text>\n <Flex align=\"center\" className=\"relay:gap-2\">\n {isAutoSlippage ? (\n <Button\n aria-label=\"Auto\"\n className=\"relay:font-medium relay:px-[6px] relay:py-[2px] relay:min-h-0 relay:leading-[20px] relay:bg-[var(--relay-colors-widget-selector-background)] relay:border-none relay:hover:bg-[var(--relay-colors-widget-selector-hover-background)]\"\n style={{ fontSize: '12px' }}\n color=\"white\"\n size=\"none\"\n onClick={(e) => {\n e.preventDefault()\n onOpenSlippageConfig?.()\n }}\n >\n Auto\n </Button>\n ) : null}\n <Tooltip\n side=\"top\"\n align=\"end\"\n content={\n minimumAmountFormatted ? (\n <Flex direction=\"row\" className=\"relay:gap-2\">\n <Text style=\"subtitle2\" color=\"subtle\">\n Min. received\n </Text>\n <Text style=\"subtitle2\">\n {minimumAmountFormatted} {toToken?.symbol}\n </Text>\n </Flex>\n ) : null\n }\n >\n <Text style=\"subtitle2\">\n <span\n style={{\n color: slippageRatingColor\n ? `var(--relay-colors-${slippageRatingColor})`\n : undefined\n }}\n >\n {slippage}%\n </span>\n </Text>\n </Tooltip>\n </Flex>\n </Flex>\n <CollapsibleRoot open={isOpen} onOpenChange={setIsOpen}>\n <CollapsibleTrigger id={'fee-breakdown-section'}>\n <Flex\n justify=\"between\"\n align=\"center\"\n className=\"relay:flex-row relay:gap-2 relay:w-full relay:p-3\"\n >\n <span\n className=\"relay:cursor-pointer relay:shrink relay:overflow-hidden relay:h-[21px]\"\n onClick={(e) => {\n setRateMode(rateMode === 'input' ? 'output' : 'input')\n e.preventDefault()\n }}\n >\n <ConversionRate\n fromToken={fromToken}\n toToken={toToken}\n rate={Number(swapRate)}\n isInputMode={rateMode === 'input'}\n />\n </span>\n\n <Flex\n className=\"relay:gap-2 relay:shrink-0\"\n style={{\n color:\n timeEstimate && timeEstimate.time <= 30\n ? 'var(--relay-colors-grass-9)'\n : 'var(--relay-colors-amber-9)'\n }}\n align=\"center\"\n >\n {!isOpen && timeEstimate && timeEstimate?.time !== 0 ? (\n <>\n <FontAwesomeIcon icon={faClock} width={16} />\n <Text style=\"subtitle2\" className=\"relay:shrink-0\">\n ~ {timeEstimate?.formattedTime}\n </Text>\n <Flex\n justify=\"center\"\n align=\"center\"\n className=\"relay:text-[color:var(--relay-colors-gray6)] relay:h-[4px]\"\n >\n &#8226;\n </Flex>\n </>\n ) : null}\n {!isOpen && (\n <>\n <FontAwesomeIcon\n icon={faGasPump}\n width={16}\n className=\"relay:text-[#C1C8CD]\"\n />\n <Text style=\"subtitle2\" className=\"relay:shrink-0\">\n {originGasFeeFormatted}\n </Text>\n </>\n )}\n <div\n className=\"relay:ml-2 relay:transition-transform relay:duration-300 relay:text-[color:var(--relay-colors-gray9)]\"\n style={{\n transform: isOpen ? 'rotate(-180deg)' : 'rotate(0)'\n }}\n >\n <FontAwesomeIcon icon={faChevronDown} width={12} />\n </div>\n </Flex>\n </Flex>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <Flex\n direction=\"column\"\n className=\"relay:px-3 relay:pb-3 relay:pt-0 relay:gap-2 relay:bg-[var(--relay-colors-widget-background)]\"\n >\n {breakdown.map((item) => {\n return (\n <React.Fragment key={item.title}>\n <Flex\n justify=\"between\"\n align=\"center\"\n className=\"relay:w-full relay:gap-4\"\n >\n <Text\n style=\"subtitle2\"\n color={'subtle'}\n className=\"relay:self-start\"\n >\n {item.title}\n </Text>\n {item.value}\n </Flex>\n </React.Fragment>\n )\n })}\n </Flex>\n </CollapsibleContent>\n </CollapsibleRoot>\n </Flex>\n )\n}\n\nexport default FeeBreakdown\n\ntype ConversionRateProps = {\n fromToken?: { symbol: string }\n toToken?: { symbol: string }\n rate: number\n isInputMode: boolean\n}\n\nconst ConversionRate: FC<ConversionRateProps> = ({\n fromToken,\n toToken,\n rate,\n isInputMode\n}) => {\n const displayRate = isInputMode ? rate : 1 / rate\n const fromSymbol = isInputMode ? fromToken?.symbol : toToken?.symbol\n const toSymbol = isInputMode ? toToken?.symbol : fromToken?.symbol\n\n const rateText = `1 ${fromSymbol} = ${formatSwapRate(displayRate)} ${toSymbol}`\n const shouldShowTooltip = rateText.length > 22\n\n const content = (\n <div className=\"relay:w-full relay:min-w-0\">\n <Text style=\"subtitle2\" ellipsify>\n {rateText}\n </Text>\n </div>\n )\n\n if (shouldShowTooltip) {\n return (\n <Tooltip\n content={<Text style=\"subtitle2\">{rateText}</Text>}\n asChild={true}\n >\n {content}\n </Tooltip>\n )\n }\n\n return content\n}\n"]}
@@ -7,11 +7,13 @@ const getFeeColor = (value) => {
7
7
  return value > 0 ? 'success' : undefined;
8
8
  };
9
9
  export const PriceImpactTooltip = ({ feeBreakdown, children, tooltipProps }) => {
10
- return (_jsx(Tooltip, { content: _jsxs(Flex, { className: "relay:min-w-[200px]", direction: "column", children: [_jsxs(Flex, { align: "center", className: "relay:w-full", children: [_jsxs(Text, { style: "subtitle3", className: "relay:mr-auto", children: ["Total Price Impact", ' '] }), _jsx(Text, { style: "subtitle3", className: "relay:mr-1 relay:ml-2", color: feeBreakdown?.totalFees?.priceImpactColor, children: feeBreakdown?.totalFees.priceImpact }), _jsxs(Text, { style: "subtitle3", color: feeBreakdown?.totalFees?.priceImpactColor, children: ["(", feeBreakdown?.totalFees.priceImpactPercentage, ")"] })] }), _jsx("div", { className: "relay:w-full relay:h-px relay:bg-[var(--relay-colors-slate-6)] relay:my-2" }), _jsxs(Flex, { align: "center", className: "relay:w-full", children: [_jsx(Text, { style: "subtitle3", color: "subtle", className: "relay:mr-auto", children: "Swap Impact" }), _jsx(Text, { style: "subtitle3", color: getFeeColor(feeBreakdown?.totalFees?.swapImpact?.value), children: feeBreakdown?.totalFees?.swapImpact?.formatted })] }), feeBreakdown?.breakdown.map((fee) => {
10
+ return (_jsx(Tooltip, { content: _jsxs(Flex, { className: "relay:min-w-[200px]", direction: "column", children: [_jsxs(Flex, { align: "center", className: "relay:w-full", children: [_jsxs(Text, { style: "subtitle3", className: "relay:mr-auto", children: ["Total Price Impact", ' '] }), _jsx(Text, { style: "subtitle3", className: "relay:mr-1 relay:ml-2", color: feeBreakdown?.totalFees?.priceImpactColor, children: feeBreakdown?.totalFees.priceImpact }), _jsxs(Text, { style: "subtitle3", color: feeBreakdown?.totalFees?.priceImpactColor, children: ["(", feeBreakdown?.totalFees.priceImpactPercentage, ")"] })] }), _jsx("div", { className: "relay:w-full relay:h-px relay:bg-[var(--relay-colors-slate-6)] relay:my-2" }), _jsxs(Flex, { align: "center", className: "relay:w-full", children: [_jsx(Text, { style: "subtitle3", color: "subtle", className: "relay:mr-auto", children: "Swap Cost" }), _jsx(Text, { style: "subtitle3", color: getFeeColor(feeBreakdown?.totalFees?.swapImpact?.value), children: feeBreakdown?.totalFees?.swapImpact?.formatted })] }), feeBreakdown?.breakdown.map((fee) => {
11
11
  if (fee.id === 'origin-gas') {
12
12
  return null;
13
13
  }
14
- return (_jsxs(Flex, { align: "center", className: "relay:w-full", children: [_jsx(Text, { style: "subtitle3", color: "subtle", className: "relay:mr-auto", children: fee.name }), feeBreakdown.isGasSponsored && fee.usd.value === 0 ? (_jsx(Text, { style: "subtitle3", color: "success", children: "Free" })) : (_jsx(Text, { style: "subtitle3", color: getFeeColor(fee.usd.value), children: fee.usd.formatted }))] }, fee.id));
14
+ // Positive platform fee = rebalancing reward paid to the user.
15
+ const isReward = fee.id === 'relayer-fee' && fee.usd.value > 0;
16
+ return (_jsxs(Flex, { align: "center", className: "relay:w-full", children: [_jsxs(Flex, { align: "center", className: "relay:mr-auto relay:gap-1", children: [_jsx(Text, { style: "subtitle3", color: "subtle", children: fee.name }), isReward && (_jsx(Text, { style: "subtitle3", color: "success", children: "(Reward)" }))] }), feeBreakdown.isGasSponsored && fee.usd.value === 0 ? (_jsx(Text, { style: "subtitle3", color: "success", children: "Free" })) : (_jsx(Text, { style: "subtitle3", color: getFeeColor(fee.usd.value), children: fee.usd.formatted }))] }, fee.id));
15
17
  }), _jsx(Anchor, { href: "https://docs.relay.link/references/api/api_core_concepts/fees#relay-fees", target: "_blank", rel: "noopener noreferrer", className: "relay:text-[color:var(--relay-colors-primary11)] relay:!text-[12px]", children: "Learn more about the fees" })] }), ...tooltipProps, children: children }));
16
18
  };
17
19
  //# sourceMappingURL=PriceImpactTooltip.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PriceImpactTooltip.js","sourceRoot":"","sources":["../../../../src/components/widgets/PriceImpactTooltip.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,OAAO,MAAM,0BAA0B,CAAA;AAS9C,MAAM,WAAW,GAAG,CAAC,KAAyB,EAAE,EAAE;IAChD,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACxD,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAA;AAC1C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAgC,CAAC,EAC9D,YAAY,EACZ,QAAQ,EACR,YAAY,EACb,EAAE,EAAE;IACH,OAAO,CACL,KAAC,OAAO,IACN,OAAO,EACL,MAAC,IAAI,IAAC,SAAS,EAAC,qBAAqB,EAAC,SAAS,EAAC,QAAQ,aACtD,MAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,SAAS,EAAC,cAAc,aAC3C,MAAC,IAAI,IAAC,KAAK,EAAC,WAAW,EAAC,SAAS,EAAC,eAAe,mCAC5B,GAAG,IACjB,EACP,KAAC,IAAI,IACH,KAAK,EAAC,WAAW,EACjB,SAAS,EAAC,uBAAuB,EACjC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,gBAAgB,YAE/C,YAAY,EAAE,SAAS,CAAC,WAAW,GAC/B,EACP,MAAC,IAAI,IACH,KAAK,EAAC,WAAW,EACjB,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,gBAAgB,kBAE9C,YAAY,EAAE,SAAS,CAAC,qBAAqB,SAC1C,IACF,EACP,cACE,SAAS,EAAC,2EAA2E,GACrF,EACF,MAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,SAAS,EAAC,cAAc,aAC3C,KAAC,IAAI,IAAC,KAAK,EAAC,WAAW,EAAC,KAAK,EAAC,QAAQ,EAAC,SAAS,EAAC,eAAe,4BAEzD,EACP,KAAC,IAAI,IACH,KAAK,EAAC,WAAW,EACjB,KAAK,EAAE,WAAW,CAAC,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,YAE7D,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,GAC1C,IACF,EACN,YAAY,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;oBACnC,IAAI,GAAG,CAAC,EAAE,KAAK,YAAY,EAAE,CAAC;wBAC5B,OAAO,IAAI,CAAA;oBACb,CAAC;oBACD,OAAO,CACL,MAAC,IAAI,IAAc,KAAK,EAAC,QAAQ,EAAC,SAAS,EAAC,cAAc,aACxD,KAAC,IAAI,IAAC,KAAK,EAAC,WAAW,EAAC,KAAK,EAAC,QAAQ,EAAC,SAAS,EAAC,eAAe,YAC7D,GAAG,CAAC,IAAI,GACJ,EACN,YAAY,CAAC,cAAc,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CACpD,KAAC,IAAI,IAAC,KAAK,EAAC,WAAW,EAAC,KAAK,EAAC,SAAS,qBAEhC,CACR,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,KAAK,EAAC,WAAW,EAAC,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,YACtD,GAAG,CAAC,GAAG,CAAC,SAAS,GACb,CACR,KAZQ,GAAG,CAAC,EAAE,CAaV,CACR,CAAA;gBACH,CAAC,CAAC,EAGF,KAAC,MAAM,IACL,IAAI,EAAC,0EAA0E,EAC/E,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,qEAAqE,0CAGxE,IACJ,KAEL,YAAY,YAEf,QAAQ,GACD,CACX,CAAA;AACH,CAAC,CAAA","sourcesContent":["import type { FC, ReactNode } from 'react'\nimport { Anchor, Flex, Text } from '../primitives/index.js'\nimport Tooltip from '../primitives/Tooltip.js'\nimport type { ChildrenProps } from '../widgets/SwapWidgetRenderer.js'\n\ntype PriceImpactTooltipProps = {\n feeBreakdown: ChildrenProps['feeBreakdown']\n children: ReactNode\n tooltipProps?: any\n}\n\nconst getFeeColor = (value: number | undefined) => {\n if (value === 0 || value === undefined) return undefined\n return value > 0 ? 'success' : undefined\n}\n\nexport const PriceImpactTooltip: FC<PriceImpactTooltipProps> = ({\n feeBreakdown,\n children,\n tooltipProps\n}) => {\n return (\n <Tooltip\n content={\n <Flex className=\"relay:min-w-[200px]\" direction=\"column\">\n <Flex align=\"center\" className=\"relay:w-full\">\n <Text style=\"subtitle3\" className=\"relay:mr-auto\">\n Total Price Impact{' '}\n </Text>\n <Text\n style=\"subtitle3\"\n className=\"relay:mr-1 relay:ml-2\"\n color={feeBreakdown?.totalFees?.priceImpactColor}\n >\n {feeBreakdown?.totalFees.priceImpact}\n </Text>\n <Text\n style=\"subtitle3\"\n color={feeBreakdown?.totalFees?.priceImpactColor}\n >\n ({feeBreakdown?.totalFees.priceImpactPercentage})\n </Text>\n </Flex>\n <div\n className=\"relay:w-full relay:h-px relay:bg-[var(--relay-colors-slate-6)] relay:my-2\"\n />\n <Flex align=\"center\" className=\"relay:w-full\">\n <Text style=\"subtitle3\" color=\"subtle\" className=\"relay:mr-auto\">\n Swap Impact\n </Text>\n <Text\n style=\"subtitle3\"\n color={getFeeColor(feeBreakdown?.totalFees?.swapImpact?.value)}\n >\n {feeBreakdown?.totalFees?.swapImpact?.formatted}\n </Text>\n </Flex>\n {feeBreakdown?.breakdown.map((fee) => {\n if (fee.id === 'origin-gas') {\n return null\n }\n return (\n <Flex key={fee.id} align=\"center\" className=\"relay:w-full\">\n <Text style=\"subtitle3\" color=\"subtle\" className=\"relay:mr-auto\">\n {fee.name}\n </Text>\n {feeBreakdown.isGasSponsored && fee.usd.value === 0 ? (\n <Text style=\"subtitle3\" color=\"success\">\n Free\n </Text>\n ) : (\n <Text style=\"subtitle3\" color={getFeeColor(fee.usd.value)}>\n {fee.usd.formatted}\n </Text>\n )}\n </Flex>\n )\n })}\n\n {/* Learn More Link */}\n <Anchor\n href=\"https://docs.relay.link/references/api/api_core_concepts/fees#relay-fees\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"relay:text-[color:var(--relay-colors-primary11)] relay:!text-[12px]\"\n >\n Learn more about the fees\n </Anchor>\n </Flex>\n }\n {...tooltipProps}\n >\n {children}\n </Tooltip>\n )\n}\n"]}
1
+ {"version":3,"file":"PriceImpactTooltip.js","sourceRoot":"","sources":["../../../../src/components/widgets/PriceImpactTooltip.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { FC, ReactNode } from 'react'\nimport { Anchor, Flex, Text } from '../primitives/index.js'\nimport Tooltip from '../primitives/Tooltip.js'\nimport type { ChildrenProps } from '../widgets/SwapWidgetRenderer.js'\n\ntype PriceImpactTooltipProps = {\n feeBreakdown: ChildrenProps['feeBreakdown']\n children: ReactNode\n tooltipProps?: any\n}\n\nconst getFeeColor = (value: number | undefined) => {\n if (value === 0 || value === undefined) return undefined\n return value > 0 ? 'success' : undefined\n}\n\nexport const PriceImpactTooltip: FC<PriceImpactTooltipProps> = ({\n feeBreakdown,\n children,\n tooltipProps\n}) => {\n return (\n <Tooltip\n content={\n <Flex className=\"relay:min-w-[200px]\" direction=\"column\">\n <Flex align=\"center\" className=\"relay:w-full\">\n <Text style=\"subtitle3\" className=\"relay:mr-auto\">\n Total Price Impact{' '}\n </Text>\n <Text\n style=\"subtitle3\"\n className=\"relay:mr-1 relay:ml-2\"\n color={feeBreakdown?.totalFees?.priceImpactColor}\n >\n {feeBreakdown?.totalFees.priceImpact}\n </Text>\n <Text\n style=\"subtitle3\"\n color={feeBreakdown?.totalFees?.priceImpactColor}\n >\n ({feeBreakdown?.totalFees.priceImpactPercentage})\n </Text>\n </Flex>\n <div\n className=\"relay:w-full relay:h-px relay:bg-[var(--relay-colors-slate-6)] relay:my-2\"\n />\n <Flex align=\"center\" className=\"relay:w-full\">\n <Text style=\"subtitle3\" color=\"subtle\" className=\"relay:mr-auto\">\n Swap Cost\n </Text>\n <Text\n style=\"subtitle3\"\n color={getFeeColor(feeBreakdown?.totalFees?.swapImpact?.value)}\n >\n {feeBreakdown?.totalFees?.swapImpact?.formatted}\n </Text>\n </Flex>\n {feeBreakdown?.breakdown.map((fee) => {\n if (fee.id === 'origin-gas') {\n return null\n }\n // Positive platform fee = rebalancing reward paid to the user.\n const isReward = fee.id === 'relayer-fee' && fee.usd.value > 0\n return (\n <Flex key={fee.id} align=\"center\" className=\"relay:w-full\">\n <Flex align=\"center\" className=\"relay:mr-auto relay:gap-1\">\n <Text style=\"subtitle3\" color=\"subtle\">\n {fee.name}\n </Text>\n {isReward && (\n <Text style=\"subtitle3\" color=\"success\">\n (Reward)\n </Text>\n )}\n </Flex>\n {feeBreakdown.isGasSponsored && fee.usd.value === 0 ? (\n <Text style=\"subtitle3\" color=\"success\">\n Free\n </Text>\n ) : (\n <Text style=\"subtitle3\" color={getFeeColor(fee.usd.value)}>\n {fee.usd.formatted}\n </Text>\n )}\n </Flex>\n )\n })}\n\n {/* Learn More Link */}\n <Anchor\n href=\"https://docs.relay.link/references/api/api_core_concepts/fees#relay-fees\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"relay:text-[color:var(--relay-colors-primary11)] relay:!text-[12px]\"\n >\n Learn more about the fees\n </Anchor>\n </Flex>\n }\n {...tooltipProps}\n >\n {children}\n </Tooltip>\n )\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  export const WalletChainRestricted = {
2
2
  phantom: [1, 8453, 792703809, 137, 8253038, 101, 10143, 143, 999],
3
- backpack: [1, 8453, 137, 42161, 10, 10143, 80094, 9286185, 792703809],
3
+ backpack: [1, 8453, 137, 42161, 10, 10143, 80094, 792703809],
4
4
  magiceden: [
5
5
  1, 137, 8453, 33139, 8253038, 792703809, 1329, 2741, 42161, 80094, 56, 43114
6
6
  ],
@@ -19,6 +19,7 @@ export const WalletChainIncompatible = {
19
19
  coinbase: [4663]
20
20
  };
21
21
  export const NormalizedWalletName = {
22
+ backpackeclipse: 'backpack',
22
23
  phantomevm: 'phantom',
23
24
  phantombtc: 'phantom',
24
25
  magicedensol: 'magiceden',
@@ -1 +1 @@
1
- {"version":3,"file":"walletCompatibility.js","sourceRoot":"","sources":["../../../src/constants/walletCompatibility.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAA6B;IAC7D,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;IACjE,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC;IACrE,SAAS,EAAE;QACT,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK;KAC7E;IACD,OAAO,EAAE;QACP,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO;QACxE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;KACnC;IACD,QAAQ,EAAE,CAAC,IAAI,CAAC;IAChB,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC;IACtC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC;IAClD,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC;CAC/D,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAA6B;IAC/D,OAAO,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;IACxB,SAAS,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;IAC1B,QAAQ,EAAE,CAAC,IAAI,CAAC;CACjB,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAA2B;IAC1D,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;IACrB,YAAY,EAAE,WAAW;IACzB,WAAW,EAAE,OAAO;IACpB,eAAe,EAAE,WAAW;IAC5B,aAAa,EAAE,SAAS;IACxB,QAAQ,EAAE,OAAO;IACjB,SAAS,EAAE,OAAO;IAClB,iBAAiB,EAAE,UAAU;IAC7B,OAAO,EAAE,UAAU;CACpB,CAAA","sourcesContent":["export const WalletChainRestricted: Record<string, number[]> = {\n phantom: [1, 8453, 792703809, 137, 8253038, 101, 10143, 143, 999],\n backpack: [1, 8453, 137, 42161, 10, 10143, 80094, 9286185, 792703809],\n magiceden: [\n 1, 137, 8453, 33139, 8253038, 792703809, 1329, 2741, 42161, 80094, 56, 43114\n ],\n uniswap: [\n 1, 130, 42161, 43114, 8453, 81457, 56, 42220, 10, 137, 480, 324, 7777777,\n 4663, 59144, 143, 1868, 4326, 4217\n ],\n abstract: [2741],\n ronin: [1, 56, 137, 42161, 8453, 2020],\n porto: [8453, 42161, 56, 42220, 1, 10, 137, 80094],\n robinhood: [1, 10, 137, 4663, 8453, 42161, 8253038, 792703809]\n}\n\nexport const WalletChainIncompatible: Record<string, number[]> = {\n binance: [7777777, 8453],\n binanceus: [7777777, 8453],\n coinbase: [4663]\n}\n\nexport const NormalizedWalletName: Record<string, string> = {\n phantomevm: 'phantom',\n phantombtc: 'phantom',\n magicedensol: 'magiceden',\n roninwallet: 'ronin',\n robinhoodwallet: 'robinhood',\n uniswapwallet: 'uniswap',\n portoevm: 'porto',\n trusttron: 'trust',\n coinbasewalletevm: 'coinbase',\n baseevm: 'coinbase'\n}\n"]}
1
+ {"version":3,"file":"walletCompatibility.js","sourceRoot":"","sources":["../../../src/constants/walletCompatibility.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAA6B;IAC7D,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;IACjE,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC;IAC5D,SAAS,EAAE;QACT,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK;KAC7E;IACD,OAAO,EAAE;QACP,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO;QACxE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;KACnC;IACD,QAAQ,EAAE,CAAC,IAAI,CAAC;IAChB,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC;IACtC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC;IAClD,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC;CAC/D,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAA6B;IAC/D,OAAO,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;IACxB,SAAS,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;IAC1B,QAAQ,EAAE,CAAC,IAAI,CAAC;CACjB,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAA2B;IAC1D,eAAe,EAAE,UAAU;IAC3B,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;IACrB,YAAY,EAAE,WAAW;IACzB,WAAW,EAAE,OAAO;IACpB,eAAe,EAAE,WAAW;IAC5B,aAAa,EAAE,SAAS;IACxB,QAAQ,EAAE,OAAO;IACjB,SAAS,EAAE,OAAO;IAClB,iBAAiB,EAAE,UAAU;IAC7B,OAAO,EAAE,UAAU;CACpB,CAAA","sourcesContent":["export const WalletChainRestricted: Record<string, number[]> = {\n phantom: [1, 8453, 792703809, 137, 8253038, 101, 10143, 143, 999],\n backpack: [1, 8453, 137, 42161, 10, 10143, 80094, 792703809],\n magiceden: [\n 1, 137, 8453, 33139, 8253038, 792703809, 1329, 2741, 42161, 80094, 56, 43114\n ],\n uniswap: [\n 1, 130, 42161, 43114, 8453, 81457, 56, 42220, 10, 137, 480, 324, 7777777,\n 4663, 59144, 143, 1868, 4326, 4217\n ],\n abstract: [2741],\n ronin: [1, 56, 137, 42161, 8453, 2020],\n porto: [8453, 42161, 56, 42220, 1, 10, 137, 80094],\n robinhood: [1, 10, 137, 4663, 8453, 42161, 8253038, 792703809]\n}\n\nexport const WalletChainIncompatible: Record<string, number[]> = {\n binance: [7777777, 8453],\n binanceus: [7777777, 8453],\n coinbase: [4663]\n}\n\nexport const NormalizedWalletName: Record<string, string> = {\n backpackeclipse: 'backpack',\n phantomevm: 'phantom',\n phantombtc: 'phantom',\n magicedensol: 'magiceden',\n roninwallet: 'ronin',\n robinhoodwallet: 'robinhood',\n uniswapwallet: 'uniswap',\n portoevm: 'porto',\n trusttron: 'trust',\n coinbasewalletevm: 'coinbase',\n baseevm: 'coinbase'\n}\n"]}
@@ -6,9 +6,24 @@ import { sha256 } from './hashing.js';
6
6
  const formatUsdFee = (amountUsd, shouldFlipSign = false) => {
7
7
  const value = Number(amountUsd ?? 0);
8
8
  const finalValue = shouldFlipSign ? -value : value;
9
+ // Explicit zero and sub-cent forms: formatDollar renders 0 as "-" and
10
+ // sub-cent negatives as "-$0.00".
11
+ let formatted;
12
+ if (finalValue === 0) {
13
+ formatted = '$0.00';
14
+ }
15
+ else if (Math.abs(finalValue) < 0.01) {
16
+ formatted = `${finalValue > 0 ? '+' : '-'}< $0.01`;
17
+ }
18
+ else {
19
+ formatted = formatDollar(finalValue);
20
+ if (finalValue > 0) {
21
+ formatted = `+${formatted}`;
22
+ }
23
+ }
9
24
  return {
10
25
  value: finalValue,
11
- formatted: formatDollar(finalValue)
26
+ formatted
12
27
  };
13
28
  };
14
29
  export const parseFees = (selectedTo, selectedFrom, quote) => {
@@ -18,9 +33,8 @@ export const parseFees = (selectedTo, selectedFrom, quote) => {
18
33
  const formattedGasFee = formatBN(gasFee, 5, Number(fees?.gas?.currency?.decimals ?? 18));
19
34
  // Execution fee
20
35
  const executionFeeUsd = expandedPriceImpact?.execution?.usd;
21
- // Relay fee
36
+ // Platform fee (v2 name: relay fee)
22
37
  const relayFeeUsd = expandedPriceImpact?.relay?.usd;
23
- const relayFeeIsReward = Number(relayFeeUsd ?? 0) > 0;
24
38
  // App fee
25
39
  const appFeeUsd = expandedPriceImpact?.app?.usd;
26
40
  const hasAppFee = appFeeUsd && Number(appFeeUsd) !== 0;
@@ -31,7 +45,7 @@ export const parseFees = (selectedTo, selectedFrom, quote) => {
31
45
  raw: gasFee,
32
46
  formatted: `${formattedGasFee}`,
33
47
  usd: formatUsdFee(fees?.gas?.amountUsd, true),
34
- name: `Deposit Gas (${selectedFrom.displayName})`,
48
+ name: `Deposit gas (${selectedFrom.displayName})`,
35
49
  tooltip: null,
36
50
  type: 'gas',
37
51
  id: 'origin-gas',
@@ -43,7 +57,7 @@ export const parseFees = (selectedTo, selectedFrom, quote) => {
43
57
  usd: _isGasSponsored
44
58
  ? { value: 0, formatted: '0' }
45
59
  : formatUsdFee(executionFeeUsd, false),
46
- name: `Execution Fee (${selectedTo.displayName})`,
60
+ name: `Execution Cost (${selectedTo.displayName})`,
47
61
  tooltip: null,
48
62
  type: 'gas',
49
63
  id: 'destination-gas',
@@ -55,7 +69,7 @@ export const parseFees = (selectedTo, selectedFrom, quote) => {
55
69
  usd: _isGasSponsored
56
70
  ? { value: 0, formatted: '0' }
57
71
  : formatUsdFee(relayFeeUsd, false),
58
- name: relayFeeIsReward ? 'Reward' : 'Relay Fee',
72
+ name: 'Platform Fee',
59
73
  tooltip: null,
60
74
  type: 'relayer',
61
75
  id: 'relayer-fee',
@@ -1 +1 @@
1
- {"version":3,"file":"quote.js","sourceRoot":"","sources":["../../../src/utils/quote.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n Execute,\n ExecuteStep,\n ExecuteStepItem,\n paths,\n RelayChain\n} from '@relayprotocol/relay-sdk'\nimport { formatBN, formatDollar } from './numbers.js'\nimport type { BridgeFee } from '../types/index.js'\nimport { formatSeconds, get15MinuteInterval } from './time.js'\nimport type { QuoteResponse, useQuote } from '@relayprotocol/relay-kit-hooks'\nimport type { ComponentPropsWithoutRef } from 'react'\nimport type Text from '../components/primitives/Text.js'\nimport { bitcoin } from '../utils/bitcoin.js'\nimport axios from 'axios'\nimport { sha256 } from './hashing.js'\nimport type { FeeBreakdown } from '../types/FeeBreakdown.js'\n\nconst formatUsdFee = (\n amountUsd: string | undefined,\n shouldFlipSign: boolean = false\n) => {\n const value = Number(amountUsd ?? 0)\n const finalValue = shouldFlipSign ? -value : value\n return {\n value: finalValue,\n formatted: formatDollar(finalValue)\n }\n}\n\nexport const parseFees = (\n selectedTo: RelayChain,\n selectedFrom: RelayChain,\n quote?: ReturnType<typeof useQuote>['data']\n): FeeBreakdown => {\n const fees = quote?.fees\n const expandedPriceImpact = quote?.details?.expandedPriceImpact\n\n const gasFee = BigInt(fees?.gas?.amount ?? 0)\n const formattedGasFee = formatBN(\n gasFee,\n 5,\n Number(fees?.gas?.currency?.decimals ?? 18)\n )\n\n // Execution fee\n const executionFeeUsd = expandedPriceImpact?.execution?.usd\n\n // Relay fee\n const relayFeeUsd = expandedPriceImpact?.relay?.usd\n const relayFeeIsReward = Number(relayFeeUsd ?? 0) > 0\n\n // App fee\n const appFeeUsd = expandedPriceImpact?.app?.usd\n const hasAppFee = appFeeUsd && Number(appFeeUsd) !== 0\n\n const totalFeesUsd =\n Number(fees?.relayer?.amountUsd ?? 0) + Number(fees?.app?.amountUsd ?? 0)\n const _isGasSponsored = isGasSponsored(quote)\n\n const breakdown: BridgeFee[] = [\n {\n raw: gasFee,\n formatted: `${formattedGasFee}`,\n usd: formatUsdFee(fees?.gas?.amountUsd, true),\n name: `Deposit Gas (${selectedFrom.displayName})`,\n tooltip: null,\n type: 'gas',\n id: 'origin-gas',\n currency: fees?.gas?.currency\n },\n {\n raw: 0n,\n formatted: '0',\n usd: _isGasSponsored\n ? { value: 0, formatted: '0' }\n : formatUsdFee(executionFeeUsd, false),\n name: `Execution Fee (${selectedTo.displayName})`,\n tooltip: null,\n type: 'gas',\n id: 'destination-gas',\n currency: fees?.relayer?.currency\n },\n {\n raw: 0n,\n formatted: '0',\n usd: _isGasSponsored\n ? { value: 0, formatted: '0' }\n : formatUsdFee(relayFeeUsd, false),\n name: relayFeeIsReward ? 'Reward' : 'Relay Fee',\n tooltip: null,\n type: 'relayer',\n id: 'relayer-fee',\n currency: fees?.relayer?.currency\n }\n ]\n if (hasAppFee) {\n breakdown.push({\n raw: 0n,\n formatted: '0',\n usd: _isGasSponsored\n ? { value: 0, formatted: '0' }\n : formatUsdFee(appFeeUsd, false),\n name: 'App Fee',\n tooltip: null,\n type: 'relayer',\n id: 'app-fee',\n currency: fees?.app?.currency\n })\n }\n\n let priceImpactColor: ComponentPropsWithoutRef<typeof Text>['color'] =\n 'subtleSecondary'\n\n if (quote?.details?.totalImpact?.percent === '-0.00') {\n quote.details.totalImpact.percent = '-0.01'\n }\n\n if (quote?.details?.totalImpact?.percent) {\n let percent = Number(quote.details.totalImpact.percent)\n if (percent <= -3) {\n priceImpactColor = 'red'\n } else if (percent > 0) {\n priceImpactColor = 'success'\n } else if (_isGasSponsored) {\n priceImpactColor = 'success'\n }\n }\n return {\n breakdown,\n totalFees: {\n usd: formatDollar(totalFeesUsd),\n priceImpactPercentage: quote?.details?.totalImpact?.percent\n ? `${quote?.details?.totalImpact?.percent}%`\n : undefined,\n priceImpact:\n quote?.details?.totalImpact?.usd &&\n quote?.details?.totalImpact?.usd != '0'\n ? formatDollar(parseFloat(quote?.details?.totalImpact?.usd ?? 0))\n : undefined,\n priceImpactColor,\n swapImpact: formatUsdFee(expandedPriceImpact?.swap?.usd, false)\n },\n isGasSponsored: _isGasSponsored\n }\n}\n\nexport const calculateRelayerFeeProportionUsd = (quote?: QuoteResponse) => {\n const usdIn = quote?.details?.currencyIn?.amountUsd\n ? Number(quote.details.currencyIn.amountUsd)\n : null\n const relayerServiceFeeUsd = quote?.fees?.relayerService?.amountUsd\n ? Number(quote.fees.relayerService.amountUsd)\n : null\n\n if (!usdIn || !relayerServiceFeeUsd) {\n return 0n\n }\n\n return BigInt(Math.floor((relayerServiceFeeUsd * 100) / usdIn))\n}\n\nexport const calculateRelayerFeeProportion = (\n totalAmount: { rawExcludingOriginGas: bigint },\n feeBreakdown: BridgeFee[]\n) => {\n if (totalAmount.rawExcludingOriginGas > 0n) {\n const relayerFeeRaw =\n feeBreakdown.find((fee) => fee.id === 'relayer-fee')?.raw ?? 0n\n return (relayerFeeRaw * 100n) / totalAmount.rawExcludingOriginGas\n }\n return 0n\n}\n\nexport const isHighRelayerServiceFeeUsd = (quote?: QuoteResponse) => {\n const usdIn = quote?.details?.currencyIn?.amountUsd\n ? Number(quote.details.currencyIn.amountUsd)\n : null\n const relayerServiceFeeUsd = quote?.fees?.relayerService?.amountUsd\n ? Number(quote.fees.relayerService.amountUsd)\n : null\n\n if (!usdIn || !relayerServiceFeeUsd) {\n return false\n }\n\n const feeThresholdPercentage = (usdIn * 1.5) / 100\n const feeThresholdUsd = 25\n return (\n relayerServiceFeeUsd > feeThresholdPercentage &&\n relayerServiceFeeUsd > feeThresholdUsd\n )\n}\n\nexport const extractQuoteId = (\n steps?: Execute['steps'] | QuoteResponse['steps']\n) => {\n return steps && steps[0] ? steps[0].requestId : undefined\n}\n\nexport const extractDepositAddress = (steps?: Execute['steps']) => {\n const depositStep = steps?.find((step) => step.id === 'deposit')\n return depositStep?.depositAddress\n}\n\nexport const calculatePriceTimeEstimate = (\n details?: QuoteResponse['details']\n) => {\n const isBitcoin =\n details?.currencyIn?.currency?.chainId === bitcoin.id ||\n details?.currencyOut?.currency?.chainId === bitcoin.id\n\n //If the relay is interacting with bitcoin we hardcode the time estime to 10m\n const time = isBitcoin ? 1200 : (details?.timeEstimate ?? 0)\n const formattedTime = formatSeconds(time)\n\n return {\n time,\n formattedTime\n }\n}\n\nexport const appendMetadataToRequest = (\n baseUrl?: string,\n requestId?: string,\n additionalMetadata?: paths['/requests/metadata']['post']['requestBody']['content']['application/json']['additionalMetadata'],\n referrer?: string\n) => {\n if (requestId && additionalMetadata) {\n const triggerData: paths['/requests/metadata']['post']['requestBody']['content']['application/json'] & {\n referrer?: string\n } = {\n requestId,\n additionalMetadata,\n referrer\n }\n\n return axios.request({\n url: `${baseUrl}/requests/metadata`,\n method: 'POST',\n data: triggerData\n })\n }\n}\n\nexport const getCurrentStep = (\n steps?: Execute['steps'] | null\n): {\n step: ExecuteStep | null | undefined\n stepItem: ExecuteStepItem | null | undefined\n} => {\n if (!steps) {\n return { step: null, stepItem: null }\n }\n\n const executableSteps = steps.filter(\n (step) => step.items && step.items.length > 0\n )\n\n const step = executableSteps.find((step) =>\n step.items.some((item) => item.status === 'incomplete')\n )\n const stepItem = step?.items.find((item) => item.status === 'incomplete')\n return { step, stepItem }\n}\n\nexport const getSwapEventData = (\n details: Execute['details'],\n fees: Execute['fees'],\n steps: Execute['steps'] | null,\n connector?: string,\n quoteParameters?: Parameters<typeof useQuote>['2']\n) => {\n let operation: string | undefined = details?.operation\n\n if (operation === 'swap') {\n const isSameChain =\n details?.currencyIn?.currency?.chainId ===\n details?.currencyOut?.currency?.chainId\n if (isSameChain) {\n operation = 'same_chain_swap'\n } else if (\n details?.currencyIn?.currency?.symbol ===\n details?.currencyOut?.currency?.symbol\n ) {\n operation = 'bridge'\n } else {\n operation = 'cross_chain_swap'\n }\n }\n const interval = get15MinuteInterval()\n const quoteRequestId = sha256({ ...quoteParameters, interval })\n\n return {\n wallet_connector: connector,\n quote_request_id: quoteRequestId,\n quote_id: steps ? extractQuoteId(steps) : undefined,\n amount_in: details?.currencyIn?.amount,\n amount_in_formatted: parseFloat(\n `${details?.currencyIn?.amountFormatted ?? '0'}`\n ),\n currency_in: details?.currencyIn?.currency?.symbol,\n currency_in_address: details?.currencyIn?.currency?.address,\n chain_id_in: details?.currencyIn?.currency?.chainId,\n currency_in_decimals: details?.currencyIn?.currency?.decimals,\n amount_out: details?.currencyOut?.amount,\n amount_out_formatted: parseFloat(\n `${details?.currencyOut?.amountFormatted ?? '0'}`\n ),\n currency_out_decimals: details?.currencyOut?.currency?.decimals,\n currency_out: details?.currencyOut?.currency?.symbol,\n currency_out_address: details?.currencyOut?.currency?.address,\n chain_id_out: details?.currencyOut?.currency?.chainId,\n currency_in_usd: details?.currencyIn?.amountUsd,\n currency_out_usd: details?.currencyOut?.amountUsd,\n deposit_address: steps?.find((step) => step.depositAddress)?.depositAddress,\n txHashes: steps\n ?.map((step) => {\n let txHashes: { chainId: number; txHash: string }[] = []\n step.items?.forEach((item) => {\n if (item.txHashes) {\n txHashes = txHashes.concat([\n ...(item.txHashes ?? []),\n ...(item.internalTxHashes ?? [])\n ])\n }\n })\n return txHashes\n })\n .flat(),\n operation,\n checkStatuses: steps\n ?.map((step) => {\n let checkStatuses: { stepId: string; checkStatus: string }[] = []\n step.items?.forEach((item) => {\n if (item.checkStatus) {\n checkStatuses.push({\n stepId: step.id,\n checkStatus: item.checkStatus\n })\n }\n })\n return checkStatuses\n })\n .flat(),\n subsidized:\n fees?.subsidized !== undefined && fees.subsidized.amount !== '0'\n ? true\n : false\n }\n}\n\nexport const calculateUsdValue = (\n price?: number,\n amountString?: string\n): number | undefined => {\n if (price && price > 0 && amountString && Number(amountString) > 0) {\n try {\n return parseFloat(amountString) * price\n } catch (e) {\n console.error(\n 'Failed to parse amount string for USD calculation',\n amountString,\n e\n )\n }\n }\n return undefined\n}\n\nexport const isGasSponsored = (quote?: QuoteResponse) => {\n return (\n quote?.fees?.subsidized?.amount != undefined &&\n quote?.fees?.subsidized?.amount != '0'\n )\n}\n"]}
1
+ {"version":3,"file":"quote.js","sourceRoot":"","sources":["../../../src/utils/quote.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n Execute,\n ExecuteStep,\n ExecuteStepItem,\n paths,\n RelayChain\n} from '@relayprotocol/relay-sdk'\nimport { formatBN, formatDollar } from './numbers.js'\nimport type { BridgeFee } from '../types/index.js'\nimport { formatSeconds, get15MinuteInterval } from './time.js'\nimport type { QuoteResponse, useQuote } from '@relayprotocol/relay-kit-hooks'\nimport type { ComponentPropsWithoutRef } from 'react'\nimport type Text from '../components/primitives/Text.js'\nimport { bitcoin } from '../utils/bitcoin.js'\nimport axios from 'axios'\nimport { sha256 } from './hashing.js'\nimport type { FeeBreakdown } from '../types/FeeBreakdown.js'\n\nconst formatUsdFee = (\n amountUsd: string | undefined,\n shouldFlipSign: boolean = false\n) => {\n const value = Number(amountUsd ?? 0)\n const finalValue = shouldFlipSign ? -value : value\n // Explicit zero and sub-cent forms: formatDollar renders 0 as \"-\" and\n // sub-cent negatives as \"-$0.00\".\n let formatted: string\n if (finalValue === 0) {\n formatted = '$0.00'\n } else if (Math.abs(finalValue) < 0.01) {\n formatted = `${finalValue > 0 ? '+' : '-'}< $0.01`\n } else {\n formatted = formatDollar(finalValue)\n if (finalValue > 0) {\n formatted = `+${formatted}`\n }\n }\n return {\n value: finalValue,\n formatted\n }\n}\n\nexport const parseFees = (\n selectedTo: RelayChain,\n selectedFrom: RelayChain,\n quote?: ReturnType<typeof useQuote>['data']\n): FeeBreakdown => {\n const fees = quote?.fees\n const expandedPriceImpact = quote?.details?.expandedPriceImpact\n\n const gasFee = BigInt(fees?.gas?.amount ?? 0)\n const formattedGasFee = formatBN(\n gasFee,\n 5,\n Number(fees?.gas?.currency?.decimals ?? 18)\n )\n\n // Execution fee\n const executionFeeUsd = expandedPriceImpact?.execution?.usd\n\n // Platform fee (v2 name: relay fee)\n const relayFeeUsd = expandedPriceImpact?.relay?.usd\n\n // App fee\n const appFeeUsd = expandedPriceImpact?.app?.usd\n const hasAppFee = appFeeUsd && Number(appFeeUsd) !== 0\n\n const totalFeesUsd =\n Number(fees?.relayer?.amountUsd ?? 0) + Number(fees?.app?.amountUsd ?? 0)\n const _isGasSponsored = isGasSponsored(quote)\n\n const breakdown: BridgeFee[] = [\n {\n raw: gasFee,\n formatted: `${formattedGasFee}`,\n usd: formatUsdFee(fees?.gas?.amountUsd, true),\n name: `Deposit gas (${selectedFrom.displayName})`,\n tooltip: null,\n type: 'gas',\n id: 'origin-gas',\n currency: fees?.gas?.currency\n },\n {\n raw: 0n,\n formatted: '0',\n usd: _isGasSponsored\n ? { value: 0, formatted: '0' }\n : formatUsdFee(executionFeeUsd, false),\n name: `Execution Cost (${selectedTo.displayName})`,\n tooltip: null,\n type: 'gas',\n id: 'destination-gas',\n currency: fees?.relayer?.currency\n },\n {\n raw: 0n,\n formatted: '0',\n usd: _isGasSponsored\n ? { value: 0, formatted: '0' }\n : formatUsdFee(relayFeeUsd, false),\n name: 'Platform Fee',\n tooltip: null,\n type: 'relayer',\n id: 'relayer-fee',\n currency: fees?.relayer?.currency\n }\n ]\n if (hasAppFee) {\n breakdown.push({\n raw: 0n,\n formatted: '0',\n usd: _isGasSponsored\n ? { value: 0, formatted: '0' }\n : formatUsdFee(appFeeUsd, false),\n name: 'App Fee',\n tooltip: null,\n type: 'relayer',\n id: 'app-fee',\n currency: fees?.app?.currency\n })\n }\n\n let priceImpactColor: ComponentPropsWithoutRef<typeof Text>['color'] =\n 'subtleSecondary'\n\n if (quote?.details?.totalImpact?.percent === '-0.00') {\n quote.details.totalImpact.percent = '-0.01'\n }\n\n if (quote?.details?.totalImpact?.percent) {\n let percent = Number(quote.details.totalImpact.percent)\n if (percent <= -3) {\n priceImpactColor = 'red'\n } else if (percent > 0) {\n priceImpactColor = 'success'\n } else if (_isGasSponsored) {\n priceImpactColor = 'success'\n }\n }\n return {\n breakdown,\n totalFees: {\n usd: formatDollar(totalFeesUsd),\n priceImpactPercentage: quote?.details?.totalImpact?.percent\n ? `${quote?.details?.totalImpact?.percent}%`\n : undefined,\n priceImpact:\n quote?.details?.totalImpact?.usd &&\n quote?.details?.totalImpact?.usd != '0'\n ? formatDollar(parseFloat(quote?.details?.totalImpact?.usd ?? 0))\n : undefined,\n priceImpactColor,\n swapImpact: formatUsdFee(expandedPriceImpact?.swap?.usd, false)\n },\n isGasSponsored: _isGasSponsored\n }\n}\n\nexport const calculateRelayerFeeProportionUsd = (quote?: QuoteResponse) => {\n const usdIn = quote?.details?.currencyIn?.amountUsd\n ? Number(quote.details.currencyIn.amountUsd)\n : null\n const relayerServiceFeeUsd = quote?.fees?.relayerService?.amountUsd\n ? Number(quote.fees.relayerService.amountUsd)\n : null\n\n if (!usdIn || !relayerServiceFeeUsd) {\n return 0n\n }\n\n return BigInt(Math.floor((relayerServiceFeeUsd * 100) / usdIn))\n}\n\nexport const calculateRelayerFeeProportion = (\n totalAmount: { rawExcludingOriginGas: bigint },\n feeBreakdown: BridgeFee[]\n) => {\n if (totalAmount.rawExcludingOriginGas > 0n) {\n const relayerFeeRaw =\n feeBreakdown.find((fee) => fee.id === 'relayer-fee')?.raw ?? 0n\n return (relayerFeeRaw * 100n) / totalAmount.rawExcludingOriginGas\n }\n return 0n\n}\n\nexport const isHighRelayerServiceFeeUsd = (quote?: QuoteResponse) => {\n const usdIn = quote?.details?.currencyIn?.amountUsd\n ? Number(quote.details.currencyIn.amountUsd)\n : null\n const relayerServiceFeeUsd = quote?.fees?.relayerService?.amountUsd\n ? Number(quote.fees.relayerService.amountUsd)\n : null\n\n if (!usdIn || !relayerServiceFeeUsd) {\n return false\n }\n\n const feeThresholdPercentage = (usdIn * 1.5) / 100\n const feeThresholdUsd = 25\n return (\n relayerServiceFeeUsd > feeThresholdPercentage &&\n relayerServiceFeeUsd > feeThresholdUsd\n )\n}\n\nexport const extractQuoteId = (\n steps?: Execute['steps'] | QuoteResponse['steps']\n) => {\n return steps && steps[0] ? steps[0].requestId : undefined\n}\n\nexport const extractDepositAddress = (steps?: Execute['steps']) => {\n const depositStep = steps?.find((step) => step.id === 'deposit')\n return depositStep?.depositAddress\n}\n\nexport const calculatePriceTimeEstimate = (\n details?: QuoteResponse['details']\n) => {\n const isBitcoin =\n details?.currencyIn?.currency?.chainId === bitcoin.id ||\n details?.currencyOut?.currency?.chainId === bitcoin.id\n\n //If the relay is interacting with bitcoin we hardcode the time estime to 10m\n const time = isBitcoin ? 1200 : (details?.timeEstimate ?? 0)\n const formattedTime = formatSeconds(time)\n\n return {\n time,\n formattedTime\n }\n}\n\nexport const appendMetadataToRequest = (\n baseUrl?: string,\n requestId?: string,\n additionalMetadata?: paths['/requests/metadata']['post']['requestBody']['content']['application/json']['additionalMetadata'],\n referrer?: string\n) => {\n if (requestId && additionalMetadata) {\n const triggerData: paths['/requests/metadata']['post']['requestBody']['content']['application/json'] & {\n referrer?: string\n } = {\n requestId,\n additionalMetadata,\n referrer\n }\n\n return axios.request({\n url: `${baseUrl}/requests/metadata`,\n method: 'POST',\n data: triggerData\n })\n }\n}\n\nexport const getCurrentStep = (\n steps?: Execute['steps'] | null\n): {\n step: ExecuteStep | null | undefined\n stepItem: ExecuteStepItem | null | undefined\n} => {\n if (!steps) {\n return { step: null, stepItem: null }\n }\n\n const executableSteps = steps.filter(\n (step) => step.items && step.items.length > 0\n )\n\n const step = executableSteps.find((step) =>\n step.items.some((item) => item.status === 'incomplete')\n )\n const stepItem = step?.items.find((item) => item.status === 'incomplete')\n return { step, stepItem }\n}\n\nexport const getSwapEventData = (\n details: Execute['details'],\n fees: Execute['fees'],\n steps: Execute['steps'] | null,\n connector?: string,\n quoteParameters?: Parameters<typeof useQuote>['2']\n) => {\n let operation: string | undefined = details?.operation\n\n if (operation === 'swap') {\n const isSameChain =\n details?.currencyIn?.currency?.chainId ===\n details?.currencyOut?.currency?.chainId\n if (isSameChain) {\n operation = 'same_chain_swap'\n } else if (\n details?.currencyIn?.currency?.symbol ===\n details?.currencyOut?.currency?.symbol\n ) {\n operation = 'bridge'\n } else {\n operation = 'cross_chain_swap'\n }\n }\n const interval = get15MinuteInterval()\n const quoteRequestId = sha256({ ...quoteParameters, interval })\n\n return {\n wallet_connector: connector,\n quote_request_id: quoteRequestId,\n quote_id: steps ? extractQuoteId(steps) : undefined,\n amount_in: details?.currencyIn?.amount,\n amount_in_formatted: parseFloat(\n `${details?.currencyIn?.amountFormatted ?? '0'}`\n ),\n currency_in: details?.currencyIn?.currency?.symbol,\n currency_in_address: details?.currencyIn?.currency?.address,\n chain_id_in: details?.currencyIn?.currency?.chainId,\n currency_in_decimals: details?.currencyIn?.currency?.decimals,\n amount_out: details?.currencyOut?.amount,\n amount_out_formatted: parseFloat(\n `${details?.currencyOut?.amountFormatted ?? '0'}`\n ),\n currency_out_decimals: details?.currencyOut?.currency?.decimals,\n currency_out: details?.currencyOut?.currency?.symbol,\n currency_out_address: details?.currencyOut?.currency?.address,\n chain_id_out: details?.currencyOut?.currency?.chainId,\n currency_in_usd: details?.currencyIn?.amountUsd,\n currency_out_usd: details?.currencyOut?.amountUsd,\n deposit_address: steps?.find((step) => step.depositAddress)?.depositAddress,\n txHashes: steps\n ?.map((step) => {\n let txHashes: { chainId: number; txHash: string }[] = []\n step.items?.forEach((item) => {\n if (item.txHashes) {\n txHashes = txHashes.concat([\n ...(item.txHashes ?? []),\n ...(item.internalTxHashes ?? [])\n ])\n }\n })\n return txHashes\n })\n .flat(),\n operation,\n checkStatuses: steps\n ?.map((step) => {\n let checkStatuses: { stepId: string; checkStatus: string }[] = []\n step.items?.forEach((item) => {\n if (item.checkStatus) {\n checkStatuses.push({\n stepId: step.id,\n checkStatus: item.checkStatus\n })\n }\n })\n return checkStatuses\n })\n .flat(),\n subsidized:\n fees?.subsidized !== undefined && fees.subsidized.amount !== '0'\n ? true\n : false\n }\n}\n\nexport const calculateUsdValue = (\n price?: number,\n amountString?: string\n): number | undefined => {\n if (price && price > 0 && amountString && Number(amountString) > 0) {\n try {\n return parseFloat(amountString) * price\n } catch (e) {\n console.error(\n 'Failed to parse amount string for USD calculation',\n amountString,\n e\n )\n }\n }\n return undefined\n}\n\nexport const isGasSponsored = (quote?: QuoteResponse) => {\n return (\n quote?.fees?.subsidized?.amount != undefined &&\n quote?.fees?.subsidized?.amount != '0'\n )\n}\n"]}
@@ -8,17 +8,25 @@ import { formatSeconds } from './time.js';
8
8
  * - currencyIn: the token deposited on the origin side.
9
9
  * - currencyOut: the token received, preferring the destination output and
10
10
  * falling back to the origin output (e.g. same-chain swaps).
11
+ *
12
+ * `route.actual` is populated progressively while a request is in flight, so
13
+ * before the request status is `success` it can hold provisional values (e.g.
14
+ * the intermediate origin swap output). Output-side actual values are only
15
+ * used once the request status is `success`; until then the quoted values are
16
+ * returned so the UI never presents a provisional token/amount as received.
11
17
  */
12
18
  export const getRequestCurrencies = (transaction) => {
13
19
  const route = transaction?.data?.route;
14
20
  const actual = route?.actual;
15
21
  const quoted = route?.quoted;
16
22
  const currencyIn = actual?.origin?.inputCurrency ?? quoted?.origin?.inputCurrency;
17
- const currencyOut = actual?.destination?.outputCurrency ??
23
+ // Only trust output-side actual values once the request has succeeded
24
+ const settledActual = transaction?.status === 'success' ? actual : undefined;
25
+ const currencyOut = settledActual?.destination?.outputCurrency ??
18
26
  quoted?.destination?.outputCurrency ??
19
- actual?.origin?.outputCurrency ??
27
+ settledActual?.origin?.outputCurrency ??
20
28
  quoted?.origin?.outputCurrency;
21
- const currencyGasTopup = actual?.destination?.currencyGasTopup;
29
+ const currencyGasTopup = settledActual?.destination?.currencyGasTopup;
22
30
  return { currencyIn, currencyOut, currencyGasTopup };
23
31
  };
24
32
  export const extractFromChain = (transaction, client) => {
@@ -1 +1 @@
1
- {"version":3,"file":"relayTransaction.js","sourceRoot":"","sources":["../../../src/utils/relayTransaction.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Execute, RelayClient } from '@relayprotocol/relay-sdk'\nimport { type RelayTransaction } from '../types/index.js'\nimport { formatSeconds } from './time.js'\n\ntype RequestRoute = NonNullable<NonNullable<RelayTransaction['data']>['route']>\ntype RouteAmount = NonNullable<\n NonNullable<NonNullable<RequestRoute['quoted']>['origin']>['inputCurrency']\n>\n\n/**\n * Resolves the input/output currency amounts to display for a request from\n * `data.route`, preferring actual over quoted values.\n *\n * - currencyIn: the token deposited on the origin side.\n * - currencyOut: the token received, preferring the destination output and\n * falling back to the origin output (e.g. same-chain swaps).\n */\nexport const getRequestCurrencies = (\n transaction?: RelayTransaction | null\n): {\n currencyIn?: RouteAmount | null\n currencyOut?: RouteAmount | null\n currencyGasTopup?: RouteAmount | null\n} => {\n const route = transaction?.data?.route\n const actual = route?.actual\n const quoted = route?.quoted\n\n const currencyIn =\n actual?.origin?.inputCurrency ?? quoted?.origin?.inputCurrency\n\n const currencyOut =\n actual?.destination?.outputCurrency ??\n quoted?.destination?.outputCurrency ??\n actual?.origin?.outputCurrency ??\n quoted?.origin?.outputCurrency\n\n const currencyGasTopup = actual?.destination?.currencyGasTopup\n\n return { currencyIn, currencyOut, currencyGasTopup }\n}\n\nexport const extractFromChain = (\n transaction?: RelayTransaction | null,\n client?: RelayClient | null\n) => {\n const chainId = transaction?.data?.inTxs?.[0]?.chainId\n return client?.chains.find((chain) => chain.id === chainId)\n}\n\nexport const extractToChain = (\n transaction?: RelayTransaction | null,\n client?: RelayClient | null\n) => {\n const chainId = transaction?.data?.outTxs?.[0]?.chainId\n return client?.chains.find((chain) => chain.id === chainId)\n}\n\nexport const calculateFillTime = (transaction?: RelayTransaction | null) => {\n let fillTime = '-'\n let seconds = 0\n if (transaction?.status !== 'pending' && transaction?.status !== 'waiting') {\n const inTxTimestamps =\n transaction?.data?.inTxs?.map((tx) => tx.timestamp as number) ?? null\n const txStartTimestamp = inTxTimestamps ? Math.min(...inTxTimestamps) : null\n const outTxTimestamps =\n transaction?.data?.outTxs\n ?.filter((tx) => tx.timestamp)\n ?.map((tx) => tx.timestamp as number) ?? null\n\n const txEndTimestamp =\n outTxTimestamps && outTxTimestamps.length > 0\n ? Math.max(...outTxTimestamps)\n : null\n\n if (txStartTimestamp && txEndTimestamp) {\n seconds = txEndTimestamp - txStartTimestamp\n // Guard against negative time (invalid timestamps or timing issues)\n if (seconds < 0) {\n fillTime = '-'\n seconds = 0\n } else if (seconds > 60) {\n fillTime = formatSeconds(seconds)\n } else {\n fillTime = `${seconds}s`\n }\n }\n }\n return { fillTime, seconds }\n}\n\nexport const extractDepositRequestId = (steps?: Execute['steps'] | null) => {\n if (!steps?.length) return null\n\n // Find the first step that has a requestId\n return steps.find((step) => step.requestId)?.requestId || null\n}\n\nexport const statusToText = {\n pending: 'Pending',\n failure: 'Failure',\n received: 'Received',\n success: 'Success',\n fallback: 'Refunded'\n}\n"]}
1
+ {"version":3,"file":"relayTransaction.js","sourceRoot":"","sources":["../../../src/utils/relayTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACpE,OAAO,EAAyB,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAOzC;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,WAAqC,EAKrC,EAAE;IACF,MAAM,KAAK,GAAG,WAAW,EAAE,IAAI,EAAE,KAAK,CAAA;IACtC,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,CAAA;IAC5B,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,CAAA;IAE5B,MAAM,UAAU,GACd,MAAM,EAAE,MAAM,EAAE,aAAa,IAAI,MAAM,EAAE,MAAM,EAAE,aAAa,CAAA;IAEhE,sEAAsE;IACtE,MAAM,aAAa,GAAG,WAAW,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;IAE5E,MAAM,WAAW,GACf,aAAa,EAAE,WAAW,EAAE,cAAc;QAC1C,MAAM,EAAE,WAAW,EAAE,cAAc;QACnC,aAAa,EAAE,MAAM,EAAE,cAAc;QACrC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAA;IAEhC,MAAM,gBAAgB,GAAG,aAAa,EAAE,WAAW,EAAE,gBAAgB,CAAA;IAErE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAA;AACtD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,WAAqC,EACrC,MAA2B,EAC3B,EAAE;IACF,MAAM,OAAO,GAAG,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAA;IACtD,OAAO,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,CAAA;AAC7D,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,WAAqC,EACrC,MAA2B,EAC3B,EAAE;IACF,MAAM,OAAO,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAA;IACvD,OAAO,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,CAAA;AAC7D,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,WAAqC,EAAE,EAAE;IACzE,IAAI,QAAQ,GAAG,GAAG,CAAA;IAClB,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,IAAI,WAAW,EAAE,MAAM,KAAK,SAAS,IAAI,WAAW,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;QAC3E,MAAM,cAAc,GAClB,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAmB,CAAC,IAAI,IAAI,CAAA;QACvE,MAAM,gBAAgB,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAC5E,MAAM,eAAe,GACnB,WAAW,EAAE,IAAI,EAAE,MAAM;YACvB,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;YAC9B,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAmB,CAAC,IAAI,IAAI,CAAA;QAEjD,MAAM,cAAc,GAClB,eAAe,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC;YAC3C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC;YAC9B,CAAC,CAAC,IAAI,CAAA;QAEV,IAAI,gBAAgB,IAAI,cAAc,EAAE,CAAC;YACvC,OAAO,GAAG,cAAc,GAAG,gBAAgB,CAAA;YAC3C,oEAAoE;YACpE,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,QAAQ,GAAG,GAAG,CAAA;gBACd,OAAO,GAAG,CAAC,CAAA;YACb,CAAC;iBAAM,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;gBACxB,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;YACnC,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,GAAG,OAAO,GAAG,CAAA;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;AAC9B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,KAA+B,EAAE,EAAE;IACzE,IAAI,CAAC,KAAK,EAAE,MAAM;QAAE,OAAO,IAAI,CAAA;IAE/B,2CAA2C;IAC3C,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,IAAI,IAAI,CAAA;AAChE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;CACrB,CAAA","sourcesContent":["import { type Execute, RelayClient } from '@relayprotocol/relay-sdk'\nimport { type RelayTransaction } from '../types/index.js'\nimport { formatSeconds } from './time.js'\n\ntype RequestRoute = NonNullable<NonNullable<RelayTransaction['data']>['route']>\ntype RouteAmount = NonNullable<\n NonNullable<NonNullable<RequestRoute['quoted']>['origin']>['inputCurrency']\n>\n\n/**\n * Resolves the input/output currency amounts to display for a request from\n * `data.route`, preferring actual over quoted values.\n *\n * - currencyIn: the token deposited on the origin side.\n * - currencyOut: the token received, preferring the destination output and\n * falling back to the origin output (e.g. same-chain swaps).\n *\n * `route.actual` is populated progressively while a request is in flight, so\n * before the request status is `success` it can hold provisional values (e.g.\n * the intermediate origin swap output). Output-side actual values are only\n * used once the request status is `success`; until then the quoted values are\n * returned so the UI never presents a provisional token/amount as received.\n */\nexport const getRequestCurrencies = (\n transaction?: RelayTransaction | null\n): {\n currencyIn?: RouteAmount | null\n currencyOut?: RouteAmount | null\n currencyGasTopup?: RouteAmount | null\n} => {\n const route = transaction?.data?.route\n const actual = route?.actual\n const quoted = route?.quoted\n\n const currencyIn =\n actual?.origin?.inputCurrency ?? quoted?.origin?.inputCurrency\n\n // Only trust output-side actual values once the request has succeeded\n const settledActual = transaction?.status === 'success' ? actual : undefined\n\n const currencyOut =\n settledActual?.destination?.outputCurrency ??\n quoted?.destination?.outputCurrency ??\n settledActual?.origin?.outputCurrency ??\n quoted?.origin?.outputCurrency\n\n const currencyGasTopup = settledActual?.destination?.currencyGasTopup\n\n return { currencyIn, currencyOut, currencyGasTopup }\n}\n\nexport const extractFromChain = (\n transaction?: RelayTransaction | null,\n client?: RelayClient | null\n) => {\n const chainId = transaction?.data?.inTxs?.[0]?.chainId\n return client?.chains.find((chain) => chain.id === chainId)\n}\n\nexport const extractToChain = (\n transaction?: RelayTransaction | null,\n client?: RelayClient | null\n) => {\n const chainId = transaction?.data?.outTxs?.[0]?.chainId\n return client?.chains.find((chain) => chain.id === chainId)\n}\n\nexport const calculateFillTime = (transaction?: RelayTransaction | null) => {\n let fillTime = '-'\n let seconds = 0\n if (transaction?.status !== 'pending' && transaction?.status !== 'waiting') {\n const inTxTimestamps =\n transaction?.data?.inTxs?.map((tx) => tx.timestamp as number) ?? null\n const txStartTimestamp = inTxTimestamps ? Math.min(...inTxTimestamps) : null\n const outTxTimestamps =\n transaction?.data?.outTxs\n ?.filter((tx) => tx.timestamp)\n ?.map((tx) => tx.timestamp as number) ?? null\n\n const txEndTimestamp =\n outTxTimestamps && outTxTimestamps.length > 0\n ? Math.max(...outTxTimestamps)\n : null\n\n if (txStartTimestamp && txEndTimestamp) {\n seconds = txEndTimestamp - txStartTimestamp\n // Guard against negative time (invalid timestamps or timing issues)\n if (seconds < 0) {\n fillTime = '-'\n seconds = 0\n } else if (seconds > 60) {\n fillTime = formatSeconds(seconds)\n } else {\n fillTime = `${seconds}s`\n }\n }\n }\n return { fillTime, seconds }\n}\n\nexport const extractDepositRequestId = (steps?: Execute['steps'] | null) => {\n if (!steps?.length) return null\n\n // Find the first step that has a requestId\n return steps.find((step) => step.requestId)?.requestId || null\n}\n\nexport const statusToText = {\n pending: 'Pending',\n failure: 'Failure',\n received: 'Received',\n success: 'Success',\n fallback: 'Refunded'\n}\n"]}
@@ -5,7 +5,7 @@ export const solana = {
5
5
  export const eclipse = {
6
6
  id: 9286185
7
7
  };
8
- export const eclipseWallets = ['backpackeclipse'];
8
+ export const eclipseWallets = ['nightlyeclipse', 'okxeclipse'];
9
9
  export function isSolanaAddress(address) {
10
10
  return solanaAddressRegex.test(address);
11
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"solana.js","sourceRoot":"","sources":["../../../src/utils/solana.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAC7B,gHAAgH,CAAA;AAClH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,EAAE,EAAE,SAAS;CACd,CAAA;AACD,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,EAAE,EAAE,OAAO;CACZ,CAAA;AACD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,iBAAiB,CAAC,CAAA;AAEjD,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACzC,CAAC","sourcesContent":["export const solanaAddressRegex =\n /^(?!T[1-9A-HJ-NP-Za-km-z]{33}$)(?!0x[0-9a-fA-F]{40}$)(?!0x[0-9a-fA-F]{64}$)(?!bc1)[1-9A-HJ-NP-Za-km-z]{32,44}$/\nexport const solana = {\n id: 792703809\n}\nexport const eclipse = {\n id: 9286185\n}\nexport const eclipseWallets = ['backpackeclipse']\n\nexport function isSolanaAddress(address: string): boolean {\n return solanaAddressRegex.test(address)\n}\n"]}
1
+ {"version":3,"file":"solana.js","sourceRoot":"","sources":["../../../src/utils/solana.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAC7B,gHAAgH,CAAA;AAClH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,EAAE,EAAE,SAAS;CACd,CAAA;AACD,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,EAAE,EAAE,OAAO;CACZ,CAAA;AACD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAA;AAE9D,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACzC,CAAC","sourcesContent":["export const solanaAddressRegex =\n /^(?!T[1-9A-HJ-NP-Za-km-z]{33}$)(?!0x[0-9a-fA-F]{40}$)(?!0x[0-9a-fA-F]{64}$)(?!bc1)[1-9A-HJ-NP-Za-km-z]{32,44}$/\nexport const solana = {\n id: 792703809\n}\nexport const eclipse = {\n id: 9286185\n}\nexport const eclipseWallets = ['nightlyeclipse', 'okxeclipse']\n\nexport function isSolanaAddress(address: string): boolean {\n return solanaAddressRegex.test(address)\n}\n"]}
@@ -1,2 +1,2 @@
1
- export const UI_VERSION = '11.0.3';
1
+ export const UI_VERSION = '11.0.5';
2
2
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["export const UI_VERSION = '11.0.3';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["export const UI_VERSION = '11.0.5';\n"]}