@velora-dex/widget 0.8.1-dev.0 → 0.8.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 (615) hide show
  1. package/dist/components/SearchInput/SearchInput.js.map +1 -1
  2. package/dist/components/ui/accordion.js.map +1 -1
  3. package/dist/components/ui/button.js.map +1 -1
  4. package/dist/components/ui/card.js.map +1 -1
  5. package/dist/components/ui/drawer.js.map +1 -1
  6. package/dist/components/ui/dropdown-menu.js.map +1 -1
  7. package/dist/components/ui/input.js.map +1 -1
  8. package/dist/components/ui/progress.js.map +1 -1
  9. package/dist/components/ui/skeleton.js.map +1 -1
  10. package/dist/components/ui/sonner.js.map +1 -1
  11. package/dist/components/ui/switch.js.map +1 -1
  12. package/dist/components/ui/tooltip.js.map +1 -1
  13. package/dist/components/web3/AccountButton.js.map +1 -1
  14. package/dist/components/web3/ConnectExternalProvider/AutoconnectExternal.js.map +1 -1
  15. package/dist/components/web3/ConnectExternalProvider/metamaskProviderWrapper.d.ts +1 -0
  16. package/dist/components/web3/ConnectExternalProvider/metamaskProviderWrapper.d.ts.map +1 -1
  17. package/dist/components/web3/ConnectExternalProvider/metamaskProviderWrapper.js +30 -16
  18. package/dist/components/web3/ConnectExternalProvider/metamaskProviderWrapper.js.map +1 -1
  19. package/dist/components/web3/ConnectExternalProvider/safeProviderWrapper.js.map +1 -1
  20. package/dist/components/web3/ConnectExternalProvider/utils.js.map +1 -1
  21. package/dist/components/web3/ConnectWallets/WalletConnectButtons.js.map +1 -1
  22. package/dist/components/web3/ConnectWallets/index.js +1 -1
  23. package/dist/components/web3/ConnectWallets/index.js.map +1 -1
  24. package/dist/components/web3/ConnectWallets/privy/button.js.map +1 -1
  25. package/dist/components/web3/ConnectWallets/privy/connectRunner.js.map +1 -1
  26. package/dist/components/web3/ConnectWallets/privy/iframe.js.map +1 -1
  27. package/dist/components/web3/ConnectWallets/privy/provider.js.map +1 -1
  28. package/dist/components/web3/ConnectWallets/walletFlags.js.map +1 -1
  29. package/dist/components/web3/ConnectWallets/walletIcons.js +1 -1
  30. package/dist/components/web3/ConnectWallets/walletIcons.js.map +1 -1
  31. package/dist/components/web3/ConnectedWallet/ConnectedWallet.js.map +1 -1
  32. package/dist/components/web3/providers.js.map +1 -1
  33. package/dist/components/widget/AppHeader/Activities/Activities.js.map +1 -1
  34. package/dist/components/widget/AppHeader/Activities/ActivitiesScreen.js.map +1 -1
  35. package/dist/components/widget/AppHeader/Activities/ActivityItems.js.map +1 -1
  36. package/dist/components/widget/AppHeader/Activities/Drawers.js.map +1 -1
  37. package/dist/components/widget/AppHeader/Activities/hooks.js.map +1 -1
  38. package/dist/components/widget/AppHeader/Activities/utils.js.map +1 -1
  39. package/dist/components/widget/AppHeader/ActivityButton.js.map +1 -1
  40. package/dist/components/widget/AppHeader/AppHeader.js.map +1 -1
  41. package/dist/components/widget/AppHeader/TradeModeSwitcher.d.ts.map +1 -1
  42. package/dist/components/widget/AppHeader/TradeModeSwitcher.js +61 -53
  43. package/dist/components/widget/AppHeader/TradeModeSwitcher.js.map +1 -1
  44. package/dist/components/widget/AppHeader/state/showMoreAtom.js.map +1 -1
  45. package/dist/components/widget/BridgeList/BridgeListItem.js.map +1 -1
  46. package/dist/components/widget/BridgeList/BridgeProtocolsList.js.map +1 -1
  47. package/dist/components/widget/BridgeList/BridgesList.js.map +1 -1
  48. package/dist/components/widget/BridgeList/hooks.js.map +1 -1
  49. package/dist/components/widget/BridgePreferences/BridgePreferences.js.map +1 -1
  50. package/dist/components/widget/BridgeSelectorExpandable/BridgeSelectorExpandable.js.map +1 -1
  51. package/dist/components/widget/Button/CancelButton/CancelButton.js.map +1 -1
  52. package/dist/components/widget/Button/CancelButton/CancelButtonWithDrawer.js.map +1 -1
  53. package/dist/components/widget/Button/DismissButton.js.map +1 -1
  54. package/dist/components/widget/Button/RefreshButton.d.ts +3 -0
  55. package/dist/components/widget/Button/RefreshButton.d.ts.map +1 -0
  56. package/dist/components/widget/Button/RefreshButton.js +28 -0
  57. package/dist/components/widget/Button/RefreshButton.js.map +1 -0
  58. package/dist/components/widget/Button/types.d.ts +7 -0
  59. package/dist/components/widget/Button/types.d.ts.map +1 -0
  60. package/dist/components/widget/CompareQuotes/CompareQuotes.d.ts.map +1 -1
  61. package/dist/components/widget/CompareQuotes/CompareQuotes.js +67 -73
  62. package/dist/components/widget/CompareQuotes/CompareQuotes.js.map +1 -1
  63. package/dist/components/widget/Details/DetailWithTooltip.js.map +1 -1
  64. package/dist/components/widget/Details/DetailWithValueList.js.map +1 -1
  65. package/dist/components/widget/Details/DetailWithValueListExpandable.js.map +1 -1
  66. package/dist/components/widget/Details/SwapDetailsExpandable.js.map +1 -1
  67. package/dist/components/widget/DexesList/DexItem.js.map +1 -1
  68. package/dist/components/widget/DexesList/DexesList.js.map +1 -1
  69. package/dist/components/widget/DexesList/getDexProps.js.map +1 -1
  70. package/dist/components/widget/Dialog/ReceiverAddressDialog/ReceiverAddressDialog.js.map +1 -1
  71. package/dist/components/widget/Dialog/ReceiverAddressDialog/ReceiverAddressInput.js.map +1 -1
  72. package/dist/components/widget/Dialog/SelectTokenDialog/SelectTokenDialog.js.map +1 -1
  73. package/dist/components/widget/Dialog/SelectTokenDialog/TokenListBody/AcrossTokenList.js.map +1 -1
  74. package/dist/components/widget/Dialog/SelectTokenDialog/TokenListBody/RegularTokenList.js.map +1 -1
  75. package/dist/components/widget/Dialog/SelectTokenDialog/TokenListBody/TokenCloud/index.js.map +1 -1
  76. package/dist/components/widget/Dialog/SelectTokenDialog/TokenListBody/TokenListBody.js.map +1 -1
  77. package/dist/components/widget/Dialog/SelectTokenDialog/TokenListBody/TokenListRow.js.map +1 -1
  78. package/dist/components/widget/Dialog/SelectTokenDialog/TokenSearch.js.map +1 -1
  79. package/dist/components/widget/Drawer/Overlay.js.map +1 -1
  80. package/dist/components/widget/Drawer/index.js.map +1 -1
  81. package/dist/components/widget/Drawer/state/useDrawerControls.js.map +1 -1
  82. package/dist/components/widget/Dropdown/DropdownWithItems.d.ts.map +1 -1
  83. package/dist/components/widget/Dropdown/DropdownWithItems.js +3 -2
  84. package/dist/components/widget/Dropdown/DropdownWithItems.js.map +1 -1
  85. package/dist/components/widget/Dropdown/types.d.ts +1 -1
  86. package/dist/components/widget/Dropdown/types.d.ts.map +1 -1
  87. package/dist/components/widget/Duration/Duration.js.map +1 -1
  88. package/dist/components/widget/Duration/utils.js.map +1 -1
  89. package/dist/components/widget/EnabledExchanges/EnabledExchanges.js.map +1 -1
  90. package/dist/components/widget/EnabledExchanges/EnabledExchangesList.js.map +1 -1
  91. package/dist/components/widget/EnabledList/EnabledList.js.map +1 -1
  92. package/dist/components/widget/FetchingQuotes/FetchingQuotes.js.map +1 -1
  93. package/dist/components/widget/Icon/CheckIcon.js.map +1 -1
  94. package/dist/components/widget/Icon/ChevronIcon.js.map +1 -1
  95. package/dist/components/widget/Icon/DeltaIcon.js.map +1 -1
  96. package/dist/components/widget/Icon/EllipseIcon.js.map +1 -1
  97. package/dist/components/widget/Icon/InfoIcon.js.map +1 -1
  98. package/dist/components/widget/Icon/MarketIcon.js.map +1 -1
  99. package/dist/components/widget/Icon/SliderIcon.js.map +1 -1
  100. package/dist/components/widget/ImportToken/ImportToken.js.map +1 -1
  101. package/dist/components/widget/ImportToken/useImportTokenDrawer.js.map +1 -1
  102. package/dist/components/widget/LimitOrderItem/LimitOrderDetails/Controls.js.map +1 -1
  103. package/dist/components/widget/LimitOrderItem/LimitOrderDetails/LimitOrderDetails.js.map +1 -1
  104. package/dist/components/widget/LimitOrderItem/LimitOrderDetails/utils.js.map +1 -1
  105. package/dist/components/widget/LimitOrderItem/LimitOrderListItem.js +5 -8
  106. package/dist/components/widget/LimitOrderItem/LimitOrderListItem.js.map +1 -1
  107. package/dist/components/widget/LimitOrderItem/constants.js.map +1 -1
  108. package/dist/components/widget/LimitOrderItem/utils.js.map +1 -1
  109. package/dist/components/widget/LimitPriceInput/index.js +6 -6
  110. package/dist/components/widget/LimitPriceInput/index.js.map +1 -1
  111. package/dist/components/widget/Line/Line.js.map +1 -1
  112. package/dist/components/widget/ListItem/ListItemWithSwitch.js.map +1 -1
  113. package/dist/components/widget/NetworkIcon/NetworkIconSquare.js.map +1 -1
  114. package/dist/components/widget/NetworkSwitcher/CompactNetworkSwitcher.js.map +1 -1
  115. package/dist/components/widget/NetworkSwitcher/NetworkSwitcherDropdown.js.map +1 -1
  116. package/dist/components/widget/NetworkSwitcher/NetworkSwitcherList.js.map +1 -1
  117. package/dist/components/widget/NetworkSwitcher/common/AllNetworksItem.js.map +1 -1
  118. package/dist/components/widget/NetworkSwitcher/common/NetworkItem.js.map +1 -1
  119. package/dist/components/widget/NetworkSwitcher/utils/items.js.map +1 -1
  120. package/dist/components/widget/NetworkWithIcon/NetworkIconWithChevron.js.map +1 -1
  121. package/dist/components/widget/NetworkWithIcon/NetworkWithIcon.js.map +1 -1
  122. package/dist/components/widget/NumberInput/NumberInput.js.map +1 -1
  123. package/dist/components/widget/OrderExpiryInput/index.js.map +1 -1
  124. package/dist/components/widget/OtcOrderItem/OtcOrderDetails/Controls.js.map +1 -1
  125. package/dist/components/widget/OtcOrderItem/OtcOrderDetails/OtcOrderDetails.js.map +1 -1
  126. package/dist/components/widget/OtcOrderItem/OtcOrderDetails/utils.js.map +1 -1
  127. package/dist/components/widget/OtcOrderItem/OtcOrderListItem.js +5 -8
  128. package/dist/components/widget/OtcOrderItem/OtcOrderListItem.js.map +1 -1
  129. package/dist/components/widget/OtcOrderItem/constants.js.map +1 -1
  130. package/dist/components/widget/OtcOrderItem/utils.js.map +1 -1
  131. package/dist/components/widget/PayReceiveInfo/PayReceiveInfo.js.map +1 -1
  132. package/dist/components/widget/PoweredBy/PoweredBy.js.map +1 -1
  133. package/dist/components/widget/ReceiverAddress/ReceiverAddress.js.map +1 -1
  134. package/dist/components/widget/ReceiverAddress/state/receiverAddressAtom.js.map +1 -1
  135. package/dist/components/widget/ReceiverAddress/state/subscriptions.js.map +1 -1
  136. package/dist/components/widget/ReviewAndConfirm/FillOtcReviewAndConfirm/FillOtcControls.js.map +1 -1
  137. package/dist/components/widget/ReviewAndConfirm/FillOtcReviewAndConfirm/FillOtcReviewAndConfirm.js.map +1 -1
  138. package/dist/components/widget/ReviewAndConfirm/FillOtcReviewAndConfirm/utils.js.map +1 -1
  139. package/dist/components/widget/RowVirtualizer/RowVirtualizerFixed.js.map +1 -1
  140. package/dist/components/widget/Screen/GenericScreen.js.map +1 -1
  141. package/dist/components/widget/Screen/ScreenContainer.js.map +1 -1
  142. package/dist/components/widget/SelectToken/SelectTokenButton.js.map +1 -1
  143. package/dist/components/widget/SettingsButton/SettingsButton.js.map +1 -1
  144. package/dist/components/widget/SwapModeSwitcher/SwapModeSwitcherExpandable.js.map +1 -1
  145. package/dist/components/widget/SwapModeSwitcher/state/swapModeActionsAtom.js.map +1 -1
  146. package/dist/components/widget/SwapModeSwitcher/state/swapSideAtom.js.map +1 -1
  147. package/dist/components/widget/SwapRate/SwapRate.js.map +1 -1
  148. package/dist/components/widget/SwapRate/SwapRateWithTooltip.js.map +1 -1
  149. package/dist/components/widget/SwapRate/utils.js.map +1 -1
  150. package/dist/components/widget/SwapRateWithPriceImpactRow/SwapRateWithPriceImpactRow.d.ts +4 -1
  151. package/dist/components/widget/SwapRateWithPriceImpactRow/SwapRateWithPriceImpactRow.d.ts.map +1 -1
  152. package/dist/components/widget/SwapRateWithPriceImpactRow/SwapRateWithPriceImpactRow.js +51 -28
  153. package/dist/components/widget/SwapRateWithPriceImpactRow/SwapRateWithPriceImpactRow.js.map +1 -1
  154. package/dist/components/widget/Tabs/Tabs.js.map +1 -1
  155. package/dist/components/widget/Toasts/CustomToast.js.map +1 -1
  156. package/dist/components/widget/TokenBadge/TokenBadge.js.map +1 -1
  157. package/dist/components/widget/TokenBadge/TokenLink.js.map +1 -1
  158. package/dist/components/widget/TokenInput/InputContainer.js.map +1 -1
  159. package/dist/components/widget/TokenInput/InputField.js.map +1 -1
  160. package/dist/components/widget/TokenInput/InputFooter.js.map +1 -1
  161. package/dist/components/widget/TokenInput/InputHeader.js.map +1 -1
  162. package/dist/components/widget/TokenInput/common/Balance.js.map +1 -1
  163. package/dist/components/widget/TokenInput/common/MaxButtons.js.map +1 -1
  164. package/dist/components/widget/TokenInput/index.js.map +1 -1
  165. package/dist/components/widget/TokenSwitcher/TokenSwitcher.js.map +1 -1
  166. package/dist/components/widget/TradeOverview/CancelButtonWithDrawer.js.map +1 -1
  167. package/dist/components/widget/TradeOverview/CancelOrder/ConfirmCancel.js.map +1 -1
  168. package/dist/components/widget/TradeOverview/CancelOrder/utils.js.map +1 -1
  169. package/dist/components/widget/TradeOverview/DeltaOrderTradeOverview.js.map +1 -1
  170. package/dist/components/widget/TradeOverview/FillOtcOrderTradeOverview.js.map +1 -1
  171. package/dist/components/widget/TradeOverview/LimitOrderTradeOverview.js.map +1 -1
  172. package/dist/components/widget/TradeOverview/MarketSwapTradeOverview.js.map +1 -1
  173. package/dist/components/widget/TradeOverview/OtcOrderTradeOverview.js.map +1 -1
  174. package/dist/components/widget/TradeOverview/Step/Step.js.map +1 -1
  175. package/dist/components/widget/TradeOverview/Step/utils.js.map +1 -1
  176. package/dist/components/widget/TradeOverview/Stepper.js.map +1 -1
  177. package/dist/components/widget/TradeOverview/TradeComplete/TradeCompleteFooter.js.map +1 -1
  178. package/dist/components/widget/TradeOverview/TradeComplete/TradeCompleteHeader.js.map +1 -1
  179. package/dist/components/widget/TradeOverview/TradeComplete/TradeCompletedDetails.js.map +1 -1
  180. package/dist/components/widget/TradeOverview/TradeComplete/index.js.map +1 -1
  181. package/dist/components/widget/TradeOverview/TradeComplete/useTradeCompleteDetails.js.map +1 -1
  182. package/dist/components/widget/TradeOverview/TradeComplete/utils.js.map +1 -1
  183. package/dist/components/widget/TradeOverview/TradeDetails.js.map +1 -1
  184. package/dist/components/widget/TradeOverview/TradeDetailsDisplay.js.map +1 -1
  185. package/dist/components/widget/TradeOverview/TradeError/TradeErrorDetails.js.map +1 -1
  186. package/dist/components/widget/TradeOverview/TradeError/TradeErrorFooter.js.map +1 -1
  187. package/dist/components/widget/TradeOverview/TradeError/index.js.map +1 -1
  188. package/dist/components/widget/TradeOverview/TradeError/utils.js.map +1 -1
  189. package/dist/components/widget/TradeOverview/TradeOverview.js.map +1 -1
  190. package/dist/components/widget/TradeOverview/TradeOverviewFooter.js.map +1 -1
  191. package/dist/components/widget/TradeOverview/TradeOverviewHeader.js.map +1 -1
  192. package/dist/components/widget/TradeOverview/TradeOverviewScreen.js.map +1 -1
  193. package/dist/components/widget/TradeOverview/TwapOrderTradeOverview.js.map +1 -1
  194. package/dist/components/widget/TradeOverview/VerticalDash.js.map +1 -1
  195. package/dist/components/widget/TradeOverview/tradeFlowContext.js.map +1 -1
  196. package/dist/components/widget/TradeOverview/utils/isNonFlowStep.js.map +1 -1
  197. package/dist/components/widget/TradeOverview/utils/preWrap.js.map +1 -1
  198. package/dist/components/widget/TradeOverview/utils/useSwapAmountsWithSlippage.js.map +1 -1
  199. package/dist/components/widget/TradeParameters/BridgePreferenceParameters/BridgePreferenceParameters.js.map +1 -1
  200. package/dist/components/widget/TradeParameters/BridgePreferenceParameters/useDraftBridgePreferencesState.js.map +1 -1
  201. package/dist/components/widget/TradeParameters/DegenModeConfirmation.js.map +1 -1
  202. package/dist/components/widget/TradeParameters/DegenModeParameter.js.map +1 -1
  203. package/dist/components/widget/TradeParameters/DeltaParameter.js.map +1 -1
  204. package/dist/components/widget/TradeParameters/EIP1559Parameter.js.map +1 -1
  205. package/dist/components/widget/TradeParameters/EnabledExchangesParameters/EnabledExchangesParameters.js.map +1 -1
  206. package/dist/components/widget/TradeParameters/EnabledExchangesParameters/useDraftEnabledExchangesState.js.map +1 -1
  207. package/dist/components/widget/TradeParameters/SlippageParameter/CustomSlippageInput.js.map +1 -1
  208. package/dist/components/widget/TradeParameters/SlippageParameter/EditSlippage.js.map +1 -1
  209. package/dist/components/widget/TradeParameters/SlippageParameter/SlippageParameter.js.map +1 -1
  210. package/dist/components/widget/TradeParameters/SlippageParameter/hooks/useCustomSlippageProps.js.map +1 -1
  211. package/dist/components/widget/TradeParameters/TradeParameters.js.map +1 -1
  212. package/dist/components/widget/TradeParameters/TransactionSpeedParameter.js.map +1 -1
  213. package/dist/components/widget/TradeParameters/hooks/useIsNotDefaultAnyParameter.js.map +1 -1
  214. package/dist/components/widget/TradeParameters/state/bridgePreferences/bridgePreferenceAtom.js.map +1 -1
  215. package/dist/components/widget/TradeParameters/state/bridgePreferences/disabledBridgesAtom.js.map +1 -1
  216. package/dist/components/widget/TradeParameters/state/bridgePreferences/excludeBridgesAtom.js.map +1 -1
  217. package/dist/components/widget/TradeParameters/state/bridgePreferences/protocolNameAtom.js.map +1 -1
  218. package/dist/components/widget/TradeParameters/state/bridgePreferences/resetDraftsAtom.js.map +1 -1
  219. package/dist/components/widget/TradeParameters/state/bridgePreferences/useBridgePreferences.js.map +1 -1
  220. package/dist/components/widget/TradeParameters/state/deltaParamActionsAtom.js.map +1 -1
  221. package/dist/components/widget/TradeParameters/state/enabledExchanges/disabledDexesAtomFamily.js.map +1 -1
  222. package/dist/components/widget/TradeParameters/state/enabledExchanges/useDisabledDexes.js.map +1 -1
  223. package/dist/components/widget/TradeParameters/state/slippageParamAtom.js.map +1 -1
  224. package/dist/components/widget/TradeParameters/state/tradePreferencesAtom.js.map +1 -1
  225. package/dist/components/widget/TradeParameters/useTempTradeParameters.js.map +1 -1
  226. package/dist/components/widget/TransactionDetails/LimitOrderDetails/Controls.js.map +1 -1
  227. package/dist/components/widget/TransactionDetails/LimitOrderDetails/TransactionDetails.js.map +1 -1
  228. package/dist/components/widget/TransactionDetails/LimitOrderDetails/utils.js.map +1 -1
  229. package/dist/components/widget/TransactionDetails/TransactionListItem.js.map +1 -1
  230. package/dist/components/widget/TransactionDetails/utils.js.map +1 -1
  231. package/dist/components/widget/Twap/CustomDurationDrawer.js.map +1 -1
  232. package/dist/components/widget/Twap/OrderDuration.js.map +1 -1
  233. package/dist/components/widget/Twap/OrderSplit.js.map +1 -1
  234. package/dist/components/widget/Twap/RateProtection.js.map +1 -1
  235. package/dist/components/widget/Twap/TwapDetailWithTooltip.js.map +1 -1
  236. package/dist/components/widget/Warning/InsufficientBalanceMessage.js.map +1 -1
  237. package/dist/components/widget/Warning/Warning.js.map +1 -1
  238. package/dist/components/widget/Warning/WarningMessage.js.map +1 -1
  239. package/dist/components/widget/WrapEth/WrapEthContent.js.map +1 -1
  240. package/dist/components/widget/WrapEth/WrapEthDrawerButton.js.map +1 -1
  241. package/dist/components/widget/WrapEth/hooks/useSubmitDepositTxMutation.js.map +1 -1
  242. package/dist/components/widget/WrapEth/hooks/useWrapEthProps.js.map +1 -1
  243. package/dist/components/widget/YouGet/YouGet.js.map +1 -1
  244. package/dist/core/ConnectWalletDrawerButton.js.map +1 -1
  245. package/dist/core/LimitOrderButton.js.map +1 -1
  246. package/dist/core/LimitOrderDetails.js.map +1 -1
  247. package/dist/core/OtcOrderButton.js.map +1 -1
  248. package/dist/core/OtcOrderDetails.js.map +1 -1
  249. package/dist/core/Toaster.js.map +1 -1
  250. package/dist/core/TradeFlowScreenButton.js.map +1 -1
  251. package/dist/core/TwapDetails.js.map +1 -1
  252. package/dist/core/Updaters.js.map +1 -1
  253. package/dist/core/Warnings.js.map +1 -1
  254. package/dist/core/across/isCrosschainPossible.js.map +1 -1
  255. package/dist/core/across/utils.js.map +1 -1
  256. package/dist/core/button/hooks/useWidgetButtonExtraProps.js.map +1 -1
  257. package/dist/core/index.js.map +1 -1
  258. package/dist/core/inputs/hooks/useMaxButtonProps.js.map +1 -1
  259. package/dist/core/inputs/hooks/useTokenFromInputProps.js.map +1 -1
  260. package/dist/core/inputs/hooks/useTokenSwitcherProps.js.map +1 -1
  261. package/dist/core/inputs/hooks/useTokenToInputProps.js.map +1 -1
  262. package/dist/core/inputs/hooks/useWarningMessage.js.map +1 -1
  263. package/dist/core/inputs/hooks/utils.js.map +1 -1
  264. package/dist/core/inputs/state/common.js.map +1 -1
  265. package/dist/core/inputs/state/inputAmountAtom.js.map +1 -1
  266. package/dist/core/inputs/state/selectedTokenActionsAtom.js.map +1 -1
  267. package/dist/core/inputs/state/selectedTokenAtom.js.map +1 -1
  268. package/dist/core/inputs/state/setTokenByAddressAtom.d.ts.map +1 -1
  269. package/dist/core/inputs/state/setTokenByAddressAtom.js +1 -1
  270. package/dist/core/inputs/state/setTokenByAddressAtom.js.map +1 -1
  271. package/dist/core/inputs/state/subscriptions.js.map +1 -1
  272. package/dist/core/limit/state/deadlineAtom.js.map +1 -1
  273. package/dist/core/limit/state/isCrosschainAtom.js.map +1 -1
  274. package/dist/core/limit/state/limitInputActionsAtom.js.map +1 -1
  275. package/dist/core/limit/state/limitInputAmountAtom.js.map +1 -1
  276. package/dist/core/limit/state/receiverAddressAtom.js.map +1 -1
  277. package/dist/core/limit/state/selectedTokenActionsAtom.js.map +1 -1
  278. package/dist/core/limit/state/selectedTokenAtom.js.map +1 -1
  279. package/dist/core/limit/state/utils.js.map +1 -1
  280. package/dist/core/limit/useLimitDetailsListProps.js.map +1 -1
  281. package/dist/core/limit/useLimitNotSupported.js.map +1 -1
  282. package/dist/core/limit/useLimitPriceDifference.js.map +1 -1
  283. package/dist/core/limit/useLimitPriceInputProps.js.map +1 -1
  284. package/dist/core/limit/useLimitRate.js.map +1 -1
  285. package/dist/core/limit/useLimitTokenFromInputProps.js.map +1 -1
  286. package/dist/core/limit/useLimitTokenSwitcherProps.js.map +1 -1
  287. package/dist/core/limit/useLimitTokenToInputProps.js.map +1 -1
  288. package/dist/core/logger.js.map +1 -1
  289. package/dist/core/otc/state/deadlineAtom.js.map +1 -1
  290. package/dist/core/otc/state/otcInputActionsAtom.js.map +1 -1
  291. package/dist/core/otc/state/otcInputAmountAtom.js.map +1 -1
  292. package/dist/core/otc/state/receiverAddressAtom.js.map +1 -1
  293. package/dist/core/otc/state/selectedTokenActionsAtom.js.map +1 -1
  294. package/dist/core/otc/state/selectedTokenAtom.js.map +1 -1
  295. package/dist/core/otc/useOtcDetailsListProps.js.map +1 -1
  296. package/dist/core/otc/useOtcNotSupported.js.map +1 -1
  297. package/dist/core/otc/useOtcPriceDifference.js.map +1 -1
  298. package/dist/core/otc/useOtcPriceInputProps.js.map +1 -1
  299. package/dist/core/otc/useOtcTokenFromInputProps.js.map +1 -1
  300. package/dist/core/otc/useOtcTokenSwitcherProps.js.map +1 -1
  301. package/dist/core/otc/useOtcTokenToInputProps.js.map +1 -1
  302. package/dist/core/screen/hooks/useInitialValue.js.map +1 -1
  303. package/dist/core/screen/hooks/useOnClickOutside.js.map +1 -1
  304. package/dist/core/screen/hooks/useResizeObserver.js.map +1 -1
  305. package/dist/core/screen/hooks/useRunOnMount.js.map +1 -1
  306. package/dist/core/screen/state/hooks/useScreen.js.map +1 -1
  307. package/dist/core/screen/state/hooks/useScreenValue.js.map +1 -1
  308. package/dist/core/screen/state/hooks/useSetScreen.js.map +1 -1
  309. package/dist/core/screen/state/screenAtom.js.map +1 -1
  310. package/dist/core/state/apiConfigAtom.js.map +1 -1
  311. package/dist/core/state/chainToAtom.js.map +1 -1
  312. package/dist/core/state/configActionsAtom.js.map +1 -1
  313. package/dist/core/state/configAtom.js +2 -2
  314. package/dist/core/state/configAtom.js.map +1 -1
  315. package/dist/core/state/configEffectAtom.js.map +1 -1
  316. package/dist/core/state/containerAtom.js.map +1 -1
  317. package/dist/core/state/enabledChainsAtom.js.map +1 -1
  318. package/dist/core/state/enabledTradeModesAtom.d.ts +7 -1
  319. package/dist/core/state/enabledTradeModesAtom.d.ts.map +1 -1
  320. package/dist/core/state/enabledTradeModesAtom.js +1 -1
  321. package/dist/core/state/enabledTradeModesAtom.js.map +1 -1
  322. package/dist/core/state/externalProviderAtom.js.map +1 -1
  323. package/dist/core/state/getSelectableDestChains.js.map +1 -1
  324. package/dist/core/state/isCrosschainAtom.js.map +1 -1
  325. package/dist/core/state/tradeModeAtom.js +1 -1
  326. package/dist/core/state/tradeModeAtom.js.map +1 -1
  327. package/dist/core/state/validatedPartnerConfigAtom.js.map +1 -1
  328. package/dist/core/state/validatedReferrerConfigAtom.js.map +1 -1
  329. package/dist/core/state/widgetEventsAtom.js.map +1 -1
  330. package/dist/core/subscriptions.js.map +1 -1
  331. package/dist/core/swapDetails/fees.js.map +1 -1
  332. package/dist/core/swapDetails/maxToPay.js.map +1 -1
  333. package/dist/core/swapDetails/orderRouting.js.map +1 -1
  334. package/dist/core/swapDetails/priceImpact.js.map +1 -1
  335. package/dist/core/swapDetails/useSwapDetailsListProps.d.ts.map +1 -1
  336. package/dist/core/swapDetails/useSwapDetailsListProps.js +37 -31
  337. package/dist/core/swapDetails/useSwapDetailsListProps.js.map +1 -1
  338. package/dist/core/swapDetails/youGet.js.map +1 -1
  339. package/dist/core/twap/state/isCrosschainAtom.js.map +1 -1
  340. package/dist/core/twap/state/selectedTokenActionsAtom.js.map +1 -1
  341. package/dist/core/twap/state/twapInputAmountAtom.js.map +1 -1
  342. package/dist/core/twap/state/twapParamsAtom.js.map +1 -1
  343. package/dist/core/twap/state/twapSideAtom.js.map +1 -1
  344. package/dist/core/twap/twapDetails/minimumReceiveable.js.map +1 -1
  345. package/dist/core/twap/useTwapDetailsListProps.d.ts.map +1 -1
  346. package/dist/core/twap/useTwapDetailsListProps.js +36 -31
  347. package/dist/core/twap/useTwapDetailsListProps.js.map +1 -1
  348. package/dist/core/twap/useTwapTokenFromInputProps.js.map +1 -1
  349. package/dist/core/twap/useTwapTokenSwitcherProps.js.map +1 -1
  350. package/dist/core/twap/useTwapTokenToInputProps.js.map +1 -1
  351. package/dist/events/effects/formInput.js.map +1 -1
  352. package/dist/events/effects/price.js.map +1 -1
  353. package/dist/events/effects/swapMode.js.map +1 -1
  354. package/dist/events/getters/limit.js.map +1 -1
  355. package/dist/events/getters/otc.js.map +1 -1
  356. package/dist/events/getters/settings.js.map +1 -1
  357. package/dist/events/getters/swap.js.map +1 -1
  358. package/dist/events/getters/twap.js.map +1 -1
  359. package/dist/events/getters/widgetState.js.map +1 -1
  360. package/dist/events/hooks/useActivateEffects.js.map +1 -1
  361. package/dist/events/hooks/useOnPriceUpdates.js.map +1 -1
  362. package/dist/events/hooks/useOnWalletConnect.js.map +1 -1
  363. package/dist/external/.pnpm/vaul@1.1.2_patch_hash_07b36ba5def3805dde9d543a880ba9e4caf55e5eb58e544faaa2c186846bf3c1__6feb48fe37bd41e9af5c8e81d5a6f4e1/external/vaul/dist/index.js.map +1 -1
  364. package/dist/hooks/batch/useAwaitCalls.js.map +1 -1
  365. package/dist/hooks/batch/useBatchWithApproveTxs.js.map +1 -1
  366. package/dist/hooks/batch/useCanBatchTxs.js.map +1 -1
  367. package/dist/hooks/batch/useSendBatchTx.js.map +1 -1
  368. package/dist/hooks/connectors/useIsConnectedSafe.js.map +1 -1
  369. package/dist/hooks/connectors/useIsGnosisSafeConnector.js.map +1 -1
  370. package/dist/hooks/connectors/useIsSafeThroughWalletConnect.js.map +1 -1
  371. package/dist/hooks/gas/useGasPrices.js.map +1 -1
  372. package/dist/hooks/gas/utils.js.map +1 -1
  373. package/dist/hooks/getCode/query.js.map +1 -1
  374. package/dist/hooks/getCode/useIsAccountContract.js.map +1 -1
  375. package/dist/hooks/getCode/useIsContractAtAddress.js.map +1 -1
  376. package/dist/hooks/otc/mutations/useCancelLimitOrder.js.map +1 -1
  377. package/dist/hooks/otc/mutations/useCreateLimitOrder.js.map +1 -1
  378. package/dist/hooks/otc/mutations/useFillOrder.js.map +1 -1
  379. package/dist/hooks/otc/mutations/utils.js.map +1 -1
  380. package/dist/hooks/otc/queries/useLimitOrderRequiredBalance.js.map +1 -1
  381. package/dist/hooks/otc/queries/useLimitOrders.js.map +1 -1
  382. package/dist/hooks/otc/tradeFlow/useFillOtcOrderFlow.js.map +1 -1
  383. package/dist/hooks/otc/tradeFlow/useFillOtcOrderStep.js.map +1 -1
  384. package/dist/hooks/otc/tradeFlow/useOtcOrderFlow.js.map +1 -1
  385. package/dist/hooks/otc/tradeFlow/useOtcOrderStep.js.map +1 -1
  386. package/dist/hooks/permit/hooks/common/useSignArbitraryTypedData.js.map +1 -1
  387. package/dist/hooks/permit/hooks/common/useSignPermit.js.map +1 -1
  388. package/dist/hooks/permit/hooks/common/useWalletSupportsPermit.js.map +1 -1
  389. package/dist/hooks/permit/hooks/permit1/useGetPermitInfo.js.map +1 -1
  390. package/dist/hooks/permit/hooks/permit1/useGetSafePermitInfo.js.map +1 -1
  391. package/dist/hooks/permit/hooks/permit1/usePermit1Nonce.js.map +1 -1
  392. package/dist/hooks/permit/hooks/permit1/useSignTokenPermit1.js.map +1 -1
  393. package/dist/hooks/permit/hooks/permit1/useTokenFromPermit1Nonce.js.map +1 -1
  394. package/dist/hooks/permit/hooks/permit1/useTokenFromPermitInfo.js.map +1 -1
  395. package/dist/hooks/permit/hooks/permit1/useTryToSignPermit1.js.map +1 -1
  396. package/dist/hooks/permit/hooks/permit2/usePermit2Allowance.js.map +1 -1
  397. package/dist/hooks/permit/hooks/permit2/usePermit2TransferFromNonce.js.map +1 -1
  398. package/dist/hooks/permit/hooks/permit2/useSignTokenPermit2TransferFrom.js.map +1 -1
  399. package/dist/hooks/permit/hooks/permit2/useTokenFromPermit2Allowance.js.map +1 -1
  400. package/dist/hooks/permit/hooks/permit2/useTokenFromPermit2TransferFromNonce.js.map +1 -1
  401. package/dist/hooks/permit/utils/constants.js.map +1 -1
  402. package/dist/hooks/permit/utils/construct.js.map +1 -1
  403. package/dist/hooks/permit/utils/deadlines.js.map +1 -1
  404. package/dist/hooks/permit/utils/detect.js.map +1 -1
  405. package/dist/hooks/permit/utils/domainSeparator.js.map +1 -1
  406. package/dist/hooks/permit/utils/encodeArgs.js.map +1 -1
  407. package/dist/hooks/permit/utils/trySignPermit1.js.map +1 -1
  408. package/dist/hooks/permit/utils/utils.js.map +1 -1
  409. package/dist/hooks/sdk/useGetContracts.js.map +1 -1
  410. package/dist/hooks/sdk/useSpender.js.map +1 -1
  411. package/dist/hooks/swap/prices/delta/bridge/useSelectedBridgePrice.js.map +1 -1
  412. package/dist/hooks/swap/prices/delta/bridge/utils.js.map +1 -1
  413. package/dist/hooks/swap/prices/delta/mutations/twap/useCreatePreSignableTwapOrder.js.map +1 -1
  414. package/dist/hooks/swap/prices/delta/mutations/twap/useCreateTwapOrder.js.map +1 -1
  415. package/dist/hooks/swap/prices/delta/mutations/twap/useDepositAndSubmitTwapOrder.js.map +1 -1
  416. package/dist/hooks/swap/prices/delta/mutations/twap/usePostTwapOrder.js.map +1 -1
  417. package/dist/hooks/swap/prices/delta/mutations/twap/usePreSignAndSubmitTwapOrder.js.map +1 -1
  418. package/dist/hooks/swap/prices/delta/mutations/twap/useTwapOrderToPost.js.map +1 -1
  419. package/dist/hooks/swap/prices/delta/mutations/useCancelDeltaOrders.js.map +1 -1
  420. package/dist/hooks/swap/prices/delta/mutations/useCancelDeltaOrdersEvents.js.map +1 -1
  421. package/dist/hooks/swap/prices/delta/mutations/useCancelOrWithdrawAndCancelDeltaOrder.js.map +1 -1
  422. package/dist/hooks/swap/prices/delta/mutations/useCreateDeltaOrder.js.map +1 -1
  423. package/dist/hooks/swap/prices/delta/mutations/useCreatePreSignableDeltaOrder.js.map +1 -1
  424. package/dist/hooks/swap/prices/delta/mutations/useDeltaOrderToPost.js.map +1 -1
  425. package/dist/hooks/swap/prices/delta/mutations/useIsDeltaOrderCancellable.js.map +1 -1
  426. package/dist/hooks/swap/prices/delta/mutations/usePostDeltaOrder.js.map +1 -1
  427. package/dist/hooks/swap/prices/delta/mutations/useSendDepositPreSignDeltaOrderTx.js.map +1 -1
  428. package/dist/hooks/swap/prices/delta/mutations/useWithdrawAndCancelDeltaOrder.js.map +1 -1
  429. package/dist/hooks/swap/prices/delta/mutations/utils.js.map +1 -1
  430. package/dist/hooks/swap/prices/delta/orders/unposted/effect.js.map +1 -1
  431. package/dist/hooks/swap/prices/delta/orders/unposted/index.js.map +1 -1
  432. package/dist/hooks/swap/prices/delta/orders/unposted/storage.js.map +1 -1
  433. package/dist/hooks/swap/prices/delta/orders/unposted/utils.js.map +1 -1
  434. package/dist/hooks/swap/prices/delta/orders/utils.js.map +1 -1
  435. package/dist/hooks/swap/prices/delta/queries/bridgeInfo/bridgeInfosLoadedAtom.js.map +1 -1
  436. package/dist/hooks/swap/prices/delta/queries/bridgeInfo/common.js.map +1 -1
  437. package/dist/hooks/swap/prices/delta/queries/bridgeInfo/getBridgeInfoQueryData.js.map +1 -1
  438. package/dist/hooks/swap/prices/delta/queries/bridgeInfo/useBridgeInfo.js.map +1 -1
  439. package/dist/hooks/swap/prices/delta/queries/bridgeProtocols/useBridgeProtocols.js.map +1 -1
  440. package/dist/hooks/swap/prices/delta/queries/errors.js.map +1 -1
  441. package/dist/hooks/swap/prices/delta/queries/useDeltaLimitOrderRequiredBalance.js.map +1 -1
  442. package/dist/hooks/swap/prices/delta/queries/useDeltaOrderPreConditions.js.map +1 -1
  443. package/dist/hooks/swap/prices/delta/queries/useDeltaOrders.js.map +1 -1
  444. package/dist/hooks/swap/prices/delta/queries/useDeltaPriceQuery.js.map +1 -1
  445. package/dist/hooks/swap/prices/delta/queries/useIsTokenSupportedInDelta.js.map +1 -1
  446. package/dist/hooks/swap/prices/delta/queries/useWatchDeltaOrder.js.map +1 -1
  447. package/dist/hooks/swap/prices/factory.js.map +1 -1
  448. package/dist/hooks/swap/prices/market/mutations/useBuildTx.js.map +1 -1
  449. package/dist/hooks/swap/prices/market/mutations/useSendMarketSwapTx.js.map +1 -1
  450. package/dist/hooks/swap/prices/market/queries/dexesList/useDexesList.js.map +1 -1
  451. package/dist/hooks/swap/prices/market/queries/errors.js.map +1 -1
  452. package/dist/hooks/swap/prices/market/queries/useMarketPriceQuery.js.map +1 -1
  453. package/dist/hooks/swap/prices/market/queries/useSpenderAndContracts.js.map +1 -1
  454. package/dist/hooks/swap/prices/usePricesParams.js.map +1 -1
  455. package/dist/hooks/swap/prices/useSwapPrices.d.ts +4 -7
  456. package/dist/hooks/swap/prices/useSwapPrices.d.ts.map +1 -1
  457. package/dist/hooks/swap/prices/useSwapPrices.js +28 -24
  458. package/dist/hooks/swap/prices/useSwapPrices.js.map +1 -1
  459. package/dist/hooks/swap/prices/useTokenInputsFromPrice.js.map +1 -1
  460. package/dist/hooks/swap/prices/useTokenInputsFromTwapPrice.js.map +1 -1
  461. package/dist/hooks/swap/prices/useTwapPrices.js.map +1 -1
  462. package/dist/hooks/swap/tradeFlow/common/errors.js.map +1 -1
  463. package/dist/hooks/swap/tradeFlow/common/factory/depositAndSubmitOrderFactory.js.map +1 -1
  464. package/dist/hooks/swap/tradeFlow/common/factory/preSignAndSubmitOrderFactory.js.map +1 -1
  465. package/dist/hooks/swap/tradeFlow/common/useApproveOrPermit.js.map +1 -1
  466. package/dist/hooks/swap/tradeFlow/common/useApproveOrPermitEvents.js.map +1 -1
  467. package/dist/hooks/swap/tradeFlow/common/useBatchWrapAndApprove.js.map +1 -1
  468. package/dist/hooks/swap/tradeFlow/common/useConstructGasParams.js.map +1 -1
  469. package/dist/hooks/swap/tradeFlow/common/useDepositAndSubmitDeltaOrder.js.map +1 -1
  470. package/dist/hooks/swap/tradeFlow/common/usePreSignAndSubmitDeltaOrder.js.map +1 -1
  471. package/dist/hooks/swap/tradeFlow/common/useRequiredAllowanceForOrders.js.map +1 -1
  472. package/dist/hooks/swap/tradeFlow/common/useSignPermit1Or2.js.map +1 -1
  473. package/dist/hooks/swap/tradeFlow/common/utils.js.map +1 -1
  474. package/dist/hooks/swap/tradeFlow/useDeltaFlow.js.map +1 -1
  475. package/dist/hooks/swap/tradeFlow/useDeltaSwapStep.js.map +1 -1
  476. package/dist/hooks/swap/tradeFlow/useLimitOrderFlow.js.map +1 -1
  477. package/dist/hooks/swap/tradeFlow/useLimitOrderStep.js.map +1 -1
  478. package/dist/hooks/swap/tradeFlow/useMarketFlow.js.map +1 -1
  479. package/dist/hooks/swap/tradeFlow/useMarketSwapStep.js.map +1 -1
  480. package/dist/hooks/swap/tradeFlow/useTwapFlow.js.map +1 -1
  481. package/dist/hooks/swap/tradeFlow/useTwapSwapStep.js.map +1 -1
  482. package/dist/hooks/tokens/allowance/useGenericTokenAllowance.js.map +1 -1
  483. package/dist/hooks/tokens/allowance/useTokenAllowance.js.map +1 -1
  484. package/dist/hooks/tokens/allowance/utils.js.map +1 -1
  485. package/dist/hooks/tokens/balances/queries.js.map +1 -1
  486. package/dist/hooks/tokens/balances/useAttachTokenBalanceMultichain.js.map +1 -1
  487. package/dist/hooks/tokens/balances/useInvalidateTokenData.js.map +1 -1
  488. package/dist/hooks/tokens/balances/useIsInsufficientTokenBalance.js.map +1 -1
  489. package/dist/hooks/tokens/balances/useIsLimitOrderInsufficientBalance.js.map +1 -1
  490. package/dist/hooks/tokens/balances/useMultichainTokenBalances.js.map +1 -1
  491. package/dist/hooks/tokens/balances/useSelectedTokenBalances.js.map +1 -1
  492. package/dist/hooks/tokens/balances/useTokenBalance.js.map +1 -1
  493. package/dist/hooks/tokens/data/useCombineTokensWithFetched.js.map +1 -1
  494. package/dist/hooks/tokens/data/useFetchTokens.js.map +1 -1
  495. package/dist/hooks/tokens/data/useMultichainTokensData.js.map +1 -1
  496. package/dist/hooks/tokens/prices/queries.js.map +1 -1
  497. package/dist/hooks/tokens/prices/useMultichainTokenPrices.js.map +1 -1
  498. package/dist/hooks/tokens/prices/useTokenPrices.js.map +1 -1
  499. package/dist/hooks/tokens/useAllTokensWithFilter.js.map +1 -1
  500. package/dist/hooks/tokens/useNativeToken.js.map +1 -1
  501. package/dist/hooks/tokens/useTokenTaxFee.js.map +1 -1
  502. package/dist/hooks/tokens/useTokensByAddress.js.map +1 -1
  503. package/dist/hooks/tokens/useTokensFromAcross.js.map +1 -1
  504. package/dist/hooks/txs/mutations/useApprove.js.map +1 -1
  505. package/dist/hooks/txs/mutations/useDepositWeth.js.map +1 -1
  506. package/dist/hooks/txs/mutations/useReplaceTx.js.map +1 -1
  507. package/dist/hooks/txs/mutations/useSendTx.js.map +1 -1
  508. package/dist/hooks/txs/queries/useAccountNonce.js.map +1 -1
  509. package/dist/hooks/txs/queries/useAwaitTx.js.map +1 -1
  510. package/dist/hooks/txs/queries/useTxFees.js.map +1 -1
  511. package/dist/hooks/txs/queries/useTxHistory.js.map +1 -1
  512. package/dist/hooks/txs/queries/useTxResponse.js.map +1 -1
  513. package/dist/hooks/txs/queries/useWalletCanReplaceTx.js.map +1 -1
  514. package/dist/hooks/txs/queries/utils.js.map +1 -1
  515. package/dist/hooks/useAvailableCrosses.js.map +1 -1
  516. package/dist/hooks/useBreakpoints.js.map +1 -1
  517. package/dist/hooks/useBridgeInfo.js.map +1 -1
  518. package/dist/hooks/useBridgeProtocols.js.map +1 -1
  519. package/dist/hooks/useCachedQueryError.js.map +1 -1
  520. package/dist/hooks/useChainMatches.js.map +1 -1
  521. package/dist/hooks/useClickOutside.js.map +1 -1
  522. package/dist/hooks/useCurrentChain.js.map +1 -1
  523. package/dist/hooks/useDebouncedInputState.js.map +1 -1
  524. package/dist/hooks/useEIP1559Enabled.js.map +1 -1
  525. package/dist/hooks/useGlobalDeltaEnabled.js.map +1 -1
  526. package/dist/hooks/useIsCrosschainPossible.js.map +1 -1
  527. package/dist/hooks/useMinViemClient.js.map +1 -1
  528. package/dist/hooks/useSDK.js.map +1 -1
  529. package/dist/hooks/useSelectableDestChains.js.map +1 -1
  530. package/dist/hooks/useSlippage.js.map +1 -1
  531. package/dist/hooks/useSwitchChainWithGuard.js.map +1 -1
  532. package/dist/lib/constants/urls.js.map +1 -1
  533. package/dist/lib/ipfs.js.map +1 -1
  534. package/dist/lib/queryClient.js.map +1 -1
  535. package/dist/lib/tradeMode.d.ts +1 -0
  536. package/dist/lib/tradeMode.d.ts.map +1 -1
  537. package/dist/lib/tradeMode.js +4 -1
  538. package/dist/lib/tradeMode.js.map +1 -1
  539. package/dist/lib/utils/approval.js.map +1 -1
  540. package/dist/lib/utils/atomWithCompare.js.map +1 -1
  541. package/dist/lib/utils/copyToClipboard.js.map +1 -1
  542. package/dist/lib/utils/delta.js.map +1 -1
  543. package/dist/lib/utils/dexes.js.map +1 -1
  544. package/dist/lib/utils/explorer.js.map +1 -1
  545. package/dist/lib/utils/fee.js.map +1 -1
  546. package/dist/lib/utils/formatFiatPrice.js.map +1 -1
  547. package/dist/lib/utils/formatPercent.js.map +1 -1
  548. package/dist/lib/utils/formatTokenBalance.js.map +1 -1
  549. package/dist/lib/utils/index.js.map +1 -1
  550. package/dist/lib/utils/logger.js.map +1 -1
  551. package/dist/lib/utils/metabase.js.map +1 -1
  552. package/dist/lib/utils/mobile.js.map +1 -1
  553. package/dist/lib/utils/price.js.map +1 -1
  554. package/dist/lib/utils/priceImpact.js.map +1 -1
  555. package/dist/lib/utils/providerErrors.js.map +1 -1
  556. package/dist/lib/utils/rate.js.map +1 -1
  557. package/dist/lib/utils/removeZeroDecimals.js.map +1 -1
  558. package/dist/lib/utils/savedAmountUSD.js.map +1 -1
  559. package/dist/lib/utils/scaleFactor.js.map +1 -1
  560. package/dist/lib/utils/slippage.js.map +1 -1
  561. package/dist/lib/utils/time.js.map +1 -1
  562. package/dist/lib/utils/toDecimal.js.map +1 -1
  563. package/dist/lib/utils/toasts.js.map +1 -1
  564. package/dist/lib/utils/tradeFlow.js.map +1 -1
  565. package/dist/lib/utils/transactionHandlers.js.map +1 -1
  566. package/dist/lib/utils/tuple.js.map +1 -1
  567. package/dist/lib/utils/twap.js.map +1 -1
  568. package/dist/lib/utils/useDateNow.js.map +1 -1
  569. package/dist/lib/web3/wagmi/config.d.ts +0 -18
  570. package/dist/lib/web3/wagmi/config.d.ts.map +1 -1
  571. package/dist/lib/web3/wagmi/config.js +19 -6
  572. package/dist/lib/web3/wagmi/config.js.map +1 -1
  573. package/dist/lib/web3/wagmi/external.js.map +1 -1
  574. package/dist/lib/web3/wagmi/isInsideSafeIframe.js.map +1 -1
  575. package/dist/lib/web3/wagmi/switchChain.js.map +1 -1
  576. package/dist/lib/web3/wagmi/utils.js.map +1 -1
  577. package/dist/styles.css +1 -1
  578. package/dist/tokens/blacklist.js.map +1 -1
  579. package/dist/tokens/constructor.js.map +1 -1
  580. package/dist/tokens/defaultTokens.js.map +1 -1
  581. package/dist/tokens/hooks.js.map +1 -1
  582. package/dist/tokens/lists/constants.js.map +1 -1
  583. package/dist/tokens/lists/download.js.map +1 -1
  584. package/dist/tokens/lists/state/effects.js.map +1 -1
  585. package/dist/tokens/lists/state/tokenListsActionsAtom.js.map +1 -1
  586. package/dist/tokens/lists/state/tokenListsStateAtom.js.map +1 -1
  587. package/dist/tokens/overrides.js.map +1 -1
  588. package/dist/tokens/queries.js.map +1 -1
  589. package/dist/tokens/stabeCoins/hooks.js.map +1 -1
  590. package/dist/tokens/stabeCoins/index.js.map +1 -1
  591. package/dist/tokens/state/addImportedTokenAtom.js.map +1 -1
  592. package/dist/tokens/state/allTokensByChainAtom.js.map +1 -1
  593. package/dist/tokens/state/constructTokens.js.map +1 -1
  594. package/dist/tokens/state/fromListsAtom.js.map +1 -1
  595. package/dist/tokens/utils/areTokensSame.js.map +1 -1
  596. package/dist/tokens/utils/brand.js.map +1 -1
  597. package/dist/tokens/utils/eth.js.map +1 -1
  598. package/dist/tokens/utils/filtering.js.map +1 -1
  599. package/dist/tokens/utils/sets.js.map +1 -1
  600. package/dist/tokens/utils/sorting.js.map +1 -1
  601. package/dist/tokens/utils/transferAmountsFromReceipt.js.map +1 -1
  602. package/dist/transactions/hash.js.map +1 -1
  603. package/dist/transactions/queries/ensureCallsStatus.js.map +1 -1
  604. package/dist/transactions/queries/ensureEstimateFeesPerGas.js.map +1 -1
  605. package/dist/transactions/queries/ensureTxReceipt.js.map +1 -1
  606. package/dist/transactions/queries/ensureTxResponse.js.map +1 -1
  607. package/dist/transactions/state/effects/finalize.js.map +1 -1
  608. package/dist/transactions/state/hooks/useActivateEffects.js.map +1 -1
  609. package/dist/transactions/state/hooks/useMarkTxAsDropped.js.map +1 -1
  610. package/dist/transactions/state/hooks/useTransactions.js.map +1 -1
  611. package/dist/transactions/state/transactionsActionAtom.js.map +1 -1
  612. package/dist/transactions/state/transactionsAtom.js.map +1 -1
  613. package/dist/transactions/status.js.map +1 -1
  614. package/dist/transactions/utils.js.map +1 -1
  615. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"transferAmountsFromReceipt.js","names":["Address","TransactionReceipt","Client","decodeEventLog","erc20Abi","Hex","Hash","getBalance","getGasPrice","getTransaction","getTransactionReceipt","Token","ETH_ADDRESS_LOWERCASE","gatherObjectsByProp","useQuery","UseQueryResult","useClient","SupportedChainId","useCallback","assert","MarkOptional","isETH","getLogger","isFilledArray","MinRequiredReceiptLog","address","topics","data","ERC20TransferAmountsFromReceiptInput","receipt","logs","tokens","Pick","senderAddress","receiverAddress","TransferAmountsFromReceiptInput","TokenTransfers","token","sentAmount","receivedAmount","TransferAmountsFromReceiptResult","Record","TRANSFER_EVENT_SIGNATURE","getERC20TransferAmountsFromReceipt","result","toLowerCase","tokensSet","Set","map","fromAddressLowercase","toAddressLowercase","log","logAddressLowercase","has","decoded","abi","eventName","from","fromAddress","to","toAddress","value","args","tokenTransfer","_error","NativeTokenTransferInput","client","REASONABLE_GAS_PRICE","getNativeTokenTransfer","Promise","beforeBlockNumber","blockNumber","afterBlockNumber","senderPromises","const","senderIsReceiver","receiverPromises","senderBalanceBefore","senderBalanceAfter","receiverBalanceBefore","receiverBalanceAfter","all","gasPrice","effectiveGasPrice","minTxData","getMinTxDataFromHash","hash","transactionHash","account","gasCost","gasUsed","TokenTransfersFromReceiptInput","getTokenTransfersFromReceipt","tokensWithoutNative","filter","tokenTransfers","length","nativeTokenTransfer","TokenTransfersFromReceiptWithLimitsInput","detectedTokenTransfers","expectedTokenTransfers","validateAmount","calculatedAmount","expectedAmount","tolerancePercent","tolerance","BigInt","minExpected","maxExpected","logger1","logger2","getTokenTransfersFromReceiptWithLimits","validatedTokenTransfers","once","tokenAddress","calculatedTransfer","Object","entries","expectedTransfer","validatedTransfer","UseTokenTransfersFromReceiptInput","chainId","useTokenTransfersFromReceipt","t0","$","_c","t1","t2","select","t3","t4","t5","t6","t7","t8","t9","t10","queryKey","queryFn","enabled","MinTxData","GetMinTxDataFromHashInput","undefined","tx"],"sources":["../../../src/tokens/utils/transferAmountsFromReceipt.ts"],"sourcesContent":["import {\n type Address,\n type TransactionReceipt,\n type Client,\n decodeEventLog,\n erc20Abi,\n type Hex,\n type Hash,\n} from \"viem\";\nimport {\n getBalance,\n getGasPrice,\n getTransaction,\n getTransactionReceipt,\n} from \"viem/actions\";\nimport type { Token } from \"../state/types\";\nimport { ETH_ADDRESS_LOWERCASE } from \"../constants\";\nimport { gatherObjectsByProp } from \"@/lib/utils\";\nimport { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useClient } from \"wagmi\";\nimport type { SupportedChainId } from \"@/lib/web3/wagmi/types\";\nimport { useCallback } from \"react\";\nimport { assert, type MarkOptional } from \"ts-essentials\";\nimport { isETH } from \"./eth\";\nimport { getLogger } from \"@/core/logger\";\nimport { isFilledArray } from \"@/lib/utils/tuple\";\n\ntype MinRequiredReceiptLog = {\n address: Address;\n topics: Hex[];\n data: Hex;\n};\n\ntype ERC20TransferAmountsFromReceiptInput = {\n receipt: {\n logs: MinRequiredReceiptLog[];\n };\n tokens: Pick<Token, \"address\">[];\n senderAddress: Address;\n receiverAddress: Address;\n};\n\ntype TransferAmountsFromReceiptInput = ERC20TransferAmountsFromReceiptInput & {\n receipt: MarkOptional<\n Pick<\n TransactionReceipt,\n | \"blockNumber\"\n | \"gasUsed\"\n | \"effectiveGasPrice\"\n | \"from\"\n | \"transactionHash\"\n >,\n \"effectiveGasPrice\" | \"from\"\n >;\n};\n\nexport type TokenTransfers = {\n token: Address;\n sentAmount: bigint;\n receivedAmount: bigint;\n};\n\ntype TransferAmountsFromReceiptResult = Record<Address, TokenTransfers>;\n\n// ERC20 Transfer event signature: Transfer(address,address,uint256)\nconst TRANSFER_EVENT_SIGNATURE =\n \"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\";\n\n// give TransactionReceipt and tokens finds all transfers of Tokens to receiverAddress and returns amounts\nexport function getERC20TransferAmountsFromReceipt({\n receipt,\n tokens,\n senderAddress,\n receiverAddress,\n}: ERC20TransferAmountsFromReceiptInput): TransferAmountsFromReceiptResult {\n // Initialize result mapping with one entry per token\n const result: Record<Address, TokenTransfers> = gatherObjectsByProp(\n tokens,\n (token) => token.address.toLowerCase(),\n (token) => ({\n token: token.address as Address,\n sentAmount: 0n,\n receivedAmount: 0n,\n })\n );\n\n // Create a map for quick token lookup\n const tokensSet = new Set(tokens.map((token) => token.address.toLowerCase()));\n\n const fromAddressLowercase = senderAddress.toLowerCase();\n const toAddressLowercase = receiverAddress.toLowerCase();\n\n // Parse all logs in the transaction receipt\n for (const log of receipt.logs) {\n const logAddressLowercase = log.address.toLowerCase() as Address;\n // Check if this is a Transfer event from one of our tokens\n if (\n isFilledArray(log.topics) &&\n log.topics[0] === TRANSFER_EVENT_SIGNATURE &&\n tokensSet.has(logAddressLowercase)\n ) {\n try {\n // Parse the Transfer event parameters\n // topics[0] = event signature\n // topics[1] = from address (padded to 32 bytes)\n // topics[2] = to address (padded to 32 bytes)\n // data = value (uint256)\n\n const decoded = decodeEventLog({\n abi: erc20Abi,\n data: log.data,\n topics: log.topics,\n eventName: \"Transfer\",\n });\n\n const { from: fromAddress, to: toAddress, value } = decoded.args;\n\n const tokenTransfer = result[logAddressLowercase];\n if (!tokenTransfer) {\n continue;\n }\n\n // Check if the transfer is from sender to someone else\n if (fromAddress.toLowerCase() === fromAddressLowercase) {\n tokenTransfer.sentAmount += value;\n }\n // Check if the transfer is to receiver from someone else\n if (toAddress.toLowerCase() === toAddressLowercase) {\n tokenTransfer.receivedAmount += value;\n }\n } catch (_error) {\n // If parsing fails, skip this log\n continue;\n }\n }\n }\n\n return result;\n}\n\ntype NativeTokenTransferInput = {\n receipt: MarkOptional<\n Pick<\n TransactionReceipt,\n | \"blockNumber\"\n | \"gasUsed\"\n | \"effectiveGasPrice\"\n | \"from\"\n | \"transactionHash\"\n >,\n \"effectiveGasPrice\" | \"from\"\n >;\n senderAddress: Address;\n receiverAddress: Address;\n client: Client;\n};\n\n// when no gasPrice was fetched across several methods\nconst REASONABLE_GAS_PRICE = 2700000000n;\n\nexport async function getNativeTokenTransfer({\n receipt,\n senderAddress,\n receiverAddress,\n client,\n}: NativeTokenTransferInput): Promise<TokenTransfers> {\n const beforeBlockNumber = receipt.blockNumber - 1n;\n const afterBlockNumber = receipt.blockNumber;\n\n /*\n if the transaction was the only one transaction involving the sender and receiver\n in the block it was mined, and if the transaction was a SwapTransaction only,\n not some bulk transaction or a flashbot transaction, then we can consider\n that the ETH balances difference matches the ETH Swap amount.\n */\n\n const senderPromises = [\n // Get balances before the transaction\n getBalance(client, {\n address: senderAddress,\n blockNumber: beforeBlockNumber,\n }),\n // Get balances after the transaction\n getBalance(client, {\n address: senderAddress,\n blockNumber: afterBlockNumber,\n }),\n ] as const;\n\n const senderIsReceiver =\n senderAddress.toLowerCase() === receiverAddress.toLowerCase();\n\n const receiverPromises = senderIsReceiver\n ? // reuse sender promises if sender is receiver\n senderPromises\n : ([\n // Get balances before the transaction\n getBalance(client, {\n address: receiverAddress,\n blockNumber: beforeBlockNumber,\n }),\n // Get balances after the transaction\n getBalance(client, {\n address: receiverAddress,\n blockNumber: afterBlockNumber,\n }),\n ] as const);\n\n const [\n senderBalanceBefore,\n senderBalanceAfter,\n receiverBalanceBefore,\n receiverBalanceAfter,\n ] = await Promise.all([...senderPromises, ...receiverPromises]);\n\n // Calculate the differences\n let sentAmount = senderBalanceBefore - senderBalanceAfter; // difference in balances = sent ETH + paid gas\n let receivedAmount = receiverBalanceAfter - receiverBalanceBefore;\n\n let gasPrice = receipt.effectiveGasPrice;\n let from = receipt.from;\n if (!gasPrice) {\n // SendCalls receipt does not include some fields,\n // try to fetch them from the transaction hash\n const minTxData = await getMinTxDataFromHash({\n hash: receipt.transactionHash,\n client,\n });\n gasPrice = minTxData.gasPrice;\n from = minTxData.from;\n }\n\n if (!gasPrice) {\n gasPrice = REASONABLE_GAS_PRICE;\n }\n\n if (!from) {\n from = client.account?.address || senderAddress;\n }\n\n const gasCost = receipt.gasUsed * gasPrice;\n\n // if sender is the transaction sender (it may not be if a Relayer was involved)\n if (senderAddress.toLowerCase() === from.toLowerCase()) {\n // Adjust sentAmount for gas:\n // Subtract gas cost from sentAmount to get actual ETH sent (excluding gas fees)\n sentAmount -= gasCost;\n }\n\n // if sender is receiver, then need to adjust receivedAmount for gas\n if (senderAddress.toLowerCase() === receiverAddress.toLowerCase()) {\n receivedAmount += gasCost; // gas was paid out of the receivedAmount, so make this the amount before gas paid\n }\n\n return {\n token: ETH_ADDRESS_LOWERCASE, // Native token address\n sentAmount: sentAmount > 0n ? sentAmount : 0n,\n receivedAmount: receivedAmount > 0n ? receivedAmount : 0n,\n };\n}\n\ntype TokenTransfersFromReceiptInput = TransferAmountsFromReceiptInput & {\n client: Client;\n};\n\nexport async function getTokenTransfersFromReceipt({\n receipt,\n tokens,\n senderAddress,\n receiverAddress,\n client,\n}: TokenTransfersFromReceiptInput): Promise<TransferAmountsFromReceiptResult> {\n const tokensWithoutNative = tokens.filter((token) => !isETH(token));\n\n const tokenTransfers = getERC20TransferAmountsFromReceipt({\n receipt,\n tokens: tokensWithoutNative,\n senderAddress,\n receiverAddress,\n });\n\n // there was a native Token in the list\n if (tokensWithoutNative.length < tokens.length) {\n const nativeTokenTransfer = await getNativeTokenTransfer({\n receipt,\n senderAddress,\n receiverAddress,\n client,\n });\n\n tokenTransfers[ETH_ADDRESS_LOWERCASE] = nativeTokenTransfer;\n }\n\n return tokenTransfers;\n}\n\ntype TokenTransfersFromReceiptWithLimitsInput = {\n detectedTokenTransfers: Record<Address, TokenTransfers>;\n expectedTokenTransfers: Record<Address, TokenTransfers>;\n};\n\n// Helper function to validate an amount against expected value with tolerance\nfunction validateAmount({\n calculatedAmount,\n expectedAmount,\n tolerancePercent = 15, // max slippage %\n}: {\n calculatedAmount: bigint;\n expectedAmount: bigint;\n tolerancePercent?: number;\n}): bigint {\n if (expectedAmount === 0n) {\n // If expected is 0, use expected\n return expectedAmount;\n }\n\n // Check if calculated is within tolerance of expected\n const tolerance = (expectedAmount * BigInt(tolerancePercent)) / 100n;\n const minExpected = expectedAmount - tolerance;\n const maxExpected = expectedAmount + tolerance;\n\n if (calculatedAmount >= minExpected && calculatedAmount <= maxExpected) {\n return calculatedAmount;\n } else {\n return expectedAmount;\n }\n}\n\nconst logger1 = getLogger(\"Swap:amounts:Expected\");\nconst logger2 = getLogger(\"Swap:amounts:Detected\");\n\nexport function getTokenTransfersFromReceiptWithLimits({\n detectedTokenTransfers,\n expectedTokenTransfers,\n}: TokenTransfersFromReceiptWithLimitsInput): TransferAmountsFromReceiptResult {\n // Validate and adjust amounts based on expected values\n const validatedTokenTransfers: Record<Address, TokenTransfers> = {};\n\n logger1.once.log(\"Expected token transfers\", expectedTokenTransfers);\n logger2.once.log(\"Detected token transfers\", detectedTokenTransfers);\n\n for (const [tokenAddress, calculatedTransfer] of Object.entries(\n detectedTokenTransfers\n )) {\n const expectedTransfer = expectedTokenTransfers[tokenAddress as Address];\n\n if (!expectedTransfer) {\n // No expected value, use calculated\n validatedTokenTransfers[tokenAddress as Address] = calculatedTransfer;\n continue;\n }\n\n const validatedTransfer: TokenTransfers = {\n token: calculatedTransfer.token,\n sentAmount: validateAmount({\n calculatedAmount: calculatedTransfer.sentAmount,\n expectedAmount: expectedTransfer.sentAmount,\n }),\n receivedAmount: validateAmount({\n calculatedAmount: calculatedTransfer.receivedAmount,\n expectedAmount: expectedTransfer.receivedAmount,\n }),\n };\n\n validatedTokenTransfers[tokenAddress as Address] = validatedTransfer;\n }\n\n return validatedTokenTransfers;\n}\n\ntype UseTokenTransfersFromReceiptInput = TransferAmountsFromReceiptInput & {\n receipt: Pick<TransactionReceipt, \"transactionHash\">;\n chainId: SupportedChainId;\n expectedTokenTransfers: Record<Address, TokenTransfers>;\n};\n\n/**\n * @param expectedTokenTransfers - expected token transfers, if provided, will be used to validate the detected token transfers\n * @param chainId - chain id\n * @param receipt - transaction receipt\n * @param tokens - tokens\n * @param senderAddress - sender address\n * @param receiverAddress - receiver address\n * @returns - token transfers from receipt validated against expected token transfers\n * @note - ETH transfers are a best guess, and may not be accurate (falls back to expected token transfers)\n */\nexport function useTokenTransfersFromReceipt({\n receipt,\n tokens,\n senderAddress,\n receiverAddress,\n expectedTokenTransfers,\n chainId,\n}: MarkOptional<\n UseTokenTransfersFromReceiptInput,\n \"receipt\" | \"senderAddress\" | \"receiverAddress\" | \"expectedTokenTransfers\"\n>): UseQueryResult<TransferAmountsFromReceiptResult, Error> {\n const client = useClient({ chainId });\n\n const select = useCallback(\n (data: TransferAmountsFromReceiptResult) => {\n if (!expectedTokenTransfers) {\n return data;\n }\n\n return getTokenTransfersFromReceiptWithLimits({\n detectedTokenTransfers: data,\n expectedTokenTransfers,\n });\n },\n [expectedTokenTransfers]\n );\n\n return useQuery({\n queryKey: [\n \"token-transfers-from-receipt\",\n receipt?.transactionHash,\n receipt?.logs.length,\n senderAddress?.toLowerCase(),\n receiverAddress?.toLowerCase(),\n ],\n queryFn: async () => {\n assert(receipt, \"Receipt is required\");\n assert(senderAddress, \"Sender address is required\");\n assert(receiverAddress, \"Receiver address is required\");\n\n return getTokenTransfersFromReceipt({\n receipt,\n tokens,\n senderAddress,\n receiverAddress,\n client,\n });\n },\n select,\n enabled:\n !!receipt &&\n receipt.logs.length > 0 &&\n tokens.length > 0 &&\n !!senderAddress &&\n !!receiverAddress,\n });\n}\n\ntype MinTxData = {\n from?: Address;\n gasPrice?: bigint;\n};\n\ntype GetMinTxDataFromHashInput = {\n hash: Hash;\n client: Client;\n};\n\nasync function getMinTxDataFromHash({\n hash,\n client,\n}: GetMinTxDataFromHashInput): Promise<MinTxData> {\n let gasPrice: bigint | undefined = undefined;\n let from: Address | undefined;\n try {\n // likely this will return the correct receipt for the hash,\n // but in case of different RPC providers between the Wallet (which performed sendCalls),\n // and the RPC of the Client, the receipt may not be found\n const receipt = await getTransactionReceipt(client, {\n hash,\n });\n from = receipt.from;\n gasPrice = receipt.effectiveGasPrice;\n } catch {\n // can be TransactionReceiptNotFoundError\n }\n\n if (!gasPrice) {\n try {\n // very unlikely that even the transaction will not be found, but still possible\n const tx = await getTransaction(client, {\n hash,\n });\n from = tx.from;\n gasPrice = tx.gasPrice;\n } catch {\n // can be TransactionNotFoundError\n }\n }\n\n if (!gasPrice) {\n try {\n // just in case this may error\n gasPrice = await getGasPrice(client);\n } catch {\n // can be RequestError\n }\n }\n\n if (!from) {\n from = client.account?.address;\n }\n\n return {\n from,\n gasPrice,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"transferAmountsFromReceipt.js","names":["Address","TransactionReceipt","Client","decodeEventLog","erc20Abi","Hex","Hash","getBalance","getGasPrice","getTransaction","getTransactionReceipt","Token","ETH_ADDRESS_LOWERCASE","gatherObjectsByProp","useQuery","UseQueryResult","useClient","SupportedChainId","useCallback","assert","MarkOptional","isETH","getLogger","isFilledArray","MinRequiredReceiptLog","address","topics","data","ERC20TransferAmountsFromReceiptInput","receipt","logs","tokens","Pick","senderAddress","receiverAddress","TransferAmountsFromReceiptInput","TokenTransfers","token","sentAmount","receivedAmount","TransferAmountsFromReceiptResult","Record","TRANSFER_EVENT_SIGNATURE","getERC20TransferAmountsFromReceipt","result","toLowerCase","tokensSet","Set","map","fromAddressLowercase","toAddressLowercase","log","logAddressLowercase","has","decoded","abi","eventName","from","fromAddress","to","toAddress","value","args","tokenTransfer","_error","NativeTokenTransferInput","client","REASONABLE_GAS_PRICE","getNativeTokenTransfer","Promise","beforeBlockNumber","blockNumber","afterBlockNumber","senderPromises","const","senderIsReceiver","receiverPromises","senderBalanceBefore","senderBalanceAfter","receiverBalanceBefore","receiverBalanceAfter","all","gasPrice","effectiveGasPrice","minTxData","getMinTxDataFromHash","hash","transactionHash","account","gasCost","gasUsed","TokenTransfersFromReceiptInput","getTokenTransfersFromReceipt","tokensWithoutNative","filter","tokenTransfers","length","nativeTokenTransfer","TokenTransfersFromReceiptWithLimitsInput","detectedTokenTransfers","expectedTokenTransfers","validateAmount","calculatedAmount","expectedAmount","tolerancePercent","tolerance","BigInt","minExpected","maxExpected","logger1","logger2","getTokenTransfersFromReceiptWithLimits","validatedTokenTransfers","once","tokenAddress","calculatedTransfer","Object","entries","expectedTransfer","validatedTransfer","UseTokenTransfersFromReceiptInput","chainId","useTokenTransfersFromReceipt","t0","$","_c","t1","t2","select","t3","t4","t5","t6","t7","t8","t9","t10","queryKey","queryFn","enabled","MinTxData","GetMinTxDataFromHashInput","undefined","tx"],"sources":["../../../src/tokens/utils/transferAmountsFromReceipt.ts"],"sourcesContent":["import {\n type Address,\n type TransactionReceipt,\n type Client,\n decodeEventLog,\n erc20Abi,\n type Hex,\n type Hash,\n} from \"viem\";\nimport {\n getBalance,\n getGasPrice,\n getTransaction,\n getTransactionReceipt,\n} from \"viem/actions\";\nimport type { Token } from \"../state/types\";\nimport { ETH_ADDRESS_LOWERCASE } from \"../constants\";\nimport { gatherObjectsByProp } from \"@/lib/utils\";\nimport { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useClient } from \"wagmi\";\nimport type { SupportedChainId } from \"@/lib/web3/wagmi/types\";\nimport { useCallback } from \"react\";\nimport { assert, type MarkOptional } from \"ts-essentials\";\nimport { isETH } from \"./eth\";\nimport { getLogger } from \"@/core/logger\";\nimport { isFilledArray } from \"@/lib/utils/tuple\";\n\ntype MinRequiredReceiptLog = {\n address: Address;\n topics: Hex[];\n data: Hex;\n};\n\ntype ERC20TransferAmountsFromReceiptInput = {\n receipt: {\n logs: MinRequiredReceiptLog[];\n };\n tokens: Pick<Token, \"address\">[];\n senderAddress: Address;\n receiverAddress: Address;\n};\n\ntype TransferAmountsFromReceiptInput = ERC20TransferAmountsFromReceiptInput & {\n receipt: MarkOptional<\n Pick<\n TransactionReceipt,\n | \"blockNumber\"\n | \"gasUsed\"\n | \"effectiveGasPrice\"\n | \"from\"\n | \"transactionHash\"\n >,\n \"effectiveGasPrice\" | \"from\"\n >;\n};\n\nexport type TokenTransfers = {\n token: Address;\n sentAmount: bigint;\n receivedAmount: bigint;\n};\n\ntype TransferAmountsFromReceiptResult = Record<Address, TokenTransfers>;\n\n// ERC20 Transfer event signature: Transfer(address,address,uint256)\nconst TRANSFER_EVENT_SIGNATURE =\n \"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\";\n\n// give TransactionReceipt and tokens finds all transfers of Tokens to receiverAddress and returns amounts\nexport function getERC20TransferAmountsFromReceipt({\n receipt,\n tokens,\n senderAddress,\n receiverAddress,\n}: ERC20TransferAmountsFromReceiptInput): TransferAmountsFromReceiptResult {\n // Initialize result mapping with one entry per token\n const result: Record<Address, TokenTransfers> = gatherObjectsByProp(\n tokens,\n (token) => token.address.toLowerCase(),\n (token) => ({\n token: token.address as Address,\n sentAmount: 0n,\n receivedAmount: 0n,\n })\n );\n\n // Create a map for quick token lookup\n const tokensSet = new Set(tokens.map((token) => token.address.toLowerCase()));\n\n const fromAddressLowercase = senderAddress.toLowerCase();\n const toAddressLowercase = receiverAddress.toLowerCase();\n\n // Parse all logs in the transaction receipt\n for (const log of receipt.logs) {\n const logAddressLowercase = log.address.toLowerCase() as Address;\n // Check if this is a Transfer event from one of our tokens\n if (\n isFilledArray(log.topics) &&\n log.topics[0] === TRANSFER_EVENT_SIGNATURE &&\n tokensSet.has(logAddressLowercase)\n ) {\n try {\n // Parse the Transfer event parameters\n // topics[0] = event signature\n // topics[1] = from address (padded to 32 bytes)\n // topics[2] = to address (padded to 32 bytes)\n // data = value (uint256)\n\n const decoded = decodeEventLog({\n abi: erc20Abi,\n data: log.data,\n topics: log.topics,\n eventName: \"Transfer\",\n });\n\n const { from: fromAddress, to: toAddress, value } = decoded.args;\n\n const tokenTransfer = result[logAddressLowercase];\n if (!tokenTransfer) {\n continue;\n }\n\n // Check if the transfer is from sender to someone else\n if (fromAddress.toLowerCase() === fromAddressLowercase) {\n tokenTransfer.sentAmount += value;\n }\n // Check if the transfer is to receiver from someone else\n if (toAddress.toLowerCase() === toAddressLowercase) {\n tokenTransfer.receivedAmount += value;\n }\n } catch (_error) {\n // If parsing fails, skip this log\n continue;\n }\n }\n }\n\n return result;\n}\n\ntype NativeTokenTransferInput = {\n receipt: MarkOptional<\n Pick<\n TransactionReceipt,\n | \"blockNumber\"\n | \"gasUsed\"\n | \"effectiveGasPrice\"\n | \"from\"\n | \"transactionHash\"\n >,\n \"effectiveGasPrice\" | \"from\"\n >;\n senderAddress: Address;\n receiverAddress: Address;\n client: Client;\n};\n\n// when no gasPrice was fetched across several methods\nconst REASONABLE_GAS_PRICE = 2700000000n;\n\nexport async function getNativeTokenTransfer({\n receipt,\n senderAddress,\n receiverAddress,\n client,\n}: NativeTokenTransferInput): Promise<TokenTransfers> {\n const beforeBlockNumber = receipt.blockNumber - 1n;\n const afterBlockNumber = receipt.blockNumber;\n\n /*\n if the transaction was the only one transaction involving the sender and receiver\n in the block it was mined, and if the transaction was a SwapTransaction only,\n not some bulk transaction or a flashbot transaction, then we can consider\n that the ETH balances difference matches the ETH Swap amount.\n */\n\n const senderPromises = [\n // Get balances before the transaction\n getBalance(client, {\n address: senderAddress,\n blockNumber: beforeBlockNumber,\n }),\n // Get balances after the transaction\n getBalance(client, {\n address: senderAddress,\n blockNumber: afterBlockNumber,\n }),\n ] as const;\n\n const senderIsReceiver =\n senderAddress.toLowerCase() === receiverAddress.toLowerCase();\n\n const receiverPromises = senderIsReceiver\n ? // reuse sender promises if sender is receiver\n senderPromises\n : ([\n // Get balances before the transaction\n getBalance(client, {\n address: receiverAddress,\n blockNumber: beforeBlockNumber,\n }),\n // Get balances after the transaction\n getBalance(client, {\n address: receiverAddress,\n blockNumber: afterBlockNumber,\n }),\n ] as const);\n\n const [\n senderBalanceBefore,\n senderBalanceAfter,\n receiverBalanceBefore,\n receiverBalanceAfter,\n ] = await Promise.all([...senderPromises, ...receiverPromises]);\n\n // Calculate the differences\n let sentAmount = senderBalanceBefore - senderBalanceAfter; // difference in balances = sent ETH + paid gas\n let receivedAmount = receiverBalanceAfter - receiverBalanceBefore;\n\n let gasPrice = receipt.effectiveGasPrice;\n let from = receipt.from;\n if (!gasPrice) {\n // SendCalls receipt does not include some fields,\n // try to fetch them from the transaction hash\n const minTxData = await getMinTxDataFromHash({\n hash: receipt.transactionHash,\n client,\n });\n gasPrice = minTxData.gasPrice;\n from = minTxData.from;\n }\n\n if (!gasPrice) {\n gasPrice = REASONABLE_GAS_PRICE;\n }\n\n if (!from) {\n from = client.account?.address || senderAddress;\n }\n\n const gasCost = receipt.gasUsed * gasPrice;\n\n // if sender is the transaction sender (it may not be if a Relayer was involved)\n if (senderAddress.toLowerCase() === from.toLowerCase()) {\n // Adjust sentAmount for gas:\n // Subtract gas cost from sentAmount to get actual ETH sent (excluding gas fees)\n sentAmount -= gasCost;\n }\n\n // if sender is receiver, then need to adjust receivedAmount for gas\n if (senderAddress.toLowerCase() === receiverAddress.toLowerCase()) {\n receivedAmount += gasCost; // gas was paid out of the receivedAmount, so make this the amount before gas paid\n }\n\n return {\n token: ETH_ADDRESS_LOWERCASE, // Native token address\n sentAmount: sentAmount > 0n ? sentAmount : 0n,\n receivedAmount: receivedAmount > 0n ? receivedAmount : 0n,\n };\n}\n\ntype TokenTransfersFromReceiptInput = TransferAmountsFromReceiptInput & {\n client: Client;\n};\n\nexport async function getTokenTransfersFromReceipt({\n receipt,\n tokens,\n senderAddress,\n receiverAddress,\n client,\n}: TokenTransfersFromReceiptInput): Promise<TransferAmountsFromReceiptResult> {\n const tokensWithoutNative = tokens.filter((token) => !isETH(token));\n\n const tokenTransfers = getERC20TransferAmountsFromReceipt({\n receipt,\n tokens: tokensWithoutNative,\n senderAddress,\n receiverAddress,\n });\n\n // there was a native Token in the list\n if (tokensWithoutNative.length < tokens.length) {\n const nativeTokenTransfer = await getNativeTokenTransfer({\n receipt,\n senderAddress,\n receiverAddress,\n client,\n });\n\n tokenTransfers[ETH_ADDRESS_LOWERCASE] = nativeTokenTransfer;\n }\n\n return tokenTransfers;\n}\n\ntype TokenTransfersFromReceiptWithLimitsInput = {\n detectedTokenTransfers: Record<Address, TokenTransfers>;\n expectedTokenTransfers: Record<Address, TokenTransfers>;\n};\n\n// Helper function to validate an amount against expected value with tolerance\nfunction validateAmount({\n calculatedAmount,\n expectedAmount,\n tolerancePercent = 15, // max slippage %\n}: {\n calculatedAmount: bigint;\n expectedAmount: bigint;\n tolerancePercent?: number;\n}): bigint {\n if (expectedAmount === 0n) {\n // If expected is 0, use expected\n return expectedAmount;\n }\n\n // Check if calculated is within tolerance of expected\n const tolerance = (expectedAmount * BigInt(tolerancePercent)) / 100n;\n const minExpected = expectedAmount - tolerance;\n const maxExpected = expectedAmount + tolerance;\n\n if (calculatedAmount >= minExpected && calculatedAmount <= maxExpected) {\n return calculatedAmount;\n } else {\n return expectedAmount;\n }\n}\n\nconst logger1 = getLogger(\"Swap:amounts:Expected\");\nconst logger2 = getLogger(\"Swap:amounts:Detected\");\n\nexport function getTokenTransfersFromReceiptWithLimits({\n detectedTokenTransfers,\n expectedTokenTransfers,\n}: TokenTransfersFromReceiptWithLimitsInput): TransferAmountsFromReceiptResult {\n // Validate and adjust amounts based on expected values\n const validatedTokenTransfers: Record<Address, TokenTransfers> = {};\n\n logger1.once.log(\"Expected token transfers\", expectedTokenTransfers);\n logger2.once.log(\"Detected token transfers\", detectedTokenTransfers);\n\n for (const [tokenAddress, calculatedTransfer] of Object.entries(\n detectedTokenTransfers\n )) {\n const expectedTransfer = expectedTokenTransfers[tokenAddress as Address];\n\n if (!expectedTransfer) {\n // No expected value, use calculated\n validatedTokenTransfers[tokenAddress as Address] = calculatedTransfer;\n continue;\n }\n\n const validatedTransfer: TokenTransfers = {\n token: calculatedTransfer.token,\n sentAmount: validateAmount({\n calculatedAmount: calculatedTransfer.sentAmount,\n expectedAmount: expectedTransfer.sentAmount,\n }),\n receivedAmount: validateAmount({\n calculatedAmount: calculatedTransfer.receivedAmount,\n expectedAmount: expectedTransfer.receivedAmount,\n }),\n };\n\n validatedTokenTransfers[tokenAddress as Address] = validatedTransfer;\n }\n\n return validatedTokenTransfers;\n}\n\ntype UseTokenTransfersFromReceiptInput = TransferAmountsFromReceiptInput & {\n receipt: Pick<TransactionReceipt, \"transactionHash\">;\n chainId: SupportedChainId;\n expectedTokenTransfers: Record<Address, TokenTransfers>;\n};\n\n/**\n * @param expectedTokenTransfers - expected token transfers, if provided, will be used to validate the detected token transfers\n * @param chainId - chain id\n * @param receipt - transaction receipt\n * @param tokens - tokens\n * @param senderAddress - sender address\n * @param receiverAddress - receiver address\n * @returns - token transfers from receipt validated against expected token transfers\n * @note - ETH transfers are a best guess, and may not be accurate (falls back to expected token transfers)\n */\nexport function useTokenTransfersFromReceipt({\n receipt,\n tokens,\n senderAddress,\n receiverAddress,\n expectedTokenTransfers,\n chainId,\n}: MarkOptional<\n UseTokenTransfersFromReceiptInput,\n \"receipt\" | \"senderAddress\" | \"receiverAddress\" | \"expectedTokenTransfers\"\n>): UseQueryResult<TransferAmountsFromReceiptResult, Error> {\n const client = useClient({ chainId });\n\n const select = useCallback(\n (data: TransferAmountsFromReceiptResult) => {\n if (!expectedTokenTransfers) {\n return data;\n }\n\n return getTokenTransfersFromReceiptWithLimits({\n detectedTokenTransfers: data,\n expectedTokenTransfers,\n });\n },\n [expectedTokenTransfers]\n );\n\n return useQuery({\n queryKey: [\n \"token-transfers-from-receipt\",\n receipt?.transactionHash,\n receipt?.logs.length,\n senderAddress?.toLowerCase(),\n receiverAddress?.toLowerCase(),\n ],\n queryFn: async () => {\n assert(receipt, \"Receipt is required\");\n assert(senderAddress, \"Sender address is required\");\n assert(receiverAddress, \"Receiver address is required\");\n\n return getTokenTransfersFromReceipt({\n receipt,\n tokens,\n senderAddress,\n receiverAddress,\n client,\n });\n },\n select,\n enabled:\n !!receipt &&\n receipt.logs.length > 0 &&\n tokens.length > 0 &&\n !!senderAddress &&\n !!receiverAddress,\n });\n}\n\ntype MinTxData = {\n from?: Address;\n gasPrice?: bigint;\n};\n\ntype GetMinTxDataFromHashInput = {\n hash: Hash;\n client: Client;\n};\n\nasync function getMinTxDataFromHash({\n hash,\n client,\n}: GetMinTxDataFromHashInput): Promise<MinTxData> {\n let gasPrice: bigint | undefined = undefined;\n let from: Address | undefined;\n try {\n // likely this will return the correct receipt for the hash,\n // but in case of different RPC providers between the Wallet (which performed sendCalls),\n // and the RPC of the Client, the receipt may not be found\n const receipt = await getTransactionReceipt(client, {\n hash,\n });\n from = receipt.from;\n gasPrice = receipt.effectiveGasPrice;\n } catch {\n // can be TransactionReceiptNotFoundError\n }\n\n if (!gasPrice) {\n try {\n // very unlikely that even the transaction will not be found, but still possible\n const tx = await getTransaction(client, {\n hash,\n });\n from = tx.from;\n gasPrice = tx.gasPrice;\n } catch {\n // can be TransactionNotFoundError\n }\n }\n\n if (!gasPrice) {\n try {\n // just in case this may error\n gasPrice = await getGasPrice(client);\n } catch {\n // can be RequestError\n }\n }\n\n if (!from) {\n from = client.account?.address;\n }\n\n return {\n from,\n gasPrice,\n };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"hash.js","names":["jotaiStore","Hash","StandaloneTransactionItem","TransactionItem","isBatchTransactionItem","isGnosisSafeTx","allStandaloneTransactionItemsAtom","findStandaloneTx","transactionHash","Pick","get","find","tx","getStandaloneTxHash","getTxHash","receipt"],"sources":["../../src/transactions/hash.ts"],"sourcesContent":["import { jotaiStore } from \"@/core/store\";\nimport type { Hash } from \"viem\";\nimport type { StandaloneTransactionItem, TransactionItem } from \"./types\";\nimport { isBatchTransactionItem, isGnosisSafeTx } from \"./utils\";\nimport { allStandaloneTransactionItemsAtom } from \"./state/transactionsAtom\";\n\nfunction findStandaloneTx({\n transactionHash,\n}: Pick<StandaloneTransactionItem, \"transactionHash\">) {\n return jotaiStore\n .get(allStandaloneTransactionItemsAtom)\n .find((tx) => tx.transactionHash === transactionHash);\n}\n\nexport function getStandaloneTxHash({\n transactionHash,\n}: {\n transactionHash?: Hash;\n}): Hash | null {\n if (!transactionHash) return null;\n const tx = findStandaloneTx({ transactionHash });\n if (!tx) return null;\n return getTxHash(tx);\n}\n\nexport function getTxHash(tx: TransactionItem): Hash | null {\n if (tx.receipt?.transactionHash) {\n // if tx is mined, receipt is always the source of truth for the transaction hash\n return tx.receipt.transactionHash;\n }\n if (isBatchTransactionItem(tx)) {\n // for batch transactions, we have the real transaction hash in the receipt when the batch is mined\n return tx.receipt?.transactionHash || null;\n }\n if (isGnosisSafeTx(tx)) {\n // for Safe transactions sent through Safe iframe provider,\n // we don't have the real transaction hash until the transaction is mined\n return tx.receipt?.transactionHash || null;\n }\n\n return tx.transactionHash;\n}\n"],"mappings":";;;;AAMA,SAASO,EAAiB,EACxBC,sBACqD;AACrD,QAAOR,EACJU,IAAIJ,EAAkC,CACtCK,MAAMC,MAAOA,EAAGJ,oBAAoBA,EAAgB;;AAGzD,SAAgBK,EAAoB,EAClCL,sBAGc;AACd,KAAI,CAACA,EAAiB,QAAO;CAC7B,IAAMI,IAAKL,EAAiB,EAAEC,oBAAiB,CAAC;AAEhD,QADKI,IACEE,EAAUF,EAAG,GADJ;;AAIlB,SAAgBE,EAAUF,GAAkC;AAe1D,QAdIA,EAAGG,SAASP,kBAEPI,EAAGG,QAAQP,kBAEhBJ,EAAuBQ,EAAG,IAI1BP,EAAeO,EAAG,GAGbA,EAAGG,SAASP,mBAAmB,OAGjCI,EAAGJ"}
1
+ {"version":3,"file":"hash.js","names":["jotaiStore","Hash","StandaloneTransactionItem","TransactionItem","isBatchTransactionItem","isGnosisSafeTx","allStandaloneTransactionItemsAtom","findStandaloneTx","transactionHash","Pick","get","find","tx","getStandaloneTxHash","getTxHash","receipt"],"sources":["../../src/transactions/hash.ts"],"sourcesContent":["import { jotaiStore } from \"@/core/store\";\nimport type { Hash } from \"viem\";\nimport type { StandaloneTransactionItem, TransactionItem } from \"./types\";\nimport { isBatchTransactionItem, isGnosisSafeTx } from \"./utils\";\nimport { allStandaloneTransactionItemsAtom } from \"./state/transactionsAtom\";\n\nfunction findStandaloneTx({\n transactionHash,\n}: Pick<StandaloneTransactionItem, \"transactionHash\">) {\n return jotaiStore\n .get(allStandaloneTransactionItemsAtom)\n .find((tx) => tx.transactionHash === transactionHash);\n}\n\nexport function getStandaloneTxHash({\n transactionHash,\n}: {\n transactionHash?: Hash;\n}): Hash | null {\n if (!transactionHash) return null;\n const tx = findStandaloneTx({ transactionHash });\n if (!tx) return null;\n return getTxHash(tx);\n}\n\nexport function getTxHash(tx: TransactionItem): Hash | null {\n if (tx.receipt?.transactionHash) {\n // if tx is mined, receipt is always the source of truth for the transaction hash\n return tx.receipt.transactionHash;\n }\n if (isBatchTransactionItem(tx)) {\n // for batch transactions, we have the real transaction hash in the receipt when the batch is mined\n return tx.receipt?.transactionHash || null;\n }\n if (isGnosisSafeTx(tx)) {\n // for Safe transactions sent through Safe iframe provider,\n // we don't have the real transaction hash until the transaction is mined\n return tx.receipt?.transactionHash || null;\n }\n\n return tx.transactionHash;\n}\n"],"mappings":";;;;AAMA,SAASO,EAAiB,EACxBC,sBACqD;CACrD,OAAOR,EACJU,IAAIJ,EAAkC,CACtCK,MAAMC,MAAOA,EAAGJ,oBAAoBA,EAAgB;;AAGzD,SAAgBK,EAAoB,EAClCL,sBAGc;CACd,IAAI,CAACA,GAAiB,OAAO;CAC7B,IAAMI,IAAKL,EAAiB,EAAEC,oBAAiB,CAAC;CAEhD,OADKI,IACEE,EAAUF,EAAG,GADJ;;AAIlB,SAAgBE,EAAUF,GAAkC;CAe1D,OAdIA,EAAGG,SAASP,kBAEPI,EAAGG,QAAQP,kBAEhBJ,EAAuBQ,EAAG,IAI1BP,EAAeO,EAAG,GAGbA,EAAGG,SAASP,mBAAmB,OAGjCI,EAAGJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"ensureCallsStatus.js","names":["isConnectorWithSafeProvider","isWalletConnectConnectorWithSafe","SAFE_CALLS_WAIT_TIMEOUT","queryClient","_queryClient","wagmiConfig","_wagmiConfig","QueryClient","getAccount","waitForCallsStatus","Config","waitForCallsStatusQueryKey","WaitForCallsStatusData","EnsureCallsStatusFn","options","id","Promise","EnsureCallsStatusFactory","params","isSafe","ensureCallsStatusFactory","_isSafe","connector","isConnectedToSafe","timeout","undefined","queryKey","throwOnFailure","status","ensureQueryData","queryFn"],"sources":["../../../src/transactions/queries/ensureCallsStatus.ts"],"sourcesContent":["import { isConnectorWithSafeProvider } from \"@/components/web3/ConnectExternalProvider/utils\";\nimport { isWalletConnectConnectorWithSafe } from \"@/hooks/connectors/useIsSafeThroughWalletConnect\";\nimport { SAFE_CALLS_WAIT_TIMEOUT } from \"@/lib/constants\";\nimport { queryClient as _queryClient } from \"@/lib/queryClient\";\nimport { wagmiConfig as _wagmiConfig } from \"@/lib/web3/wagmi/config\";\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport { getAccount, waitForCallsStatus, type Config } from \"@wagmi/core\";\n\nimport {\n waitForCallsStatusQueryKey,\n type WaitForCallsStatusData,\n} from \"wagmi/query\";\n\nexport type EnsureCallsStatusFn = (options: {\n id: string;\n}) => Promise<WaitForCallsStatusData>;\n\ntype EnsureCallsStatusFactory = (params?: {\n queryClient?: QueryClient;\n wagmiConfig?: Config;\n isSafe?: boolean;\n}) => EnsureCallsStatusFn;\n\nexport const ensureCallsStatusFactory: EnsureCallsStatusFactory =\n ({\n queryClient = _queryClient,\n wagmiConfig = _wagmiConfig,\n isSafe: _isSafe,\n } = {}) =>\n async ({ id }) => {\n const { connector } = getAccount(wagmiConfig);\n\n let isSafe = _isSafe;\n if (!isSafe) {\n const isConnectedToSafe =\n !!connector &&\n (isConnectorWithSafeProvider(connector) ||\n (await isWalletConnectConnectorWithSafe(connector)));\n\n isSafe = isConnectedToSafe;\n }\n\n const timeout = isSafe ? SAFE_CALLS_WAIT_TIMEOUT : undefined;\n\n const queryKey = waitForCallsStatusQueryKey({\n id,\n timeout, // important to include timeout into queryKey to match useAwaitCalls queryKey\n throwOnFailure: true,\n });\n const status = await queryClient.ensureQueryData({\n queryKey,\n queryFn: async () => {\n return waitForCallsStatus(wagmiConfig, {\n id,\n throwOnFailure: true,\n timeout,\n });\n },\n });\n\n return status;\n };\n"],"mappings":";;;;;;;;AAuBA,IAAaoB,KACV,EACCjB,aAAAA,IAAcC,GACdC,aAAAA,IAAcC,GACda,QAAQE,MACN,EAAE,KACN,OAAO,EAAEN,YAAS;CAChB,IAAM,EAAEO,iBAAcd,EAAWH,EAAY,EAEzCc,IAASE;AACb,CAMEF,MAJE,CAAC,CAACG,MACDtB,EAA4BsB,EAAU,IACpC,MAAMrB,EAAiCqB,EAAU;CAKxD,IAAME,IAAUL,IAASjB,IAA0BuB,KAAAA,GAE7CC,IAAWf,EAA2B;EAC1CI;EACAS;EACAG,gBAAgB;EACjB,CAAC;AAYF,QAXe,MAAMxB,EAAY0B,gBAAgB;EAC/CH;EACAI,SAAS,YACArB,EAAmBJ,GAAa;GACrCU;GACAY,gBAAgB;GAChBH;GACD,CAAC;EAEL,CAAC"}
1
+ {"version":3,"file":"ensureCallsStatus.js","names":["isConnectorWithSafeProvider","isWalletConnectConnectorWithSafe","SAFE_CALLS_WAIT_TIMEOUT","queryClient","_queryClient","wagmiConfig","_wagmiConfig","QueryClient","getAccount","waitForCallsStatus","Config","waitForCallsStatusQueryKey","WaitForCallsStatusData","EnsureCallsStatusFn","options","id","Promise","EnsureCallsStatusFactory","params","isSafe","ensureCallsStatusFactory","_isSafe","connector","isConnectedToSafe","timeout","undefined","queryKey","throwOnFailure","status","ensureQueryData","queryFn"],"sources":["../../../src/transactions/queries/ensureCallsStatus.ts"],"sourcesContent":["import { isConnectorWithSafeProvider } from \"@/components/web3/ConnectExternalProvider/utils\";\nimport { isWalletConnectConnectorWithSafe } from \"@/hooks/connectors/useIsSafeThroughWalletConnect\";\nimport { SAFE_CALLS_WAIT_TIMEOUT } from \"@/lib/constants\";\nimport { queryClient as _queryClient } from \"@/lib/queryClient\";\nimport { wagmiConfig as _wagmiConfig } from \"@/lib/web3/wagmi/config\";\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport { getAccount, waitForCallsStatus, type Config } from \"@wagmi/core\";\n\nimport {\n waitForCallsStatusQueryKey,\n type WaitForCallsStatusData,\n} from \"wagmi/query\";\n\nexport type EnsureCallsStatusFn = (options: {\n id: string;\n}) => Promise<WaitForCallsStatusData>;\n\ntype EnsureCallsStatusFactory = (params?: {\n queryClient?: QueryClient;\n wagmiConfig?: Config;\n isSafe?: boolean;\n}) => EnsureCallsStatusFn;\n\nexport const ensureCallsStatusFactory: EnsureCallsStatusFactory =\n ({\n queryClient = _queryClient,\n wagmiConfig = _wagmiConfig,\n isSafe: _isSafe,\n } = {}) =>\n async ({ id }) => {\n const { connector } = getAccount(wagmiConfig);\n\n let isSafe = _isSafe;\n if (!isSafe) {\n const isConnectedToSafe =\n !!connector &&\n (isConnectorWithSafeProvider(connector) ||\n (await isWalletConnectConnectorWithSafe(connector)));\n\n isSafe = isConnectedToSafe;\n }\n\n const timeout = isSafe ? SAFE_CALLS_WAIT_TIMEOUT : undefined;\n\n const queryKey = waitForCallsStatusQueryKey({\n id,\n timeout, // important to include timeout into queryKey to match useAwaitCalls queryKey\n throwOnFailure: true,\n });\n const status = await queryClient.ensureQueryData({\n queryKey,\n queryFn: async () => {\n return waitForCallsStatus(wagmiConfig, {\n id,\n throwOnFailure: true,\n timeout,\n });\n },\n });\n\n return status;\n };\n"],"mappings":";;;;;;;;AAuBA,IAAaoB,KACV,EACCjB,aAAAA,IAAcC,GACdC,aAAAA,IAAcC,GACda,QAAQE,MACN,EAAE,KACN,OAAO,EAAEN,YAAS;CAChB,IAAM,EAAEO,iBAAcd,EAAWH,EAAY,EAEzCc,IAASE;CACb,AAMEF,MAJE,CAAC,CAACG,MACDtB,EAA4BsB,EAAU,IACpC,MAAMrB,EAAiCqB,EAAU;CAKxD,IAAME,IAAUL,IAASjB,IAA0BuB,KAAAA,GAE7CC,IAAWf,EAA2B;EAC1CI;EACAS;EACAG,gBAAgB;EACjB,CAAC;CAYF,OAAOC,MAXczB,EAAY0B,gBAAgB;EAC/CH;EACAI,SAAS,YACArB,EAAmBJ,GAAa;GACrCU;GACAY,gBAAgB;GAChBH;GACD,CAAC;EAEL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ensureEstimateFeesPerGas.js","names":["queryClient","_queryClient","wagmiConfig","_wagmiConfig","QueryClient","FeeValuesType","estimateFeesPerGasQueryOptions","SupportedChainId","EstimateFeesPerGasReturnType","EstimateFeesPerGasFn","options","chainId","type","Promise","EstimateFeesPerGasFactory","params","estimateFeesPerGasFactory","queryOptions","gasFeeResponse","ensureQueryData"],"sources":["../../../src/transactions/queries/ensureEstimateFeesPerGas.ts"],"sourcesContent":["import { queryClient as _queryClient } from \"@/lib/queryClient\";\nimport { wagmiConfig as _wagmiConfig } from \"@/lib/web3/wagmi/config\";\nimport type { QueryClient } from \"@tanstack/react-query\";\n\nimport { type FeeValuesType } from \"viem\";\n\nimport { estimateFeesPerGasQueryOptions } from \"wagmi/query\";\nimport type { SupportedChainId } from \"@/lib/web3/wagmi/types\";\nimport type { EstimateFeesPerGasReturnType } from \"@wagmi/core\";\n\nexport type EstimateFeesPerGasFn = (options: {\n chainId: SupportedChainId;\n type?: FeeValuesType;\n}) => Promise<EstimateFeesPerGasReturnType>;\n\ntype EstimateFeesPerGasFactory = (params?: {\n queryClient?: QueryClient;\n wagmiConfig?: typeof _wagmiConfig;\n}) => EstimateFeesPerGasFn;\n\nexport const estimateFeesPerGasFactory: EstimateFeesPerGasFactory =\n (options = {}) =>\n async ({ chainId, type = \"eip1559\" }) => {\n const { queryClient = _queryClient, wagmiConfig = _wagmiConfig } = options;\n\n const queryOptions = estimateFeesPerGasQueryOptions(wagmiConfig, {\n chainId,\n type,\n });\n\n const gasFeeResponse = await queryClient.ensureQueryData(queryOptions);\n\n return gasFeeResponse;\n };\n"],"mappings":";;;;;AAoBA,IAAagB,KACVN,IAAU,EAAE,KACb,OAAO,EAAEC,YAASC,UAAO,gBAAgB;CACvC,IAAM,EAAEZ,aAAAA,IAAcC,GAAcC,aAAAA,IAAcC,MAAiBO,GAE7DO,IAAeX,EAA+BJ,GAAa;EAC/DS;EACAC;EACD,CAAC;AAIF,QAFuB,MAAMZ,EAAYmB,gBAAgBF,EAAa"}
1
+ {"version":3,"file":"ensureEstimateFeesPerGas.js","names":["queryClient","_queryClient","wagmiConfig","_wagmiConfig","QueryClient","FeeValuesType","estimateFeesPerGasQueryOptions","SupportedChainId","EstimateFeesPerGasReturnType","EstimateFeesPerGasFn","options","chainId","type","Promise","EstimateFeesPerGasFactory","params","estimateFeesPerGasFactory","queryOptions","gasFeeResponse","ensureQueryData"],"sources":["../../../src/transactions/queries/ensureEstimateFeesPerGas.ts"],"sourcesContent":["import { queryClient as _queryClient } from \"@/lib/queryClient\";\nimport { wagmiConfig as _wagmiConfig } from \"@/lib/web3/wagmi/config\";\nimport type { QueryClient } from \"@tanstack/react-query\";\n\nimport { type FeeValuesType } from \"viem\";\n\nimport { estimateFeesPerGasQueryOptions } from \"wagmi/query\";\nimport type { SupportedChainId } from \"@/lib/web3/wagmi/types\";\nimport type { EstimateFeesPerGasReturnType } from \"@wagmi/core\";\n\nexport type EstimateFeesPerGasFn = (options: {\n chainId: SupportedChainId;\n type?: FeeValuesType;\n}) => Promise<EstimateFeesPerGasReturnType>;\n\ntype EstimateFeesPerGasFactory = (params?: {\n queryClient?: QueryClient;\n wagmiConfig?: typeof _wagmiConfig;\n}) => EstimateFeesPerGasFn;\n\nexport const estimateFeesPerGasFactory: EstimateFeesPerGasFactory =\n (options = {}) =>\n async ({ chainId, type = \"eip1559\" }) => {\n const { queryClient = _queryClient, wagmiConfig = _wagmiConfig } = options;\n\n const queryOptions = estimateFeesPerGasQueryOptions(wagmiConfig, {\n chainId,\n type,\n });\n\n const gasFeeResponse = await queryClient.ensureQueryData(queryOptions);\n\n return gasFeeResponse;\n };\n"],"mappings":";;;;;AAoBA,IAAagB,KACVN,IAAU,EAAE,KACb,OAAO,EAAEC,YAASC,UAAO,gBAAgB;CACvC,IAAM,EAAEZ,aAAAA,IAAcC,GAAcC,aAAAA,IAAcC,MAAiBO,GAE7DO,IAAeX,EAA+BJ,GAAa;EAC/DS;EACAC;EACD,CAAC;CAIF,OAAOM,MAFsBlB,EAAYmB,gBAAgBF,EAAa"}
@@ -1 +1 @@
1
- {"version":3,"file":"ensureTxReceipt.js","names":["UseAwaitTxParameters","queryClient","_queryClient","wagmiConfig","_wagmiConfig","QueryClient","assert","MarkRequired","ReplacementReturnType","TransactionReceipt","waitForTransactionReceiptQueryOptions","SAFE_CALLS_WAIT_TIMEOUT","Chain","getAccount","getConnectorClient","isConnectorWithSafeIframeProvider","isExternalConnectorSafeWalletConnect","isWalletConnectConnectorWithSafe","ensureCallsStatusFactory","getLogger","OnReplacedCb","data","EnsureTxReceiptFn","options","Pick","onReplaced","Promise","EnsureTxReceiptFactory","params","isSafe","logger","ensureTxReceiptFactory","hash","chainId","confirmations","_isSafe","connector","isWConnectConnectorWithSafe","isConnectedToSafeIframe","isConnectedToSafe","timeout","config","realtxHash","safeClient","getClient","ensureCallsStatus","callsStatusResult","id","classReceipt","receipts","length","transactionHash","error","queryOptions","receipt","ensureQueryData"],"sources":["../../../src/transactions/queries/ensureTxReceipt.ts"],"sourcesContent":["import type { UseAwaitTxParameters } from \"@/hooks/txs/queries/useAwaitTx\";\nimport { queryClient as _queryClient } from \"@/lib/queryClient\";\nimport { wagmiConfig as _wagmiConfig } from \"@/lib/web3/wagmi/config\";\nimport type { QueryClient } from \"@tanstack/react-query\";\n\nimport { assert, type MarkRequired } from \"ts-essentials\";\nimport { type ReplacementReturnType, type TransactionReceipt } from \"viem\";\n\nimport { waitForTransactionReceiptQueryOptions } from \"wagmi/query\";\nimport { SAFE_CALLS_WAIT_TIMEOUT } from \"@/lib/constants\";\nimport { type Chain } from \"wagmi/chains\";\nimport { getAccount, getConnectorClient } from \"@wagmi/core\";\nimport {\n isConnectorWithSafeIframeProvider,\n isExternalConnectorSafeWalletConnect,\n} from \"@/components/web3/ConnectExternalProvider/utils\";\nimport { isWalletConnectConnectorWithSafe } from \"@/hooks/connectors/useIsSafeThroughWalletConnect\";\nimport { ensureCallsStatusFactory } from \"./ensureCallsStatus\";\nimport { getLogger } from \"@/core/logger\";\n\ntype OnReplacedCb = (data: ReplacementReturnType<Chain>) => void;\n\nexport type EnsureTxReceiptFn = (\n options: MarkRequired<\n Pick<UseAwaitTxParameters, \"hash\" | \"chainId\" | \"confirmations\">,\n \"hash\" | \"chainId\"\n > & {\n onReplaced?: OnReplacedCb;\n }\n) => Promise<TransactionReceipt>;\n\ntype EnsureTxReceiptFactory = (params?: {\n queryClient?: QueryClient;\n wagmiConfig?: typeof _wagmiConfig;\n isSafe?: boolean;\n}) => EnsureTxReceiptFn;\n\nconst logger = getLogger(\"Transactions:EnsureTxReceipt\");\n\nexport const ensureTxReceiptFactory: EnsureTxReceiptFactory =\n (options = {}) =>\n async ({ hash, chainId, confirmations, onReplaced }) => {\n const {\n queryClient = _queryClient,\n wagmiConfig = _wagmiConfig,\n isSafe: _isSafe,\n } = options;\n const { connector } = getAccount(wagmiConfig);\n let isWConnectConnectorWithSafe = false;\n let isConnectedToSafeIframe = false;\n if (connector) {\n isWConnectConnectorWithSafe =\n // can determine sync from connector.type and connector.id in case of external provider\n isExternalConnectorSafeWalletConnect(connector);\n // can determine sync from connector.type and connector.id in case of Safe Iframe provider,\n // whether as external provider or in safe connector\n isConnectedToSafeIframe = isConnectorWithSafeIframeProvider(connector);\n if (!isWConnectConnectorWithSafe && !isConnectedToSafeIframe) {\n // neither External Safe WalletConnect connector nor Safe Iframe connector,\n // so we check if it's a WalletConnect connector with Safe\n isWConnectConnectorWithSafe =\n await isWalletConnectConnectorWithSafe(connector);\n }\n }\n const isConnectedToSafe =\n isWConnectConnectorWithSafe || isConnectedToSafeIframe;\n\n const isSafe = _isSafe || isConnectedToSafe;\n\n const timeout = isSafe\n ? SAFE_CALLS_WAIT_TIMEOUT\n : SAFE_CALLS_WAIT_TIMEOUT / 2; // by default timeout is set to 0 inside waitForTransactionReceipt,\n // which makes the receipt query never resolve if the tx is dropped\n\n let config = wagmiConfig;\n let realtxHash = hash;\n\n // always use connector client if connected through native safe connector.\n // safe provider returns a safeTxHash that is different from a real tx hash.\n if (isConnectedToSafeIframe) {\n const safeClient = await getConnectorClient(wagmiConfig, {\n chainId,\n connector,\n });\n\n // force waitForTransactionReceiptQueryOptions to use SafeClient internally\n config = {\n ...wagmiConfig,\n // doesn't work with Safe through WalletConnect connector\n getClient: (options) => {\n assert(!options || options.chainId === chainId, \"chainId mismatch\");\n return safeClient;\n },\n } as typeof wagmiConfig;\n } else if (isWConnectConnectorWithSafe) {\n /**\n * When Safe is connected through WalletConnect\n * (whether as external provider or in WalletConnect connector),\n * the resulting provider only ever returns safeTxHash in response to eth_sendTransaction.\n * And the provider never returns any kind of result in response to eth_getTransactionReceipt\n * or eth_getTransactionByHash for that safeTxHash.\n * Safe iframe provider does return real txHash's receipt in response to eth_getTransactionReceipt for safeTxHash.\n * But Safe through WalletConnect never does that.\n * Options:\n * 1. Use deprecated Safe API v1 to get the real tx hash and await its receipt\n * 2. Use Safe API v2 (optionally through safe-api-kit) but there an API key is required\n * 3. Safe SDK isn't an option as it communicates with Safe only from inside an iframe\n * 4. Surprisingly, wallet_getCallsStatus works with safeTxHash (at least with multiple signers)\n *\n * Here we go with option 4:\n * sendCallsId=safeTxHash -> getCallsStatus -> realTxHash=callsReceipt.txHash -> await receipt of realTxHash\n *\n * refs:\n * https://github.com/safe-global/safe-react-apps/issues/712\n * https://github.com/safe-global/safe-react-apps/issues/62\n */\n const ensureCallsStatus = ensureCallsStatusFactory({\n ...options,\n isSafe: true,\n });\n try {\n const callsStatusResult = await ensureCallsStatus({ id: hash });\n const classReceipt =\n callsStatusResult.receipts?.[callsStatusResult.receipts.length - 1];\n\n assert(\n classReceipt,\n `Transaction receipt not found for Safe tx through WalletConnect ${hash}, on chain ${chainId}`\n );\n\n realtxHash = classReceipt.transactionHash;\n } catch (error) {\n // it is possible Safe through WalletConnect could be connected but called with a past non-Safe tx from localStorage,\n // in that case we should try to get the tx receipt normally\n logger.error(\n \"Error getting calls status for Safe tx through WalletConnect\",\n { error }\n );\n }\n }\n\n // wagmi/core waitForTransactionReceipt throws on receipt.status==\"reverted\",\n // unlike viem waitForTransactionReceipt which returns the receipt as is\n const queryOptions = waitForTransactionReceiptQueryOptions(config, {\n hash: realtxHash,\n chainId,\n confirmations,\n timeout,\n onReplaced,\n });\n\n const receipt = await queryClient.ensureQueryData(queryOptions);\n\n return receipt;\n };\n"],"mappings":";;;;;;;;;;;;;AAqCA,IAAM8B,IAASX,EAAU,+BAA+B,EAE3CY,KACVR,IAAU,EAAE,KACb,OAAO,EAAES,SAAMC,YAASC,kBAAeT,oBAAiB;CACtD,IAAM,EACJxB,aAAAA,IAAcC,GACdC,aAAAA,IAAcC,GACdyB,QAAQM,MACNZ,GACE,EAAEa,iBAAcvB,EAAWV,EAAY,EACzCkC,IAA8B,IAC9BC,IAA0B;AAC9B,CAAIF,MACFC,IAEErB,EAAqCoB,EAAU,EAGjDE,IAA0BvB,EAAkCqB,EAAU,EAClE,CAACC,KAA+B,CAACC,MAGnCD,IACE,MAAMpB,EAAiCmB,EAAU;CAQvD,IAAMI,IAFSL,KAFbE,KAA+BC,IAK7B3B,IACAA,IAA0B,GAG1B8B,IAAStC,GACTuC,IAAaV;AAIjB,KAAIM,GAAyB;EAC3B,IAAMK,IAAa,MAAM7B,EAAmBX,GAAa;GACvD8B;GACAG;GACD,CAAC;AAGFK,MAAS;GACP,GAAGtC;GAEHyC,YAAYrB,OACVjB,EAAO,CAACiB,KAAWA,EAAQU,YAAYA,GAAS,mBAAmB,EAC5DU;GAEV;YACQN,GAA6B;EAsBtC,IAAMQ,IAAoB3B,EAAyB;GACjD,GAAGK;GACHM,QAAQ;GACT,CAAC;AACF,MAAI;GACF,IAAMiB,IAAoB,MAAMD,EAAkB,EAAEE,IAAIf,GAAM,CAAC,EACzDgB,IACJF,EAAkBG,WAAWH,EAAkBG,SAASC,SAAS;AAOnER,GALApC,EACE0C,GACA,mEAAmEhB,EAAI,aAAcC,IACtF,EAEDS,IAAaM,EAAaG;WACnBC,GAAO;AAGdtB,KAAOsB,MACL,gEACA,EAAEA,UACJ,CAAC;;;CAML,IAAMC,IAAe3C,EAAsC+B,GAAQ;EACjET,MAAMU;EACNT;EACAC;EACAM;EACAf;EACD,CAAC;AAIF,QAFgB,MAAMxB,EAAYsD,gBAAgBF,EAAa"}
1
+ {"version":3,"file":"ensureTxReceipt.js","names":["UseAwaitTxParameters","queryClient","_queryClient","wagmiConfig","_wagmiConfig","QueryClient","assert","MarkRequired","ReplacementReturnType","TransactionReceipt","waitForTransactionReceiptQueryOptions","SAFE_CALLS_WAIT_TIMEOUT","Chain","getAccount","getConnectorClient","isConnectorWithSafeIframeProvider","isExternalConnectorSafeWalletConnect","isWalletConnectConnectorWithSafe","ensureCallsStatusFactory","getLogger","OnReplacedCb","data","EnsureTxReceiptFn","options","Pick","onReplaced","Promise","EnsureTxReceiptFactory","params","isSafe","logger","ensureTxReceiptFactory","hash","chainId","confirmations","_isSafe","connector","isWConnectConnectorWithSafe","isConnectedToSafeIframe","isConnectedToSafe","timeout","config","realtxHash","safeClient","getClient","ensureCallsStatus","callsStatusResult","id","classReceipt","receipts","length","transactionHash","error","queryOptions","receipt","ensureQueryData"],"sources":["../../../src/transactions/queries/ensureTxReceipt.ts"],"sourcesContent":["import type { UseAwaitTxParameters } from \"@/hooks/txs/queries/useAwaitTx\";\nimport { queryClient as _queryClient } from \"@/lib/queryClient\";\nimport { wagmiConfig as _wagmiConfig } from \"@/lib/web3/wagmi/config\";\nimport type { QueryClient } from \"@tanstack/react-query\";\n\nimport { assert, type MarkRequired } from \"ts-essentials\";\nimport { type ReplacementReturnType, type TransactionReceipt } from \"viem\";\n\nimport { waitForTransactionReceiptQueryOptions } from \"wagmi/query\";\nimport { SAFE_CALLS_WAIT_TIMEOUT } from \"@/lib/constants\";\nimport { type Chain } from \"wagmi/chains\";\nimport { getAccount, getConnectorClient } from \"@wagmi/core\";\nimport {\n isConnectorWithSafeIframeProvider,\n isExternalConnectorSafeWalletConnect,\n} from \"@/components/web3/ConnectExternalProvider/utils\";\nimport { isWalletConnectConnectorWithSafe } from \"@/hooks/connectors/useIsSafeThroughWalletConnect\";\nimport { ensureCallsStatusFactory } from \"./ensureCallsStatus\";\nimport { getLogger } from \"@/core/logger\";\n\ntype OnReplacedCb = (data: ReplacementReturnType<Chain>) => void;\n\nexport type EnsureTxReceiptFn = (\n options: MarkRequired<\n Pick<UseAwaitTxParameters, \"hash\" | \"chainId\" | \"confirmations\">,\n \"hash\" | \"chainId\"\n > & {\n onReplaced?: OnReplacedCb;\n }\n) => Promise<TransactionReceipt>;\n\ntype EnsureTxReceiptFactory = (params?: {\n queryClient?: QueryClient;\n wagmiConfig?: typeof _wagmiConfig;\n isSafe?: boolean;\n}) => EnsureTxReceiptFn;\n\nconst logger = getLogger(\"Transactions:EnsureTxReceipt\");\n\nexport const ensureTxReceiptFactory: EnsureTxReceiptFactory =\n (options = {}) =>\n async ({ hash, chainId, confirmations, onReplaced }) => {\n const {\n queryClient = _queryClient,\n wagmiConfig = _wagmiConfig,\n isSafe: _isSafe,\n } = options;\n const { connector } = getAccount(wagmiConfig);\n let isWConnectConnectorWithSafe = false;\n let isConnectedToSafeIframe = false;\n if (connector) {\n isWConnectConnectorWithSafe =\n // can determine sync from connector.type and connector.id in case of external provider\n isExternalConnectorSafeWalletConnect(connector);\n // can determine sync from connector.type and connector.id in case of Safe Iframe provider,\n // whether as external provider or in safe connector\n isConnectedToSafeIframe = isConnectorWithSafeIframeProvider(connector);\n if (!isWConnectConnectorWithSafe && !isConnectedToSafeIframe) {\n // neither External Safe WalletConnect connector nor Safe Iframe connector,\n // so we check if it's a WalletConnect connector with Safe\n isWConnectConnectorWithSafe =\n await isWalletConnectConnectorWithSafe(connector);\n }\n }\n const isConnectedToSafe =\n isWConnectConnectorWithSafe || isConnectedToSafeIframe;\n\n const isSafe = _isSafe || isConnectedToSafe;\n\n const timeout = isSafe\n ? SAFE_CALLS_WAIT_TIMEOUT\n : SAFE_CALLS_WAIT_TIMEOUT / 2; // by default timeout is set to 0 inside waitForTransactionReceipt,\n // which makes the receipt query never resolve if the tx is dropped\n\n let config = wagmiConfig;\n let realtxHash = hash;\n\n // always use connector client if connected through native safe connector.\n // safe provider returns a safeTxHash that is different from a real tx hash.\n if (isConnectedToSafeIframe) {\n const safeClient = await getConnectorClient(wagmiConfig, {\n chainId,\n connector,\n });\n\n // force waitForTransactionReceiptQueryOptions to use SafeClient internally\n config = {\n ...wagmiConfig,\n // doesn't work with Safe through WalletConnect connector\n getClient: (options) => {\n assert(!options || options.chainId === chainId, \"chainId mismatch\");\n return safeClient;\n },\n } as typeof wagmiConfig;\n } else if (isWConnectConnectorWithSafe) {\n /**\n * When Safe is connected through WalletConnect\n * (whether as external provider or in WalletConnect connector),\n * the resulting provider only ever returns safeTxHash in response to eth_sendTransaction.\n * And the provider never returns any kind of result in response to eth_getTransactionReceipt\n * or eth_getTransactionByHash for that safeTxHash.\n * Safe iframe provider does return real txHash's receipt in response to eth_getTransactionReceipt for safeTxHash.\n * But Safe through WalletConnect never does that.\n * Options:\n * 1. Use deprecated Safe API v1 to get the real tx hash and await its receipt\n * 2. Use Safe API v2 (optionally through safe-api-kit) but there an API key is required\n * 3. Safe SDK isn't an option as it communicates with Safe only from inside an iframe\n * 4. Surprisingly, wallet_getCallsStatus works with safeTxHash (at least with multiple signers)\n *\n * Here we go with option 4:\n * sendCallsId=safeTxHash -> getCallsStatus -> realTxHash=callsReceipt.txHash -> await receipt of realTxHash\n *\n * refs:\n * https://github.com/safe-global/safe-react-apps/issues/712\n * https://github.com/safe-global/safe-react-apps/issues/62\n */\n const ensureCallsStatus = ensureCallsStatusFactory({\n ...options,\n isSafe: true,\n });\n try {\n const callsStatusResult = await ensureCallsStatus({ id: hash });\n const classReceipt =\n callsStatusResult.receipts?.[callsStatusResult.receipts.length - 1];\n\n assert(\n classReceipt,\n `Transaction receipt not found for Safe tx through WalletConnect ${hash}, on chain ${chainId}`\n );\n\n realtxHash = classReceipt.transactionHash;\n } catch (error) {\n // it is possible Safe through WalletConnect could be connected but called with a past non-Safe tx from localStorage,\n // in that case we should try to get the tx receipt normally\n logger.error(\n \"Error getting calls status for Safe tx through WalletConnect\",\n { error }\n );\n }\n }\n\n // wagmi/core waitForTransactionReceipt throws on receipt.status==\"reverted\",\n // unlike viem waitForTransactionReceipt which returns the receipt as is\n const queryOptions = waitForTransactionReceiptQueryOptions(config, {\n hash: realtxHash,\n chainId,\n confirmations,\n timeout,\n onReplaced,\n });\n\n const receipt = await queryClient.ensureQueryData(queryOptions);\n\n return receipt;\n };\n"],"mappings":";;;;;;;;;;;;;AAqCA,IAAM8B,IAASX,EAAU,+BAA+B,EAE3CY,KACVR,IAAU,EAAE,KACb,OAAO,EAAES,SAAMC,YAASC,kBAAeT,oBAAiB;CACtD,IAAM,EACJxB,aAAAA,IAAcC,GACdC,aAAAA,IAAcC,GACdyB,QAAQM,MACNZ,GACE,EAAEa,iBAAcvB,EAAWV,EAAY,EACzCkC,IAA8B,IAC9BC,IAA0B;CAC9B,AAAIF,MACFC,IAEErB,EAAqCoB,EAAU,EAGjDE,IAA0BvB,EAAkCqB,EAAU,EAClE,CAACC,KAA+B,CAACC,MAGnCD,IACE,MAAMpB,EAAiCmB,EAAU;CAQvD,IAAMI,IAFSL,KAFbE,KAA+BC,IAK7B3B,IACAA,IAA0B,GAG1B8B,IAAStC,GACTuC,IAAaV;CAIjB,IAAIM,GAAyB;EAC3B,IAAMK,IAAa,MAAM7B,EAAmBX,GAAa;GACvD8B;GACAG;GACD,CAAC;EAGFK,IAAS;GACP,GAAGtC;GAEHyC,YAAYrB,OACVjB,EAAO,CAACiB,KAAWA,EAAQU,YAAYA,GAAS,mBAAmB,EAC5DU;GAEV;QACI,IAAIN,GAA6B;EAsBtC,IAAMQ,IAAoB3B,EAAyB;GACjD,GAAGK;GACHM,QAAQ;GACT,CAAC;EACF,IAAI;GACF,IAAMiB,IAAoB,MAAMD,EAAkB,EAAEE,IAAIf,GAAM,CAAC,EACzDgB,IACJF,EAAkBG,WAAWH,EAAkBG,SAASC,SAAS;GAOnER,AALApC,EACE0C,GACA,mEAAmEhB,EAAI,aAAcC,IACtF,EAEDS,IAAaM,EAAaG;WACnBC,GAAO;GAGdtB,EAAOsB,MACL,gEACA,EAAEA,UACJ,CAAC;;;CAML,IAAMC,IAAe3C,EAAsC+B,GAAQ;EACjET,MAAMU;EACNT;EACAC;EACAM;EACAf;EACD,CAAC;CAIF,OAAO6B,MAFerD,EAAYsD,gBAAgBF,EAAa"}
@@ -1 +1 @@
1
- {"version":3,"file":"ensureTxResponse.js","names":["queryClient","_queryClient","wagmiConfig","_wagmiConfig","QueryClient","Hash","getTransactionQueryOptions","SupportedChainId","GetTransactionReturnType","TxResponse","EnsureTxResponseFn","options","hash","chainId","Promise","EnsureTxResponseFactory","params","ensureTxResponseFactory","queryOptions","txResponse","ensureQueryData"],"sources":["../../../src/transactions/queries/ensureTxResponse.ts"],"sourcesContent":["import { queryClient as _queryClient } from \"@/lib/queryClient\";\nimport { wagmiConfig as _wagmiConfig } from \"@/lib/web3/wagmi/config\";\nimport type { QueryClient } from \"@tanstack/react-query\";\n\nimport { type Hash } from \"viem\";\n\nimport { getTransactionQueryOptions } from \"wagmi/query\";\nimport type { SupportedChainId } from \"@/lib/web3/wagmi/types\";\nimport type { GetTransactionReturnType } from \"@wagmi/core\";\n\nexport type TxResponse = GetTransactionReturnType<\n typeof _wagmiConfig,\n SupportedChainId\n>;\n\nexport type EnsureTxResponseFn = (options: {\n hash: Hash;\n chainId: SupportedChainId;\n}) => Promise<TxResponse>;\n\ntype EnsureTxResponseFactory = (params?: {\n queryClient?: QueryClient;\n wagmiConfig?: typeof _wagmiConfig;\n}) => EnsureTxResponseFn;\n\nexport const ensureTxResponseFactory: EnsureTxResponseFactory =\n (options = {}) =>\n async ({ hash, chainId }) => {\n const { queryClient = _queryClient, wagmiConfig = _wagmiConfig } = options;\n\n // wagmi/core getTransaction throws TransactionNotFoundError when no tx found\n const queryOptions = getTransactionQueryOptions(wagmiConfig, {\n hash,\n chainId,\n });\n\n const txResponse: TxResponse =\n await queryClient.ensureQueryData(queryOptions);\n\n return txResponse;\n };\n"],"mappings":";;;;;AAyBA,IAAaiB,KACVN,IAAU,EAAE,KACb,OAAO,EAAEC,SAAMC,iBAAc;CAC3B,IAAM,EAAEb,aAAAA,IAAcC,GAAcC,aAAAA,IAAcC,MAAiBQ,GAG7DO,IAAeZ,EAA2BJ,GAAa;EAC3DU;EACAC;EACD,CAAC;AAKF,QAFE,MAAMb,EAAYoB,gBAAgBF,EAAa"}
1
+ {"version":3,"file":"ensureTxResponse.js","names":["queryClient","_queryClient","wagmiConfig","_wagmiConfig","QueryClient","Hash","getTransactionQueryOptions","SupportedChainId","GetTransactionReturnType","TxResponse","EnsureTxResponseFn","options","hash","chainId","Promise","EnsureTxResponseFactory","params","ensureTxResponseFactory","queryOptions","txResponse","ensureQueryData"],"sources":["../../../src/transactions/queries/ensureTxResponse.ts"],"sourcesContent":["import { queryClient as _queryClient } from \"@/lib/queryClient\";\nimport { wagmiConfig as _wagmiConfig } from \"@/lib/web3/wagmi/config\";\nimport type { QueryClient } from \"@tanstack/react-query\";\n\nimport { type Hash } from \"viem\";\n\nimport { getTransactionQueryOptions } from \"wagmi/query\";\nimport type { SupportedChainId } from \"@/lib/web3/wagmi/types\";\nimport type { GetTransactionReturnType } from \"@wagmi/core\";\n\nexport type TxResponse = GetTransactionReturnType<\n typeof _wagmiConfig,\n SupportedChainId\n>;\n\nexport type EnsureTxResponseFn = (options: {\n hash: Hash;\n chainId: SupportedChainId;\n}) => Promise<TxResponse>;\n\ntype EnsureTxResponseFactory = (params?: {\n queryClient?: QueryClient;\n wagmiConfig?: typeof _wagmiConfig;\n}) => EnsureTxResponseFn;\n\nexport const ensureTxResponseFactory: EnsureTxResponseFactory =\n (options = {}) =>\n async ({ hash, chainId }) => {\n const { queryClient = _queryClient, wagmiConfig = _wagmiConfig } = options;\n\n // wagmi/core getTransaction throws TransactionNotFoundError when no tx found\n const queryOptions = getTransactionQueryOptions(wagmiConfig, {\n hash,\n chainId,\n });\n\n const txResponse: TxResponse =\n await queryClient.ensureQueryData(queryOptions);\n\n return txResponse;\n };\n"],"mappings":";;;;;AAyBA,IAAaiB,KACVN,IAAU,EAAE,KACb,OAAO,EAAEC,SAAMC,iBAAc;CAC3B,IAAM,EAAEb,aAAAA,IAAcC,GAAcC,aAAAA,IAAcC,MAAiBQ,GAG7DO,IAAeZ,EAA2BJ,GAAa;EAC3DU;EACAC;EACD,CAAC;CAKF,OAAOM,MAFCnB,EAAYoB,gBAAgBF,EAAa"}
@@ -1 +1 @@
1
- {"version":3,"file":"finalize.js","names":["atomEffect","allPendingBatchTransactionItemsAtom","allPendingStandaloneTransactionItemsAtom","finalizeBatchTxAtom","finalizeStandaloneTxAtom","transactionLogger","accountAtom","addressAtom","isConnectorWithSafeAsyncAtomLoadableAtom","isGnosisSafeTx","isConnectorWithSafeProvider","hasRunStandaloneEffect","finalizeStandaloneTxsEffect","get","set","pendingStandaloneTxs","filter","tx","log","forEach","hasRunStandaloneSafeEffect","finalizeStandaloneSafeTxsEffect","connector","address","connectedSafe","loadableResult","state","data","getAccounts","getChainId","addressLower","toLowerCase","pendingSafeTxs","account","hasRunBatchEffect","finalizeBatchTxsEffect","pendingBatchTxs","hasRunBatchSafeEffect","finalizeBatchSafeTxsEffect","pendingSafeBatchTxs"],"sources":["../../../../src/transactions/state/effects/finalize.ts"],"sourcesContent":["import { atomEffect } from \"jotai-effect\";\nimport {\n allPendingBatchTransactionItemsAtom,\n allPendingStandaloneTransactionItemsAtom,\n} from \"../transactionsAtom\";\nimport {\n finalizeBatchTxAtom,\n finalizeStandaloneTxAtom,\n} from \"../transactionsActionAtom\";\n\nimport { transactionLogger } from \"../../logger\";\nimport {\n accountAtom,\n addressAtom,\n isConnectorWithSafeAsyncAtomLoadableAtom,\n} from \"@/lib/web3/wagmi/external\";\nimport { isGnosisSafeTx } from \"@/transactions/utils\";\nimport { isConnectorWithSafeProvider } from \"@/components/web3/ConnectExternalProvider/utils\";\n\n// run only once on app load\nlet hasRunStandaloneEffect = false;\nexport const finalizeStandaloneTxsEffect = atomEffect((get, set) => {\n if (hasRunStandaloneEffect) return;\n hasRunStandaloneEffect = true;\n\n const pendingStandaloneTxs = get(allPendingStandaloneTransactionItemsAtom)\n // txs through safe are handled in another effect\n .filter((tx) => !isGnosisSafeTx(tx));\n transactionLogger.log(\"Effect::pendingStandaloneTxs\", pendingStandaloneTxs);\n pendingStandaloneTxs.forEach((tx) => set(finalizeStandaloneTxAtom, tx));\n});\n\n// waitForTransactionReceipt(connectorClient,{safeTxHash}) requires wallet to be connected through safe connector\nlet hasRunStandaloneSafeEffect = false;\nexport const finalizeStandaloneSafeTxsEffect = atomEffect((get, set) => {\n if (hasRunStandaloneSafeEffect) return;\n const { connector, address } = get(accountAtom);\n let connectedSafe = connector && isConnectorWithSafeProvider(connector);\n\n if (!connectedSafe) {\n // loadable atom is required because atomEffect callback can't be async\n const loadableResult = get(isConnectorWithSafeAsyncAtomLoadableAtom);\n if (loadableResult.state === \"hasData\" && loadableResult.data) {\n connectedSafe = true;\n }\n }\n\n // try finalize when:\n // - connected through safe connector\n // - all required methods are available for ensureTxReceipt(){getConnectorClient()}\n // otherwise it will throw ConnectorUnavailableReconnectingError\n if (\n connectedSafe &&\n !!connector?.getAccounts &&\n !!connector?.getChainId &&\n address\n ) {\n hasRunStandaloneSafeEffect = true;\n\n const addressLower = address.toLowerCase();\n\n const pendingSafeTxs = get(allPendingStandaloneTransactionItemsAtom)\n .filter(isGnosisSafeTx)\n // only trigger Safe tx finalization if the same Safe that made the tx is connected\n .filter((tx) => tx.account.toLowerCase() === addressLower);\n transactionLogger.log(\"Effect::pendingSafeTxs\", pendingSafeTxs);\n pendingSafeTxs.forEach((tx) => set(finalizeStandaloneTxAtom, tx));\n }\n});\n\n// run only once after account is connected and available in atom\n// because waitForCallsStatus requires wallet to be connected\nlet hasRunBatchEffect = false;\nexport const finalizeBatchTxsEffect = atomEffect((get, set) => {\n if (hasRunBatchEffect) return;\n\n const address = get(addressAtom);\n if (address) {\n hasRunBatchEffect = true;\n\n const pendingBatchTxs = get(allPendingBatchTransactionItemsAtom)\n // batch txs through safe are handled in another effect\n .filter((tx) => !isGnosisSafeTx(tx));\n transactionLogger.log(\"Effect::pendingBatchTxs\", pendingBatchTxs);\n pendingBatchTxs.forEach((tx) => set(finalizeBatchTxAtom, tx));\n }\n});\n\nlet hasRunBatchSafeEffect = false;\nexport const finalizeBatchSafeTxsEffect = atomEffect((get, set) => {\n if (hasRunBatchSafeEffect) return;\n const { connector, address } = get(accountAtom);\n\n let connectedSafe = connector && isConnectorWithSafeProvider(connector);\n\n if (!connectedSafe) {\n // loadable atom is required because atomEffect callback can't be async\n const loadableResult = get(isConnectorWithSafeAsyncAtomLoadableAtom);\n if (loadableResult.state === \"hasData\" && loadableResult.data) {\n connectedSafe = true;\n }\n }\n\n // try finalize when:\n // - connected through safe connector\n // - all required methods are available for ensureCallsStatus(){getConnectorClient()}\n // otherwise it will throw ConnectorUnavailableReconnectingError\n if (\n connectedSafe &&\n !!connector?.getAccounts &&\n !!connector?.getChainId &&\n address\n ) {\n hasRunBatchSafeEffect = true;\n\n const addressLower = address.toLowerCase();\n\n const pendingSafeBatchTxs = get(allPendingBatchTransactionItemsAtom)\n .filter(isGnosisSafeTx)\n // only trigger Safe tx finalization if the same Safe that made the tx is connected\n .filter((tx) => tx.account.toLowerCase() === addressLower);\n transactionLogger.log(\"Effect::pendingSafeBatchTxs\", pendingSafeBatchTxs);\n pendingSafeBatchTxs.forEach((tx) => set(finalizeBatchTxAtom, tx));\n }\n});\n"],"mappings":";;;;;;;;AAoBA,IAAIW,IAAyB,IAChBC,IAA8BZ,GAAYa,GAAKC,MAAQ;AAClE,KAAIH,EAAwB;AAC5BA,KAAyB;CAEzB,IAAMI,IAAuBF,EAAIX,EAAwC,CAEtEc,QAAQC,MAAO,CAACR,EAAeQ,EAAG,CAAC;AAEtCF,CADAV,EAAkBa,IAAI,gCAAgCH,EAAqB,EAC3EA,EAAqBI,SAASF,MAAOH,EAAIV,GAA0Ba,EAAG,CAAC;EACvE,EAGEG,IAA6B,IACpBC,IAAkCrB,GAAYa,GAAKC,MAAQ;AACtE,KAAIM,EAA4B;CAChC,IAAM,EAAEE,cAAWC,eAAYV,EAAIP,EAAY,EAC3CkB,IAAgBF,KAAaZ,EAA4BY,EAAU;AAEvE,KAAI,CAACE,GAAe;EAElB,IAAMC,IAAiBZ,EAAIL,EAAyC;AACpE,EAAIiB,EAAeC,UAAU,aAAaD,EAAeE,SACvDH,IAAgB;;AAQpB,KACEA,KACEF,GAAWM,eACXN,GAAWO,cACbN,GACA;AACAH,MAA6B;EAE7B,IAAMU,IAAeP,EAAQQ,aAAa,EAEpCC,IAAiBnB,EAAIX,EAAyC,CACjEc,OAAOP,EAAc,CAErBO,QAAQC,MAAOA,EAAGgB,QAAQF,aAAa,KAAKD,EAAa;AAE5DE,EADA3B,EAAkBa,IAAI,0BAA0Bc,EAAe,EAC/DA,EAAeb,SAASF,MAAOH,EAAIV,GAA0Ba,EAAG,CAAC;;EAEnE,EAIEiB,IAAoB,IACXC,IAAyBnC,GAAYa,GAAKC,MAAQ;AACzDoB,WAEYrB,EAAIN,EAAY,EACnB;AACX2B,MAAoB;EAEpB,IAAME,IAAkBvB,EAAIZ,EAAmC,CAE5De,QAAQC,MAAO,CAACR,EAAeQ,EAAG,CAAC;AAEtCmB,EADA/B,EAAkBa,IAAI,2BAA2BkB,EAAgB,EACjEA,EAAgBjB,SAASF,MAAOH,EAAIX,GAAqBc,EAAG,CAAC;;EAE/D,EAEEoB,IAAwB,IACfC,IAA6BtC,GAAYa,GAAKC,MAAQ;AACjE,KAAIuB,EAAuB;CAC3B,IAAM,EAAEf,cAAWC,eAAYV,EAAIP,EAAY,EAE3CkB,IAAgBF,KAAaZ,EAA4BY,EAAU;AAEvE,KAAI,CAACE,GAAe;EAElB,IAAMC,IAAiBZ,EAAIL,EAAyC;AACpE,EAAIiB,EAAeC,UAAU,aAAaD,EAAeE,SACvDH,IAAgB;;AAQpB,KACEA,KACEF,GAAWM,eACXN,GAAWO,cACbN,GACA;AACAc,MAAwB;EAExB,IAAMP,IAAeP,EAAQQ,aAAa,EAEpCQ,IAAsB1B,EAAIZ,EAAoC,CACjEe,OAAOP,EAAc,CAErBO,QAAQC,MAAOA,EAAGgB,QAAQF,aAAa,KAAKD,EAAa;AAE5DS,EADAlC,EAAkBa,IAAI,+BAA+BqB,EAAoB,EACzEA,EAAoBpB,SAASF,MAAOH,EAAIX,GAAqBc,EAAG,CAAC;;EAEnE"}
1
+ {"version":3,"file":"finalize.js","names":["atomEffect","allPendingBatchTransactionItemsAtom","allPendingStandaloneTransactionItemsAtom","finalizeBatchTxAtom","finalizeStandaloneTxAtom","transactionLogger","accountAtom","addressAtom","isConnectorWithSafeAsyncAtomLoadableAtom","isGnosisSafeTx","isConnectorWithSafeProvider","hasRunStandaloneEffect","finalizeStandaloneTxsEffect","get","set","pendingStandaloneTxs","filter","tx","log","forEach","hasRunStandaloneSafeEffect","finalizeStandaloneSafeTxsEffect","connector","address","connectedSafe","loadableResult","state","data","getAccounts","getChainId","addressLower","toLowerCase","pendingSafeTxs","account","hasRunBatchEffect","finalizeBatchTxsEffect","pendingBatchTxs","hasRunBatchSafeEffect","finalizeBatchSafeTxsEffect","pendingSafeBatchTxs"],"sources":["../../../../src/transactions/state/effects/finalize.ts"],"sourcesContent":["import { atomEffect } from \"jotai-effect\";\nimport {\n allPendingBatchTransactionItemsAtom,\n allPendingStandaloneTransactionItemsAtom,\n} from \"../transactionsAtom\";\nimport {\n finalizeBatchTxAtom,\n finalizeStandaloneTxAtom,\n} from \"../transactionsActionAtom\";\n\nimport { transactionLogger } from \"../../logger\";\nimport {\n accountAtom,\n addressAtom,\n isConnectorWithSafeAsyncAtomLoadableAtom,\n} from \"@/lib/web3/wagmi/external\";\nimport { isGnosisSafeTx } from \"@/transactions/utils\";\nimport { isConnectorWithSafeProvider } from \"@/components/web3/ConnectExternalProvider/utils\";\n\n// run only once on app load\nlet hasRunStandaloneEffect = false;\nexport const finalizeStandaloneTxsEffect = atomEffect((get, set) => {\n if (hasRunStandaloneEffect) return;\n hasRunStandaloneEffect = true;\n\n const pendingStandaloneTxs = get(allPendingStandaloneTransactionItemsAtom)\n // txs through safe are handled in another effect\n .filter((tx) => !isGnosisSafeTx(tx));\n transactionLogger.log(\"Effect::pendingStandaloneTxs\", pendingStandaloneTxs);\n pendingStandaloneTxs.forEach((tx) => set(finalizeStandaloneTxAtom, tx));\n});\n\n// waitForTransactionReceipt(connectorClient,{safeTxHash}) requires wallet to be connected through safe connector\nlet hasRunStandaloneSafeEffect = false;\nexport const finalizeStandaloneSafeTxsEffect = atomEffect((get, set) => {\n if (hasRunStandaloneSafeEffect) return;\n const { connector, address } = get(accountAtom);\n let connectedSafe = connector && isConnectorWithSafeProvider(connector);\n\n if (!connectedSafe) {\n // loadable atom is required because atomEffect callback can't be async\n const loadableResult = get(isConnectorWithSafeAsyncAtomLoadableAtom);\n if (loadableResult.state === \"hasData\" && loadableResult.data) {\n connectedSafe = true;\n }\n }\n\n // try finalize when:\n // - connected through safe connector\n // - all required methods are available for ensureTxReceipt(){getConnectorClient()}\n // otherwise it will throw ConnectorUnavailableReconnectingError\n if (\n connectedSafe &&\n !!connector?.getAccounts &&\n !!connector?.getChainId &&\n address\n ) {\n hasRunStandaloneSafeEffect = true;\n\n const addressLower = address.toLowerCase();\n\n const pendingSafeTxs = get(allPendingStandaloneTransactionItemsAtom)\n .filter(isGnosisSafeTx)\n // only trigger Safe tx finalization if the same Safe that made the tx is connected\n .filter((tx) => tx.account.toLowerCase() === addressLower);\n transactionLogger.log(\"Effect::pendingSafeTxs\", pendingSafeTxs);\n pendingSafeTxs.forEach((tx) => set(finalizeStandaloneTxAtom, tx));\n }\n});\n\n// run only once after account is connected and available in atom\n// because waitForCallsStatus requires wallet to be connected\nlet hasRunBatchEffect = false;\nexport const finalizeBatchTxsEffect = atomEffect((get, set) => {\n if (hasRunBatchEffect) return;\n\n const address = get(addressAtom);\n if (address) {\n hasRunBatchEffect = true;\n\n const pendingBatchTxs = get(allPendingBatchTransactionItemsAtom)\n // batch txs through safe are handled in another effect\n .filter((tx) => !isGnosisSafeTx(tx));\n transactionLogger.log(\"Effect::pendingBatchTxs\", pendingBatchTxs);\n pendingBatchTxs.forEach((tx) => set(finalizeBatchTxAtom, tx));\n }\n});\n\nlet hasRunBatchSafeEffect = false;\nexport const finalizeBatchSafeTxsEffect = atomEffect((get, set) => {\n if (hasRunBatchSafeEffect) return;\n const { connector, address } = get(accountAtom);\n\n let connectedSafe = connector && isConnectorWithSafeProvider(connector);\n\n if (!connectedSafe) {\n // loadable atom is required because atomEffect callback can't be async\n const loadableResult = get(isConnectorWithSafeAsyncAtomLoadableAtom);\n if (loadableResult.state === \"hasData\" && loadableResult.data) {\n connectedSafe = true;\n }\n }\n\n // try finalize when:\n // - connected through safe connector\n // - all required methods are available for ensureCallsStatus(){getConnectorClient()}\n // otherwise it will throw ConnectorUnavailableReconnectingError\n if (\n connectedSafe &&\n !!connector?.getAccounts &&\n !!connector?.getChainId &&\n address\n ) {\n hasRunBatchSafeEffect = true;\n\n const addressLower = address.toLowerCase();\n\n const pendingSafeBatchTxs = get(allPendingBatchTransactionItemsAtom)\n .filter(isGnosisSafeTx)\n // only trigger Safe tx finalization if the same Safe that made the tx is connected\n .filter((tx) => tx.account.toLowerCase() === addressLower);\n transactionLogger.log(\"Effect::pendingSafeBatchTxs\", pendingSafeBatchTxs);\n pendingSafeBatchTxs.forEach((tx) => set(finalizeBatchTxAtom, tx));\n }\n});\n"],"mappings":";;;;;;;;AAoBA,IAAIW,IAAyB,IAChBC,IAA8BZ,GAAYa,GAAKC,MAAQ;CAClE,IAAIH,GAAwB;CAC5BA,IAAyB;CAEzB,IAAMI,IAAuBF,EAAIX,EAAwC,CAEtEc,QAAQC,MAAO,CAACR,EAAeQ,EAAG,CAAC;CAEtCF,AADAV,EAAkBa,IAAI,gCAAgCH,EAAqB,EAC3EA,EAAqBI,SAASF,MAAOH,EAAIV,GAA0Ba,EAAG,CAAC;EACvE,EAGEG,IAA6B,IACpBC,IAAkCrB,GAAYa,GAAKC,MAAQ;CACtE,IAAIM,GAA4B;CAChC,IAAM,EAAEE,cAAWC,eAAYV,EAAIP,EAAY,EAC3CkB,IAAgBF,KAAaZ,EAA4BY,EAAU;CAEvE,IAAI,CAACE,GAAe;EAElB,IAAMC,IAAiBZ,EAAIL,EAAyC;EACpE,AAAIiB,EAAeC,UAAU,aAAaD,EAAeE,SACvDH,IAAgB;;CAQpB,IACEA,KACEF,GAAWM,eACXN,GAAWO,cACbN,GACA;EACAH,IAA6B;EAE7B,IAAMU,IAAeP,EAAQQ,aAAa,EAEpCC,IAAiBnB,EAAIX,EAAyC,CACjEc,OAAOP,EAAc,CAErBO,QAAQC,MAAOA,EAAGgB,QAAQF,aAAa,KAAKD,EAAa;EAE5DE,AADA3B,EAAkBa,IAAI,0BAA0Bc,EAAe,EAC/DA,EAAeb,SAASF,MAAOH,EAAIV,GAA0Ba,EAAG,CAAC;;EAEnE,EAIEiB,IAAoB,IACXC,IAAyBnC,GAAYa,GAAKC,MAAQ;CACzDoB,UAEYrB,EAAIN,EAChBgB,EAAS;EACXW,IAAoB;EAEpB,IAAME,IAAkBvB,EAAIZ,EAAmC,CAE5De,QAAQC,MAAO,CAACR,EAAeQ,EAAG,CAAC;EAEtCmB,AADA/B,EAAkBa,IAAI,2BAA2BkB,EAAgB,EACjEA,EAAgBjB,SAASF,MAAOH,EAAIX,GAAqBc,EAAG,CAAC;;EAE/D,EAEEoB,IAAwB,IACfC,IAA6BtC,GAAYa,GAAKC,MAAQ;CACjE,IAAIuB,GAAuB;CAC3B,IAAM,EAAEf,cAAWC,eAAYV,EAAIP,EAAY,EAE3CkB,IAAgBF,KAAaZ,EAA4BY,EAAU;CAEvE,IAAI,CAACE,GAAe;EAElB,IAAMC,IAAiBZ,EAAIL,EAAyC;EACpE,AAAIiB,EAAeC,UAAU,aAAaD,EAAeE,SACvDH,IAAgB;;CAQpB,IACEA,KACEF,GAAWM,eACXN,GAAWO,cACbN,GACA;EACAc,IAAwB;EAExB,IAAMP,IAAeP,EAAQQ,aAAa,EAEpCQ,IAAsB1B,EAAIZ,EAAoC,CACjEe,OAAOP,EAAc,CAErBO,QAAQC,MAAOA,EAAGgB,QAAQF,aAAa,KAAKD,EAAa;EAE5DS,AADAlC,EAAkBa,IAAI,+BAA+BqB,EAAoB,EACzEA,EAAoBpB,SAASF,MAAOH,EAAIX,GAAqBc,EAAG,CAAC;;EAEnE"}
@@ -1 +1 @@
1
- {"version":3,"file":"useActivateEffects.js","names":["useAtom","finalizeBatchTxsEffect","finalizeStandaloneTxsEffect","finalizeStandaloneSafeTxsEffect","finalizeBatchSafeTxsEffect","useActivateEffects"],"sources":["../../../../src/transactions/state/hooks/useActivateEffects.ts"],"sourcesContent":["import { useAtom } from \"@/core/store\";\nimport {\n finalizeBatchTxsEffect,\n finalizeStandaloneTxsEffect,\n finalizeStandaloneSafeTxsEffect,\n finalizeBatchSafeTxsEffect,\n} from \"@/transactions/state/effects/finalize\";\n\nexport function useActivateEffects() {\n // atomEffects must be rendered for subscriptions to activate\n useAtom(finalizeStandaloneTxsEffect);\n useAtom(finalizeStandaloneSafeTxsEffect);\n useAtom(finalizeBatchTxsEffect);\n useAtom(finalizeBatchSafeTxsEffect);\n}\n"],"mappings":";;;AAQA,SAAOK,IAAA;AAKLL,CAHAA,EAAQE,EAA4B,EACpCF,EAAQG,EAAgC,EACxCH,EAAQC,EAAuB,EAC/BD,EAAQI,EAA2B"}
1
+ {"version":3,"file":"useActivateEffects.js","names":["useAtom","finalizeBatchTxsEffect","finalizeStandaloneTxsEffect","finalizeStandaloneSafeTxsEffect","finalizeBatchSafeTxsEffect","useActivateEffects"],"sources":["../../../../src/transactions/state/hooks/useActivateEffects.ts"],"sourcesContent":["import { useAtom } from \"@/core/store\";\nimport {\n finalizeBatchTxsEffect,\n finalizeStandaloneTxsEffect,\n finalizeStandaloneSafeTxsEffect,\n finalizeBatchSafeTxsEffect,\n} from \"@/transactions/state/effects/finalize\";\n\nexport function useActivateEffects() {\n // atomEffects must be rendered for subscriptions to activate\n useAtom(finalizeStandaloneTxsEffect);\n useAtom(finalizeStandaloneSafeTxsEffect);\n useAtom(finalizeBatchTxsEffect);\n useAtom(finalizeBatchSafeTxsEffect);\n}\n"],"mappings":";;;AAQA,SAAOK,IAAA;CAKLL,AAHAA,EAAQE,EAA4B,EACpCF,EAAQG,EAAgC,EACxCH,EAAQC,EAAuB,EAC/BD,EAAQI,EAA2B"}
@@ -1 +1 @@
1
- {"version":3,"file":"useMarkTxAsDropped.js","names":["useSetAtom","markTxAsDroppedAtom","useMarkTxAsDropped","markTxAsDropped"],"sources":["../../../../src/transactions/state/hooks/useMarkTxAsDropped.ts"],"sourcesContent":["import { useSetAtom } from \"@/core/store\";\nimport { markTxAsDroppedAtom } from \"../transactionsActionAtom\";\n\nexport function useMarkTxAsDropped() {\n const markTxAsDropped = useSetAtom(markTxAsDroppedAtom);\n\n return markTxAsDropped;\n}\n"],"mappings":";;;AAGA,SAAOE,IAAA;AACmD,QAAhCF,EAAWC,EAAoB"}
1
+ {"version":3,"file":"useMarkTxAsDropped.js","names":["useSetAtom","markTxAsDroppedAtom","useMarkTxAsDropped","markTxAsDropped"],"sources":["../../../../src/transactions/state/hooks/useMarkTxAsDropped.ts"],"sourcesContent":["import { useSetAtom } from \"@/core/store\";\nimport { markTxAsDroppedAtom } from \"../transactionsActionAtom\";\n\nexport function useMarkTxAsDropped() {\n const markTxAsDropped = useSetAtom(markTxAsDroppedAtom);\n\n return markTxAsDropped;\n}\n"],"mappings":";;;AAGA,SAAOE,IAAA;CACmD,OAAhCF,EAAWC,EAE5BE"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTransactions.js","names":["useAtomValue","userPendingTransactionsAtom","userSwapTransactionsAtom","useAllEnabledChains","useUserPendingTransactions","useUserSwapTransactions","useUserSwapTransactionsOnEnabledChains","$","_c","enabledChains","swapTransactions","t0","t1","t2","chainId","includes","filter","useUserPendingTransactionsOnEnabledChains","pendingTransactions"],"sources":["../../../../src/transactions/state/hooks/useTransactions.ts"],"sourcesContent":["import { useAtomValue } from \"@/core/store\";\nimport {\n userPendingTransactionsAtom,\n userSwapTransactionsAtom,\n} from \"../transactionsAtom\";\nimport { useAllEnabledChains } from \"@/core/state/enabledChainsAtom\";\n\nexport const useUserPendingTransactions = () =>\n useAtomValue(userPendingTransactionsAtom);\nexport const useUserSwapTransactions = () =>\n useAtomValue(userSwapTransactionsAtom);\n\nexport const useUserSwapTransactionsOnEnabledChains = () => {\n const enabledChains = useAllEnabledChains();\n const swapTransactions = useUserSwapTransactions();\n return swapTransactions.filter(({ chainId }) =>\n enabledChains.includes(chainId)\n );\n};\nexport const useUserPendingTransactionsOnEnabledChains = () => {\n const enabledChains = useAllEnabledChains();\n const pendingTransactions = useUserPendingTransactions();\n return pendingTransactions.filter(({ chainId }) =>\n enabledChains.includes(chainId)\n );\n};\n"],"mappings":";;;;;AAOA,IAAaI,UACXJ,EAAaC,EAA4B,EAC9BI,UACXL,EAAaE,EAAyB,EAE3BI,UAAyC;CAAA,IAAAC,IAAAC,EAAA,EAAA,EACpDC,IAAsBN,GAAqB,EAC3CO,IAAyBL,GAAyB,EAACM;AAAA,KAAAJ,EAAA,OAAAE,KAAAF,EAAA,OAAAG,GAAA;EAAA,IAAAE;AAGlDL,EAHkDA,EAAA,OAAAE,IAElBG,IAAAL,EAAA,MADFK,KAAAC,MAAA;GAAC,IAAA,EAAAC,eAAAD;AAAW,UACzCJ,EAAaM,SAAUD,EAAQ;KAAAP,EAAA,KAAAE,GAAAF,EAAA,KAAAK,IAD1BD,IAAAD,EAAgBM,OAAQJ,EAE9B,EAAAL,EAAA,KAAAE,GAAAF,EAAA,KAAAG,GAAAH,EAAA,KAAAI;OAAAA,KAAAJ,EAAA;AAAA,QAFMI;GAIIM,UAA4C;CAAA,IAAAV,IAAAC,EAAA,EAAA,EACvDC,IAAsBN,GAAqB,EAC3Ce,IAA4Bd,GAA4B,EAACO;AAAA,KAAAJ,EAAA,OAAAE,KAAAF,EAAA,OAAAW,GAAA;EAAA,IAAAN;AAGxDL,EAHwDA,EAAA,OAAAE,IAExBG,IAAAL,EAAA,MADCK,KAAAC,MAAA;GAAC,IAAA,EAAAC,eAAAD;AAAW,UAC5CJ,EAAaM,SAAUD,EAAQ;KAAAP,EAAA,KAAAE,GAAAF,EAAA,KAAAK,IAD1BD,IAAAO,EAAmBF,OAAQJ,EAEjC,EAAAL,EAAA,KAAAE,GAAAF,EAAA,KAAAW,GAAAX,EAAA,KAAAI;OAAAA,KAAAJ,EAAA;AAAA,QAFMI"}
1
+ {"version":3,"file":"useTransactions.js","names":["useAtomValue","userPendingTransactionsAtom","userSwapTransactionsAtom","useAllEnabledChains","useUserPendingTransactions","useUserSwapTransactions","useUserSwapTransactionsOnEnabledChains","$","_c","enabledChains","swapTransactions","t0","t1","t2","chainId","includes","filter","useUserPendingTransactionsOnEnabledChains","pendingTransactions"],"sources":["../../../../src/transactions/state/hooks/useTransactions.ts"],"sourcesContent":["import { useAtomValue } from \"@/core/store\";\nimport {\n userPendingTransactionsAtom,\n userSwapTransactionsAtom,\n} from \"../transactionsAtom\";\nimport { useAllEnabledChains } from \"@/core/state/enabledChainsAtom\";\n\nexport const useUserPendingTransactions = () =>\n useAtomValue(userPendingTransactionsAtom);\nexport const useUserSwapTransactions = () =>\n useAtomValue(userSwapTransactionsAtom);\n\nexport const useUserSwapTransactionsOnEnabledChains = () => {\n const enabledChains = useAllEnabledChains();\n const swapTransactions = useUserSwapTransactions();\n return swapTransactions.filter(({ chainId }) =>\n enabledChains.includes(chainId)\n );\n};\nexport const useUserPendingTransactionsOnEnabledChains = () => {\n const enabledChains = useAllEnabledChains();\n const pendingTransactions = useUserPendingTransactions();\n return pendingTransactions.filter(({ chainId }) =>\n enabledChains.includes(chainId)\n );\n};\n"],"mappings":";;;;;AAOA,IAAaI,UACXJ,EAAaC,EAA4B,EAC9BI,UACXL,EAAaE,EAAyB,EAE3BI,UAAyC;CAAA,IAAAC,IAAAC,EAAA,EAAA,EACpDC,IAAsBN,GAAqB,EAC3CO,IAAyBL,GAAyB,EAACM;CAAA,IAAAJ,EAAA,OAAAE,KAAAF,EAAA,OAAAG,GAAA;EAAA,IAAAE;EAGlDL,AAHkDA,EAAA,OAAAE,IAElBG,IAAAL,EAAA,MADFK,KAAAC,MAAA;GAAC,IAAA,EAAAC,eAAAD;GAAW,OACzCJ,EAAaM,SAAUD,EAAQ;KAAAP,EAAA,KAAAE,GAAAF,EAAA,KAAAK,IAD1BD,IAAAD,EAAgBM,OAAQJ,EAE9B,EAAAL,EAAA,KAAAE,GAAAF,EAAA,KAAAG,GAAAH,EAAA,KAAAI;QAAAA,IAAAJ,EAAA;CAAA,OAFMI;GAIIM,UAA4C;CAAA,IAAAV,IAAAC,EAAA,EAAA,EACvDC,IAAsBN,GAAqB,EAC3Ce,IAA4Bd,GAA4B,EAACO;CAAA,IAAAJ,EAAA,OAAAE,KAAAF,EAAA,OAAAW,GAAA;EAAA,IAAAN;EAGxDL,AAHwDA,EAAA,OAAAE,IAExBG,IAAAL,EAAA,MADCK,KAAAC,MAAA;GAAC,IAAA,EAAAC,eAAAD;GAAW,OAC5CJ,EAAaM,SAAUD,EAAQ;KAAAP,EAAA,KAAAE,GAAAF,EAAA,KAAAK,IAD1BD,IAAAO,EAAmBF,OAAQJ,EAEjC,EAAAL,EAAA,KAAAE,GAAAF,EAAA,KAAAW,GAAAX,EAAA,KAAAI;QAAAA,IAAAJ,EAAA;CAAA,OAFMI"}
@@ -1 +1 @@
1
- {"version":3,"file":"transactionsActionAtom.js","names":["TransactionItem","StandaloneTransactionItem","BatchTransactionItem","MinTransactionItem","atom","jotaiStore","ensureCallsStatusFactory","ensureTxReceiptFactory","WaitForCallsStatusTimeoutError","TransactionReceiptNotFoundError","WaitForTransactionReceiptTimeoutError","MethodNotSupportedRpcError","CallExecutionError","Hash","Address","transactionLogger","transactionsAtom","TransactionsMap","TransactionsState","isBatchTransactionItem","isGnosisSafeTx","isStandaloneTransactionItem","assert","accountAtom","isConnectorWithSafeAsyncAtomLoadableAtom","isConnectorWithSafeProvider","ReplacementTxAction","addTxAtom","transaction","get","set","connector","address","isSafe","loadableResult","state","data","txWithMeta","account","timestamp","Date","now","dropped","connectorData","type","id","current","assignTx","finalizeStandaloneTxAtom","finalizeBatchTxAtom","Promise","_","finalizedTx","ensureTxReceipt","isTxThroughSafe","txReceipt","hash","transactionHash","chainId","receipt","error","log","ensureCallsStatus","receipts","status","callsId","callsStatus","length","addTx","MarkTxAsDroppedOptions","txHash","action","replacementTxHash","markTxAsDroppedAtom","options","currentTransactions","accountTransactions","identifier","txItem","updatedTxItem","replacementTx","updatedAccountTransactions","sanitizeTx","tx","transactionSpecificData"],"sources":["../../../src/transactions/state/transactionsActionAtom.ts"],"sourcesContent":["import type {\n TransactionItem,\n StandaloneTransactionItem,\n BatchTransactionItem,\n MinTransactionItem,\n} from \"../types\";\nimport { atom } from \"jotai\";\nimport { jotaiStore } from \"@/core/store\";\n\nimport { ensureCallsStatusFactory } from \"../queries/ensureCallsStatus\";\nimport { ensureTxReceiptFactory } from \"../queries/ensureTxReceipt\";\nimport {\n WaitForCallsStatusTimeoutError,\n TransactionReceiptNotFoundError,\n WaitForTransactionReceiptTimeoutError,\n MethodNotSupportedRpcError,\n CallExecutionError,\n type Hash,\n type Address,\n} from \"viem\";\nimport { transactionLogger } from \"../logger\";\nimport {\n transactionsAtom,\n type TransactionsMap,\n type TransactionsState,\n} from \"./transactionsAtom\";\nimport {\n isBatchTransactionItem,\n isGnosisSafeTx,\n isStandaloneTransactionItem,\n} from \"../utils\";\nimport { assert } from \"ts-essentials\";\nimport {\n accountAtom,\n isConnectorWithSafeAsyncAtomLoadableAtom,\n} from \"@/lib/web3/wagmi/external\";\nimport { isConnectorWithSafeProvider } from \"@/components/web3/ConnectExternalProvider/utils\";\nimport type { ReplacementTxAction } from \"@/hooks/txs/mutations/useReplaceTx\";\n\nexport const addTxAtom = atom<null, [transaction: MinTransactionItem], void>(\n null,\n (get, set, transaction) => {\n const { connector, address } = get(accountAtom);\n assert(connector && address, \"connector and address are required\");\n let isSafe = isConnectorWithSafeProvider(connector);\n\n if (!isSafe) {\n // loadable is used to keep addition of txWithMeta to transactionsAtom sync,\n // and avoid blocking addTxAtom setters\n const loadableResult = get(isConnectorWithSafeAsyncAtomLoadableAtom);\n if (loadableResult.state === \"hasData\" && loadableResult.data) {\n isSafe = true;\n }\n }\n\n const txWithMeta: TransactionItem = {\n ...transaction,\n account: address,\n timestamp: Date.now(),\n dropped: false,\n connectorData: {\n type: connector.type,\n id: connector.id,\n isSafe,\n },\n };\n set(transactionsAtom, (current) => assignTx(current, txWithMeta));\n\n if (isStandaloneTransactionItem(txWithMeta)) {\n // don't await to avoid blocking addTxAtom setters\n set(finalizeStandaloneTxAtom, txWithMeta);\n } else {\n set(finalizeBatchTxAtom, txWithMeta);\n }\n }\n);\n\nexport const finalizeStandaloneTxAtom = atom<\n null,\n [StandaloneTransactionItem],\n Promise<void>\n>(null, async (_, set, transaction) => {\n const finalizedTx: StandaloneTransactionItem = { ...transaction };\n const ensureTxReceipt = ensureTxReceiptFactory();\n const isTxThroughSafe = isGnosisSafeTx(finalizedTx);\n\n try {\n // ensureTxReceipt internally makes sure to use walletClient for Safe connector\n const txReceipt = await ensureTxReceipt({\n hash: finalizedTx.transactionHash,\n chainId: finalizedTx.chainId,\n });\n finalizedTx.receipt = txReceipt;\n } catch (error) {\n if (\n /* \n At different steps of the waitForTransactionReceipt func different errors can be thrown.\n And if tx turned in eth_call with the same params succeeds (which it normally should not if it reverted for a valid reason and not gas or something),\n we can even get a useless Error(\"unknown reason\") or Error(\"0xrandom_hash\")\n */\n error instanceof WaitForTransactionReceiptTimeoutError || // thrown when transaction is not found within the timeout period\n error instanceof TransactionReceiptNotFoundError || // thrown when transaction receipt is not found\n error instanceof CallExecutionError // thrown when the transaction execution fails on-chain (execution reverted, out of gas, etc)\n ) {\n finalizedTx.dropped = true;\n transactionLogger.error(\"tx dropped\", {\n error,\n finalizedTx,\n isTxThroughSafe,\n });\n } else throw error;\n } finally {\n if (finalizedTx.receipt || finalizedTx.dropped) {\n set(transactionsAtom, (current) => assignTx(current, finalizedTx));\n transactionLogger.log(\"tx finalized\", { finalizedTx, isTxThroughSafe });\n }\n }\n});\n\nexport const finalizeBatchTxAtom = atom<\n null,\n [BatchTransactionItem],\n Promise<void>\n>(null, async (_, set, transaction) => {\n const finalizedTx: BatchTransactionItem = { ...transaction };\n const ensureCallsStatus = ensureCallsStatusFactory();\n\n try {\n const { receipts, status } = await ensureCallsStatus({\n id: finalizedTx.callsId,\n });\n finalizedTx.callsStatus = status;\n finalizedTx.receipt = receipts?.[receipts.length - 1];\n } catch (error) {\n if (\n error instanceof WaitForCallsStatusTimeoutError ||\n error instanceof MethodNotSupportedRpcError\n ) {\n finalizedTx.dropped = true;\n transactionLogger.error(\"batch tx dropped\", { error, finalizedTx });\n } else {\n finalizedTx.callsStatus = \"failure\";\n transactionLogger.error(\"batch tx failed\", { error, finalizedTx });\n throw error;\n }\n } finally {\n set(transactionsAtom, (current) => assignTx(current, finalizedTx));\n transactionLogger.log(\"batch tx finalized\", { finalizedTx });\n }\n});\n\nexport const addTx = async (transaction: MinTransactionItem) => {\n return jotaiStore.set(addTxAtom, transaction);\n};\n\ntype MarkTxAsDroppedOptions = {\n account: Address;\n txHash: Hash;\n action?: ReplacementTxAction;\n replacementTxHash?: Hash;\n};\n\nexport const markTxAsDroppedAtom = atom<null, [MarkTxAsDroppedOptions], void>(\n null,\n (_, set, options) => {\n const { txHash, action, replacementTxHash, account } = options;\n set(transactionsAtom, (currentTransactions) => {\n const accountTransactions = currentTransactions[account] || {};\n\n const identifier = txHash;\n const txItem = accountTransactions[identifier];\n if (!txItem) return currentTransactions;\n // only non-batch txs can be cancelled\n if (!isStandaloneTransactionItem(txItem)) return currentTransactions;\n\n const updatedTxItem: typeof txItem = {\n ...txItem,\n dropped: true,\n };\n\n if (action && replacementTxHash) {\n updatedTxItem.replacementTx = {\n hash: replacementTxHash,\n action,\n };\n }\n\n const updatedAccountTransactions: TransactionsMap = {\n ...accountTransactions,\n [identifier]: updatedTxItem,\n };\n\n return {\n ...currentTransactions,\n [account]: updatedAccountTransactions,\n };\n });\n }\n);\n\nfunction sanitizeTx(tx: TransactionItem): TransactionItem {\n if (isBatchTransactionItem(tx)) {\n const txItem = {\n action: tx.action,\n account: tx.account,\n chainId: tx.chainId,\n callsId: tx.callsId,\n callsStatus: tx.callsStatus,\n timestamp: tx.timestamp,\n dropped: tx.dropped,\n receipt: tx.receipt,\n transactionSpecificData: tx.transactionSpecificData,\n } as BatchTransactionItem;\n\n if (tx.connectorData) {\n txItem.connectorData = {\n type: tx.connectorData.type,\n id: tx.connectorData.id,\n // extra check for backwards compatibility with txs from localStorage without connectorData.isSafe\n isSafe: tx.connectorData.isSafe ?? isGnosisSafeTx(tx),\n };\n }\n\n return txItem;\n }\n\n const txItem = {\n action: tx.action,\n chainId: tx.chainId,\n account: tx.account,\n transactionHash: tx.transactionHash,\n timestamp: tx.timestamp,\n dropped: tx.dropped,\n receipt: tx.receipt,\n transactionSpecificData: tx.transactionSpecificData,\n } as StandaloneTransactionItem;\n\n if (tx.connectorData) {\n txItem.connectorData = {\n type: tx.connectorData.type,\n id: tx.connectorData.id,\n // extra check for backwards compatibility with txs from localStorage without connectorData.isSafe\n isSafe: tx.connectorData.isSafe ?? isGnosisSafeTx(tx),\n };\n }\n\n if (tx.replacementTx) {\n txItem.replacementTx = {\n hash: tx.replacementTx.hash,\n action: tx.replacementTx.action,\n };\n }\n\n return txItem;\n}\n\nfunction assignTx(\n currentTransactions: TransactionsState,\n transaction: TransactionItem\n): TransactionsState {\n transactionLogger.log(\"assignTx\", {\n account: transaction.account,\n transaction,\n });\n\n const accountTransactions = currentTransactions[transaction.account] || {};\n const identifier = isStandaloneTransactionItem(transaction)\n ? transaction.transactionHash\n : transaction.callsId;\n\n const updatedAccountTransactions: TransactionsMap = {\n ...accountTransactions,\n [identifier]: sanitizeTx({\n ...accountTransactions[identifier],\n ...transaction,\n }),\n };\n\n return {\n ...currentTransactions,\n [transaction.account]: updatedAccountTransactions,\n };\n}\n"],"mappings":";;;;;;;;;;;;AAuCA,IAAa2B,IAAYvB,EACvB,OACCyB,GAAKC,GAAKF,MAAgB;CACzB,IAAM,EAAEG,cAAWC,eAAYH,EAAIN,EAAY;AAC/CD,GAAOS,KAAaC,GAAS,qCAAqC;CAClE,IAAIC,IAASR,EAA4BM,EAAU;AAEnD,KAAI,CAACE,GAAQ;EAGX,IAAMC,IAAiBL,EAAIL,EAAyC;AACpE,EAAIU,EAAeC,UAAU,aAAaD,EAAeE,SACvDH,IAAS;;CAIb,IAAMI,IAA8B;EAClC,GAAGT;EACHU,SAASN;EACTO,WAAWC,KAAKC,KAAK;EACrBC,SAAS;EACTC,eAAe;GACbC,MAAMb,EAAUa;GAChBC,IAAId,EAAUc;GACdZ;GACF;EACD;AAGD,CAFAH,EAAId,IAAmB8B,MAAYC,EAASD,GAAST,EAAW,CAAC,EAE7DhB,EAA4BgB,EAAW,GAEzCP,EAAIkB,GAA0BX,EAAW,GAEzCP,EAAImB,GAAqBZ,EAAW;EAGzC,EAEYW,IAA2B5C,EAItC,MAAM,OAAO+C,GAAGrB,GAAKF,MAAgB;CACrC,IAAMwB,IAAyC,EAAE,GAAGxB,GAAa,EAC3DyB,IAAkB9C,GAAwB,EAC1C+C,IAAkBlC,EAAegC,EAAY;AAEnD,KAAI;AAMFA,IAAYO,UAJM,MAAMN,EAAgB;GACtCG,MAAMJ,EAAYK;GAClBC,SAASN,EAAYM;GACtB,CAAC;UAEKE,GAAO;AACd,MAMEA,aAAiBlD,KACjBkD,aAAiBnD,KACjBmD,aAAiBhD,EAGjBG,CADAqC,EAAYV,UAAU,IACtB3B,EAAkB6C,MAAM,cAAc;GACpCA;GACAR;GACAE;GACD,CAAC;MACG,OAAMM;WACL;AACR,GAAIR,EAAYO,WAAWP,EAAYV,aACrCZ,EAAId,IAAmB8B,MAAYC,EAASD,GAASM,EAAY,CAAC,EAClErC,EAAkB8C,IAAI,gBAAgB;GAAET;GAAaE;GAAiB,CAAC;;EAG3E,EAEWL,IAAsB7C,EAIjC,MAAM,OAAO+C,GAAGrB,GAAKF,MAAgB;CACrC,IAAMwB,IAAoC,EAAE,GAAGxB,GAAa,EACtDkC,IAAoBxD,GAA0B;AAEpD,KAAI;EACF,IAAM,EAAEyD,aAAUC,cAAW,MAAMF,EAAkB,EACnDjB,IAAIO,EAAYa,SACjB,CAAC;AAEFb,EADAA,EAAYc,cAAcF,GAC1BZ,EAAYO,UAAUI,IAAWA,EAASI,SAAS;UAC5CP,GAAO;AACd,MACEA,aAAiBpD,KACjBoD,aAAiBjD,EAGjBI,CADAqC,EAAYV,UAAU,IACtB3B,EAAkB6C,MAAM,oBAAoB;GAAEA;GAAOR;GAAa,CAAC;MAInE,OAFAA,EAAYc,cAAc,WAC1BnD,EAAkB6C,MAAM,mBAAmB;GAAEA;GAAOR;GAAa,CAAC,EAC5DQ;WAEA;AAER7C,EADAe,EAAId,IAAmB8B,MAAYC,EAASD,GAASM,EAAY,CAAC,EAClErC,EAAkB8C,IAAI,sBAAsB,EAAET,gBAAa,CAAC;;EAE9D,EAEWgB,IAAQ,OAAOxC,MACnBvB,EAAWyB,IAAIH,GAAWC,EAAY,EAUlC6C,IAAsBrE,EACjC,OACC+C,GAAGrB,GAAK4C,MAAY;CACnB,IAAM,EAAEJ,WAAQC,WAAQC,sBAAmBlC,eAAYoC;AACvD5C,GAAId,IAAmB2D,MAAwB;EAC7C,IAAMC,IAAsBD,EAAoBrC,MAAY,EAAE,EAExDuC,IAAaP,GACbQ,IAASF,EAAoBC;AAGnC,MAFI,CAACC,KAED,CAACzD,EAA4ByD,EAAO,CAAE,QAAOH;EAEjD,IAAMI,IAA+B;GACnC,GAAGD;GACHpC,SAAS;GACV;AAED,EAAI6B,KAAUC,MACZO,EAAcC,gBAAgB;GAC5BxB,MAAMgB;GACND;GACD;EAGH,IAAMU,IAA8C;GAClD,GAAGL;IACFC,IAAaE;GACf;AAED,SAAO;GACL,GAAGJ;IACFrC,IAAU2C;GACZ;GACD;EAEL;AAED,SAASC,EAAWC,GAAsC;AACxD,KAAIhE,EAAuBgE,EAAG,EAAE;EAC9B,IAAML,IAAS;GACbP,QAAQY,EAAGZ;GACXjC,SAAS6C,EAAG7C;GACZoB,SAASyB,EAAGzB;GACZO,SAASkB,EAAGlB;GACZC,aAAaiB,EAAGjB;GAChB3B,WAAW4C,EAAG5C;GACdG,SAASyC,EAAGzC;GACZiB,SAASwB,EAAGxB;GACZyB,yBAAyBD,EAAGC;GAC7B;AAWD,SATID,EAAGxC,kBACLmC,EAAOnC,gBAAgB;GACrBC,MAAMuC,EAAGxC,cAAcC;GACvBC,IAAIsC,EAAGxC,cAAcE;GAErBZ,QAAQkD,EAAGxC,cAAcV,UAAUb,EAAe+D,EAAE;GACrD,GAGIL;;CAGT,IAAMA,IAAS;EACbP,QAAQY,EAAGZ;EACXb,SAASyB,EAAGzB;EACZpB,SAAS6C,EAAG7C;EACZmB,iBAAiB0B,EAAG1B;EACpBlB,WAAW4C,EAAG5C;EACdG,SAASyC,EAAGzC;EACZiB,SAASwB,EAAGxB;EACZyB,yBAAyBD,EAAGC;EAC7B;AAkBD,QAhBID,EAAGxC,kBACLmC,EAAOnC,gBAAgB;EACrBC,MAAMuC,EAAGxC,cAAcC;EACvBC,IAAIsC,EAAGxC,cAAcE;EAErBZ,QAAQkD,EAAGxC,cAAcV,UAAUb,EAAe+D,EAAE;EACrD,GAGCA,EAAGH,kBACLF,EAAOE,gBAAgB;EACrBxB,MAAM2B,EAAGH,cAAcxB;EACvBe,QAAQY,EAAGH,cAAcT;EAC1B,GAGIO;;AAGT,SAAS/B,EACP4B,GACA/C,GACmB;AACnBb,GAAkB8C,IAAI,YAAY;EAChCvB,SAASV,EAAYU;EACrBV;EACD,CAAC;CAEF,IAAMgD,IAAsBD,EAAoB/C,EAAYU,YAAY,EAAE,EACpEuC,IAAaxD,EAA4BO,EAAY,GACvDA,EAAY6B,kBACZ7B,EAAYqC,SAEVgB,IAA8C;EAClD,GAAGL;GACFC,IAAaK,EAAW;GACvB,GAAGN,EAAoBC;GACvB,GAAGjD;GACJ,CAAA;EACF;AAED,QAAO;EACL,GAAG+C;GACF/C,EAAYU,UAAU2C;EACxB"}
1
+ {"version":3,"file":"transactionsActionAtom.js","names":["TransactionItem","StandaloneTransactionItem","BatchTransactionItem","MinTransactionItem","atom","jotaiStore","ensureCallsStatusFactory","ensureTxReceiptFactory","WaitForCallsStatusTimeoutError","TransactionReceiptNotFoundError","WaitForTransactionReceiptTimeoutError","MethodNotSupportedRpcError","CallExecutionError","Hash","Address","transactionLogger","transactionsAtom","TransactionsMap","TransactionsState","isBatchTransactionItem","isGnosisSafeTx","isStandaloneTransactionItem","assert","accountAtom","isConnectorWithSafeAsyncAtomLoadableAtom","isConnectorWithSafeProvider","ReplacementTxAction","addTxAtom","transaction","get","set","connector","address","isSafe","loadableResult","state","data","txWithMeta","account","timestamp","Date","now","dropped","connectorData","type","id","current","assignTx","finalizeStandaloneTxAtom","finalizeBatchTxAtom","Promise","_","finalizedTx","ensureTxReceipt","isTxThroughSafe","txReceipt","hash","transactionHash","chainId","receipt","error","log","ensureCallsStatus","receipts","status","callsId","callsStatus","length","addTx","MarkTxAsDroppedOptions","txHash","action","replacementTxHash","markTxAsDroppedAtom","options","currentTransactions","accountTransactions","identifier","txItem","updatedTxItem","replacementTx","updatedAccountTransactions","sanitizeTx","tx","transactionSpecificData"],"sources":["../../../src/transactions/state/transactionsActionAtom.ts"],"sourcesContent":["import type {\n TransactionItem,\n StandaloneTransactionItem,\n BatchTransactionItem,\n MinTransactionItem,\n} from \"../types\";\nimport { atom } from \"jotai\";\nimport { jotaiStore } from \"@/core/store\";\n\nimport { ensureCallsStatusFactory } from \"../queries/ensureCallsStatus\";\nimport { ensureTxReceiptFactory } from \"../queries/ensureTxReceipt\";\nimport {\n WaitForCallsStatusTimeoutError,\n TransactionReceiptNotFoundError,\n WaitForTransactionReceiptTimeoutError,\n MethodNotSupportedRpcError,\n CallExecutionError,\n type Hash,\n type Address,\n} from \"viem\";\nimport { transactionLogger } from \"../logger\";\nimport {\n transactionsAtom,\n type TransactionsMap,\n type TransactionsState,\n} from \"./transactionsAtom\";\nimport {\n isBatchTransactionItem,\n isGnosisSafeTx,\n isStandaloneTransactionItem,\n} from \"../utils\";\nimport { assert } from \"ts-essentials\";\nimport {\n accountAtom,\n isConnectorWithSafeAsyncAtomLoadableAtom,\n} from \"@/lib/web3/wagmi/external\";\nimport { isConnectorWithSafeProvider } from \"@/components/web3/ConnectExternalProvider/utils\";\nimport type { ReplacementTxAction } from \"@/hooks/txs/mutations/useReplaceTx\";\n\nexport const addTxAtom = atom<null, [transaction: MinTransactionItem], void>(\n null,\n (get, set, transaction) => {\n const { connector, address } = get(accountAtom);\n assert(connector && address, \"connector and address are required\");\n let isSafe = isConnectorWithSafeProvider(connector);\n\n if (!isSafe) {\n // loadable is used to keep addition of txWithMeta to transactionsAtom sync,\n // and avoid blocking addTxAtom setters\n const loadableResult = get(isConnectorWithSafeAsyncAtomLoadableAtom);\n if (loadableResult.state === \"hasData\" && loadableResult.data) {\n isSafe = true;\n }\n }\n\n const txWithMeta: TransactionItem = {\n ...transaction,\n account: address,\n timestamp: Date.now(),\n dropped: false,\n connectorData: {\n type: connector.type,\n id: connector.id,\n isSafe,\n },\n };\n set(transactionsAtom, (current) => assignTx(current, txWithMeta));\n\n if (isStandaloneTransactionItem(txWithMeta)) {\n // don't await to avoid blocking addTxAtom setters\n set(finalizeStandaloneTxAtom, txWithMeta);\n } else {\n set(finalizeBatchTxAtom, txWithMeta);\n }\n }\n);\n\nexport const finalizeStandaloneTxAtom = atom<\n null,\n [StandaloneTransactionItem],\n Promise<void>\n>(null, async (_, set, transaction) => {\n const finalizedTx: StandaloneTransactionItem = { ...transaction };\n const ensureTxReceipt = ensureTxReceiptFactory();\n const isTxThroughSafe = isGnosisSafeTx(finalizedTx);\n\n try {\n // ensureTxReceipt internally makes sure to use walletClient for Safe connector\n const txReceipt = await ensureTxReceipt({\n hash: finalizedTx.transactionHash,\n chainId: finalizedTx.chainId,\n });\n finalizedTx.receipt = txReceipt;\n } catch (error) {\n if (\n /* \n At different steps of the waitForTransactionReceipt func different errors can be thrown.\n And if tx turned in eth_call with the same params succeeds (which it normally should not if it reverted for a valid reason and not gas or something),\n we can even get a useless Error(\"unknown reason\") or Error(\"0xrandom_hash\")\n */\n error instanceof WaitForTransactionReceiptTimeoutError || // thrown when transaction is not found within the timeout period\n error instanceof TransactionReceiptNotFoundError || // thrown when transaction receipt is not found\n error instanceof CallExecutionError // thrown when the transaction execution fails on-chain (execution reverted, out of gas, etc)\n ) {\n finalizedTx.dropped = true;\n transactionLogger.error(\"tx dropped\", {\n error,\n finalizedTx,\n isTxThroughSafe,\n });\n } else throw error;\n } finally {\n if (finalizedTx.receipt || finalizedTx.dropped) {\n set(transactionsAtom, (current) => assignTx(current, finalizedTx));\n transactionLogger.log(\"tx finalized\", { finalizedTx, isTxThroughSafe });\n }\n }\n});\n\nexport const finalizeBatchTxAtom = atom<\n null,\n [BatchTransactionItem],\n Promise<void>\n>(null, async (_, set, transaction) => {\n const finalizedTx: BatchTransactionItem = { ...transaction };\n const ensureCallsStatus = ensureCallsStatusFactory();\n\n try {\n const { receipts, status } = await ensureCallsStatus({\n id: finalizedTx.callsId,\n });\n finalizedTx.callsStatus = status;\n finalizedTx.receipt = receipts?.[receipts.length - 1];\n } catch (error) {\n if (\n error instanceof WaitForCallsStatusTimeoutError ||\n error instanceof MethodNotSupportedRpcError\n ) {\n finalizedTx.dropped = true;\n transactionLogger.error(\"batch tx dropped\", { error, finalizedTx });\n } else {\n finalizedTx.callsStatus = \"failure\";\n transactionLogger.error(\"batch tx failed\", { error, finalizedTx });\n throw error;\n }\n } finally {\n set(transactionsAtom, (current) => assignTx(current, finalizedTx));\n transactionLogger.log(\"batch tx finalized\", { finalizedTx });\n }\n});\n\nexport const addTx = async (transaction: MinTransactionItem) => {\n return jotaiStore.set(addTxAtom, transaction);\n};\n\ntype MarkTxAsDroppedOptions = {\n account: Address;\n txHash: Hash;\n action?: ReplacementTxAction;\n replacementTxHash?: Hash;\n};\n\nexport const markTxAsDroppedAtom = atom<null, [MarkTxAsDroppedOptions], void>(\n null,\n (_, set, options) => {\n const { txHash, action, replacementTxHash, account } = options;\n set(transactionsAtom, (currentTransactions) => {\n const accountTransactions = currentTransactions[account] || {};\n\n const identifier = txHash;\n const txItem = accountTransactions[identifier];\n if (!txItem) return currentTransactions;\n // only non-batch txs can be cancelled\n if (!isStandaloneTransactionItem(txItem)) return currentTransactions;\n\n const updatedTxItem: typeof txItem = {\n ...txItem,\n dropped: true,\n };\n\n if (action && replacementTxHash) {\n updatedTxItem.replacementTx = {\n hash: replacementTxHash,\n action,\n };\n }\n\n const updatedAccountTransactions: TransactionsMap = {\n ...accountTransactions,\n [identifier]: updatedTxItem,\n };\n\n return {\n ...currentTransactions,\n [account]: updatedAccountTransactions,\n };\n });\n }\n);\n\nfunction sanitizeTx(tx: TransactionItem): TransactionItem {\n if (isBatchTransactionItem(tx)) {\n const txItem = {\n action: tx.action,\n account: tx.account,\n chainId: tx.chainId,\n callsId: tx.callsId,\n callsStatus: tx.callsStatus,\n timestamp: tx.timestamp,\n dropped: tx.dropped,\n receipt: tx.receipt,\n transactionSpecificData: tx.transactionSpecificData,\n } as BatchTransactionItem;\n\n if (tx.connectorData) {\n txItem.connectorData = {\n type: tx.connectorData.type,\n id: tx.connectorData.id,\n // extra check for backwards compatibility with txs from localStorage without connectorData.isSafe\n isSafe: tx.connectorData.isSafe ?? isGnosisSafeTx(tx),\n };\n }\n\n return txItem;\n }\n\n const txItem = {\n action: tx.action,\n chainId: tx.chainId,\n account: tx.account,\n transactionHash: tx.transactionHash,\n timestamp: tx.timestamp,\n dropped: tx.dropped,\n receipt: tx.receipt,\n transactionSpecificData: tx.transactionSpecificData,\n } as StandaloneTransactionItem;\n\n if (tx.connectorData) {\n txItem.connectorData = {\n type: tx.connectorData.type,\n id: tx.connectorData.id,\n // extra check for backwards compatibility with txs from localStorage without connectorData.isSafe\n isSafe: tx.connectorData.isSafe ?? isGnosisSafeTx(tx),\n };\n }\n\n if (tx.replacementTx) {\n txItem.replacementTx = {\n hash: tx.replacementTx.hash,\n action: tx.replacementTx.action,\n };\n }\n\n return txItem;\n}\n\nfunction assignTx(\n currentTransactions: TransactionsState,\n transaction: TransactionItem\n): TransactionsState {\n transactionLogger.log(\"assignTx\", {\n account: transaction.account,\n transaction,\n });\n\n const accountTransactions = currentTransactions[transaction.account] || {};\n const identifier = isStandaloneTransactionItem(transaction)\n ? transaction.transactionHash\n : transaction.callsId;\n\n const updatedAccountTransactions: TransactionsMap = {\n ...accountTransactions,\n [identifier]: sanitizeTx({\n ...accountTransactions[identifier],\n ...transaction,\n }),\n };\n\n return {\n ...currentTransactions,\n [transaction.account]: updatedAccountTransactions,\n };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"transactionsAtom.js","names":["BatchTransactionItem","PreSignTransactionItem","StandaloneTransactionItem","TransactionItem","TransactionItemSwap","atomWithStorage","createJSONStorage","atom","extractPendingTransactions","extractSwapTransactions","isStandaloneTransactionItem","isBatchTransactionItem","extractPreSignTransactions","serialize","deserialize","Address","addressAtom","emptyArray","LOCAL_STORAGE_PREFIX","TransactionsMap","Record","TransactionsState","transactionsAtom","localStorage","replacer","_","value","reviver","getOnInit","allTransactionsAtom","get","transactions","Object","values","flatMap","txMap","userTransactionsAtom","account","allStandaloneTransactionItemsAtom","filter","allBatchTransactionItemsAtom","allPendingStandaloneTransactionItemsAtom","allPendingBatchTransactionItemsAtom","userPendingTransactionsAtom","userSwapTransactionsAtom","userPreSignTransactionsAtom"],"sources":["../../../src/transactions/state/transactionsAtom.ts"],"sourcesContent":["import type {\n BatchTransactionItem,\n PreSignTransactionItem,\n StandaloneTransactionItem,\n TransactionItem,\n TransactionItemSwap,\n} from \"../types\";\nimport { atomWithStorage, createJSONStorage } from \"jotai/utils\";\nimport { atom } from \"jotai\";\n\nimport {\n extractPendingTransactions,\n extractSwapTransactions,\n isStandaloneTransactionItem,\n isBatchTransactionItem,\n extractPreSignTransactions,\n} from \"../utils\";\nimport { serialize, deserialize } from \"wagmi\";\nimport type { Address } from \"viem\";\nimport { addressAtom } from \"@/lib/web3/wagmi/external\";\nimport { emptyArray } from \"@/lib/constants\";\nimport { LOCAL_STORAGE_PREFIX } from \"@/lib/constants/storage\";\n\n// Record<TxHash/CallsId, TransactionItem>\nexport type TransactionsMap = Record<string, TransactionItem>;\n\nexport type TransactionsState = Record<Address, TransactionsMap>;\n\nexport const transactionsAtom = atomWithStorage<TransactionsState>(\n `${LOCAL_STORAGE_PREFIX}_transactions`,\n {},\n createJSONStorage(() => localStorage, {\n // serialize/deserialize to handle bigint values\n replacer: (_, value) => serialize(value),\n reviver: (_, value) => {\n return typeof value === \"string\" ? deserialize(value) : value;\n },\n }),\n { getOnInit: true }\n);\n\nexport const allTransactionsAtom = atom<TransactionItem[]>((get) => {\n const transactions = get(transactionsAtom);\n return Object.values(transactions).flatMap((txMap) => Object.values(txMap));\n});\n\nexport const userTransactionsAtom = atom<TransactionItem[]>((get) => {\n const account = get(addressAtom);\n if (!account) return emptyArray;\n const transactions = get(transactionsAtom)[account];\n if (!transactions) return emptyArray;\n return Object.values(transactions);\n});\n\nexport const allStandaloneTransactionItemsAtom = atom<\n StandaloneTransactionItem[]\n>((get) => {\n const transactions = get(allTransactionsAtom);\n return transactions.filter(isStandaloneTransactionItem);\n});\n\nexport const allBatchTransactionItemsAtom = atom<BatchTransactionItem[]>(\n (get) => {\n const transactions = get(allTransactionsAtom);\n return transactions.filter(isBatchTransactionItem);\n }\n);\n\nexport const allPendingStandaloneTransactionItemsAtom = atom<\n StandaloneTransactionItem[]\n>((get) => {\n const transactions = get(allStandaloneTransactionItemsAtom);\n return extractPendingTransactions(transactions);\n});\n\nexport const allPendingBatchTransactionItemsAtom = atom<BatchTransactionItem[]>(\n (get) => {\n const transactions = get(allBatchTransactionItemsAtom);\n return extractPendingTransactions(transactions);\n }\n);\n\nexport const userPendingTransactionsAtom = atom<TransactionItem[]>((get) => {\n const transactions = get(userTransactionsAtom);\n return extractPendingTransactions(transactions);\n});\n\nexport const userSwapTransactionsAtom = atom<TransactionItemSwap[]>((get) => {\n const transactions = get(userTransactionsAtom);\n return extractSwapTransactions(transactions);\n});\n\nexport const userPreSignTransactionsAtom = atom<PreSignTransactionItem[]>(\n (get) => {\n const transactions = get(userTransactionsAtom);\n return extractPreSignTransactions(transactions);\n }\n);\n"],"mappings":";;;;;;;;AA4BA,IAAasB,IAAmBjB,EAC9B,GAAGa,EAAoB,gBACvB,EAAE,EACFZ,QAAwBiB,cAAc;CAEpCC,WAAWC,GAAGC,MAAUb,EAAUa,EAAM;CACxCC,UAAUF,GAAGC,MACJ,OAAOA,KAAU,WAAWZ,EAAYY,EAAM,GAAGA;CAE3D,CAAC,EACF,EAAEE,WAAW,IACf,CAAC,EAEYC,IAAsBtB,GAAyBuB,MAAQ;CAClE,IAAMC,IAAeD,EAAIR,EAAiB;AAC1C,QAAOU,OAAOC,OAAOF,EAAa,CAACG,SAASC,MAAUH,OAAOC,OAAOE,EAAM,CAAC;EAC3E,EAEWC,IAAuB7B,GAAyBuB,MAAQ;CACnE,IAAMO,IAAUP,EAAId,EAAY;AAChC,KAAI,CAACqB,EAAS,QAAOpB;CACrB,IAAMc,IAAeD,EAAIR,EAAiB,CAACe;AAE3C,QADKN,IACEC,OAAOC,OAAOF,EAAa,GADRd;EAE1B,EAEWqB,IAAoC/B,GAE9CuB,MACoBA,EAAID,EAAoB,CACzBU,OAAO7B,EAA4B,CACvD,EAEW8B,IAA+BjC,GACzCuB,MACsBA,EAAID,EAAoB,CACzBU,OAAO5B,EAAuB,CAErD,EAEY8B,IAA2ClC,GAErDuB,MAEMtB,EADcsB,EAAIQ,EAAkC,CACZ,CAC/C,EAEWI,IAAsCnC,GAChDuB,MAEQtB,EADcsB,EAAIU,EAA6B,CACP,CAElD,EAEYG,IAA8BpC,GAAyBuB,MAE3DtB,EADcsB,EAAIM,EAAqB,CACC,CAC/C,EAEWQ,IAA2BrC,GAA6BuB,MAE5DrB,EADcqB,EAAIM,EAAqB,CACF,CAC5C,EAEWS,IAA8BtC,GACxCuB,MAEQlB,EADckB,EAAIM,EAAqB,CACC,CAElD"}
1
+ {"version":3,"file":"transactionsAtom.js","names":["BatchTransactionItem","PreSignTransactionItem","StandaloneTransactionItem","TransactionItem","TransactionItemSwap","atomWithStorage","createJSONStorage","atom","extractPendingTransactions","extractSwapTransactions","isStandaloneTransactionItem","isBatchTransactionItem","extractPreSignTransactions","serialize","deserialize","Address","addressAtom","emptyArray","LOCAL_STORAGE_PREFIX","TransactionsMap","Record","TransactionsState","transactionsAtom","localStorage","replacer","_","value","reviver","getOnInit","allTransactionsAtom","get","transactions","Object","values","flatMap","txMap","userTransactionsAtom","account","allStandaloneTransactionItemsAtom","filter","allBatchTransactionItemsAtom","allPendingStandaloneTransactionItemsAtom","allPendingBatchTransactionItemsAtom","userPendingTransactionsAtom","userSwapTransactionsAtom","userPreSignTransactionsAtom"],"sources":["../../../src/transactions/state/transactionsAtom.ts"],"sourcesContent":["import type {\n BatchTransactionItem,\n PreSignTransactionItem,\n StandaloneTransactionItem,\n TransactionItem,\n TransactionItemSwap,\n} from \"../types\";\nimport { atomWithStorage, createJSONStorage } from \"jotai/utils\";\nimport { atom } from \"jotai\";\n\nimport {\n extractPendingTransactions,\n extractSwapTransactions,\n isStandaloneTransactionItem,\n isBatchTransactionItem,\n extractPreSignTransactions,\n} from \"../utils\";\nimport { serialize, deserialize } from \"wagmi\";\nimport type { Address } from \"viem\";\nimport { addressAtom } from \"@/lib/web3/wagmi/external\";\nimport { emptyArray } from \"@/lib/constants\";\nimport { LOCAL_STORAGE_PREFIX } from \"@/lib/constants/storage\";\n\n// Record<TxHash/CallsId, TransactionItem>\nexport type TransactionsMap = Record<string, TransactionItem>;\n\nexport type TransactionsState = Record<Address, TransactionsMap>;\n\nexport const transactionsAtom = atomWithStorage<TransactionsState>(\n `${LOCAL_STORAGE_PREFIX}_transactions`,\n {},\n createJSONStorage(() => localStorage, {\n // serialize/deserialize to handle bigint values\n replacer: (_, value) => serialize(value),\n reviver: (_, value) => {\n return typeof value === \"string\" ? deserialize(value) : value;\n },\n }),\n { getOnInit: true }\n);\n\nexport const allTransactionsAtom = atom<TransactionItem[]>((get) => {\n const transactions = get(transactionsAtom);\n return Object.values(transactions).flatMap((txMap) => Object.values(txMap));\n});\n\nexport const userTransactionsAtom = atom<TransactionItem[]>((get) => {\n const account = get(addressAtom);\n if (!account) return emptyArray;\n const transactions = get(transactionsAtom)[account];\n if (!transactions) return emptyArray;\n return Object.values(transactions);\n});\n\nexport const allStandaloneTransactionItemsAtom = atom<\n StandaloneTransactionItem[]\n>((get) => {\n const transactions = get(allTransactionsAtom);\n return transactions.filter(isStandaloneTransactionItem);\n});\n\nexport const allBatchTransactionItemsAtom = atom<BatchTransactionItem[]>(\n (get) => {\n const transactions = get(allTransactionsAtom);\n return transactions.filter(isBatchTransactionItem);\n }\n);\n\nexport const allPendingStandaloneTransactionItemsAtom = atom<\n StandaloneTransactionItem[]\n>((get) => {\n const transactions = get(allStandaloneTransactionItemsAtom);\n return extractPendingTransactions(transactions);\n});\n\nexport const allPendingBatchTransactionItemsAtom = atom<BatchTransactionItem[]>(\n (get) => {\n const transactions = get(allBatchTransactionItemsAtom);\n return extractPendingTransactions(transactions);\n }\n);\n\nexport const userPendingTransactionsAtom = atom<TransactionItem[]>((get) => {\n const transactions = get(userTransactionsAtom);\n return extractPendingTransactions(transactions);\n});\n\nexport const userSwapTransactionsAtom = atom<TransactionItemSwap[]>((get) => {\n const transactions = get(userTransactionsAtom);\n return extractSwapTransactions(transactions);\n});\n\nexport const userPreSignTransactionsAtom = atom<PreSignTransactionItem[]>(\n (get) => {\n const transactions = get(userTransactionsAtom);\n return extractPreSignTransactions(transactions);\n }\n);\n"],"mappings":";;;;;;;;AA4BA,IAAasB,IAAmBjB,EAC9B,GAAGa,EAAoB,gBACvB,EAAE,EACFZ,QAAwBiB,cAAc;CAEpCC,WAAWC,GAAGC,MAAUb,EAAUa,EAAM;CACxCC,UAAUF,GAAGC,MACJ,OAAOA,KAAU,WAAWZ,EAAYY,EAAM,GAAGA;CAE3D,CAAC,EACF,EAAEE,WAAW,IACf,CAAC,EAEYC,IAAsBtB,GAAyBuB,MAAQ;CAClE,IAAMC,IAAeD,EAAIR,EAAiB;CAC1C,OAAOU,OAAOC,OAAOF,EAAa,CAACG,SAASC,MAAUH,OAAOC,OAAOE,EAAM,CAAC;EAC3E,EAEWC,IAAuB7B,GAAyBuB,MAAQ;CACnE,IAAMO,IAAUP,EAAId,EAAY;CAChC,IAAI,CAACqB,GAAS,OAAOpB;CACrB,IAAMc,IAAeD,EAAIR,EAAiB,CAACe;CAE3C,OADKN,IACEC,OAAOC,OAAOF,EAAa,GADRd;EAE1B,EAEWqB,IAAoC/B,GAE9CuB,MACoBA,EAAID,EAClBE,CAAaQ,OAAO7B,EAA4B,CACvD,EAEW8B,IAA+BjC,GACzCuB,MACsBA,EAAID,EAClBE,CAAaQ,OAAO5B,EAAuB,CAErD,EAEY8B,IAA2ClC,GAErDuB,MAEMtB,EADcsB,EAAIQ,EACSP,CAAa,CAC/C,EAEWW,IAAsCnC,GAChDuB,MAEQtB,EADcsB,EAAIU,EACST,CAAa,CAElD,EAEYY,IAA8BpC,GAAyBuB,MAE3DtB,EADcsB,EAAIM,EACSL,CAAa,CAC/C,EAEWa,IAA2BrC,GAA6BuB,MAE5DrB,EADcqB,EAAIM,EACML,CAAa,CAC5C,EAEWc,IAA8BtC,GACxCuB,MAEQlB,EADckB,EAAIM,EACSL,CAAa,CAElD"}
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","names":["TransactionReceipt","TransactionItem","isStandaloneTransactionItem","TxStatus","getTxStatus","tx","action","transactionSpecificData","source","dropped","replacementTx","receipt","status"],"sources":["../../src/transactions/status.ts"],"sourcesContent":["import type { TransactionReceipt } from \"viem\";\nimport type { TransactionItem } from \"./types\";\nimport { isStandaloneTransactionItem } from \"./utils\";\n\nexport type TxStatus = TransactionReceipt[\"status\"] | \"pending\" | \"cancelled\";\n\nexport function getTxStatus(tx: TransactionItem): TxStatus {\n if (tx.action === \"swap\" && tx.transactionSpecificData.source === \"metabase\")\n return \"success\";\n\n if (isStandaloneTransactionItem(tx) && tx.dropped) {\n if (tx.replacementTx?.action === \"cancel\") return \"cancelled\";\n return \"reverted\";\n }\n\n return tx.receipt?.status || \"pending\";\n}\n"],"mappings":";;AAMA,SAAgBI,EAAYC,GAA+B;AASzD,QARIA,EAAGC,WAAW,UAAUD,EAAGE,wBAAwBC,WAAW,aACzD,YAELN,EAA4BG,EAAG,IAAIA,EAAGI,UACpCJ,EAAGK,eAAeJ,WAAW,WAAiB,cAC3C,aAGFD,EAAGM,SAASC,UAAU"}
1
+ {"version":3,"file":"status.js","names":["TransactionReceipt","TransactionItem","isStandaloneTransactionItem","TxStatus","getTxStatus","tx","action","transactionSpecificData","source","dropped","replacementTx","receipt","status"],"sources":["../../src/transactions/status.ts"],"sourcesContent":["import type { TransactionReceipt } from \"viem\";\nimport type { TransactionItem } from \"./types\";\nimport { isStandaloneTransactionItem } from \"./utils\";\n\nexport type TxStatus = TransactionReceipt[\"status\"] | \"pending\" | \"cancelled\";\n\nexport function getTxStatus(tx: TransactionItem): TxStatus {\n if (tx.action === \"swap\" && tx.transactionSpecificData.source === \"metabase\")\n return \"success\";\n\n if (isStandaloneTransactionItem(tx) && tx.dropped) {\n if (tx.replacementTx?.action === \"cancel\") return \"cancelled\";\n return \"reverted\";\n }\n\n return tx.receipt?.status || \"pending\";\n}\n"],"mappings":";;AAMA,SAAgBI,EAAYC,GAA+B;CASzD,OARIA,EAAGC,WAAW,UAAUD,EAAGE,wBAAwBC,WAAW,aACzD,YAELN,EAA4BG,EAAG,IAAIA,EAAGI,UACpCJ,EAAGK,eAAeJ,WAAW,WAAiB,cAC3C,aAGFD,EAAGM,SAASC,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["isConnectorWithSafeProvider","BatchTransactionItem","GnosisSafeTransactionItem","PreSignTransactionItem","StandaloneTransactionItem","TransactionItem","TransactionItemSwap","Hash","isStandaloneTransactionItem","item","isBatchTransactionItem","extractPendingTransactions","transactions","T","filter","tx","dropped","receipt","callsStatus","extractSwapTransactions","action","extractPreSignTransactions","TransactionItemSwapWithId","id","combineSwapTransactionItems","txArrays","map","Record","flat","forEach","transactionHash","Object","values","isGnosisSafeTx","connectorData","isSafe"],"sources":["../../src/transactions/utils.ts"],"sourcesContent":["import { isConnectorWithSafeProvider } from \"@/components/web3/ConnectExternalProvider/utils\";\nimport type {\n BatchTransactionItem,\n GnosisSafeTransactionItem,\n PreSignTransactionItem,\n StandaloneTransactionItem,\n TransactionItem,\n TransactionItemSwap,\n} from \"./types\";\nimport type { Hash } from \"viem\";\n\nexport function isStandaloneTransactionItem(\n item: TransactionItem\n): item is StandaloneTransactionItem {\n return \"transactionHash\" in item;\n}\n\nexport function isBatchTransactionItem(\n item: TransactionItem\n): item is BatchTransactionItem {\n return \"callsId\" in item;\n}\n\nexport function extractPendingTransactions<\n T extends StandaloneTransactionItem | BatchTransactionItem,\n>(transactions: T[]): T[] {\n return transactions.filter(\n (tx) =>\n !tx.dropped &&\n (isStandaloneTransactionItem(tx)\n ? !tx.receipt\n : !tx.callsStatus || tx.callsStatus === \"pending\")\n );\n}\n\nexport function extractSwapTransactions(\n transactions: (StandaloneTransactionItem | BatchTransactionItem)[]\n): TransactionItemSwap[] {\n return transactions.filter((tx) => tx.action === \"swap\");\n}\n\nexport function extractPreSignTransactions(\n transactions: (StandaloneTransactionItem | BatchTransactionItem)[]\n): PreSignTransactionItem[] {\n return transactions.filter(\n (tx) =>\n tx.action === \"preSignDeltaOrder\" ||\n tx.action === \"depositNativeAndPreSign\"\n );\n}\n\n// not all TransactionItemSwap have transactionHash\n// id will be either transactionHash (for standalone tx) or receipt.transactionHash (for batch tx)\nexport type TransactionItemSwapWithId = TransactionItemSwap & { id: Hash };\n\nexport function combineSwapTransactionItems<T extends TransactionItemSwap>(\n ...txArrays: T[][]\n): TransactionItemSwapWithId[] {\n const map: Record<Hash, TransactionItemSwapWithId> = {};\n\n txArrays.flat().forEach((item) => {\n const transactionHash = isStandaloneTransactionItem(item)\n ? item.transactionHash\n : item.receipt?.transactionHash;\n\n // we can't rely on callsId for batch swap tx as identifier if we have another source of truth\n // better to not show pending calls until we have transactionHash\n // otherwise it may lead to duplicate entries in the Activities list\n // when transaction appeared in the metabase but we still have pending call in the local storage\n if (transactionHash)\n map[transactionHash] = { ...item, id: transactionHash };\n });\n\n return Object.values(map);\n}\n\nexport function isGnosisSafeTx(\n tx: TransactionItem\n): tx is GnosisSafeTransactionItem {\n return (\n !!tx.connectorData &&\n (tx.connectorData.isSafe === true ||\n // extra check for backwards compatibility with txs from localStorage without connectorData.isSafe\n isConnectorWithSafeProvider(tx.connectorData))\n );\n}\n"],"mappings":";;AAWA,SAAgBQ,EACdC,GACmC;AACnC,QAAO,qBAAqBA;;AAG9B,SAAgBC,EACdD,GAC8B;AAC9B,QAAO,aAAaA;;AAGtB,SAAgBE,EAEdC,GAAwB;AACxB,QAAOA,EAAaE,QACjBC,MACC,CAACA,EAAGC,YACHR,EAA4BO,EAAG,GAC5B,CAACA,EAAGE,UACJ,CAACF,EAAGG,eAAeH,EAAGG,gBAAgB,WAC7C;;AAGH,SAAgBC,EACdP,GACuB;AACvB,QAAOA,EAAaE,QAAQC,MAAOA,EAAGK,WAAW,OAAO;;AAG1D,SAAgBC,EACdT,GAC0B;AAC1B,QAAOA,EAAaE,QACjBC,MACCA,EAAGK,WAAW,uBACdL,EAAGK,WAAW,0BACjB;;AAOH,SAAgBI,EACd,GAAGC,GAC0B;CAC7B,IAAMC,IAA+C,EAAE;AAevD,QAbAD,EAASG,MAAM,CAACC,SAASpB,MAAS;EAChC,IAAMqB,IAAkBtB,EAA4BC,EAAK,GACrDA,EAAKqB,kBACLrB,EAAKQ,SAASa;AAMlB,EAAIA,MACFJ,EAAII,KAAmB;GAAE,GAAGrB;GAAMc,IAAIO;GAAiB;GACzD,EAEKC,OAAOC,OAAON,EAAI;;AAG3B,SAAgBO,EACdlB,GACiC;AACjC,QACE,CAAC,CAACA,EAAGmB,kBACJnB,EAAGmB,cAAcC,WAAW,MAE3BnC,EAA4Be,EAAGmB,cAAc"}
1
+ {"version":3,"file":"utils.js","names":["isConnectorWithSafeProvider","BatchTransactionItem","GnosisSafeTransactionItem","PreSignTransactionItem","StandaloneTransactionItem","TransactionItem","TransactionItemSwap","Hash","isStandaloneTransactionItem","item","isBatchTransactionItem","extractPendingTransactions","transactions","T","filter","tx","dropped","receipt","callsStatus","extractSwapTransactions","action","extractPreSignTransactions","TransactionItemSwapWithId","id","combineSwapTransactionItems","txArrays","map","Record","flat","forEach","transactionHash","Object","values","isGnosisSafeTx","connectorData","isSafe"],"sources":["../../src/transactions/utils.ts"],"sourcesContent":["import { isConnectorWithSafeProvider } from \"@/components/web3/ConnectExternalProvider/utils\";\nimport type {\n BatchTransactionItem,\n GnosisSafeTransactionItem,\n PreSignTransactionItem,\n StandaloneTransactionItem,\n TransactionItem,\n TransactionItemSwap,\n} from \"./types\";\nimport type { Hash } from \"viem\";\n\nexport function isStandaloneTransactionItem(\n item: TransactionItem\n): item is StandaloneTransactionItem {\n return \"transactionHash\" in item;\n}\n\nexport function isBatchTransactionItem(\n item: TransactionItem\n): item is BatchTransactionItem {\n return \"callsId\" in item;\n}\n\nexport function extractPendingTransactions<\n T extends StandaloneTransactionItem | BatchTransactionItem,\n>(transactions: T[]): T[] {\n return transactions.filter(\n (tx) =>\n !tx.dropped &&\n (isStandaloneTransactionItem(tx)\n ? !tx.receipt\n : !tx.callsStatus || tx.callsStatus === \"pending\")\n );\n}\n\nexport function extractSwapTransactions(\n transactions: (StandaloneTransactionItem | BatchTransactionItem)[]\n): TransactionItemSwap[] {\n return transactions.filter((tx) => tx.action === \"swap\");\n}\n\nexport function extractPreSignTransactions(\n transactions: (StandaloneTransactionItem | BatchTransactionItem)[]\n): PreSignTransactionItem[] {\n return transactions.filter(\n (tx) =>\n tx.action === \"preSignDeltaOrder\" ||\n tx.action === \"depositNativeAndPreSign\"\n );\n}\n\n// not all TransactionItemSwap have transactionHash\n// id will be either transactionHash (for standalone tx) or receipt.transactionHash (for batch tx)\nexport type TransactionItemSwapWithId = TransactionItemSwap & { id: Hash };\n\nexport function combineSwapTransactionItems<T extends TransactionItemSwap>(\n ...txArrays: T[][]\n): TransactionItemSwapWithId[] {\n const map: Record<Hash, TransactionItemSwapWithId> = {};\n\n txArrays.flat().forEach((item) => {\n const transactionHash = isStandaloneTransactionItem(item)\n ? item.transactionHash\n : item.receipt?.transactionHash;\n\n // we can't rely on callsId for batch swap tx as identifier if we have another source of truth\n // better to not show pending calls until we have transactionHash\n // otherwise it may lead to duplicate entries in the Activities list\n // when transaction appeared in the metabase but we still have pending call in the local storage\n if (transactionHash)\n map[transactionHash] = { ...item, id: transactionHash };\n });\n\n return Object.values(map);\n}\n\nexport function isGnosisSafeTx(\n tx: TransactionItem\n): tx is GnosisSafeTransactionItem {\n return (\n !!tx.connectorData &&\n (tx.connectorData.isSafe === true ||\n // extra check for backwards compatibility with txs from localStorage without connectorData.isSafe\n isConnectorWithSafeProvider(tx.connectorData))\n );\n}\n"],"mappings":";;AAWA,SAAgBQ,EACdC,GACmC;CACnC,OAAO,qBAAqBA;;AAG9B,SAAgBC,EACdD,GAC8B;CAC9B,OAAO,aAAaA;;AAGtB,SAAgBE,EAEdC,GAAwB;CACxB,OAAOA,EAAaE,QACjBC,MACC,CAACA,EAAGC,YACHR,EAA4BO,EAAG,GAC5B,CAACA,EAAGE,UACJ,CAACF,EAAGG,eAAeH,EAAGG,gBAAgB,WAC7C;;AAGH,SAAgBC,EACdP,GACuB;CACvB,OAAOA,EAAaE,QAAQC,MAAOA,EAAGK,WAAW,OAAO;;AAG1D,SAAgBC,EACdT,GAC0B;CAC1B,OAAOA,EAAaE,QACjBC,MACCA,EAAGK,WAAW,uBACdL,EAAGK,WAAW,0BACjB;;AAOH,SAAgBI,EACd,GAAGC,GAC0B;CAC7B,IAAMC,IAA+C,EAAE;CAevD,OAbAD,EAASG,MAAM,CAACC,SAASpB,MAAS;EAChC,IAAMqB,IAAkBtB,EAA4BC,EAAK,GACrDA,EAAKqB,kBACLrB,EAAKQ,SAASa;EAMlB,AAAIA,MACFJ,EAAII,KAAmB;GAAE,GAAGrB;GAAMc,IAAIO;GAAiB;GACzD,EAEKC,OAAOC,OAAON,EAAI;;AAG3B,SAAgBO,EACdlB,GACiC;CACjC,OACE,CAAC,CAACA,EAAGmB,kBACJnB,EAAGmB,cAAcC,WAAW,MAE3BnC,EAA4Be,EAAGmB,cAAc"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@velora-dex/widget",
3
- "version": "0.8.1-dev.0",
3
+ "version": "0.8.2",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "files": [
@@ -30,9 +30,9 @@
30
30
  "analyze:circular-deps-graph": "madge --circular $(find ./src -name '*.ts' -o -name '*.tsx') --image graph.svg"
31
31
  },
32
32
  "devDependencies": {
33
- "@babel/core": "^7.28.4",
33
+ "@babel/core": "^7.29.0",
34
34
  "@eslint/js": "^9.32.0",
35
- "@rolldown/plugin-babel": "^0.2.0",
35
+ "@rolldown/plugin-babel": "^0.2.2",
36
36
  "@safe-global/safe-apps-provider": "^0.18.6",
37
37
  "@safe-global/safe-apps-sdk": "^9.1.0",
38
38
  "@tailwindcss/vite": "^4.2.2",
@@ -56,7 +56,7 @@
56
56
  "tw-animate-css": "^1.3.6",
57
57
  "typescript": "~5.9.2",
58
58
  "typescript-eslint": "^8.39.0",
59
- "vite": "^8.0.0",
59
+ "vite": "^8.0.12",
60
60
  "vite-plugin-dts": "^4.5.4",
61
61
  "vite-plugin-lib-inject-css": "^2.2.2",
62
62
  "vite-plugin-node-polyfills": "^0.25.0",
@@ -78,9 +78,9 @@
78
78
  "@tanstack/react-pacer": "^0.14.0",
79
79
  "@tanstack/react-virtual": "^3.13.12",
80
80
  "@uniswap/token-lists": "1.0.0-beta.34",
81
- "@velora-dex/sdk": "9.5.2",
81
+ "@velora-dex/sdk": "9.5.3",
82
82
  "@wagmi/core": "^2.18.1",
83
- "axios": "^1.11.0",
83
+ "axios": "^1.16.1",
84
84
  "big.js": "^7.0.1",
85
85
  "class-variance-authority": "^0.7.1",
86
86
  "clsx": "^2.1.1",