@aurora-is-near/intents-swap-widget 3.15.3 → 3.16.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 (162) hide show
  1. package/dist/components/TokenIcon.d.ts +5 -12
  2. package/dist/components/TokenIcon.js +34 -32
  3. package/dist/components/TokenIcon.js.map +1 -1
  4. package/dist/{config-DKdwFIJc.js → config-DJ258QoC.js} +752 -757
  5. package/dist/config-DJ258QoC.js.map +1 -0
  6. package/dist/config.d.ts +1 -1
  7. package/dist/config.js +1 -1
  8. package/dist/constants/chains.d.ts +0 -1
  9. package/dist/constants/chains.js +44 -65
  10. package/dist/constants/chains.js.map +1 -1
  11. package/dist/constants/tokens.d.ts +1 -1
  12. package/dist/constants/tokens.js +3 -50
  13. package/dist/constants/tokens.js.map +1 -1
  14. package/dist/errors.js +1 -1
  15. package/dist/ext/alchemy/index.js +1 -1
  16. package/dist/ext/index.js +1 -1
  17. package/dist/features/BalanceRpcLoader/TokenBalanceLoader.js +1 -1
  18. package/dist/features/BalanceRpcLoader/index.js +1 -1
  19. package/dist/features/BalanceRpcLoader/useTokenBalanceRpc.js +1 -1
  20. package/dist/features/ChainsDropdown/index.js +32 -32
  21. package/dist/features/ChainsDropdown/index.js.map +1 -1
  22. package/dist/features/DepositMethodSwitcher.js +1 -1
  23. package/dist/features/ErrorBoundary.js +1 -1
  24. package/dist/features/ExternalDeposit.js +1 -1
  25. package/dist/features/SendAddress/index.js +1 -1
  26. package/dist/features/SendAddress/useNotification.js +1 -1
  27. package/dist/features/SubmitButton/index.js +1 -1
  28. package/dist/features/SuccessScreen/index.js +1 -1
  29. package/dist/features/SwapDirectionSwitcher.js +1 -1
  30. package/dist/features/SwapQuote/SwapQuote.js +1 -1
  31. package/dist/features/SwapQuote/index.js +1 -1
  32. package/dist/features/TokenInput/TokenInput.js +1 -1
  33. package/dist/features/TokenInput/TokenInputEmpty.js +1 -1
  34. package/dist/features/TokenInput/TokenInputSource.js +1 -1
  35. package/dist/features/TokenInput/TokenInputTarget.js +1 -1
  36. package/dist/features/TokenInput/WalletBalance.js +1 -1
  37. package/dist/features/TokenInput/hooks/index.js +1 -1
  38. package/dist/features/TokenInput/hooks/useTokenInputBalance.js +1 -1
  39. package/dist/features/TokenInput/index.js +1 -1
  40. package/dist/features/TokensList/TokenItem.js +1 -1
  41. package/dist/features/TokensList/TokensList.js +1 -1
  42. package/dist/features/TokensList/index.js +1 -1
  43. package/dist/features/TokensModal.js +1 -1
  44. package/dist/features/WalletCompatibilityCheck/WalletCompatibilityModal.js +1 -1
  45. package/dist/features/WalletCompatibilityCheck/index.js +1 -1
  46. package/dist/features/index.js +1 -1
  47. package/dist/hooks/index.js +1 -1
  48. package/dist/hooks/useAllTokens.js +1 -1
  49. package/dist/hooks/useChains.js +1 -1
  50. package/dist/hooks/useCompatibilityCheck.js +1 -1
  51. package/dist/hooks/useDefaultToken.js +1 -1
  52. package/dist/hooks/useExternalDepositStatus/index.js +1 -1
  53. package/dist/hooks/useExternalDepositStatus/usePoaExternalDepositStatus.js +1 -1
  54. package/dist/hooks/useIntentsBalance.js +1 -1
  55. package/dist/hooks/useIsCompatibilityCheckRequired.js +1 -1
  56. package/dist/hooks/useMakeDepositAddress.js +1 -1
  57. package/dist/hooks/useMakeIntentsTransfer.js +1 -1
  58. package/dist/hooks/useMakeNEARFtTransferCall.js +1 -1
  59. package/dist/hooks/useMakeQuote.js +1 -1
  60. package/dist/hooks/useMakeQuoteTransfer.js +1 -1
  61. package/dist/hooks/useMakeTransfer.js +1 -1
  62. package/dist/hooks/useMergedBalance.js +1 -1
  63. package/dist/hooks/useSwitchChain.js +1 -1
  64. package/dist/hooks/useTheme.js +1 -1
  65. package/dist/hooks/useToggleTheme.js +19 -21
  66. package/dist/hooks/useToggleTheme.js.map +1 -1
  67. package/dist/hooks/useTokenInputPair.js +1 -1
  68. package/dist/hooks/useTokens.js +2 -2
  69. package/dist/hooks/useTokensFiltered.js +1 -1
  70. package/dist/hooks/useTokensIntentsUnique.js +1 -1
  71. package/dist/icons/index.d.ts +4 -0
  72. package/dist/icons/index.js +392 -0
  73. package/dist/icons/index.js.map +1 -0
  74. package/dist/index.js +1 -1
  75. package/dist/machine/effects/index.js +1 -1
  76. package/dist/machine/effects/useAlchemyBalanceEffect.js +1 -1
  77. package/dist/machine/effects/useBalancesUpdateEffect.js +1 -1
  78. package/dist/machine/effects/useMakeQuoteEffect.js +1 -1
  79. package/dist/machine/effects/useSelectedTokensEffect.d.ts +0 -2
  80. package/dist/machine/effects/useSelectedTokensEffect.js +1 -1
  81. package/dist/machine/effects/useSetTokenBalanceEffect.js +1 -1
  82. package/dist/machine/effects/useSetTokenIntentsTargetEffect.js +1 -1
  83. package/dist/machine/effects/useWalletConnEffect.js +1 -1
  84. package/dist/machine/events/index.js +1 -1
  85. package/dist/machine/events/tokenSelect.js +1 -1
  86. package/dist/machine/events/validateInputAndMoveTo.js +1 -1
  87. package/dist/machine/events/validateInputs.js +1 -1
  88. package/dist/machine/index.js +1 -1
  89. package/dist/machine/snap.d.ts +0 -18
  90. package/dist/machine/snap.js +1 -1
  91. package/dist/machine/subscriptions/checkers/isSendAddressAsConnected.js +1 -1
  92. package/dist/machine/subscriptions/index.js +1 -1
  93. package/dist/theme/ThemeProvider.js +3 -4
  94. package/dist/theme/ThemeProvider.js.map +1 -1
  95. package/dist/types/chain.d.ts +0 -1
  96. package/dist/types/config.d.ts +1 -1
  97. package/dist/types/token.d.ts +0 -1
  98. package/dist/utils/intents/signers/near.js +1 -1
  99. package/dist/utils/intents/signers/privy.js +1 -1
  100. package/dist/utils/near/getNearNep141StorageBalance.js +1 -1
  101. package/dist/widgets/WidgetDeposit/WidgetDepositContent.js +1 -1
  102. package/dist/widgets/WidgetDeposit/WidgetDepositSkeleton.js +1 -1
  103. package/dist/widgets/WidgetSwap/WidgetSwapContent.js +1 -1
  104. package/dist/widgets/WidgetSwap/WidgetSwapSkeleton.js +1 -1
  105. package/dist/widgets/WidgetWithdraw/WidgetWithdrawContent.js +1 -1
  106. package/dist/widgets/WidgetWithdraw/WidgetWithdrawSkeleton.js +1 -1
  107. package/package.json +1 -1
  108. package/src/components/TokenIcon.tsx +35 -38
  109. package/src/config.tsx +0 -2
  110. package/src/constants/chains.ts +0 -23
  111. package/src/constants/tokens.ts +1 -48
  112. package/src/features/ChainsDropdown/index.tsx +5 -5
  113. package/src/features/TokenInput/TokenInput.tsx +1 -1
  114. package/src/features/TokensList/TokenItem.tsx +1 -1
  115. package/src/hooks/useToggleTheme.ts +23 -27
  116. package/src/hooks/useTokens.ts +1 -8
  117. package/src/icons/abg.svg +11 -0
  118. package/src/icons/arb.svg +22 -0
  119. package/src/icons/aster.svg +1 -0
  120. package/src/icons/aurora.svg +14 -0
  121. package/src/icons/avax.svg +12 -0
  122. package/src/icons/base.svg +11 -0
  123. package/src/icons/bera.svg +20 -0
  124. package/src/icons/bsc.svg +14 -0
  125. package/src/icons/btc.svg +11 -0
  126. package/src/icons/cardano.svg +40 -0
  127. package/src/icons/doge.svg +15 -0
  128. package/src/icons/eth.svg +16 -0
  129. package/src/icons/frax.svg +26 -0
  130. package/src/icons/gnear.svg +1 -0
  131. package/src/icons/gnosis.svg +16 -0
  132. package/src/icons/index.tsx +111 -0
  133. package/src/icons/itlx.svg +12 -0
  134. package/src/icons/jambo.svg +10 -0
  135. package/src/icons/knc.svg +1 -0
  136. package/src/icons/loud.svg +7 -0
  137. package/src/icons/ltc.svg +1 -0
  138. package/src/icons/mon.svg +1 -0
  139. package/src/icons/mpdao.svg +1 -0
  140. package/src/icons/near.svg +16 -0
  141. package/src/icons/noear.svg +10 -0
  142. package/src/icons/op.svg +12 -0
  143. package/src/icons/pol.svg +11 -0
  144. package/src/icons/public.svg +1 -0
  145. package/src/icons/purge.svg +10 -0
  146. package/src/icons/rhea.svg +10 -0
  147. package/src/icons/sol.svg +21 -0
  148. package/src/icons/sui.svg +16 -0
  149. package/src/icons/ton.svg +11 -0
  150. package/src/icons/tron.svg +11 -0
  151. package/src/icons/unknown.svg +4 -0
  152. package/src/icons/usd1.svg +10 -0
  153. package/src/icons/usdf.svg +10 -0
  154. package/src/icons/wif.svg +10 -0
  155. package/src/icons/xdai.svg +22 -0
  156. package/src/icons/xrp.svg +17 -0
  157. package/src/icons/zec.svg +16 -0
  158. package/src/theme/ThemeProvider.tsx +8 -11
  159. package/src/types/chain.ts +0 -1
  160. package/src/types/config.ts +1 -1
  161. package/src/types/token.ts +0 -1
  162. package/dist/config-DKdwFIJc.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-DJ258QoC.js","sources":["../src/features/BalanceRpcLoader/useTokenBalanceRpc.ts","../src/features/BalanceRpcLoader/TokenBalanceLoader.tsx","../src/hooks/useTokens.ts","../src/hooks/useAllTokens.ts","../src/features/BalanceRpcLoader/index.tsx","../src/hooks/useChains.ts","../src/ext/alchemy/index.ts","../src/hooks/useIntentsBalance.ts","../src/machine/effects/useBalancesUpdateEffect.ts","../src/hooks/useMergedBalance.ts","../src/machine/effects/useSetTokenBalanceEffect.ts","../src/machine/effects/useSetTokenIntentsTargetEffect.ts","../src/machine/effects/useWalletConnEffect.ts","../src/hooks/useMakeQuote.ts","../src/hooks/useMakeDepositAddress.ts","../src/machine/events/validateInputs.ts","../src/machine/events/validateInputAndMoveTo.ts","../src/machine/effects/useMakeQuoteEffect.ts","../src/machine/effects/useSelectedTokensEffect.ts","../src/machine/effects/useAlchemyBalanceEffect.ts","../src/machine/subscriptions/checkers/isSendAddressAsConnected.ts","../src/machine/subscriptions/index.ts","../src/machine/events/tokenSelect.ts","../src/machine/events/index.ts","../src/machine/effects/index.ts","../src/errors.ts","../src/machine/snap.ts","../src/utils/near/getNearNep141StorageBalance.ts","../src/hooks/useMakeNEARFtTransferCall.ts","../src/hooks/useMakeQuoteTransfer.ts","../src/utils/intents/signers/privy.ts","../src/utils/intents/signers/near.ts","../src/hooks/useMakeIntentsTransfer.ts","../src/hooks/useMakeTransfer.ts","../src/hooks/useSwitchChain.ts","../src/features/SubmitButton/index.tsx","../src/features/SwapQuote/SwapQuote.tsx","../src/features/SwapQuote/index.tsx","../src/features/TokenInput/WalletBalance.tsx","../src/features/TokenInput/TokenInput.tsx","../src/features/TokenInput/TokenInputEmpty.tsx","../src/features/TokenInput/hooks/useTokenInputBalance.ts","../src/hooks/useDefaultToken.ts","../src/features/TokenInput/TokenInputSource.tsx","../src/features/TokenInput/TokenInputTarget.tsx","../src/features/TokenInput/index.tsx","../src/features/TokensList/TokenItem.tsx","../src/hooks/useTokensIntentsUnique.ts","../src/hooks/useTokensFiltered.ts","../src/features/TokensList/TokensList.tsx","../src/features/TokensList/index.tsx","../src/hooks/useExternalDepositStatus/usePoaExternalDepositStatus.ts","../src/theme/ThemeProvider.tsx","../src/features/WalletCompatibilityCheck/WalletCompatibilityModal.tsx","../src/features/ErrorBoundary.tsx","../src/config.tsx"],"sourcesContent":["import { useQuery } from '@tanstack/react-query';\n\nimport { logger } from '../../logger';\nimport { getTonTokenBalance } from '../../utils/ton/getTonTokenBalance';\nimport { getSolanaTokenBalance } from '../../utils/solana/getSolanaTokenBalance';\nimport { WalletAddresses } from '../../types';\nimport { useWalletAddressForToken } from '../../hooks/useWalletAddressForToken';\nimport { useConfig } from '@/config';\nimport { isEvmChain } from '@/utils/evm/isEvmChain';\nimport { isEvmToken } from '@/utils/evm/isEvmToken';\nimport { isEvmBaseToken } from '@/utils/evm/isEvmBaseToken';\nimport { NATIVE_NEAR_DUMB_ASSET_ID } from '@/constants/tokens';\nimport { getEvmMainTokenBalance } from '@/utils/evm/getEvmMainTokenBalance';\nimport { getNativeNearBalance } from '@/utils/near/getNativeNearBalance';\nimport { getNearTokenBalance } from '@/utils/near/getNearTokenBalance';\nimport { getEvmTokenBalance } from '@/utils/evm/getEvmTokenBalance';\nimport type { ChainRpcUrls } from '@/types/chain';\nimport type { Token } from '@/types/token';\n\ntype Args = {\n token: Token;\n rpcs: ChainRpcUrls;\n connectedWallets: WalletAddresses;\n};\n\nexport function useTokenBalanceRpc({ rpcs, token, connectedWallets }: Args) {\n const { walletSupportedChains, tonCenterApiKey, alchemyApiKey } = useConfig();\n const { walletAddress } = useWalletAddressForToken(connectedWallets, token);\n\n return useQuery<string | null>({\n retry: 2,\n enabled: !!walletAddress && Object.keys(rpcs).includes(token.blockchain),\n queryKey: ['tokenBalance', token.assetId, connectedWallets],\n queryFn: async () => {\n // 1. No wallet address to retrieve balance\n if (!walletAddress) {\n return null;\n }\n\n // 2. Near\n if (\n token.blockchain === 'near' &&\n walletSupportedChains.includes(token.blockchain)\n ) {\n if (!rpcs.near || rpcs.near.length === 0) {\n return null;\n }\n\n if (token.assetId === NATIVE_NEAR_DUMB_ASSET_ID) {\n return getNativeNearBalance(walletAddress, rpcs.near);\n }\n\n return getNearTokenBalance(token, walletAddress, rpcs.near);\n }\n\n // 3. Do not fetch EVM balances if evms are not supported\n if (\n !walletSupportedChains.includes('eth') &&\n isEvmChain(token.blockchain)\n ) {\n return null;\n }\n\n // 4. Fetch EVM native token balance (e.g., ETH, BNB, POL, etc.)\n if (isEvmChain(token.blockchain) && isEvmBaseToken(token)) {\n const rpcUrls = rpcs[token.blockchain] ?? [];\n\n return rpcUrls.length > 0\n ? getEvmMainTokenBalance(walletAddress, rpcUrls[0]!)\n : null;\n }\n\n // 5. EVM chain's token balance\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n if (isEvmToken(token) || isEvmChain(token.blockchain)) {\n const rpcUrls = rpcs[token.blockchain] ?? [];\n\n return rpcUrls.length > 0\n ? getEvmTokenBalance(token, walletAddress, rpcUrls[0]!)\n : null;\n }\n\n // 6. TON token balance\n if (token.blockchain === 'ton') {\n return getTonTokenBalance(token, walletAddress, tonCenterApiKey);\n }\n\n // 7. Solana token balance\n if (\n token.blockchain === 'sol' &&\n walletSupportedChains.includes(token.blockchain)\n ) {\n return getSolanaTokenBalance(token, walletAddress, alchemyApiKey);\n }\n\n logger.warn(\n `Failed to fetch token balance for ${token.symbol} on ${token.blockchain}`,\n );\n\n // Add missing chains\n return null;\n },\n });\n}\n","import { memo, useEffect } from 'react';\n\nimport { useTokenBalanceRpc } from './useTokenBalanceRpc';\nimport { WalletAddresses } from '../../types';\nimport type { Token, TokenBalances } from '@/types/token';\nimport type { ChainRpcUrls } from '@/types/chain';\n\ntype Props = {\n token: Token;\n rpcs: ChainRpcUrls;\n connectedWallets: WalletAddresses;\n onBalancesLoaded: (balances: TokenBalances) => void;\n};\n\nconst TokenBalanceZeroLoader = ({\n rpcs,\n token,\n onBalancesLoaded,\n}: Omit<Props, 'connectedWallets'>) => {\n useEffect(() => {\n if (token.isIntent || !Object.keys(rpcs).includes(token.blockchain)) {\n return;\n }\n\n onBalancesLoaded({ [token.assetId]: '0' });\n // eslint-disable-next-line\n }, [token.assetId]);\n\n return null;\n};\n\nconst TokenBalanceBaseLoader = memo(\n ({ rpcs, token, connectedWallets, onBalancesLoaded }: Props) => {\n const { data: balance } = useTokenBalanceRpc({\n rpcs,\n token,\n connectedWallets,\n });\n\n useEffect(() => {\n // != checks for both null and undefined\n if (!token.isIntent && balance != null) {\n onBalancesLoaded({ [token.assetId]: balance });\n }\n }, [token, balance, onBalancesLoaded]);\n\n return null;\n },\n (prev, next) =>\n prev.token.assetId === next.token.assetId &&\n prev.connectedWallets === next.connectedWallets,\n);\n\nTokenBalanceBaseLoader.displayName = 'TokenBalanceLoader';\n\nexport const TokenBalanceLoader = Object.assign(TokenBalanceBaseLoader, {\n Zero: TokenBalanceZeroLoader,\n});\n","import { useMemo } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { OneClickService } from '@defuse-protocol/one-click-sdk-typescript';\n\nimport { useConfig } from '@/config';\nimport { CHAINS_LIST } from '@/constants/chains';\nimport { NATIVE_NEAR_DUMB_ASSET_ID, TOKENS_DATA } from '@/constants/tokens';\nimport { isValidChain } from '@/utils/checkers/isValidChain';\nimport type { SimpleToken, Token } from '@/types/token';\n\nconst getTokenIcon = (tokenSymbol: string): string => {\n const symbol = tokenSymbol.toLowerCase();\n\n return TOKENS_DATA[symbol]?.icon ?? '';\n};\n\nconst capitalizeChainName = (blockchain: string) =>\n `${blockchain?.charAt(0).toUpperCase()}${blockchain?.slice(1)}`;\n\nconst getTokenName = (tokenSymbol: string): string => {\n return TOKENS_DATA[tokenSymbol]?.name ?? tokenSymbol;\n};\n\nexport const useTokens = (variant?: 'source' | 'target') => {\n const {\n showIntentTokens,\n allowedTokensList,\n allowedSourceTokensList,\n allowedTargetTokensList,\n filterTokens,\n fetchSourceTokens,\n fetchTargetTokens,\n } = useConfig();\n\n const { data: queryData, ...query } = useQuery<SimpleToken[]>({\n queryKey: ['tokens', variant].filter(Boolean),\n queryFn: async (): Promise<SimpleToken[]> => {\n if (variant === 'source' && fetchSourceTokens) {\n return fetchSourceTokens();\n }\n\n if (variant === 'target' && fetchTargetTokens) {\n return fetchTargetTokens();\n }\n\n return OneClickService.getTokens();\n },\n });\n\n const data = useMemo(() => {\n if (!queryData) {\n return [];\n }\n\n const tokens: Token[] = queryData\n .map((token: SimpleToken): Token | null => {\n const blockchain = token.blockchain.toLowerCase();\n\n if (!isValidChain(blockchain)) {\n return null;\n }\n\n if (allowedTokensList && !allowedTokensList.includes(token.assetId)) {\n return null;\n }\n\n if (\n variant === 'source' &&\n allowedSourceTokensList &&\n !allowedSourceTokensList.includes(token.assetId)\n ) {\n return null;\n }\n\n if (\n variant === 'target' &&\n allowedTargetTokensList &&\n !allowedTargetTokensList.includes(token.assetId)\n ) {\n return null;\n }\n\n return {\n assetId: token.assetId,\n symbol: token.symbol,\n decimals: token.decimals,\n price: token.price,\n blockchain,\n isIntent: false,\n icon: token.icon ?? getTokenIcon(token.symbol),\n name: getTokenName(token.symbol),\n chainName:\n CHAINS_LIST[token.blockchain]?.label ??\n capitalizeChainName(token.blockchain),\n contractAddress: token.contractAddress,\n };\n })\n .filter((t) => !!t)\n .filter(filterTokens ?? (() => true));\n\n // remove wNEAR token\n const tokensWithoutWNEAR = tokens.filter(\n (t) => t.symbol.toLowerCase() !== 'wnear',\n );\n\n // wNEAR token to get price\n const wnearToken = tokens.find((t) => t.symbol.toLowerCase() === 'wnear');\n\n // add native NEAR if the original list included wNEAR\n if (wnearToken) {\n tokensWithoutWNEAR.push({\n name: 'NEAR',\n symbol: 'NEAR',\n chainName: 'Near',\n blockchain: 'near',\n assetId: NATIVE_NEAR_DUMB_ASSET_ID,\n icon: TOKENS_DATA.near?.icon ?? '',\n price: wnearToken?.price ?? 0,\n contractAddress: wnearToken?.contractAddress,\n isIntent: false,\n decimals: 24,\n });\n }\n\n return showIntentTokens\n ? [\n ...tokensWithoutWNEAR,\n // add intents tokens to the full list\n ...tokens.map((t) =>\n t.symbol.toLowerCase() === 'wnear'\n ? { ...t, symbol: 'NEAR', name: 'NEAR', isIntent: true } // do not expose that it's wrapped\n : { ...t, isIntent: true },\n ),\n ]\n : tokensWithoutWNEAR;\n }, [queryData, showIntentTokens, filterTokens]);\n\n return {\n ...query,\n tokens: data,\n };\n};\n","import { useMemo } from 'react';\nimport { useTokens } from './useTokens';\n\nexport const useAllTokens = () => {\n const { tokens: defaultTokens } = useTokens();\n const { tokens: sourceTokens } = useTokens('source');\n const { tokens: targetTokens } = useTokens('target');\n\n const mergedTokens = useMemo(() => {\n const tokenMap: Record<string, (typeof defaultTokens)[0]> = {};\n\n [\n ...defaultTokens,\n ...(sourceTokens || []),\n ...(targetTokens || []),\n ].forEach((token) => {\n // Consider a token the same if it has the same assetId and isIntent flag\n const mapKey = `${token.assetId}-${token.isIntent}`;\n\n tokenMap[mapKey] = token;\n });\n\n return Object.values(tokenMap);\n }, [defaultTokens, sourceTokens, targetTokens]);\n\n return { tokens: mergedTokens };\n};\n","import { useMemo } from 'react';\n\nimport { TokenBalanceLoader } from './TokenBalanceLoader';\nimport { useAllTokens } from '../../hooks/useAllTokens';\nimport { WalletAddresses } from '../../types';\nimport { useConfig } from '@/config';\nimport { useWalletBalance } from '@/hooks/useWalletBalance';\nimport { getTokenBalanceKey } from '@/utils/intents/getTokenBalanceKey';\nimport type { ChainRpcUrls } from '@/types/chain';\nimport type { Token } from '@/types/token';\n\ntype Props = {\n connectedWallets: WalletAddresses;\n rpcs: ChainRpcUrls;\n};\n\nconst tokensBalancePriority: Record<string, string[]>[] = [\n { eth: ['ETH', 'USDT', 'USDC', 'AURORA'] },\n { near: ['USDT', 'USDC', 'AURORA'] },\n { arb: ['ARB', 'ETH', 'USDT', 'USDC'] },\n { btc: ['BTC'] },\n];\n\nconst sortTokensByPriority = (tokens: ReadonlyArray<Token>) => {\n return [...tokens].sort((a, b) => {\n const aChainIndex = tokensBalancePriority.findIndex(\n (p) => Object.keys(p)[0] === a.blockchain,\n );\n\n const bChainIndex = tokensBalancePriority.findIndex(\n (p) => Object.keys(p)[0] === b.blockchain,\n );\n\n if (aChainIndex !== bChainIndex) {\n if (aChainIndex === -1) {\n return 1;\n }\n\n if (bChainIndex === -1) {\n return -1;\n }\n\n return aChainIndex - bChainIndex;\n }\n\n const chainPriority =\n tokensBalancePriority[aChainIndex]?.[a.blockchain] ?? [];\n\n const aPriority = chainPriority.indexOf(a.symbol);\n const bPriority = chainPriority.indexOf(b.symbol);\n\n if (aPriority === -1 && bPriority === -1) {\n return 0;\n }\n\n if (aPriority === -1) {\n return 1;\n }\n\n if (bPriority === -1) {\n return -1;\n }\n\n return aPriority - bPriority;\n });\n};\n\nexport const BalanceRpcLoader = ({ rpcs, connectedWallets }: Props) => {\n const { tokens } = useAllTokens();\n const { walletSupportedChains } = useConfig();\n const { setWalletBalance } = useWalletBalance(connectedWallets);\n const sortedTokens = useMemo(() => sortTokensByPriority(tokens), [tokens]);\n\n return sortedTokens.map((tkn) => {\n if (walletSupportedChains.includes(tkn.blockchain)) {\n return (\n <TokenBalanceLoader\n rpcs={rpcs}\n token={tkn}\n connectedWallets={connectedWallets}\n key={getTokenBalanceKey(tkn)}\n onBalancesLoaded={(balance) =>\n setWalletBalance(connectedWallets, balance)\n }\n />\n );\n }\n\n return (\n <TokenBalanceLoader.Zero\n rpcs={rpcs}\n token={tkn}\n key={getTokenBalanceKey(tkn)}\n onBalancesLoaded={(balance) =>\n setWalletBalance(connectedWallets, balance)\n }\n />\n );\n });\n};\n","import { useMemo } from 'react';\n\nimport { useTokens } from './useTokens';\nimport { useConfig } from '@/config';\nimport { CHAINS_LIST, DEFAULT_CHAINS_ORDER } from '@/constants/chains';\nimport type { Chain, Chains } from '@/types/chain';\n\nfunction sortChains(items: Chain[], chainsOrder: ReadonlyArray<Chains>) {\n // Sort by any custom `chainsOrder` first, falling back to the default order\n // for any chains not specified there.\n const order = Array.from(\n new Set([...(chainsOrder ?? []), ...DEFAULT_CHAINS_ORDER]),\n );\n\n const pos = new Map(order.map((id, i) => [id, i]));\n\n return [...items].sort((a, b) => {\n const ai = pos.has(a.id) ? pos.get(a.id)! : Infinity;\n const bi = pos.has(b.id) ? pos.get(b.id)! : Infinity;\n\n if (ai !== bi) {\n return ai - bi;\n }\n\n return a.id.localeCompare(b.id, undefined, { sensitivity: 'base' });\n });\n}\n\nexport const useChains = (variant: 'source' | 'target') => {\n const {\n chainsOrder,\n allowedChainsList,\n allowedSourceChainsList,\n allowedTargetChainsList,\n } = useConfig();\n\n const { tokens } = useTokens();\n\n return useMemo(() => {\n const chainsFromTokens = Array.from(\n new Set(tokens.map((token) => CHAINS_LIST[token.blockchain])),\n ).filter((chain) => {\n if (allowedChainsList && !allowedChainsList.includes(chain.id)) {\n return false;\n }\n\n if (\n variant === 'source' &&\n allowedSourceChainsList &&\n !allowedSourceChainsList.includes(chain.id)\n ) {\n return false;\n }\n\n if (\n variant === 'target' &&\n allowedTargetChainsList &&\n !allowedTargetChainsList.includes(chain.id)\n ) {\n return false;\n }\n\n return true;\n });\n\n return sortChains(chainsFromTokens, chainsOrder);\n }, [tokens, chainsOrder, allowedChainsList]);\n};\n","import { useEffect, useMemo } from 'react';\nimport { useInfiniteQuery } from '@tanstack/react-query';\n\nimport { parse } from './parse';\nimport { createLoader } from './load';\nimport { isAlchemySupportedChain } from './types';\nimport type { AlchemyResponse } from './types';\nimport { WalletAddresses } from '../../types';\nimport { useConfig } from '@/config';\nimport { fireEvent } from '@/machine';\nimport { useTokens } from '@/hooks/useTokens';\nimport { guardStates } from '@/machine/guards';\nimport { useUnsafeSnapshot } from '@/machine/snap';\nimport { useWalletBalance } from '@/hooks/useWalletBalance';\n\ntype Args = {\n isEnabled: boolean;\n alchemyApiKey: string;\n connectedWallets: WalletAddresses;\n};\n\nconst MAX_PAGES_DEPTH = 3;\n\nexport const useAlchemyBalanceIntegration = ({\n connectedWallets,\n alchemyApiKey,\n ...args\n}: Args) => {\n const { ctx } = useUnsafeSnapshot();\n\n const { tokens } = useTokens();\n const { walletSupportedChains } = useConfig();\n const { setWalletBalance } = useWalletBalance(connectedWallets);\n\n const isEnabled =\n args.isEnabled &&\n !!Object.values(connectedWallets).length &&\n walletSupportedChains.length > 0;\n\n const query = useInfiniteQuery<AlchemyResponse>({\n initialPageParam: null,\n enabled: !!isEnabled && !!alchemyApiKey,\n queryKey: ['walletTokensBalance', connectedWallets],\n queryFn: async ({ pageParam }) => {\n return createLoader({ alchemyApiKey })({\n pageParam: pageParam ? `${pageParam as string}` : null,\n connectedWallets,\n walletSupportedChains,\n });\n },\n getNextPageParam: (lastPage, allPages) => {\n if (!lastPage.pageKey) {\n return undefined;\n }\n\n if (allPages.length >= MAX_PAGES_DEPTH) {\n return undefined;\n }\n\n return lastPage.pageKey;\n },\n });\n\n useEffect(() => {\n if (\n isEnabled &&\n query.data &&\n query.hasNextPage &&\n query.data.pages.length < MAX_PAGES_DEPTH &&\n !query.isFetchingNextPage\n ) {\n // void since error will be raised via queryFn\n void query.fetchNextPage();\n }\n }, [isEnabled, query]);\n\n const balancesMap = useMemo(() => {\n if (!query.data?.pages) {\n return {};\n }\n\n const balances = parse(\n tokens,\n query.data.pages.flatMap((page) => page.data),\n );\n\n // Fill missing tokens for allowed chains with zero\n tokens.forEach((token) => {\n const inAllowed = isAlchemySupportedChain(token.blockchain);\n\n if (inAllowed && !(token.assetId in balances)) {\n balances[token.assetId] = '0';\n }\n });\n\n return balances;\n }, [query.data, tokens]);\n\n useEffect(() => {\n const validState = guardStates(ctx, ['initial_wallet']);\n\n if (validState) {\n setWalletBalance(connectedWallets, balancesMap);\n\n if (\n ctx.sourceToken &&\n Object.keys(balancesMap).includes(ctx.sourceToken.assetId)\n ) {\n fireEvent('tokenSetBalance', balancesMap[ctx.sourceToken.assetId]);\n }\n }\n }, [balancesMap]);\n\n return {\n status: query.status,\n refetch: query.refetch,\n balances: balancesMap,\n };\n};\n","import { useMemo } from 'react';\nimport { useQuery } from '@tanstack/react-query';\n\nimport { useTokens } from './useTokens';\nimport { useUnsafeSnapshot } from '../machine';\nimport { logger } from '@/logger';\nimport { useConfig } from '@/config';\nimport { getIntentsAccountId } from '@/utils/intents/getIntentsAccountId';\nimport { getIntentsBalances } from '@/utils/intents/getIntentsBalance';\nimport { notReachable } from '@/utils/notReachable';\nimport type { TokenBalances } from '@/types/token';\n\nexport const useIntentsBalance = () => {\n const { intentsAccountType } = useConfig();\n const {\n ctx: { walletAddress },\n } = useUnsafeSnapshot();\n\n const { tokens } = useTokens();\n const tokenIds = tokens\n .filter((token) => token.isIntent)\n .map((token) => token.assetId);\n\n const intentsAccountId = getIntentsAccountId({\n walletAddress,\n addressType: intentsAccountType,\n });\n\n const query = useQuery<TokenBalances>({\n enabled: !!walletAddress && !!intentsAccountId && tokens.length > 0,\n queryKey: ['intentsBalances', intentsAccountId],\n queryFn: async () => {\n if (!intentsAccountId) {\n return {};\n }\n\n const data = await getIntentsBalances(intentsAccountId, tokenIds);\n\n return data;\n },\n });\n\n const intentBalances =\n useMemo(() => {\n switch (query.status) {\n case 'error':\n logger.error('Unable to load intents balances:', query.error);\n\n return {};\n case 'success':\n return Object.fromEntries(\n Object.entries(query.data).map(([assetId, balance]) => [\n `intent-${assetId}`,\n balance,\n ]),\n );\n case 'pending':\n return {};\n default:\n notReachable(query, { throwError: false });\n\n return {};\n }\n }, [query]) ?? {};\n\n return {\n ...query,\n intentBalances,\n };\n};\n","import { useEffect } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\n\nimport type { ListenerProps } from './types';\nimport { useConfig } from '../../config';\nimport { guardStates } from '@/machine';\nimport { useAlchemyBalanceIntegration } from '@/ext/alchemy';\nimport { useIntentsBalance } from '@/hooks/useIntentsBalance';\n\nimport { useUnsafeSnapshot } from '@/machine/snap';\n\nexport type Props = ListenerProps & {\n alchemyApiKey: string | undefined;\n};\n\nexport const useBalancesUpdateEffect = ({\n isEnabled,\n alchemyApiKey,\n}: Props) => {\n const { connectedWallets } = useConfig();\n const { ctx } = useUnsafeSnapshot();\n const queryClient = useQueryClient();\n\n const { refetch: refetchIntentsBalances } = useIntentsBalance();\n const { refetch: refetchAlchemyBalances } = useAlchemyBalanceIntegration({\n isEnabled,\n connectedWallets,\n alchemyApiKey: alchemyApiKey ?? '',\n });\n\n useEffect(() => {\n const isValidState = guardStates(ctx, ['transfer_success']);\n\n if (!isEnabled || !isValidState) {\n return;\n }\n\n void (async () => {\n await refetchIntentsBalances();\n\n if (alchemyApiKey) {\n await new Promise((resolve) => {\n setTimeout(resolve, 10_000);\n });\n\n await refetchAlchemyBalances();\n }\n\n // Balances loaded with RPCs\n await queryClient.invalidateQueries({ queryKey: ['tokenBalance'] });\n })();\n }, [ctx.state, isEnabled, alchemyApiKey]);\n};\n","import { useMemo } from 'react';\n\nimport { useWalletBalance } from './useWalletBalance';\nimport { useIntentsBalance } from './useIntentsBalance';\nimport { useConfig } from '@/config';\n\nexport const useMergedBalance = () => {\n const { connectedWallets } = useConfig();\n const { intentBalances } = useIntentsBalance();\n const { walletBalance } = useWalletBalance(connectedWallets);\n\n const mergedBalance = useMemo(\n () => ({ ...walletBalance, ...intentBalances }),\n [walletBalance, intentBalances],\n );\n\n return { mergedBalance };\n};\n","import { useEffect } from 'react';\n\nimport type { ListenerProps } from './types';\nimport { useMergedBalance } from '@/hooks/useMergedBalance';\nimport { getTokenBalanceKey } from '@/utils/intents/getTokenBalanceKey';\n\nimport { fireEvent } from '@/machine';\nimport { useUnsafeSnapshot } from '@/machine/snap';\n\nexport const useSetTokenBalanceEffect = ({ isEnabled }: ListenerProps) => {\n const { ctx } = useUnsafeSnapshot();\n\n const { mergedBalance } = useMergedBalance();\n\n useEffect(() => {\n if (!isEnabled) {\n return;\n }\n\n if (!ctx.sourceToken || !ctx.walletAddress) {\n fireEvent('tokenSetBalance', undefined);\n\n return;\n }\n\n const tokenBalanceKey = getTokenBalanceKey(ctx.sourceToken);\n\n fireEvent('tokenSetBalance', mergedBalance[tokenBalanceKey]);\n }, [mergedBalance, ctx.sourceToken]);\n};\n","import { useEffect } from 'react';\n\nimport type { ListenerProps } from './types';\nimport { useTokens } from '@/hooks/useTokens';\n\nimport { fireEvent } from '@/machine';\nimport { useUnsafeSnapshot } from '@/machine/snap';\n\nconst intentDepositTokensMap: Record<string, string> = {\n // cbBTC (eth)\n 'nep141:eth-0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.omft.near':\n 'nep141:nbtc.bridge.near',\n // cbBTC (base)\n 'nep141:base-0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.omft.near':\n 'nep141:nbtc.bridge.near',\n // wBTC (near)\n 'nep141:2260fac5e5542a773aa44fbcfedf7c193bc2c599.factory.bridge.near':\n 'nep141:nbtc.bridge.near',\n // xBTC (sol)\n 'nep141:sol-91914f13d3b54f8126a2824d71632d4b078d7403.omft.near':\n 'nep141:nbtc.bridge.near',\n // wETH (gnosis)\n 'nep141:gnosis-0x6a023ccd1ff6f2045c3309768ead9e68f978f6e1.omft.near':\n 'nep141:eth.bridge.near',\n // NEAR (bsc)\n 'nep245:v2_1.omni.hot.tg:56_SZzgw3HSudhZcTwPWUTi2RJB19t': 'nep141:wrap.near',\n // BTC (near)\n 'nep141:btc.omft.near': 'nep141:nbtc.bridge.near',\n};\n\nexport const useSetTokenIntentsTargetEffect = ({\n isEnabled,\n}: ListenerProps) => {\n const { ctx } = useUnsafeSnapshot();\n\n const { tokens } = useTokens();\n\n useEffect(() => {\n if (!isEnabled) {\n return;\n }\n\n // 1. If source token is not set - no target token exists\n if (!ctx.sourceToken) {\n fireEvent('tokenSelect', { variant: 'target', token: undefined });\n\n return;\n }\n\n const { sourceToken } = ctx;\n\n // 2. If source token is BTC/ETH/NEAR select corresponding target token\n if (ctx.sourceToken.assetId in intentDepositTokensMap) {\n const tkn = tokens.find(\n (t) =>\n t.isIntent &&\n t.assetId === intentDepositTokensMap[sourceToken.assetId],\n );\n\n fireEvent('tokenSelect', {\n variant: 'target',\n token: tkn,\n });\n\n return;\n }\n\n // 3. For all other tokens find their representations on NEAR\n const targetTokenOnNear = tokens.find(\n (t) =>\n t.isIntent &&\n t.symbol === sourceToken.symbol &&\n t.blockchain === 'near',\n );\n\n if (targetTokenOnNear) {\n fireEvent('tokenSelect', { variant: 'target', token: targetTokenOnNear });\n\n return;\n }\n\n // 4. If no token on NEAR - select token with the same assetId\n const firstToken = tokens.find(\n (t) => t.isIntent && t.assetId === sourceToken.assetId,\n );\n\n // 5. As a last resort - select USDC on NEAR\n const secondToken = tokens.find(\n (t) => t.isIntent && t.symbol === 'USDC' && t.blockchain === 'near',\n );\n\n fireEvent('tokenSelect', {\n variant: 'target',\n token: firstToken ?? secondToken,\n });\n }, [tokens, ctx.sourceToken]);\n};\n","import { useEffect } from 'react';\n\nimport type { ListenerProps } from './types';\nimport { useWalletAddressForToken } from '../../hooks/useWalletAddressForToken';\nimport { useConfig } from '@/config';\n\nimport { fireEvent, moveTo } from '@/machine';\nimport { guardStates } from '@/machine/guards';\nimport { useUnsafeSnapshot } from '@/machine/snap';\n\nexport const useWalletConnEffect = ({ isEnabled }: ListenerProps) => {\n const { connectedWallets } = useConfig();\n const { ctx, state } = useUnsafeSnapshot();\n const { walletAddress } = useWalletAddressForToken(\n connectedWallets,\n ctx.sourceToken,\n );\n\n useEffect(() => {\n if (!isEnabled) {\n return;\n }\n\n fireEvent('walletAddressSet', walletAddress);\n\n const isValidState = guardStates(ctx, ['initial_dry', 'initial_wallet']);\n\n if (isValidState) {\n if (state === 'initial_wallet' && !walletAddress) {\n moveTo('initial_dry');\n } else if (state === 'initial_dry' && walletAddress) {\n moveTo('initial_wallet');\n }\n }\n }, [isEnabled, walletAddress, ctx, state]);\n};\n","import { useMemo, useRef } from 'react';\nimport { snakeCase } from 'change-case';\nimport {\n Quote as OneClickQuote,\n QuoteRequest,\n QuoteResponse,\n} from '@defuse-protocol/one-click-sdk-typescript';\nimport { AxiosError, AxiosResponse, CanceledError } from 'axios';\n\nimport { Quote } from '../types';\nimport { logger } from '@/logger';\nimport { useConfig } from '@/config';\nimport { QuoteError } from '@/errors';\nimport { oneClickApi } from '@/network';\nimport { guardStates } from '@/machine/guards';\nimport { useUnsafeSnapshot } from '@/machine/snap';\nimport { NATIVE_NEAR_DUMB_ASSET_ID, WNEAR_ASSET_ID } from '@/constants/tokens';\nimport { getIntentsAccountId } from '@/utils/intents/getIntentsAccountId';\nimport { formatBigToHuman } from '@/utils/formatters/formatBigToHuman';\nimport { isDryQuote } from '@/machine/guards/checks/isDryQuote';\nimport { getDryQuoteAddress } from '@/utils/getDryQuoteAddress';\n\ntype MakeArgs = {\n message?: string;\n quoteType?: 'exact_in' | 'exact_out';\n options?: {\n isRefetch?: boolean;\n };\n};\n\nconst validateQuoteProperties = (\n quote: OneClickQuote,\n): quote is OneClickQuote & {\n depositAddress: string;\n} => {\n ['depositAddress'].forEach((property) => {\n if (!(property in quote)) {\n logger.error(`Missing ${property} in quote response`);\n\n return false;\n }\n });\n\n return true;\n};\n\nexport const useMakeQuote = () => {\n const { ctx } = useUnsafeSnapshot();\n const {\n walletSupportedChains,\n intentsAccountType,\n appName,\n appFees,\n fetchQuote,\n slippageTolerance,\n } = useConfig();\n\n const isDry = isDryQuote(ctx);\n\n const request = useRef<Promise<OneClickQuote>>(null);\n const abortController = useRef<AbortController>(new AbortController());\n\n const requestQuote = useMemo(() => {\n return async (\n data: QuoteRequest,\n metadata: { isRefetch?: boolean },\n ): Promise<OneClickQuote> => {\n const { signal } = abortController.current;\n\n if (fetchQuote) {\n return fetchQuote(data, {\n ...metadata,\n signal,\n });\n }\n\n return (\n await oneClickApi.post<QuoteResponse, AxiosResponse<QuoteResponse>>(\n 'https://1click.chaindefuser.com/v0/quote',\n data,\n { signal },\n )\n ).data.quote;\n };\n }, [oneClickApi]);\n\n const make = async ({\n message,\n quoteType = 'exact_in',\n options = {},\n }: MakeArgs = {}): Promise<Quote | undefined> => {\n const guardCurrentState = guardStates(ctx, [\n 'input_valid_dry',\n 'input_valid_external',\n 'input_valid_internal',\n 'quote_success_internal',\n 'quote_success_external',\n ]);\n\n if (!guardCurrentState) {\n const msg = `Unable to run quote in current state ${ctx.state}`;\n\n logger.error(`[WIDGET] ${msg}`);\n throw new QuoteError({\n code: 'QUOTE_INVALID_INITIAL',\n meta: { isDry, message: msg },\n });\n }\n\n const recipientIntentsAccountId = getIntentsAccountId({\n addressType: intentsAccountType,\n walletAddress: isDry\n ? // address on the target chain should be a dry quote recipient\n getDryQuoteAddress(ctx.targetToken.blockchain)\n : (ctx.walletAddress ?? ''),\n });\n\n const isRefundToIntentAccount =\n recipientIntentsAccountId &&\n (ctx.sourceToken.isIntent ||\n !walletSupportedChains.includes(ctx.sourceToken.blockchain));\n\n const getRefundToAccountId = () => {\n if (isDry) {\n return getDryQuoteAddress(\n ctx.sourceToken.blockchain,\n ctx.sourceToken.isIntent,\n );\n }\n\n if (isRefundToIntentAccount) {\n return recipientIntentsAccountId;\n }\n\n return ctx.walletAddress ?? '';\n };\n\n if (!recipientIntentsAccountId) {\n const msg = 'No corresponding intents account to run a quote';\n\n logger.error(`[WIDGET] ${msg}`);\n throw new QuoteError({\n code: 'QUOTE_INVALID_INITIAL',\n meta: { isDry, message: msg },\n });\n }\n\n if (request.current) {\n abortController.current.abort('Abort previous quote (auto)');\n abortController.current = new AbortController();\n }\n\n let quoteResponse: OneClickQuote;\n\n const commonQuoteParams: Omit<\n QuoteRequest,\n 'recipient' | 'recipientType' | 'depositType' | 'refundTo' | 'refundType'\n > = {\n // Settings\n dry: isDry,\n slippageTolerance,\n deadline: new Date(Date.now() + 60 * 60 * 1000).toISOString(), // 1 hour\n swapType:\n quoteType === 'exact_out'\n ? QuoteRequest.swapType.EXACT_OUTPUT\n : QuoteRequest.swapType.EXACT_INPUT,\n\n // Target\n destinationAsset:\n ctx.targetToken.assetId === NATIVE_NEAR_DUMB_ASSET_ID\n ? WNEAR_ASSET_ID\n : ctx.targetToken.assetId,\n\n // Source\n originAsset:\n ctx.sourceToken.assetId === NATIVE_NEAR_DUMB_ASSET_ID\n ? WNEAR_ASSET_ID\n : ctx.sourceToken.assetId,\n\n amount:\n quoteType === 'exact_out'\n ? ctx.targetTokenAmount\n : ctx.sourceTokenAmount,\n\n // Experimental\n quoteWaitingTimeMs: 0,\n };\n\n if (message) {\n // @ts-expect-error customRecipientMsg is not in the types\n commonQuoteParams.customRecipientMsg = message;\n }\n\n if (appName) {\n commonQuoteParams.referral = snakeCase(appName);\n }\n\n if (appFees) {\n commonQuoteParams.appFees = [...appFees];\n }\n\n try {\n if (ctx.sourceToken.isIntent && ctx.targetToken.isIntent) {\n request.current = requestQuote(\n {\n ...commonQuoteParams,\n recipient: recipientIntentsAccountId,\n recipientType: QuoteRequest.recipientType.INTENTS,\n depositType: QuoteRequest.depositType.INTENTS,\n\n // Refund\n refundTo: recipientIntentsAccountId,\n refundType: QuoteRequest.refundType.INTENTS,\n },\n options,\n );\n\n quoteResponse = await request.current;\n }\n\n request.current = requestQuote(\n {\n ...commonQuoteParams,\n recipient:\n !ctx.targetToken.isIntent && ctx.sendAddress\n ? ctx.sendAddress\n : recipientIntentsAccountId,\n recipientType: ctx.targetToken.isIntent\n ? QuoteRequest.recipientType.INTENTS\n : QuoteRequest.recipientType.DESTINATION_CHAIN,\n depositType: ctx.sourceToken.isIntent\n ? QuoteRequest.depositType.INTENTS\n : QuoteRequest.depositType.ORIGIN_CHAIN,\n\n // Refund\n refundTo: getRefundToAccountId(),\n refundType: isRefundToIntentAccount\n ? QuoteRequest.refundType.INTENTS\n : QuoteRequest.refundType.ORIGIN_CHAIN,\n },\n options,\n );\n\n quoteResponse = await request.current;\n } catch (error: unknown) {\n if (error instanceof CanceledError) {\n return;\n }\n\n logger.error('Quote error: ', error);\n let errorMessage = error instanceof Error ? error.message : '';\n\n if (error instanceof AxiosError) {\n errorMessage = error.response?.data.message || errorMessage;\n\n if (errorMessage.includes('Amount is too low')) {\n const match = errorMessage.match(/\\d+/);\n const minAmount = match ? match[0] : undefined;\n\n throw new QuoteError({\n code: 'QUOTE_AMOUNT_IS_TOO_LOW',\n meta: {\n minAmount:\n (minAmount &&\n formatBigToHuman(minAmount, ctx.sourceToken.decimals)) ??\n '0',\n },\n });\n }\n\n if (errorMessage.includes('recipient is not valid')) {\n throw new QuoteError({\n code: 'TOKEN_IS_NOT_SUPPORTED',\n });\n }\n\n if (errorMessage.includes('Failed to get a deposit address')) {\n throw new QuoteError({\n code: 'QUOTE_NO_ONE_TIME_ADDRESS',\n });\n }\n\n throw error;\n }\n\n throw new QuoteError({\n code: 'QUOTE_FAILED',\n meta: {\n message: errorMessage || 'Failed to fetch quote. Please try again.',\n },\n });\n }\n\n if (isDry) {\n return {\n dry: true,\n ...quoteResponse,\n deadline: undefined,\n depositAddress: undefined,\n };\n }\n\n if (!validateQuoteProperties(quoteResponse)) {\n throw new QuoteError({\n code: 'QUOTE_INVALID',\n meta: { isDry: false },\n });\n }\n\n return {\n dry: false,\n ...quoteResponse,\n deadline: quoteResponse.deadline,\n depositAddress: quoteResponse.depositAddress,\n };\n };\n\n return {\n make,\n cancel: () => {\n abortController.current.abort('Abort quote manually');\n abortController.current = new AbortController();\n },\n };\n};\n","import { useMemo, useRef } from 'react';\nimport { AxiosError, AxiosResponse, CanceledError } from 'axios';\n\nimport { logger } from '@/logger';\nimport { useConfig } from '@/config';\nimport { QuoteError } from '@/errors';\nimport { guardStates } from '@/machine/guards';\nimport { bridgeApi, oneClickApi } from '@/network';\nimport { isEvmChain } from '@/utils/evm/isEvmChain';\nimport { useComputedSnapshot, useUnsafeSnapshot } from '@/machine/snap';\nimport { CHAIN_POA_MAP, POA_EVM_CHAIN_ID } from '@/constants/chains';\nimport { formatBigToHuman } from '@/utils/formatters/formatBigToHuman';\nimport { getIntentsAccountId } from '@/utils/intents/getIntentsAccountId';\nimport type { Quote } from '@/types/quote';\n\ntype DepositAddressRequest = {\n accountId: string;\n chain: string;\n};\n\ntype DepositAddressResponse = {\n result: {\n address: string;\n };\n};\n\nexport const useMakeDepositAddress = () => {\n const { ctx } = useUnsafeSnapshot();\n const { intentsAccountType } = useConfig();\n const { isNativeNearDeposit } = useComputedSnapshot();\n\n const intentsAccountId = getIntentsAccountId({\n addressType: intentsAccountType,\n walletAddress: ctx.walletAddress ?? '',\n });\n\n const request = useRef<Promise<AxiosResponse<DepositAddressResponse>>>(null);\n const abortController = useRef<AbortController>(new AbortController());\n\n const requestDepositAddress = useMemo(() => {\n return async (data: DepositAddressRequest) => {\n return bridgeApi.post<\n DepositAddressResponse,\n AxiosResponse<DepositAddressResponse>\n >(\n '',\n {\n id: 1,\n jsonrpc: '2.0',\n method: 'deposit_address',\n params: [\n {\n account_id: data.accountId,\n chain: data.chain,\n },\n ],\n },\n {\n signal: abortController.current.signal,\n },\n );\n };\n }, [oneClickApi]);\n\n const make = async (): Promise<Quote | undefined> => {\n const guardCurrentState = guardStates(ctx, [\n 'input_valid_dry',\n 'input_valid_external',\n 'input_valid_internal',\n 'quote_success_internal',\n 'quote_success_external',\n ]);\n\n if (!guardCurrentState) {\n const msg = `Unable to run quote in current state ${ctx.state}`;\n\n logger.error(`[WIDGET] ${msg}`);\n throw new QuoteError({\n code: 'QUOTE_INVALID_INITIAL',\n meta: { isDry: false, message: msg },\n });\n }\n\n if (\n (isNativeNearDeposit && !ctx.isDepositFromExternalWallet) ||\n (!isNativeNearDeposit &&\n ctx.sourceToken.assetId !== ctx.targetToken.assetId)\n ) {\n throw new QuoteError({\n code: 'QUOTE_INVALID_INITIAL',\n meta: {\n isDry: false,\n message: 'Asset IDs are not the same use 1Click Quote instead of POA',\n },\n });\n }\n\n if (ctx.sourceToken.isIntent) {\n throw new QuoteError({\n code: 'QUOTE_INVALID_INITIAL',\n meta: {\n isDry: false,\n message: 'For withdrawals use withdrawal SDK instead of POA',\n },\n });\n }\n\n if (\n !ctx.isDepositFromExternalWallet &&\n ctx.sourceToken.blockchain === 'near'\n ) {\n throw new QuoteError({\n code: 'QUOTE_INVALID_INITIAL',\n meta: {\n isDry: false,\n message:\n 'Use transfer call. POA for tokens on Near only used for external deposits',\n },\n });\n }\n\n if (!intentsAccountId) {\n const msg = 'No corresponding intents account to run a quote';\n\n logger.error(`[WIDGET] ${msg}`);\n throw new QuoteError({\n code: 'QUOTE_INVALID_INITIAL',\n meta: { isDry: false, message: msg },\n });\n }\n\n if (request.current) {\n abortController.current.abort('Abort previous quote (auto)');\n abortController.current = new AbortController();\n }\n\n let chainId = CHAIN_POA_MAP[ctx.targetToken.blockchain];\n\n if (!chainId) {\n const isEvm = isEvmChain(ctx.targetToken.blockchain);\n\n if (isEvm) {\n chainId = POA_EVM_CHAIN_ID;\n } else {\n throw new QuoteError({\n code: 'QUOTE_INVALID_INITIAL',\n meta: { isDry: false, message: 'Chain is not supported by POA' },\n });\n }\n }\n\n try {\n request.current = requestDepositAddress({\n chain: chainId,\n accountId: intentsAccountId,\n });\n\n const response = (await request.current).data;\n\n return {\n depositAddress: response.result.address,\n amountIn: ctx.sourceTokenAmount,\n amountOut: ctx.targetTokenAmount,\n amountInUsd: `${\n parseFloat(\n formatBigToHuman(ctx.sourceTokenAmount, ctx.sourceToken.decimals),\n ) * ctx.sourceToken.price\n }`,\n amountOutUsd: `${\n parseFloat(\n formatBigToHuman(ctx.targetTokenAmount, ctx.targetToken.decimals),\n ) * ctx.targetToken.price\n }`,\n amountOutFormatted: formatBigToHuman(\n ctx.targetTokenAmount,\n ctx.targetToken.decimals,\n ),\n // dummy values to match quote type\n deadline: new Date(Date.now() + 60 * 60 * 1000).toISOString(),\n timeEstimate: 0,\n dry: false,\n };\n } catch (error: unknown) {\n if (error instanceof CanceledError) {\n return;\n }\n\n logger.error(error);\n\n if (error instanceof AxiosError) {\n const errorMessage = error.response?.data.message || error.message;\n\n throw new QuoteError({\n code: 'QUOTE_FAILED',\n meta: {\n message: errorMessage ?? 'Failed to fetch quote. Please try again.',\n },\n });\n }\n }\n };\n\n return {\n make,\n cancel: () => {\n abortController.current.abort('Abort quote manually');\n abortController.current = new AbortController();\n },\n };\n};\n","import { fireEvent } from './utils/fireEvent';\nimport { checkNearAccountExists } from '@/utils/near/checkNearAccountExists';\nimport { isNotEmptyAmount } from '@/utils/checkers/isNotEmptyAmount';\nimport { isValidBigint } from '@/utils/checkers/isValidBigint';\nimport { isNearAddress } from '@/utils/near/isNearAddress';\n\nimport { moveTo } from '@/machine';\nimport { guardStates } from '@/machine/guards';\nimport { isBalanceSufficient } from '@/machine/guards/checks/isBalanceSufficient';\nimport {\n isAsyncSendAddressValidationError,\n isQuoteError,\n isTransferError,\n} from '@/machine/errors';\nimport type { Context } from '@/machine/context';\nimport type {\n InitialDryStateError,\n InitialExternalStateError,\n InitialInternalStateError,\n} from '@/machine/errors';\n\nconst setAsyncError = (err: InitialExternalStateError) => {\n fireEvent('errorSet', err);\n fireEvent('quoteSet', undefined);\n fireEvent('quoteSetStatus', 'idle');\n fireEvent('transferSetStatus', { status: 'idle' });\n};\n\nconst asyncValidateSendAddress = async (ctx: Context) => {\n if (!ctx.sendAddress) {\n return;\n }\n\n let exists: boolean = false;\n\n try {\n fireEvent('setInputsValidating', true);\n exists = await checkNearAccountExists(ctx.sendAddress);\n } catch (e) {\n setAsyncError({\n code: 'SEND_ADDRESS_IS_NOT_VERIFIED',\n meta: { address: ctx.sendAddress, chain: 'near' },\n });\n\n fireEvent('setInputsValidating', false);\n moveTo('initial_wallet');\n\n return;\n }\n\n fireEvent('setInputsValidating', false);\n\n if (!exists) {\n setAsyncError({\n code: 'SEND_ADDRESS_IS_NOT_FOUND',\n meta: { address: ctx.sendAddress, chain: 'near' },\n });\n\n moveTo('initial_wallet');\n\n return;\n }\n\n if (!ctx.error) {\n moveTo('input_valid_external');\n } else if (isAsyncSendAddressValidationError(ctx.error)) {\n fireEvent('errorSet', null);\n moveTo('input_valid_external');\n }\n};\n\nexport const validateDryInputs = (ctx: Context): boolean | undefined => {\n const isValidInitialState = guardStates(ctx, ['initial_dry']);\n const isValidInputsState = guardStates(ctx, ['input_valid_dry']);\n\n if (!isValidInitialState && !isValidInputsState) {\n return undefined;\n }\n\n let err: InitialDryStateError | undefined;\n\n if (isValidInitialState) {\n if (!ctx.sourceToken) {\n err = { code: 'SOURCE_TOKEN_IS_EMPTY' };\n } else if (!ctx.targetToken) {\n err = { code: 'TARGET_TOKEN_IS_EMPTY' };\n } else if (!isNotEmptyAmount(ctx.sourceTokenAmount)) {\n err = { code: 'SOURCE_TOKEN_AMOUNT_IS_EMPTY' };\n } else if (ctx.walletAddress && !isBalanceSufficient(ctx)) {\n err = { code: 'SOURCE_BALANCE_INSUFFICIENT' };\n }\n }\n\n if (!isValidInputsState && err) {\n fireEvent('errorSet', err);\n } else if (\n ctx.error &&\n !isQuoteError(ctx.error) &&\n !isTransferError(ctx.error)\n ) {\n fireEvent('errorSet', null);\n }\n\n if (isValidInputsState && err?.code === 'SOURCE_BALANCE_INSUFFICIENT') {\n // should be able to fetch dry quote, when insufficient balance\n fireEvent('errorSet', err);\n }\n\n return isValidInputsState;\n};\n\nexport const validateExternalInputs = (ctx: Context): boolean | undefined => {\n const isValidInitialState = guardStates(ctx, ['initial_wallet']);\n const isValidInputsState = guardStates(ctx, ['input_valid_external']);\n\n if (!isValidInitialState && !isValidInputsState) {\n return undefined;\n }\n\n const sourceBalance = ctx.sourceTokenBalance;\n let err: InitialExternalStateError | undefined;\n\n if (isValidInitialState) {\n if (!ctx.sourceToken) {\n err = { code: 'SOURCE_TOKEN_IS_EMPTY' };\n } else if (!ctx.targetToken) {\n err = { code: 'TARGET_TOKEN_IS_EMPTY' };\n } else if (ctx.targetToken.isIntent) {\n err = { code: 'SOURCE_TOKEN_IS_INTENT' };\n } else if (!isNotEmptyAmount(ctx.sourceTokenAmount)) {\n err = { code: 'SOURCE_TOKEN_AMOUNT_IS_EMPTY' };\n } else if (!ctx.sendAddress) {\n err = { code: 'SEND_ADDRESS_IS_EMPTY' };\n } else if (ctx.targetToken.blockchain === 'near') {\n if (!isNearAddress(ctx.sendAddress)) {\n err = {\n code: 'SEND_ADDRESS_IS_INVALID',\n meta: { address: ctx.sendAddress, chain: 'near' },\n };\n } else {\n void asyncValidateSendAddress(ctx);\n }\n } else if (!ctx.isDepositFromExternalWallet) {\n if (!sourceBalance || !isValidBigint(sourceBalance)) {\n err = { code: 'INVALID_SOURCE_BALANCE' };\n } else if (!isBalanceSufficient(ctx)) {\n err = { code: 'SOURCE_BALANCE_INSUFFICIENT' };\n }\n }\n }\n\n // run async validation after optimistic\n // transition to input_valid_external state was made\n if (isValidInputsState) {\n if (ctx.targetToken.blockchain === 'near') {\n void asyncValidateSendAddress(ctx);\n }\n }\n\n if (!isValidInputsState && err) {\n fireEvent('errorSet', err);\n } else if (\n ctx.error &&\n !isQuoteError(ctx.error) &&\n !isTransferError(ctx.error)\n ) {\n fireEvent('errorSet', null);\n }\n\n return isValidInputsState;\n};\n\nexport const validateInternalInputs = (ctx: Context): boolean | undefined => {\n const isValidInitialState = guardStates(ctx, ['initial_wallet']);\n const isValidInputsState = guardStates(ctx, ['input_valid_internal']);\n\n if (!isValidInitialState && !isValidInputsState) {\n return undefined;\n }\n\n const sourceBalance = ctx.sourceTokenBalance;\n let err: InitialInternalStateError | undefined;\n\n if (isValidInitialState) {\n if (!ctx.sourceToken) {\n err = { code: 'SOURCE_TOKEN_IS_EMPTY' };\n } else if (!ctx.targetToken) {\n err = { code: 'TARGET_TOKEN_IS_EMPTY' };\n } else if (!ctx.targetToken.isIntent) {\n err = { code: 'SOURCE_TOKEN_NOT_INTENT' };\n } else if (!isNotEmptyAmount(ctx.sourceTokenAmount)) {\n err = { code: 'SOURCE_TOKEN_AMOUNT_IS_EMPTY' };\n } else if (!ctx.isDepositFromExternalWallet) {\n if (!sourceBalance || !isValidBigint(sourceBalance)) {\n err = { code: 'INVALID_SOURCE_BALANCE' };\n } else if (!isBalanceSufficient(ctx)) {\n err = { code: 'SOURCE_BALANCE_INSUFFICIENT' };\n }\n }\n }\n\n if (!isValidInputsState && err) {\n fireEvent('errorSet', err);\n } else if (\n ctx.error &&\n !isQuoteError(ctx.error) &&\n !isTransferError(ctx.error)\n ) {\n fireEvent('errorSet', null);\n }\n\n return isValidInputsState;\n};\n","import {\n validateDryInputs,\n validateExternalInputs,\n validateInternalInputs,\n} from './validateInputs';\nimport { moveTo } from '@/machine';\nimport type { Context } from '@/machine/context';\nimport { isDryQuote } from '@/machine/guards/checks/isDryQuote';\n\nexport const validateInputAndMoveTo = (ctx: Context) => {\n const isDryRun = isDryQuote(ctx);\n\n const isInternal = !isDryRun && ctx.targetToken?.isIntent === true;\n const isExternal = !isDryRun && ctx.targetToken?.isIntent === false;\n\n if (isDryRun) {\n const isValidDryInput = validateDryInputs(ctx);\n\n return moveTo(isValidDryInput ? 'input_valid_dry' : 'initial_dry');\n }\n\n if (isExternal && validateExternalInputs(ctx)) {\n moveTo('input_valid_external');\n } else if (isInternal && validateInternalInputs(ctx)) {\n moveTo('input_valid_internal');\n } else {\n moveTo('initial_wallet');\n }\n};\n","import { useCallback, useEffect, useRef } from 'react';\n\nimport { logger } from '../../logger';\nimport { isDryQuote } from '../guards/checks/isDryQuote';\nimport type { ListenerProps } from './types';\nimport { QuoteError } from '@/errors';\nimport { fireEvent, moveTo } from '@/machine';\nimport { guardStates } from '@/machine/guards';\nimport { useMakeQuote } from '@/hooks/useMakeQuote';\nimport { useMakeDepositAddress } from '@/hooks/useMakeDepositAddress';\nimport { useComputedSnapshot, useUnsafeSnapshot } from '@/machine/snap';\nimport { validateInputAndMoveTo } from '@/machine/events/validateInputAndMoveTo';\nimport type { FetchQuoteOptions, Quote } from '@/types/quote';\n\nexport type Props = ListenerProps & {\n message?: string;\n type?: 'exact_in' | 'exact_out';\n refetchQuoteInterval?: number;\n};\n\nexport const useMakeQuoteEffect = ({\n isEnabled,\n message,\n type: quoteType = 'exact_in',\n refetchQuoteInterval,\n}: Props) => {\n const { ctx } = useUnsafeSnapshot();\n const {\n isNativeNearDeposit,\n isDirectNonNearWithdrawal,\n isDirectTokenOnNearDeposit,\n isDirectNearTokenWithdrawal,\n isDirectTokenOnNearTransfer,\n isSameAssetDiffChainWithdrawal,\n } = useComputedSnapshot();\n\n const isDry = isDryQuote(ctx);\n\n const shouldRun =\n isEnabled &&\n !ctx.areInputsValidating &&\n (isSameAssetDiffChainWithdrawal ||\n ((isDirectTokenOnNearDeposit || isNativeNearDeposit) &&\n ctx.isDepositFromExternalWallet) ||\n (!isDirectNearTokenWithdrawal &&\n !isDirectNonNearWithdrawal &&\n !isDirectTokenOnNearDeposit &&\n !isDirectTokenOnNearTransfer));\n\n const { make: makeQuote, cancel: cancelQuote } = useMakeQuote();\n const { make: makeDepositAddress, cancel: cancelDepositAddress } =\n useMakeDepositAddress();\n\n const intervalRef = useRef<NodeJS.Timeout | null>(null);\n\n const cancel = () => {\n cancelQuote();\n cancelDepositAddress();\n };\n\n // cancels any ongoing quote request if input becomes invalid\n useEffect(() => {\n const isValidDryInput = guardStates(ctx, ['input_valid_dry']);\n const isValidExternalInput = guardStates(ctx, ['input_valid_external']);\n const isValidInternalInput = guardStates(ctx, ['input_valid_internal']);\n\n if (isDry && !isValidDryInput) {\n cancel();\n } else if (!isDry && ctx.targetToken?.isIntent && !isValidInternalInput) {\n cancel();\n } else if (!isDry && !ctx.targetToken?.isIntent && !isValidExternalInput) {\n cancel();\n } else if (ctx.areInputsValidating) {\n cancel();\n }\n }, [cancel, isDry, ctx]);\n\n const run = useCallback(\n async (options: FetchQuoteOptions) => {\n try {\n let quote: Quote | undefined;\n\n if (\n ctx.sourceToken?.assetId === ctx.targetToken?.assetId ||\n (isNativeNearDeposit && ctx.isDepositFromExternalWallet)\n ) {\n if (isDry) {\n // since here it's not a real quote but just a deposit address generation\n // we don't want to run it for dry runs\n return;\n }\n\n fireEvent('quoteSetStatus', 'pending');\n quote = await makeDepositAddress();\n } else {\n fireEvent('quoteSetStatus', 'pending');\n quote = await makeQuote({ message, quoteType, options });\n }\n\n if (!quote) {\n return;\n }\n\n fireEvent('quoteSetStatus', 'success');\n fireEvent('quoteSet', quote);\n\n if (!isDry && ctx.error?.code !== 'SOURCE_BALANCE_INSUFFICIENT') {\n // should persist SOURCE_BALANCE_INSUFFICIENT error, if it was set during dry run\n fireEvent('errorSet', null);\n }\n\n fireEvent('tokenSetAmount', {\n variant: 'target',\n amount: quote.amountOut,\n });\n\n if (ctx.state === 'input_valid_dry') {\n moveTo('quote_success_dry');\n\n return;\n }\n\n if (ctx.targetToken?.isIntent) {\n moveTo('quote_success_internal');\n } else {\n moveTo('quote_success_external');\n }\n } catch (err) {\n if (err instanceof QuoteError) {\n if (err.data.code === 'QUOTE_INVALID_INITIAL') {\n fireEvent('quoteSetStatus', 'idle');\n fireEvent('quoteSet', undefined);\n fireEvent('errorSet', null);\n\n return;\n }\n\n fireEvent('quoteSetStatus', 'error');\n fireEvent('quoteSet', undefined);\n fireEvent('errorSet', err.data);\n\n validateInputAndMoveTo(ctx);\n\n return;\n }\n\n // unhandled error\n logger.error('Unhandled error in useMakeQuoteEffect:', err);\n fireEvent('quoteSetStatus', 'error');\n fireEvent('quoteSet', undefined);\n fireEvent('errorSet', {\n code: 'QUOTE_FAILED',\n meta: { message: 'Unknown error' },\n });\n }\n },\n [ctx, isDry, makeDepositAddress, makeQuote, message, quoteType, shouldRun],\n );\n\n useEffect(() => {\n if (!shouldRun) {\n return;\n }\n\n const isValidState = isDry\n ? ctx.state === 'input_valid_dry'\n : (ctx.state === 'input_valid_external' && !ctx.targetToken?.isIntent) ||\n (ctx.state === 'input_valid_internal' && ctx.targetToken?.isIntent);\n\n if (!isValidState) {\n return;\n }\n\n // do not refetch failed quotes - persist an error instead\n if (ctx.quoteStatus === 'error') {\n return;\n }\n\n // not used for depositing native Near token without QR code\n if (isNativeNearDeposit && !ctx.isDepositFromExternalWallet) {\n return;\n }\n\n void run({ isRefetch: false });\n }, [shouldRun, run, cancel, ctx.sourceToken, ctx.targetToken]);\n\n // Refetch if an interval is set and a quote was successful\n useEffect(() => {\n const cleanup = () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n\n if (\n (ctx.state !== 'quote_success_internal' &&\n ctx.state !== 'quote_success_external') ||\n !refetchQuoteInterval\n ) {\n return cleanup;\n }\n\n intervalRef.current = setInterval(async () => {\n await run({ isRefetch: true });\n }, refetchQuoteInterval);\n\n return cleanup;\n }, [shouldRun, run, cancel, ctx.state]);\n};\n","import { useEffect, useMemo } from 'react';\n\nimport type { ListenerProps } from './types';\nimport { IntentsAccountType } from '../../types/config';\nimport { isSolanaAddress } from '../../utils/solana/isSolanaAddress';\nimport { isEvmAddress } from '../../utils/evm/isEvmAddress';\nimport { isNearAddress } from '../../utils/near/isNearAddress';\nimport { useConfig } from '@/config';\nimport { useTokens } from '@/hooks/useTokens';\nimport { useIntentsBalance } from '@/hooks/useIntentsBalance';\nimport { getMainTokenByChain } from '@/utils/tokens/getMainTokenByChain';\nimport { getDefaultIntentsToken } from '@/utils/tokens/getDefaultIntentsToken';\nimport { getTokenWithHighBalance } from '@/utils/tokens/getTokenWithHighBalance';\nimport { CHAIN_BASE_TOKENS } from '@/constants/chains';\nimport type { Chains } from '@/types/chain';\n\nimport { fireEvent } from '@/machine';\nimport { guardStates } from '@/machine/guards';\nimport { useUnsafeSnapshot } from '@/machine/snap';\nimport type { Token } from '@/types/token';\n\nexport type Props = ListenerProps & {\n skipIntents?: boolean;\n target?: 'none' | 'same-asset';\n};\n\nconst accountChainMap: Record<IntentsAccountType, Chains> = {\n sol: 'sol',\n evm: 'eth',\n near: 'near',\n};\n\nexport const useSelectedTokensEffect = ({\n isEnabled,\n skipIntents = false,\n target = 'none',\n}: Props) => {\n const { tokens } = useTokens();\n const { ctx, state } = useUnsafeSnapshot();\n const { intentBalances } = useIntentsBalance();\n const { walletSupportedChains, chainsFilter, intentsAccountType } =\n useConfig();\n\n const highestIntentsToken = getTokenWithHighBalance({\n tokens,\n walletSupportedChains,\n balances: intentBalances,\n across: 'intents',\n });\n\n const [sourceToken, targetToken] = useMemo(() => {\n if (!ctx.walletAddress && !skipIntents) {\n const defaultIntentsToken = getDefaultIntentsToken({ tokens });\n\n return [\n { token: defaultIntentsToken, status: 'loaded' },\n { token: undefined, status: 'loaded' },\n ] as const;\n }\n\n if (chainsFilter.source.intents !== 'none' && !skipIntents) {\n if (!highestIntentsToken) {\n return [\n { token: undefined, status: 'loading' },\n { token: undefined, status: 'loading' },\n ] as const;\n }\n\n return [\n { token: highestIntentsToken, status: 'loaded' },\n { token: undefined, status: 'loaded' },\n ] as const;\n }\n\n const mainExternalToken = getMainTokenByChain({\n tokens,\n walletSupportedChains,\n });\n\n return [\n { token: mainExternalToken, status: 'loaded' },\n { token: undefined, status: 'loaded' },\n ] as const;\n }, [\n tokens,\n skipIntents,\n chainsFilter,\n ctx.walletAddress,\n highestIntentsToken,\n walletSupportedChains,\n state,\n ]);\n\n useEffect(() => {\n if (!isEnabled) {\n return;\n }\n\n const isGuardedState = guardStates(ctx, ['initial_dry', 'initial_wallet']);\n\n if (isGuardedState) {\n if (sourceToken.status === 'loaded' && !ctx.sourceToken) {\n fireEvent('tokenSelect', {\n variant: 'source',\n token: sourceToken.token,\n });\n }\n\n if (\n targetToken.status === 'loaded' &&\n sourceToken.status === 'loaded' &&\n !ctx.targetToken\n ) {\n let tkn: Token | undefined = targetToken.token;\n\n if (target === 'same-asset') {\n if (sourceToken.token?.isIntent) {\n if (!intentsAccountType) {\n throw new Error(\n 'Intents account type is required to select same-asset target token',\n );\n }\n\n tkn = tokens.find(\n (t) =>\n !t.isIntent &&\n t.symbol === ctx.sourceToken?.symbol &&\n t.blockchain === accountChainMap[intentsAccountType],\n );\n } else {\n tkn = tokens.find(\n (t) => t.isIntent && t.symbol === ctx.sourceToken?.symbol,\n );\n }\n }\n\n fireEvent('tokenSelect', {\n variant: 'target',\n token: tkn,\n });\n }\n }\n }, [ctx, sourceToken, targetToken, isEnabled]);\n\n const setTokenForIntentsAccountType = (\n accountType: IntentsAccountType,\n fallbackToken?: Token,\n ) => {\n const tkn =\n tokens.find(\n (t) =>\n !t.isIntent &&\n t.blockchain === accountChainMap[accountType] &&\n t.symbol.toLowerCase() ===\n CHAIN_BASE_TOKENS[accountChainMap[accountType]]?.toLowerCase(),\n ) ?? fallbackToken;\n\n fireEvent('tokenSelect', {\n variant: 'source',\n token: tkn,\n });\n };\n\n // in case we cannot load intents balances we eventually set default token\n // based on wallet supported chains to avoid infinite loading state\n useEffect(() => {\n const isGuardedState = guardStates(ctx, ['initial_dry', 'initial_wallet']);\n\n if (!isEnabled || !isGuardedState) {\n return;\n }\n\n const fallbackToken = tokens.find(\n (t) => t.isIntent && t.symbol === 'AURORA' && t.blockchain === 'near',\n );\n\n const timer = setTimeout(() => {\n if (!sourceToken.token) {\n // 1. Intents token if possible\n if (!skipIntents && highestIntentsToken) {\n fireEvent('tokenSelect', {\n variant: 'source',\n token: highestIntentsToken,\n });\n // 2. Wallet base token if intents not supported\n } else if (walletSupportedChains.length && intentsAccountType) {\n setTokenForIntentsAccountType(intentsAccountType, fallbackToken);\n // 3. Select base token by detecting Solana wallet address\n } else if (ctx.walletAddress && isSolanaAddress(ctx.walletAddress)) {\n setTokenForIntentsAccountType('sol', fallbackToken);\n // 4. Select base token by detecting EVM wallet address\n } else if (ctx.walletAddress && isEvmAddress(ctx.walletAddress)) {\n setTokenForIntentsAccountType('evm', fallbackToken);\n // 5. Select base token by detecting NEAR wallet address\n } else if (ctx.walletAddress && isNearAddress(ctx.walletAddress)) {\n setTokenForIntentsAccountType('near', fallbackToken);\n // 6. Fallback if intents is not supported and wallet is not connected\n } else {\n fireEvent('tokenSelect', {\n variant: 'source',\n token: fallbackToken,\n });\n }\n }\n }, 3000);\n\n return () => clearTimeout(timer);\n }, [tokens, sourceToken, skipIntents]);\n\n return { source: ctx.sourceToken, target: ctx.targetToken };\n};\n","import type { ListenerProps } from './types';\nimport { useConfig } from '../../config';\nimport { useAlchemyBalanceIntegration } from '@/ext/alchemy';\n\nexport type Props = ListenerProps & {\n alchemyApiKey: string | undefined;\n};\n\nexport const useAlchemyBalanceEffect = ({\n isEnabled,\n alchemyApiKey,\n}: Props) => {\n const { connectedWallets } = useConfig();\n\n useAlchemyBalanceIntegration({\n isEnabled,\n connectedWallets,\n alchemyApiKey: alchemyApiKey ?? '',\n });\n};\n","import { snapshot } from 'valtio';\n\nimport { configStore } from '@/config';\n\nimport type { Context, ContextChange } from '@/machine/context';\n\nexport const isSendAddressAsConnected = (\n ctx: Context,\n changes: ContextChange[],\n) => {\n const { config } = snapshot(configStore);\n\n return (\n ctx.targetToken &&\n !ctx.sendAddress &&\n !!ctx.walletAddress &&\n !ctx.targetToken.isIntent &&\n !changes.find((change) => change?.key === 'sendAddress') &&\n config.walletSupportedChains.includes(ctx.targetToken.blockchain)\n );\n};\n","import { isQuoteIdle } from './checkers/isQuoteIdle';\nimport { isInputChanged } from './checkers/isInputChanged';\nimport { isErrorChanged } from './checkers/isErrorChanged';\nimport { isOnlyErrorChanged } from './checkers/isOnlyErrorChanged';\nimport { isValidInitialState } from './checkers/isValidInitialState';\nimport { isWalletDisconnected } from './checkers/isWalletDisconnected';\nimport { isSendAddressForbidden } from './checkers/isSendAddressForbidden';\nimport { isSendAddressAsConnected } from './checkers/isSendAddressAsConnected';\nimport { isAmountChangedFromQuote } from './checkers/isAmountChangedFromQuote';\nimport type { ContextChange } from '@/machine/context';\nimport { validateInputAndMoveTo } from '@/machine/events/validateInputAndMoveTo';\nimport { machine, moveTo } from '@/machine';\nimport { fireEvent } from '@/machine/events/utils/fireEvent';\nimport { logger } from '@/logger';\n\ntype Args = {\n debug: boolean;\n};\n\nexport const registerGlobalContextSubscription = ({ debug }: Args) => {\n machine.onContextChange((ctx, _changes) => {\n const changes = _changes as ContextChange[];\n\n if (debug) {\n logger.debug('[WIDGET] Context changed', changes);\n }\n\n if (debug && ctx.error && isErrorChanged(changes)) {\n logger.debug(`[WIDGET] Error set to ${ctx.error.code}`);\n }\n\n // do not validate on just error change\n if (isOnlyErrorChanged(changes)) {\n return;\n }\n\n // do not trigger validation if amount changed from a quote\n if (isAmountChangedFromQuote(ctx, changes, debug)) {\n return;\n }\n\n // if wallet was disconnected - clean the state\n if (isWalletDisconnected(ctx, changes)) {\n fireEvent('reset', { clearWalletAddress: true });\n moveTo('initial_dry');\n\n return;\n }\n\n // revalidate inputs on any of the input changed\n const { isChanged, isDry } = isInputChanged(ctx, changes);\n\n if (!isChanged) {\n return;\n }\n\n if (isValidInitialState(ctx)) {\n const nextState = isDry ? 'initial_dry' : 'initial_wallet';\n\n moveTo(nextState, {\n onMoved: () => {\n if (debug) {\n logger.debug(\n `[WIDGET] Inputs changed. State moved to ${nextState}`,\n );\n }\n },\n });\n }\n\n // reset quote on any input change\n if (!isQuoteIdle(ctx)) {\n ctx.quote = undefined;\n ctx.quoteStatus = 'idle';\n ctx.transferStatus = { status: 'idle' };\n }\n\n // reset send to address if transfer to intents\n if (isSendAddressForbidden(ctx)) {\n ctx.sendAddress = undefined;\n }\n\n // reset send to address if transfer is possible to own wallet\n if (isSendAddressAsConnected(ctx, changes)) {\n ctx.sendAddress = ctx.walletAddress;\n }\n\n // validate inputs on change\n validateInputAndMoveTo(ctx);\n });\n};\n\nexport const registerGlobalStateSubscription = ({ debug }: Args) => {\n machine.onTransition((fromState, toState) => {\n if (debug) {\n logger.debug(`===> [WIDGET] State moved from ${fromState} to ${toState}`);\n }\n });\n};\n","import { snapshot } from 'valtio';\n\nimport { tokenSelectRotate } from './tokenSelectRotate';\nimport { configStore } from '@/config';\nimport { notReachable } from '@/utils/notReachable';\nimport type { Token } from '@/types/token';\nimport type { Context } from '@/machine/context';\n\nexport type TokenSelectPayload = {\n variant: 'source' | 'target';\n token: Token | undefined;\n};\n\nexport const tokenSelect = (\n ctx: Context,\n payload: TokenSelectPayload,\n): void => {\n const { variant, token } = payload;\n const { config } = snapshot(configStore);\n\n switch (variant) {\n case 'source':\n if (\n token &&\n token.assetId === ctx.targetToken?.assetId &&\n token.isIntent === ctx.targetToken.isIntent &&\n config.enableAutoTokensSwitching\n ) {\n if (!ctx.sourceToken) {\n return;\n }\n\n tokenSelectRotate(ctx);\n\n return;\n }\n\n if (\n token &&\n !ctx.sourceToken &&\n token.assetId === ctx.targetToken?.assetId &&\n token.isIntent === ctx.targetToken.isIntent &&\n config.enableAutoTokensSwitching\n ) {\n return;\n }\n\n ctx.sourceToken = token;\n break;\n case 'target':\n if (\n token &&\n token.assetId === ctx.sourceToken?.assetId &&\n token.isIntent === ctx.sourceToken.isIntent &&\n config.enableAutoTokensSwitching\n ) {\n if (!ctx.targetToken) {\n return;\n }\n\n tokenSelectRotate(ctx);\n\n return;\n }\n\n ctx.targetToken = token;\n break;\n default:\n notReachable(variant, { throwError: false });\n }\n};\n","import { reset, type ResetPayload } from './reset';\nimport { tokenSelectRotate } from './tokenSelectRotate';\nimport { errorSet, type ErrorSetPayload } from './errorSet';\nimport { quoteSet, type QuoteSetPayload } from './quoteSet';\nimport { addressSet, type AddressSetPayload } from './addressSet';\nimport { tokenSelect, type TokenSelectPayload } from './tokenSelect';\nimport { tokenSetAmount, type TokenSetAmountPayload } from './tokenSetAmount';\nimport { quoteSetStatus, type QuoteSetStatusPayload } from './quoteSetStatus';\nimport { depositTypeSet, type DepositTypeSetPayload } from './depositTypeSet';\nimport { externalDepositTxSet } from './externalDepositTxSet';\nimport {\n type InputsValidatingPayload,\n setInputsValidating,\n} from './setInputsValidating';\nimport {\n validateDryInputs,\n validateExternalInputs,\n validateInternalInputs,\n} from './validateInputs';\nimport {\n walletAddressSet,\n type WalletAddressSetPayload,\n} from './walletAddressSet';\nimport {\n tokenSetBalance,\n type TokenSetBalancePayload,\n} from './tokenSetBalance';\nimport {\n transferSetStatus,\n type TransferSetStatusPayload,\n} from './transferSetStatus';\nimport { machine } from '@/machine/machine';\nimport type { Context } from '@/machine/context';\nimport type { Machine } from '@/machine/machine';\n\nexport type TradeEvents = {\n reset: ResetPayload;\n tokenSelectRotate: null;\n validateDryInputs: null;\n validateExternalInputs: null;\n validateInternalInputs: null;\n tokenSelect: TokenSelectPayload;\n tokenSetAmount: TokenSetAmountPayload;\n tokenSetBalance: TokenSetBalancePayload;\n addressSet: AddressSetPayload;\n errorSet: ErrorSetPayload;\n quoteSet: QuoteSetPayload;\n depositTypeSet: DepositTypeSetPayload;\n externalDepositTxSet: boolean | undefined;\n quoteSetStatus: QuoteSetStatusPayload;\n transferSetStatus: TransferSetStatusPayload;\n walletAddressSet: WalletAddressSetPayload;\n setInputsValidating: InputsValidatingPayload;\n};\n\nconst onEvent = <E extends keyof TradeEvents>(\n event: E,\n handler: (ctx: Context, payload: TradeEvents[E], m: Machine) => void,\n) => {\n return machine.on(event, (ctx, payload) =>\n handler(ctx, payload as TradeEvents[E], machine),\n );\n};\n\nexport const registerEvents = () => {\n onEvent('quoteSetStatus', quoteSetStatus);\n onEvent('walletAddressSet', walletAddressSet);\n onEvent('transferSetStatus', transferSetStatus);\n onEvent('tokenSelectRotate', tokenSelectRotate);\n onEvent('tokenSetBalance', tokenSetBalance);\n onEvent('tokenSetAmount', tokenSetAmount);\n onEvent('depositTypeSet', depositTypeSet);\n onEvent('setInputsValidating', setInputsValidating);\n onEvent('externalDepositTxSet', externalDepositTxSet);\n onEvent('tokenSelect', tokenSelect);\n onEvent('addressSet', addressSet);\n onEvent('errorSet', errorSet);\n onEvent('quoteSet', quoteSet);\n onEvent('reset', reset);\n\n // use with caution since these just return a boolean flag and set\n // a specific error to the context\n //\n // DO NOT USE IT FOR CONTEXT CHECKS\n // - use guards (runtime validation) if you mutate context or move state\n // - use state narrowing (no runtime validation) if you check context to just read from it\n onEvent('validateDryInputs', validateDryInputs);\n onEvent('validateExternalInputs', validateExternalInputs);\n onEvent('validateInternalInputs', validateInternalInputs);\n};\n","import once from 'lodash.once';\nimport { useEffect } from 'react';\n\nimport { useBalancesUpdateEffect } from './useBalancesUpdateEffect';\nimport { useSetTokenBalanceEffect } from './useSetTokenBalanceEffect';\nimport { useSetTokenIntentsTargetEffect } from './useSetTokenIntentsTargetEffect';\nimport { useWalletConnEffect } from './useWalletConnEffect';\nimport {\n type Props as PropsMakeQuote,\n useMakeQuoteEffect,\n} from './useMakeQuoteEffect';\nimport {\n type Props as PropsDefaultTokens,\n useSelectedTokensEffect,\n} from './useSelectedTokensEffect';\nimport {\n type Props as PropsAlchemyBalances,\n useAlchemyBalanceEffect,\n} from './useAlchemyBalanceEffect';\nimport {\n registerGlobalContextSubscription,\n registerGlobalStateSubscription,\n} from '@/machine/subscriptions';\nimport { registerEvents } from '@/machine/events';\nimport { logger } from '@/logger';\n\ntype EffectMakeQuote = ['makeQuote', Omit<PropsMakeQuote, 'isEnabled'>];\n\ntype EffectAlchemyBalances = [\n 'setBalancesUsingAlchemyExt',\n Omit<PropsAlchemyBalances, 'isEnabled'>,\n];\n\ntype EffectDefaultTokens = [\n 'setDefaultSelectedTokens',\n Omit<PropsDefaultTokens, 'isEnabled'>,\n];\n\ntype Effect =\n | 'updateBalances'\n | 'checkWalletConnection'\n | 'setSourceTokenBalance'\n | 'setSourceTokenIntentsTarget'\n | EffectMakeQuote\n | EffectDefaultTokens\n | EffectAlchemyBalances;\n\ntype Args = {\n debug?: boolean;\n listenTo: Effect[];\n};\n\nexport const registerStoreEvents = once(({ debug }: { debug: boolean }) => {\n if (debug) {\n logger.debug(\n `[WIDGET] Debug mode is enabled (package version: ${import.meta.env.SWAP_WIDGET_VERSION ?? 'unknown'})`,\n );\n }\n\n registerEvents();\n registerGlobalStateSubscription({ debug });\n registerGlobalContextSubscription({ debug });\n});\n\nexport const useStoreSideEffects = ({ listenTo, debug = false }: Args) => {\n useEffect(() => {\n registerStoreEvents({ debug });\n }, [debug]);\n const alchemyBalancesListener = listenTo.find<EffectAlchemyBalances>(\n (item): item is EffectAlchemyBalances =>\n Array.isArray(item) && item[0] === 'setBalancesUsingAlchemyExt',\n );\n\n const defaultTokenListener = listenTo.find<EffectDefaultTokens>(\n (item): item is EffectDefaultTokens =>\n Array.isArray(item) && item[0] === 'setDefaultSelectedTokens',\n );\n\n const makeQuoteListener = listenTo.find<EffectMakeQuote>(\n (item): item is EffectMakeQuote =>\n Array.isArray(item) && item[0] === 'makeQuote',\n );\n\n useAlchemyBalanceEffect({\n isEnabled: !!alchemyBalancesListener,\n alchemyApiKey: alchemyBalancesListener?.[1].alchemyApiKey,\n });\n\n useSelectedTokensEffect({\n isEnabled: !!defaultTokenListener,\n skipIntents: defaultTokenListener?.[1].skipIntents,\n target: defaultTokenListener?.[1].target,\n });\n\n useMakeQuoteEffect({\n isEnabled: !!makeQuoteListener,\n message: makeQuoteListener?.[1].message,\n type: makeQuoteListener?.[1].type,\n refetchQuoteInterval: makeQuoteListener?.[1].refetchQuoteInterval,\n });\n\n useWalletConnEffect({\n isEnabled: listenTo.includes('checkWalletConnection'),\n });\n\n useSetTokenBalanceEffect({\n isEnabled: listenTo.includes('setSourceTokenBalance'),\n });\n\n useSetTokenIntentsTargetEffect({\n isEnabled: listenTo.includes('setSourceTokenIntentsTarget'),\n });\n\n useBalancesUpdateEffect({\n isEnabled: listenTo.includes('updateBalances'),\n alchemyApiKey: alchemyBalancesListener?.[1].alchemyApiKey,\n });\n};\n","import { snapshot } from 'valtio';\n\nimport type {\n ErrorType,\n InputValidDryError,\n InputValidWalletError,\n QuoteSuccessDirectTransferError,\n QuoteSuccessTransferError,\n} from '@/machine/errors';\nimport { machine } from '@/machine';\nimport type { Context } from '@/machine/context';\n\nconst store = machine.getStore();\n\nexport class WidgetError extends Error {\n context: Context;\n\n _is_widget_error = true;\n\n constructor(message: string, meta?: { cause?: unknown }) {\n super(message);\n this.name = 'WidgetError';\n this.cause = meta?.cause;\n this.context = snapshot(store).context;\n }\n}\n\nexport class MachineError<E extends ErrorType> extends WidgetError {\n data: E;\n\n constructor(data: E) {\n super(data.code);\n this.data = data;\n this.name = 'MachineError';\n }\n}\n\nexport class QuoteError extends MachineError<\n InputValidDryError | InputValidWalletError\n> {\n constructor(data: InputValidDryError | InputValidWalletError) {\n super(data);\n this.name = 'QuoteError';\n }\n}\n\nexport class TransferError extends MachineError<\n QuoteSuccessTransferError | QuoteSuccessDirectTransferError\n> {\n constructor(\n data: QuoteSuccessTransferError | QuoteSuccessDirectTransferError,\n ) {\n super(data);\n this.name = 'TransferError';\n }\n}\n\nexport const isWidgetError = (error: unknown): error is WidgetError =>\n typeof error === 'object' &&\n error !== null &&\n '_is_widget_error' in error &&\n !!error._is_widget_error;\n","import { useSnapshot } from 'valtio';\nimport { derive } from 'derive-valtio';\n\nimport { getIsNativeNearDeposit } from './computed/getIsNativeNearDeposit';\nimport { getIsDirectTokenOnNearDeposit } from './computed/getIsDirectTokenOnNearDeposit';\nimport { WidgetError } from '@/errors';\nimport { machine } from '@/machine/machine';\nimport { guardStates } from '@/machine/guards';\nimport { getUsdTradeDelta } from '@/machine/computed/getUsdTradeDelta';\nimport { getIsDirectNonNearWithdrawal } from '@/machine/computed/getIsDirectNonNearWithdrawal';\nimport { getIsDirectTokenOnNearTransfer } from '@/machine/computed/getIsDirectTokenOnNearTransfer';\nimport { getIsDirectNearTokenWithdrawal } from '@/machine/computed/getIsDirectNearTokenWithdrawal';\nimport { getIsSameAssetDiffChainWithdrawal } from '@/machine/computed/getIsSameAssetDiffChainWithdrawal';\nimport type { MachineState } from '@/machine/machine';\nimport type { Context } from '@/machine/context';\n\nconst store = machine.getStore();\n\nconst computed = derive({\n usdTradeDelta: (get) => getUsdTradeDelta(get(store.context)),\n isDirectNearTokenWithdrawal: (get) =>\n getIsDirectNearTokenWithdrawal(get(store.context)),\n isDirectNonNearWithdrawal: (get) =>\n getIsDirectNonNearWithdrawal(get(store.context)),\n isDirectTokenOnNearDeposit: (get) =>\n getIsDirectTokenOnNearDeposit(get(store.context)),\n isNativeNearDeposit: (get) => getIsNativeNearDeposit(get(store.context)),\n isSameAssetDiffChainWithdrawal: (get) =>\n getIsSameAssetDiffChainWithdrawal(get(store.context)),\n isDirectTokenOnNearTransfer: (get) =>\n getIsDirectTokenOnNearTransfer(get(store.context)),\n});\n\nexport const useComputedSnapshot = () => {\n return useSnapshot(computed);\n};\n\nexport const useUnsafeSnapshot = () => {\n const snap = useSnapshot(store);\n\n return {\n state: snap.state,\n ctx: snap.context,\n };\n};\n\nexport const useSafeSnapshot = <S extends MachineState>(state: S) => {\n const snap = useSnapshot(store);\n const isValid = guardStates(snap.context, [state]);\n\n if (!isValid) {\n throw new WidgetError(\n `[WIDGET] Attempt to access snapshot for ${state} state while context does not match`,\n );\n }\n\n type Ctx = Extract<Context, { state: S }>;\n\n return snap.context as Ctx;\n};\n","import { z } from 'zod';\n\nimport { decodeQueryResult } from './decodeQueryResult';\nimport { nearRpcClient } from './rpc';\nimport { WidgetError } from '@/errors';\n\nexport const getNearNep141StorageBalance = async ({\n contractId,\n accountId,\n}: {\n contractId: string;\n accountId: string;\n}): Promise<bigint> => {\n try {\n const args = { account_id: accountId };\n const argsBase64 = Buffer.from(JSON.stringify(args)).toString('base64');\n\n const response = await nearRpcClient.query({\n request_type: 'call_function',\n method_name: 'storage_balance_of',\n account_id: contractId,\n args_base64: argsBase64,\n finality: 'optimistic',\n });\n\n const parsed = decodeQueryResult(\n response,\n z.union([z.null(), z.object({ total: z.string() })]),\n );\n\n return BigInt(parsed?.total ?? '0');\n } catch (err: unknown) {\n throw new WidgetError('Error fetching balance', { cause: err });\n }\n};\n","import type { NearWalletBase as NearWallet } from '@hot-labs/near-connect/build/types/wallet';\nimport type { Action } from '@hot-labs/near-connect/build/types/transactions';\nimport { FT_DEPOSIT_GAS, FT_TRANSFER_GAS } from '../utils/near/config';\nimport { getNearNep141StorageBalance } from '../utils/near/getNearNep141StorageBalance';\nimport { getNearNep141MinStorageBalance } from '../utils/near/getNearNep141MinStorageBalance';\nimport { logger } from '@/logger';\nimport { TransferError } from '@/errors';\nimport { useComputedSnapshot, useUnsafeSnapshot } from '@/machine/snap';\nimport { NATIVE_NEAR_DUMB_ASSET_ID, WNEAR_ASSET_ID } from '@/constants/tokens';\nimport type { TransferResult } from '@/types/transfer';\n\nexport function useMakeNEARFtTransferCall(\n nearWallet: null | undefined | (() => NearWallet),\n) {\n const { ctx } = useUnsafeSnapshot();\n const { isNativeNearDeposit } = useComputedSnapshot();\n const sourceTokenAddress = ctx.sourceToken?.contractAddress;\n const amount = ctx.quote?.amountIn ?? ctx.sourceTokenAmount;\n\n const NEARFtTransferCall = async (\n recipient: string,\n msgRecipient?: string,\n ): Promise<TransferResult | undefined> => {\n if (!nearWallet) {\n throw new TransferError({\n code: 'TRANSFER_INVALID_INITIAL',\n meta: { message: 'No connected wallet to sign a transfer.' },\n });\n }\n\n if (\n !sourceTokenAddress &&\n ctx.sourceToken?.assetId !== NATIVE_NEAR_DUMB_ASSET_ID\n ) {\n throw new TransferError({\n code: 'TRANSFER_INVALID_INITIAL',\n meta: { message: 'No token selected to transfer.' },\n });\n }\n\n if (!recipient) {\n throw new TransferError({\n code: 'TRANSFER_INVALID_INITIAL',\n meta: { message: 'No recipient address to transfer.' },\n });\n }\n\n if (!amount) {\n throw new TransferError({\n code: 'TRANSFER_INVALID_INITIAL',\n meta: { message: 'No amount to transfer.' },\n });\n }\n\n const wallet = nearWallet();\n\n if (\n ctx.sourceToken.assetId === NATIVE_NEAR_DUMB_ASSET_ID &&\n ctx.targetToken?.assetId !== WNEAR_ASSET_ID\n ) {\n const tx = await wallet.signAndSendTransactions({\n transactions: [\n {\n signerId: ctx.walletAddress,\n receiverId: recipient,\n actions: [\n {\n type: 'Transfer',\n params: {\n deposit: amount, // Amount in yoctoNEAR\n },\n },\n ],\n },\n ],\n });\n\n if (tx && tx.length > 0) {\n return {\n hash: tx[0]?.transaction?.hash ?? '',\n transactionLink: `https://nearblocks.io/txns/${tx[0]?.transaction?.hash}`,\n intent: undefined,\n };\n }\n\n return {\n hash: '',\n transactionLink: '',\n intent: undefined,\n };\n }\n\n const tokenContractActions: Action[] = [];\n\n if (ctx.targetToken && isNativeNearDeposit) {\n try {\n tokenContractActions.push({\n type: 'FunctionCall',\n params: {\n methodName: 'near_deposit',\n gas: FT_DEPOSIT_GAS,\n deposit: amount,\n args: {},\n },\n });\n\n tokenContractActions.push({\n type: 'FunctionCall',\n params: {\n methodName: 'ft_transfer_call',\n deposit: '1', // 1 yocto required by NEP-141\n gas: FT_TRANSFER_GAS,\n args: {\n amount,\n receiver_id: recipient,\n msg: msgRecipient ?? '',\n },\n },\n });\n\n const tx = await wallet.signAndSendTransactions({\n transactions: [\n {\n receiverId: 'wrap.near',\n actions: tokenContractActions,\n },\n ],\n });\n\n if (tx?.[0]?.transaction?.hash) {\n return {\n hash: tx[0].transaction?.hash ?? '',\n transactionLink: `https://nearblocks.io/txns/${tx[0].transaction?.hash}`,\n intent: undefined,\n };\n }\n\n throw new TransferError({\n code: 'NO_DEPOSIT_RESULT',\n });\n } catch (err: unknown) {\n logger.error('[TRANSFER ERROR]', err);\n throw new TransferError({\n code: 'DIRECT_TRANSFER_ERROR',\n });\n }\n }\n\n if (!sourceTokenAddress) {\n throw new TransferError({\n code: 'TRANSFER_INVALID_INITIAL',\n meta: { message: 'No token selected to transfer.' },\n });\n }\n\n try {\n const [minStorageBalanceResult, userStorageBalanceResult] =\n await Promise.all([\n getNearNep141MinStorageBalance({\n contractId: sourceTokenAddress,\n }),\n getNearNep141StorageBalance({\n contractId: sourceTokenAddress,\n accountId: recipient,\n }),\n ]);\n\n const storageDelta = minStorageBalanceResult - userStorageBalanceResult;\n\n if (storageDelta > 0n) {\n tokenContractActions.push({\n type: 'FunctionCall',\n params: {\n methodName: 'storage_deposit',\n args: { account_id: recipient },\n gas: FT_DEPOSIT_GAS,\n deposit: storageDelta.toString(),\n },\n });\n }\n\n tokenContractActions.push({\n type: 'FunctionCall',\n params: {\n methodName: 'ft_transfer_call',\n args: {\n receiver_id: recipient,\n amount,\n msg: msgRecipient ?? '',\n },\n gas: FT_TRANSFER_GAS,\n deposit: '1',\n },\n });\n\n const tx = await wallet.signAndSendTransactions({\n transactions: [\n {\n receiverId: sourceTokenAddress,\n actions: tokenContractActions,\n },\n ],\n });\n\n if (tx?.[0]?.transaction?.hash) {\n return {\n hash: tx[0].transaction?.hash ?? '',\n transactionLink: `https://nearblocks.io/txns/${tx[0].transaction?.hash}`,\n intent: undefined,\n };\n }\n\n throw new TransferError({\n code: 'NO_DEPOSIT_RESULT',\n });\n } catch (err: unknown) {\n logger.error('[TRANSFER ERROR]', err);\n throw new TransferError({\n code: 'DIRECT_TRANSFER_ERROR',\n });\n }\n };\n\n return {\n make: NEARFtTransferCall,\n };\n}\n","import axios from 'axios';\n\nimport { EVM_CHAIN_IDS_MAP } from '../constants/chains';\nimport { isEvmBaseToken, isEvmChain } from '../utils';\nimport { useMakeEvmTransfer } from './useMakeEvmTransfer';\nimport { isEvmAddress } from '../utils/evm/isEvmAddress';\nimport { Providers } from '../types/providers';\nimport { useMakeSolanaTransfer } from './useMakeSolanaTransfer';\nimport { useConfig } from '../config';\nimport { isSolanaAddress } from '../utils/solana/isSolanaAddress';\nimport { logger } from '@/logger';\nimport { TransferError } from '@/errors';\nimport { useUnsafeSnapshot } from '@/machine/snap';\nimport { NATIVE_NEAR_DUMB_ASSET_ID } from '@/constants/tokens';\nimport { isUserDeniedSigning } from '@/utils/checkers/isUserDeniedSigning';\nimport type { MakeTransferArgs, TransferResult } from '@/types/transfer';\n\ntype Result = {\n hash: string;\n transactionLink: string;\n intent?: string;\n};\n\ntype MakeTransferResult = Result | undefined | null | void;\n\nexport type QuoteTransferArgs = {\n makeTransfer?: (\n args: MakeTransferArgs,\n ) => Promise<MakeTransferResult> | MakeTransferResult;\n providers?: Providers;\n};\n\nexport const useMakeQuoteTransfer = ({\n makeTransfer,\n providers,\n}: QuoteTransferArgs) => {\n const { ctx } = useUnsafeSnapshot();\n const { alchemyApiKey } = useConfig();\n const { make: makeEvmTransfer } = useMakeEvmTransfer({\n provider: providers?.evm,\n });\n\n const { make: makeSolanaTransfer } = useMakeSolanaTransfer({\n provider: providers?.sol,\n alchemyApiKey,\n });\n\n const getTransferFunction = (depositAddress: string) => {\n if (makeTransfer) {\n return makeTransfer;\n }\n\n if (isEvmAddress(depositAddress)) {\n return makeEvmTransfer;\n }\n\n if (isSolanaAddress(depositAddress)) {\n return makeSolanaTransfer;\n }\n\n throw new TransferError({\n code: 'TRANSFER_INVALID_INITIAL',\n meta: { message: 'No transfer function established.' },\n });\n };\n\n const make = async (): Promise<TransferResult | undefined> => {\n if (!ctx.sourceToken) {\n const msg = 'No token selected to transfer.';\n\n throw new TransferError({\n code: 'TRANSFER_INVALID_INITIAL',\n meta: { message: msg },\n });\n }\n\n if (!ctx.quote) {\n const msg = 'Quote is required for a transfer.';\n\n throw new TransferError({\n code: 'TRANSFER_INVALID_INITIAL',\n meta: { message: msg },\n });\n }\n\n if (!ctx.quote.depositAddress) {\n const msg = 'Quote has no deposit address. Make sure not dry.';\n\n throw new TransferError({\n code: 'TRANSFER_INVALID_INITIAL',\n meta: { message: msg },\n });\n }\n\n const makeTransferArgs: MakeTransferArgs = {\n amount: ctx.quote.amountIn,\n decimals: ctx.sourceToken.decimals,\n address: ctx.quote.depositAddress,\n chain: ctx.sourceToken.blockchain,\n evmChainId: isEvmChain(ctx.sourceToken.blockchain)\n ? EVM_CHAIN_IDS_MAP[ctx.sourceToken.blockchain]\n : null,\n isNativeEvmTokenTransfer:\n !!ctx.sourceToken && isEvmBaseToken(ctx.sourceToken),\n tokenAddress:\n ctx.sourceToken.assetId === NATIVE_NEAR_DUMB_ASSET_ID\n ? NATIVE_NEAR_DUMB_ASSET_ID\n : ctx.sourceToken.contractAddress,\n sourceAssetId: ctx.sourceToken.assetId,\n targetAssetId: ctx.targetToken.assetId,\n };\n\n const transferFunction = getTransferFunction(makeTransferArgs.address);\n\n try {\n const depositResult = await transferFunction(makeTransferArgs);\n\n if (!depositResult) {\n // A custom make transfer function may not return a deposit result. We\n // may choose to defer processing, for example, and show the success\n // state at some later time.\n if (makeTransfer) {\n return;\n }\n\n logger.error('[TRANSFER ERROR]', 'No deposit result');\n throw new TransferError({\n code: 'NO_DEPOSIT_RESULT',\n });\n }\n\n return {\n hash: depositResult.hash,\n transactionLink: depositResult.transactionLink,\n intent: undefined,\n };\n } catch (error: unknown) {\n logger.error('[TRANSFER ERROR]', error, { error });\n let errorMessage = 'Failed to make a transfer. Please try again.';\n\n const userCancelledTx =\n error instanceof Error && isUserDeniedSigning(error.message);\n\n if (userCancelledTx) {\n return;\n }\n\n if (axios.isAxiosError<{ detail?: string }>(error)) {\n errorMessage =\n error.response?.data?.detail ??\n error.message ??\n 'Failed to make deposit. Please try again.';\n\n throw new TransferError({\n code: 'QUOTE_ERROR',\n meta: { message: errorMessage },\n });\n } else if (errorMessage === 'No quotes found') {\n throw new TransferError({\n code: 'NO_QUOTE_FOUND',\n });\n } else if (error instanceof Error) {\n if (!userCancelledTx) {\n throw new TransferError({\n code: 'QUOTE_ERROR',\n meta: { message: error.message },\n });\n }\n }\n\n throw new TransferError({\n code: 'QUOTE_ERROR',\n meta: { message: 'Unknown quote transfer error' },\n });\n }\n };\n\n return { make };\n};\n","import { utils } from '@defuse-protocol/internal-utils';\nimport { createIntentSignerViem } from '@defuse-protocol/bridge-sdk';\n\nimport { EvmProvider } from '@/types';\nimport { WidgetError } from '@/errors';\n\ntype SignIntentResult = ReturnType<\n ReturnType<typeof createIntentSignerViem>['signIntent']\n>;\ntype SignIntentPayload = Parameters<\n ReturnType<typeof createIntentSignerViem>['signIntent']\n>[0];\n\ninterface IPrivySigner extends ReturnType<typeof createIntentSignerViem> {\n provider: EvmProvider;\n}\n\nexport class IntentSignerPrivy implements IPrivySigner {\n declare provider: EvmProvider;\n\n constructor(\n private account: { walletAddress: string },\n provider: EvmProvider,\n ) {\n this.provider = provider;\n }\n\n async signIntent(intent: SignIntentPayload): SignIntentResult {\n const message = JSON.stringify({\n verifying_contract: intent.verifying_contract,\n deadline: intent.deadline,\n nonce: intent.nonce,\n intents: intent.intents,\n signer_id:\n intent.signer_id ??\n utils.authHandleToIntentsUserId({\n identifier: this.account.walletAddress,\n method: 'evm',\n }),\n });\n\n const resolvedProvider =\n typeof this.provider === 'function'\n ? await this.provider()\n : this.provider;\n\n const accounts = await resolvedProvider.request({\n method: 'eth_requestAccounts',\n });\n\n const signature = await resolvedProvider.request({\n method: 'personal_sign',\n params: [message, accounts[0]],\n });\n\n if (signature == null) {\n throw new WidgetError('No signature is returned');\n }\n\n return {\n payload: message,\n standard: 'erc191',\n signature: utils.transformERC191Signature(signature),\n };\n }\n}\n","import { createIntentSignerNEP413 } from '@defuse-protocol/bridge-sdk';\nimport type {\n NearWalletBase as NearWallet,\n SignedMessage,\n} from '@hot-labs/near-connect/build/types/wallet';\nimport { WidgetError } from '@/errors';\n\ntype Args = {\n getProvider: () => NearWallet;\n walletAddress: string;\n};\n\nexport const createNearWalletSigner = ({\n walletAddress,\n getProvider,\n}: Args): ReturnType<typeof createIntentSignerNEP413> => {\n return createIntentSignerNEP413({\n accountId: walletAddress,\n signMessage: async (nep413Payload) => {\n const nearWallet = getProvider();\n\n if (!nearWallet.signMessage) {\n throw new WidgetError('Near wallet has no signMessage method exposed');\n }\n\n let signedMessage: SignedMessage | undefined | void;\n\n try {\n signedMessage = await nearWallet.signMessage({\n ...nep413Payload,\n nonce: Buffer.from(nep413Payload.nonce),\n });\n } catch (e: unknown) {\n throw new WidgetError('Near wallet failed to sign a message', {\n cause: e,\n });\n }\n\n if (!signedMessage) {\n throw new WidgetError('Near wallet failed to sign a message');\n }\n\n return {\n publicKey: signedMessage.publicKey,\n signature: signedMessage.signature,\n };\n },\n });\n};\n","import {\n BridgeSDK,\n createIntentSignerNEP413,\n createInternalTransferRoute,\n createNearWithdrawalRoute,\n FeeExceedsAmountError,\n MinWithdrawalAmountError,\n type RouteConfig,\n} from '@defuse-protocol/bridge-sdk';\nimport type { NearWalletBase as NearWallet } from '@hot-labs/near-connect/build/types/wallet';\nimport { snakeCase } from 'change-case';\nimport { generateRandomBytes } from '../utils/near/getRandomBytes';\nimport { IntentSignerSolana } from '../utils/intents/signers/solana';\nimport { Providers } from '../types/providers';\nimport { logger } from '@/logger';\nimport { useConfig } from '@/config';\nimport { TransferError } from '@/errors';\nimport { INTENTS_CONTRACT } from '@/constants';\nimport { CHAIN_IDS_MAP } from '@/constants/chains';\nimport { notReachable } from '@/utils/notReachable';\nimport { localStorageTyped } from '@/utils/localstorage';\nimport { queryContract } from '@/utils/near/queryContract';\nimport { IntentSignerPrivy } from '@/utils/intents/signers/privy';\nimport { createNearWalletSigner } from '@/utils/intents/signers/near';\nimport { formatBigToHuman } from '@/utils/formatters/formatBigToHuman';\nimport { getIntentsAccountId } from '@/utils/intents/getIntentsAccountId';\nimport { getTransactionLink } from '@/utils/formatters/getTransactionLink';\nimport { isUserDeniedSigning } from '@/utils/checkers/isUserDeniedSigning';\nimport { useComputedSnapshot, useUnsafeSnapshot } from '@/machine/snap';\nimport type { TransferResult } from '@/types/transfer';\nimport type { Context } from '@/machine/context';\n\nexport type IntentsTransferArgs = {\n providers?: Providers;\n};\n\ntype MakeArgs = {\n message?: string;\n onPending: (reason: 'WAITING_CONFIRMATION' | 'PROCESSING') => void;\n};\n\nconst getDestinationAddress = (ctx: Context, isDirectTransfer: boolean) => {\n if (isDirectTransfer) {\n if (ctx.sendAddress) {\n return ctx.sendAddress;\n }\n\n throw new TransferError({\n code: 'TRANSFER_INVALID_INITIAL',\n meta: { message: 'Send to address is required for a direct transfer' },\n });\n }\n\n if (!ctx.quote || ctx.quote.dry) {\n throw new TransferError({\n code: 'TRANSFER_INVALID_INITIAL',\n meta: { message: 'Quote is required for intents non-direct transfer' },\n });\n }\n\n return ctx.quote.depositAddress;\n};\n\nconst validateNearPublicKey = async (\n nearProvider: NearWallet,\n walletAddress: string,\n) => {\n let publicKey = localStorageTyped.getItem('nearWalletsPk')[walletAddress];\n\n if (!nearProvider.signMessage) {\n throw new TransferError({\n code: 'DIRECT_TRANSFER_ERROR',\n meta: { message: \"Your wallet doesn't support signing messages\" },\n });\n }\n\n if (!publicKey) {\n try {\n const res = await nearProvider.signMessage({\n message: 'Authenticate',\n recipient: 'intents.near',\n nonce: Buffer.from(generateRandomBytes(32)),\n });\n\n if (!res) {\n throw new TransferError({\n code: 'DIRECT_TRANSFER_ERROR',\n meta: { message: 'Signing message failed' },\n });\n }\n\n publicKey = res.publicKey;\n localStorageTyped.setItem('nearWalletsPk', {\n [walletAddress]: res.publicKey,\n });\n } catch (e: unknown) {\n throw new TransferError({\n code: 'DIRECT_TRANSFER_ERROR',\n meta: { message: \"Your wallet doesn't support signing messages\" },\n });\n }\n }\n\n const accountId = getIntentsAccountId({\n walletAddress,\n addressType: 'near',\n });\n\n const hasPublicKey = await queryContract({\n contractId: INTENTS_CONTRACT,\n methodName: 'has_public_key',\n args: {\n account_id: accountId,\n public_key: publicKey,\n },\n });\n\n if (!hasPublicKey) {\n try {\n await nearProvider.signAndSendTransactions({\n transactions: [\n {\n receiverId: INTENTS_CONTRACT,\n signerId: walletAddress,\n actions: [\n {\n type: 'FunctionCall',\n params: {\n methodName: 'add_public_key',\n args: { public_key: publicKey },\n gas: '100000000000000',\n deposit: '1',\n },\n },\n ],\n },\n ],\n });\n } catch (e: unknown) {\n throw new TransferError({\n code: 'DIRECT_TRANSFER_ERROR',\n meta: { message: 'Unable to add public key to intents account' },\n });\n }\n }\n};\n\nexport const useMakeIntentsTransfer = ({ providers }: IntentsTransferArgs) => {\n const { ctx } = useUnsafeSnapshot();\n const { appName, intentsAccountType } = useConfig();\n const {\n isNativeNearDeposit,\n isDirectNearTokenWithdrawal,\n isDirectNonNearWithdrawal,\n } = useComputedSnapshot();\n\n const make = async ({\n message,\n onPending,\n }: MakeArgs): Promise<TransferResult | undefined> => {\n if (!ctx.walletAddress) {\n throw new TransferError({\n code: 'TRANSFER_INVALID_INITIAL',\n meta: { message: 'No connected wallet to sign a transfer.' },\n });\n }\n\n if (!ctx.sourceToken || !ctx.targetToken) {\n throw new TransferError({\n code: 'TRANSFER_INVALID_INITIAL',\n meta: { message: 'No token selected to transfer.' },\n });\n }\n\n if (!ctx.sourceToken.isIntent) {\n throw new TransferError({\n code: 'TRANSFER_INVALID_INITIAL',\n meta: {\n message:\n 'For not intents source token use useMakeQuoteTransfer instead',\n },\n });\n }\n\n let signer:\n | IntentSignerPrivy\n | ReturnType<typeof createIntentSignerNEP413>\n | undefined;\n\n if (!intentsAccountType) {\n throw new TransferError({\n code: 'TRANSFER_INVALID_INITIAL',\n meta: { message: 'Intents account type is not defined' },\n });\n }\n\n switch (intentsAccountType) {\n case 'evm':\n if (!providers?.evm) {\n throw new TransferError({\n code: 'TRANSFER_INVALID_INITIAL',\n meta: { message: 'No EVM provider configured' },\n });\n }\n\n signer = new IntentSignerPrivy(\n { walletAddress: ctx.walletAddress },\n providers.evm,\n );\n break;\n\n case 'sol':\n if (!providers?.sol) {\n throw new TransferError({\n code: 'TRANSFER_INVALID_INITIAL',\n meta: { message: 'No SOL provider configured' },\n });\n }\n\n signer = new IntentSignerSolana(\n { walletAddress: ctx.walletAddress },\n providers.sol,\n );\n\n break;\n\n case 'near': {\n if (!providers?.near) {\n throw new TransferError({\n code: 'TRANSFER_INVALID_INITIAL',\n meta: { message: 'No NEAR provider configured' },\n });\n }\n\n await validateNearPublicKey(providers.near(), ctx.walletAddress);\n\n signer = createNearWalletSigner({\n walletAddress: ctx.walletAddress,\n getProvider: providers.near,\n });\n\n break;\n }\n default:\n notReachable(intentsAccountType);\n }\n\n const sdk = new BridgeSDK({ referral: snakeCase(appName) });\n\n sdk.setIntentSigner(signer);\n\n let routeConfig: RouteConfig | undefined;\n\n if (isNativeNearDeposit) {\n routeConfig = undefined;\n } else if (isDirectNearTokenWithdrawal) {\n routeConfig = createNearWithdrawalRoute(message ?? undefined);\n } else if (isDirectNonNearWithdrawal) {\n routeConfig = undefined;\n } else {\n routeConfig = createInternalTransferRoute();\n }\n\n const withdrawal = sdk.createWithdrawal({\n withdrawalParams: {\n assetId: ctx.sourceToken.assetId,\n amount: BigInt(ctx.sourceTokenAmount),\n destinationAddress: getDestinationAddress(\n ctx,\n isDirectNearTokenWithdrawal || isDirectNonNearWithdrawal,\n ),\n destinationMemo: undefined,\n feeInclusive: false,\n routeConfig,\n },\n });\n\n try {\n await withdrawal.estimateFee();\n\n onPending('WAITING_CONFIRMATION');\n const txIntent = await withdrawal.signAndSendIntent();\n\n onPending('PROCESSING');\n const tx = await withdrawal.waitForIntentSettlement();\n\n await withdrawal.waitForWithdrawalCompletion();\n\n return {\n hash: tx.hash,\n transactionLink: getTransactionLink(CHAIN_IDS_MAP.near, tx.hash),\n intent: txIntent,\n };\n } catch (e: unknown) {\n logger.error('[TRANSFER ERROR]', e);\n\n if (e instanceof MinWithdrawalAmountError) {\n throw new TransferError({\n code: 'MIN_WITHDRAWAL_AMOUNT_ERROR',\n meta: {\n minAmount: formatBigToHuman(\n e.minAmount.toString(),\n ctx.sourceToken.decimals,\n ),\n },\n });\n }\n\n if (e instanceof FeeExceedsAmountError) {\n throw new TransferError({\n code: 'TRANSFER_INVALID_INITIAL',\n meta: { message: 'Fee is above the maximum allowed' },\n });\n }\n\n if (e instanceof Error) {\n if (e.message.includes('Fee is not estimated')) {\n throw new TransferError({\n code: 'FEES_NOT_ESTIMATED',\n });\n }\n\n // User rejected\n if (\n isUserDeniedSigning(e.message) ||\n isUserDeniedSigning(`${e.cause}`)\n ) {\n return undefined;\n }\n }\n\n throw new TransferError({\n code: 'DIRECT_TRANSFER_ERROR',\n });\n }\n };\n\n return { make };\n};\n","import { useMakeNEARFtTransferCall } from './useMakeNEARFtTransferCall';\nimport { logger } from '@/logger';\nimport { TransferError } from '@/errors';\nimport { fireEvent, moveTo } from '@/machine';\nimport { useComputedSnapshot, useUnsafeSnapshot } from '@/machine/snap';\nimport type { TransferResult } from '@/types/transfer';\n\nimport { INTENTS_CONTRACT } from '@/constants';\nimport { useMakeQuoteTransfer } from '@/hooks/useMakeQuoteTransfer';\nimport { useMakeIntentsTransfer } from '@/hooks/useMakeIntentsTransfer';\nimport type { QuoteTransferArgs } from '@/hooks/useMakeQuoteTransfer';\nimport type { IntentsTransferArgs } from '@/hooks/useMakeIntentsTransfer';\n\nexport const useMakeTransfer = ({\n message,\n providers,\n makeTransfer,\n}: QuoteTransferArgs & IntentsTransferArgs & { message?: string }) => {\n const { ctx } = useUnsafeSnapshot();\n const {\n isDirectTokenOnNearDeposit,\n isDirectTokenOnNearTransfer,\n isNativeNearDeposit,\n } = useComputedSnapshot();\n\n const { make: makeIntentsTransfer } = useMakeIntentsTransfer({ providers });\n const { make: makeQuoteTransfer } = useMakeQuoteTransfer({\n makeTransfer,\n providers,\n });\n\n const { make: makeNEARFtTransferCall } = useMakeNEARFtTransferCall(\n providers?.near,\n );\n\n const make = async () => {\n if (!ctx.targetToken) {\n return;\n }\n\n let transferResult: TransferResult | undefined;\n\n try {\n fireEvent('transferSetStatus', {\n status: 'pending',\n reason: 'WAITING_CONFIRMATION',\n });\n\n if (!ctx.sourceToken?.isIntent) {\n if (\n (isNativeNearDeposit || isDirectTokenOnNearDeposit) &&\n !ctx.isDepositFromExternalWallet\n ) {\n // sendAddress can be used to deposit into another intents account here\n transferResult = await makeNEARFtTransferCall(\n ctx.sendAddress ?? INTENTS_CONTRACT,\n message,\n );\n } else if (isDirectTokenOnNearTransfer) {\n if (!ctx.sendAddress) {\n throw new TransferError({\n code: 'TRANSFER_INVALID_INITIAL',\n meta: { message: 'No recipient address to transfer' },\n });\n }\n\n transferResult = await makeNEARFtTransferCall(\n ctx.sendAddress,\n message,\n );\n } else {\n transferResult = await makeQuoteTransfer();\n }\n } else {\n transferResult = await makeIntentsTransfer({\n message,\n onPending: (reason) => {\n fireEvent('transferSetStatus', {\n status: 'pending',\n reason,\n });\n },\n });\n }\n } catch (error: unknown) {\n if (error instanceof TransferError) {\n logger.error(error.data);\n fireEvent('transferSetStatus', { status: 'error' });\n fireEvent('errorSet', error.data);\n }\n }\n\n if (!transferResult) {\n fireEvent('transferSetStatus', { status: 'idle' });\n\n return;\n }\n\n fireEvent('transferSetStatus', { status: 'success' });\n moveTo('transfer_success');\n\n return transferResult;\n };\n\n return { make };\n};\n","import { useCallback, useEffect, useState } from 'react';\nimport { Eip1193Provider } from 'ethers';\nimport { Providers } from '../types';\nimport { EVM_CHAIN_IDS_MAP } from '@/constants/chains';\nimport { useUnsafeSnapshot } from '@/machine/snap';\nimport { isEvmChain } from '@/utils';\nimport { logger } from '@/logger';\nimport { switchEthereumChain } from '@/utils/evm/switchEthereumChain';\n\nconst getCurrentChainId = async (provider: Eip1193Provider) => {\n if (!provider) {\n return;\n }\n\n const chainId = await provider.request({\n method: 'eth_chainId',\n });\n\n return parseInt(chainId, 16);\n};\n\nexport const useSwitchChain = ({ providers }: { providers?: Providers }) => {\n const { ctx } = useUnsafeSnapshot();\n const [isSwitchingChain, setIsSwitchingChain] = useState(false);\n const [isSwitchingChainRequired, setIsSwitchingChainRequired] =\n useState(false);\n\n // Check if chain switching is needed\n const checkIfSwitchingIsRequired = useCallback(async () => {\n const provider =\n typeof providers?.evm === 'function'\n ? await providers.evm()\n : providers?.evm;\n\n if (!ctx.sourceToken || !provider) {\n return false;\n }\n\n const currentWalletChainId = await getCurrentChainId(provider);\n\n // Only for EVM chains\n if (!isEvmChain(ctx.sourceToken.blockchain)) {\n return false;\n }\n\n const requiredChainId = EVM_CHAIN_IDS_MAP[ctx.sourceToken.blockchain];\n\n if (!requiredChainId || !currentWalletChainId) {\n return false;\n }\n\n return currentWalletChainId !== requiredChainId;\n }, [ctx.sourceToken, providers]);\n\n const switchChain = useCallback(async () => {\n const provider =\n typeof providers?.evm === 'function'\n ? await providers.evm()\n : providers?.evm;\n\n if (!ctx.sourceToken || !provider) {\n return false;\n }\n\n if (!isEvmChain(ctx.sourceToken.blockchain)) {\n return false;\n }\n\n const targetChainId = EVM_CHAIN_IDS_MAP[ctx.sourceToken.blockchain];\n\n if (!targetChainId) {\n return false;\n }\n\n try {\n setIsSwitchingChain(true);\n\n // Use shared utility function for chain switching\n await switchEthereumChain(targetChainId, provider);\n\n return true;\n } catch (error: unknown) {\n logger.error('Failed to switch chain:', error);\n\n return false;\n } finally {\n setIsSwitchingChain(false);\n }\n }, [ctx.sourceToken, providers]);\n\n useEffect(() => {\n void checkIfSwitchingIsRequired().then(setIsSwitchingChainRequired);\n }, [checkIfSwitchingIsRequired]);\n\n return {\n isSwitchingChainRequired,\n switchChain,\n isSwitchingChain,\n };\n};\n","import { Trans } from 'react-i18next';\nimport { Button } from '@/components/Button';\nimport { TinyNumber } from '@/components/TinyNumber';\nimport { ErrorMessage } from '@/components/ErrorMessage';\nimport { useComputedSnapshot, useUnsafeSnapshot } from '@/machine/snap';\nimport type { TransferResult } from '@/types/transfer';\nimport type { Context } from '@/machine/context';\n\nimport { useConfig } from '@/config';\nimport { useTypedTranslation } from '@/localisation';\nimport { useMakeTransfer } from '@/hooks/useMakeTransfer';\nimport { useSwitchChain } from '@/hooks/useSwitchChain';\nimport { isNotEmptyAmount } from '@/utils/checkers/isNotEmptyAmount';\nimport type { QuoteTransferArgs } from '@/hooks/useMakeQuoteTransfer';\nimport type { IntentsTransferArgs } from '@/hooks/useMakeIntentsTransfer';\n\ntype Props = QuoteTransferArgs &\n IntentsTransferArgs & {\n label: string;\n onSuccess: (transfer: TransferResult) => void;\n };\n\nconst commonBtnProps = {\n size: 'lg' as const,\n variant: 'primary' as const,\n};\n\nconst useGetErrorButton = (ctx: Context) => {\n const { t } = useTypedTranslation();\n\n if (ctx.error?.code === 'TOKEN_IS_NOT_SUPPORTED') {\n return (\n <Button state=\"error\" {...commonBtnProps}>\n {t('submit.error.invalidAddress', 'Invalid address')}\n </Button>\n );\n }\n\n if (\n ctx.state === 'initial_wallet' &&\n ctx.error?.code === 'SEND_ADDRESS_IS_EMPTY'\n ) {\n return (\n <Button state=\"disabled\" {...commonBtnProps}>\n {t('submit.disabled.enterRecipientAddress', 'Enter recipient address')}\n </Button>\n );\n }\n\n if (\n ctx.state === 'initial_wallet' &&\n ctx.error?.code === 'SEND_ADDRESS_IS_NOT_FOUND'\n ) {\n return (\n <Button state=\"error\" {...commonBtnProps}>\n {t('submit.error.sendAddressNotFound', {\n defaultValue: 'Address not found on {{chain}}',\n chain: ctx.error.meta.chain.toUpperCase(),\n })}\n </Button>\n );\n }\n\n if (\n ctx.state === 'initial_wallet' &&\n ctx.error?.code === 'SEND_ADDRESS_IS_INVALID'\n ) {\n return (\n <Button state=\"error\" {...commonBtnProps}>\n {t('submit.error.sendAddressInvalid', {\n defaultValue: 'Invalid {{chain}} address',\n chain: ctx.error.meta.chain.toUpperCase(),\n })}\n </Button>\n );\n }\n\n if (\n ctx.error?.code === 'QUOTE_AMOUNT_IS_TOO_LOW' ||\n ctx.error?.code === 'MIN_WITHDRAWAL_AMOUNT_ERROR'\n ) {\n return (\n <div className=\"gap-sw-md flex flex-col\">\n <Button state=\"error\" {...commonBtnProps}>\n {t('submit.error.amountTooLow.label', 'Amount is too low')}\n </Button>\n <ErrorMessage>\n <Trans i18nKey=\"submit.error.amountTooLow.message\">\n Amount you entered is very low. Please try increasing it{' '}\n <span className=\"text-nowrap\">\n above <TinyNumber value={ctx.error.meta.minAmount ?? '0'} />{' '}\n {ctx.sourceToken?.symbol ?? ''}.\n </span>\n </Trans>\n </ErrorMessage>\n </div>\n );\n }\n\n // other quote errors\n if (ctx.quoteStatus === 'error') {\n return (\n <div className=\"gap-sw-md flex flex-col\">\n <Button state=\"error\" {...commonBtnProps}>\n {t('submit.error.quoteFailed.label', 'Quote failed')}\n </Button>\n <ErrorMessage>\n {t(\n 'submit.error.quoteFailed.message',\n 'We couldn’t finalize your quote. Please try again or adjust your values.',\n )}\n </ErrorMessage>\n </div>\n );\n }\n\n // transfer errors\n if (ctx.error?.code === 'TRANSFER_INVALID_INITIAL') {\n return (\n <div className=\"gap-sw-md flex flex-col\">\n <Button state=\"error\" {...commonBtnProps}>\n {t('submit.error.invalidTransferData.label', 'Invalid transfer data')}\n </Button>\n {ctx.error.meta?.message ? (\n <ErrorMessage>{ctx.error.meta.message}</ErrorMessage>\n ) : null}\n </div>\n );\n }\n\n if (ctx.error?.code === 'EXTERNAL_TRANSFER_FAILED') {\n return (\n <Button state=\"error\" {...commonBtnProps}>\n {t('submit.error.externalTransferFailed.label', 'Transfer failed')}\n </Button>\n );\n }\n\n if (ctx.error?.code === 'EXTERNAL_TRANSFER_INCOMPLETE') {\n return (\n <div className=\"gap-sw-md flex flex-col\">\n <Button state=\"error\" {...commonBtnProps}>\n {t('submit.error.externalTransferFailed.label', 'Transfer failed')}\n </Button>\n <ErrorMessage>\n {t(\n 'submit.error.externalTransferFailed.incompleteMessage',\n 'Incomplete transfer. Deposited amount will be refunded.',\n )}\n </ErrorMessage>\n </div>\n );\n }\n\n if (ctx.error?.code === 'EXTERNAL_TRANSFER_REFUNDED') {\n return (\n <div className=\"gap-sw-md flex flex-col\">\n <Button state=\"error\" {...commonBtnProps}>\n {t('submit.error.externalTransferFailed.label', 'Transfer failed')}\n </Button>\n <ErrorMessage>\n {t(\n 'submit.error.externalTransferFailed.refundedMessage',\n 'Deposited amount will be refunded.',\n )}\n </ErrorMessage>\n </div>\n );\n }\n\n if (ctx.error?.code === 'DIRECT_TRANSFER_ERROR') {\n return (\n <div className=\"gap-sw-md flex flex-col\">\n <Button state=\"error\" {...commonBtnProps}>\n {t('submit.error.transferFailed.label', 'Transfer failed')}\n </Button>\n {ctx.error.meta?.message ? (\n <ErrorMessage>{ctx.error.meta.message}</ErrorMessage>\n ) : null}\n </div>\n );\n }\n\n if (ctx.error?.code === 'SOURCE_BALANCE_INSUFFICIENT') {\n return (\n <Button state=\"error\" {...commonBtnProps}>\n {t('submit.error.insufficientBalance', 'Insufficient balance')}\n </Button>\n );\n }\n};\n\n// Lightweight \"Connect wallet\" button with minimal logic\nconst ConnectWalletButton = ({ onClick }: { onClick?: () => void }) => {\n const { t } = useTypedTranslation();\n\n return (\n <Button state=\"disabled\" {...commonBtnProps} onClick={onClick}>\n {t('submit.error.connectWallet', 'Connect wallet')}\n </Button>\n );\n};\n\nconst SubmitButtonError = () => {\n const { ctx } = useUnsafeSnapshot();\n\n return useGetErrorButton(ctx) ?? null;\n};\n\nconst SubmitButtonBase = (props: Props) => {\n const { providers, makeTransfer, onSuccess } = props;\n const { ctx } = useUnsafeSnapshot();\n const { t } = useTypedTranslation();\n const {\n isNativeNearDeposit,\n isDirectNonNearWithdrawal,\n isDirectTokenOnNearDeposit,\n isDirectNearTokenWithdrawal,\n } = useComputedSnapshot();\n\n const { make } = useMakeTransfer({ providers, makeTransfer });\n const { isSwitchingChainRequired, switchChain, isSwitchingChain } =\n useSwitchChain({ providers });\n\n const SubmitErrorButton = useGetErrorButton(ctx);\n\n const onClick = async () => {\n // Check if chain switch is needed before transfer\n if (isSwitchingChainRequired) {\n const switched = await switchChain();\n\n if (!switched) {\n return; // User cancelled or error occurred\n }\n }\n\n const transferResult = await make();\n\n if (transferResult) {\n onSuccess(transferResult);\n }\n };\n\n if (!ctx.targetToken) {\n return (\n <Button {...commonBtnProps} state=\"disabled\">\n {t('submit.disabled.selectTokenToReceive', 'Select token to receive')}\n </Button>\n );\n }\n\n if (!isNotEmptyAmount(ctx.sourceTokenAmount)) {\n return (\n <Button {...commonBtnProps} state=\"disabled\">\n {t('submit.disabled.enterAmount', 'Enter amount')}\n </Button>\n );\n }\n\n if (ctx.areInputsValidating) {\n return (\n <Button state=\"loading\" {...commonBtnProps}>\n {t('submit.pending.validating', 'Validating...')}\n </Button>\n );\n }\n\n // Show switching state while chain is being switched\n if (isSwitchingChain) {\n return (\n <Button state=\"loading\" {...commonBtnProps}>\n {t('submit.pending.switchingChain', 'Switching network...')}\n </Button>\n );\n }\n\n // Chain switching required - skip error checks\n // because balance/errors are checked on current chain, not target chain\n // The onClick handler will automatically switch the chain before proceeding\n if (!isSwitchingChainRequired && SubmitErrorButton) {\n return SubmitErrorButton;\n }\n\n if (ctx.transferStatus.status === 'pending') {\n switch (ctx.transferStatus.reason) {\n case 'WAITING_CONFIRMATION':\n return (\n <Button state=\"loading\" {...commonBtnProps}>\n {t('submit.pending.transfer.confirmInWallet', 'Confirm in wallet')}\n </Button>\n );\n case 'PROCESSING':\n default:\n return (\n <Button state=\"loading\" {...commonBtnProps}>\n {t('submit.pending.transfer.finalizing', 'Finalizing transfer')}\n </Button>\n );\n }\n }\n\n if (ctx.transferStatus.status === 'error') {\n return (\n <div className=\"gap-sw-md flex flex-col\">\n <Button {...commonBtnProps}>{props.label}</Button>\n <ErrorMessage>\n {(() => {\n switch (ctx.error?.code) {\n case 'FEES_NOT_ESTIMATED':\n return t(\n 'submit.error.transfer.noFees',\n 'Transfer fees could not be estimated.',\n );\n default:\n return t(\n 'submit.error.transfer.failed',\n 'Transfer can not be completed.',\n );\n }\n })()}\n </ErrorMessage>\n </div>\n );\n }\n\n if (ctx.quoteStatus === 'pending') {\n return (\n <Button state=\"loading\" {...commonBtnProps}>\n {ctx.quote\n ? t('submit.pending.quote.refreshing', 'Refreshing quote')\n : t('submit.pending.quote.finalizing', 'Finalizing quote')}\n </Button>\n );\n }\n\n if (ctx.error) {\n return (\n <Button state=\"disabled\" {...commonBtnProps}>\n {props.label}\n </Button>\n );\n }\n\n if (\n !ctx.quote &&\n !isDirectNonNearWithdrawal &&\n !isDirectTokenOnNearDeposit &&\n !isDirectNearTokenWithdrawal &&\n !isNativeNearDeposit\n ) {\n return (\n <Button state=\"disabled\" {...commonBtnProps}>\n {props.label}\n </Button>\n );\n }\n\n return (\n <Button {...commonBtnProps} onClick={onClick}>\n {props.label}\n </Button>\n );\n};\n\n// Full button logic - only runs when wallet is connected\nconst SubmitButtonWithWallet = (props: Props) => {\n const { t } = useTypedTranslation();\n const { ctx } = useUnsafeSnapshot();\n const errorButton = useGetErrorButton(ctx);\n\n // 1. External deposit (QR code) mode? Show waiting/processing state\n if (ctx.isDepositFromExternalWallet) {\n if (!isNotEmptyAmount(ctx.sourceTokenAmount)) {\n return (\n <Button {...commonBtnProps} state=\"disabled\">\n {t('submit.disabled.enterAmount', 'Enter amount')}\n </Button>\n );\n }\n\n if (ctx.externalDepositTxReceived) {\n return (\n <Button state=\"loading\" {...commonBtnProps}>\n {t('submit.pending.externalDeposit.processing', 'Processing')}\n </Button>\n );\n }\n\n return (\n <Button state=\"loading\" {...commonBtnProps}>\n {t('submit.pending.externalDeposit.waiting', 'Waiting for transaction')}\n </Button>\n );\n }\n\n // 2. Has errors? Show error button\n if (errorButton) {\n return errorButton;\n }\n\n // 3. All good - show active button\n return <SubmitButtonBase {...props} />;\n};\n\n// Performant wrapper - minimal logic when no wallet, full logic when connected\nconst SubmitButton = (props: Props) => {\n const { ctx } = useUnsafeSnapshot();\n const config = useConfig();\n\n // 1. No wallet? Return lightweight button immediately (best performance)\n if (!ctx.walletAddress) {\n return <ConnectWalletButton onClick={config.onWalletSignin} />;\n }\n\n // 2. Has wallet - run full logic (call remaining hooks only when needed)\n return <SubmitButtonWithWallet {...props} />;\n};\n\n// Attach Error as static property for backward compatibility\nSubmitButton.Error = SubmitButtonError;\n\nexport { SubmitButton };\n","import { SwapQuoteSkeleton } from './SwapQuoteSkeleton';\nimport { useConfig } from '@/config';\nimport { useUnsafeSnapshot } from '@/machine/snap';\n\nimport { Notes } from '@/components/Notes';\nimport { Accordion } from '@/components/Accordion';\nimport { formatUsdAmount } from '@/utils/formatters/formatUsdAmount';\nimport { formatTinyNumber } from '@/utils/formatters/formatTinyNumber';\nimport { useTypedTranslation } from '@/localisation';\n\ntype Props = {\n className?: string;\n};\n\nexport const SwapQuote = ({ className }: Props) => {\n const { t } = useTypedTranslation();\n const { slippageTolerance } = useConfig();\n const { ctx } = useUnsafeSnapshot();\n\n const price =\n ctx.sourceToken &&\n ctx.targetToken &&\n ctx.sourceToken.price / ctx.targetToken.price;\n\n if (!ctx.sourceToken) {\n return <SwapQuoteSkeleton />;\n }\n\n return (\n <Accordion\n expandedByDefault={false}\n expandedHeightPx={ctx.walletAddress ? 80 : 50}\n isBadgeLoading={ctx.quoteStatus === 'pending'}\n badge={ctx.quote ? `~ ${ctx.quote.timeEstimate} sec` : undefined}\n className={className}\n title={\n ctx.sourceToken && ctx.targetToken ? (\n <span style={{ borderBottomWidth: '2px', borderStyle: 'dotted' }}>\n {`1 ${ctx.sourceToken.symbol} ≈ `} {formatTinyNumber(price ?? 0)}{' '}\n {`${ctx.targetToken.symbol}`}\n <span className=\"text-sw-gray-50\">{` (${formatUsdAmount(ctx.sourceToken.price)})`}</span>\n </span>\n ) : (\n <span style={{ borderBottomWidth: '2px', borderStyle: 'dotted' }}>\n {`1 ${ctx.sourceToken.symbol} ≈ `}{' '}\n {formatUsdAmount(ctx.sourceToken.price)} USD\n </span>\n )\n }>\n <Notes>\n <Notes.Item\n label={t('quote.result.maxSlippage.label', 'Max slippage')}\n value={`${(slippageTolerance / 100).toFixed(2)}%`}\n />\n {!!ctx.walletAddress && (\n <Notes.Item\n isLoading={ctx.quoteStatus === 'pending'}\n label={t('quote.result.processingTime.label', 'Processing time')}\n value={ctx.quote ? `${ctx.quote.timeEstimate} sec.` : '—'}\n />\n )}\n </Notes>\n </Accordion>\n );\n};\n","import { SwapQuote as SwapQuoteBase } from './SwapQuote';\nimport { SwapQuoteSkeleton } from './SwapQuoteSkeleton';\n\nexport const SwapQuote = Object.assign(SwapQuoteBase, {\n Skeleton: SwapQuoteSkeleton,\n});\n","import clsx from 'clsx';\n\nimport { useConfig } from '@/config';\nimport { Skeleton } from '@/components/Skeleton';\nimport { TinyNumber } from '@/components/TinyNumber';\nimport type { Token, TokenBalance } from '@/types/token';\n\ntype Props = {\n token: Token;\n balance: TokenBalance;\n isNotSufficient: boolean;\n onClick?: () => void;\n};\n\nexport const WalletBalance = ({\n token,\n balance,\n isNotSufficient = false,\n onClick,\n}: Props) => {\n const config = useConfig();\n\n if (\n !token.isIntent &&\n !config.walletSupportedChains.includes(token.blockchain)\n ) {\n return <span />;\n }\n\n if (balance === undefined) {\n return <Skeleton width={100} />;\n }\n\n return (\n <span\n onClick={balance ? onClick : undefined}\n // unable to make border-bottom work via tailwind\n style={\n balance\n ? { borderBottomWidth: '2px', borderStyle: 'dotted' }\n : undefined\n }\n className={clsx('text-sw-label-sm', {\n 'text-sw-status-error': isNotSufficient,\n 'text-sw-gray-100': !isNotSufficient,\n 'cursor-pointer': !!balance && !!onClick,\n })}>\n <TinyNumber\n decimals={token.decimals}\n value={balance === undefined ? '0' : `${balance}`}\n />\n </span>\n );\n};\n","import { useId } from 'react';\n\nimport { WalletBalance } from './WalletBalance';\nimport { getBalancePortion } from './utils/getBalancePortion';\nimport { getUsdDisplayAmount } from './utils/getUsdDisplayAmount';\n\nimport { TokenInputHeading } from './TokenInputHeading';\nimport { useUnsafeSnapshot } from '../../machine';\nimport { cn } from '@/utils/cn';\nimport { noop } from '@/utils/noop';\nimport { useConfig } from '@/config';\nimport { useTypedTranslation } from '@/localisation';\n\nimport { Card } from '@/components/Card';\nimport { Badge } from '@/components/Badge';\nimport { TokenIcon } from '@/components/TokenIcon';\nimport { InputAmount } from '@/components/InputAmount';\nimport type { Token, TokenBalance } from '@/types/token';\n\nexport type Msg =\n | { type: 'on_click_select_token' }\n | { type: 'on_select_token'; token: Token }\n | { type: 'on_change_amount'; amount: string };\n\nexport type Props = {\n token: Token;\n balance: TokenBalance;\n value?: string;\n quoteUsdDelta?: number;\n quoteUsdValue?: number;\n showBalance?: boolean;\n showQuickBalanceActions?: boolean;\n state?: 'default' | 'disabled' | 'error' | 'error-balance';\n onMsg: (msg: Msg) => void;\n heading: string;\n};\n\nexport const TokenInputWithToken = ({\n token,\n balance,\n value = '',\n quoteUsdDelta,\n quoteUsdValue,\n state = 'default',\n showBalance = true,\n showQuickBalanceActions = true,\n heading,\n onMsg,\n}: Props) => {\n const inputName = useId();\n const { ctx } = useUnsafeSnapshot();\n const { t } = useTypedTranslation();\n const { hideTokenInputHeadings } = useConfig();\n\n const usdAmount = getUsdDisplayAmount(token, value, quoteUsdValue);\n\n const onSetPortionOfBalance = (div: number) => {\n onMsg({\n type: 'on_change_amount',\n amount: getBalancePortion(balance, token.decimals, div),\n });\n };\n\n return (\n <Card className=\"flex flex-col\" aria-label={heading}>\n {!hideTokenInputHeadings && (\n <TokenInputHeading>{heading}</TokenInputHeading>\n )}\n <div\n className={cn(\n 'flex items-center justify-between',\n !hideTokenInputHeadings && 'mt-sw-2xl',\n )}>\n <InputAmount\n value={value}\n name={inputName}\n setValue={noop}\n placeholder=\"0\"\n state={state === 'default' || state === 'disabled' ? state : 'error'}\n onChange={(e) => {\n onMsg({ type: 'on_change_amount', amount: e.target.value });\n }}\n />\n <button\n type=\"button\"\n onClick={\n state === 'disabled'\n ? undefined\n : () => onMsg({ type: 'on_click_select_token' })\n }\n className={cn(\n 'gap-sw-md pl-sw-sm pr-sw-md flex h-[36px] min-w-[80px] shrink-0 items-center rounded-sw-md transition-colors bg-sw-gray-800 hover:bg-sw-gray-700 group',\n {\n 'cursor-pointer': state !== 'disabled',\n 'animate-pulse cursor-default': state === 'disabled',\n },\n )}>\n <TokenIcon\n token={token}\n chainShowIcon={!token.isIntent}\n className=\"border-sw-gray-800 group-hover:border-sw-gray-700 transition-colors top-[14px]\"\n />\n <span className=\"text-sw-label-md text-sw-gray-50\">\n {token.symbol}\n </span>\n </button>\n </div>\n <div className=\"gap-sw-sm min-h-sw-2xl flex items-center justify-between mt-sw-lg\">\n <div className=\"gap-sw-md flex items-center\">\n <span className=\"text-sw-label-sm text-sw-gray-100\">{usdAmount}</span>\n {quoteUsdDelta ? (\n <span\n className={cn('text-sw-label-sm text-nowrap', {\n 'text-sw-gray-400': quoteUsdDelta >= -2 && quoteUsdDelta <= 2,\n 'text-sw-status-success': quoteUsdDelta > 2,\n 'text-sw-status-error': quoteUsdDelta <= -5,\n 'text-sw-status-warning':\n quoteUsdDelta < -2 && quoteUsdDelta > -5,\n })}>\n {`${quoteUsdDelta > 0 ? '+' : ''}${quoteUsdDelta.toFixed(2)}%`}\n </span>\n ) : null}\n </div>\n <div className=\"gap-sw-sm flex items-center\">\n {token && !!ctx.walletAddress && showBalance && (\n <WalletBalance\n token={token}\n balance={balance}\n isNotSufficient={state === 'error-balance'}\n onClick={() => onSetPortionOfBalance(1)}\n />\n )}\n\n {!!balance && showBalance && showQuickBalanceActions && (\n <>\n <Badge\n isClickable={state !== 'disabled'}\n onClick={() => onSetPortionOfBalance(2)}>\n {t('tokens.input.half.label', '50%')}\n </Badge>\n <Badge\n isClickable={state !== 'disabled'}\n onClick={() => onSetPortionOfBalance(1)}>\n {t('tokens.input.max.label', 'Max')}\n </Badge>\n </>\n )}\n\n {!showBalance && (\n <div className=\"rounded-full bg-sw-gray-700 py-sw-xs px-sw-sm flex items-center justify-center\">\n <span className=\"text-sw-gray-100 text-sw-label-sm\">\n {t('tokens.input.externalBalance.label', 'External balance')}\n </span>\n </div>\n )}\n </div>\n </div>\n </Card>\n );\n};\n","import { useConfig } from '../../config';\nimport { cn } from '../../utils';\nimport { TokenInputHeading } from './TokenInputHeading';\nimport { Card } from '@/components/Card';\n\ntype Msg = { type: 'on_click_select_token' };\n\ntype Props = {\n onMsg: (msg: Msg) => void;\n heading: string;\n};\n\nexport const TokenInputEmpty = ({ onMsg, heading }: Props) => {\n const { hideTokenInputHeadings } = useConfig();\n\n return (\n <Card\n isClickable\n className=\"flex flex-col\"\n onClick={() => onMsg({ type: 'on_click_select_token' })}>\n {!hideTokenInputHeadings && (\n <TokenInputHeading>{heading}</TokenInputHeading>\n )}\n <div\n className={cn(\n 'flex items-center justify-between',\n !hideTokenInputHeadings && 'mt-sw-2xl',\n )}>\n <span\n className=\"h-[36px] font-medium text-sw-gray-200\"\n style={{ fontSize: '32px' }}>\n 0\n </span>\n <button\n type=\"button\"\n onClick={() => onMsg({ type: 'on_click_select_token' })}\n className=\"gap-sw-md px-sw-md flex h-[36px] min-w-[100px] shrink-0 cursor-pointer items-center rounded-sw-md bg-sw-gray-800\">\n <span className=\"text-sw-label-md text-sw-gray-50\">Select token</span>\n </button>\n </div>\n <div className=\"h-sw-2xl w-full mt-sw-lg\" />\n </Card>\n );\n};\n","import { useEffect, useState } from 'react';\n\nimport { useMergedBalance } from '@/hooks/useMergedBalance';\nimport { getTokenBalanceKey } from '@/utils/intents/getTokenBalanceKey';\nimport type { Token } from '@/types/token';\n\nexport const useTokenInputBalance = (token: Token | undefined) => {\n const { mergedBalance } = useMergedBalance();\n\n const [sourceTokenBalance, setSourceTokenBalance] = useState(\n token ? mergedBalance[getTokenBalanceKey(token)] : undefined,\n );\n\n useEffect(() => {\n let timeoutId: NodeJS.Timeout | undefined;\n\n if (token) {\n const existingBalance = mergedBalance[getTokenBalanceKey(token)];\n\n if (!existingBalance) {\n // if no balance can be fetched, we set 0 after 2s to avoid infinite loading state\n timeoutId = setTimeout(() => {\n setSourceTokenBalance(\n token ? (mergedBalance[getTokenBalanceKey(token)] ?? 0) : 0,\n );\n }, 2000);\n } else {\n timeoutId = setTimeout(() => {\n setSourceTokenBalance(existingBalance);\n }, 0);\n }\n }\n\n return () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n }, [token, mergedBalance]);\n\n return sourceTokenBalance;\n};\n","import { useEffect } from 'react';\nimport { useTokens } from './useTokens';\nimport { Token } from '../types';\n\nexport const useDefaultToken = (\n variant: 'source' | 'target',\n onMsg: (msg: { type: 'on_select_token'; token: Token }) => void,\n) => {\n const { tokens } = useTokens(variant);\n\n // The set is needed here as, at the time of writing, the tokens list will\n // include two variants of each asset, with isIntent set as true or false.\n const uniqueAssetIds = Array.from(\n new Set(tokens.map((token) => token.assetId)),\n );\n\n // If there is only one token for a given variant, select it by default\n useEffect(() => {\n const singleToken = uniqueAssetIds.length === 1 ? tokens[0] : null;\n\n if (singleToken) {\n onMsg({ type: 'on_select_token', token: singleToken });\n }\n }, [tokens]);\n};\n","import { useMemo } from 'react';\n\nimport { Msg, TokenInputWithToken } from './TokenInput';\nimport { TokenInputEmpty } from './TokenInputEmpty';\nimport { useTokenInputBalance } from './hooks';\nimport { useDefaultToken } from '../../hooks/useDefaultToken';\nimport { formatBigToHuman } from '@/utils/formatters/formatBigToHuman';\nimport { useUnsafeSnapshot } from '@/machine/snap';\n\nexport type Props = {\n heading: string;\n isChanging?: boolean;\n showBalance?: boolean;\n onMsg: (msg: Msg) => void;\n};\n\nexport const TokenInputSource = ({\n onMsg,\n isChanging = true,\n showBalance = true,\n heading,\n}: Props) => {\n const { ctx } = useUnsafeSnapshot();\n const sourceTokenBalance = useTokenInputBalance(ctx.sourceToken);\n\n useDefaultToken('source', onMsg);\n\n const sourceInputState = useMemo(() => {\n if (!isChanging && ctx.quoteStatus === 'pending') {\n return 'disabled' as const;\n }\n\n if (!ctx.error) {\n return 'default' as const;\n }\n\n if (ctx.error.code === 'QUOTE_AMOUNT_IS_TOO_LOW') {\n return 'error' as const;\n }\n\n if (ctx.error.code === 'SOURCE_BALANCE_INSUFFICIENT') {\n return 'error-balance' as const;\n }\n }, [isChanging, ctx.error, ctx.quoteStatus]);\n\n if (!ctx.sourceToken) {\n return <TokenInputEmpty heading={heading} onMsg={onMsg} />;\n }\n\n return (\n <TokenInputWithToken\n heading={heading}\n token={ctx.sourceToken}\n state={sourceInputState}\n balance={sourceTokenBalance}\n showBalance={showBalance}\n showQuickBalanceActions\n value={formatBigToHuman(ctx.sourceTokenAmount, ctx.sourceToken?.decimals)}\n onMsg={onMsg}\n />\n );\n};\n","import { useMemo } from 'react';\n\nimport { Msg, TokenInputWithToken } from './TokenInput';\nimport { TokenInputEmpty } from './TokenInputEmpty';\nimport { useTokenInputBalance } from './hooks';\nimport { useDefaultToken } from '../../hooks/useDefaultToken';\nimport { formatBigToHuman } from '@/utils/formatters/formatBigToHuman';\nimport { useComputedSnapshot, useUnsafeSnapshot } from '@/machine/snap';\n\nexport type Props = {\n isChanging?: boolean;\n onMsg: (msg: Msg) => void;\n heading: string;\n};\n\nexport const TokenInputTarget = ({\n isChanging = false,\n onMsg,\n heading,\n}: Props) => {\n const { ctx } = useUnsafeSnapshot();\n const { usdTradeDelta } = useComputedSnapshot();\n const targetTokenBalance = useTokenInputBalance(ctx.targetToken);\n\n useDefaultToken('target', onMsg);\n\n const sourceInputState = useMemo(() => {\n if (!isChanging && ctx.quoteStatus === 'pending') {\n return 'disabled' as const;\n }\n\n return 'default' as const;\n }, [isChanging, ctx.quoteStatus]);\n\n if (!ctx.targetToken) {\n return <TokenInputEmpty heading={heading} onMsg={onMsg} />;\n }\n\n return (\n <TokenInputWithToken\n heading={heading}\n token={ctx.targetToken}\n balance={targetTokenBalance}\n quoteUsdDelta={usdTradeDelta?.percentage}\n quoteUsdValue={ctx.quote && parseFloat(ctx.quote.amountOutUsd)}\n value={formatBigToHuman(ctx.targetTokenAmount, ctx.targetToken?.decimals)}\n state={sourceInputState}\n showQuickBalanceActions={false}\n showBalance={true}\n onMsg={onMsg}\n />\n );\n};\n","// base components\nimport { TokenInputWithToken } from './TokenInput';\nimport { TokenInputEmpty } from './TokenInputEmpty';\nimport { TokenInputSkeleton } from './TokenInputSkeleton';\nimport type { Props as PropsBase } from './TokenInput';\n\n// pre-configured presets\nimport { TokenInputSource } from './TokenInputSource';\nimport { TokenInputTarget } from './TokenInputTarget';\nimport { Token } from '@/types/token';\n\ntype Props = {\n token?: Token;\n} & Omit<PropsBase, 'token'>;\n\nexport const TokenInputBase = ({ token, heading, ...props }: Props) => {\n return token ? (\n <TokenInputWithToken {...props} token={token} heading={heading} />\n ) : (\n <TokenInputEmpty onMsg={props.onMsg} heading={heading} />\n );\n};\n\nexport const TokenInput = Object.assign(TokenInputBase, {\n Skeleton: TokenInputSkeleton,\n Source: TokenInputSource,\n Target: TokenInputTarget,\n});\n","import { cn } from '@/utils/cn';\nimport { useConfig } from '@/config';\nimport { useUnsafeSnapshot } from '@/machine/snap';\nimport { TokenIcon } from '@/components/TokenIcon';\nimport { TinyNumber } from '@/components/TinyNumber';\nimport { getUsdDisplayBalance } from '@/utils/formatters/getUsdDisplayBalance';\nimport type { Token, TokenBalance } from '@/types/token';\n\nexport const TOKEN_ITEM_HEIGHT = 58;\n\ntype Msg = { type: 'on_select_token'; token: Token };\n\ntype Props = {\n token: Token;\n balance: TokenBalance;\n showBalance?: boolean;\n isNotSelectable?: boolean;\n className?: string;\n onMsg: (msg: Msg) => void;\n};\n\nexport const TokenItem = ({\n token,\n balance,\n showBalance = true,\n isNotSelectable,\n className,\n onMsg,\n}: Props) => {\n const { ctx } = useUnsafeSnapshot();\n const { walletSupportedChains, appName } = useConfig();\n const displayUsdBalance = getUsdDisplayBalance(balance, token);\n const isTokenSupported =\n walletSupportedChains.includes(token.blockchain) || token.isIntent;\n\n const hasBalance = balance !== '0' && balance !== 0 && balance !== undefined;\n\n return (\n <li className=\"list-none group\">\n <div\n className={cn(\n 'gap-sw-lg p-sw-lg flex justify-between rounded-sw-md transition-colors',\n {\n 'cursor-not-allowed': isNotSelectable,\n 'cursor-pointer hover:bg-sw-gray-800': !isNotSelectable,\n },\n className,\n )}\n onClick={() =>\n !isNotSelectable && onMsg({ type: 'on_select_token', token })\n }>\n <TokenIcon\n token={token}\n chainShowIcon={!token.isIntent}\n className=\"border-sw-gray-900 group-hover:border-sw-gray-800 transition-colors\"\n />\n\n <div className=\"gap-sw-xs mr-auto flex flex-col\">\n <span className=\"text-sw-label-md text-sw-gray-50\">{token.name}</span>\n {token.isIntent ? (\n <div className=\"flex items-center gap-sw-xs\">\n <span className=\"text-sw-label-md text-sw-gray-300\">\n {token.symbol}\n </span>{' '}\n <span className=\"text-sw-label-sm text-sw-gray-300\">{`on ${appName} ${token.chainName.toLowerCase() !== 'near' && hasBalance ? `(${token.chainName})` : ''}`}</span>\n </div>\n ) : (\n <div className=\"flex items-center gap-sw-xs\">\n <span className=\"text-sw-label-md text-sw-gray-300\">\n {token.symbol}\n </span>{' '}\n <span className=\"text-sw-label-sm text-sw-gray-300\">{`on ${token.chainName}`}</span>\n </div>\n )}\n </div>\n\n {isTokenSupported && !!ctx.walletAddress && showBalance && (\n <div className=\"gap-sw-xs flex flex-col items-end\">\n {balance === undefined && !token.isIntent ? (\n <span className=\"h-[16px] w-[60px] animate-pulse rounded-full bg-sw-gray-700\" />\n ) : (\n <span className=\"h-[16px] text-sw-label-md text-sw-gray-50\">\n {hasBalance && (\n <TinyNumber\n decimals={token.decimals}\n value={balance === undefined ? '0' : `${balance}`}\n />\n )}\n </span>\n )}\n {hasBalance && (\n <span className=\"text-sw-label-sm text-sw-gray-300\">\n {displayUsdBalance}\n </span>\n )}\n </div>\n )}\n </div>\n </li>\n );\n};\n","import { useMemo } from 'react';\n\nimport { useTokens } from './useTokens';\n\n// 1. By default we use unique check by: NEAR blockchain + SYMBOL\n// 2. If token has no Near blockchain - we show it as is e.g. ZCASH etc.\n// 3. Some tokens can have multiple chains but different symbols so 1. check\n// fails and we need a manual mapping for such cases\n//\n// Tokens: cbBTC (base), cbBTC (eth), wBTC (near), xBTC (sol), wETH (gnosis), wNEAR (near) + ETH (near), BTC (near), NEAR\nconst uniqueIntentTokensFilter = [\n 'nep141:eth-0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.omft.near', // cbBTC (eth)\n 'nep141:base-0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf.omft.near', // cbBTC (base)\n 'nep141:gnosis-0x6a023ccd1ff6f2045c3309768ead9e68f978f6e1.omft.near', // wETH (gnosis)\n 'nep141:2260fac5e5542a773aa44fbcfedf7c193bc2c599.factory.bridge.near', // wBTC (near)\n 'nep245:v2_1.omni.hot.tg:56_SZzgw3HSudhZcTwPWUTi2RJB19t', // NEAR (bsc)\n 'nep141:eth-0xe0f63a424a4439cbe457d80e4f4b51ad25b2c56c.omft.near', // SPX (eth)\n];\n\nexport const useTokensIntentsUnique = () => {\n const { tokens } = useTokens();\n\n return {\n uniqueIntentsTokens: useMemo(() => {\n const nearTokens = tokens.filter(\n (t) =>\n t.isIntent &&\n t.blockchain === 'near' &&\n !uniqueIntentTokensFilter.includes(t.assetId),\n );\n\n const nearTokenSymbols = nearTokens.map((t) => t.isIntent && t.symbol);\n const notNearTokens = tokens.filter((t) => {\n return (\n t.isIntent &&\n t.blockchain !== 'near' &&\n !nearTokenSymbols.includes(t.symbol) &&\n !uniqueIntentTokensFilter.includes(t.assetId)\n );\n });\n\n return [...nearTokens, ...notNearTokens];\n }, [tokens]),\n };\n};\n","import { useChains } from './useChains';\nimport { useTokens } from './useTokens';\nimport { useMergedBalance } from './useMergedBalance';\nimport { useIntentsBalance } from './useIntentsBalance';\nimport { useTokensIntentsUnique } from './useTokensIntentsUnique';\nimport { createTokenSorter } from '@/utils/tokens/sort';\nimport { createFilterByIntents } from '@/utils/tokens/filterByIntents';\nimport { createFilterBySearch } from '@/utils/tokens/filterBySearchString';\nimport { createFilterBySelectedChain } from '@/utils/tokens/filterBySelectedChain';\nimport type { Chains, ChainsFilter } from '@/types/chain';\n\nexport type TokensFilterOptions = {\n variant: 'source' | 'target';\n search: string;\n selectedChain: Chains | 'all' | 'intents';\n chainsFilter: ChainsFilter;\n walletSupportedChains: ReadonlyArray<Chains>;\n};\n\n// TODO: memoize\nexport const useTokensFiltered = ({\n variant,\n search,\n selectedChain,\n chainsFilter,\n walletSupportedChains,\n}: TokensFilterOptions) => {\n const chains = useChains(variant);\n const { tokens } = useTokens(variant);\n const { mergedBalance } = useMergedBalance();\n const { intentBalances } = useIntentsBalance();\n const { uniqueIntentsTokens } = useTokensIntentsUnique();\n\n const sorter = createTokenSorter(\n mergedBalance,\n walletSupportedChains,\n search,\n );\n\n const filteredTokens = tokens\n .filter(createFilterBySearch({ search, chains }))\n .filter(\n createFilterBySelectedChain({\n search,\n selectedChain,\n chainsFilter,\n walletSupportedChains,\n intentBalances,\n uniqueIntentTokenIds: uniqueIntentsTokens.map((t) => t.assetId),\n }),\n );\n\n return {\n all: filteredTokens.sort(sorter),\n intents: filteredTokens\n .filter(createFilterByIntents({ isIntent: true }))\n .sort(sorter),\n wallet: filteredTokens\n .filter(createFilterByIntents({ isIntent: false }))\n .sort(sorter),\n };\n};\n","import { VList } from 'virtua';\nimport { Fragment, useMemo } from 'react';\n\nimport { TOKEN_ITEM_HEIGHT, TokenItem } from './TokenItem';\nimport { TokensListPlaceholder } from './TokensListPlaceholder';\nimport { cn } from '@/utils/cn';\nimport { Hr } from '@/components/Hr';\nimport { useUnsafeSnapshot } from '@/machine/snap';\nimport { useMergedBalance } from '@/hooks/useMergedBalance';\nimport { useTokensFiltered } from '@/hooks/useTokensFiltered';\nimport { getTokenBalanceKey } from '@/utils/intents/getTokenBalanceKey';\nimport { useTypedTranslation } from '@/localisation';\nimport { useConfig } from '@/config';\n\nimport type { Chains, ChainsFilter } from '@/types/chain';\nimport type { Token } from '@/types/token';\n\ntype Msg =\n | { type: 'on_select_token'; token: Token }\n | { type: 'on_reset_search' };\n\ntype Props = {\n variant: 'source' | 'target';\n search: string;\n groupTokens: boolean;\n showBalances: boolean;\n chainsFilter: ChainsFilter;\n selectedChain: 'all' | 'intents' | Chains;\n chainIsNotSupported: boolean;\n className?: string;\n onMsg: (msg: Msg) => void;\n};\n\nconst useListState = (tokens: ReadonlyArray<Token>, search: string) => {\n if (tokens.length === 0 && search) {\n return 'EMPTY_SEARCH';\n }\n\n if (tokens.length === 0 && !search) {\n return 'NO_TOKENS';\n }\n\n return 'HAS_TOKENS';\n};\n\nexport const TokensList = ({\n variant,\n search,\n className,\n groupTokens,\n showBalances,\n chainsFilter,\n selectedChain,\n chainIsNotSupported,\n onMsg,\n}: Props) => {\n const { t } = useTypedTranslation();\n const { ctx } = useUnsafeSnapshot();\n const { walletSupportedChains, appName } = useConfig();\n const { mergedBalance } = useMergedBalance();\n\n const filteredTokens = useTokensFiltered({\n variant,\n search,\n chainsFilter,\n selectedChain,\n walletSupportedChains,\n });\n\n const areTokensGrouped = ctx.walletAddress ? groupTokens : false;\n const tokensListState = useListState(filteredTokens.all, search);\n\n const tokensUngrouped = useMemo(\n () => [{ label: null, tokens: filteredTokens.all }],\n [filteredTokens.all],\n );\n\n const tokensBySection = useMemo(\n () => [\n { label: appName, tokens: filteredTokens.intents },\n {\n label: chainIsNotSupported ? null : 'Connected wallet',\n tokens: filteredTokens.wallet,\n },\n ],\n [filteredTokens.wallet, filteredTokens.intents, chainIsNotSupported],\n );\n\n const tokensCount = useMemo(() => {\n return (areTokensGrouped ? tokensBySection : tokensUngrouped).reduce(\n (acc, group) => acc + group.tokens.length,\n 0,\n );\n }, [tokensBySection, tokensUngrouped, areTokensGrouped]);\n\n // <offset> - user defined offset e.g. page header height + space\n // 152px - height of TokenModal elements like search and paddings\n // 48px - minimal offset from the bottom screen edge\n // Total: 152 + 48 = 200px\n // const maxHeight = `calc(100vh - (${topScreenOffset ?? '0px'} + ${offset ?? '0px'} + 200px))`;\n const maxHeight = '450px';\n\n switch (tokensListState) {\n case 'EMPTY_SEARCH':\n return (\n <TokensListPlaceholder\n hasAction\n actionType=\"outlined\"\n actionLabel={t('tokens.list.searchReset.label', 'Clear search')}\n heading={t('tokens.list.searchEmpty.label', 'No results')}\n subHeading={t(\n 'tokens.list.searchEmpty.subLabel',\n 'Try another search or check if a specific network is selected.',\n )}\n className=\"pt-sw-5xl pb-sw-5xl\"\n onClick={() => onMsg({ type: 'on_reset_search' })}\n />\n );\n\n case 'HAS_TOKENS':\n return (\n <div className={cn('gap-sw-lg flex flex-col', className)}>\n <VList\n className=\"hide-scrollbar\"\n style={{\n maxHeight,\n minHeight: 200,\n height: tokensCount\n ? tokensCount * TOKEN_ITEM_HEIGHT +\n (areTokensGrouped ? tokensBySection.length * 62 : 0)\n : TOKEN_ITEM_HEIGHT * 2,\n }}>\n {(areTokensGrouped ? tokensBySection : tokensUngrouped).map(\n ({ label, tokens: tokensToDisplay }) => (\n <Fragment key={label ?? 'ungrouped-tokens'}>\n {tokensToDisplay.length && label ? (\n <header className=\"pb-sw-lg flex flex-col\">\n <Hr />\n <span className=\"text-sw-label-sm pt-sw-xl text-sw-gray-100\">{`${label} — ${tokensToDisplay.length}`}</span>\n </header>\n ) : null}\n\n {tokensToDisplay.map((token) => {\n const tokenBalanceKey = getTokenBalanceKey(token);\n\n return (\n <TokenItem\n token={token}\n key={tokenBalanceKey}\n showBalance={showBalances}\n balance={mergedBalance[tokenBalanceKey]}\n isNotSelectable={\n chainIsNotSupported && !!ctx.walletAddress\n }\n onMsg={onMsg}\n />\n );\n })}\n\n {tokensToDisplay.length ? <div className=\"h-sw-2xl\" /> : null}\n </Fragment>\n ),\n )}\n </VList>\n </div>\n );\n\n case 'NO_TOKENS':\n default:\n return (\n <TokensListPlaceholder\n className=\"pt-sw-5xl pb-sw-5xl\"\n subHeading={t(\n 'tokens.list.noBalanceOnApp.subLabel',\n 'Deposit funds to get started',\n )}\n heading={t('tokens.list.noBalanceOnApp.label', {\n defaultValue: 'You have no balances on {{appName}}',\n appName,\n })}\n />\n );\n }\n};\n","import { TokenItem as Item } from './TokenItem';\nimport { TokensList as List } from './TokensList';\nimport { TokensListPlaceholder } from './TokensListPlaceholder';\n\nexport const TokensList = Object.assign(List, {\n Placeholder: TokensListPlaceholder,\n Item,\n});\n","import { useState } from 'react';\nimport { GetExecutionStatusResponse } from '@defuse-protocol/one-click-sdk-typescript';\nimport type { AxiosResponse } from 'axios';\n\nimport { useConfig } from '@/config';\nimport { bridgeApi } from '@/network';\nimport { WidgetError } from '@/errors';\nimport { useUnsafeSnapshot } from '@/machine';\nimport { isEvmChain } from '@/utils/evm/isEvmChain';\nimport { CHAIN_POA_MAP, POA_EVM_CHAIN_ID } from '@/constants/chains';\nimport { getIntentsAccountId } from '@/utils/intents/getIntentsAccountId';\nimport type { Chains } from '@/types/chain';\n\ntype Args = {\n depositAddress: string;\n};\n\ntype PollArgs = {\n amount: string;\n assetId: string;\n blockchain: Chains;\n};\n\ntype DepositResult = {\n chain: string;\n amount: number;\n address: string;\n account_id: string;\n created_at: string;\n near_token_id: string;\n status: 'COMPLETED' | 'PENDING' | 'FAILED' | 'CREDITED';\n tx_hash?: string;\n};\n\ntype DepositStatusResponse = {\n result: {\n deposits: DepositResult[];\n };\n};\n\nconst getMatchedDeposit = (\n response: DepositStatusResponse,\n data: {\n intentsAccountId: string;\n initiatedAtDate: string;\n depositAddress: string;\n assetId: string;\n chainId: string;\n amount: string;\n },\n) => {\n // remove nep141: prefix as Bridge API response doesn't have it\n const nearTokenId = data.assetId.substring(data.assetId.indexOf(':') + 1);\n\n // API returns amount as a number so if decimals is higher than number's precision some of the digits can be lost\n // so here we check only that amount starts with the expected value\n const isAmountMatched = (deposit: DepositResult) => {\n const normalize = (value: string) =>\n value.replace(/(\\.\\d*?[1-9])0+$/, '$1').replace(/\\.0+$/, '');\n\n const normalizedAmount = normalize(data.amount);\n const normalizedDepositAmount = normalize(\n deposit.amount.toLocaleString('en-US', {\n useGrouping: false,\n maximumFractionDigits: 20,\n }),\n );\n\n return (\n normalizedAmount.startsWith(normalizedDepositAmount) ||\n normalizedDepositAmount.startsWith(normalizedAmount)\n );\n };\n\n // only consider deposits created after the intent was initiated\n const isCreatedAfterInitiation = (deposit: DepositResult) => {\n return new Date(deposit.created_at) >= new Date(data.initiatedAtDate);\n };\n\n return (response.result.deposits || []).find(\n (deposit) =>\n deposit.chain === data.chainId &&\n deposit.account_id === data.intentsAccountId &&\n deposit.address === data.depositAddress &&\n deposit.near_token_id === nearTokenId &&\n isCreatedAfterInitiation(deposit) &&\n isAmountMatched(deposit),\n );\n};\n\nconst oneClickBridgeStatusMap: Record<\n DepositResult['status'],\n GetExecutionStatusResponse.status\n> = {\n CREDITED: GetExecutionStatusResponse.status.PROCESSING,\n PENDING: GetExecutionStatusResponse.status.PROCESSING,\n COMPLETED: GetExecutionStatusResponse.status.SUCCESS,\n FAILED: GetExecutionStatusResponse.status.FAILED,\n};\n\nexport const usePoaExternalDepositStatus = ({ depositAddress }: Args) => {\n const { ctx } = useUnsafeSnapshot();\n const { intentsAccountType } = useConfig();\n\n const [initiatedAt, setInitiatedAt] = useState<string | null>(null);\n\n const intentsAccountId = getIntentsAccountId({\n addressType: intentsAccountType,\n walletAddress: ctx.walletAddress,\n });\n\n const pollDepositStatus = async ({\n blockchain,\n amount,\n assetId,\n }: PollArgs) => {\n if (!intentsAccountId) {\n throw new WidgetError('Unknown intents account for POA deposit check');\n }\n\n let chainId = CHAIN_POA_MAP[blockchain];\n\n if (!chainId) {\n const isEvm = isEvmChain(blockchain);\n\n if (isEvm) {\n chainId = POA_EVM_CHAIN_ID;\n } else {\n throw new WidgetError(\n `Unknown chain for POA deposit check ${blockchain}`,\n );\n }\n }\n\n const initiatedAtDate = initiatedAt ?? new Date().toUTCString();\n\n if (!initiatedAt) {\n setInitiatedAt(initiatedAtDate);\n }\n\n const response = await bridgeApi.post<\n DepositStatusResponse,\n AxiosResponse<DepositStatusResponse>\n >('', {\n id: 1,\n jsonrpc: '2.0',\n method: 'recent_deposits',\n params: [\n {\n account_id: intentsAccountId,\n chain: chainId,\n },\n ],\n });\n\n const matchedDeposit = getMatchedDeposit(response.data, {\n intentsAccountId,\n initiatedAtDate,\n depositAddress,\n chainId,\n assetId,\n amount,\n });\n\n if (!matchedDeposit) {\n return {\n status: GetExecutionStatusResponse.status.PENDING_DEPOSIT,\n swapDetails: {\n destinationChainTxHashes: [{ hash: '' }],\n intentHashes: [''],\n },\n };\n }\n\n return {\n status: oneClickBridgeStatusMap[matchedDeposit.status],\n swapDetails: {\n intentHashes: [''],\n destinationChainTxHashes: [{ hash: matchedDeposit.tx_hash ?? '' }],\n },\n };\n };\n\n return { pollDepositStatus };\n};\n","import { createContext, type ReactNode, useEffect, useMemo } from 'react';\n\nimport { ColorPalette, ColorScheme, HexColor, Theme } from '../types/theme';\nimport { ColorStop, createColorPalette } from './createColorPalette';\nimport { useConfig } from '@/config';\n\nconst setColorVariables = (\n palette: ColorPalette,\n colorKey: string,\n parentEl: Element | null,\n) => {\n let parentElement = document.body;\n\n if (parentEl instanceof HTMLElement) {\n parentElement = parentEl;\n }\n\n Object.entries(palette).forEach(([key, value]) => {\n parentElement.style.setProperty(`--c-sw-${colorKey}-${key}`, value);\n });\n};\n\nconst setColorPalette = (\n colorKey: string,\n colorStop: ColorStop,\n parentEl: Element | null,\n baseColor: HexColor,\n colorScheme: ColorScheme,\n) => {\n const palette = createColorPalette(baseColor, colorScheme, colorStop);\n\n if (!palette) {\n return;\n }\n\n setColorVariables(palette, colorKey, parentEl);\n};\n\nconst loadTheme = (parentEl: Element | null, theme: Theme) => {\n const { primaryColor, surfaceColor, colorScheme = 'dark' } = theme;\n\n if (primaryColor) {\n setColorPalette('accent', 500, parentEl, primaryColor, colorScheme);\n }\n\n if (surfaceColor) {\n setColorPalette('gray', 950, parentEl, surfaceColor, colorScheme);\n }\n};\n\nexport const ThemeContext = createContext<Theme | undefined>(undefined);\n\ntype ThemeProviderProps = {\n children: ReactNode;\n theme?: Theme;\n};\n\nexport const ThemeProvider = ({ children, theme }: ThemeProviderProps) => {\n const { themeParentElementSelector } = useConfig();\n const value = useMemo((): Theme | undefined => theme, [theme]);\n\n useEffect(() => {\n if (theme) {\n const themeParentElement = themeParentElementSelector\n ? document.querySelector(themeParentElementSelector)\n : null;\n\n loadTheme(themeParentElement, theme);\n }\n }, [theme]);\n\n return (\n <ThemeContext.Provider value={value}>\n <div className=\"sw\">{children}</div>\n </ThemeContext.Provider>\n );\n};\n","import {\n AccountBalanceWalletFill,\n ArmingCountdownFill,\n BeenhereFill,\n CheckCircleFill,\n EncryptedFill,\n GppBadFill,\n type MaterialSymbolsComponent,\n} from '@material-symbols-svg/react-rounded';\nimport { useTimer } from 'use-timer';\nimport { useEffect } from 'react';\n\nimport { useTypedTranslation } from '@/localisation';\n\nimport { cn } from '@/utils';\nimport { useHandleKeyDown } from '@/hooks';\nimport { Button, Card, CloseButton } from '@/components';\n\ntype Msg = { type: 'on_close' | 'on_check_compatibility' | 'on_sign_out' };\ntype MsgError = { type: 'on_close' | 'on_try_again' | 'on_sign_out' };\n\ninterface Props {\n isSigned: boolean;\n isSigning: boolean;\n onMsg: (msg: Msg) => void;\n}\n\nconst ListItem = ({\n text,\n icon: Icon,\n}: {\n text: string;\n icon: MaterialSymbolsComponent;\n}) => (\n <li className=\"flex items-center gap-sw-md\">\n {Icon && <Icon size={20} className=\"text-sw-gray-300\" />}\n <span className=\"text-sw-label-md text-sw-gray-50\">{text}</span>\n </li>\n);\n\nconst FakeButton = ({\n label,\n icon: Icon,\n className,\n}: {\n label: string;\n icon?: MaterialSymbolsComponent;\n className?: string;\n}) => (\n <div\n className={cn(\n 'rounded-sw-lg flex align-center justify-center gap-sw-md w-full py-sw-2xl',\n className,\n )}>\n {Icon && <Icon size={16} />}\n <span className=\"text-sw-label-md\">{label}</span>\n </div>\n);\n\nexport const Initial = ({ isSigned, isSigning, onMsg }: Props) => {\n const { t } = useTypedTranslation();\n const handleClose = () => onMsg({ type: 'on_close' });\n\n useHandleKeyDown('Escape', handleClose);\n\n const showTimer = useTimer({\n endTime: 0,\n autostart: false,\n timerType: 'DECREMENTAL',\n initialTime: 7,\n onTimeOver: handleClose,\n });\n\n useEffect(() => {\n if (isSigned) {\n showTimer.start();\n } else {\n showTimer.reset();\n }\n }, [isSigned]);\n\n return (\n <Card className=\"relative w-full gap-sw-2xl flex flex-col\">\n <CloseButton\n onClick={handleClose}\n className=\"absolute top-sw-2xl right-sw-2xl\"\n />\n <ArmingCountdownFill size={48} className=\"text-sw-status-warning\" />\n\n <header className=\"flex flex-col gap-sw-lg\">\n <h1 className=\"text-sw-label-lg text-sw-gray-50\">\n {t(\n 'walletCompatibility.modal.title.initial',\n 'Verify your wallet to continue',\n )}\n </h1>\n <p className=\"text-sw-body-md text-sw-gray-200\">\n {t(\n 'walletCompatibility.modal.description.initial',\n 'Please sign a message to verify your wallet. This confirms your wallet is compatible and lets us securely read your public key.',\n )}\n </p>\n </header>\n\n <ul className=\"flex flex-col gap-sw-xl\">\n <ListItem\n text={t(\n 'walletCompatibility.modal.feature.secureTransactions',\n 'Read-only signature – no gas required.',\n )}\n icon={BeenhereFill}\n />\n <ListItem\n text={t(\n 'walletCompatibility.modal.feature.fullAccess',\n 'No access to your funds, no hidden permissions.',\n )}\n icon={EncryptedFill}\n />\n <ListItem\n text={t(\n 'walletCompatibility.modal.feature.fundProtection',\n 'Only checks whether your wallet is supported.',\n )}\n icon={AccountBalanceWalletFill}\n />\n </ul>\n\n {isSigned ? (\n <div className=\"flex flex-col gap-sw-xl mt-sw-lg w-full\">\n <FakeButton\n label={t(\n 'walletCompatibility.modal.button.verified',\n 'Wallet verified',\n )}\n className=\"bg-sw-status-success text-sw-gray-950\"\n icon={CheckCircleFill}\n />\n {showTimer.status === 'RUNNING' && (\n <FakeButton\n className=\"text-sw-gray-400\"\n label={t('walletCompatibility.modal.button.closeTimer', {\n defaultValue: 'Popup will close in {{count}} sec...',\n count: showTimer.time,\n })}\n />\n )}\n </div>\n ) : (\n <div className=\"flex flex-col gap-sw-xl mt-sw-lg\">\n <Button\n size=\"lg\"\n variant=\"primary\"\n onClick={() => onMsg({ type: 'on_check_compatibility' })}>\n {t('walletCompatibility.modal.button.verify', 'Verify wallet')}\n </Button>\n <Button\n size=\"lg\"\n variant=\"outlined\"\n state={isSigning ? 'loading' : 'default'}\n onClick={() => onMsg({ type: 'on_sign_out' })}>\n {isSigning\n ? t(\n 'walletCompatibility.modal.button.signing',\n 'Sign with your wallet',\n )\n : t('walletCompatibility.modal.button.signOut', 'Sign out')}\n </Button>\n </div>\n )}\n </Card>\n );\n};\n\ninterface ErrorProps {\n onMsg: (msg: MsgError) => void;\n}\n\nexport const ErrorView = ({ onMsg }: ErrorProps) => {\n const { t } = useTypedTranslation();\n const handleClose = () => onMsg({ type: 'on_close' });\n\n useHandleKeyDown('Escape', handleClose);\n\n return (\n <Card className=\"relative w-full gap-sw-2xl flex flex-col\">\n <CloseButton\n onClick={handleClose}\n className=\"absolute top-sw-2xl right-sw-2xl\"\n />\n <GppBadFill size={48} className=\"text-sw-status-error\" />\n\n <header className=\"flex flex-col gap-sw-lg\">\n <h1 className=\"text-sw-label-lg text-sw-gray-50\">\n {t(\n 'walletCompatibility.modal.title.error',\n 'Unable to verify wallet',\n )}\n </h1>\n <p className=\"text-sw-body-md text-sw-gray-200\">\n {t(\n 'walletCompatibility.modal.description.error',\n 'We couldn’t complete the verification. It may have been interrupted or your wallet may not be compatible.',\n )}\n </p>\n <p className=\"text-sw-body-md text-sw-gray-200\">\n {t(\n 'walletCompatibility.modal.button.tryAgainDesc',\n 'If the issue continues, please try another wallet.',\n )}\n </p>\n </header>\n\n <div className=\"flex flex-col gap-sw-xl mt-sw-lg\">\n <Button\n size=\"lg\"\n variant=\"primary\"\n onClick={() => onMsg({ type: 'on_try_again' })}>\n {t('walletCompatibility.modal.button.tryAgain', 'Try again')}\n </Button>\n <Button\n size=\"lg\"\n variant=\"outlined\"\n onClick={() => onMsg({ type: 'on_sign_out' })}>\n {t('walletCompatibility.modal.button.signOut', 'Sign out')}\n </Button>\n </div>\n </Card>\n );\n};\n\nexport const WalletCompatibilityModal = Object.assign(Initial, {\n Error: ErrorView,\n});\n","import { ErrorBoundary as ErrorBoundaryBase } from 'react-error-boundary';\nimport type { FallbackProps } from 'react-error-boundary';\nimport type { PropsWithChildren } from 'react';\n\nimport { WidgetError } from '@/errors';\nimport { useUnsafeSnapshot } from '@/machine/snap';\nimport type { Context } from '@/machine/context';\n\ntype Meta = Record<string, unknown>;\n\nconst PassthroughFallback = (_: FallbackProps) => null;\n\nconst enrichAndRethrow = (ctx: Context) => {\n return (error: unknown) => {\n if (error instanceof WidgetError) {\n throw error; // already has context attached\n }\n\n const widgetError = new WidgetError(\n error instanceof Error ? error.message : 'Unknown error',\n { cause: error },\n );\n\n widgetError.context = ctx;\n throw widgetError;\n };\n};\n\ntype Props = PropsWithChildren<{\n getMeta?: () => Meta;\n}>;\n\nexport const ErrorBoundary = ({ children }: Props) => {\n const { ctx } = useUnsafeSnapshot();\n\n return (\n <ErrorBoundaryBase\n FallbackComponent={PassthroughFallback}\n onError={enrichAndRethrow(ctx)}>\n {children}\n </ErrorBoundaryBase>\n );\n};\n","import i18n from 'i18next';\nimport { deepClone } from 'valtio/utils';\nimport { proxy, useSnapshot } from 'valtio';\nimport { Helmet, HelmetProvider } from 'react-helmet-async';\nimport { createContext, useContext, useEffect, useRef } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { I18nextProvider } from 'react-i18next';\nimport type { PropsWithChildren } from 'react';\n\nimport { initLocalisation } from './localisation';\nimport { LocalisationDict } from './types/localisation';\nimport { WidgetConfig } from './types/config';\nimport { BalanceRpcLoader } from './features';\nimport { DEFAULT_RPCS } from './rpcs';\nimport { ChainRpcUrls } from './types';\nimport { Theme } from './types/theme';\nimport { ThemeProvider } from './theme/ThemeProvider';\nimport { useAddClassToPortal } from '@/hooks/useAddClassToPortal';\nimport { ErrorBoundary } from '@/features/ErrorBoundary';\nimport { DEFAULT_CHAINS_ORDER, EVM_CHAINS } from '@/constants/chains';\nimport type { Token } from '@/types/token';\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 2000 * 60,\n retry: process.env.NODE_ENV === 'test' ? false : 3,\n },\n },\n});\n\nconst DISABLED_TOKENS = ['fms', 'abg', 'stjack', 'noear', 'testnebula'];\n\nconst DEFAULT_CONFIG: WidgetConfig = {\n appName: 'Unknown',\n\n slippageTolerance: 100, // 1%\n intentsAccountType: 'evm',\n walletSupportedChains: EVM_CHAINS,\n connectedWallets: {},\n\n enableAutoTokensSwitching: true,\n showIntentTokens: true,\n chainsOrder: DEFAULT_CHAINS_ORDER,\n\n filterTokens: (tkn: Token) =>\n !DISABLED_TOKENS.includes(tkn.symbol.toLocaleLowerCase()),\n\n chainsFilter: {\n source: { external: 'wallet-supported', intents: 'none' },\n target: { external: 'all', intents: 'none' },\n },\n};\n\ntype WidgetConfigContextType = { config: WidgetConfig };\n\nconst WidgetConfigContext = createContext<WidgetConfigContextType>({\n config: DEFAULT_CONFIG,\n});\n\ntype Props = PropsWithChildren<{\n config: Partial<WidgetConfig>;\n localisation?: LocalisationDict;\n balanceViaRpc?: boolean;\n rpcs?: ChainRpcUrls;\n theme?: Theme;\n}>;\n\nexport const configStore = proxy<{ config: WidgetConfig }>({\n config: DEFAULT_CONFIG,\n});\n\nexport const useConfig = () => {\n const configState = useContext(WidgetConfigContext);\n const store = useSnapshot(configState);\n\n return store.config;\n};\n\nconst resetConfig = (config: WidgetConfig) => {\n configStore.config = deepClone(config);\n};\n\nexport const WidgetConfigProvider = ({\n children,\n config: userConfig,\n balanceViaRpc = true, // you don't usually want to disable it\n localisation,\n rpcs,\n theme,\n}: Props) => {\n const storeRef = useRef(\n proxy({\n config: deepClone({\n ...DEFAULT_CONFIG,\n ...userConfig,\n }),\n }),\n );\n\n useEffect(() => {\n const next = deepClone({\n ...DEFAULT_CONFIG,\n ...userConfig,\n });\n\n Object.assign(storeRef.current.config, next);\n resetConfig(next);\n }, [userConfig]);\n\n // Initialise localisation\n initLocalisation(localisation ?? {});\n\n // Add tailwind parent class to portal root\n useAddClassToPortal('headlessui-portal-root', 'sw');\n\n return (\n <QueryClientProvider client={queryClient}>\n <I18nextProvider i18n={i18n}>\n <WidgetConfigContext.Provider value={storeRef.current}>\n <HelmetProvider>\n <Helmet>\n <link rel=\"preconnect\" href=\"https://rsms.me/\" />\n <link rel=\"stylesheet\" href=\"https://rsms.me/inter/inter.css\" />\n </Helmet>\n <ThemeProvider theme={theme}>\n {/* ErrorBoundary hides error trace which makes it impossible to debug during testing */}\n {process.env.NODE_ENV === 'test' ? (\n children\n ) : (\n <ErrorBoundary>{children}</ErrorBoundary>\n )}\n </ThemeProvider>\n </HelmetProvider>\n {balanceViaRpc && (\n <BalanceRpcLoader\n rpcs={rpcs ?? DEFAULT_RPCS}\n connectedWallets={userConfig.connectedWallets ?? {}}\n />\n )}\n </WidgetConfigContext.Provider>\n </I18nextProvider>\n </QueryClientProvider>\n );\n};\n"],"names":["useTokenBalanceRpc","rpcs","token","connectedWallets","walletSupportedChains","tonCenterApiKey","alchemyApiKey","useConfig","walletAddress","useWalletAddressForToken","useQuery","NATIVE_NEAR_DUMB_ASSET_ID","getNativeNearBalance","getNearTokenBalance","isEvmChain","isEvmBaseToken","rpcUrls","getEvmMainTokenBalance","isEvmToken","getEvmTokenBalance","getTonTokenBalance","getSolanaTokenBalance","logger","TokenBalanceZeroLoader","onBalancesLoaded","useEffect","TokenBalanceBaseLoader","memo","balance","prev","next","TokenBalanceLoader","getTokenIcon","tokenSymbol","symbol","TOKENS_DATA","capitalizeChainName","blockchain","getTokenName","useTokens","variant","showIntentTokens","allowedTokensList","allowedSourceTokensList","allowedTargetTokensList","filterTokens","fetchSourceTokens","fetchTargetTokens","queryData","query","OneClickService","data","useMemo","tokens","isValidChain","CHAINS_LIST","t","tokensWithoutWNEAR","wnearToken","useAllTokens","defaultTokens","sourceTokens","targetTokens","tokenMap","mapKey","tokensBalancePriority","sortTokensByPriority","a","b","aChainIndex","p","bChainIndex","chainPriority","aPriority","bPriority","BalanceRpcLoader","setWalletBalance","useWalletBalance","tkn","jsx","getTokenBalanceKey","sortChains","items","chainsOrder","order","DEFAULT_CHAINS_ORDER","pos","id","i","ai","bi","useChains","allowedChainsList","allowedSourceChainsList","allowedTargetChainsList","chainsFromTokens","chain","MAX_PAGES_DEPTH","useAlchemyBalanceIntegration","args","ctx","useUnsafeSnapshot","isEnabled","useInfiniteQuery","pageParam","createLoader","lastPage","allPages","balancesMap","balances","parse","page","isAlchemySupportedChain","guardStates","fireEvent","useIntentsBalance","intentsAccountType","tokenIds","intentsAccountId","getIntentsAccountId","getIntentsBalances","intentBalances","assetId","notReachable","useBalancesUpdateEffect","queryClient","useQueryClient","refetchIntentsBalances","refetchAlchemyBalances","isValidState","resolve","useMergedBalance","walletBalance","useSetTokenBalanceEffect","mergedBalance","tokenBalanceKey","intentDepositTokensMap","useSetTokenIntentsTargetEffect","sourceToken","targetTokenOnNear","firstToken","secondToken","useWalletConnEffect","state","moveTo","validateQuoteProperties","quote","property","useMakeQuote","appName","appFees","fetchQuote","slippageTolerance","isDry","isDryQuote","request","useRef","abortController","requestQuote","metadata","signal","oneClickApi","message","quoteType","options","msg","QuoteError","recipientIntentsAccountId","getDryQuoteAddress","isRefundToIntentAccount","getRefundToAccountId","quoteResponse","commonQuoteParams","QuoteRequest","WNEAR_ASSET_ID","snakeCase","error","CanceledError","errorMessage","AxiosError","match","minAmount","formatBigToHuman","useMakeDepositAddress","isNativeNearDeposit","useComputedSnapshot","requestDepositAddress","bridgeApi","chainId","CHAIN_POA_MAP","POA_EVM_CHAIN_ID","setAsyncError","err","asyncValidateSendAddress","exists","checkNearAccountExists","isAsyncSendAddressValidationError","validateDryInputs","isValidInitialState","isValidInputsState","isNotEmptyAmount","isBalanceSufficient","isQuoteError","isTransferError","validateExternalInputs","sourceBalance","isNearAddress","isValidBigint","validateInternalInputs","validateInputAndMoveTo","isDryRun","isInternal","isExternal","isValidDryInput","useMakeQuoteEffect","refetchQuoteInterval","isDirectNonNearWithdrawal","isDirectTokenOnNearDeposit","isDirectNearTokenWithdrawal","isDirectTokenOnNearTransfer","isSameAssetDiffChainWithdrawal","shouldRun","makeQuote","cancelQuote","makeDepositAddress","cancelDepositAddress","intervalRef","cancel","isValidExternalInput","isValidInternalInput","run","useCallback","cleanup","accountChainMap","useSelectedTokensEffect","skipIntents","target","chainsFilter","highestIntentsToken","getTokenWithHighBalance","targetToken","getDefaultIntentsToken","getMainTokenByChain","setTokenForIntentsAccountType","accountType","fallbackToken","CHAIN_BASE_TOKENS","isGuardedState","timer","isSolanaAddress","isEvmAddress","useAlchemyBalanceEffect","isSendAddressAsConnected","changes","config","snapshot","configStore","change","registerGlobalContextSubscription","debug","machine","_changes","isErrorChanged","isOnlyErrorChanged","isAmountChangedFromQuote","isWalletDisconnected","isChanged","isInputChanged","nextState","isQuoteIdle","isSendAddressForbidden","registerGlobalStateSubscription","fromState","toState","tokenSelect","payload","tokenSelectRotate","onEvent","event","handler","registerEvents","quoteSetStatus","walletAddressSet","transferSetStatus","tokenSetBalance","tokenSetAmount","depositTypeSet","setInputsValidating","externalDepositTxSet","addressSet","errorSet","quoteSet","reset","registerStoreEvents","once","useStoreSideEffects","listenTo","alchemyBalancesListener","item","defaultTokenListener","makeQuoteListener","store","WidgetError","meta","MachineError","TransferError","isWidgetError","computed","derive","get","getUsdTradeDelta","getIsDirectNearTokenWithdrawal","getIsDirectNonNearWithdrawal","getIsDirectTokenOnNearDeposit","getIsNativeNearDeposit","getIsSameAssetDiffChainWithdrawal","getIsDirectTokenOnNearTransfer","useSnapshot","snap","useSafeSnapshot","getNearNep141StorageBalance","contractId","accountId","argsBase64","Buffer","response","nearRpcClient","parsed","decodeQueryResult","z","useMakeNEARFtTransferCall","nearWallet","sourceTokenAddress","amount","recipient","msgRecipient","wallet","tx","tokenContractActions","FT_DEPOSIT_GAS","FT_TRANSFER_GAS","minStorageBalanceResult","userStorageBalanceResult","getNearNep141MinStorageBalance","storageDelta","useMakeQuoteTransfer","makeTransfer","providers","makeEvmTransfer","useMakeEvmTransfer","makeSolanaTransfer","useMakeSolanaTransfer","getTransferFunction","depositAddress","makeTransferArgs","EVM_CHAIN_IDS_MAP","transferFunction","depositResult","userCancelledTx","isUserDeniedSigning","axios","IntentSignerPrivy","account","provider","intent","utils","resolvedProvider","accounts","signature","createNearWalletSigner","getProvider","createIntentSignerNEP413","nep413Payload","signedMessage","e","getDestinationAddress","isDirectTransfer","validateNearPublicKey","nearProvider","publicKey","localStorageTyped","res","generateRandomBytes","queryContract","INTENTS_CONTRACT","useMakeIntentsTransfer","onPending","signer","IntentSignerSolana","sdk","BridgeSDK","routeConfig","createNearWithdrawalRoute","createInternalTransferRoute","withdrawal","txIntent","getTransactionLink","CHAIN_IDS_MAP","MinWithdrawalAmountError","FeeExceedsAmountError","useMakeTransfer","makeIntentsTransfer","makeQuoteTransfer","makeNEARFtTransferCall","transferResult","reason","getCurrentChainId","useSwitchChain","isSwitchingChain","setIsSwitchingChain","useState","isSwitchingChainRequired","setIsSwitchingChainRequired","checkIfSwitchingIsRequired","currentWalletChainId","requiredChainId","switchChain","targetChainId","switchEthereumChain","commonBtnProps","useGetErrorButton","useTypedTranslation","Button","jsxs","ErrorMessage","Trans","TinyNumber","ConnectWalletButton","onClick","SubmitButtonError","SubmitButtonBase","props","onSuccess","make","SubmitErrorButton","SubmitButtonWithWallet","errorButton","SubmitButton","SwapQuote","className","price","Accordion","formatTinyNumber","formatUsdAmount","Notes","SwapQuoteSkeleton","SwapQuoteBase","WalletBalance","isNotSufficient","Skeleton","clsx","TokenInputWithToken","value","quoteUsdDelta","quoteUsdValue","showBalance","showQuickBalanceActions","heading","onMsg","inputName","useId","hideTokenInputHeadings","usdAmount","getUsdDisplayAmount","onSetPortionOfBalance","div","getBalancePortion","Card","TokenInputHeading","cn","InputAmount","noop","TokenIcon","Fragment","Badge","TokenInputEmpty","useTokenInputBalance","sourceTokenBalance","setSourceTokenBalance","timeoutId","existingBalance","useDefaultToken","uniqueAssetIds","singleToken","TokenInputSource","isChanging","sourceInputState","TokenInputTarget","usdTradeDelta","targetTokenBalance","TokenInputBase","TokenInput","TokenInputSkeleton","TOKEN_ITEM_HEIGHT","TokenItem","isNotSelectable","displayUsdBalance","getUsdDisplayBalance","isTokenSupported","hasBalance","uniqueIntentTokensFilter","useTokensIntentsUnique","nearTokens","nearTokenSymbols","notNearTokens","useTokensFiltered","search","selectedChain","uniqueIntentsTokens","sorter","createTokenSorter","filteredTokens","createFilterBySearch","createFilterBySelectedChain","createFilterByIntents","useListState","TokensList","groupTokens","showBalances","chainIsNotSupported","areTokensGrouped","tokensListState","tokensUngrouped","tokensBySection","tokensCount","acc","group","maxHeight","TokensListPlaceholder","VList","label","tokensToDisplay","Hr","List","Item","getMatchedDeposit","nearTokenId","isAmountMatched","deposit","normalize","normalizedAmount","normalizedDepositAmount","isCreatedAfterInitiation","oneClickBridgeStatusMap","GetExecutionStatusResponse","usePoaExternalDepositStatus","initiatedAt","setInitiatedAt","initiatedAtDate","matchedDeposit","setColorVariables","palette","colorKey","parentEl","parentElement","key","setColorPalette","colorStop","baseColor","colorScheme","createColorPalette","loadTheme","theme","primaryColor","surfaceColor","ThemeContext","createContext","ThemeProvider","children","themeParentElementSelector","themeParentElement","ListItem","text","Icon","FakeButton","Initial","isSigned","isSigning","handleClose","useHandleKeyDown","showTimer","useTimer","CloseButton","ArmingCountdownFill","BeenhereFill","EncryptedFill","AccountBalanceWalletFill","CheckCircleFill","ErrorView","GppBadFill","WalletCompatibilityModal","PassthroughFallback","_","enrichAndRethrow","widgetError","ErrorBoundary","ErrorBoundaryBase","QueryClient","process","DISABLED_TOKENS","DEFAULT_CONFIG","EVM_CHAINS","WidgetConfigContext","proxy","configState","useContext","resetConfig","deepClone","WidgetConfigProvider","userConfig","balanceViaRpc","localisation","storeRef","initLocalisation","useAddClassToPortal","QueryClientProvider","I18nextProvider","i18n","HelmetProvider","Helmet","DEFAULT_RPCS"],"mappings":"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"}