@velora-dex/widget 0.3.13-dev.1 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/dist/components/web3/ConnectExternalProvider/AutoconnectExternal.d.ts.map +1 -1
  2. package/dist/components/web3/ConnectExternalProvider/AutoconnectExternal.js +75 -63
  3. package/dist/components/web3/ConnectExternalProvider/AutoconnectExternal.js.map +1 -1
  4. package/dist/components/web3/ConnectExternalProvider/constants.d.ts +14 -0
  5. package/dist/components/web3/ConnectExternalProvider/constants.d.ts.map +1 -0
  6. package/dist/components/web3/ConnectExternalProvider/constants.js +6 -0
  7. package/dist/components/web3/ConnectExternalProvider/constants.js.map +1 -0
  8. package/dist/components/web3/ConnectExternalProvider/metamaskProviderWrapper.d.ts +15 -0
  9. package/dist/components/web3/ConnectExternalProvider/metamaskProviderWrapper.d.ts.map +1 -0
  10. package/dist/components/web3/ConnectExternalProvider/metamaskProviderWrapper.js +56 -0
  11. package/dist/components/web3/ConnectExternalProvider/metamaskProviderWrapper.js.map +1 -0
  12. package/dist/components/web3/ConnectExternalProvider/safeProviderWrapper.d.ts +6 -0
  13. package/dist/components/web3/ConnectExternalProvider/safeProviderWrapper.d.ts.map +1 -0
  14. package/dist/components/web3/ConnectExternalProvider/safeProviderWrapper.js +76 -0
  15. package/dist/components/web3/ConnectExternalProvider/safeProviderWrapper.js.map +1 -0
  16. package/dist/components/web3/ConnectExternalProvider/utils.d.ts +23 -0
  17. package/dist/components/web3/ConnectExternalProvider/utils.d.ts.map +1 -0
  18. package/dist/components/web3/ConnectExternalProvider/utils.js +42 -0
  19. package/dist/components/web3/ConnectExternalProvider/utils.js.map +1 -0
  20. package/dist/components/web3/ConnectWallets/index.js.map +1 -1
  21. package/dist/components/web3/ConnectWallets/walletIcons.d.ts +8 -1
  22. package/dist/components/web3/ConnectWallets/walletIcons.d.ts.map +1 -1
  23. package/dist/components/web3/ConnectWallets/walletIcons.js +23 -9
  24. package/dist/components/web3/ConnectWallets/walletIcons.js.map +1 -1
  25. package/dist/components/widget/ReceiverAddress/state/subscriptions.d.ts.map +1 -1
  26. package/dist/components/widget/ReceiverAddress/state/subscriptions.js +11 -5
  27. package/dist/components/widget/ReceiverAddress/state/subscriptions.js.map +1 -1
  28. package/dist/components/widget/TradeOverview/DeltaOrderTradeOverview.d.ts.map +1 -1
  29. package/dist/components/widget/TradeOverview/DeltaOrderTradeOverview.js +95 -79
  30. package/dist/components/widget/TradeOverview/DeltaOrderTradeOverview.js.map +1 -1
  31. package/dist/components/widget/TradeOverview/LimitOrderTradeOverview.d.ts +1 -1
  32. package/dist/components/widget/TradeOverview/LimitOrderTradeOverview.d.ts.map +1 -1
  33. package/dist/components/widget/TradeOverview/LimitOrderTradeOverview.js +60 -89
  34. package/dist/components/widget/TradeOverview/LimitOrderTradeOverview.js.map +1 -1
  35. package/dist/components/widget/TradeOverview/OtcOrderTradeOverview.d.ts.map +1 -1
  36. package/dist/components/widget/TradeOverview/OtcOrderTradeOverview.js +1 -0
  37. package/dist/components/widget/TradeOverview/OtcOrderTradeOverview.js.map +1 -1
  38. package/dist/components/widget/TradeOverview/utils/preWrap.d.ts +4 -1
  39. package/dist/components/widget/TradeOverview/utils/preWrap.d.ts.map +1 -1
  40. package/dist/components/widget/TradeOverview/utils/preWrap.js +2 -1
  41. package/dist/components/widget/TradeOverview/utils/preWrap.js.map +1 -1
  42. package/dist/components/widget/TransactionDetails/LimitOrderDetails/Controls.d.ts +2 -2
  43. package/dist/components/widget/TransactionDetails/LimitOrderDetails/Controls.d.ts.map +1 -1
  44. package/dist/components/widget/TransactionDetails/LimitOrderDetails/Controls.js +22 -23
  45. package/dist/components/widget/TransactionDetails/LimitOrderDetails/Controls.js.map +1 -1
  46. package/dist/components/widget/TransactionDetails/LimitOrderDetails/TransactionDetails.js +1 -1
  47. package/dist/components/widget/TransactionDetails/LimitOrderDetails/TransactionDetails.js.map +1 -1
  48. package/dist/components/widget/WrapEth/hooks/useWrapEthProps.d.ts +2 -0
  49. package/dist/components/widget/WrapEth/hooks/useWrapEthProps.d.ts.map +1 -1
  50. package/dist/components/widget/WrapEth/hooks/useWrapEthProps.js +236 -3
  51. package/dist/components/widget/WrapEth/hooks/useWrapEthProps.js.map +1 -1
  52. package/dist/configurator/Configurator.d.ts.map +1 -1
  53. package/dist/configurator/Safe/SafeConnector.d.ts +23 -0
  54. package/dist/configurator/Safe/SafeConnector.d.ts.map +1 -0
  55. package/dist/configurator/Safe/useSafeConnector.d.ts +8 -0
  56. package/dist/configurator/Safe/useSafeConnector.d.ts.map +1 -0
  57. package/dist/core/LimitOrderButton.d.ts.map +1 -1
  58. package/dist/core/LimitOrderButton.js +40 -18
  59. package/dist/core/LimitOrderButton.js.map +1 -1
  60. package/dist/core/index.d.ts.map +1 -1
  61. package/dist/core/index.js +46 -24
  62. package/dist/core/index.js.map +1 -1
  63. package/dist/core/state/configAtom.d.ts.map +1 -1
  64. package/dist/core/state/configAtom.js +5 -1
  65. package/dist/core/state/configAtom.js.map +1 -1
  66. package/dist/core/state/externalProviderAtom.d.ts +6 -0
  67. package/dist/core/state/externalProviderAtom.d.ts.map +1 -1
  68. package/dist/core/state/externalProviderAtom.js +4 -1
  69. package/dist/core/state/externalProviderAtom.js.map +1 -1
  70. package/dist/events/getters/swap.d.ts.map +1 -1
  71. package/dist/events/getters/swap.js +2 -1
  72. package/dist/events/getters/swap.js.map +1 -1
  73. package/dist/events/getters/widgetState.d.ts.map +1 -1
  74. package/dist/events/getters/widgetState.js +22 -1
  75. package/dist/events/getters/widgetState.js.map +1 -1
  76. package/dist/events/hooks/useOnWalletConnect.d.ts.map +1 -1
  77. package/dist/events/hooks/useOnWalletConnect.js +17 -1
  78. package/dist/events/hooks/useOnWalletConnect.js.map +1 -1
  79. package/dist/events/types/common.d.ts +7 -0
  80. package/dist/events/types/common.d.ts.map +1 -1
  81. package/dist/events/types/connectWallet.d.ts +4 -3
  82. package/dist/events/types/connectWallet.d.ts.map +1 -1
  83. package/dist/events/types/index.d.ts.map +1 -1
  84. package/dist/hooks/batch/useAwaitCalls.d.ts.map +1 -1
  85. package/dist/hooks/batch/useAwaitCalls.js.map +1 -1
  86. package/dist/hooks/connectors/useIsConnectedSafe.d.ts +1 -0
  87. package/dist/hooks/connectors/useIsConnectedSafe.d.ts.map +1 -1
  88. package/dist/hooks/connectors/useIsConnectedSafe.js +10 -3
  89. package/dist/hooks/connectors/useIsConnectedSafe.js.map +1 -1
  90. package/dist/hooks/connectors/useIsGnosisSafeConnector.d.ts +5 -1
  91. package/dist/hooks/connectors/useIsGnosisSafeConnector.d.ts.map +1 -1
  92. package/dist/hooks/connectors/useIsGnosisSafeConnector.js +3 -4
  93. package/dist/hooks/connectors/useIsGnosisSafeConnector.js.map +1 -1
  94. package/dist/hooks/connectors/useIsSafeThroughWalletConnect.d.ts +3 -1
  95. package/dist/hooks/connectors/useIsSafeThroughWalletConnect.d.ts.map +1 -1
  96. package/dist/hooks/connectors/useIsSafeThroughWalletConnect.js +55 -11
  97. package/dist/hooks/connectors/useIsSafeThroughWalletConnect.js.map +1 -1
  98. package/dist/hooks/otc/mutations/useFillOrder.js +2 -1
  99. package/dist/hooks/otc/mutations/useFillOrder.js.map +1 -1
  100. package/dist/hooks/otc/tradeFlow/useFillOtcOrderFlow.js +1 -0
  101. package/dist/hooks/otc/tradeFlow/useFillOtcOrderFlow.js.map +1 -1
  102. package/dist/hooks/otc/tradeFlow/useFillOtcOrderStep.d.ts.map +1 -1
  103. package/dist/hooks/otc/tradeFlow/useFillOtcOrderStep.js +7 -4
  104. package/dist/hooks/otc/tradeFlow/useFillOtcOrderStep.js.map +1 -1
  105. package/dist/hooks/swap/prices/delta/mutations/useCreatePreSignableDeltaOrder.d.ts +1 -13
  106. package/dist/hooks/swap/prices/delta/mutations/useCreatePreSignableDeltaOrder.d.ts.map +1 -1
  107. package/dist/hooks/swap/prices/delta/mutations/useCreatePreSignableDeltaOrder.js +1 -80
  108. package/dist/hooks/swap/prices/delta/mutations/useCreatePreSignableDeltaOrder.js.map +1 -1
  109. package/dist/hooks/swap/prices/delta/orders/utils.d.ts.map +1 -1
  110. package/dist/hooks/swap/prices/delta/orders/utils.js +1 -1
  111. package/dist/hooks/swap/prices/delta/orders/utils.js.map +1 -1
  112. package/dist/hooks/swap/prices/delta/queries/useDeltaLimitOrderRequiredBalance.d.ts.map +1 -1
  113. package/dist/hooks/swap/prices/delta/queries/useDeltaLimitOrderRequiredBalance.js +2 -1
  114. package/dist/hooks/swap/prices/delta/queries/useDeltaLimitOrderRequiredBalance.js.map +1 -1
  115. package/dist/hooks/swap/prices/useSwapPrices.d.ts.map +1 -1
  116. package/dist/hooks/swap/prices/useSwapPrices.js +113 -98
  117. package/dist/hooks/swap/prices/useSwapPrices.js.map +1 -1
  118. package/dist/hooks/swap/tradeFlow/common/usePreSignAndSubmitDeltaOrder.d.ts +3 -1
  119. package/dist/hooks/swap/tradeFlow/common/usePreSignAndSubmitDeltaOrder.d.ts.map +1 -1
  120. package/dist/hooks/swap/tradeFlow/common/usePreSignAndSubmitDeltaOrder.js +22 -2
  121. package/dist/hooks/swap/tradeFlow/common/usePreSignAndSubmitDeltaOrder.js.map +1 -1
  122. package/dist/hooks/swap/tradeFlow/useDeltaFlow.d.ts +2 -3
  123. package/dist/hooks/swap/tradeFlow/useDeltaFlow.d.ts.map +1 -1
  124. package/dist/hooks/swap/tradeFlow/useDeltaFlow.js +14 -37
  125. package/dist/hooks/swap/tradeFlow/useDeltaFlow.js.map +1 -1
  126. package/dist/hooks/swap/tradeFlow/useLimitOrderFlow.d.ts +2 -1
  127. package/dist/hooks/swap/tradeFlow/useLimitOrderFlow.d.ts.map +1 -1
  128. package/dist/hooks/swap/tradeFlow/useLimitOrderFlow.js +14 -36
  129. package/dist/hooks/swap/tradeFlow/useLimitOrderFlow.js.map +1 -1
  130. package/dist/hooks/swap/tradeFlow/useMarketSwapStep.d.ts.map +1 -1
  131. package/dist/hooks/swap/tradeFlow/useMarketSwapStep.js +7 -4
  132. package/dist/hooks/swap/tradeFlow/useMarketSwapStep.js.map +1 -1
  133. package/dist/hooks/txs/queries/useAwaitTx.d.ts.map +1 -1
  134. package/dist/hooks/txs/queries/useAwaitTx.js +114 -20
  135. package/dist/hooks/txs/queries/useAwaitTx.js.map +1 -1
  136. package/dist/index.d.ts +1 -1
  137. package/dist/index.d.ts.map +1 -1
  138. package/dist/lib/constants/storage.d.ts +1 -1
  139. package/dist/lib/constants/storage.d.ts.map +1 -1
  140. package/dist/lib/constants/storage.js +3 -1
  141. package/dist/lib/constants/storage.js.map +1 -1
  142. package/dist/lib/constants/urls.js +2 -6
  143. package/dist/lib/constants/urls.js.map +1 -1
  144. package/dist/lib/utils/index.d.ts.map +1 -1
  145. package/dist/lib/utils/index.js.map +1 -1
  146. package/dist/lib/utils/toasts.d.ts +1 -1
  147. package/dist/lib/utils/toasts.d.ts.map +1 -1
  148. package/dist/lib/utils/toasts.js +5 -1
  149. package/dist/lib/utils/toasts.js.map +1 -1
  150. package/dist/lib/web3/wagmi/config.d.ts.map +1 -1
  151. package/dist/lib/web3/wagmi/config.js +1 -1
  152. package/dist/lib/web3/wagmi/config.js.map +1 -1
  153. package/dist/lib/web3/wagmi/external.d.ts +11 -3
  154. package/dist/lib/web3/wagmi/external.d.ts.map +1 -1
  155. package/dist/lib/web3/wagmi/external.js +28 -2
  156. package/dist/lib/web3/wagmi/external.js.map +1 -1
  157. package/dist/lib/web3/wagmi/isInIframe.d.ts +2 -0
  158. package/dist/lib/web3/wagmi/isInIframe.d.ts.map +1 -0
  159. package/dist/lib/web3/wagmi/isInIframe.js +4 -0
  160. package/dist/lib/web3/wagmi/isInIframe.js.map +1 -0
  161. package/dist/lib/web3/wagmi/isInsideSafeIframe.d.ts +0 -1
  162. package/dist/lib/web3/wagmi/isInsideSafeIframe.d.ts.map +1 -1
  163. package/dist/lib/web3/wagmi/isInsideSafeIframe.js +2 -2
  164. package/dist/lib/web3/wagmi/isInsideSafeIframe.js.map +1 -1
  165. package/dist/lib/web3/wagmi/switchChain.d.ts.map +1 -1
  166. package/dist/lib/web3/wagmi/switchChain.js +3 -3
  167. package/dist/lib/web3/wagmi/switchChain.js.map +1 -1
  168. package/dist/transactions/hash.d.ts +7 -0
  169. package/dist/transactions/hash.d.ts.map +1 -0
  170. package/dist/transactions/hash.js +34 -0
  171. package/dist/transactions/hash.js.map +1 -0
  172. package/dist/transactions/queries/ensureCallsStatus.d.ts.map +1 -1
  173. package/dist/transactions/queries/ensureCallsStatus.js +14 -3
  174. package/dist/transactions/queries/ensureCallsStatus.js.map +1 -1
  175. package/dist/transactions/queries/ensureTxReceipt.d.ts.map +1 -1
  176. package/dist/transactions/queries/ensureTxReceipt.js +48 -12
  177. package/dist/transactions/queries/ensureTxReceipt.js.map +1 -1
  178. package/dist/transactions/state/effects/finalize.d.ts +7 -1
  179. package/dist/transactions/state/effects/finalize.d.ts.map +1 -1
  180. package/dist/transactions/state/effects/finalize.js +53 -7
  181. package/dist/transactions/state/effects/finalize.js.map +1 -1
  182. package/dist/transactions/state/hooks/useActivateEffects.d.ts.map +1 -1
  183. package/dist/transactions/state/hooks/useActivateEffects.js +4 -2
  184. package/dist/transactions/state/hooks/useActivateEffects.js.map +1 -1
  185. package/dist/transactions/state/transactionsActionAtom.d.ts.map +1 -1
  186. package/dist/transactions/state/transactionsActionAtom.js +74 -18
  187. package/dist/transactions/state/transactionsActionAtom.js.map +1 -1
  188. package/dist/transactions/state/transactionsAtom.js +2 -2
  189. package/dist/transactions/state/transactionsAtom.js.map +1 -1
  190. package/dist/transactions/types.d.ts +33 -10
  191. package/dist/transactions/types.d.ts.map +1 -1
  192. package/dist/transactions/utils.d.ts +2 -1
  193. package/dist/transactions/utils.d.ts.map +1 -1
  194. package/dist/transactions/utils.js +7 -1
  195. package/dist/transactions/utils.js.map +1 -1
  196. package/package.json +4 -2
  197. package/dist/hooks/swap/tradeFlow/common/useDepositAndSubmitDeltaOrder.d.ts +0 -69
  198. package/dist/hooks/swap/tradeFlow/common/useDepositAndSubmitDeltaOrder.d.ts.map +0 -1
  199. package/dist/hooks/swap/tradeFlow/common/useDepositAndSubmitDeltaOrder.js +0 -192
  200. package/dist/hooks/swap/tradeFlow/common/useDepositAndSubmitDeltaOrder.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ensureTxReceipt.d.ts","sourceRoot":"","sources":["../../../src/transactions/queries/ensureTxReceipt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,OAAO,EAAE,WAAW,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAU,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAI3E,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,cAAc,CAAC;AAI1C,KAAK,YAAY,GAAG,CAAC,IAAI,EAAE,qBAAqB,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;AAEjE,MAAM,MAAM,iBAAiB,GAAG,CAC9B,OAAO,EAAE,YAAY,CACnB,IAAI,CAAC,oBAAoB,EAAE,MAAM,GAAG,SAAS,GAAG,eAAe,CAAC,EAChE,MAAM,GAAG,SAAS,CACnB,GAAG;IACF,UAAU,CAAC,EAAE,YAAY,CAAC;CAC3B,KACE,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAEjC,KAAK,sBAAsB,GAAG,CAAC,MAAM,CAAC,EAAE;IACtC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,YAAY,CAAC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,KAAK,iBAAiB,CAAC;AAExB,eAAO,MAAM,sBAAsB,EAAE,sBAsClC,CAAC"}
1
+ {"version":3,"file":"ensureTxReceipt.d.ts","sourceRoot":"","sources":["../../../src/transactions/queries/ensureTxReceipt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,OAAO,EAAE,WAAW,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAU,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAI3E,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,cAAc,CAAC;AAU1C,KAAK,YAAY,GAAG,CAAC,IAAI,EAAE,qBAAqB,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;AAEjE,MAAM,MAAM,iBAAiB,GAAG,CAC9B,OAAO,EAAE,YAAY,CACnB,IAAI,CAAC,oBAAoB,EAAE,MAAM,GAAG,SAAS,GAAG,eAAe,CAAC,EAChE,MAAM,GAAG,SAAS,CACnB,GAAG;IACF,UAAU,CAAC,EAAE,YAAY,CAAC;CAC3B,KACE,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAEjC,KAAK,sBAAsB,GAAG,CAAC,MAAM,CAAC,EAAE;IACtC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,YAAY,CAAC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,KAAK,iBAAiB,CAAC;AAIxB,eAAO,MAAM,sBAAsB,EAAE,sBAiHlC,CAAC"}
@@ -6,38 +6,74 @@ import { waitForTransactionReceiptQueryOptions } from 'wagmi/query';
6
6
  import { SAFE_CALLS_WAIT_TIMEOUT } from '../../lib/constants/index.js';
7
7
  import 'wagmi/chains';
8
8
  import { getAccount, getConnectorClient } from '@wagmi/core';
9
- import { isSafeConnector } from '../../hooks/connectors/useIsGnosisSafeConnector.js';
9
+ import { isExternalConnectorSafeWalletConnect, isConnectorWithSafeIframeProvider } from '../../components/web3/ConnectExternalProvider/utils.js';
10
+ import { isWalletConnectConnectorWithSafe } from '../../hooks/connectors/useIsSafeThroughWalletConnect.js';
11
+ import { ensureCallsStatusFactory } from './ensureCallsStatus.js';
12
+ import { createLogger } from '../../lib/utils/logger.js';
10
13
 
11
- const ensureTxReceiptFactory = ({
12
- queryClient: queryClient$1 = queryClient,
13
- wagmiConfig: wagmiConfig$1 = wagmiConfig,
14
- isSafe
15
- } = {}) => async ({
14
+ const logger = createLogger("Transactions:EnsureTxReceipt");
15
+ const ensureTxReceiptFactory = (options = {}) => async ({
16
16
  hash,
17
17
  chainId,
18
18
  confirmations,
19
19
  onReplaced
20
20
  }) => {
21
- const timeout = isSafe ? SAFE_CALLS_WAIT_TIMEOUT : void 0;
22
- let config = wagmiConfig$1;
21
+ const {
22
+ queryClient: queryClient$1 = queryClient,
23
+ wagmiConfig: wagmiConfig$1 = wagmiConfig,
24
+ isSafe: _isSafe
25
+ } = options;
23
26
  const {
24
27
  connector
25
28
  } = getAccount(wagmiConfig$1);
26
- if (connector && isSafeConnector(connector)) {
29
+ let isWConnectConnectorWithSafe = false;
30
+ let isConnectedToSafeIframe = false;
31
+ if (connector) {
32
+ isWConnectConnectorWithSafe = // can determine sync from connector.type and connector.id in case of external provider
33
+ isExternalConnectorSafeWalletConnect(connector);
34
+ isConnectedToSafeIframe = isConnectorWithSafeIframeProvider(connector);
35
+ if (!isWConnectConnectorWithSafe && !isConnectedToSafeIframe) {
36
+ isWConnectConnectorWithSafe = await isWalletConnectConnectorWithSafe(connector);
37
+ }
38
+ }
39
+ const isConnectedToSafe = isWConnectConnectorWithSafe || isConnectedToSafeIframe;
40
+ const isSafe = _isSafe || isConnectedToSafe;
41
+ const timeout = isSafe ? SAFE_CALLS_WAIT_TIMEOUT : void 0;
42
+ let config = wagmiConfig$1;
43
+ let realtxHash = hash;
44
+ if (isConnectedToSafeIframe) {
27
45
  const safeClient = await getConnectorClient(wagmiConfig$1, {
28
46
  chainId,
29
47
  connector
30
48
  });
31
49
  config = {
32
50
  ...wagmiConfig$1,
33
- getClient: (options) => {
34
- assert(!options || options.chainId === chainId, "chainId mismatch");
51
+ // doesn't work with Safe through WalletConnect connector
52
+ getClient: (options2) => {
53
+ assert(!options2 || options2.chainId === chainId, "chainId mismatch");
35
54
  return safeClient;
36
55
  }
37
56
  };
57
+ } else if (isWConnectConnectorWithSafe) {
58
+ const ensureCallsStatus = ensureCallsStatusFactory({
59
+ ...options,
60
+ isSafe: true
61
+ });
62
+ try {
63
+ const callsStatusResult = await ensureCallsStatus({
64
+ id: hash
65
+ });
66
+ const classReceipt = callsStatusResult.receipts?.[callsStatusResult.receipts.length - 1];
67
+ assert(classReceipt, `Transaction receipt not found for Safe tx through WalletConnect ${hash}, on chain ${chainId}`);
68
+ realtxHash = classReceipt.transactionHash;
69
+ } catch (error) {
70
+ logger.error("Error getting calls status for Safe tx through WalletConnect", {
71
+ error
72
+ });
73
+ }
38
74
  }
39
75
  const queryOptions = waitForTransactionReceiptQueryOptions(config, {
40
- hash,
76
+ hash: realtxHash,
41
77
  chainId,
42
78
  confirmations,
43
79
  timeout,
@@ -1 +1 @@
1
- {"version":3,"file":"ensureTxReceipt.js","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 { isSafeConnector } from \"@/hooks/connectors/useIsGnosisSafeConnector\";\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\nexport const ensureTxReceiptFactory: EnsureTxReceiptFactory =\n ({ queryClient = _queryClient, wagmiConfig = _wagmiConfig, isSafe } = {}) =>\n async ({ hash, chainId, confirmations, onReplaced }) => {\n const timeout = isSafe ? SAFE_CALLS_WAIT_TIMEOUT : undefined;\n\n let config = wagmiConfig;\n const { connector } = getAccount(wagmiConfig);\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 connected to safe through WalletConnect - publicClient returns a real tx hash.\n if (connector && isSafeConnector(connector)) {\n const safeClient = await getConnectorClient(wagmiConfig, {\n chainId,\n connector,\n });\n // force waitForTransactionReceiptQueryOptions to use SafeClient internally\n config = {\n ...wagmiConfig,\n getClient: (options) => {\n assert(!options || options.chainId === chainId, \"chainId mismatch\");\n return safeClient;\n },\n } as typeof wagmiConfig;\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,\n chainId,\n confirmations,\n timeout,\n onReplaced,\n });\n\n const receipt = await queryClient.ensureQueryData(queryOptions);\n\n return receipt;\n };\n"],"names":["ensureTxReceiptFactory","queryClient","_queryClient","wagmiConfig","_wagmiConfig","isSafe","hash","chainId","confirmations","onReplaced","timeout","SAFE_CALLS_WAIT_TIMEOUT","undefined","config","connector","getAccount","isSafeConnector","safeClient","getConnectorClient","getClient","options","assert","queryOptions","waitForTransactionReceiptQueryOptions","receipt","ensureQueryData"],"mappings":";;;;;;;;;;AA+BO,MAAMA,yBACXA,CAAC;AAAA,eAAEC,aAAAA,GAAcC,WAAAA;AAAAA,eAAcC,aAAAA,GAAcC,WAAAA;AAAAA,EAAcC;AAAO,CAAA,GAAI,OACtE,OAAO;AAAA,EAAEC,IAAAA;AAAAA,EAAMC,OAAAA;AAAAA,EAASC,aAAAA;AAAAA,EAAeC;AAAW,CAAA,KAAM;AACtD,EAAA,MAAMC,OAAAA,GAAUL,SAASM,uBAAAA,GAA0BC,MAAAA;AAEnD,EAAA,IAAIC,MAAAA,GAASV,aAAAA;AACb,EAAA,MAAM;AAAA,IAAEW;AAAAA,GAAU,GAAIC,WAAWZ,aAAW,CAAA;AAI5C,EAAA,IAAIW,SAAAA,IAAaE,eAAAA,CAAgBF,SAAS,CAAA,EAAG;AAC3C,IAAA,MAAMG,UAAAA,GAAa,MAAMC,kBAAAA,CAAmBf,aAAAA,EAAa;AAAA,MACvDI,OAAAA;AAAAA,MACAO;AAAAA,KACD,CAAA;AAEDD,IAAAA,MAAAA,GAAS;AAAA,MACP,GAAGV,aAAAA;AAAAA,MACHgB,WAAYC,CAAAA,OAAAA,KAAY;AACtBC,QAAAA,MAAAA,CAAO,CAACD,OAAAA,IAAWA,OAAAA,CAAQb,OAAAA,KAAYA,SAAS,kBAAkB,CAAA;AAClE,QAAA,OAAOU,UAAAA;AAAAA,MACT;AAAA,KACF;AAAA,EACF;AAIA,EAAA,MAAMK,YAAAA,GAAeC,sCAAsCV,MAAAA,EAAQ;AAAA,IACjEP,IAAAA;AAAAA,IACAC,OAAAA;AAAAA,IACAC,aAAAA;AAAAA,IACAE,OAAAA;AAAAA,IACAD;AAAAA,GACD,CAAA;AAED,EAAA,MAAMe,OAAAA,GAAU,MAAMvB,aAAAA,CAAYwB,eAAAA,CAAgBH,YAAY,CAAA;AAE9D,EAAA,OAAOE,OAAAA;AACT;;;;"}
1
+ {"version":3,"file":"ensureTxReceipt.js","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 { createLogger } from \"@/lib/utils/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 = createLogger(\"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 ? SAFE_CALLS_WAIT_TIMEOUT : undefined;\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 connected to safe through WalletConnect - publicClient returns 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"],"names":["logger","createLogger","ensureTxReceiptFactory","options","hash","chainId","confirmations","onReplaced","queryClient","_queryClient","wagmiConfig","_wagmiConfig","isSafe","_isSafe","connector","getAccount","isWConnectConnectorWithSafe","isConnectedToSafeIframe","isExternalConnectorSafeWalletConnect","isConnectorWithSafeIframeProvider","isWalletConnectConnectorWithSafe","isConnectedToSafe","timeout","SAFE_CALLS_WAIT_TIMEOUT","undefined","config","realtxHash","safeClient","getConnectorClient","getClient","assert","ensureCallsStatus","ensureCallsStatusFactory","callsStatusResult","id","classReceipt","receipts","length","transactionHash","error","queryOptions","waitForTransactionReceiptQueryOptions","receipt","ensureQueryData"],"mappings":"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"}
@@ -1,7 +1,13 @@
1
- export declare const finalizeStandoloneTxsEffect: import('jotai').Atom<void> & {
1
+ export declare const finalizeStandaloneTxsEffect: import('jotai').Atom<void> & {
2
+ effect: import('jotai-effect').Effect;
3
+ };
4
+ export declare const finalizeStandaloneSafeTxsEffect: import('jotai').Atom<void> & {
2
5
  effect: import('jotai-effect').Effect;
3
6
  };
4
7
  export declare const finalizeBatchTxsEffect: import('jotai').Atom<void> & {
5
8
  effect: import('jotai-effect').Effect;
6
9
  };
10
+ export declare const finalizeBatchSafeTxsEffect: import('jotai').Atom<void> & {
11
+ effect: import('jotai-effect').Effect;
12
+ };
7
13
  //# sourceMappingURL=finalize.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"finalize.d.ts","sourceRoot":"","sources":["../../../../src/transactions/state/effects/finalize.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,2BAA2B;;CAOtC,CAAC;AAKH,eAAO,MAAM,sBAAsB;;CAWjC,CAAC"}
1
+ {"version":3,"file":"finalize.d.ts","sourceRoot":"","sources":["../../../../src/transactions/state/effects/finalize.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,2BAA2B;;CAStC,CAAC;AAIH,eAAO,MAAM,+BAA+B;;CAkC1C,CAAC;AAKH,eAAO,MAAM,sBAAsB;;CAajC,CAAC;AAGH,eAAO,MAAM,0BAA0B;;CAmCrC,CAAC"}
@@ -2,27 +2,73 @@ import { atomEffect } from 'jotai-effect';
2
2
  import { allPendingStandaloneTransactionItemsAtom, allPendingBatchTransactionItemsAtom } from '../transactionsAtom.js';
3
3
  import { finalizeStandaloneTxAtom, finalizeBatchTxAtom } from '../transactionsActionAtom.js';
4
4
  import { transactionLogger } from '../../logger.js';
5
- import { accountAtom } from '../../../lib/web3/wagmi/external.js';
5
+ import { accountAtom, isConnectorWithSafeAsyncAtomLoadableAtom, addressAtom } from '../../../lib/web3/wagmi/external.js';
6
+ import { isGnosisSafeTx } from '../../utils.js';
7
+ import { isConnectorWithSafeProvider } from '../../../components/web3/ConnectExternalProvider/utils.js';
6
8
 
7
9
  let hasRunStandaloneEffect = false;
8
- const finalizeStandoloneTxsEffect = atomEffect((get, set) => {
10
+ const finalizeStandaloneTxsEffect = atomEffect((get, set) => {
9
11
  if (hasRunStandaloneEffect) return;
10
12
  hasRunStandaloneEffect = true;
11
- const pendingStandaloneTxs = get(allPendingStandaloneTransactionItemsAtom);
13
+ const pendingStandaloneTxs = get(allPendingStandaloneTransactionItemsAtom).filter((tx) => !isGnosisSafeTx(tx));
12
14
  transactionLogger.log("Effect::pendingStandaloneTxs", pendingStandaloneTxs);
13
15
  pendingStandaloneTxs.forEach((tx) => set(finalizeStandaloneTxAtom, tx));
14
16
  });
17
+ let hasRunStandaloneSafeEffect = false;
18
+ const finalizeStandaloneSafeTxsEffect = atomEffect((get, set) => {
19
+ if (hasRunStandaloneSafeEffect) return;
20
+ const {
21
+ connector,
22
+ address
23
+ } = get(accountAtom);
24
+ let connectedSafe = connector && isConnectorWithSafeProvider(connector);
25
+ if (!connectedSafe) {
26
+ const loadableResult = get(isConnectorWithSafeAsyncAtomLoadableAtom);
27
+ if (loadableResult.state === "hasData" && loadableResult.data) {
28
+ connectedSafe = true;
29
+ }
30
+ }
31
+ if (connectedSafe && !!connector?.getAccounts && !!connector?.getChainId && address) {
32
+ hasRunStandaloneSafeEffect = true;
33
+ const addressLower = address.toLowerCase();
34
+ const pendingSafeTxs = get(allPendingStandaloneTransactionItemsAtom).filter(isGnosisSafeTx).filter((tx) => tx.account.toLowerCase() === addressLower);
35
+ transactionLogger.log("Effect::pendingSafeTxs", pendingSafeTxs);
36
+ pendingSafeTxs.forEach((tx) => set(finalizeStandaloneTxAtom, tx));
37
+ }
38
+ });
15
39
  let hasRunBatchEffect = false;
16
40
  const finalizeBatchTxsEffect = atomEffect((get, set) => {
17
41
  if (hasRunBatchEffect) return;
18
- const account = get(accountAtom);
19
- if (account) {
42
+ const address = get(addressAtom);
43
+ if (address) {
20
44
  hasRunBatchEffect = true;
21
- const pendingBatchTxs = get(allPendingBatchTransactionItemsAtom);
45
+ const pendingBatchTxs = get(allPendingBatchTransactionItemsAtom).filter((tx) => !isGnosisSafeTx(tx));
22
46
  transactionLogger.log("Effect::pendingBatchTxs", pendingBatchTxs);
23
47
  pendingBatchTxs.forEach((tx) => set(finalizeBatchTxAtom, tx));
24
48
  }
25
49
  });
50
+ let hasRunBatchSafeEffect = false;
51
+ const finalizeBatchSafeTxsEffect = atomEffect((get, set) => {
52
+ if (hasRunBatchSafeEffect) return;
53
+ const {
54
+ connector,
55
+ address
56
+ } = get(accountAtom);
57
+ let connectedSafe = connector && isConnectorWithSafeProvider(connector);
58
+ if (!connectedSafe) {
59
+ const loadableResult = get(isConnectorWithSafeAsyncAtomLoadableAtom);
60
+ if (loadableResult.state === "hasData" && loadableResult.data) {
61
+ connectedSafe = true;
62
+ }
63
+ }
64
+ if (connectedSafe && !!connector?.getAccounts && !!connector?.getChainId && address) {
65
+ hasRunBatchSafeEffect = true;
66
+ const addressLower = address.toLowerCase();
67
+ const pendingSafeBatchTxs = get(allPendingBatchTransactionItemsAtom).filter(isGnosisSafeTx).filter((tx) => tx.account.toLowerCase() === addressLower);
68
+ transactionLogger.log("Effect::pendingSafeBatchTxs", pendingSafeBatchTxs);
69
+ pendingSafeBatchTxs.forEach((tx) => set(finalizeBatchTxAtom, tx));
70
+ }
71
+ });
26
72
 
27
- export { finalizeBatchTxsEffect, finalizeStandoloneTxsEffect };
73
+ export { finalizeBatchSafeTxsEffect, finalizeBatchTxsEffect, finalizeStandaloneSafeTxsEffect, finalizeStandaloneTxsEffect };
28
74
  //# sourceMappingURL=finalize.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"finalize.js","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 { accountAtom } from \"@/lib/web3/wagmi/external\";\n\n// run only once on app load\nlet hasRunStandaloneEffect = false;\nexport const finalizeStandoloneTxsEffect = atomEffect((get, set) => {\n if (hasRunStandaloneEffect) return;\n hasRunStandaloneEffect = true;\n\n const pendingStandaloneTxs = get(allPendingStandaloneTransactionItemsAtom);\n transactionLogger.log(\"Effect::pendingStandaloneTxs\", pendingStandaloneTxs);\n pendingStandaloneTxs.forEach((tx) => set(finalizeStandaloneTxAtom, tx));\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 account = get(accountAtom);\n if (account) {\n hasRunBatchEffect = true;\n\n const pendingBatchTxs = get(allPendingBatchTransactionItemsAtom);\n transactionLogger.log(\"Effect::pendingBatchTxs\", pendingBatchTxs);\n pendingBatchTxs.forEach((tx) => set(finalizeBatchTxAtom, tx));\n }\n});\n"],"names":["hasRunStandaloneEffect","finalizeStandoloneTxsEffect","atomEffect","get","set","pendingStandaloneTxs","allPendingStandaloneTransactionItemsAtom","transactionLogger","log","forEach","tx","finalizeStandaloneTxAtom","hasRunBatchEffect","finalizeBatchTxsEffect","account","accountAtom","pendingBatchTxs","allPendingBatchTransactionItemsAtom","finalizeBatchTxAtom"],"mappings":";;;;;;AAcA,IAAIA,sBAAAA,GAAyB,KAAA;AACtB,MAAMC,2BAAAA,GAA8BC,UAAAA,CAAW,CAACC,GAAAA,EAAKC,GAAAA,KAAQ;AAClE,EAAA,IAAIJ,sBAAAA,EAAwB;AAC5BA,EAAAA,sBAAAA,GAAyB,IAAA;AAEzB,EAAA,MAAMK,oBAAAA,GAAuBF,IAAIG,wCAAwC,CAAA;AACzEC,EAAAA,iBAAAA,CAAkBC,GAAAA,CAAI,gCAAgCH,oBAAoB,CAAA;AAC1EA,EAAAA,oBAAAA,CAAqBI,OAAAA,CAASC,CAAAA,EAAAA,KAAON,GAAAA,CAAIO,wBAAAA,EAA0BD,EAAE,CAAC,CAAA;AACxE,CAAC;AAID,IAAIE,iBAAAA,GAAoB,KAAA;AACjB,MAAMC,sBAAAA,GAAyBX,UAAAA,CAAW,CAACC,GAAAA,EAAKC,GAAAA,KAAQ;AAC7D,EAAA,IAAIQ,iBAAAA,EAAmB;AAEvB,EAAA,MAAME,OAAAA,GAAUX,IAAIY,WAAW,CAAA;AAC/B,EAAA,IAAID,OAAAA,EAAS;AACXF,IAAAA,iBAAAA,GAAoB,IAAA;AAEpB,IAAA,MAAMI,eAAAA,GAAkBb,IAAIc,mCAAmC,CAAA;AAC/DV,IAAAA,iBAAAA,CAAkBC,GAAAA,CAAI,2BAA2BQ,eAAe,CAAA;AAChEA,IAAAA,eAAAA,CAAgBP,OAAAA,CAASC,CAAAA,EAAAA,KAAON,GAAAA,CAAIc,mBAAAA,EAAqBR,EAAE,CAAC,CAAA;AAAA,EAC9D;AACF,CAAC;;;;"}
1
+ {"version":3,"file":"finalize.js","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"],"names":["hasRunStandaloneEffect","finalizeStandaloneTxsEffect","atomEffect","get","set","pendingStandaloneTxs","allPendingStandaloneTransactionItemsAtom","filter","tx","isGnosisSafeTx","transactionLogger","log","forEach","finalizeStandaloneTxAtom","hasRunStandaloneSafeEffect","finalizeStandaloneSafeTxsEffect","connector","address","accountAtom","connectedSafe","isConnectorWithSafeProvider","loadableResult","isConnectorWithSafeAsyncAtomLoadableAtom","state","data","getAccounts","getChainId","addressLower","toLowerCase","pendingSafeTxs","account","hasRunBatchEffect","finalizeBatchTxsEffect","addressAtom","pendingBatchTxs","allPendingBatchTransactionItemsAtom","finalizeBatchTxAtom","hasRunBatchSafeEffect","finalizeBatchSafeTxsEffect","pendingSafeBatchTxs"],"mappings":";;;;;;;;AAoBA,IAAIA,sBAAAA,GAAyB,KAAA;AACtB,MAAMC,2BAAAA,GAA8BC,UAAAA,CAAW,CAACC,GAAAA,EAAKC,GAAAA,KAAQ;AAClE,EAAA,IAAIJ,sBAAAA,EAAwB;AAC5BA,EAAAA,sBAAAA,GAAyB,IAAA;AAEzB,EAAA,MAAMK,oBAAAA,GAAuBF,IAAIG,wCAAwC,CAAA,CAEtEC,OAAQC,CAAAA,EAAAA,KAAO,CAACC,cAAAA,CAAeD,EAAE,CAAC,CAAA;AACrCE,EAAAA,iBAAAA,CAAkBC,GAAAA,CAAI,gCAAgCN,oBAAoB,CAAA;AAC1EA,EAAAA,oBAAAA,CAAqBO,OAAAA,CAASJ,CAAAA,EAAAA,KAAOJ,GAAAA,CAAIS,wBAAAA,EAA0BL,EAAE,CAAC,CAAA;AACxE,CAAC;AAGD,IAAIM,0BAAAA,GAA6B,KAAA;AAC1B,MAAMC,+BAAAA,GAAkCb,UAAAA,CAAW,CAACC,GAAAA,EAAKC,GAAAA,KAAQ;AACtE,EAAA,IAAIU,0BAAAA,EAA4B;AAChC,EAAA,MAAM;AAAA,IAAEE,SAAAA;AAAAA,IAAWC;AAAAA,GAAQ,GAAId,IAAIe,WAAW,CAAA;AAC9C,EAAA,IAAIC,aAAAA,GAAgBH,SAAAA,IAAaI,2BAAAA,CAA4BJ,SAAS,CAAA;AAEtE,EAAA,IAAI,CAACG,aAAAA,EAAe;AAElB,IAAA,MAAME,cAAAA,GAAiBlB,IAAImB,wCAAwC,CAAA;AACnE,IAAA,IAAID,cAAAA,CAAeE,KAAAA,KAAU,SAAA,IAAaF,cAAAA,CAAeG,IAAAA,EAAM;AAC7DL,MAAAA,aAAAA,GAAgB,IAAA;AAAA,IAClB;AAAA,EACF;AAMA,EAAA,IACEA,aAAAA,IACA,CAAC,CAACH,SAAAA,EAAWS,eACb,CAAC,CAACT,SAAAA,EAAWU,UAAAA,IACbT,OAAAA,EACA;AACAH,IAAAA,0BAAAA,GAA6B,IAAA;AAE7B,IAAA,MAAMa,YAAAA,GAAeV,QAAQW,WAAAA,EAAY;AAEzC,IAAA,MAAMC,cAAAA,GAAiB1B,GAAAA,CAAIG,wCAAwC,CAAA,CAChEC,MAAAA,CAAOE,cAAc,CAAA,CAErBF,MAAAA,CAAQC,CAAAA,EAAAA,KAAOA,EAAAA,CAAGsB,OAAAA,CAAQF,WAAAA,OAAkBD,YAAY,CAAA;AAC3DjB,IAAAA,iBAAAA,CAAkBC,GAAAA,CAAI,0BAA0BkB,cAAc,CAAA;AAC9DA,IAAAA,cAAAA,CAAejB,OAAAA,CAASJ,CAAAA,EAAAA,KAAOJ,GAAAA,CAAIS,wBAAAA,EAA0BL,EAAE,CAAC,CAAA;AAAA,EAClE;AACF,CAAC;AAID,IAAIuB,iBAAAA,GAAoB,KAAA;AACjB,MAAMC,sBAAAA,GAAyB9B,UAAAA,CAAW,CAACC,GAAAA,EAAKC,GAAAA,KAAQ;AAC7D,EAAA,IAAI2B,iBAAAA,EAAmB;AAEvB,EAAA,MAAMd,OAAAA,GAAUd,IAAI8B,WAAW,CAAA;AAC/B,EAAA,IAAIhB,OAAAA,EAAS;AACXc,IAAAA,iBAAAA,GAAoB,IAAA;AAEpB,IAAA,MAAMG,eAAAA,GAAkB/B,IAAIgC,mCAAmC,CAAA,CAE5D5B,OAAQC,CAAAA,EAAAA,KAAO,CAACC,cAAAA,CAAeD,EAAE,CAAC,CAAA;AACrCE,IAAAA,iBAAAA,CAAkBC,GAAAA,CAAI,2BAA2BuB,eAAe,CAAA;AAChEA,IAAAA,eAAAA,CAAgBtB,OAAAA,CAASJ,CAAAA,EAAAA,KAAOJ,GAAAA,CAAIgC,mBAAAA,EAAqB5B,EAAE,CAAC,CAAA;AAAA,EAC9D;AACF,CAAC;AAED,IAAI6B,qBAAAA,GAAwB,KAAA;AACrB,MAAMC,0BAAAA,GAA6BpC,UAAAA,CAAW,CAACC,GAAAA,EAAKC,GAAAA,KAAQ;AACjE,EAAA,IAAIiC,qBAAAA,EAAuB;AAC3B,EAAA,MAAM;AAAA,IAAErB,SAAAA;AAAAA,IAAWC;AAAAA,GAAQ,GAAId,IAAIe,WAAW,CAAA;AAE9C,EAAA,IAAIC,aAAAA,GAAgBH,SAAAA,IAAaI,2BAAAA,CAA4BJ,SAAS,CAAA;AAEtE,EAAA,IAAI,CAACG,aAAAA,EAAe;AAElB,IAAA,MAAME,cAAAA,GAAiBlB,IAAImB,wCAAwC,CAAA;AACnE,IAAA,IAAID,cAAAA,CAAeE,KAAAA,KAAU,SAAA,IAAaF,cAAAA,CAAeG,IAAAA,EAAM;AAC7DL,MAAAA,aAAAA,GAAgB,IAAA;AAAA,IAClB;AAAA,EACF;AAMA,EAAA,IACEA,aAAAA,IACA,CAAC,CAACH,SAAAA,EAAWS,eACb,CAAC,CAACT,SAAAA,EAAWU,UAAAA,IACbT,OAAAA,EACA;AACAoB,IAAAA,qBAAAA,GAAwB,IAAA;AAExB,IAAA,MAAMV,YAAAA,GAAeV,QAAQW,WAAAA,EAAY;AAEzC,IAAA,MAAMW,mBAAAA,GAAsBpC,GAAAA,CAAIgC,mCAAmC,CAAA,CAChE5B,MAAAA,CAAOE,cAAc,CAAA,CAErBF,MAAAA,CAAQC,CAAAA,EAAAA,KAAOA,EAAAA,CAAGsB,OAAAA,CAAQF,WAAAA,OAAkBD,YAAY,CAAA;AAC3DjB,IAAAA,iBAAAA,CAAkBC,GAAAA,CAAI,+BAA+B4B,mBAAmB,CAAA;AACxEA,IAAAA,mBAAAA,CAAoB3B,OAAAA,CAASJ,CAAAA,EAAAA,KAAOJ,GAAAA,CAAIgC,mBAAAA,EAAqB5B,EAAE,CAAC,CAAA;AAAA,EAClE;AACF,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useActivateEffects.d.ts","sourceRoot":"","sources":["../../../../src/transactions/state/hooks/useActivateEffects.ts"],"names":[],"mappings":"AAMA,wBAAgB,kBAAkB,SAIjC"}
1
+ {"version":3,"file":"useActivateEffects.d.ts","sourceRoot":"","sources":["../../../../src/transactions/state/hooks/useActivateEffects.ts"],"names":[],"mappings":"AAQA,wBAAgB,kBAAkB,SAMjC"}
@@ -1,9 +1,11 @@
1
1
  import { useAtom } from '../../../core/store.js';
2
- import { finalizeStandoloneTxsEffect, finalizeBatchTxsEffect } from '../effects/finalize.js';
2
+ import { finalizeStandaloneTxsEffect, finalizeStandaloneSafeTxsEffect, finalizeBatchTxsEffect, finalizeBatchSafeTxsEffect } from '../effects/finalize.js';
3
3
 
4
4
  function useActivateEffects() {
5
- useAtom(finalizeStandoloneTxsEffect);
5
+ useAtom(finalizeStandaloneTxsEffect);
6
+ useAtom(finalizeStandaloneSafeTxsEffect);
6
7
  useAtom(finalizeBatchTxsEffect);
8
+ useAtom(finalizeBatchSafeTxsEffect);
7
9
  }
8
10
 
9
11
  export { useActivateEffects };
@@ -1 +1 @@
1
- {"version":3,"file":"useActivateEffects.js","sources":["../../../../src/transactions/state/hooks/useActivateEffects.ts"],"sourcesContent":["import { useAtom } from \"@/core/store\";\nimport {\n finalizeBatchTxsEffect,\n finalizeStandoloneTxsEffect,\n} from \"@/transactions/state/effects/finalize\";\n\nexport function useActivateEffects() {\n // atomEffects must be rendered for subscriptions to activate\n useAtom(finalizeStandoloneTxsEffect);\n useAtom(finalizeBatchTxsEffect);\n}\n"],"names":["useActivateEffects","useAtom","finalizeStandoloneTxsEffect","finalizeBatchTxsEffect"],"mappings":";;;AAMO,SAAAA,kBAAAA,GAAA;AAELC,EAAAA,OAAAA,CAAQC,2BAA2B,CAAA;AACnCD,EAAAA,OAAAA,CAAQE,sBAAsB,CAAA;AAAC;;;;"}
1
+ {"version":3,"file":"useActivateEffects.js","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"],"names":["useActivateEffects","useAtom","finalizeStandaloneTxsEffect","finalizeStandaloneSafeTxsEffect","finalizeBatchTxsEffect","finalizeBatchSafeTxsEffect"],"mappings":";;;AAQO,SAAAA,kBAAAA,GAAA;AAELC,EAAAA,OAAAA,CAAQC,2BAA2B,CAAA;AACnCD,EAAAA,OAAAA,CAAQE,+BAA+B,CAAA;AACvCF,EAAAA,OAAAA,CAAQG,sBAAsB,CAAA;AAC9BH,EAAAA,OAAAA,CAAQI,0BAA0B,CAAA;AAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"transactionsActionAtom.d.ts","sourceRoot":"","sources":["../../../src/transactions/state/transactionsActionAtom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,UAAU,CAAC;AAuBlB,eAAO,MAAM,SAAS;;CAoBrB,CAAC;AAEF,eAAO,MAAM,wBAAwB;;CAgCnC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;CA8B9B,CAAC;AAEH,eAAO,MAAM,KAAK,GAAU,aAAa,kBAAkB,kBAE1D,CAAC"}
1
+ {"version":3,"file":"transactionsActionAtom.d.ts","sourceRoot":"","sources":["../../../src/transactions/state/transactionsActionAtom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,UAAU,CAAC;AA+BlB,eAAO,MAAM,SAAS;;CAoCrB,CAAC;AAEF,eAAO,MAAM,wBAAwB;;CAwCnC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;CA8B9B,CAAC;AAEH,eAAO,MAAM,KAAK,GAAU,aAAa,kBAAkB,kBAE1D,CAAC"}
@@ -5,24 +5,40 @@ import { ensureTxReceiptFactory } from '../queries/ensureTxReceipt.js';
5
5
  import { WaitForTransactionReceiptTimeoutError, TransactionReceiptNotFoundError, CallExecutionError, WaitForCallsStatusTimeoutError, MethodNotSupportedRpcError } from 'viem';
6
6
  import { transactionLogger } from '../logger.js';
7
7
  import { transactionsAtom } from './transactionsAtom.js';
8
- import { isStandaloneTransactionItem, isBatchTransactionItem } from '../utils.js';
9
- import { accountAtom } from '../../lib/web3/wagmi/external.js';
8
+ import { isGnosisSafeTx, isStandaloneTransactionItem, isBatchTransactionItem } from '../utils.js';
10
9
  import { assert } from 'ts-essentials';
10
+ import { accountAtom, isConnectorWithSafeAsyncAtomLoadableAtom } from '../../lib/web3/wagmi/external.js';
11
+ import { isConnectorWithSafeProvider } from '../../components/web3/ConnectExternalProvider/utils.js';
11
12
 
12
- const addTxAtom = atom(null, async (get, set, transaction) => {
13
- const account = get(accountAtom);
14
- assert(account, "addTxAtom: account is required");
13
+ const addTxAtom = atom(null, (get, set, transaction) => {
14
+ const {
15
+ connector,
16
+ address
17
+ } = get(accountAtom);
18
+ assert(connector && address, "connector and address are required");
19
+ let isSafe = isConnectorWithSafeProvider(connector);
20
+ if (!isSafe) {
21
+ const loadableResult = get(isConnectorWithSafeAsyncAtomLoadableAtom);
22
+ if (loadableResult.state === "hasData" && loadableResult.data) {
23
+ isSafe = true;
24
+ }
25
+ }
15
26
  const txWithMeta = {
16
27
  ...transaction,
17
- account,
28
+ account: address,
18
29
  timestamp: Date.now(),
19
- dropped: false
30
+ dropped: false,
31
+ connectorData: {
32
+ type: connector.type,
33
+ id: connector.id,
34
+ isSafe
35
+ }
20
36
  };
21
37
  set(transactionsAtom, (current) => assignTx(current, txWithMeta));
22
38
  if (isStandaloneTransactionItem(txWithMeta)) {
23
- await set(finalizeStandaloneTxAtom, txWithMeta);
39
+ set(finalizeStandaloneTxAtom, txWithMeta);
24
40
  } else {
25
- await set(finalizeBatchTxAtom, txWithMeta);
41
+ set(finalizeBatchTxAtom, txWithMeta);
26
42
  }
27
43
  });
28
44
  const finalizeStandaloneTxAtom = atom(null, async (_, set, transaction) => {
@@ -30,11 +46,13 @@ const finalizeStandaloneTxAtom = atom(null, async (_, set, transaction) => {
30
46
  ...transaction
31
47
  };
32
48
  const ensureTxReceipt = ensureTxReceiptFactory();
49
+ const isTxThroughSafe = isGnosisSafeTx(finalizedTx);
33
50
  try {
34
- finalizedTx.receipt = await ensureTxReceipt({
35
- hash: transaction.transactionHash,
36
- chainId: transaction.chainId
51
+ const txReceipt = await ensureTxReceipt({
52
+ hash: finalizedTx.transactionHash,
53
+ chainId: finalizedTx.chainId
37
54
  });
55
+ finalizedTx.receipt = txReceipt;
38
56
  } catch (error) {
39
57
  if (
40
58
  /*
@@ -47,10 +65,20 @@ const finalizeStandaloneTxAtom = atom(null, async (_, set, transaction) => {
47
65
  error instanceof CallExecutionError
48
66
  ) {
49
67
  finalizedTx.dropped = true;
50
- transactionLogger.error(`finalizeStandaloneTxAtom::Transaction ${transaction.transactionHash} dropped with error: ${error.message}`);
68
+ transactionLogger.error("tx dropped", {
69
+ error,
70
+ finalizedTx,
71
+ isTxThroughSafe
72
+ });
51
73
  } else throw error;
52
74
  } finally {
53
- set(transactionsAtom, (current) => assignTx(current, finalizedTx));
75
+ if (finalizedTx.receipt || finalizedTx.dropped) {
76
+ set(transactionsAtom, (current) => assignTx(current, finalizedTx));
77
+ transactionLogger.log("tx finalized", {
78
+ finalizedTx,
79
+ isTxThroughSafe
80
+ });
81
+ }
54
82
  }
55
83
  });
56
84
  const finalizeBatchTxAtom = atom(null, async (_, set, transaction) => {
@@ -63,20 +91,30 @@ const finalizeBatchTxAtom = atom(null, async (_, set, transaction) => {
63
91
  receipts,
64
92
  status
65
93
  } = await ensureCallsStatus({
66
- id: transaction.callsId
94
+ id: finalizedTx.callsId
67
95
  });
68
96
  finalizedTx.callsStatus = status;
69
97
  finalizedTx.receipt = receipts?.[receipts.length - 1];
70
98
  } catch (error) {
71
99
  if (error instanceof WaitForCallsStatusTimeoutError || error instanceof MethodNotSupportedRpcError) {
72
100
  finalizedTx.dropped = true;
73
- transactionLogger.error(`finalizeBatchTxAtom::Batch transaction ${transaction.callsId} dropped with error: ${error.message}`);
101
+ transactionLogger.error("batch tx dropped", {
102
+ error,
103
+ finalizedTx
104
+ });
74
105
  } else {
75
106
  finalizedTx.callsStatus = "failure";
107
+ transactionLogger.error("batch tx failed", {
108
+ error,
109
+ finalizedTx
110
+ });
76
111
  throw error;
77
112
  }
78
113
  } finally {
79
114
  set(transactionsAtom, (current) => assignTx(current, finalizedTx));
115
+ transactionLogger.log("batch tx finalized", {
116
+ finalizedTx
117
+ });
80
118
  }
81
119
  });
82
120
  const addTx = async (transaction) => {
@@ -84,7 +122,7 @@ const addTx = async (transaction) => {
84
122
  };
85
123
  function sanitizeTx(tx) {
86
124
  if (isBatchTransactionItem(tx)) {
87
- return {
125
+ const txItem2 = {
88
126
  action: tx.action,
89
127
  account: tx.account,
90
128
  chainId: tx.chainId,
@@ -95,8 +133,17 @@ function sanitizeTx(tx) {
95
133
  receipt: tx.receipt,
96
134
  transactionSpecificData: tx.transactionSpecificData
97
135
  };
136
+ if (tx.connectorData) {
137
+ txItem2.connectorData = {
138
+ type: tx.connectorData.type,
139
+ id: tx.connectorData.id,
140
+ // extra check for backwards compatibility with txs from localStorage without connectorData.isSafe
141
+ isSafe: tx.connectorData.isSafe ?? isGnosisSafeTx(tx)
142
+ };
143
+ }
144
+ return txItem2;
98
145
  }
99
- return {
146
+ const txItem = {
100
147
  action: tx.action,
101
148
  chainId: tx.chainId,
102
149
  account: tx.account,
@@ -106,6 +153,15 @@ function sanitizeTx(tx) {
106
153
  receipt: tx.receipt,
107
154
  transactionSpecificData: tx.transactionSpecificData
108
155
  };
156
+ if (tx.connectorData) {
157
+ txItem.connectorData = {
158
+ type: tx.connectorData.type,
159
+ id: tx.connectorData.id,
160
+ // extra check for backwards compatibility with txs from localStorage without connectorData.isSafe
161
+ isSafe: tx.connectorData.isSafe ?? isGnosisSafeTx(tx)
162
+ };
163
+ }
164
+ return txItem;
109
165
  }
110
166
  function assignTx(currentTransactions, transaction) {
111
167
  transactionLogger.log("assignTx", {
@@ -1 +1 @@
1
- {"version":3,"file":"transactionsActionAtom.js","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} from \"viem\";\nimport { transactionLogger } from \"../logger\";\nimport {\n transactionsAtom,\n type TransactionsMap,\n type TransactionsState,\n} from \"./transactionsAtom\";\nimport { isBatchTransactionItem, isStandaloneTransactionItem } from \"../utils\";\nimport { accountAtom } from \"@/lib/web3/wagmi/external\";\nimport { assert } from \"ts-essentials\";\n\nexport const addTxAtom = atom<null, [transaction: MinTransactionItem], void>(\n null,\n async (get, set, transaction) => {\n const account = get(accountAtom);\n assert(account, \"addTxAtom: account is required\");\n\n const txWithMeta = {\n ...transaction,\n account,\n timestamp: Date.now(),\n dropped: false,\n };\n set(transactionsAtom, (current) => assignTx(current, txWithMeta));\n\n if (isStandaloneTransactionItem(txWithMeta)) {\n await set(finalizeStandaloneTxAtom, txWithMeta);\n } else {\n await 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\n try {\n finalizedTx.receipt = await ensureTxReceipt({\n hash: transaction.transactionHash,\n chainId: transaction.chainId,\n });\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(\n `finalizeStandaloneTxAtom::Transaction ${transaction.transactionHash} dropped with error: ${error.message}`\n );\n } else throw error;\n } finally {\n set(transactionsAtom, (current) => assignTx(current, finalizedTx));\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: transaction.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(\n `finalizeBatchTxAtom::Batch transaction ${transaction.callsId} dropped with error: ${error.message}`\n );\n } else {\n finalizedTx.callsStatus = \"failure\";\n throw error;\n }\n } finally {\n set(transactionsAtom, (current) => assignTx(current, finalizedTx));\n }\n});\n\nexport const addTx = async (transaction: MinTransactionItem) => {\n return jotaiStore.set(addTxAtom, transaction);\n};\n\nfunction sanitizeTx(tx: TransactionItem): TransactionItem {\n if (isBatchTransactionItem(tx)) {\n return {\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\n return {\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\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"],"names":["addTxAtom","atom","get","set","transaction","account","accountAtom","assert","txWithMeta","timestamp","Date","now","dropped","transactionsAtom","current","assignTx","isStandaloneTransactionItem","finalizeStandaloneTxAtom","finalizeBatchTxAtom","_","finalizedTx","ensureTxReceipt","ensureTxReceiptFactory","receipt","hash","transactionHash","chainId","error","WaitForTransactionReceiptTimeoutError","TransactionReceiptNotFoundError","CallExecutionError","transactionLogger","message","ensureCallsStatus","ensureCallsStatusFactory","receipts","status","id","callsId","callsStatus","length","WaitForCallsStatusTimeoutError","MethodNotSupportedRpcError","addTx","jotaiStore","sanitizeTx","tx","isBatchTransactionItem","action","transactionSpecificData","currentTransactions","log","accountTransactions","identifier","updatedAccountTransactions"],"mappings":"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"}
1
+ {"version":3,"file":"transactionsActionAtom.js","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} 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\";\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\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 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"],"names":["addTxAtom","atom","get","set","transaction","connector","address","accountAtom","assert","isSafe","isConnectorWithSafeProvider","loadableResult","isConnectorWithSafeAsyncAtomLoadableAtom","state","data","txWithMeta","account","timestamp","Date","now","dropped","connectorData","type","id","transactionsAtom","current","assignTx","isStandaloneTransactionItem","finalizeStandaloneTxAtom","finalizeBatchTxAtom","_","finalizedTx","ensureTxReceipt","ensureTxReceiptFactory","isTxThroughSafe","isGnosisSafeTx","txReceipt","hash","transactionHash","chainId","receipt","error","WaitForTransactionReceiptTimeoutError","TransactionReceiptNotFoundError","CallExecutionError","transactionLogger","log","ensureCallsStatus","ensureCallsStatusFactory","receipts","status","callsId","callsStatus","length","WaitForCallsStatusTimeoutError","MethodNotSupportedRpcError","addTx","jotaiStore","sanitizeTx","tx","isBatchTransactionItem","txItem","action","transactionSpecificData","currentTransactions","accountTransactions","identifier","updatedAccountTransactions"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { atomWithStorage, createJSONStorage } from 'jotai/utils';
2
2
  import { atom } from 'jotai';
3
3
  import { extractPendingTransactions, isStandaloneTransactionItem, isBatchTransactionItem, extractSwapTransactions } from '../utils.js';
4
4
  import { serialize, deserialize } from 'wagmi';
5
- import { accountAtom } from '../../lib/web3/wagmi/external.js';
5
+ import { addressAtom } from '../../lib/web3/wagmi/external.js';
6
6
  import { emptyArray } from '../../lib/constants/index.js';
7
7
  import { LOCAL_STORAGE_PREFIX } from '../../lib/constants/storage.js';
8
8
 
@@ -20,7 +20,7 @@ const allTransactionsAtom = atom((get) => {
20
20
  return Object.values(transactions).flatMap((txMap) => Object.values(txMap));
21
21
  });
22
22
  const userTransactionsAtom = atom((get) => {
23
- const account = get(accountAtom);
23
+ const account = get(addressAtom);
24
24
  if (!account) return emptyArray;
25
25
  const transactions = get(transactionsAtom)[account];
26
26
  if (!transactions) return emptyArray;
@@ -1 +1 @@
1
- {"version":3,"file":"transactionsAtom.js","sources":["../../../src/transactions/state/transactionsAtom.ts"],"sourcesContent":["import type {\n BatchTransactionItem,\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} from \"../utils\";\nimport { serialize, deserialize } from \"wagmi\";\nimport type { Address } from \"viem\";\nimport { accountAtom } 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(accountAtom);\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"],"names":["transactionsAtom","atomWithStorage","LOCAL_STORAGE_PREFIX","createJSONStorage","localStorage","replacer","_","value","serialize","reviver","deserialize","getOnInit","allTransactionsAtom","atom","get","transactions","Object","values","flatMap","txMap","userTransactionsAtom","account","accountAtom","emptyArray","allStandaloneTransactionItemsAtom","filter","isStandaloneTransactionItem","allBatchTransactionItemsAtom","isBatchTransactionItem","allPendingStandaloneTransactionItemsAtom","extractPendingTransactions","allPendingBatchTransactionItemsAtom","userPendingTransactionsAtom","userSwapTransactionsAtom","extractSwapTransactions"],"mappings":";;;;;;;;AA0BO,MAAMA,gBAAAA,GAAmBC,gBAC9B,CAAA,EAAGC,oBAAoB,iBACvB,EAAC,EACDC,iBAAAA,CAAkB,MAAMC,YAAAA,EAAc;AAAA;AAAA,EAEpCC,QAAAA,EAAUA,CAACC,CAAAA,EAAGC,KAAAA,KAAUC,UAAUD,KAAK,CAAA;AAAA,EACvCE,OAAAA,EAASA,CAACH,CAAAA,EAAGC,KAAAA,KAAU;AACrB,IAAA,OAAO,OAAOA,KAAAA,KAAU,QAAA,GAAWG,WAAAA,CAAYH,KAAK,CAAA,GAAIA,KAAAA;AAAAA,EAC1D;AACF,CAAC,CAAA,EACD;AAAA,EAAEI,SAAAA,EAAW;AAAK,CACpB;AAEO,MAAMC,mBAAAA,GAAsBC,KAAyBC,CAAAA,GAAAA,KAAQ;AAClE,EAAA,MAAMC,YAAAA,GAAeD,IAAId,gBAAgB,CAAA;AACzC,EAAA,OAAOgB,MAAAA,CAAOC,OAAOF,YAAY,CAAA,CAAEG,QAASC,CAAAA,KAAAA,KAAUH,MAAAA,CAAOC,MAAAA,CAAOE,KAAK,CAAC,CAAA;AAC5E,CAAC;AAEM,MAAMC,oBAAAA,GAAuBP,KAAyBC,CAAAA,GAAAA,KAAQ;AACnE,EAAA,MAAMO,OAAAA,GAAUP,IAAIQ,WAAW,CAAA;AAC/B,EAAA,IAAI,CAACD,SAAS,OAAOE,UAAAA;AACrB,EAAA,MAAMR,YAAAA,GAAeD,GAAAA,CAAId,gBAAgB,CAAA,CAAEqB,OAAO,CAAA;AAClD,EAAA,IAAI,CAACN,cAAc,OAAOQ,UAAAA;AAC1B,EAAA,OAAOP,MAAAA,CAAOC,OAAOF,YAAY,CAAA;AACnC,CAAC;AAEM,MAAMS,iCAAAA,GAAoCX,KAE9CC,CAAAA,GAAAA,KAAQ;AACT,EAAA,MAAMC,YAAAA,GAAeD,IAAIF,mBAAmB,CAAA;AAC5C,EAAA,OAAOG,YAAAA,CAAaU,OAAOC,2BAA2B,CAAA;AACxD,CAAC;AAEM,MAAMC,4BAAAA,GAA+Bd,KACzCC,CAAAA,GAAAA,KAAQ;AACP,EAAA,MAAMC,YAAAA,GAAeD,IAAIF,mBAAmB,CAAA;AAC5C,EAAA,OAAOG,YAAAA,CAAaU,OAAOG,sBAAsB,CAAA;AACnD,CACF;AAEO,MAAMC,wCAAAA,GAA2ChB,KAErDC,CAAAA,GAAAA,KAAQ;AACT,EAAA,MAAMC,YAAAA,GAAeD,IAAIU,iCAAiC,CAAA;AAC1D,EAAA,OAAOM,2BAA2Bf,YAAY,CAAA;AAChD,CAAC;AAEM,MAAMgB,mCAAAA,GAAsClB,KAChDC,CAAAA,GAAAA,KAAQ;AACP,EAAA,MAAMC,YAAAA,GAAeD,IAAIa,4BAA4B,CAAA;AACrD,EAAA,OAAOG,2BAA2Bf,YAAY,CAAA;AAChD,CACF;AAEO,MAAMiB,2BAAAA,GAA8BnB,KAAyBC,CAAAA,GAAAA,KAAQ;AAC1E,EAAA,MAAMC,YAAAA,GAAeD,IAAIM,oBAAoB,CAAA;AAC7C,EAAA,OAAOU,2BAA2Bf,YAAY,CAAA;AAChD,CAAC;AAEM,MAAMkB,wBAAAA,GAA2BpB,KAA6BC,CAAAA,GAAAA,KAAQ;AAC3E,EAAA,MAAMC,YAAAA,GAAeD,IAAIM,oBAAoB,CAAA;AAC7C,EAAA,OAAOc,wBAAwBnB,YAAY,CAAA;AAC7C,CAAC;;;;"}
1
+ {"version":3,"file":"transactionsAtom.js","sources":["../../../src/transactions/state/transactionsAtom.ts"],"sourcesContent":["import type {\n BatchTransactionItem,\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} 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"],"names":["transactionsAtom","atomWithStorage","LOCAL_STORAGE_PREFIX","createJSONStorage","localStorage","replacer","_","value","serialize","reviver","deserialize","getOnInit","allTransactionsAtom","atom","get","transactions","Object","values","flatMap","txMap","userTransactionsAtom","account","addressAtom","emptyArray","allStandaloneTransactionItemsAtom","filter","isStandaloneTransactionItem","allBatchTransactionItemsAtom","isBatchTransactionItem","allPendingStandaloneTransactionItemsAtom","extractPendingTransactions","allPendingBatchTransactionItemsAtom","userPendingTransactionsAtom","userSwapTransactionsAtom","extractSwapTransactions"],"mappings":";;;;;;;;AA0BO,MAAMA,gBAAAA,GAAmBC,gBAC9B,CAAA,EAAGC,oBAAoB,iBACvB,EAAC,EACDC,iBAAAA,CAAkB,MAAMC,YAAAA,EAAc;AAAA;AAAA,EAEpCC,QAAAA,EAAUA,CAACC,CAAAA,EAAGC,KAAAA,KAAUC,UAAUD,KAAK,CAAA;AAAA,EACvCE,OAAAA,EAASA,CAACH,CAAAA,EAAGC,KAAAA,KAAU;AACrB,IAAA,OAAO,OAAOA,KAAAA,KAAU,QAAA,GAAWG,WAAAA,CAAYH,KAAK,CAAA,GAAIA,KAAAA;AAAAA,EAC1D;AACF,CAAC,CAAA,EACD;AAAA,EAAEI,SAAAA,EAAW;AAAK,CACpB;AAEO,MAAMC,mBAAAA,GAAsBC,KAAyBC,CAAAA,GAAAA,KAAQ;AAClE,EAAA,MAAMC,YAAAA,GAAeD,IAAId,gBAAgB,CAAA;AACzC,EAAA,OAAOgB,MAAAA,CAAOC,OAAOF,YAAY,CAAA,CAAEG,QAASC,CAAAA,KAAAA,KAAUH,MAAAA,CAAOC,MAAAA,CAAOE,KAAK,CAAC,CAAA;AAC5E,CAAC;AAEM,MAAMC,oBAAAA,GAAuBP,KAAyBC,CAAAA,GAAAA,KAAQ;AACnE,EAAA,MAAMO,OAAAA,GAAUP,IAAIQ,WAAW,CAAA;AAC/B,EAAA,IAAI,CAACD,SAAS,OAAOE,UAAAA;AACrB,EAAA,MAAMR,YAAAA,GAAeD,GAAAA,CAAId,gBAAgB,CAAA,CAAEqB,OAAO,CAAA;AAClD,EAAA,IAAI,CAACN,cAAc,OAAOQ,UAAAA;AAC1B,EAAA,OAAOP,MAAAA,CAAOC,OAAOF,YAAY,CAAA;AACnC,CAAC;AAEM,MAAMS,iCAAAA,GAAoCX,KAE9CC,CAAAA,GAAAA,KAAQ;AACT,EAAA,MAAMC,YAAAA,GAAeD,IAAIF,mBAAmB,CAAA;AAC5C,EAAA,OAAOG,YAAAA,CAAaU,OAAOC,2BAA2B,CAAA;AACxD,CAAC;AAEM,MAAMC,4BAAAA,GAA+Bd,KACzCC,CAAAA,GAAAA,KAAQ;AACP,EAAA,MAAMC,YAAAA,GAAeD,IAAIF,mBAAmB,CAAA;AAC5C,EAAA,OAAOG,YAAAA,CAAaU,OAAOG,sBAAsB,CAAA;AACnD,CACF;AAEO,MAAMC,wCAAAA,GAA2ChB,KAErDC,CAAAA,GAAAA,KAAQ;AACT,EAAA,MAAMC,YAAAA,GAAeD,IAAIU,iCAAiC,CAAA;AAC1D,EAAA,OAAOM,2BAA2Bf,YAAY,CAAA;AAChD,CAAC;AAEM,MAAMgB,mCAAAA,GAAsClB,KAChDC,CAAAA,GAAAA,KAAQ;AACP,EAAA,MAAMC,YAAAA,GAAeD,IAAIa,4BAA4B,CAAA;AACrD,EAAA,OAAOG,2BAA2Bf,YAAY,CAAA;AAChD,CACF;AAEO,MAAMiB,2BAAAA,GAA8BnB,KAAyBC,CAAAA,GAAAA,KAAQ;AAC1E,EAAA,MAAMC,YAAAA,GAAeD,IAAIM,oBAAoB,CAAA;AAC7C,EAAA,OAAOU,2BAA2Bf,YAAY,CAAA;AAChD,CAAC;AAEM,MAAMkB,wBAAAA,GAA2BpB,KAA6BC,CAAAA,GAAAA,KAAQ;AAC3E,EAAA,MAAMC,YAAAA,GAAeD,IAAIM,oBAAoB,CAAA;AAC7C,EAAA,OAAOc,wBAAwBnB,YAAY,CAAA;AAC7C,CAAC;;;;"}