@relayprotocol/relay-kit-ui 9.1.4 → 10.0.1

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 (124) hide show
  1. package/_cjs/src/components/common/CustomAddressModal.js +18 -8
  2. package/_cjs/src/components/common/CustomAddressModal.js.map +1 -1
  3. package/_cjs/src/components/common/RefundReason.js +106 -3
  4. package/_cjs/src/components/common/RefundReason.js.map +1 -1
  5. package/_cjs/src/components/common/TransactionModal/DepositAddressModalRenderer.js +7 -10
  6. package/_cjs/src/components/common/TransactionModal/DepositAddressModalRenderer.js.map +1 -1
  7. package/_cjs/src/components/common/TransactionModal/steps/DepositAddressValidatingStep.js.map +1 -1
  8. package/_cjs/src/components/common/TransactionModal/steps/ErrorStep.js +2 -2
  9. package/_cjs/src/components/common/TransactionModal/steps/ErrorStep.js.map +1 -1
  10. package/_cjs/src/components/common/TransactionModal/steps/SwapSuccessStep.js +15 -16
  11. package/_cjs/src/components/common/TransactionModal/steps/SwapSuccessStep.js.map +1 -1
  12. package/_cjs/src/components/primitives/ChainIcon.js +2 -1
  13. package/_cjs/src/components/primitives/ChainIcon.js.map +1 -1
  14. package/_cjs/src/components/primitives/ChainTokenIcon.js +6 -2
  15. package/_cjs/src/components/primitives/ChainTokenIcon.js.map +1 -1
  16. package/_cjs/src/components/widgets/OnrampWidget/modals/OnrampModal.js +10 -13
  17. package/_cjs/src/components/widgets/OnrampWidget/modals/OnrampModal.js.map +1 -1
  18. package/_cjs/src/components/widgets/OnrampWidget/widget/index.js +1 -1
  19. package/_cjs/src/components/widgets/OnrampWidget/widget/index.js.map +1 -1
  20. package/_cjs/src/components/widgets/SwapWidget/index.js +4 -4
  21. package/_cjs/src/components/widgets/SwapWidget/index.js.map +1 -1
  22. package/_cjs/src/components/widgets/SwapWidgetRenderer.js +22 -9
  23. package/_cjs/src/components/widgets/SwapWidgetRenderer.js.map +1 -1
  24. package/_cjs/src/components/widgets/WidgetContainer.js +1 -1
  25. package/_cjs/src/components/widgets/WidgetContainer.js.map +1 -1
  26. package/_cjs/src/constants/events.js +2 -1
  27. package/_cjs/src/constants/events.js.map +1 -1
  28. package/_cjs/src/constants/maxGasBuffer.js +1 -2
  29. package/_cjs/src/constants/maxGasBuffer.js.map +1 -1
  30. package/_cjs/src/hooks/index.js +3 -1
  31. package/_cjs/src/hooks/index.js.map +1 -1
  32. package/_cjs/src/hooks/useKnownTokenContract.js +45 -0
  33. package/_cjs/src/hooks/useKnownTokenContract.js.map +1 -0
  34. package/_cjs/src/providers/RelayKitProvider.js +22 -1
  35. package/_cjs/src/providers/RelayKitProvider.js.map +1 -1
  36. package/_cjs/src/types/RelayTransaction.js.map +1 -1
  37. package/_cjs/src/utils/nativeMaxAmount.js +4 -4
  38. package/_cjs/src/utils/nativeMaxAmount.js.map +1 -1
  39. package/_cjs/src/utils/relayTransaction.js +14 -1
  40. package/_cjs/src/utils/relayTransaction.js.map +1 -1
  41. package/_cjs/src/version.js +1 -1
  42. package/_cjs/src/version.js.map +1 -1
  43. package/_cjs/tsconfig.build.tsbuildinfo +1 -1
  44. package/_esm/src/components/common/CustomAddressModal.js +24 -10
  45. package/_esm/src/components/common/CustomAddressModal.js.map +1 -1
  46. package/_esm/src/components/common/RefundReason.js +107 -4
  47. package/_esm/src/components/common/RefundReason.js.map +1 -1
  48. package/_esm/src/components/common/TransactionModal/DepositAddressModalRenderer.js +10 -10
  49. package/_esm/src/components/common/TransactionModal/DepositAddressModalRenderer.js.map +1 -1
  50. package/_esm/src/components/common/TransactionModal/steps/DepositAddressValidatingStep.js +1 -1
  51. package/_esm/src/components/common/TransactionModal/steps/DepositAddressValidatingStep.js.map +1 -1
  52. package/_esm/src/components/common/TransactionModal/steps/ErrorStep.js +2 -2
  53. package/_esm/src/components/common/TransactionModal/steps/ErrorStep.js.map +1 -1
  54. package/_esm/src/components/common/TransactionModal/steps/SwapSuccessStep.js +15 -16
  55. package/_esm/src/components/common/TransactionModal/steps/SwapSuccessStep.js.map +1 -1
  56. package/_esm/src/components/primitives/ChainIcon.js +3 -2
  57. package/_esm/src/components/primitives/ChainIcon.js.map +1 -1
  58. package/_esm/src/components/primitives/ChainTokenIcon.js +6 -3
  59. package/_esm/src/components/primitives/ChainTokenIcon.js.map +1 -1
  60. package/_esm/src/components/widgets/OnrampWidget/modals/OnrampModal.js +14 -14
  61. package/_esm/src/components/widgets/OnrampWidget/modals/OnrampModal.js.map +1 -1
  62. package/_esm/src/components/widgets/OnrampWidget/widget/index.js +1 -1
  63. package/_esm/src/components/widgets/OnrampWidget/widget/index.js.map +1 -1
  64. package/_esm/src/components/widgets/SwapWidget/index.js +4 -4
  65. package/_esm/src/components/widgets/SwapWidget/index.js.map +1 -1
  66. package/_esm/src/components/widgets/SwapWidgetRenderer.js +27 -11
  67. package/_esm/src/components/widgets/SwapWidgetRenderer.js.map +1 -1
  68. package/_esm/src/components/widgets/WidgetContainer.js +1 -1
  69. package/_esm/src/components/widgets/WidgetContainer.js.map +1 -1
  70. package/_esm/src/constants/events.js +2 -1
  71. package/_esm/src/constants/events.js.map +1 -1
  72. package/_esm/src/constants/maxGasBuffer.js +0 -1
  73. package/_esm/src/constants/maxGasBuffer.js.map +1 -1
  74. package/_esm/src/hooks/index.js +2 -1
  75. package/_esm/src/hooks/index.js.map +1 -1
  76. package/_esm/src/hooks/useKnownTokenContract.js +52 -0
  77. package/_esm/src/hooks/useKnownTokenContract.js.map +1 -0
  78. package/_esm/src/providers/RelayKitProvider.js +31 -2
  79. package/_esm/src/providers/RelayKitProvider.js.map +1 -1
  80. package/_esm/src/types/RelayTransaction.js.map +1 -1
  81. package/_esm/src/utils/nativeMaxAmount.js +4 -4
  82. package/_esm/src/utils/nativeMaxAmount.js.map +1 -1
  83. package/_esm/src/utils/relayTransaction.js +20 -0
  84. package/_esm/src/utils/relayTransaction.js.map +1 -1
  85. package/_esm/src/version.js +1 -1
  86. package/_esm/src/version.js.map +1 -1
  87. package/_esm/tsconfig.build.tsbuildinfo +1 -1
  88. package/_types/src/components/common/CustomAddressModal.d.ts.map +1 -1
  89. package/_types/src/components/common/RefundReason.d.ts +1 -1
  90. package/_types/src/components/common/RefundReason.d.ts.map +1 -1
  91. package/_types/src/components/common/TransactionModal/DepositAddressModalRenderer.d.ts.map +1 -1
  92. package/_types/src/components/common/TransactionModal/steps/DepositAddressValidatingStep.d.ts +2 -2
  93. package/_types/src/components/common/TransactionModal/steps/DepositAddressValidatingStep.d.ts.map +1 -1
  94. package/_types/src/components/common/TransactionModal/steps/SwapSuccessStep.d.ts.map +1 -1
  95. package/_types/src/components/primitives/ChainIcon.d.ts.map +1 -1
  96. package/_types/src/components/primitives/ChainTokenIcon.d.ts.map +1 -1
  97. package/_types/src/components/widgets/OnrampWidget/modals/OnrampModal.d.ts.map +1 -1
  98. package/_types/src/components/widgets/OnrampWidget/widget/index.d.ts.map +1 -1
  99. package/_types/src/components/widgets/SwapWidget/index.d.ts +0 -2
  100. package/_types/src/components/widgets/SwapWidget/index.d.ts.map +1 -1
  101. package/_types/src/components/widgets/SwapWidgetRenderer.d.ts +0 -2
  102. package/_types/src/components/widgets/SwapWidgetRenderer.d.ts.map +1 -1
  103. package/_types/src/components/widgets/WidgetContainer.d.ts.map +1 -1
  104. package/_types/src/constants/events.d.ts +1 -0
  105. package/_types/src/constants/events.d.ts.map +1 -1
  106. package/_types/src/constants/maxGasBuffer.d.ts +0 -1
  107. package/_types/src/constants/maxGasBuffer.d.ts.map +1 -1
  108. package/_types/src/hooks/index.d.ts +2 -1
  109. package/_types/src/hooks/index.d.ts.map +1 -1
  110. package/_types/src/hooks/useKnownTokenContract.d.ts +35 -0
  111. package/_types/src/hooks/useKnownTokenContract.d.ts.map +1 -0
  112. package/_types/src/providers/RelayKitProvider.d.ts +13 -5
  113. package/_types/src/providers/RelayKitProvider.d.ts.map +1 -1
  114. package/_types/src/types/RelayTransaction.d.ts +1 -1
  115. package/_types/src/utils/nativeMaxAmount.d.ts +2 -2
  116. package/_types/src/utils/nativeMaxAmount.d.ts.map +1 -1
  117. package/_types/src/utils/relayTransaction.d.ts +16 -0
  118. package/_types/src/utils/relayTransaction.d.ts.map +1 -1
  119. package/_types/src/utils/tokens.d.ts +1 -1
  120. package/_types/src/version.d.ts +1 -1
  121. package/_types/src/version.d.ts.map +1 -1
  122. package/_types/tsconfig.build.tsbuildinfo +1 -1
  123. package/package.json +3 -3
  124. package/readme.md +14 -0
@@ -1 +1 @@
1
- {"version":3,"file":"RelayKitProvider.js","sourceRoot":"","sources":["../../../src/providers/RelayKitProvider.tsx"],"names":[],"mappings":"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","sourcesContent":["import { createContext, useCallback, useContext, useMemo } from 'react'\nimport type { FC, ReactElement, ReactNode } from 'react'\nimport { RelayClientProvider } from './RelayClientProvider.js'\nimport type { RelayClientOptions, paths } from '@relayprotocol/relay-sdk'\nimport type { RelayKitTheme } from '../themes/index.js'\nimport { generateCssVars } from '../utils/theme.js'\n\nexport type AppFees =\n paths['/quote/v2']['post']['requestBody']['content']['application/json']['appFees']\n\n/**\n * Haptic feedback intensity/type for UI interactions.\n *\n * - `light` — Subtle tap for minor interactions: token selection, chain starring, toggle switches, max button clicks\n * - `medium` — Noticeable tap for deliberate actions: swap CTA button press\n * - `heavy` — Strong tap for emphatic interactions: long-press actions\n * - `selection` — Ultra-light discrete tick for picker-like interactions: tab switches, chain filter selection\n * - `success` — Distinct success pattern: swap completed, onramp completed\n * - `error` — Distinct error pattern: swap failed, approval failed, onramp failed\n * - `warning` — Alert pattern: unverified token modal shown\n */\nexport type HapticEventType =\n | 'light'\n | 'medium'\n | 'heavy'\n | 'selection'\n | 'success'\n | 'error'\n | 'warning'\n\ntype RelayKitProviderOptions = {\n /**\n * The name of the application\n */\n appName?: string\n /**\n * An array of fee objects composing of a recipient address and the fee in BPS\n */\n appFees?: AppFees\n duneConfig?: {\n /**\n * The base url for the dune api, if omitted the default will be used. Override this config to protect your api key via a proxy.\n */\n apiBaseUrl?: string\n /**\n * This key is used to fetch token balances, to improve the general UX and suggest relevant tokens\n * Can be omitted and the ui will continue to function. Refer to the dune docs on how to get an api key\n */\n apiKey?: string\n }\n /**\n * An objecting mapping either a VM type (evm, svm, bvm) or a chain id to a connector key (metamask, backpacksol, etc).\n * Connector keys are used for differentiating which wallet maps to which vm/chain.\n * Only relevant for eclipse/solana at the moment.\n */\n vmConnectorKeyOverrides?: {\n [key in number | 'evm' | 'svm' | 'bvm']?: string[]\n }\n /**\n * An array of private chain ids to be used when querying the chains api within relay kit.\n */\n privateChainIds?: string[]\n /**\n * The icon theme to use for the chain icons. Defaults to light.\n */\n themeScheme?: 'dark' | 'light'\n /**\n * The loader to use for the loading spinner. Defaults to relay.\n */\n loader?: (options?: {\n width?: number | string\n height?: number | string\n fill?: string\n }) => ReactElement\n /**\n * The secure base url for the relay api, if omitted the default will be used. Override this config to protect your api key via a proxy.\n * Currently only relevant for the quote api in the SwapWidget\n */\n secureBaseUrl?: string\n /**\n * Optional callback for haptic feedback on UI interactions.\n * Relay Kit does not bundle any haptics library — integrators provide their own implementation.\n *\n * @example\n * ```tsx\n * import { useWebHaptics } from 'web-haptics/react'\n *\n * function App() {\n * const { trigger } = useWebHaptics()\n *\n * return (\n * <RelayKitProvider\n * options={{\n * ...otherOptions,\n * onHapticEvent: (type) => {\n * // Map Relay Kit types to your haptics library\n * const map = { light: 'nudge', medium: 'buzz', heavy: 'buzz', success: 'success', error: 'error', warning: 'error' }\n * trigger(map[type] ?? type)\n * }\n * }}\n * >\n * <SwapWidget />\n * </RelayKitProvider>\n * )\n * }\n * ```\n */\n onHapticEvent?: (type: HapticEventType) => void\n}\n\nexport interface RelayKitProviderProps {\n children: ReactNode\n options: RelayClientOptions & RelayKitProviderOptions\n theme?: RelayKitTheme\n}\n\nexport const ProviderOptionsContext = createContext<RelayKitProviderOptions>({})\n\nexport type ThemeOverridesMap = {\n [key: string]: string | ThemeOverridesMap\n}\n\nexport const themeOverrides: ThemeOverridesMap = {\n font: '--relay-fonts-body',\n fontHeading: '--relay-fonts-heading',\n primaryColor: '--relay-colors-primary-color',\n focusColor: '--relay-colors-focus-color',\n subtleBackgroundColor: '--relay-colors-subtle-background-color',\n subtleBorderColor: '--relay-colors-subtle-border-color',\n text: {\n default: '--relay-colors-text-default',\n subtle: '--relay-colors-text-subtle',\n error: '--relay-colors-text-error',\n success: '--relay-colors-text-success'\n },\n buttons: {\n borderRadius: '--relay-radii-button-border-radius',\n primary: {\n color: '--relay-colors-primary-button-color',\n background: '--relay-colors-primary-button-background',\n hover: {\n color: '--relay-colors-primary-button-hover-color',\n background: '--relay-colors-primary-button-hover-background'\n }\n },\n secondary: {\n color: '--relay-colors-secondary-button-color',\n background: '--relay-colors-secondary-button-background',\n hover: {\n color: '--relay-colors-secondary-button-hover-color',\n background: '--relay-colors-secondary-button-hover-background'\n }\n },\n white: {\n color: '--relay-colors-primary-button-color',\n background: '--relay-colors-primary-button-background',\n hover: {\n color: '--relay-colors-primary-button-hover-color',\n background: '--relay-colors-primary-button-hover-background'\n }\n },\n disabled: {\n color: '--relay-colors-button-disabled-color',\n background: '--relay-colors-button-disabled-background'\n },\n cta: {\n fontStyle: '--relay-fonts-button-cta-font-style'\n }\n },\n input: {\n background: '--relay-colors-input-background',\n borderRadius: '--relay-radii-input-border-radius',\n color: '--relay-colors-input-color'\n },\n skeleton: {\n background: '--relay-colors-skeleton-background'\n },\n anchor: {\n color: '--relay-colors-anchor-color',\n hover: {\n color: '--relay-colors-anchor-hover-color'\n }\n },\n dropdown: {\n background: '--relay-colors-dropdown-background',\n borderRadius: '--relay-radii-dropdown-border-radius',\n border: '--relay-borders-dropdown-border'\n },\n widget: {\n background: '--relay-colors-widget-background',\n borderRadius: '--relay-radii-widget-border-radius',\n border: '--relay-borders-widget-border',\n boxShadow: '--relay-shadows-widget-box-shadow',\n card: {\n background: '--relay-colors-widget-card-background',\n borderRadius: '--relay-radii-widget-card-border-radius',\n border: '--relay-borders-widget-card-border',\n gutter: '--relay-spacing-widget-card-section-gutter'\n },\n selector: {\n background: '--relay-colors-widget-selector-background',\n hover: {\n background: '--relay-colors-widget-selector-hover-background'\n }\n },\n swapCurrencyButtonBorderColor:\n '--relay-colors-widget-swap-currency-button-border-color',\n swapCurrencyButtonBorderWidth:\n '--relay-borders-widget-swap-currency-button-border-width',\n swapCurrencyButtonBorderRadius:\n '--relay-radii-widget-swap-currency-button-border-radius'\n },\n modal: {\n background: '--relay-colors-modal-background',\n borderRadius: '--relay-radii-modal-border-radius',\n border: '--relay-borders-modal-border'\n }\n}\n\nexport const RelayKitProvider: FC<RelayKitProviderProps> = function ({\n children,\n options,\n theme\n}: RelayKitProviderProps) {\n const providerOptions = useMemo(\n () => ({\n appName: options.appName,\n appFees: options.appFees,\n duneConfig: options.duneConfig,\n vmConnectorKeyOverrides: options.vmConnectorKeyOverrides,\n privateChainIds: options.privateChainIds,\n themeScheme: options.themeScheme,\n loader: options.loader,\n secureBaseUrl: options.secureBaseUrl,\n onHapticEvent: options.onHapticEvent\n }),\n [options]\n )\n\n // Generate the CSS variable declarations\n const cssVariables = useMemo(\n () => generateCssVars(theme, themeOverrides),\n [theme]\n )\n\n return (\n <ProviderOptionsContext.Provider value={providerOptions}>\n <RelayClientProvider options={options}>\n <style\n dangerouslySetInnerHTML={{\n __html: `.relay-kit-reset {\n ${cssVariables}\n }`\n }}\n />\n {children}\n </RelayClientProvider>\n </ProviderOptionsContext.Provider>\n )\n}\n\n/**\n * Hook that returns a stable haptic event callback from the RelayKitProvider context.\n * Wraps the integrator's callback in a try-catch to prevent haptic errors from breaking the UI.\n */\nexport function useHapticEvent() {\n const { onHapticEvent } = useContext(ProviderOptionsContext)\n return useCallback(\n (type: HapticEventType) => {\n try {\n onHapticEvent?.(type)\n } catch (e) {\n console.error('Error in onHapticEvent', type, e)\n }\n },\n [onHapticEvent]\n )\n}\n"]}
1
+ {"version":3,"file":"RelayKitProvider.js","sourceRoot":"","sources":["../../../src/providers/RelayKitProvider.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo\n} from 'react'\nimport type { FC, ReactElement, ReactNode } from 'react'\nimport { RelayClientProvider } from './RelayClientProvider.js'\nimport { isRelayApiUrl, MAINNET_RELAY_API } from '@relayprotocol/relay-sdk'\nimport type { RelayClientOptions, paths } from '@relayprotocol/relay-sdk'\nimport type { RelayKitTheme } from '../themes/index.js'\nimport { generateCssVars } from '../utils/theme.js'\n\nexport type AppFees =\n paths['/quote/v2']['post']['requestBody']['content']['application/json']['appFees']\n\n/**\n * Haptic feedback intensity/type for UI interactions.\n *\n * - `light` — Subtle tap for minor interactions: token selection, chain starring, toggle switches, max button clicks\n * - `medium` — Noticeable tap for deliberate actions: swap CTA button press\n * - `heavy` — Strong tap for emphatic interactions: long-press actions\n * - `selection` — Ultra-light discrete tick for picker-like interactions: tab switches, chain filter selection\n * - `success` — Distinct success pattern: swap completed, onramp completed\n * - `error` — Distinct error pattern: swap failed, approval failed, onramp failed\n * - `warning` — Alert pattern: unverified token modal shown\n */\nexport type HapticEventType =\n | 'light'\n | 'medium'\n | 'heavy'\n | 'selection'\n | 'success'\n | 'error'\n | 'warning'\n\ntype RelayKitProviderOptions = {\n /**\n * Silences the client-side API key warnings shown when `baseApiUrl` points\n * directly at the Relay API instead of a proxy.\n *\n * This only silences the warnings — it does not change behavior. A proxy is\n * the only supported configuration: the requests hooks never send\n * `x-api-key` from the browser, so `GET /requests/v3` requires `baseApiUrl`\n * to point at your backend proxy (which injects the key server-side). Setting\n * an `apiKey` alongside a Relay `baseApiUrl` also exposes that key via other\n * SDK calls (e.g. quotes). Only set this to `true` if you accept that\n * exposure (e.g. a public, rate-limited key).\n */\n acknowledgeApiKeyExposure?: boolean\n /**\n * The name of the application\n */\n appName?: string\n /**\n * An array of fee objects composing of a recipient address and the fee in BPS\n */\n appFees?: AppFees\n duneConfig?: {\n /**\n * The base url for the dune api, if omitted the default will be used. Override this config to protect your api key via a proxy.\n */\n apiBaseUrl?: string\n /**\n * This key is used to fetch token balances, to improve the general UX and suggest relevant tokens\n * Can be omitted and the ui will continue to function. Refer to the dune docs on how to get an api key\n */\n apiKey?: string\n }\n /**\n * An objecting mapping either a VM type (evm, svm, bvm) or a chain id to a connector key (metamask, backpacksol, etc).\n * Connector keys are used for differentiating which wallet maps to which vm/chain.\n * Only relevant for eclipse/solana at the moment.\n */\n vmConnectorKeyOverrides?: {\n [key in number | 'evm' | 'svm' | 'bvm']?: string[]\n }\n /**\n * An array of private chain ids to be used when querying the chains api within relay kit.\n */\n privateChainIds?: string[]\n /**\n * The icon theme to use for the chain icons. Defaults to light.\n */\n themeScheme?: 'dark' | 'light'\n /**\n * The loader to use for the loading spinner. Defaults to relay.\n */\n loader?: (options?: {\n width?: number | string\n height?: number | string\n fill?: string\n }) => ReactElement\n /**\n * Optional callback for haptic feedback on UI interactions.\n * Relay Kit does not bundle any haptics library — integrators provide their own implementation.\n *\n * @example\n * ```tsx\n * import { useWebHaptics } from 'web-haptics/react'\n *\n * function App() {\n * const { trigger } = useWebHaptics()\n *\n * return (\n * <RelayKitProvider\n * options={{\n * ...otherOptions,\n * onHapticEvent: (type) => {\n * // Map Relay Kit types to your haptics library\n * const map = { light: 'nudge', medium: 'buzz', heavy: 'buzz', success: 'success', error: 'error', warning: 'error' }\n * trigger(map[type] ?? type)\n * }\n * }}\n * >\n * <SwapWidget />\n * </RelayKitProvider>\n * )\n * }\n * ```\n */\n onHapticEvent?: (type: HapticEventType) => void\n}\n\nexport interface RelayKitProviderProps {\n children: ReactNode\n options: RelayClientOptions & RelayKitProviderOptions\n theme?: RelayKitTheme\n}\n\nexport const ProviderOptionsContext = createContext<RelayKitProviderOptions>({})\n\nexport type ThemeOverridesMap = {\n [key: string]: string | ThemeOverridesMap\n}\n\nexport const themeOverrides: ThemeOverridesMap = {\n font: '--relay-fonts-body',\n fontHeading: '--relay-fonts-heading',\n primaryColor: '--relay-colors-primary-color',\n focusColor: '--relay-colors-focus-color',\n subtleBackgroundColor: '--relay-colors-subtle-background-color',\n subtleBorderColor: '--relay-colors-subtle-border-color',\n text: {\n default: '--relay-colors-text-default',\n subtle: '--relay-colors-text-subtle',\n error: '--relay-colors-text-error',\n success: '--relay-colors-text-success'\n },\n buttons: {\n borderRadius: '--relay-radii-button-border-radius',\n primary: {\n color: '--relay-colors-primary-button-color',\n background: '--relay-colors-primary-button-background',\n hover: {\n color: '--relay-colors-primary-button-hover-color',\n background: '--relay-colors-primary-button-hover-background'\n }\n },\n secondary: {\n color: '--relay-colors-secondary-button-color',\n background: '--relay-colors-secondary-button-background',\n hover: {\n color: '--relay-colors-secondary-button-hover-color',\n background: '--relay-colors-secondary-button-hover-background'\n }\n },\n white: {\n color: '--relay-colors-primary-button-color',\n background: '--relay-colors-primary-button-background',\n hover: {\n color: '--relay-colors-primary-button-hover-color',\n background: '--relay-colors-primary-button-hover-background'\n }\n },\n disabled: {\n color: '--relay-colors-button-disabled-color',\n background: '--relay-colors-button-disabled-background'\n },\n cta: {\n fontStyle: '--relay-fonts-button-cta-font-style'\n }\n },\n input: {\n background: '--relay-colors-input-background',\n borderRadius: '--relay-radii-input-border-radius',\n color: '--relay-colors-input-color'\n },\n skeleton: {\n background: '--relay-colors-skeleton-background'\n },\n anchor: {\n color: '--relay-colors-anchor-color',\n hover: {\n color: '--relay-colors-anchor-hover-color'\n }\n },\n dropdown: {\n background: '--relay-colors-dropdown-background',\n borderRadius: '--relay-radii-dropdown-border-radius',\n border: '--relay-borders-dropdown-border'\n },\n widget: {\n background: '--relay-colors-widget-background',\n borderRadius: '--relay-radii-widget-border-radius',\n border: '--relay-borders-widget-border',\n boxShadow: '--relay-shadows-widget-box-shadow',\n card: {\n background: '--relay-colors-widget-card-background',\n borderRadius: '--relay-radii-widget-card-border-radius',\n border: '--relay-borders-widget-card-border',\n gutter: '--relay-spacing-widget-card-section-gutter'\n },\n selector: {\n background: '--relay-colors-widget-selector-background',\n hover: {\n background: '--relay-colors-widget-selector-hover-background'\n }\n },\n swapCurrencyButtonBorderColor:\n '--relay-colors-widget-swap-currency-button-border-color',\n swapCurrencyButtonBorderWidth:\n '--relay-borders-widget-swap-currency-button-border-width',\n swapCurrencyButtonBorderRadius:\n '--relay-radii-widget-swap-currency-button-border-radius'\n },\n modal: {\n background: '--relay-colors-modal-background',\n borderRadius: '--relay-radii-modal-border-radius',\n border: '--relay-borders-modal-border'\n }\n}\n\n// Tracks base URLs we've already warned about so the message logs once, not on\n// every mount/render (incl. React StrictMode double-invocation).\nconst warnedApiKeyExposure = new Set<string>()\n\nexport const RelayKitProvider: FC<RelayKitProviderProps> = function ({\n children,\n options,\n theme\n}: RelayKitProviderProps) {\n // Warn when the Relay API is called directly instead of through a proxy.\n // GET /requests/v3 requires an API key, which must not be shipped to the\n // browser — integrators should proxy Relay API calls through their own\n // backend and point `baseApiUrl` at it. Runs client-side only (useEffect) and\n // re-checks only when the relevant options change.\n useEffect(() => {\n if (options.acknowledgeApiKeyExposure) return\n const baseApiUrl = options.baseApiUrl ?? MAINNET_RELAY_API\n // A proxy setup uses a non-Relay baseApiUrl, which is the desired state.\n if (!isRelayApiUrl(baseApiUrl)) return\n if (warnedApiKeyExposure.has(baseApiUrl)) return\n warnedApiKeyExposure.add(baseApiUrl)\n\n if (options.apiKey) {\n console.error(\n '[RelayKit] Your Relay API key is being sent from the browser because `baseApiUrl` points directly at the Relay API. ' +\n 'Proxy Relay API calls through your own backend that injects the `x-api-key` header, and set `baseApiUrl` to that proxy. ' +\n 'Pass `acknowledgeApiKeyExposure: true` to silence this.'\n )\n } else {\n console.warn(\n '[RelayKit] `baseApiUrl` points directly at the Relay API with no proxy. ' +\n 'GET /requests/v3 requires an API key and will fail without one — set `baseApiUrl` to a proxy on your backend that injects the `x-api-key` header. ' +\n 'Pass `acknowledgeApiKeyExposure: true` to silence this.'\n )\n }\n }, [options.acknowledgeApiKeyExposure, options.baseApiUrl, options.apiKey])\n\n const providerOptions = useMemo(\n () => ({\n appName: options.appName,\n appFees: options.appFees,\n duneConfig: options.duneConfig,\n vmConnectorKeyOverrides: options.vmConnectorKeyOverrides,\n privateChainIds: options.privateChainIds,\n themeScheme: options.themeScheme,\n loader: options.loader,\n onHapticEvent: options.onHapticEvent\n }),\n [options]\n )\n\n // Generate the CSS variable declarations\n const cssVariables = useMemo(\n () => generateCssVars(theme, themeOverrides),\n [theme]\n )\n\n return (\n <ProviderOptionsContext.Provider value={providerOptions}>\n <RelayClientProvider options={options}>\n <style\n dangerouslySetInnerHTML={{\n __html: `.relay-kit-reset {\n ${cssVariables}\n }`\n }}\n />\n {children}\n </RelayClientProvider>\n </ProviderOptionsContext.Provider>\n )\n}\n\n/**\n * Hook that returns a stable haptic event callback from the RelayKitProvider context.\n * Wraps the integrator's callback in a try-catch to prevent haptic errors from breaking the UI.\n */\nexport function useHapticEvent() {\n const { onHapticEvent } = useContext(ProviderOptionsContext)\n return useCallback(\n (type: HapticEventType) => {\n try {\n onHapticEvent?.(type)\n } catch (e) {\n console.error('Error in onHapticEvent', type, e)\n }\n },\n [onHapticEvent]\n )\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"RelayTransaction.js","sourceRoot":"","sources":["../../../src/types/RelayTransaction.ts"],"names":[],"mappings":"","sourcesContent":["import type { paths } from '@relayprotocol/relay-sdk'\n\nexport type UserTransactionsResponse =\n paths['/requests/v2']['get']['responses']['200']['content']['application/json']\n\nexport type RelayTransaction = NonNullable<\n NonNullable<UserTransactionsResponse>['requests']\n>[0]\n"]}
1
+ {"version":3,"file":"RelayTransaction.js","sourceRoot":"","sources":["../../../src/types/RelayTransaction.ts"],"names":[],"mappings":"","sourcesContent":["import type { paths } from '@relayprotocol/relay-sdk'\n\nexport type UserTransactionsResponse =\n paths['/requests/v3']['get']['responses']['200']['content']['application/json']\n\nexport type RelayTransaction = NonNullable<\n NonNullable<UserTransactionsResponse>['requests']\n>[0]\n"]}
@@ -47,7 +47,7 @@ const calculateEvmNativeGasBuffer = async (publicClient, balance, gasLimit = 400
47
47
  }
48
48
  };
49
49
  exports.calculateEvmNativeGasBuffer = calculateEvmNativeGasBuffer;
50
- const calculateSvmNativeFeeBuffer = async (chainId) => {
50
+ const calculateSvmNativeFeeBuffer = async (chainId, baseApiUrl) => {
51
51
  const isEclipseChain = chainId === 9286185;
52
52
  const multiplier = isEclipseChain
53
53
  ? maxGasBuffer_js_1.ECLIPSE_FEE_BUFFER_MULTIPLIER
@@ -60,7 +60,7 @@ const calculateSvmNativeFeeBuffer = async (chainId) => {
60
60
  limit: 20,
61
61
  originChainId: chainId
62
62
  };
63
- const resp = await (0, relay_kit_hooks_1.queryRequests)(relay_sdk_1.MAINNET_RELAY_API, queryOptions);
63
+ const resp = await (0, relay_kit_hooks_1.queryRequests)(baseApiUrl ?? relay_sdk_1.MAINNET_RELAY_API, queryOptions);
64
64
  if (!resp || !Array.isArray(resp.requests) || resp.requests.length === 0) {
65
65
  console.warn('No valid fees found in response. Using fallback buffer.');
66
66
  return fallbackBuffer;
@@ -89,7 +89,7 @@ const calculateSvmNativeFeeBuffer = async (chainId) => {
89
89
  }
90
90
  };
91
91
  exports.calculateSvmNativeFeeBuffer = calculateSvmNativeFeeBuffer;
92
- const getFeeBufferAmount = async (vmType, chainId, balance, publicClient) => {
92
+ const getFeeBufferAmount = async (vmType, chainId, balance, publicClient, baseApiUrl) => {
93
93
  const cacheKey = `${vmType}FeeBuffer:${chainId}`;
94
94
  const cachedBufferStr = (0, localStorage_js_1.getCacheEntry)(cacheKey);
95
95
  if (cachedBufferStr) {
@@ -111,7 +111,7 @@ const getFeeBufferAmount = async (vmType, chainId, balance, publicClient) => {
111
111
  const fallbackBuffer = isEclipseChain
112
112
  ? maxGasBuffer_js_1.ECLIPSE_DEFAULT_FEE_WEI * maxGasBuffer_js_1.ECLIPSE_FEE_BUFFER_MULTIPLIER
113
113
  : maxGasBuffer_js_1.SOLANA_DEFAULT_FEE_LAMPORTS * maxGasBuffer_js_1.SOLANA_FEE_BUFFER_MULTIPLIER;
114
- calculationPromise = (0, exports.calculateSvmNativeFeeBuffer)(chainId).catch((error) => {
114
+ calculationPromise = (0, exports.calculateSvmNativeFeeBuffer)(chainId, baseApiUrl).catch((error) => {
115
115
  console.error(`Failed to calculate SVM fee buffer for chain ${chainId}:`, error);
116
116
  return fallbackBuffer;
117
117
  });
@@ -1 +1 @@
1
- {"version":3,"file":"nativeMaxAmount.js","sourceRoot":"","sources":["../../../src/utils/nativeMaxAmount.ts"],"names":[],"mappings":";;;AACA,kEAQqC;AACrC,wDAA4D;AAC5D,oEAA8D;AAE9D,uDAAgE;AAGhE,MAAM,aAAa,GAAoC,EAAE,CAAA;AAYlD,MAAM,2BAA2B,GAAG,KAAK,EAC9C,YAA0B,EAC1B,OAAe,EACf,WAAmB,OAAO,EACT,EAAE;IACnB,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAA;IACX,CAAC;IAGD,MAAM,aAAa,GAAG,qCAAmB,CAAA;IAEzC,IAAI,CAAC;QACH,IAAI,OAAO,CAAA;QACX,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,YAAY,CAAC,kBAAkB,EAAE,CAAA;QACnD,CAAC;QAAC,OAAO,YAAY,EAAE,CAAC;YAEtB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,WAAW,EAAE,CAAA;gBACjD,OAAO,GAAG;oBACR,YAAY,EAAE,QAAQ;oBACtB,QAAQ,EAAE,QAAQ;iBACnB,CAAA;YACH,CAAC;YAAC,OAAO,WAAW,EAAE,CAAC;gBAErB,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,WAAW,CAAC,CAAA;gBAC3D,OAAO,aAAa,CAAA;YACtB,CAAC;QACH,CAAC;QAGD,IAAI,aAAa,GAAG,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAA;QAE5D,IAAI,CAAC,aAAa,IAAI,aAAa,IAAI,EAAE,EAAE,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,OAAO,CAAC,CAAA;YAC1D,OAAO,aAAa,CAAA;QACtB,CAAC;QAED,IAAI,aAAa,GAAG,uCAAqB,EAAE,CAAC;YAC1C,aAAa,GAAG,uCAAqB,CAAA;QACvC,CAAC;QAED,MAAM,gBAAgB,GAAG,aAAa,GAAG,QAAQ,CAAA;QACjD,MAAM,MAAM,GAAG,gBAAgB,GAAG,2CAAyB,CAAA;QAG3D,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAA;QAChE,OAAO,aAAa,CAAA;IACtB,CAAC;AACH,CAAC,CAAA;AApDY,QAAA,2BAA2B,+BAoDvC;AAUM,MAAM,2BAA2B,GAAG,KAAK,EAC9C,OAAe,EACE,EAAE;IACnB,MAAM,cAAc,GAAG,OAAO,KAAK,OAAO,CAAA;IAC1C,MAAM,UAAU,GAAG,cAAc;QAC/B,CAAC,CAAC,+CAA6B;QAC/B,CAAC,CAAC,8CAA4B,CAAA;IAEhC,MAAM,cAAc,GAAG,cAAc;QACnC,CAAC,CAAC,yCAAuB,GAAG,+CAA6B;QACzD,CAAC,CAAC,6CAA2B,GAAG,8CAA4B,CAAA;IAE9D,IAAI,CAAC;QACH,MAAM,YAAY,GAAG;YACnB,KAAK,EAAE,EAAE;YACT,aAAa,EAAE,OAAO;SACd,CAAA;QAEV,MAAM,IAAI,GAAG,MAAM,IAAA,+BAAa,EAAC,6BAAiB,EAAE,YAAY,CAAC,CAAA;QAEjE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAA;YACvE,OAAO,cAAc,CAAA;QACvB,CAAC;QAGD,MAAM,IAAI,GAAa,IAAI,CAAC,QAAQ;aACjC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;YACd,MAAM,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAA;YACvC,IAAI,CAAC;gBACH,OAAO,MAAM,CAAC,MAAM,CAAC,CAAA;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAgB,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAA;QAExD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,cAAc,CAAA;QACvB,CAAC;QAGD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CACxB,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EACjD,EAAE,CACH,CAAA;QAGD,MAAM,MAAM,GAAG,MAAM,GAAG,UAAU,CAAA;QAElC,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAA;QAChE,OAAO,cAAc,CAAA;IACvB,CAAC;AACH,CAAC,CAAA;AAvDY,QAAA,2BAA2B,+BAuDvC;AAYM,MAAM,kBAAkB,GAAG,KAAK,EACrC,MAAkC,EAClC,OAAkC,EAClC,OAAe,EACf,YAAiC,EAChB,EAAE;IACnB,MAAM,QAAQ,GAAG,GAAG,MAAM,aAAa,OAAO,EAAE,CAAA;IAChD,MAAM,eAAe,GAAG,IAAA,+BAAa,EAAC,QAAQ,CAAC,CAAA;IAE/C,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC,eAAe,CAAC,CAAA;IAChC,CAAC;IAGD,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,CAAC;QAClE,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAA;IAChC,CAAC;IAGD,IAAI,kBAAmC,CAAA;IAEvC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAA;YACzE,OAAO,qCAAmB,GAAG,2CAAyB,CAAA;QACxD,CAAC;QACD,kBAAkB,GAAG,IAAA,mCAA2B,EAAC,YAAY,EAAE,OAAO,CAAC,CAAA;IACzE,CAAC;SAAM,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,OAAO,KAAK,OAAO,CAAA;QAC1C,MAAM,cAAc,GAAG,cAAc;YACnC,CAAC,CAAC,yCAAuB,GAAG,+CAA6B;YACzD,CAAC,CAAC,6CAA2B,GAAG,8CAA4B,CAAA;QAC9D,kBAAkB,GAAG,IAAA,mCAA2B,EAAC,OAAQ,CAAC,CAAC,KAAK,CAC9D,CAAC,KAAK,EAAE,EAAE;YACR,OAAO,CAAC,KAAK,CACX,gDAAgD,OAAO,GAAG,EAC1D,KAAK,CACN,CAAA;YACD,OAAO,cAAc,CAAA;QACvB,CAAC,CACF,CAAA;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CACV,oCAAoC,MAAM,iCAAiC,CAC5E,CAAA;QACD,OAAO,qCAAmB,GAAG,2CAAyB,CAAA;IACxD,CAAC;IAGD,aAAa,CAAC,QAAQ,CAAC,GAAG,kBAAkB,CAAA;IAG5C,kBAAkB;SACf,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACf,IAAA,+BAAa,EAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IACpC,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAA;IACtE,CAAC,CAAC;SACD,OAAO,CAAC,GAAG,EAAE;QACZ,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEJ,OAAO,kBAAkB,CAAA;AAC3B,CAAC,CAAA;AAhEY,QAAA,kBAAkB,sBAgE9B","sourcesContent":["import type { PublicClient } from 'viem'\nimport {\n EVM_GAS_BUFFER_MULTIPLIER,\n MINIMUM_GAS_PRICE_WEI,\n SOLANA_FEE_BUFFER_MULTIPLIER,\n SOLANA_DEFAULT_FEE_LAMPORTS,\n ECLIPSE_FEE_BUFFER_MULTIPLIER,\n ECLIPSE_DEFAULT_FEE_WEI,\n EVM_DEFAULT_FEE_WEI\n} from '../constants/maxGasBuffer.js'\nimport { MAINNET_RELAY_API } from '@relayprotocol/relay-sdk'\nimport { queryRequests } from '@relayprotocol/relay-kit-hooks'\nimport type { ChainVM } from '@relayprotocol/relay-sdk'\nimport { getCacheEntry, setCacheEntry } from './localStorage.js'\n\n// Refs to store ongoing fetch promises\nconst fetchPromises: Record<string, Promise<bigint>> = {}\n\n/**\n * Calculates the gas buffer needed for a native EVM token transfer.\n * This buffer is estimated based on gas price and a standard limit,\n * then multiplied by a safety factor.\n *\n * @param publicClient - A VIEM PublicClient connected to the EVM chain.\n * @param balance - The total native balance of the user (used for early exit).\n * @param gasLimit - Optional: The gas limit to use for estimation (defaults to 400000n).\n * @returns The calculated gas buffer amount as a bigint, or 0n if estimation fails or balance is zero.\n */\nexport const calculateEvmNativeGasBuffer = async (\n publicClient: PublicClient,\n balance: bigint,\n gasLimit: bigint = 400000n\n): Promise<bigint> => {\n if (!balance || balance <= 0n) {\n return 0n\n }\n\n // Fixed fallback buffer: 0.005 ETH in Wei\n const defaultBuffer = EVM_DEFAULT_FEE_WEI\n\n try {\n let feeData\n try {\n feeData = await publicClient.estimateFeesPerGas()\n } catch (eip1559Error) {\n // Fallback to legacy gas price estimation\n try {\n const gasPrice = await publicClient.getGasPrice()\n feeData = {\n maxFeePerGas: gasPrice,\n gasPrice: gasPrice\n }\n } catch (legacyError) {\n // If both estimations fail, return fallback buffer\n console.error('Failed to estimate gas price:', legacyError)\n return defaultBuffer\n }\n }\n\n // Prefer EIP-1559 maxFeePerGas if available, otherwise use gasPrice\n let gasPriceToUse = feeData.maxFeePerGas ?? feeData.gasPrice\n\n if (!gasPriceToUse || gasPriceToUse <= 0n) {\n console.error('Invalid gas price data received:', feeData)\n return defaultBuffer\n }\n\n if (gasPriceToUse < MINIMUM_GAS_PRICE_WEI) {\n gasPriceToUse = MINIMUM_GAS_PRICE_WEI\n }\n\n const estimatedGasCost = gasPriceToUse * gasLimit\n const buffer = estimatedGasCost * EVM_GAS_BUFFER_MULTIPLIER\n\n // return the calculated buffer\n return buffer\n } catch (error) {\n console.error('Error calculating EVM native gas buffer:', error)\n return defaultBuffer\n }\n}\n\n/**\n * Calculates the fee buffer needed for a native SVM (e.g., Solana) or Eclipse transaction.\n * Uses specific multipliers and default fees for each type.\n * Falls back to a default fee if API data is unavailable or invalid.\n *\n * @param chainId - The chain ID of the SVM or Eclipse network.\n * @returns The calculated fee buffer amount (in lamports for Solana, Wei for Eclipse) as a bigint, or a fallback buffer if estimation fails.\n */\nexport const calculateSvmNativeFeeBuffer = async (\n chainId: number\n): Promise<bigint> => {\n const isEclipseChain = chainId === 9286185\n const multiplier = isEclipseChain\n ? ECLIPSE_FEE_BUFFER_MULTIPLIER\n : SOLANA_FEE_BUFFER_MULTIPLIER\n\n const fallbackBuffer = isEclipseChain\n ? ECLIPSE_DEFAULT_FEE_WEI * ECLIPSE_FEE_BUFFER_MULTIPLIER\n : SOLANA_DEFAULT_FEE_LAMPORTS * SOLANA_FEE_BUFFER_MULTIPLIER\n\n try {\n const queryOptions = {\n limit: 20,\n originChainId: chainId\n } as const\n\n const resp = await queryRequests(MAINNET_RELAY_API, queryOptions)\n\n if (!resp || !Array.isArray(resp.requests) || resp.requests.length === 0) {\n console.warn('No valid fees found in response. Using fallback buffer.')\n return fallbackBuffer\n }\n\n // Extract fees data from the response\n const fees: bigint[] = resp.requests\n .map((r: any) => {\n const feeStr = r?.data?.inTxs?.[0]?.fee\n try {\n return BigInt(feeStr)\n } catch {\n return null\n }\n })\n .filter((f: bigint | null): f is bigint => f !== null)\n\n if (fees.length === 0) {\n return fallbackBuffer\n }\n\n // Find the maximum fee among the valid fees\n const maxFee = fees.reduce(\n (max, current) => (current > max ? current : max),\n 0n\n )\n\n // Apply buffer multiplier to the maximum fee\n const buffer = maxFee * multiplier\n\n return buffer\n } catch (error) {\n console.error('Error calculating SVM native fee buffer:', error)\n return fallbackBuffer\n }\n}\n\n/**\n * Gets the fee buffer amount for a given chain and VM type.\n * Handles caching, ongoing fetch promises, and initiates calculation if needed.\n *\n * @param vmType - The virtual machine type ('evm' or 'svm').\n * @param chainId - The chain ID.\n * @param balance - The current balance (required for EVM calculation).\n * @param publicClient - VIEM PublicClient (required for EVM calculation).\n * @returns A promise that resolves to the fee buffer amount as a bigint.\n */\nexport const getFeeBufferAmount = async (\n vmType: ChainVM | undefined | null,\n chainId: number | undefined | null,\n balance: bigint,\n publicClient: PublicClient | null\n): Promise<bigint> => {\n const cacheKey = `${vmType}FeeBuffer:${chainId}`\n const cachedBufferStr = getCacheEntry(cacheKey)\n\n if (cachedBufferStr) {\n return BigInt(cachedBufferStr)\n }\n\n // Check if a fetch is already in progress\n if (Object.prototype.hasOwnProperty.call(fetchPromises, cacheKey)) {\n return fetchPromises[cacheKey]\n }\n\n // Initiate fetch\n let calculationPromise: Promise<bigint>\n\n if (vmType === 'evm') {\n if (!publicClient) {\n console.error('PublicClient is required for EVM fee buffer calculation.')\n return EVM_DEFAULT_FEE_WEI * EVM_GAS_BUFFER_MULTIPLIER\n }\n calculationPromise = calculateEvmNativeGasBuffer(publicClient, balance)\n } else if (vmType === 'svm') {\n const isEclipseChain = chainId === 9286185\n const fallbackBuffer = isEclipseChain\n ? ECLIPSE_DEFAULT_FEE_WEI * ECLIPSE_FEE_BUFFER_MULTIPLIER\n : SOLANA_DEFAULT_FEE_LAMPORTS * SOLANA_FEE_BUFFER_MULTIPLIER\n calculationPromise = calculateSvmNativeFeeBuffer(chainId!).catch(\n (error) => {\n console.error(\n `Failed to calculate SVM fee buffer for chain ${chainId}:`,\n error\n )\n return fallbackBuffer\n }\n )\n } else {\n console.warn(\n `Unsupported VM type encountered: ${vmType}. Returning default EVM buffer.`\n )\n return EVM_DEFAULT_FEE_WEI * EVM_GAS_BUFFER_MULTIPLIER\n }\n\n // Store the promise\n fetchPromises[cacheKey] = calculationPromise\n\n // Handle caching and cleanup after promise settles\n calculationPromise\n .then((buffer) => {\n setCacheEntry(cacheKey, buffer, 5)\n })\n .catch((error) => {\n console.error(`Error processing fee buffer for ${cacheKey}:`, error)\n })\n .finally(() => {\n delete fetchPromises[cacheKey]\n })\n\n return calculationPromise\n}\n"]}
1
+ {"version":3,"file":"nativeMaxAmount.js","sourceRoot":"","sources":["../../../src/utils/nativeMaxAmount.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PublicClient } from 'viem'\nimport {\n EVM_GAS_BUFFER_MULTIPLIER,\n MINIMUM_GAS_PRICE_WEI,\n SOLANA_FEE_BUFFER_MULTIPLIER,\n SOLANA_DEFAULT_FEE_LAMPORTS,\n ECLIPSE_FEE_BUFFER_MULTIPLIER,\n ECLIPSE_DEFAULT_FEE_WEI,\n EVM_DEFAULT_FEE_WEI\n} from '../constants/maxGasBuffer.js'\nimport { MAINNET_RELAY_API } from '@relayprotocol/relay-sdk'\nimport { queryRequests } from '@relayprotocol/relay-kit-hooks'\nimport type { ChainVM } from '@relayprotocol/relay-sdk'\nimport { getCacheEntry, setCacheEntry } from './localStorage.js'\n\n// Refs to store ongoing fetch promises\nconst fetchPromises: Record<string, Promise<bigint>> = {}\n\n/**\n * Calculates the gas buffer needed for a native EVM token transfer.\n * This buffer is estimated based on gas price and a standard limit,\n * then multiplied by a safety factor.\n *\n * @param publicClient - A VIEM PublicClient connected to the EVM chain.\n * @param balance - The total native balance of the user (used for early exit).\n * @param gasLimit - Optional: The gas limit to use for estimation (defaults to 400000n).\n * @returns The calculated gas buffer amount as a bigint, or 0n if estimation fails or balance is zero.\n */\nexport const calculateEvmNativeGasBuffer = async (\n publicClient: PublicClient,\n balance: bigint,\n gasLimit: bigint = 400000n\n): Promise<bigint> => {\n if (!balance || balance <= 0n) {\n return 0n\n }\n\n // Fixed fallback buffer: 0.005 ETH in Wei\n const defaultBuffer = EVM_DEFAULT_FEE_WEI\n\n try {\n let feeData\n try {\n feeData = await publicClient.estimateFeesPerGas()\n } catch (eip1559Error) {\n // Fallback to legacy gas price estimation\n try {\n const gasPrice = await publicClient.getGasPrice()\n feeData = {\n maxFeePerGas: gasPrice,\n gasPrice: gasPrice\n }\n } catch (legacyError) {\n // If both estimations fail, return fallback buffer\n console.error('Failed to estimate gas price:', legacyError)\n return defaultBuffer\n }\n }\n\n // Prefer EIP-1559 maxFeePerGas if available, otherwise use gasPrice\n let gasPriceToUse = feeData.maxFeePerGas ?? feeData.gasPrice\n\n if (!gasPriceToUse || gasPriceToUse <= 0n) {\n console.error('Invalid gas price data received:', feeData)\n return defaultBuffer\n }\n\n if (gasPriceToUse < MINIMUM_GAS_PRICE_WEI) {\n gasPriceToUse = MINIMUM_GAS_PRICE_WEI\n }\n\n const estimatedGasCost = gasPriceToUse * gasLimit\n const buffer = estimatedGasCost * EVM_GAS_BUFFER_MULTIPLIER\n\n // return the calculated buffer\n return buffer\n } catch (error) {\n console.error('Error calculating EVM native gas buffer:', error)\n return defaultBuffer\n }\n}\n\n/**\n * Calculates the fee buffer needed for a native SVM (e.g., Solana) or Eclipse transaction.\n * Uses specific multipliers and default fees for each type.\n * Falls back to a default fee if API data is unavailable or invalid.\n *\n * @param chainId - The chain ID of the SVM or Eclipse network.\n * @returns The calculated fee buffer amount (in lamports for Solana, Wei for Eclipse) as a bigint, or a fallback buffer if estimation fails.\n */\nexport const calculateSvmNativeFeeBuffer = async (\n chainId: number,\n baseApiUrl?: string\n): Promise<bigint> => {\n const isEclipseChain = chainId === 9286185\n const multiplier = isEclipseChain\n ? ECLIPSE_FEE_BUFFER_MULTIPLIER\n : SOLANA_FEE_BUFFER_MULTIPLIER\n\n const fallbackBuffer = isEclipseChain\n ? ECLIPSE_DEFAULT_FEE_WEI * ECLIPSE_FEE_BUFFER_MULTIPLIER\n : SOLANA_DEFAULT_FEE_LAMPORTS * SOLANA_FEE_BUFFER_MULTIPLIER\n\n try {\n const queryOptions = {\n limit: 20,\n originChainId: chainId\n } as const\n\n const resp = await queryRequests(baseApiUrl ?? MAINNET_RELAY_API, queryOptions)\n\n if (!resp || !Array.isArray(resp.requests) || resp.requests.length === 0) {\n console.warn('No valid fees found in response. Using fallback buffer.')\n return fallbackBuffer\n }\n\n // Extract fees data from the response\n const fees: bigint[] = resp.requests\n .map((r: any) => {\n const feeStr = r?.data?.inTxs?.[0]?.fee\n try {\n return BigInt(feeStr)\n } catch {\n return null\n }\n })\n .filter((f: bigint | null): f is bigint => f !== null)\n\n if (fees.length === 0) {\n return fallbackBuffer\n }\n\n // Find the maximum fee among the valid fees\n const maxFee = fees.reduce(\n (max, current) => (current > max ? current : max),\n 0n\n )\n\n // Apply buffer multiplier to the maximum fee\n const buffer = maxFee * multiplier\n\n return buffer\n } catch (error) {\n console.error('Error calculating SVM native fee buffer:', error)\n return fallbackBuffer\n }\n}\n\n/**\n * Gets the fee buffer amount for a given chain and VM type.\n * Handles caching, ongoing fetch promises, and initiates calculation if needed.\n *\n * @param vmType - The virtual machine type ('evm' or 'svm').\n * @param chainId - The chain ID.\n * @param balance - The current balance (required for EVM calculation).\n * @param publicClient - VIEM PublicClient (required for EVM calculation).\n * @returns A promise that resolves to the fee buffer amount as a bigint.\n */\nexport const getFeeBufferAmount = async (\n vmType: ChainVM | undefined | null,\n chainId: number | undefined | null,\n balance: bigint,\n publicClient: PublicClient | null,\n baseApiUrl?: string\n): Promise<bigint> => {\n const cacheKey = `${vmType}FeeBuffer:${chainId}`\n const cachedBufferStr = getCacheEntry(cacheKey)\n\n if (cachedBufferStr) {\n return BigInt(cachedBufferStr)\n }\n\n // Check if a fetch is already in progress\n if (Object.prototype.hasOwnProperty.call(fetchPromises, cacheKey)) {\n return fetchPromises[cacheKey]\n }\n\n // Initiate fetch\n let calculationPromise: Promise<bigint>\n\n if (vmType === 'evm') {\n if (!publicClient) {\n console.error('PublicClient is required for EVM fee buffer calculation.')\n return EVM_DEFAULT_FEE_WEI * EVM_GAS_BUFFER_MULTIPLIER\n }\n calculationPromise = calculateEvmNativeGasBuffer(publicClient, balance)\n } else if (vmType === 'svm') {\n const isEclipseChain = chainId === 9286185\n const fallbackBuffer = isEclipseChain\n ? ECLIPSE_DEFAULT_FEE_WEI * ECLIPSE_FEE_BUFFER_MULTIPLIER\n : SOLANA_DEFAULT_FEE_LAMPORTS * SOLANA_FEE_BUFFER_MULTIPLIER\n calculationPromise = calculateSvmNativeFeeBuffer(chainId!, baseApiUrl).catch(\n (error) => {\n console.error(\n `Failed to calculate SVM fee buffer for chain ${chainId}:`,\n error\n )\n return fallbackBuffer\n }\n )\n } else {\n console.warn(\n `Unsupported VM type encountered: ${vmType}. Returning default EVM buffer.`\n )\n return EVM_DEFAULT_FEE_WEI * EVM_GAS_BUFFER_MULTIPLIER\n }\n\n // Store the promise\n fetchPromises[cacheKey] = calculationPromise\n\n // Handle caching and cleanup after promise settles\n calculationPromise\n .then((buffer) => {\n setCacheEntry(cacheKey, buffer, 5)\n })\n .catch((error) => {\n console.error(`Error processing fee buffer for ${cacheKey}:`, error)\n })\n .finally(() => {\n delete fetchPromises[cacheKey]\n })\n\n return calculationPromise\n}\n"]}
@@ -1,7 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.statusToText = exports.extractDepositRequestId = exports.calculateFillTime = exports.extractToChain = exports.extractFromChain = void 0;
3
+ exports.statusToText = exports.extractDepositRequestId = exports.calculateFillTime = exports.extractToChain = exports.extractFromChain = exports.getRequestCurrencies = void 0;
4
4
  const time_js_1 = require("./time.js");
5
+ const getRequestCurrencies = (transaction) => {
6
+ const route = transaction?.data?.route;
7
+ const actual = route?.actual;
8
+ const quoted = route?.quoted;
9
+ const currencyIn = actual?.origin?.inputCurrency ?? quoted?.origin?.inputCurrency;
10
+ const currencyOut = actual?.destination?.outputCurrency ??
11
+ quoted?.destination?.outputCurrency ??
12
+ actual?.origin?.outputCurrency ??
13
+ quoted?.origin?.outputCurrency;
14
+ const currencyGasTopup = actual?.destination?.currencyGasTopup;
15
+ return { currencyIn, currencyOut, currencyGasTopup };
16
+ };
17
+ exports.getRequestCurrencies = getRequestCurrencies;
5
18
  const extractFromChain = (transaction, client) => {
6
19
  const chainId = transaction?.data?.inTxs?.[0]?.chainId;
7
20
  return client?.chains.find((chain) => chain.id === chainId);
@@ -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\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":"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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,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.UI_VERSION = void 0;
4
- exports.UI_VERSION = '9.1.4';
4
+ exports.UI_VERSION = '10.0.1';
5
5
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,UAAU,GAAG,OAAO,CAAC","sourcesContent":["export const UI_VERSION = '9.1.4';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["export const UI_VERSION = '10.0.1';\n"]}