@aurora-is-near/intents-swap-widget 3.17.0 → 3.17.2

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 (131) hide show
  1. package/dist/components/Input.d.ts +8 -2
  2. package/dist/components/Input.js +88 -84
  3. package/dist/components/Input.js.map +1 -1
  4. package/dist/{config-BMe2x51b.js → config-BVaLnxO9.js} +804 -788
  5. package/dist/config-BVaLnxO9.js.map +1 -0
  6. package/dist/config.js +6 -5
  7. package/dist/config.js.map +1 -1
  8. package/dist/errors.js +1 -1
  9. package/dist/ext/alchemy/index.js +1 -1
  10. package/dist/ext/index.js +1 -1
  11. package/dist/features/BalanceRpcLoader/TokenBalanceLoader.js +1 -1
  12. package/dist/features/BalanceRpcLoader/index.js +1 -1
  13. package/dist/features/BalanceRpcLoader/useTokenBalanceRpc.js +1 -1
  14. package/dist/features/ChainsDropdown/index.js +1 -1
  15. package/dist/features/DepositMethodSwitcher.js +1 -1
  16. package/dist/features/ErrorBoundary.js +1 -1
  17. package/dist/features/ExternalDeposit.js +5 -4
  18. package/dist/features/ExternalDeposit.js.map +1 -1
  19. package/dist/features/SendAddress/index.js +1 -1
  20. package/dist/features/SendAddress/useNotification.js +1 -1
  21. package/dist/features/SubmitButton/index.js +1 -1
  22. package/dist/features/SuccessScreen/index.js +1 -1
  23. package/dist/features/SwapDirectionSwitcher.js +1 -1
  24. package/dist/features/SwapQuote/SwapQuote.js +1 -1
  25. package/dist/features/SwapQuote/index.js +1 -1
  26. package/dist/features/TokenInput/TokenInput.js +1 -1
  27. package/dist/features/TokenInput/TokenInputEmpty.js +1 -1
  28. package/dist/features/TokenInput/TokenInputSource.js +1 -1
  29. package/dist/features/TokenInput/TokenInputTarget.js +1 -1
  30. package/dist/features/TokenInput/WalletBalance.js +1 -1
  31. package/dist/features/TokenInput/hooks/index.js +1 -1
  32. package/dist/features/TokenInput/hooks/useTokenInputBalance.js +1 -1
  33. package/dist/features/TokenInput/index.js +1 -1
  34. package/dist/features/TokensList/TokenItem.js +1 -1
  35. package/dist/features/TokensList/TokensList.js +1 -1
  36. package/dist/features/TokensList/index.js +1 -1
  37. package/dist/features/TokensModal.js +64 -55
  38. package/dist/features/TokensModal.js.map +1 -1
  39. package/dist/features/WalletCompatibilityCheck/WalletCompatibilityModal.js +3 -3
  40. package/dist/features/WalletCompatibilityCheck/index.js +1 -1
  41. package/dist/features/index.js +1 -1
  42. package/dist/hooks/index.js +1 -1
  43. package/dist/hooks/useAllTokens.js +1 -1
  44. package/dist/hooks/useChains.js +1 -1
  45. package/dist/hooks/useCompatibilityCheck.js +1 -1
  46. package/dist/hooks/useDefaultToken.js +1 -1
  47. package/dist/hooks/useExternalDepositStatus/index.js +1 -1
  48. package/dist/hooks/useExternalDepositStatus/usePoaExternalDepositStatus.js +1 -1
  49. package/dist/hooks/useHandleKeyDown.d.ts +1 -1
  50. package/dist/hooks/useHandleKeyDown.js +12 -8
  51. package/dist/hooks/useHandleKeyDown.js.map +1 -1
  52. package/dist/hooks/useIntentsBalance.js +1 -1
  53. package/dist/hooks/useIsCompatibilityCheckRequired.js +1 -1
  54. package/dist/hooks/useMakeDepositAddress.js +1 -1
  55. package/dist/hooks/useMakeIntentsTransfer.js +4 -3
  56. package/dist/hooks/useMakeIntentsTransfer.js.map +1 -1
  57. package/dist/hooks/useMakeNEARFtTransferCall.js +4 -2
  58. package/dist/hooks/useMakeNEARFtTransferCall.js.map +1 -1
  59. package/dist/hooks/useMakeQuote.js +1 -1
  60. package/dist/hooks/useMakeQuoteTransfer.js +3 -2
  61. package/dist/hooks/useMakeQuoteTransfer.js.map +1 -1
  62. package/dist/hooks/useMakeSolanaTransfer.js +1 -1
  63. package/dist/hooks/useMakeTransfer.js +1 -1
  64. package/dist/hooks/useMergedBalance.js +1 -1
  65. package/dist/hooks/useSwitchChain.js +1 -1
  66. package/dist/hooks/useTheme.js +1 -1
  67. package/dist/hooks/useTokenInputPair.js +1 -1
  68. package/dist/hooks/useTokens.js +1 -1
  69. package/dist/hooks/useTokensFiltered.js +1 -1
  70. package/dist/hooks/useTokensIntentsUnique.js +1 -1
  71. package/dist/{index-Ce9bzNHX.js → index-JGjxyZXI.js} +70 -70
  72. package/dist/index-JGjxyZXI.js.map +1 -0
  73. package/dist/index.browser.esm-COWShN0a.js.map +1 -1
  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.js +1 -1
  80. package/dist/machine/effects/useSetTokenBalanceEffect.js +1 -1
  81. package/dist/machine/effects/useSetTokenIntentsTargetEffect.js +1 -1
  82. package/dist/machine/effects/useWalletConnEffect.js +1 -1
  83. package/dist/machine/events/index.js +1 -1
  84. package/dist/machine/events/tokenSelect.js +1 -1
  85. package/dist/machine/events/validateInputAndMoveTo.js +1 -1
  86. package/dist/machine/events/validateInputs.js +1 -1
  87. package/dist/machine/index.js +1 -1
  88. package/dist/machine/snap.js +1 -1
  89. package/dist/machine/subscriptions/checkers/isSendAddressAsConnected.js +1 -1
  90. package/dist/machine/subscriptions/index.js +1 -1
  91. package/dist/theme/ThemeProvider.js +1 -1
  92. package/dist/utils/checkers/isUserDeniedSigning.d.ts +2 -1
  93. package/dist/utils/checkers/isUserDeniedSigning.js +6 -4
  94. package/dist/utils/checkers/isUserDeniedSigning.js.map +1 -1
  95. package/dist/utils/index.d.ts +1 -0
  96. package/dist/utils/index.js +26 -24
  97. package/dist/utils/index.js.map +1 -1
  98. package/dist/utils/intents/signers/near.d.ts +1 -1
  99. package/dist/utils/intents/signers/near.js +2 -2
  100. package/dist/utils/intents/signers/privy.d.ts +1 -1
  101. package/dist/utils/intents/signers/privy.js +1 -1
  102. package/dist/utils/intents/signers/solana.d.ts +1 -1
  103. package/dist/utils/intents/signers/solana.js.map +1 -1
  104. package/dist/utils/isErrorLikeObject.d.ts +4 -0
  105. package/dist/utils/isErrorLikeObject.js +5 -0
  106. package/dist/utils/isErrorLikeObject.js.map +1 -0
  107. package/dist/utils/near/getNearNep141StorageBalance.js +1 -1
  108. package/dist/widgets/WidgetDeposit/WidgetDepositContent.js +5 -4
  109. package/dist/widgets/WidgetDeposit/WidgetDepositContent.js.map +1 -1
  110. package/dist/widgets/WidgetDeposit/WidgetDepositSkeleton.js +1 -1
  111. package/dist/widgets/WidgetSwap/WidgetSwapContent.js +5 -4
  112. package/dist/widgets/WidgetSwap/WidgetSwapContent.js.map +1 -1
  113. package/dist/widgets/WidgetSwap/WidgetSwapSkeleton.js +1 -1
  114. package/dist/widgets/WidgetWithdraw/WidgetWithdrawContent.js +5 -4
  115. package/dist/widgets/WidgetWithdraw/WidgetWithdrawContent.js.map +1 -1
  116. package/dist/widgets/WidgetWithdraw/WidgetWithdrawSkeleton.js +1 -1
  117. package/package.json +2 -2
  118. package/src/components/Input.tsx +111 -96
  119. package/src/features/TokensModal.tsx +19 -2
  120. package/src/hooks/useHandleKeyDown.ts +25 -3
  121. package/src/hooks/useMakeIntentsTransfer.ts +40 -29
  122. package/src/hooks/useMakeNEARFtTransferCall.ts +10 -0
  123. package/src/hooks/useMakeQuoteTransfer.ts +2 -1
  124. package/src/utils/checkers/isUserDeniedSigning.ts +11 -3
  125. package/src/utils/index.ts +1 -0
  126. package/src/utils/intents/signers/near.ts +1 -1
  127. package/src/utils/intents/signers/privy.ts +1 -1
  128. package/src/utils/intents/signers/solana.ts +1 -1
  129. package/src/utils/isErrorLikeObject.ts +11 -0
  130. package/dist/config-BMe2x51b.js.map +0 -1
  131. package/dist/index-Ce9bzNHX.js.map +0 -1
@@ -3,7 +3,7 @@ import { useState as w, useEffect as b } from "react";
3
3
  import { useTokenModal as B } from "../../hooks/useTokenModal.js";
4
4
  import { WidgetWithdrawSkeleton as y } from "./WidgetWithdrawSkeleton.js";
5
5
  import { useTypedTranslation as D } from "../../localisation.js";
6
- import { b as N, u as O, y as Q, n as j, c as q, p as S, o as F, S as U } from "../../config-BMe2x51b.js";
6
+ import { b as N, u as O, y as Q, n as j, c as q, p as S, o as F, S as U } from "../../config-BVaLnxO9.js";
7
7
  import "@tanstack/react-query";
8
8
  import "@headlessui/react";
9
9
  import "framer-motion";
@@ -26,7 +26,7 @@ import "viem";
26
26
  import "zod";
27
27
  import "../../utils/near/rpc.js";
28
28
  import "../../index-DEq3oXQF.js";
29
- import "@defuse-protocol/bridge-sdk";
29
+ import "@defuse-protocol/intents-sdk";
30
30
  import "change-case";
31
31
  import "@defuse-protocol/internal-utils";
32
32
  import "bs58";
@@ -40,10 +40,11 @@ import "browser-or-node";
40
40
  import { Card as C } from "../../components/Card.js";
41
41
  import { BlockingError as V } from "../../components/BlockingError.js";
42
42
  import "copy-text-to-clipboard";
43
+ import "../../components/Input.js";
43
44
  import "../../components/InputAmount.js";
44
45
  import "../../components/Notes.js";
45
46
  import { WalletCompatibilityCheck as X } from "../../features/WalletCompatibilityCheck/index.js";
46
- const Pe = ({
47
+ const Ye = ({
47
48
  providers: u,
48
49
  makeTransfer: T,
49
50
  onMsg: a,
@@ -243,6 +244,6 @@ const Pe = ({
243
244
  }
244
245
  };
245
246
  export {
246
- Pe as WidgetWithdrawContent
247
+ Ye as WidgetWithdrawContent
247
248
  };
248
249
  //# sourceMappingURL=WidgetWithdrawContent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WidgetWithdrawContent.js","sources":["../../../src/widgets/WidgetWithdraw/WidgetWithdrawContent.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { CommonWidgetProps, TokenInputType } from '../types';\nimport { useTokenModal } from '../../hooks/useTokenModal';\nimport { WidgetWithdrawSkeleton } from './WidgetWithdrawSkeleton';\nimport { useTypedTranslation } from '../../localisation';\nimport {\n SendAddress,\n SubmitButton,\n SuccessScreen,\n SwapQuote,\n TokenInput,\n TokensModal,\n} from '@/features';\n\nimport { BlockingError, Card, DirectionSwitcher } from '@/components';\nimport { WalletCompatibilityCheck } from '@/features/WalletCompatibilityCheck';\n\nimport { useStoreSideEffects } from '@/machine/effects';\nimport { useComputedSnapshot, useUnsafeSnapshot } from '@/machine/snap';\nimport { fireEvent } from '@/machine/events/utils/fireEvent';\n\nimport {\n useIsCompatibilityCheckRequired,\n useTokenInputPair,\n useTokens,\n} from '@/hooks';\nimport { useConfig } from '@/config';\n\nimport { isDebug, notReachable } from '@/utils';\n\nimport type { Token, TransferResult } from '@/types';\n\ntype Msg =\n | { type: 'on_select_token'; token: Token; variant: TokenInputType }\n | { type: 'on_transfer_success' }\n | { type: 'on_tokens_modal_toggled'; isOpen: boolean };\n\nexport type Props = CommonWidgetProps<Msg>;\n\nexport const WidgetWithdrawContent = ({\n providers,\n makeTransfer,\n onMsg,\n isLoading,\n}: Props) => {\n const { t } = useTypedTranslation();\n const { ctx } = useUnsafeSnapshot();\n const { isDirectNearTokenWithdrawal } = useComputedSnapshot();\n const {\n chainsFilter,\n alchemyApiKey,\n refetchQuoteInterval,\n intentsAccountType,\n onWalletSignout,\n } = useConfig();\n\n const { status: tokensStatus, refetch: refetchTokens } = useTokens();\n const { tokenModalOpen, updateTokenModalState } = useTokenModal({ onMsg });\n const { onChangeAmount, onChangeToken, lastChangedInput } =\n useTokenInputPair();\n\n const isCompatibilityCheckRequired = useIsCompatibilityCheckRequired();\n const [isCompatibilityOpen, setIsCompatibilityOpen] = useState(false);\n\n useEffect(() => {\n if (isCompatibilityCheckRequired) {\n setIsCompatibilityOpen(true);\n }\n }, [isCompatibilityCheckRequired]);\n\n const [transferResult, setTransferResult] = useState<\n TransferResult | undefined\n >();\n\n useEffect(() => {\n fireEvent('reset', { clearWalletAddress: true });\n }, []);\n\n useStoreSideEffects({\n debug: isDebug(),\n listenTo: [\n 'checkWalletConnection',\n 'setSourceTokenBalance',\n [\n 'setDefaultSelectedTokens',\n { skipIntents: false, target: 'same-asset' },\n ],\n [\n 'makeQuote',\n {\n message: undefined,\n type: lastChangedInput === 'target' ? 'exact_out' : 'exact_in',\n refetchQuoteInterval,\n },\n ],\n ['setBalancesUsingAlchemyExt', { alchemyApiKey }],\n ],\n });\n\n if (!!isLoading || (tokensStatus !== 'error' && !ctx.sourceToken)) {\n return <WidgetWithdrawSkeleton />;\n }\n\n if (isCompatibilityOpen) {\n return (\n <WalletCompatibilityCheck\n providers={providers}\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_sign_out':\n onWalletSignout?.(intentsAccountType);\n setIsCompatibilityOpen(false);\n break;\n case 'on_close':\n setIsCompatibilityOpen(false);\n break;\n default:\n notReachable(msg.type);\n }\n }}\n />\n );\n }\n\n if (ctx.state === 'transfer_success' && !!transferResult) {\n return (\n <SuccessScreen\n {...transferResult}\n message={[\n 'Your withdrawal has been successfully completed,',\n 'and the funds have been sent to the specified destination.',\n ]}\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_dismiss_success':\n setTransferResult(undefined);\n break;\n default:\n notReachable(msg.type);\n }\n }}\n />\n );\n }\n\n switch (tokensStatus) {\n case 'error':\n return (\n <BlockingError\n message=\"Couldn't load tokens list.\"\n onClickRetry={refetchTokens}\n />\n );\n\n case 'success': {\n if (tokenModalOpen !== 'none') {\n return (\n <TokensModal\n showBalances\n variant={tokenModalOpen}\n showChainsSelector={tokenModalOpen === 'target'}\n groupTokens={false}\n chainsFilter={\n tokenModalOpen === 'source'\n ? chainsFilter.source\n : chainsFilter.target\n }\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_select_token':\n onChangeToken(tokenModalOpen, msg.token);\n updateTokenModalState('none');\n onMsg?.({\n type: msg.type,\n token: msg.token,\n variant: tokenModalOpen,\n });\n break;\n case 'on_dismiss_tokens_modal':\n updateTokenModalState('none');\n break;\n default:\n notReachable(msg);\n }\n }}\n />\n );\n }\n\n return (\n <div className=\"gap-sw-2xl relative flex flex-col\">\n <div className=\"gap-[10px] relative flex flex-col\">\n <Card padding=\"none\">\n <TokenInput.Source\n heading={t(\n 'tokenInput.heading.source.withdraw',\n 'Withdraw token',\n )}\n isChanging={lastChangedInput === 'source'}\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_select_token':\n onChangeToken('source', msg.token);\n break;\n case 'on_change_amount':\n onChangeAmount('source', msg.amount);\n break;\n case 'on_click_select_token':\n updateTokenModalState('source');\n break;\n default:\n notReachable(msg);\n }\n }}\n />\n </Card>\n\n <DirectionSwitcher isEnabled={false} />\n\n <Card padding=\"none\">\n <TokenInput.Target\n heading={t(\n 'tokenInput.heading.target.withdraw',\n 'Receive token',\n )}\n isChanging={lastChangedInput === 'target'}\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_select_token':\n onChangeToken('target', msg.token);\n break;\n case 'on_change_amount':\n onChangeAmount('target', msg.amount);\n break;\n case 'on_click_select_token':\n updateTokenModalState('target');\n break;\n default:\n notReachable(msg);\n }\n }}\n />\n </Card>\n </div>\n\n {!!ctx.walletAddress &&\n ctx.targetToken &&\n !ctx.targetToken.isIntent && (\n <SendAddress\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_change_send_address':\n break;\n default:\n notReachable(msg.type, { throwError: false });\n }\n }}\n />\n )}\n\n {!isDirectNearTokenWithdrawal && <SwapQuote />}\n\n <SubmitButton\n providers={providers}\n makeTransfer={makeTransfer}\n label={t('submit.active.withdraw', 'Swap & withdraw')}\n onSuccess={(transfer) => {\n setTransferResult(transfer);\n onMsg?.({ type: 'on_transfer_success' });\n }}\n />\n </div>\n );\n }\n\n case 'pending':\n default:\n return <WidgetWithdrawSkeleton />;\n }\n};\n"],"names":["WidgetWithdrawContent","providers","makeTransfer","onMsg","isLoading","t","useTypedTranslation","ctx","useUnsafeSnapshot","isDirectNearTokenWithdrawal","useComputedSnapshot","chainsFilter","alchemyApiKey","refetchQuoteInterval","intentsAccountType","onWalletSignout","useConfig","tokensStatus","refetchTokens","useTokens","tokenModalOpen","updateTokenModalState","useTokenModal","onChangeAmount","onChangeToken","lastChangedInput","useTokenInputPair","isCompatibilityCheckRequired","useIsCompatibilityCheckRequired","isCompatibilityOpen","setIsCompatibilityOpen","useState","useEffect","transferResult","setTransferResult","fireEvent","useStoreSideEffects","isDebug","WidgetWithdrawSkeleton","jsx","WalletCompatibilityCheck","msg","notReachable","SuccessScreen","BlockingError","TokensModal","jsxs","Card","TokenInput","DirectionSwitcher","SendAddress","SwapQuote","SubmitButton","transfer"],"mappings":"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"}
1
+ {"version":3,"file":"WidgetWithdrawContent.js","sources":["../../../src/widgets/WidgetWithdraw/WidgetWithdrawContent.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { CommonWidgetProps, TokenInputType } from '../types';\nimport { useTokenModal } from '../../hooks/useTokenModal';\nimport { WidgetWithdrawSkeleton } from './WidgetWithdrawSkeleton';\nimport { useTypedTranslation } from '../../localisation';\nimport {\n SendAddress,\n SubmitButton,\n SuccessScreen,\n SwapQuote,\n TokenInput,\n TokensModal,\n} from '@/features';\n\nimport { BlockingError, Card, DirectionSwitcher } from '@/components';\nimport { WalletCompatibilityCheck } from '@/features/WalletCompatibilityCheck';\n\nimport { useStoreSideEffects } from '@/machine/effects';\nimport { useComputedSnapshot, useUnsafeSnapshot } from '@/machine/snap';\nimport { fireEvent } from '@/machine/events/utils/fireEvent';\n\nimport {\n useIsCompatibilityCheckRequired,\n useTokenInputPair,\n useTokens,\n} from '@/hooks';\nimport { useConfig } from '@/config';\n\nimport { isDebug, notReachable } from '@/utils';\n\nimport type { Token, TransferResult } from '@/types';\n\ntype Msg =\n | { type: 'on_select_token'; token: Token; variant: TokenInputType }\n | { type: 'on_transfer_success' }\n | { type: 'on_tokens_modal_toggled'; isOpen: boolean };\n\nexport type Props = CommonWidgetProps<Msg>;\n\nexport const WidgetWithdrawContent = ({\n providers,\n makeTransfer,\n onMsg,\n isLoading,\n}: Props) => {\n const { t } = useTypedTranslation();\n const { ctx } = useUnsafeSnapshot();\n const { isDirectNearTokenWithdrawal } = useComputedSnapshot();\n const {\n chainsFilter,\n alchemyApiKey,\n refetchQuoteInterval,\n intentsAccountType,\n onWalletSignout,\n } = useConfig();\n\n const { status: tokensStatus, refetch: refetchTokens } = useTokens();\n const { tokenModalOpen, updateTokenModalState } = useTokenModal({ onMsg });\n const { onChangeAmount, onChangeToken, lastChangedInput } =\n useTokenInputPair();\n\n const isCompatibilityCheckRequired = useIsCompatibilityCheckRequired();\n const [isCompatibilityOpen, setIsCompatibilityOpen] = useState(false);\n\n useEffect(() => {\n if (isCompatibilityCheckRequired) {\n setIsCompatibilityOpen(true);\n }\n }, [isCompatibilityCheckRequired]);\n\n const [transferResult, setTransferResult] = useState<\n TransferResult | undefined\n >();\n\n useEffect(() => {\n fireEvent('reset', { clearWalletAddress: true });\n }, []);\n\n useStoreSideEffects({\n debug: isDebug(),\n listenTo: [\n 'checkWalletConnection',\n 'setSourceTokenBalance',\n [\n 'setDefaultSelectedTokens',\n { skipIntents: false, target: 'same-asset' },\n ],\n [\n 'makeQuote',\n {\n message: undefined,\n type: lastChangedInput === 'target' ? 'exact_out' : 'exact_in',\n refetchQuoteInterval,\n },\n ],\n ['setBalancesUsingAlchemyExt', { alchemyApiKey }],\n ],\n });\n\n if (!!isLoading || (tokensStatus !== 'error' && !ctx.sourceToken)) {\n return <WidgetWithdrawSkeleton />;\n }\n\n if (isCompatibilityOpen) {\n return (\n <WalletCompatibilityCheck\n providers={providers}\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_sign_out':\n onWalletSignout?.(intentsAccountType);\n setIsCompatibilityOpen(false);\n break;\n case 'on_close':\n setIsCompatibilityOpen(false);\n break;\n default:\n notReachable(msg.type);\n }\n }}\n />\n );\n }\n\n if (ctx.state === 'transfer_success' && !!transferResult) {\n return (\n <SuccessScreen\n {...transferResult}\n message={[\n 'Your withdrawal has been successfully completed,',\n 'and the funds have been sent to the specified destination.',\n ]}\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_dismiss_success':\n setTransferResult(undefined);\n break;\n default:\n notReachable(msg.type);\n }\n }}\n />\n );\n }\n\n switch (tokensStatus) {\n case 'error':\n return (\n <BlockingError\n message=\"Couldn't load tokens list.\"\n onClickRetry={refetchTokens}\n />\n );\n\n case 'success': {\n if (tokenModalOpen !== 'none') {\n return (\n <TokensModal\n showBalances\n variant={tokenModalOpen}\n showChainsSelector={tokenModalOpen === 'target'}\n groupTokens={false}\n chainsFilter={\n tokenModalOpen === 'source'\n ? chainsFilter.source\n : chainsFilter.target\n }\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_select_token':\n onChangeToken(tokenModalOpen, msg.token);\n updateTokenModalState('none');\n onMsg?.({\n type: msg.type,\n token: msg.token,\n variant: tokenModalOpen,\n });\n break;\n case 'on_dismiss_tokens_modal':\n updateTokenModalState('none');\n break;\n default:\n notReachable(msg);\n }\n }}\n />\n );\n }\n\n return (\n <div className=\"gap-sw-2xl relative flex flex-col\">\n <div className=\"gap-[10px] relative flex flex-col\">\n <Card padding=\"none\">\n <TokenInput.Source\n heading={t(\n 'tokenInput.heading.source.withdraw',\n 'Withdraw token',\n )}\n isChanging={lastChangedInput === 'source'}\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_select_token':\n onChangeToken('source', msg.token);\n break;\n case 'on_change_amount':\n onChangeAmount('source', msg.amount);\n break;\n case 'on_click_select_token':\n updateTokenModalState('source');\n break;\n default:\n notReachable(msg);\n }\n }}\n />\n </Card>\n\n <DirectionSwitcher isEnabled={false} />\n\n <Card padding=\"none\">\n <TokenInput.Target\n heading={t(\n 'tokenInput.heading.target.withdraw',\n 'Receive token',\n )}\n isChanging={lastChangedInput === 'target'}\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_select_token':\n onChangeToken('target', msg.token);\n break;\n case 'on_change_amount':\n onChangeAmount('target', msg.amount);\n break;\n case 'on_click_select_token':\n updateTokenModalState('target');\n break;\n default:\n notReachable(msg);\n }\n }}\n />\n </Card>\n </div>\n\n {!!ctx.walletAddress &&\n ctx.targetToken &&\n !ctx.targetToken.isIntent && (\n <SendAddress\n onMsg={(msg) => {\n switch (msg.type) {\n case 'on_change_send_address':\n break;\n default:\n notReachable(msg.type, { throwError: false });\n }\n }}\n />\n )}\n\n {!isDirectNearTokenWithdrawal && <SwapQuote />}\n\n <SubmitButton\n providers={providers}\n makeTransfer={makeTransfer}\n label={t('submit.active.withdraw', 'Swap & withdraw')}\n onSuccess={(transfer) => {\n setTransferResult(transfer);\n onMsg?.({ type: 'on_transfer_success' });\n }}\n />\n </div>\n );\n }\n\n case 'pending':\n default:\n return <WidgetWithdrawSkeleton />;\n }\n};\n"],"names":["WidgetWithdrawContent","providers","makeTransfer","onMsg","isLoading","t","useTypedTranslation","ctx","useUnsafeSnapshot","isDirectNearTokenWithdrawal","useComputedSnapshot","chainsFilter","alchemyApiKey","refetchQuoteInterval","intentsAccountType","onWalletSignout","useConfig","tokensStatus","refetchTokens","useTokens","tokenModalOpen","updateTokenModalState","useTokenModal","onChangeAmount","onChangeToken","lastChangedInput","useTokenInputPair","isCompatibilityCheckRequired","useIsCompatibilityCheckRequired","isCompatibilityOpen","setIsCompatibilityOpen","useState","useEffect","transferResult","setTransferResult","fireEvent","useStoreSideEffects","isDebug","WidgetWithdrawSkeleton","jsx","WalletCompatibilityCheck","msg","notReachable","SuccessScreen","BlockingError","TokensModal","jsxs","Card","TokenInput","DirectionSwitcher","SendAddress","SwapQuote","SubmitButton","transfer"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { jsxs as a, jsx as e } from "react/jsx-runtime";
2
2
  import o from "clsx";
3
3
  import { SkeletonBox as l } from "../../components/SkeletonBox.js";
4
- import { y as x } from "../../config-BMe2x51b.js";
4
+ import { y as x } from "../../config-BVaLnxO9.js";
5
5
  const p = () => {
6
6
  const { hideTokenInputHeadings: s } = x();
7
7
  return /* @__PURE__ */ a("div", { className: "w-full gap-sw-xl relative flex flex-col", children: [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aurora-is-near/intents-swap-widget",
3
- "version": "3.17.0",
3
+ "version": "3.17.2",
4
4
  "description": "Provides components and hooks to build your own Intents swap widget",
5
5
  "author": "Maksim Vashchuk",
6
6
  "license": "MIT",
@@ -55,7 +55,7 @@
55
55
  },
56
56
  "dependencies": {
57
57
  "@aurora-is-near/eslint-config": "^1.5.3",
58
- "@defuse-protocol/bridge-sdk": "0.10.3",
58
+ "@defuse-protocol/intents-sdk": "^0.43.3",
59
59
  "@defuse-protocol/internal-utils": "^0.13.0",
60
60
  "@defuse-protocol/one-click-sdk-typescript": "^0.1.5",
61
61
  "@headlessui/react": "^2.2.4",
@@ -1,4 +1,11 @@
1
- import { Fragment, useEffect, useRef, useState } from 'react';
1
+ import {
2
+ forwardRef,
3
+ Fragment,
4
+ useEffect,
5
+ useImperativeHandle,
6
+ useRef,
7
+ useState,
8
+ } from 'react';
2
9
  import { Input as UIInput } from '@headlessui/react';
3
10
  import type { InputProps } from '@headlessui/react';
4
11
  import type { PropsWithChildren } from 'react';
@@ -16,104 +23,112 @@ export type Props = Omit<InputProps, 'size'> & {
16
23
  state?: State;
17
24
  };
18
25
 
19
- export const Input = ({
20
- state = 'default',
21
- defaultValue = '',
22
- focusOnMount = false,
23
- className,
24
- onChange,
25
- children,
26
- icon: Icon,
27
- ...inputProps
28
- }: PropsWithChildren<Props>) => {
29
- const inputRef = useRef<HTMLInputElement>(null);
30
- const [isFocused, setIsFocused] = useState(false);
31
- const [value, setValue] = useState(defaultValue);
26
+ export const Input = forwardRef<HTMLInputElement, PropsWithChildren<Props>>(
27
+ (
28
+ {
29
+ state = 'default',
30
+ defaultValue = '',
31
+ focusOnMount = false,
32
+ className,
33
+ onChange,
34
+ children,
35
+ icon: Icon,
36
+ ...inputProps
37
+ },
38
+ ref,
39
+ ) => {
40
+ const inputRef = useRef<HTMLInputElement>(null);
32
41
 
33
- const handleFocus = () => setIsFocused(true);
34
- const handleBlur = () => setIsFocused(false);
35
- const handleClear = () => {
36
- setValue('');
37
- onChange?.({
38
- target: { value: '' },
39
- } as React.ChangeEvent<HTMLInputElement>);
40
- };
42
+ useImperativeHandle(ref, () => inputRef.current!);
41
43
 
42
- const onInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
43
- setValue(e.target.value);
44
- onChange?.(e);
45
- };
44
+ const [isFocused, setIsFocused] = useState(false);
45
+ const [value, setValue] = useState(defaultValue);
46
46
 
47
- useEffect(() => {
48
- setValue(defaultValue);
49
- }, [defaultValue]);
47
+ const handleFocus = () => setIsFocused(true);
48
+ const handleBlur = () => setIsFocused(false);
49
+ const handleClear = () => {
50
+ setValue('');
51
+ onChange?.({
52
+ target: { value: '' },
53
+ } as React.ChangeEvent<HTMLInputElement>);
54
+ };
50
55
 
51
- useEffect(() => {
52
- if (focusOnMount) {
53
- inputRef.current?.focus();
54
- }
55
- }, []);
56
+ const onInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
57
+ setValue(e.target.value);
58
+ onChange?.(e);
59
+ };
56
60
 
57
- const inputDisabled = ['disabled', 'fixed'].includes(state);
61
+ useEffect(() => {
62
+ setValue(defaultValue);
63
+ }, [defaultValue]);
58
64
 
59
- return (
60
- <UIInput
61
- type="text"
62
- as={Fragment}
63
- disabled={inputDisabled}
64
- autoComplete="off"
65
- className={cn(
66
- 'px-sw-lg py-sw-lg text-sw-label-md rounded-sw-md ring-transparent ring-1 ring-inset data-focus:outline-none transition-colors bg-sw-gray-800',
67
- {
68
- 'text-sw-gray-400 bg-sw-gray-800': state === 'fixed',
69
- 'text-sw-status-error bg-sw-gray-800': state === 'error',
70
- 'text-sw-gray-50 bg-sw-gray-700': isFocused && state === 'default',
71
- 'text-sw-gray-50 hover:bg-sw-gray-700':
72
- !isFocused && state === 'default',
73
- 'cursor-not-allowed bg-sw-gray-800 text-sw-gray-400':
74
- state === 'disabled',
75
- },
76
- className,
77
- )}
78
- {...inputProps}>
79
- {() => (
80
- <div className="flex items-center justify-between">
81
- {Icon && <Icon size={16} className="mr-sw-md text-sw-gray-200" />}
82
- <input
83
- value={value}
84
- ref={inputRef}
85
- onBlur={handleBlur}
86
- onFocus={handleFocus}
87
- onChange={onInputChange}
88
- disabled={inputDisabled}
89
- placeholder={inputProps.placeholder}
90
- autoComplete="off"
91
- className={cn('text-sw-label-md mr-auto w-full outline-none', {
92
- 'cursor-not-allowed': state === 'disabled',
93
- })}
94
- />
95
- {!inputDisabled && (
96
- <div className="gap-sw-md relative flex items-center justify-end">
97
- {children}
98
- {value ? (
99
- <button
100
- type="button"
101
- className={cn(
102
- 'opacity-0 transition-opacity duration-150 ease-in-out hover:text-sw-gray-50',
103
- {
104
- 'cursor-pointer opacity-100': !!value,
105
- 'cursor-default text-sw-gray-200': isFocused,
106
- 'cursor-default text-sw-gray-300': !isFocused,
107
- },
108
- )}
109
- onClick={handleClear}>
110
- <Icons.X className="h-sw-xl w-sw-xl" />
111
- </button>
112
- ) : null}
113
- </div>
114
- )}
115
- </div>
116
- )}
117
- </UIInput>
118
- );
119
- };
65
+ useEffect(() => {
66
+ if (focusOnMount) {
67
+ inputRef.current?.focus();
68
+ }
69
+ }, []);
70
+
71
+ const inputDisabled = ['disabled', 'fixed'].includes(state);
72
+
73
+ return (
74
+ <UIInput
75
+ type="text"
76
+ as={Fragment}
77
+ disabled={inputDisabled}
78
+ autoComplete="off"
79
+ className={cn(
80
+ 'px-sw-lg py-sw-lg text-sw-label-md rounded-sw-md ring-transparent ring-1 ring-inset data-focus:outline-none transition-colors bg-sw-gray-800',
81
+ {
82
+ 'text-sw-gray-400 bg-sw-gray-800': state === 'fixed',
83
+ 'text-sw-status-error bg-sw-gray-800': state === 'error',
84
+ 'text-sw-gray-50 bg-sw-gray-700': isFocused && state === 'default',
85
+ 'text-sw-gray-50 hover:bg-sw-gray-700':
86
+ !isFocused && state === 'default',
87
+ 'cursor-not-allowed bg-sw-gray-800 text-sw-gray-400':
88
+ state === 'disabled',
89
+ },
90
+ className,
91
+ )}
92
+ {...inputProps}>
93
+ {() => (
94
+ <div className="flex items-center justify-between">
95
+ {Icon && <Icon size={16} className="mr-sw-md text-sw-gray-200" />}
96
+ <input
97
+ value={value}
98
+ ref={inputRef}
99
+ onBlur={handleBlur}
100
+ onFocus={handleFocus}
101
+ onChange={onInputChange}
102
+ disabled={inputDisabled}
103
+ placeholder={inputProps.placeholder}
104
+ autoComplete="off"
105
+ className={cn('text-sw-label-md mr-auto w-full outline-none', {
106
+ 'cursor-not-allowed': state === 'disabled',
107
+ })}
108
+ />
109
+ {!inputDisabled && (
110
+ <div className="gap-sw-md relative flex items-center justify-end">
111
+ {children}
112
+ {value ? (
113
+ <button
114
+ type="button"
115
+ className={cn(
116
+ 'opacity-0 transition-opacity duration-150 ease-in-out hover:text-sw-gray-50',
117
+ {
118
+ 'cursor-pointer opacity-100': !!value,
119
+ 'cursor-default text-sw-gray-200': isFocused,
120
+ 'cursor-default text-sw-gray-300': !isFocused,
121
+ },
122
+ )}
123
+ onClick={handleClear}>
124
+ <Icons.X className="h-sw-xl w-sw-xl" />
125
+ </button>
126
+ ) : null}
127
+ </div>
128
+ )}
129
+ </div>
130
+ )}
131
+ </UIInput>
132
+ );
133
+ },
134
+ );
@@ -1,4 +1,4 @@
1
- import { useState } from 'react';
1
+ import { useRef, useState } from 'react';
2
2
  import * as Icons from 'lucide-react';
3
3
 
4
4
  import { TokensList } from './TokensList';
@@ -46,12 +46,28 @@ export const TokensModal = ({
46
46
  const { ctx } = useUnsafeSnapshot();
47
47
  const { walletSupportedChains } = useConfig();
48
48
 
49
+ const searchInputRef = useRef<HTMLInputElement>(null);
49
50
  const [search, setSearch] = useState('');
50
51
  const chains = useChains(variant);
51
52
 
52
53
  const handleClose = () => onMsg({ type: 'on_dismiss_tokens_modal' });
53
54
 
54
- useHandleKeyDown('Escape', handleClose);
55
+ useHandleKeyDown(
56
+ 'Escape',
57
+ () => {
58
+ if (search) {
59
+ setSearch('');
60
+ } else {
61
+ handleClose();
62
+ }
63
+ },
64
+ [search],
65
+ );
66
+
67
+ useHandleKeyDown('Alphanumeric', (key) => {
68
+ setSearch((s) => s + key);
69
+ searchInputRef.current?.focus();
70
+ });
55
71
 
56
72
  // If there is only one chain available, select it by default
57
73
  const defaultChain =
@@ -84,6 +100,7 @@ export const TokensModal = ({
84
100
  <Input
85
101
  focusOnMount
86
102
  icon={Icons.Search}
103
+ ref={searchInputRef}
87
104
  defaultValue={search}
88
105
  className="w-full"
89
106
  placeholder="Search or paste address"
@@ -1,10 +1,32 @@
1
1
  import { useEffect } from 'react';
2
2
 
3
- export const useHandleKeyDown = (key: string, onKeyPress: () => void) => {
3
+ const isLetter = (key: string) => {
4
+ return key.length === 1 && /^[a-z]$/i.test(key);
5
+ };
6
+
7
+ const isNumber = (key: string) => {
8
+ return key.length === 1 && /^[0-9]$/.test(key);
9
+ };
10
+
11
+ const isAlphanumeric = (key: string) => {
12
+ return isLetter(key) || isNumber(key);
13
+ };
14
+
15
+ export const useHandleKeyDown = (
16
+ key: 'Escape' | 'ArrowDown' | 'ArrowUp' | 'Alphanumeric',
17
+ onKeyPress: (key: string) => void,
18
+ deps: unknown[] = [],
19
+ ) => {
4
20
  useEffect(() => {
5
21
  const handleKeyDown = (event: KeyboardEvent) => {
22
+ if (key === 'Alphanumeric' && isAlphanumeric(event.key)) {
23
+ onKeyPress(event.key);
24
+
25
+ return;
26
+ }
27
+
6
28
  if (event.key === key) {
7
- onKeyPress();
29
+ onKeyPress(key);
8
30
  }
9
31
  };
10
32
 
@@ -13,5 +35,5 @@ export const useHandleKeyDown = (key: string, onKeyPress: () => void) => {
13
35
  return () => {
14
36
  window.removeEventListener('keydown', handleKeyDown);
15
37
  };
16
- }, [key]);
38
+ }, [key, ...deps]);
17
39
  };
@@ -1,12 +1,12 @@
1
1
  import {
2
- BridgeSDK,
3
2
  createIntentSignerNEP413,
4
3
  createInternalTransferRoute,
5
4
  createNearWithdrawalRoute,
6
5
  FeeExceedsAmountError,
6
+ IntentsSDK,
7
7
  MinWithdrawalAmountError,
8
8
  type RouteConfig,
9
- } from '@defuse-protocol/bridge-sdk';
9
+ } from '@defuse-protocol/intents-sdk';
10
10
  import type { NearWalletBase as NearWallet } from '@hot-labs/near-connect/build/types/wallet';
11
11
  import { snakeCase } from 'change-case';
12
12
  import { generateRandomBytes } from '../utils/near/getRandomBytes';
@@ -18,6 +18,7 @@ import { TransferError } from '@/errors';
18
18
  import { INTENTS_CONTRACT } from '@/constants';
19
19
  import { CHAIN_IDS_MAP } from '@/constants/chains';
20
20
  import { notReachable } from '@/utils/notReachable';
21
+ import { isErrorLikeObject } from '@/utils/isErrorLikeObject';
21
22
  import { localStorageTyped } from '@/utils/localstorage';
22
23
  import { queryContract } from '@/utils/near/queryContract';
23
24
  import { IntentSignerPrivy } from '@/utils/intents/signers/privy';
@@ -245,7 +246,7 @@ export const useMakeIntentsTransfer = ({ providers }: IntentsTransferArgs) => {
245
246
  notReachable(intentsAccountType);
246
247
  }
247
248
 
248
- const sdk = new BridgeSDK({ referral: snakeCase(appName) });
249
+ const sdk = new IntentsSDK({ referral: snakeCase(appName) });
249
250
 
250
251
  sdk.setIntentSigner(signer);
251
252
 
@@ -261,35 +262,48 @@ export const useMakeIntentsTransfer = ({ providers }: IntentsTransferArgs) => {
261
262
  routeConfig = createInternalTransferRoute();
262
263
  }
263
264
 
264
- const withdrawal = sdk.createWithdrawal({
265
- withdrawalParams: {
266
- assetId: ctx.sourceToken.assetId,
267
- amount: BigInt(ctx.sourceTokenAmount),
268
- destinationAddress: getDestinationAddress(
269
- ctx,
270
- isDirectNearTokenWithdrawal || isDirectNonNearWithdrawal,
271
- ),
272
- destinationMemo: undefined,
273
- feeInclusive: false,
274
- routeConfig,
275
- },
276
- });
265
+ const withdrawalParams = {
266
+ assetId: ctx.sourceToken.assetId,
267
+ amount: BigInt(ctx.sourceTokenAmount),
268
+ destinationAddress: getDestinationAddress(
269
+ ctx,
270
+ isDirectNearTokenWithdrawal || isDirectNonNearWithdrawal,
271
+ ),
272
+ destinationMemo: undefined,
273
+ feeInclusive: false,
274
+ routeConfig,
275
+ };
276
+
277
+ onPending('WAITING_CONFIRMATION');
277
278
 
278
279
  try {
279
- await withdrawal.estimateFee();
280
+ const feeEstimation = await sdk.estimateWithdrawalFee({
281
+ withdrawalParams,
282
+ });
280
283
 
281
- onPending('WAITING_CONFIRMATION');
282
- const txIntent = await withdrawal.signAndSendIntent();
284
+ const { intentHash } = await sdk.signAndSendWithdrawalIntent({
285
+ withdrawalParams,
286
+ feeEstimation,
287
+ });
283
288
 
284
289
  onPending('PROCESSING');
285
- const tx = await withdrawal.waitForIntentSettlement();
290
+ const intentTx = await sdk.waitForIntentSettlement({ intentHash });
286
291
 
287
- await withdrawal.waitForWithdrawalCompletion();
292
+ const completionResult = await sdk.waitForWithdrawalCompletion({
293
+ withdrawalParams,
294
+ intentTx,
295
+ });
288
296
 
289
297
  return {
290
- hash: tx.hash,
291
- transactionLink: getTransactionLink(CHAIN_IDS_MAP.near, tx.hash),
292
- intent: txIntent,
298
+ intent: intentTx.hash,
299
+ // no hash means completion not trackable for this bridge
300
+ hash: completionResult.hash ?? '',
301
+ transactionLink: completionResult.hash
302
+ ? getTransactionLink(
303
+ CHAIN_IDS_MAP[ctx.targetToken.blockchain],
304
+ completionResult.hash,
305
+ )
306
+ : '',
293
307
  };
294
308
  } catch (e: unknown) {
295
309
  logger.error('[TRANSFER ERROR]', e);
@@ -313,7 +327,7 @@ export const useMakeIntentsTransfer = ({ providers }: IntentsTransferArgs) => {
313
327
  });
314
328
  }
315
329
 
316
- if (e instanceof Error) {
330
+ if (isErrorLikeObject(e)) {
317
331
  if (e.message.includes('Fee is not estimated')) {
318
332
  throw new TransferError({
319
333
  code: 'FEES_NOT_ESTIMATED',
@@ -321,10 +335,7 @@ export const useMakeIntentsTransfer = ({ providers }: IntentsTransferArgs) => {
321
335
  }
322
336
 
323
337
  // User rejected
324
- if (
325
- isUserDeniedSigning(e.message) ||
326
- isUserDeniedSigning(`${e.cause}`)
327
- ) {
338
+ if (isUserDeniedSigning(e)) {
328
339
  return undefined;
329
340
  }
330
341
  }
@@ -5,6 +5,8 @@ import { getNearNep141StorageBalance } from '../utils/near/getNearNep141StorageB
5
5
  import { getNearNep141MinStorageBalance } from '../utils/near/getNearNep141MinStorageBalance';
6
6
  import { logger } from '@/logger';
7
7
  import { TransferError } from '@/errors';
8
+ import { isErrorLikeObject } from '@/utils/isErrorLikeObject';
9
+ import { isUserDeniedSigning } from '@/utils/checkers/isUserDeniedSigning';
8
10
  import { useComputedSnapshot, useUnsafeSnapshot } from '@/machine/snap';
9
11
  import { NATIVE_NEAR_DUMB_ASSET_ID, WNEAR_ASSET_ID } from '@/constants/tokens';
10
12
  import type { TransferResult } from '@/types/transfer';
@@ -139,6 +141,10 @@ export function useMakeNEARFtTransferCall(
139
141
  code: 'NO_DEPOSIT_RESULT',
140
142
  });
141
143
  } catch (err: unknown) {
144
+ if (isErrorLikeObject(err) && isUserDeniedSigning(err)) {
145
+ return;
146
+ }
147
+
142
148
  logger.error('[TRANSFER ERROR]', err);
143
149
  throw new TransferError({
144
150
  code: 'DIRECT_TRANSFER_ERROR',
@@ -214,6 +220,10 @@ export function useMakeNEARFtTransferCall(
214
220
  code: 'NO_DEPOSIT_RESULT',
215
221
  });
216
222
  } catch (err: unknown) {
223
+ if (isErrorLikeObject(err) && isUserDeniedSigning(err)) {
224
+ return;
225
+ }
226
+
217
227
  logger.error('[TRANSFER ERROR]', err);
218
228
  throw new TransferError({
219
229
  code: 'DIRECT_TRANSFER_ERROR',
@@ -12,6 +12,7 @@ import { logger } from '@/logger';
12
12
  import { TransferError } from '@/errors';
13
13
  import { useUnsafeSnapshot } from '@/machine/snap';
14
14
  import { NATIVE_NEAR_DUMB_ASSET_ID } from '@/constants/tokens';
15
+ import { isErrorLikeObject } from '@/utils/isErrorLikeObject';
15
16
  import { isUserDeniedSigning } from '@/utils/checkers/isUserDeniedSigning';
16
17
  import type { MakeTransferArgs, TransferResult } from '@/types/transfer';
17
18
 
@@ -139,7 +140,7 @@ export const useMakeQuoteTransfer = ({
139
140
  let errorMessage = 'Failed to make a transfer. Please try again.';
140
141
 
141
142
  const userCancelledTx =
142
- error instanceof Error && isUserDeniedSigning(error.message);
143
+ isErrorLikeObject(error) && isUserDeniedSigning(error);
143
144
 
144
145
  if (userCancelledTx) {
145
146
  return;
@@ -1,3 +1,5 @@
1
+ import type { ErrorLikeObject } from '../isErrorLikeObject';
2
+
1
3
  const errorVariations = [
2
4
  'user denied',
3
5
  'user closed',
@@ -6,8 +8,14 @@ const errorVariations = [
6
8
  'user declined',
7
9
  ];
8
10
 
9
- export const isUserDeniedSigning = (errorMessage: string) => {
10
- return errorVariations.some((variation) =>
11
- errorMessage.toLowerCase().includes(variation),
11
+ export const isUserDeniedSigning = (error: ErrorLikeObject) => {
12
+ return (
13
+ errorVariations.some((variation) =>
14
+ error.message.toLowerCase().includes(variation),
15
+ ) ||
16
+ ('cause' in error &&
17
+ errorVariations.some((variation) =>
18
+ `${error.cause}`.toLowerCase().includes(variation),
19
+ ))
12
20
  );
13
21
  };
@@ -21,3 +21,4 @@ export { formatAddressTruncate } from './formatters/formatAddressTruncate';
21
21
  export { cn } from './cn';
22
22
  export { noop } from './noop';
23
23
  export { notReachable } from './notReachable';
24
+ export { isErrorLikeObject } from './isErrorLikeObject';