@0xsequence/marketplace-sdk 0.9.0 → 0.10.0

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 (326) hide show
  1. package/.storybook/main.ts +63 -0
  2. package/.storybook/preview.ts +24 -0
  3. package/.storybook/vitest.setup.ts +6 -0
  4. package/CHANGELOG.md +77 -8
  5. package/dist/{CalendarIcon-DbQ7Vxcw.js → CalendarIcon-CqsuAuCm.js} +4 -51
  6. package/dist/CalendarIcon-CqsuAuCm.js.map +1 -0
  7. package/dist/{CollectibleCard-C8Ae64Ab.d.ts → CollectibleCard-Dd-CG6dE.d.ts} +8 -7
  8. package/dist/InfoIcon-v0w_Lu7t.js +53 -0
  9. package/dist/InfoIcon-v0w_Lu7t.js.map +1 -0
  10. package/dist/{_internal-BgWcRIak.js → _internal-C75gOSNo.js} +2 -10
  11. package/dist/_internal-C75gOSNo.js.map +1 -0
  12. package/dist/actionModal-CMUeVsFX.js +116 -0
  13. package/dist/actionModal-CMUeVsFX.js.map +1 -0
  14. package/dist/{alien_swap-B_76IMma.js → alien_swap-CYv6YlOF.js} +1 -1
  15. package/dist/{alien_swap-B_76IMma.js.map → alien_swap-CYv6YlOF.js.map} +1 -1
  16. package/dist/{api-DTIan01C.js → api-BiMGqWdz.js} +17 -34
  17. package/dist/api-BiMGqWdz.js.map +1 -0
  18. package/dist/{aqua-xyz-CMN_TFY5.js → aqua-xyz-Bzn5baeH.js} +1 -1
  19. package/dist/{aqua-xyz-CMN_TFY5.js.map → aqua-xyz-Bzn5baeH.js.map} +1 -1
  20. package/dist/{aura-Cye_TuHj.js → aura-DzIWh8WT.js} +1 -1
  21. package/dist/{aura-Cye_TuHj.js.map → aura-DzIWh8WT.js.map} +1 -1
  22. package/dist/base-DqaJPvfN.js +22 -0
  23. package/dist/base-DqaJPvfN.js.map +1 -0
  24. package/dist/{blur-DWDMyMpK.js → blur-DSH-Cbpj.js} +1 -1
  25. package/dist/{blur-DWDMyMpK.js.map → blur-DSH-Cbpj.js.map} +1 -1
  26. package/dist/{coinbase-ByA_XRB0.js → coinbase-Df8URNxq.js} +1 -1
  27. package/dist/{coinbase-ByA_XRB0.js.map → coinbase-Df8URNxq.js.map} +1 -1
  28. package/dist/{new-marketplace-types-Bfis0U4J.d.ts → create-config-DKJ-F0jc.d.ts} +402 -41
  29. package/dist/{wagmi-CDzEQbfk.js → create-config-fQ-jbJD1.js} +20 -10
  30. package/dist/create-config-fQ-jbJD1.js.map +1 -0
  31. package/dist/{element-b77CyXIZ.js → element-Cx6uJu5N.js} +1 -1
  32. package/dist/{element-b77CyXIZ.js.map → element-Cx6uJu5N.js.map} +1 -1
  33. package/dist/{foundation-DbOrKP9Y.js → foundation-D6U4aRLN.js} +1 -1
  34. package/dist/{foundation-DbOrKP9Y.js.map → foundation-D6U4aRLN.js.map} +1 -1
  35. package/dist/get-provider-CYYHfrlg.js +10 -0
  36. package/dist/get-provider-CYYHfrlg.js.map +1 -0
  37. package/dist/get-query-client-D19vvfJo.js +23 -0
  38. package/dist/get-query-client-D19vvfJo.js.map +1 -0
  39. package/dist/hooks-4pxIbLbM.js +4044 -0
  40. package/dist/hooks-4pxIbLbM.js.map +1 -0
  41. package/dist/{index-BL9RUSEK.d.ts → index-136YrWDH.d.ts} +1 -1
  42. package/dist/{index-D5v5iluA.d.ts → index-BAhaEfqY.d.ts} +1 -1
  43. package/dist/index-BKBin-rq.d.ts +979 -0
  44. package/dist/{index-BQsgAvtX.d.ts → index-BUWB_RXp.d.ts} +776 -570
  45. package/dist/{index-21LE7OhL.d.ts → index-BhVFc2rX.d.ts} +6 -3
  46. package/dist/{index-DXMfTZ1F.d.ts → index-C5aqo8xu.d.ts} +1 -1
  47. package/dist/{index-ByznONYE.d.ts → index-CKrYP7ot.d.ts} +20 -48
  48. package/dist/{index-DaE5ZNHb.d.ts → index-CUwMH7Ht.d.ts} +5 -5
  49. package/dist/{index-CLy8y5hm.d.ts → index-Cu70Lw-w.d.ts} +1 -1
  50. package/dist/index.css +414 -1
  51. package/dist/index.d.ts +8 -10
  52. package/dist/index.js +13 -9
  53. package/dist/{looks-rare-C1VqNcSM.js → looks-rare-ChBRBY-p.js} +1 -1
  54. package/dist/{looks-rare-C1VqNcSM.js.map → looks-rare-ChBRBY-p.js.map} +1 -1
  55. package/dist/{magic-eden-ea_AGCZr.js → magic-eden-D5U7N1xL.js} +1 -1
  56. package/dist/{magic-eden-ea_AGCZr.js.map → magic-eden-D5U7N1xL.js.map} +1 -1
  57. package/dist/{manifold-8y8J2sjT.js → manifold-CtLF52zU.js} +1 -1
  58. package/dist/{manifold-8y8J2sjT.js.map → manifold-CtLF52zU.js.map} +1 -1
  59. package/dist/{marketplace-nwnZv9Cb.js → marketplace-DmFiyBoS.js} +1 -1
  60. package/dist/{marketplace-nwnZv9Cb.js.map → marketplace-DmFiyBoS.js.map} +1 -1
  61. package/dist/{marketplace-logos-CSeGcPW4.js → marketplace-logos-Cd6W-qOq.js} +21 -21
  62. package/dist/{marketplace-logos-CSeGcPW4.js.map → marketplace-logos-Cd6W-qOq.js.map} +1 -1
  63. package/dist/{marketplace.gen-BSDIX7NZ.js → marketplace.gen-HpnpL5xU.js} +3 -3
  64. package/dist/marketplace.gen-HpnpL5xU.js.map +1 -0
  65. package/dist/{marketplaceConfig-C6X1SUik.js → marketplaceConfig-GQTTmihy.js} +3 -3
  66. package/dist/marketplaceConfig-GQTTmihy.js.map +1 -0
  67. package/dist/{mintify-LA68TzWg.js → mintify-Bi3Bce68.js} +1 -1
  68. package/dist/{mintify-LA68TzWg.js.map → mintify-Bi3Bce68.js.map} +1 -1
  69. package/dist/network-CGD0oKtS.js +15 -0
  70. package/dist/network-CGD0oKtS.js.map +1 -0
  71. package/dist/{nftx-D3Tc8nzd.js → nftx-BDQZjtkX.js} +1 -1
  72. package/dist/{nftx-D3Tc8nzd.js.map → nftx-BDQZjtkX.js.map} +1 -1
  73. package/dist/{okx-hbqg6oIJ.js → okx-D4meadLe.js} +1 -1
  74. package/dist/{okx-hbqg6oIJ.js.map → okx-D4meadLe.js.map} +1 -1
  75. package/dist/{open-sea-BccuK8-t.js → open-sea-DN0hgfVw.js} +1 -1
  76. package/dist/{open-sea-BccuK8-t.js.map → open-sea-DN0hgfVw.js.map} +1 -1
  77. package/dist/{primary-sale-C55ALnfQ.js → primary-sale-CmWxSfFQ.js} +1 -1
  78. package/dist/{primary-sale-C55ALnfQ.js.map → primary-sale-CmWxSfFQ.js.map} +1 -1
  79. package/dist/provider-DPGUA10G.js +125 -0
  80. package/dist/provider-DPGUA10G.js.map +1 -0
  81. package/dist/{queries-CUU65uYZ.js → queries-Ce_2othB.js} +165 -7
  82. package/dist/queries-Ce_2othB.js.map +1 -0
  83. package/dist/{rarible-BgTwwj9g.js → rarible-B0xlD88A.js} +1 -1
  84. package/dist/{rarible-BgTwwj9g.js.map → rarible-B0xlD88A.js.map} +1 -1
  85. package/dist/react/_internal/api/index.d.ts +2 -4
  86. package/dist/react/_internal/api/index.js +7 -4
  87. package/dist/react/_internal/databeat/index.d.ts +2 -73
  88. package/dist/react/_internal/databeat/index.js +4 -21
  89. package/dist/react/_internal/index.d.ts +2 -7
  90. package/dist/react/_internal/index.js +11 -6
  91. package/dist/react/_internal/wagmi/index.d.ts +2 -4
  92. package/dist/react/_internal/wagmi/index.js +5 -3
  93. package/dist/react/hooks/index.d.ts +12 -17
  94. package/dist/react/hooks/index.js +23 -19
  95. package/dist/react/hooks/options/index.d.ts +2 -3
  96. package/dist/react/hooks/options/index.js +12 -7
  97. package/dist/react/index.d.ts +12 -17
  98. package/dist/react/index.js +28 -19
  99. package/dist/react/queries/index.d.ts +9 -8
  100. package/dist/react/queries/index.js +20 -15
  101. package/dist/react/ssr/index.d.ts +7 -9
  102. package/dist/react/ssr/index.js +11 -6
  103. package/dist/react/ssr/index.js.map +1 -1
  104. package/dist/react/ui/components/marketplace-collectible-card/index.d.ts +3 -8
  105. package/dist/react/ui/components/marketplace-collectible-card/index.js +27 -18
  106. package/dist/react/ui/components/marketplace-collectible-card/utils/index.d.ts +2 -7
  107. package/dist/react/ui/components/marketplace-collectible-card/utils/index.js +11 -6
  108. package/dist/react/ui/components/marketplace-logos/index.d.ts +21 -21
  109. package/dist/react/ui/components/marketplace-logos/index.js +1 -1
  110. package/dist/react/ui/icons/index.js +13 -9
  111. package/dist/react/ui/index.d.ts +3 -8
  112. package/dist/react/ui/index.js +27 -18
  113. package/dist/react/ui/modals/_internal/components/actionModal/index.d.ts +2 -2
  114. package/dist/react/ui/modals/_internal/components/actionModal/index.js +23 -18
  115. package/dist/{react-DAIicQPT.js → react-DP0M2Wfm.js} +799 -4306
  116. package/dist/react-DP0M2Wfm.js.map +1 -0
  117. package/dist/{react-BbHBl6gg.css → react-DeDyTgo7.css} +1 -1
  118. package/dist/{react-BbHBl6gg.css.map → react-DeDyTgo7.css.map} +1 -1
  119. package/dist/{sequence-Do3kzb4J.js → sequence-BIrOVRXO.js} +1 -1
  120. package/dist/{sequence-Do3kzb4J.js.map → sequence-BIrOVRXO.js.map} +1 -1
  121. package/dist/{sudo-swap-B6vPKxBz.js → sudo-swap-BPMon-M5.js} +1 -1
  122. package/dist/{sudo-swap-B6vPKxBz.js.map → sudo-swap-BPMon-M5.js.map} +1 -1
  123. package/dist/{super-rare-eCm1SE6O.js → super-rare-kPN6Ua8i.js} +1 -1
  124. package/dist/{super-rare-eCm1SE6O.js.map → super-rare-kPN6Ua8i.js.map} +1 -1
  125. package/dist/{token-Da4TdyUk.js → token-CHSBPYVG.js} +1 -1
  126. package/dist/{token-Da4TdyUk.js.map → token-CHSBPYVG.js.map} +1 -1
  127. package/dist/{transaction-CcVViHEL.js → transaction-CnctdNzS.js} +3 -21
  128. package/dist/transaction-CnctdNzS.js.map +1 -0
  129. package/dist/types/index.d.ts +2 -3
  130. package/dist/types/index.js +2 -2
  131. package/dist/{types-DwWE6xOF.js → types-Yw2ywj6j.js} +1 -1
  132. package/dist/{types-DwWE6xOF.js.map → types-Yw2ywj6j.js.map} +1 -1
  133. package/dist/utils/abi/index.d.ts +4 -4
  134. package/dist/utils/abi/index.js +4 -4
  135. package/dist/utils/abi/marketplace/index.d.ts +1 -1
  136. package/dist/utils/abi/marketplace/index.js +1 -1
  137. package/dist/utils/abi/primary-sale/index.d.ts +1 -1
  138. package/dist/utils/abi/primary-sale/index.js +1 -1
  139. package/dist/utils/abi/token/index.d.ts +1 -1
  140. package/dist/utils/abi/token/index.js +1 -1
  141. package/dist/utils/index.d.ts +7 -8
  142. package/dist/utils/index.js +12 -9
  143. package/dist/{utils-CW2NA5KG.js → utils-9RXDgcBl.js} +4 -11
  144. package/dist/utils-9RXDgcBl.js.map +1 -0
  145. package/dist/{utils-BPYfgDSL.js → utils-DjVJ9tov.js} +5 -6
  146. package/dist/utils-DjVJ9tov.js.map +1 -0
  147. package/dist/wagmi-Do_KW5ke.js +0 -0
  148. package/dist/{x2y2-DD17tT91.js → x2y2-BLz-_Q2O.js} +1 -1
  149. package/dist/{x2y2-DD17tT91.js.map → x2y2-BLz-_Q2O.js.map} +1 -1
  150. package/dist/{zora-BpSG9UzS.js → zora-UGhKs-aL.js} +1 -1
  151. package/dist/{zora-BpSG9UzS.js.map → zora-UGhKs-aL.js.map} +1 -1
  152. package/eslint.config.mjs +4 -0
  153. package/package.json +27 -14
  154. package/postcss.config.mjs +6 -0
  155. package/src/index.css +5 -4
  156. package/src/index.ts +1 -0
  157. package/src/react/__tests__/provider.test.tsx +4 -3
  158. package/src/react/_internal/api/__mocks__/indexer.msw.ts +16 -0
  159. package/src/react/_internal/api/__mocks__/laos.msw.ts +387 -0
  160. package/src/react/_internal/api/__mocks__/marketplace.msw.ts +2 -0
  161. package/src/react/_internal/api/__tests__/laos-api.test.ts +756 -0
  162. package/src/react/_internal/api/laos-api.ts +3 -0
  163. package/src/react/_internal/api/marketplace.gen.ts +5 -3
  164. package/src/react/_internal/api/query-keys.ts +12 -4
  165. package/src/react/_internal/api/services.ts +2 -14
  166. package/src/react/_internal/databeat/index.ts +15 -14
  167. package/src/react/_internal/databeat/types.ts +22 -0
  168. package/src/react/_internal/databeat/utils.ts +26 -0
  169. package/src/react/_internal/utils.ts +4 -4
  170. package/src/react/_internal/wagmi/create-config.ts +28 -13
  171. package/src/react/_internal/wallet/wallet.ts +4 -4
  172. package/src/react/hooks/__tests__/useBalanceOfCollectible.laos.test.tsx +367 -0
  173. package/src/react/hooks/__tests__/useCheckoutOptions.test.tsx +158 -0
  174. package/src/react/hooks/__tests__/useCheckoutOptionsSalesContract.test.tsx +42 -65
  175. package/src/react/hooks/__tests__/useCollectionBalanceDetails.test.tsx +17 -0
  176. package/src/react/hooks/__tests__/useCollectionDetailsPolling.test.tsx +11 -3
  177. package/src/react/hooks/__tests__/useConvertPriceToUSD.test.tsx +3 -3
  178. package/src/react/hooks/__tests__/useCurrencyBalance.test.tsx +7 -3
  179. package/src/react/hooks/__tests__/useFilters.test.tsx +2 -2
  180. package/src/react/hooks/__tests__/useGetTokenRanges.test.tsx +111 -0
  181. package/src/react/hooks/__tests__/useListTokenMetadata.test.tsx +83 -57
  182. package/src/react/hooks/__tests__/useTransferTokens.test.tsx +469 -0
  183. package/src/react/hooks/index.ts +3 -1
  184. package/src/react/hooks/useCheckoutOptions.tsx +96 -0
  185. package/src/react/hooks/useCheckoutOptionsSalesContract.tsx +98 -57
  186. package/src/react/hooks/useCollectionBalanceDetails.tsx +95 -68
  187. package/src/react/hooks/useCollectionDetailsPolling.tsx +3 -7
  188. package/src/react/hooks/useComparePrices.tsx +90 -82
  189. package/src/react/hooks/useConvertPriceToUSD.tsx +85 -71
  190. package/src/react/hooks/useCurrencyBalance.tsx +132 -46
  191. package/src/react/hooks/useERC721SaleMintedTokens.tsx +8 -5
  192. package/src/react/hooks/useFilters.tsx +154 -111
  193. package/src/react/hooks/useGetCountOfPrimarySaleItems.tsx +48 -0
  194. package/src/react/hooks/useGetTokenRanges.tsx +83 -22
  195. package/src/react/hooks/useList1155ShopCardData.tsx +2 -0
  196. package/src/react/hooks/useList721ShopCardData.tsx +12 -7
  197. package/src/react/hooks/useListCollections.tsx +25 -25
  198. package/src/react/hooks/useListMarketCardData.tsx +2 -1
  199. package/src/react/hooks/useListPrimarySaleItems.tsx +66 -0
  200. package/src/react/hooks/useListTokenMetadata.ts +71 -0
  201. package/src/react/hooks/useOpenConnectModal.tsx +9 -0
  202. package/src/react/hooks/useTokenSaleDetailsBatch.tsx +3 -7
  203. package/src/react/hooks/useTokenSupplies.ts +81 -0
  204. package/src/react/hooks/useTransferTokens.tsx +2 -2
  205. package/src/react/provider.tsx +73 -9
  206. package/src/react/queries/__tests__/balanceOfCollectible.laos.test.ts +123 -0
  207. package/src/react/queries/__tests__/inventory.laos.test.ts +496 -0
  208. package/src/react/queries/balanceOfCollectible.ts +7 -4
  209. package/src/react/queries/checkoutOptions.ts +85 -0
  210. package/src/react/queries/checkoutOptionsSalesContract.ts +89 -0
  211. package/src/react/queries/collectionBalanceDetails.ts +92 -0
  212. package/src/react/queries/comparePrices.ts +108 -0
  213. package/src/react/queries/convertPriceToUSD.ts +92 -0
  214. package/src/react/queries/filters.ts +138 -0
  215. package/src/react/queries/getTokenRanges.ts +62 -0
  216. package/src/react/queries/index.ts +3 -0
  217. package/src/react/queries/inventory.ts +6 -0
  218. package/src/react/queries/listBalances.ts +4 -3
  219. package/src/react/queries/listCollections.ts +7 -3
  220. package/src/react/queries/listTokenMetadata.ts +2 -2
  221. package/src/react/queries/marketplaceConfig.ts +1 -1
  222. package/src/react/queries/primarySaleItems.ts +85 -0
  223. package/src/react/queries/primarySaleItemsCount.ts +64 -0
  224. package/src/react/queries/tokenSupplies.ts +93 -0
  225. package/src/react/ui/components/_internals/action-button/ActionButton.tsx +66 -66
  226. package/src/react/ui/components/_internals/action-button/__tests__/ActionButtonBody.test.tsx +22 -4
  227. package/src/react/ui/components/_internals/action-button/components/ActionButtonBody.tsx +5 -4
  228. package/src/react/ui/components/_internals/action-button/components/NonOwnerActions.tsx +3 -0
  229. package/src/react/ui/components/_internals/action-button/components/OwnerActions.tsx +4 -4
  230. package/src/react/ui/components/_internals/action-button/hooks/useActionButtonLogic.ts +13 -8
  231. package/src/react/ui/components/_internals/action-button/store.ts +44 -34
  232. package/src/react/ui/components/_internals/custom-select/CustomSelect.stories.tsx +582 -0
  233. package/src/react/ui/components/_internals/pill/Pill.stories.tsx +83 -0
  234. package/src/react/ui/components/marketplace-collectible-card/Footer.tsx +11 -4
  235. package/src/react/ui/components/marketplace-collectible-card/components/ActionButtonWrapper.tsx +7 -4
  236. package/src/react/ui/components/marketplace-collectible-card/types.ts +4 -3
  237. package/src/react/ui/components/marketplace-collectible-card/utils/supplyStatus.ts +4 -7
  238. package/src/react/ui/components/marketplace-collectible-card/variants/ShopCard.tsx +5 -1
  239. package/src/react/ui/components/marketplace-logos/marketplace-logos.stories.tsx +199 -0
  240. package/src/react/ui/components/media/Media.stories.tsx +642 -0
  241. package/src/react/ui/components/media/Media.tsx +24 -19
  242. package/src/react/ui/components/media/types.ts +6 -0
  243. package/src/react/ui/modals/BuyModal/__tests__/BuyModalRouter.test.tsx +15 -0
  244. package/src/react/ui/modals/BuyModal/__tests__/ERC1155ShopModal.test.tsx +6 -0
  245. package/src/react/ui/modals/BuyModal/__tests__/Modal1155.test.tsx +7 -1
  246. package/src/react/ui/modals/BuyModal/__tests__/store.test.ts +9 -1
  247. package/src/react/ui/modals/BuyModal/components/ERC1155QuantityModal.tsx +15 -8
  248. package/src/react/ui/modals/BuyModal/components/ERC1155ShopModal.tsx +3 -0
  249. package/src/react/ui/modals/BuyModal/hooks/__tests__/useERC1155Checkout.test.tsx +30 -27
  250. package/src/react/ui/modals/BuyModal/hooks/useCheckoutOptions.ts +2 -2
  251. package/src/react/ui/modals/BuyModal/hooks/useERC1155Checkout.ts +11 -2
  252. package/src/react/ui/modals/BuyModal/hooks/useERC721SalePaymentParams.ts +1 -1
  253. package/src/react/ui/modals/BuyModal/hooks/usePaymentModalParams.ts +7 -0
  254. package/src/react/ui/modals/BuyModal/index.tsx +9 -1
  255. package/src/react/ui/modals/BuyModal/store.ts +26 -0
  256. package/src/react/ui/modals/CreateListingModal/Modal.tsx +28 -11
  257. package/src/react/ui/modals/CreateListingModal/store.ts +3 -3
  258. package/src/react/ui/modals/MakeOfferModal/Modal.tsx +30 -13
  259. package/src/react/ui/modals/MakeOfferModal/store.ts +3 -3
  260. package/src/react/ui/modals/SellModal/Modal.tsx +11 -8
  261. package/src/react/ui/modals/SellModal/store.ts +3 -3
  262. package/src/react/ui/modals/TransferModal/__tests__/__snapshots__/store.test.ts.snap +17 -0
  263. package/src/react/ui/modals/TransferModal/__tests__/store.test.ts +366 -0
  264. package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/__tests__/useHandleTransfer.test.tsx +402 -0
  265. package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/_components/TokenQuantityInput.tsx +51 -48
  266. package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/_components/TransferButton.tsx +39 -47
  267. package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/_components/WalletAddressInput.tsx +9 -8
  268. package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/index.tsx +31 -35
  269. package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/useHandleTransfer.tsx +19 -10
  270. package/src/react/ui/modals/TransferModal/index.tsx +28 -31
  271. package/src/react/ui/modals/TransferModal/messages.ts +1 -1
  272. package/src/react/ui/modals/TransferModal/store.ts +122 -0
  273. package/src/react/ui/modals/_internal/components/calendar/index.tsx +0 -1
  274. package/src/react/ui/modals/_internal/components/currencyImage/index.tsx +10 -14
  275. package/src/react/ui/modals/_internal/components/currencyOptionsSelect/__tests__/index.test.tsx +5 -2
  276. package/src/react/ui/modals/_internal/components/currencyOptionsSelect/index.tsx +23 -17
  277. package/src/react/ui/modals/_internal/components/expirationDateSelect/index.tsx +10 -10
  278. package/src/react/ui/modals/_internal/components/floorPriceText/__tests__/FloorPriceText.test.tsx +6 -6
  279. package/src/react/ui/modals/_internal/components/priceInput/__tests__/PriceInput.test.tsx +13 -5
  280. package/src/react/ui/modals/_internal/components/priceInput/index.tsx +41 -26
  281. package/src/react/ui/modals/_internal/components/quantityInput/__tests__/index.test.tsx +68 -59
  282. package/src/react/ui/modals/_internal/components/quantityInput/index.tsx +155 -20
  283. package/src/react/ui/modals/_internal/components/selectWaasFeeOptions/__tests__/SelectWaasFeeOptions.test.tsx +339 -40
  284. package/src/react/ui/modals/_internal/components/selectWaasFeeOptions/index.tsx +95 -101
  285. package/src/react/ui/modals/_internal/components/selectWaasFeeOptions/store.ts +72 -14
  286. package/src/react/ui/modals/_internal/components/selectWaasFeeOptions/useWaasFeeOptionManager.tsx +29 -13
  287. package/src/react/ui/modals/_internal/components/tokenPreview/index.tsx +2 -2
  288. package/src/react/ui/modals/_internal/components/transactionDetails/index.tsx +2 -2
  289. package/src/react/ui/modals/_internal/components/transactionPreview/index.tsx +88 -89
  290. package/src/react/ui/modals/_internal/components/transactionStatusModal/__tests__/TransactionStatusModal.test.tsx +36 -10
  291. package/src/react/ui/modals/_internal/components/transactionStatusModal/index.tsx +32 -20
  292. package/src/react/ui/modals/_internal/components/transactionStatusModal/store.ts +91 -62
  293. package/src/react/ui/modals/_internal/components/waasFeeOptionsSelect/WaasFeeOptionsSelect.tsx +43 -44
  294. package/src/react/ui/modals/_internal/types.ts +2 -2
  295. package/src/types/sdk-config.ts +6 -1
  296. package/src/utils/network.ts +15 -0
  297. package/test/test-utils.tsx +2 -0
  298. package/vitest.shims.d.ts +2 -0
  299. package/vitest.storybook.config.js +33 -0
  300. package/dist/CalendarIcon-DbQ7Vxcw.js.map +0 -1
  301. package/dist/_internal-BgWcRIak.js.map +0 -1
  302. package/dist/api-DTIan01C.js.map +0 -1
  303. package/dist/builder-api-C_zj5mr3.d.ts +0 -12
  304. package/dist/index-BUVWziLP.d.ts +0 -60
  305. package/dist/index-COt10OgI.d.ts +0 -24
  306. package/dist/index-DPNWNa7t.d.ts +0 -414
  307. package/dist/index-DsfCs3-x.d.ts +0 -122
  308. package/dist/index-dUb6wb4Y.d.ts +0 -22
  309. package/dist/marketplace.gen-BSDIX7NZ.js.map +0 -1
  310. package/dist/marketplaceConfig-C6X1SUik.js.map +0 -1
  311. package/dist/queries-CUU65uYZ.js.map +0 -1
  312. package/dist/react-DAIicQPT.js.map +0 -1
  313. package/dist/transaction-CcVViHEL.js.map +0 -1
  314. package/dist/utils-BPYfgDSL.js.map +0 -1
  315. package/dist/utils-CW2NA5KG.js.map +0 -1
  316. package/dist/wagmi-CDzEQbfk.js.map +0 -1
  317. package/src/react/hooks/__tests__/useGetTokenSuppliesMap.test.tsx +0 -104
  318. package/src/react/hooks/useGetTokenSuppliesMap.tsx +0 -73
  319. package/src/react/hooks/useListPrimarySaleItems.ts +0 -102
  320. package/src/react/queries/getTokenSuppliesMap.ts +0 -77
  321. package/src/react/ui/modals/TransferModal/_store.ts +0 -66
  322. package/src/react/ui/modals/_internal/components/quantityInput/QuantityInputBase.tsx +0 -166
  323. package/src/react/ui/modals/_internal/stores/accountModal.ts +0 -3
  324. /package/dist/{abi-BKyRjVcZ.js → abi-BMvgNbKQ.js} +0 -0
  325. /package/dist/{index-C39K_8SG.d.ts → index-CD2bj_xW.d.ts} +0 -0
  326. /package/dist/{options-B4QN7Xou.js → options-BBBR8u_4.js} +0 -0
@@ -0,0 +1,367 @@
1
+ import { renderHook, server, waitFor } from '@test';
2
+ import { HttpResponse, http } from 'msw';
3
+ import { afterEach, describe, expect, it } from 'vitest';
4
+ import { ContractType } from '../../_internal';
5
+ import {
6
+ mockIndexerEndpoint,
7
+ mockTokenBalance,
8
+ } from '../../_internal/api/__mocks__/indexer.msw';
9
+ import {
10
+ laosHandlers,
11
+ mockTokenBalancesResponse,
12
+ } from '../../_internal/api/__mocks__/laos.msw';
13
+ import { useBalanceOfCollectible } from '../useBalanceOfCollectible';
14
+
15
+ describe('useBalanceOfCollectible with LAOS', () => {
16
+ const defaultArgs = {
17
+ collectionAddress:
18
+ '0x1234567890123456789012345678901234567890' as `0x${string}`,
19
+ collectableId: '1',
20
+ userAddress:
21
+ '0xuser1234567890123456789012345678901234567890' as `0x${string}`,
22
+ chainId: 11155111,
23
+ };
24
+
25
+ // Mock marketplace config API response with LAOS collection
26
+ const laosMarketplaceConfigResponse = {
27
+ marketplace: {
28
+ projectId: 1,
29
+ settings: {
30
+ style: {},
31
+ publisherId: 'test-publisher',
32
+ title: 'Test Marketplace',
33
+ socials: {
34
+ twitter: '',
35
+ discord: '',
36
+ website: '',
37
+ tiktok: '',
38
+ instagram: '',
39
+ youtube: '',
40
+ },
41
+ faviconUrl: '',
42
+ walletOptions: {
43
+ walletType: 'UNIVERSAL',
44
+ oidcIssuers: {},
45
+ connectors: [],
46
+ includeEIP6963Wallets: false,
47
+ },
48
+ logoUrl: '',
49
+ fontUrl: '',
50
+ },
51
+ market: {
52
+ enabled: true,
53
+ title: 'Test Market',
54
+ bannerUrl: 'https://example.com/banner.png',
55
+ ogImage: 'https://example.com/og.png',
56
+ },
57
+ shop: {
58
+ enabled: false,
59
+ title: '',
60
+ bannerUrl: '',
61
+ ogImage: '',
62
+ },
63
+ },
64
+ marketCollections: [
65
+ {
66
+ id: 1,
67
+ projectId: 1,
68
+ chainId: 11155111,
69
+ itemsAddress: '0x1234567890123456789012345678901234567890',
70
+ contractType: ContractType.LAOS_ERC_721,
71
+ bannerUrl: 'https://example.com/banner.png',
72
+ feePercentage: 0,
73
+ currencyOptions: [],
74
+ destinationMarketplace: 'sequence_marketplace_v2',
75
+ },
76
+ {
77
+ id: 2,
78
+ projectId: 1,
79
+ chainId: 11155111,
80
+ itemsAddress: '0x9876543210987654321098765432109876543210',
81
+ contractType: ContractType.ERC721,
82
+ bannerUrl: 'https://example.com/banner2.png',
83
+ feePercentage: 0,
84
+ currencyOptions: [],
85
+ destinationMarketplace: 'sequence_marketplace_v2',
86
+ },
87
+ ],
88
+ shopCollections: [],
89
+ };
90
+
91
+ // Setup handlers for LAOS and marketplace config
92
+ afterEach(() => {
93
+ server.resetHandlers();
94
+ });
95
+
96
+ it('should use LAOS API when collection is LAOS_ERC_721', async () => {
97
+ // Add LAOS handlers and marketplace config handler
98
+ server.use(
99
+ ...laosHandlers,
100
+ http.post('*/rpc/MarketplaceService/LookupMarketplace', () => {
101
+ return HttpResponse.json(laosMarketplaceConfigResponse);
102
+ }),
103
+ );
104
+
105
+ const { result } = renderHook(() => useBalanceOfCollectible(defaultArgs));
106
+
107
+ // Initially loading
108
+ expect(result.current.isLoading).toBe(true);
109
+
110
+ // Wait for the query to complete
111
+ await waitFor(() => {
112
+ expect(result.current.isSuccess).toBe(true);
113
+ });
114
+
115
+ // Should return LAOS API response (first balance)
116
+ expect(result.current.data).toEqual(mockTokenBalancesResponse.balances[0]);
117
+ expect(result.current.data?.balance).toBe('5');
118
+ expect(result.current.data?.contractInfo?.type).toBe('LAOS-ERC-721');
119
+ });
120
+
121
+ it('should use indexer API when collection is regular ERC_721', async () => {
122
+ const regularCollectionArgs = {
123
+ ...defaultArgs,
124
+ collectionAddress:
125
+ '0x9876543210987654321098765432109876543210' as `0x${string}`,
126
+ };
127
+
128
+ server.use(
129
+ http.post('*/rpc/MarketplaceService/LookupMarketplace', () => {
130
+ return HttpResponse.json(laosMarketplaceConfigResponse);
131
+ }),
132
+ http.post(mockIndexerEndpoint('GetTokenBalances'), () => {
133
+ return HttpResponse.json({
134
+ page: { page: 1, pageSize: 10, more: false },
135
+ balances: [mockTokenBalance],
136
+ });
137
+ }),
138
+ );
139
+
140
+ const { result } = renderHook(() =>
141
+ useBalanceOfCollectible(regularCollectionArgs),
142
+ );
143
+
144
+ await waitFor(() => {
145
+ expect(result.current.isSuccess).toBe(true);
146
+ });
147
+
148
+ // Should return indexer API response
149
+ expect(result.current.data).toEqual(mockTokenBalance);
150
+ expect(result.current.data?.contractInfo?.type).toBe('ERC721');
151
+ });
152
+
153
+ it('should handle LAOS API errors gracefully', async () => {
154
+ const errorArgs = {
155
+ ...defaultArgs,
156
+ userAddress:
157
+ '0x0000000000000000000000000000000000000001' as `0x${string}`, // Special address for 500 error
158
+ };
159
+
160
+ server.use(
161
+ ...laosHandlers,
162
+ http.post('*/rpc/MarketplaceService/LookupMarketplace', () => {
163
+ return HttpResponse.json(laosMarketplaceConfigResponse);
164
+ }),
165
+ );
166
+
167
+ const { result } = renderHook(() => useBalanceOfCollectible(errorArgs));
168
+
169
+ await waitFor(() => {
170
+ expect(result.current.isError).toBe(true);
171
+ });
172
+
173
+ expect(result.current.error).toBeDefined();
174
+ });
175
+
176
+ it('should return null when LAOS API returns empty balances', async () => {
177
+ const emptyBalanceArgs = {
178
+ ...defaultArgs,
179
+ userAddress:
180
+ '0x0000000000000000000000000000000000000003' as `0x${string}`, // Special address for empty response
181
+ };
182
+
183
+ server.use(
184
+ ...laosHandlers,
185
+ http.post('*/rpc/MarketplaceService/LookupMarketplace', () => {
186
+ return HttpResponse.json(laosMarketplaceConfigResponse);
187
+ }),
188
+ );
189
+
190
+ const { result } = renderHook(() =>
191
+ useBalanceOfCollectible(emptyBalanceArgs),
192
+ );
193
+
194
+ await waitFor(() => {
195
+ expect(result.current.isSuccess).toBe(true);
196
+ });
197
+
198
+ expect(result.current.data).toBeNull();
199
+ });
200
+
201
+ it('should auto-detect LAOS from marketplace config', async () => {
202
+ server.use(
203
+ ...laosHandlers,
204
+ http.post('*/rpc/MarketplaceService/LookupMarketplace', () => {
205
+ return HttpResponse.json(laosMarketplaceConfigResponse);
206
+ }),
207
+ );
208
+
209
+ const { result } = renderHook(() => useBalanceOfCollectible(defaultArgs));
210
+
211
+ await waitFor(() => {
212
+ expect(result.current.isSuccess).toBe(true);
213
+ });
214
+
215
+ // Verify it used LAOS API (returns LAOS-specific data structure)
216
+ expect(result.current.data?.contractInfo?.type).toBe('LAOS-ERC-721');
217
+ expect(result.current.data?.tokenMetadata).toBeDefined();
218
+ });
219
+
220
+ it('should fallback to indexer when marketplace config is unavailable', async () => {
221
+ // No marketplace config handler - should fallback to indexer
222
+ server.use(
223
+ http.post(mockIndexerEndpoint('GetTokenBalances'), () => {
224
+ return HttpResponse.json({
225
+ page: { page: 1, pageSize: 10, more: false },
226
+ balances: [mockTokenBalance],
227
+ });
228
+ }),
229
+ );
230
+
231
+ const { result } = renderHook(() => useBalanceOfCollectible(defaultArgs));
232
+
233
+ await waitFor(() => {
234
+ expect(result.current.isSuccess).toBe(true);
235
+ });
236
+
237
+ // Should use indexer since no marketplace config to determine LAOS
238
+ expect(result.current.data).toEqual(mockTokenBalance);
239
+ expect(result.current.data?.contractInfo?.type).toBe('ERC721');
240
+ });
241
+
242
+ it('should handle collection not found in marketplace config', async () => {
243
+ const unknownCollectionArgs = {
244
+ ...defaultArgs,
245
+ collectionAddress:
246
+ '0x0000000000000000000000000000000000000999' as `0x${string}`, // Unknown collection
247
+ };
248
+
249
+ server.use(
250
+ http.post('*/rpc/MarketplaceService/LookupMarketplace', () => {
251
+ return HttpResponse.json(laosMarketplaceConfigResponse);
252
+ }),
253
+ http.post(mockIndexerEndpoint('GetTokenBalances'), () => {
254
+ return HttpResponse.json({
255
+ page: { page: 1, pageSize: 10, more: false },
256
+ balances: [mockTokenBalance],
257
+ });
258
+ }),
259
+ );
260
+
261
+ const { result } = renderHook(() =>
262
+ useBalanceOfCollectible(unknownCollectionArgs),
263
+ );
264
+
265
+ await waitFor(() => {
266
+ expect(result.current.isSuccess).toBe(true);
267
+ });
268
+
269
+ // Should fallback to indexer when collection not found in config
270
+ expect(result.current.data).toEqual(mockTokenBalance);
271
+ expect(result.current.data?.contractInfo?.type).toBe('ERC721');
272
+ });
273
+
274
+ it('should respect enabled query option for LAOS collections', () => {
275
+ server.use(
276
+ ...laosHandlers,
277
+ http.post('*/rpc/MarketplaceService/LookupMarketplace', () => {
278
+ return HttpResponse.json(laosMarketplaceConfigResponse);
279
+ }),
280
+ );
281
+
282
+ const { result } = renderHook(() =>
283
+ useBalanceOfCollectible({
284
+ ...defaultArgs,
285
+ query: {
286
+ enabled: false,
287
+ },
288
+ }),
289
+ );
290
+
291
+ expect(result.current.isLoading).toBe(false);
292
+ expect(result.current.data).toBeUndefined();
293
+ });
294
+
295
+ it('should handle LAOS metadata correctly', async () => {
296
+ server.use(
297
+ ...laosHandlers,
298
+ http.post('*/rpc/MarketplaceService/LookupMarketplace', () => {
299
+ return HttpResponse.json(laosMarketplaceConfigResponse);
300
+ }),
301
+ );
302
+
303
+ const { result } = renderHook(() => useBalanceOfCollectible(defaultArgs));
304
+
305
+ await waitFor(() => {
306
+ expect(result.current.isSuccess).toBe(true);
307
+ });
308
+
309
+ const balance = result.current.data;
310
+ expect(balance?.tokenMetadata).toBeDefined();
311
+ expect(balance?.tokenMetadata?.name).toBe('Test Token 1');
312
+ expect(balance?.tokenMetadata?.description).toBe(
313
+ 'A test token for LAOS testing',
314
+ );
315
+ expect(balance?.tokenMetadata?.image).toBe(
316
+ 'https://example.com/token1.png',
317
+ );
318
+ expect(balance?.tokenMetadata?.attributes).toEqual([
319
+ {
320
+ trait_type: 'Rarity',
321
+ value: 'Common',
322
+ },
323
+ ]);
324
+ });
325
+
326
+ it('should pass correct parameters to LAOS API', async () => {
327
+ let capturedRequestBody: Record<string, unknown> = {};
328
+
329
+ server.use(
330
+ http.post('*/rpc/MarketplaceService/LookupMarketplace', () => {
331
+ return HttpResponse.json(laosMarketplaceConfigResponse);
332
+ }),
333
+ http.post(
334
+ 'https://extensions.api.laosnetwork.io/token/GetTokenBalances',
335
+ async ({ request }) => {
336
+ const body = await request.json();
337
+ capturedRequestBody = body as Record<string, unknown>;
338
+ return HttpResponse.json(mockTokenBalancesResponse);
339
+ },
340
+ ),
341
+ );
342
+
343
+ const { result } = renderHook(() => useBalanceOfCollectible(defaultArgs));
344
+
345
+ await waitFor(() => {
346
+ expect(result.current.isSuccess).toBe(true);
347
+ });
348
+
349
+ // Verify LAOS API was called with correct parameters
350
+ expect(capturedRequestBody).toMatchInlineSnapshot(`
351
+ {
352
+ "accountAddress": "0xuser1234567890123456789012345678901234567890",
353
+ "chainId": "11155111",
354
+ "contractAddress": "0x1234567890123456789012345678901234567890",
355
+ "includeMetadata": true,
356
+ "page": {
357
+ "sort": [
358
+ {
359
+ "column": "CREATED_AT",
360
+ "order": "DESC",
361
+ },
362
+ ],
363
+ },
364
+ }
365
+ `);
366
+ });
367
+ });
@@ -0,0 +1,158 @@
1
+ import { renderHook, server, waitFor } from '@test';
2
+ import { HttpResponse, http } from 'msw';
3
+ import { zeroAddress } from 'viem';
4
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
5
+ import { useAccount } from 'wagmi';
6
+ import { MarketplaceKind } from '../../_internal';
7
+ import {
8
+ mockCheckoutOptions,
9
+ mockMarketplaceEndpoint,
10
+ } from '../../_internal/api/__mocks__/marketplace.msw';
11
+ import type { UseCheckoutOptionsParams } from '../useCheckoutOptions';
12
+ import { useCheckoutOptions } from '../useCheckoutOptions';
13
+
14
+ // Mock wagmi useAccount hook
15
+ vi.mock('wagmi', () => ({
16
+ useAccount: vi.fn(),
17
+ }));
18
+
19
+ const mockUseAccount = vi.mocked(useAccount);
20
+
21
+ describe('useCheckoutOptions', () => {
22
+ const defaultArgs: UseCheckoutOptionsParams = {
23
+ chainId: 1,
24
+ orders: [
25
+ {
26
+ collectionAddress: zeroAddress,
27
+ orderId: '123',
28
+ marketplace: MarketplaceKind.sequence_marketplace_v2,
29
+ },
30
+ ],
31
+ additionalFee: 0,
32
+ query: {},
33
+ };
34
+
35
+ beforeEach(() => {
36
+ mockUseAccount.mockReturnValue({
37
+ address: zeroAddress,
38
+ } as unknown as ReturnType<typeof useAccount>);
39
+ });
40
+
41
+ it('should fetch checkout options successfully', async () => {
42
+ const { result } = renderHook(() => useCheckoutOptions(defaultArgs));
43
+
44
+ // Initially loading
45
+ expect(result.current.isLoading).toBe(true);
46
+ expect(result.current.data).toBeUndefined();
47
+
48
+ // Wait for data to be loaded
49
+ await waitFor(() => {
50
+ expect(result.current.isLoading).toBe(false);
51
+ });
52
+
53
+ // Verify the data matches our mock
54
+ expect(result.current.data).toEqual(mockCheckoutOptions);
55
+ expect(result.current.error).toBeNull();
56
+ });
57
+
58
+ it('should handle error states', async () => {
59
+ // Override the handler for this test to return an error
60
+ server.use(
61
+ http.post(mockMarketplaceEndpoint('CheckoutOptionsMarketplace'), () => {
62
+ return HttpResponse.json(
63
+ { error: { message: 'Failed to fetch checkout options' } },
64
+ { status: 500 },
65
+ );
66
+ }),
67
+ );
68
+
69
+ const { result } = renderHook(() => useCheckoutOptions(defaultArgs));
70
+
71
+ await waitFor(() => {
72
+ expect(result.current.isError).toBe(true);
73
+ });
74
+
75
+ expect(result.current.error).toBeDefined();
76
+ expect(result.current.data).toBeUndefined();
77
+ });
78
+
79
+ it('should refetch when args change', async () => {
80
+ const { result, rerender } = renderHook(() =>
81
+ useCheckoutOptions(defaultArgs),
82
+ );
83
+
84
+ // Wait for initial data
85
+ await waitFor(() => {
86
+ expect(result.current.isLoading).toBe(false);
87
+ });
88
+
89
+ // Change args and rerender
90
+ const firstOrder = defaultArgs.orders?.[0];
91
+ if (!firstOrder) throw new Error('Expected defaultArgs.orders to exist');
92
+
93
+ const newArgs = {
94
+ ...defaultArgs,
95
+ orders: [
96
+ {
97
+ ...firstOrder,
98
+ orderId: '456',
99
+ },
100
+ ],
101
+ };
102
+
103
+ rerender(() => useCheckoutOptions(newArgs));
104
+
105
+ // Wait for new data
106
+ await waitFor(() => {
107
+ expect(result.current.data).toBeDefined();
108
+ });
109
+
110
+ // Verify that the query was refetched with new args
111
+ expect(result.current.data).toBeDefined();
112
+ expect(result.current.isSuccess).toBe(true);
113
+ });
114
+
115
+ it('should handle disabled query when wallet not connected', async () => {
116
+ // Mock wallet not connected
117
+ mockUseAccount.mockReturnValue({
118
+ address: undefined,
119
+ } as unknown as ReturnType<typeof useAccount>);
120
+
121
+ const { result } = renderHook(() => useCheckoutOptions(defaultArgs));
122
+
123
+ // Should not make request when wallet not connected
124
+ expect(result.current.isLoading).toBe(false);
125
+ expect(result.current.data).toBeUndefined();
126
+ expect(result.current.error).toBeNull();
127
+ });
128
+
129
+ it('should handle multiple orders', async () => {
130
+ const multiOrderArgs: UseCheckoutOptionsParams = {
131
+ chainId: 137,
132
+ orders: [
133
+ {
134
+ collectionAddress: zeroAddress,
135
+ orderId: '123',
136
+ marketplace: MarketplaceKind.sequence_marketplace_v2,
137
+ },
138
+ {
139
+ collectionAddress:
140
+ '0x1234567890123456789012345678901234567890' as `0x${string}`,
141
+ orderId: '456',
142
+ marketplace: MarketplaceKind.opensea,
143
+ },
144
+ ],
145
+ additionalFee: 100,
146
+ query: {},
147
+ };
148
+
149
+ const { result } = renderHook(() => useCheckoutOptions(multiOrderArgs));
150
+
151
+ await waitFor(() => {
152
+ expect(result.current.isLoading).toBe(false);
153
+ });
154
+
155
+ expect(result.current.data).toBeDefined();
156
+ expect(result.current.error).toBeNull();
157
+ });
158
+ });
@@ -1,17 +1,22 @@
1
1
  import { skipToken } from '@tanstack/react-query';
2
- import { renderHook, waitFor } from '@test';
2
+ import { renderHook, server, waitFor } from '@test';
3
+ import { HttpResponse, http } from 'msw';
3
4
  import type { Address } from 'viem';
5
+ import { zeroAddress } from 'viem';
4
6
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
7
+ import { useAccount } from 'wagmi';
8
+ import {
9
+ mockCheckoutOptions,
10
+ mockMarketplaceEndpoint,
11
+ } from '../../_internal/api/__mocks__/marketplace.msw';
5
12
  import { useCheckoutOptionsSalesContract } from '../useCheckoutOptionsSalesContract';
6
13
 
7
- // Mock wagmi's useAccount hook
8
- vi.mock('wagmi', async () => {
9
- const actual = await vi.importActual('wagmi');
10
- return {
11
- ...actual,
12
- useAccount: vi.fn(() => ({ address: '0xTestWallet' as Address })),
13
- };
14
- });
14
+ // Mock wagmi useAccount hook
15
+ vi.mock('wagmi', () => ({
16
+ useAccount: vi.fn(),
17
+ }));
18
+
19
+ const mockUseAccount = vi.mocked(useAccount);
15
20
 
16
21
  const mockContractAddress =
17
22
  '0x1234567890123456789012345678901234567890' as Address;
@@ -21,6 +26,9 @@ const mockCollectionAddress =
21
26
  describe('useCheckoutOptionsSalesContract', () => {
22
27
  beforeEach(() => {
23
28
  vi.clearAllMocks();
29
+ mockUseAccount.mockReturnValue({
30
+ address: zeroAddress,
31
+ } as unknown as ReturnType<typeof useAccount>);
24
32
  });
25
33
 
26
34
  afterEach(() => {
@@ -51,15 +59,8 @@ describe('useCheckoutOptionsSalesContract', () => {
51
59
  expect(result.current.isSuccess).toBe(true);
52
60
  });
53
61
 
54
- // Check the response
55
- expect(result.current.data).toEqual({
56
- options: {
57
- crypto: 'all',
58
- swap: [],
59
- nftCheckout: [],
60
- onRamp: [],
61
- },
62
- });
62
+ // Check the response matches our mock
63
+ expect(result.current.data).toEqual(mockCheckoutOptions);
63
64
  });
64
65
 
65
66
  it('should handle skipToken', () => {
@@ -96,8 +97,7 @@ describe('useCheckoutOptionsSalesContract', () => {
96
97
  expect(result.current.isSuccess).toBe(true);
97
98
  });
98
99
 
99
- expect(result.current.data).toBeDefined();
100
- expect(result.current.data?.options).toBeDefined();
100
+ expect(result.current.data).toEqual(mockCheckoutOptions);
101
101
  });
102
102
 
103
103
  it('should refetch when args change', async () => {
@@ -135,23 +135,16 @@ describe('useCheckoutOptionsSalesContract', () => {
135
135
  expect(result.current.data).toEqual(firstData);
136
136
  });
137
137
 
138
- it('should use wallet address from useAccount', async () => {
139
- const { useAccount } = await import('wagmi');
140
- const mockUseAccount = vi.mocked(useAccount);
141
-
142
- // Set a specific address
143
- mockUseAccount.mockReturnValue({
144
- address: '0xSpecificWallet' as Address,
145
- isConnected: true,
146
- isConnecting: false,
147
- isDisconnected: false,
148
- isReconnecting: false,
149
- connector: null,
150
- addresses: undefined,
151
- chain: undefined,
152
- chainId: undefined,
153
- status: 'connected',
154
- } as unknown as ReturnType<typeof useAccount>);
138
+ it('should handle error states', async () => {
139
+ // Override the handler for this test to return an error
140
+ server.use(
141
+ http.post(mockMarketplaceEndpoint('CheckoutOptionsSalesContract'), () => {
142
+ return HttpResponse.json(
143
+ { error: { message: 'Failed to fetch checkout options' } },
144
+ { status: 500 },
145
+ );
146
+ }),
147
+ );
155
148
 
156
149
  const { result } = renderHook(() =>
157
150
  useCheckoutOptionsSalesContract({
@@ -163,28 +156,17 @@ describe('useCheckoutOptionsSalesContract', () => {
163
156
  );
164
157
 
165
158
  await waitFor(() => {
166
- expect(result.current.isSuccess).toBe(true);
159
+ expect(result.current.isError).toBe(true);
167
160
  });
168
161
 
169
- expect(result.current.data).toBeDefined();
162
+ expect(result.current.error).toBeDefined();
163
+ expect(result.current.data).toBeUndefined();
170
164
  });
171
165
 
172
166
  it('should handle when wallet is not connected', async () => {
173
- const { useAccount } = await import('wagmi');
174
- const mockUseAccount = vi.mocked(useAccount);
175
-
176
- // No wallet connected
167
+ // Mock wallet not connected for this test
177
168
  mockUseAccount.mockReturnValue({
178
169
  address: undefined,
179
- isConnected: false,
180
- isConnecting: false,
181
- isDisconnected: true,
182
- isReconnecting: false,
183
- connector: null,
184
- addresses: undefined,
185
- chain: undefined,
186
- chainId: undefined,
187
- status: 'disconnected',
188
170
  } as unknown as ReturnType<typeof useAccount>);
189
171
 
190
172
  const { result } = renderHook(() =>
@@ -196,14 +178,10 @@ describe('useCheckoutOptionsSalesContract', () => {
196
178
  }),
197
179
  );
198
180
 
199
- // The hook will still try to fetch even without a wallet (using undefined)
200
- // Wait for it to complete
201
- await waitFor(() => {
202
- expect(result.current.isSuccess).toBe(true);
203
- });
204
-
205
- // The API should still return data even without wallet
206
- expect(result.current.data).toBeDefined();
181
+ // Should not make request when wallet not connected
182
+ expect(result.current.isLoading).toBe(false);
183
+ expect(result.current.data).toBeUndefined();
184
+ expect(result.current.error).toBeNull();
207
185
  });
208
186
 
209
187
  it('should handle empty items array', async () => {
@@ -216,10 +194,9 @@ describe('useCheckoutOptionsSalesContract', () => {
216
194
  }),
217
195
  );
218
196
 
219
- await waitFor(() => {
220
- expect(result.current.isSuccess).toBe(true);
221
- });
222
-
223
- expect(result.current.data).toBeDefined();
197
+ // Should not make request when items array is empty
198
+ expect(result.current.isLoading).toBe(false);
199
+ expect(result.current.data).toBeUndefined();
200
+ expect(result.current.error).toBeNull();
224
201
  });
225
202
  });