@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,85 @@
1
+ import { queryOptions } from '@tanstack/react-query';
2
+ import type { Address } from 'viem';
3
+ import type { SdkConfig } from '../../types';
4
+ import type { MarketplaceKind } from '../_internal';
5
+ import { getMarketplaceClient, type ValuesOptional } from '../_internal';
6
+ import type {
7
+ CheckoutOptionsMarketplaceArgs,
8
+ CheckoutOptionsMarketplaceReturn,
9
+ } from '../_internal/api/marketplace.gen';
10
+ import type { StandardQueryOptions } from '../types/query';
11
+
12
+ export interface FetchCheckoutOptionsParams
13
+ extends Omit<
14
+ CheckoutOptionsMarketplaceArgs,
15
+ 'chainId' | 'wallet' | 'orders'
16
+ > {
17
+ chainId: number;
18
+ walletAddress: Address;
19
+ orders: Array<{
20
+ collectionAddress: string;
21
+ orderId: string;
22
+ marketplace: MarketplaceKind;
23
+ }>;
24
+ config: SdkConfig;
25
+ }
26
+
27
+ /**
28
+ * Fetches checkout options from the Marketplace API
29
+ */
30
+ export async function fetchCheckoutOptions(
31
+ params: FetchCheckoutOptionsParams,
32
+ ): Promise<CheckoutOptionsMarketplaceReturn> {
33
+ const { chainId, walletAddress, orders, config, additionalFee } = params;
34
+
35
+ const client = getMarketplaceClient(config);
36
+
37
+ const apiArgs: CheckoutOptionsMarketplaceArgs = {
38
+ chainId: String(chainId),
39
+ wallet: walletAddress,
40
+ orders: orders.map((order) => ({
41
+ contractAddress: order.collectionAddress,
42
+ orderId: order.orderId,
43
+ marketplace: order.marketplace,
44
+ })),
45
+ additionalFee: additionalFee ?? 0,
46
+ };
47
+
48
+ const result = await client.checkoutOptionsMarketplace(apiArgs);
49
+ return result;
50
+ }
51
+
52
+ export type CheckoutOptionsQueryOptions =
53
+ ValuesOptional<FetchCheckoutOptionsParams> & {
54
+ query?: StandardQueryOptions;
55
+ };
56
+
57
+ export function checkoutOptionsQueryOptions(
58
+ params: CheckoutOptionsQueryOptions,
59
+ ) {
60
+ const enabled = Boolean(
61
+ params.chainId &&
62
+ params.walletAddress &&
63
+ params.orders?.length &&
64
+ params.config &&
65
+ (params.query?.enabled ?? true),
66
+ );
67
+
68
+ return queryOptions({
69
+ queryKey: ['checkout', 'options', params],
70
+ queryFn: () =>
71
+ fetchCheckoutOptions({
72
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
73
+ chainId: params.chainId!,
74
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
75
+ walletAddress: params.walletAddress!,
76
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
77
+ orders: params.orders!,
78
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
79
+ config: params.config!,
80
+ additionalFee: params.additionalFee ?? 0,
81
+ }),
82
+ ...params.query,
83
+ enabled,
84
+ });
85
+ }
@@ -0,0 +1,89 @@
1
+ import { queryOptions } from '@tanstack/react-query';
2
+ import type { Address } from 'viem';
3
+ import type { SdkConfig } from '../../types';
4
+ import { getMarketplaceClient, type ValuesOptional } from '../_internal';
5
+ import type {
6
+ CheckoutOptionsItem,
7
+ CheckoutOptionsSalesContractArgs,
8
+ CheckoutOptionsSalesContractReturn,
9
+ } from '../_internal/api/marketplace.gen';
10
+ import type { StandardQueryOptions } from '../types/query';
11
+
12
+ export interface FetchCheckoutOptionsSalesContractParams
13
+ extends Omit<CheckoutOptionsSalesContractArgs, 'chainId' | 'wallet'> {
14
+ chainId: number;
15
+ walletAddress: Address;
16
+ contractAddress: string;
17
+ collectionAddress: string;
18
+ items: Array<CheckoutOptionsItem>;
19
+ config: SdkConfig;
20
+ }
21
+
22
+ /**
23
+ * Fetches checkout options for sales contract from the Marketplace API
24
+ */
25
+ export async function fetchCheckoutOptionsSalesContract(
26
+ params: FetchCheckoutOptionsSalesContractParams,
27
+ ): Promise<CheckoutOptionsSalesContractReturn> {
28
+ const {
29
+ chainId,
30
+ walletAddress,
31
+ contractAddress,
32
+ collectionAddress,
33
+ items,
34
+ config,
35
+ } = params;
36
+
37
+ const client = getMarketplaceClient(config);
38
+
39
+ const apiArgs: CheckoutOptionsSalesContractArgs = {
40
+ chainId: String(chainId),
41
+ wallet: walletAddress,
42
+ contractAddress,
43
+ collectionAddress,
44
+ items,
45
+ };
46
+
47
+ const result = await client.checkoutOptionsSalesContract(apiArgs);
48
+ return result;
49
+ }
50
+
51
+ export type CheckoutOptionsSalesContractQueryOptions =
52
+ ValuesOptional<FetchCheckoutOptionsSalesContractParams> & {
53
+ query?: StandardQueryOptions;
54
+ };
55
+
56
+ export function checkoutOptionsSalesContractQueryOptions(
57
+ params: CheckoutOptionsSalesContractQueryOptions,
58
+ ) {
59
+ const enabled = Boolean(
60
+ params.chainId &&
61
+ params.walletAddress &&
62
+ params.contractAddress &&
63
+ params.collectionAddress &&
64
+ params.items?.length &&
65
+ params.config &&
66
+ (params.query?.enabled ?? true),
67
+ );
68
+
69
+ return queryOptions({
70
+ queryKey: ['checkout', 'options', 'salesContract', params],
71
+ queryFn: () =>
72
+ fetchCheckoutOptionsSalesContract({
73
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
74
+ chainId: params.chainId!,
75
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
76
+ walletAddress: params.walletAddress!,
77
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
78
+ contractAddress: params.contractAddress!,
79
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
80
+ collectionAddress: params.collectionAddress!,
81
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
82
+ items: params.items!,
83
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
84
+ config: params.config!,
85
+ }),
86
+ ...params.query,
87
+ enabled,
88
+ });
89
+ }
@@ -0,0 +1,92 @@
1
+ import type { GetTokenBalancesDetailsReturn } from '@0xsequence/indexer';
2
+ import { queryOptions } from '@tanstack/react-query';
3
+ import type { Address } from 'viem';
4
+ import type { SdkConfig } from '../../types';
5
+ import { getIndexerClient, type ValuesOptional } from '../_internal';
6
+ import type { StandardQueryOptions } from '../types/query';
7
+
8
+ export interface CollectionBalanceFilter {
9
+ accountAddresses: Array<Address>;
10
+ contractWhitelist?: Array<Address>;
11
+ omitNativeBalances: boolean;
12
+ }
13
+
14
+ export interface FetchCollectionBalanceDetailsParams {
15
+ chainId: number;
16
+ filter: CollectionBalanceFilter;
17
+ config: SdkConfig;
18
+ }
19
+
20
+ /**
21
+ * Fetches detailed balance information for multiple accounts from the Indexer API
22
+ */
23
+ export async function fetchCollectionBalanceDetails(
24
+ params: FetchCollectionBalanceDetailsParams,
25
+ ): Promise<GetTokenBalancesDetailsReturn> {
26
+ const { chainId, filter, config } = params;
27
+
28
+ const indexerClient = getIndexerClient(chainId, config);
29
+
30
+ const promises = filter.accountAddresses.map((accountAddress) =>
31
+ indexerClient.getTokenBalancesDetails({
32
+ filter: {
33
+ accountAddresses: [accountAddress],
34
+ contractWhitelist: filter.contractWhitelist,
35
+ omitNativeBalances: filter.omitNativeBalances,
36
+ },
37
+ }),
38
+ );
39
+
40
+ const responses = await Promise.all(promises);
41
+ const mergedResponse = responses.reduce<GetTokenBalancesDetailsReturn>(
42
+ (acc, curr) => {
43
+ if (!curr) return acc;
44
+ return {
45
+ page: curr.page,
46
+ nativeBalances: [
47
+ ...(acc.nativeBalances || []),
48
+ ...(curr.nativeBalances || []),
49
+ ],
50
+ balances: [...(acc.balances || []), ...(curr.balances || [])],
51
+ };
52
+ },
53
+ { page: {}, nativeBalances: [], balances: [] },
54
+ );
55
+
56
+ if (!mergedResponse) {
57
+ throw new Error('Failed to fetch collection balance details');
58
+ }
59
+
60
+ return mergedResponse;
61
+ }
62
+
63
+ export type CollectionBalanceDetailsQueryOptions =
64
+ ValuesOptional<FetchCollectionBalanceDetailsParams> & {
65
+ query?: StandardQueryOptions;
66
+ };
67
+
68
+ export function collectionBalanceDetailsQueryOptions(
69
+ params: CollectionBalanceDetailsQueryOptions,
70
+ ) {
71
+ const enabled = Boolean(
72
+ params.chainId &&
73
+ params.filter?.accountAddresses?.length &&
74
+ params.config &&
75
+ (params.query?.enabled ?? true),
76
+ );
77
+
78
+ return queryOptions({
79
+ queryKey: ['balances', 'collectionBalanceDetails', params],
80
+ queryFn: () =>
81
+ fetchCollectionBalanceDetails({
82
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
83
+ chainId: params.chainId!,
84
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
85
+ filter: params.filter!,
86
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
87
+ config: params.config!,
88
+ }),
89
+ ...params.query,
90
+ enabled,
91
+ });
92
+ }
@@ -0,0 +1,108 @@
1
+ import { queryOptions } from '@tanstack/react-query';
2
+ import type { Address } from 'viem';
3
+ import type { SdkConfig } from '../../types';
4
+ import type { ValuesOptional } from '../_internal';
5
+ import type { StandardQueryOptions } from '../types/query';
6
+ import { fetchConvertPriceToUSD } from './convertPriceToUSD';
7
+
8
+ export interface FetchComparePricesParams {
9
+ chainId: number;
10
+ // First price details
11
+ priceAmountRaw: string;
12
+ priceCurrencyAddress: Address;
13
+ // Second price details (to compare against)
14
+ compareToPriceAmountRaw: string;
15
+ compareToPriceCurrencyAddress: Address;
16
+ config: SdkConfig;
17
+ }
18
+
19
+ export type ComparePricesReturn = {
20
+ percentageDifference: number;
21
+ percentageDifferenceFormatted: string;
22
+ status: 'above' | 'same' | 'below';
23
+ };
24
+
25
+ /**
26
+ * Compares prices between different currencies by converting both to USD
27
+ */
28
+ export async function fetchComparePrices(
29
+ params: FetchComparePricesParams,
30
+ ): Promise<ComparePricesReturn> {
31
+ const {
32
+ chainId,
33
+ priceAmountRaw,
34
+ priceCurrencyAddress,
35
+ compareToPriceAmountRaw,
36
+ compareToPriceCurrencyAddress,
37
+ config,
38
+ } = params;
39
+
40
+ const [priceUSD, compareToPriceUSD] = await Promise.all([
41
+ fetchConvertPriceToUSD({
42
+ chainId,
43
+ currencyAddress: priceCurrencyAddress,
44
+ amountRaw: priceAmountRaw,
45
+ config,
46
+ }),
47
+ fetchConvertPriceToUSD({
48
+ chainId,
49
+ currencyAddress: compareToPriceCurrencyAddress,
50
+ amountRaw: compareToPriceAmountRaw,
51
+ config,
52
+ }),
53
+ ]);
54
+
55
+ const difference = priceUSD.usdAmount - compareToPriceUSD.usdAmount;
56
+
57
+ if (compareToPriceUSD.usdAmount === 0) {
58
+ throw new Error('Cannot compare to zero price');
59
+ }
60
+
61
+ const percentageDifference = (difference / compareToPriceUSD.usdAmount) * 100;
62
+ const isAbove = percentageDifference > 0;
63
+ const isSame = percentageDifference === 0;
64
+
65
+ return {
66
+ percentageDifference,
67
+ percentageDifferenceFormatted: Math.abs(percentageDifference).toFixed(2),
68
+ status: isAbove ? 'above' : isSame ? 'same' : 'below',
69
+ };
70
+ }
71
+
72
+ export type ComparePricesQueryOptions =
73
+ ValuesOptional<FetchComparePricesParams> & {
74
+ query?: StandardQueryOptions;
75
+ };
76
+
77
+ export function comparePricesQueryOptions(params: ComparePricesQueryOptions) {
78
+ const enabled = Boolean(
79
+ params.chainId &&
80
+ params.priceAmountRaw &&
81
+ params.priceCurrencyAddress &&
82
+ params.compareToPriceAmountRaw &&
83
+ params.compareToPriceCurrencyAddress &&
84
+ params.config &&
85
+ (params.query?.enabled ?? true),
86
+ );
87
+
88
+ return queryOptions({
89
+ queryKey: ['currency', 'conversion', 'compare', params],
90
+ queryFn: () =>
91
+ fetchComparePrices({
92
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
93
+ chainId: params.chainId!,
94
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
95
+ priceAmountRaw: params.priceAmountRaw!,
96
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
97
+ priceCurrencyAddress: params.priceCurrencyAddress!,
98
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
99
+ compareToPriceAmountRaw: params.compareToPriceAmountRaw!,
100
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
101
+ compareToPriceCurrencyAddress: params.compareToPriceCurrencyAddress!,
102
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
103
+ config: params.config!,
104
+ }),
105
+ ...params.query,
106
+ enabled,
107
+ });
108
+ }
@@ -0,0 +1,92 @@
1
+ import { queryOptions } from '@tanstack/react-query';
2
+ import { type Address, formatUnits } from 'viem';
3
+ import type { SdkConfig } from '../../types';
4
+ import {
5
+ type Currency,
6
+ getQueryClient,
7
+ type ValuesOptional,
8
+ } from '../_internal';
9
+ import type { StandardQueryOptions } from '../types/query';
10
+ import { marketCurrenciesQueryOptions } from './marketCurrencies';
11
+
12
+ export interface FetchConvertPriceToUSDParams {
13
+ chainId: number;
14
+ currencyAddress: Address;
15
+ amountRaw: string;
16
+ config: SdkConfig;
17
+ }
18
+
19
+ export interface ConvertPriceToUSDReturn {
20
+ usdAmount: number;
21
+ usdAmountFormatted: string;
22
+ }
23
+
24
+ /**
25
+ * Converts a price amount from a specific currency to USD using exchange rates
26
+ */
27
+ export async function fetchConvertPriceToUSD(
28
+ params: FetchConvertPriceToUSDParams,
29
+ ): Promise<ConvertPriceToUSDReturn> {
30
+ const { chainId, currencyAddress, amountRaw, config } = params;
31
+
32
+ const queryClient = getQueryClient();
33
+ const currencies = (await queryClient.fetchQuery(
34
+ marketCurrenciesQueryOptions({
35
+ chainId,
36
+ config,
37
+ }),
38
+ )) as Currency[];
39
+
40
+ const currencyDetails = currencies.find(
41
+ (c: Currency) =>
42
+ c.contractAddress.toLowerCase() === currencyAddress.toLowerCase(),
43
+ );
44
+
45
+ if (!currencyDetails) {
46
+ throw new Error('Currency not found');
47
+ }
48
+
49
+ const amountDecimal = Number(
50
+ formatUnits(BigInt(amountRaw), currencyDetails.decimals),
51
+ );
52
+ const usdAmount = amountDecimal * currencyDetails.exchangeRate;
53
+
54
+ return {
55
+ usdAmount,
56
+ usdAmountFormatted: usdAmount.toFixed(2),
57
+ };
58
+ }
59
+
60
+ export type ConvertPriceToUSDQueryOptions =
61
+ ValuesOptional<FetchConvertPriceToUSDParams> & {
62
+ query?: StandardQueryOptions;
63
+ };
64
+
65
+ export function convertPriceToUSDQueryOptions(
66
+ params: ConvertPriceToUSDQueryOptions,
67
+ ) {
68
+ const enabled = Boolean(
69
+ params.chainId &&
70
+ params.currencyAddress &&
71
+ params.amountRaw &&
72
+ params.config &&
73
+ (params.query?.enabled ?? true),
74
+ );
75
+
76
+ return queryOptions({
77
+ queryKey: ['currency', 'convertPriceToUSD', params],
78
+ queryFn: () =>
79
+ fetchConvertPriceToUSD({
80
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
81
+ chainId: params.chainId!,
82
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
83
+ currencyAddress: params.currencyAddress!,
84
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
85
+ amountRaw: params.amountRaw!,
86
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
87
+ config: params.config!,
88
+ }),
89
+ ...params.query,
90
+ enabled,
91
+ });
92
+ }
@@ -0,0 +1,138 @@
1
+ import type { PropertyFilter } from '@0xsequence/metadata';
2
+ import { queryOptions } from '@tanstack/react-query';
3
+ import { FilterCondition, type SdkConfig } from '../../types';
4
+ import { compareAddress } from '../../utils';
5
+ import {
6
+ getMetadataClient,
7
+ getQueryClient,
8
+ type ValuesOptional,
9
+ } from '../_internal';
10
+ import type { StandardQueryOptions } from '../types/query';
11
+ import { marketplaceConfigOptions } from './marketplaceConfig';
12
+
13
+ export interface FetchFiltersParams {
14
+ chainId: number;
15
+ collectionAddress: string;
16
+ showAllFilters?: boolean;
17
+ excludePropertyValues?: boolean;
18
+ config: SdkConfig;
19
+ }
20
+
21
+ /**
22
+ * Fetches collection filters from the Metadata API with optional marketplace filtering
23
+ */
24
+ export async function fetchFilters(
25
+ params: FetchFiltersParams,
26
+ ): Promise<PropertyFilter[]> {
27
+ const {
28
+ chainId,
29
+ collectionAddress,
30
+ showAllFilters,
31
+ excludePropertyValues,
32
+ config,
33
+ } = params;
34
+
35
+ const metadataClient = getMetadataClient(config);
36
+
37
+ const filters = await metadataClient
38
+ .getTokenMetadataPropertyFilters({
39
+ chainID: chainId.toString(),
40
+ contractAddress: collectionAddress,
41
+ excludeProperties: [],
42
+ excludePropertyValues,
43
+ })
44
+ .then((resp) => resp.filters);
45
+
46
+ if (showAllFilters) return filters;
47
+
48
+ const queryClient = getQueryClient();
49
+ const marketplaceConfig = await queryClient.fetchQuery(
50
+ marketplaceConfigOptions(config),
51
+ );
52
+ const collectionFilters = marketplaceConfig.market.collections.find((c) =>
53
+ compareAddress(c.itemsAddress, collectionAddress),
54
+ )?.filterSettings;
55
+
56
+ if (
57
+ !collectionFilters?.exclusions ||
58
+ collectionFilters.exclusions.length === 0 ||
59
+ !collectionFilters.filterOrder ||
60
+ collectionFilters.filterOrder.length === 0
61
+ )
62
+ return filters;
63
+
64
+ const { filterOrder, exclusions } = collectionFilters;
65
+
66
+ const sortedFilters = filters.toSorted((a, b) => {
67
+ const aIndex =
68
+ filterOrder.indexOf(a.name) > -1
69
+ ? filterOrder.indexOf(a.name)
70
+ : filterOrder.length;
71
+ const bIndex =
72
+ filterOrder.indexOf(b.name) > -1
73
+ ? filterOrder.indexOf(b.name)
74
+ : filterOrder.length;
75
+ return aIndex - bIndex;
76
+ });
77
+
78
+ const filteredResults = sortedFilters.reduce<PropertyFilter[]>(
79
+ (acc, filter) => {
80
+ const exclusionRule = exclusions.find((rule) => rule.key === filter.name);
81
+
82
+ if (!exclusionRule) {
83
+ acc.push(filter);
84
+ return acc;
85
+ }
86
+
87
+ if (exclusionRule.condition === FilterCondition.ENTIRE_KEY) {
88
+ return acc;
89
+ }
90
+
91
+ if (
92
+ exclusionRule.condition === FilterCondition.SPECIFIC_VALUE &&
93
+ exclusionRule.value
94
+ ) {
95
+ const filteredValues =
96
+ filter.values?.filter((value) => value !== exclusionRule.value) || [];
97
+ if (filteredValues.length > 0) {
98
+ acc.push({ ...filter, values: filteredValues });
99
+ }
100
+ }
101
+
102
+ return acc;
103
+ },
104
+ [],
105
+ );
106
+
107
+ return filteredResults;
108
+ }
109
+
110
+ export type FiltersQueryOptions = ValuesOptional<FetchFiltersParams> & {
111
+ query?: StandardQueryOptions;
112
+ };
113
+
114
+ export function filtersQueryOptions(params: FiltersQueryOptions) {
115
+ const enabled = Boolean(
116
+ params.chainId &&
117
+ params.collectionAddress &&
118
+ params.config &&
119
+ (params.query?.enabled ?? true),
120
+ );
121
+
122
+ return queryOptions({
123
+ queryKey: ['filters', params],
124
+ queryFn: () =>
125
+ fetchFilters({
126
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
127
+ chainId: params.chainId!,
128
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
129
+ collectionAddress: params.collectionAddress!,
130
+ showAllFilters: params.showAllFilters,
131
+ excludePropertyValues: params.excludePropertyValues,
132
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
133
+ config: params.config!,
134
+ }),
135
+ ...params.query,
136
+ enabled,
137
+ });
138
+ }
@@ -0,0 +1,62 @@
1
+ import type { GetTokenIDRangesReturn } from '@0xsequence/indexer';
2
+ import { queryOptions } from '@tanstack/react-query';
3
+ import type { Address } from 'viem';
4
+ import type { SdkConfig } from '../../types';
5
+ import { getIndexerClient, type ValuesOptional } from '../_internal';
6
+ import type { StandardQueryOptions } from '../types/query';
7
+
8
+ export interface FetchGetTokenRangesParams {
9
+ chainId: number;
10
+ collectionAddress: Address;
11
+ config: SdkConfig;
12
+ }
13
+
14
+ /**
15
+ * Fetches token ID ranges for a collection from the Indexer API
16
+ */
17
+ export async function fetchGetTokenRanges(
18
+ params: FetchGetTokenRangesParams,
19
+ ): Promise<GetTokenIDRangesReturn> {
20
+ const { chainId, collectionAddress, config } = params;
21
+
22
+ const indexerClient = getIndexerClient(chainId, config);
23
+
24
+ const response = await indexerClient.getTokenIDRanges({
25
+ contractAddress: collectionAddress,
26
+ });
27
+
28
+ if (!response) {
29
+ throw new Error('Failed to fetch token ranges');
30
+ }
31
+
32
+ return response;
33
+ }
34
+
35
+ export type GetTokenRangesQueryOptions =
36
+ ValuesOptional<FetchGetTokenRangesParams> & {
37
+ query?: StandardQueryOptions;
38
+ };
39
+
40
+ export function getTokenRangesQueryOptions(params: GetTokenRangesQueryOptions) {
41
+ const enabled = Boolean(
42
+ params.chainId &&
43
+ params.collectionAddress &&
44
+ params.config &&
45
+ (params.query?.enabled ?? true),
46
+ );
47
+
48
+ return queryOptions({
49
+ queryKey: ['indexer', 'tokenRanges', params],
50
+ queryFn: () =>
51
+ fetchGetTokenRanges({
52
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
53
+ chainId: params.chainId!,
54
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
55
+ collectionAddress: params.collectionAddress!,
56
+ // biome-ignore lint/style/noNonNullAssertion: The enabled check above ensures these are not undefined
57
+ config: params.config!,
58
+ }),
59
+ ...params.query,
60
+ enabled,
61
+ });
62
+ }
@@ -2,11 +2,14 @@ export * from './balanceOfCollectible';
2
2
  export * from './collectible';
3
3
  export * from './collectionDetails';
4
4
  export * from './countOfPrimarySaleItems';
5
+ export * from './currency';
5
6
  export * from './floorOrder';
6
7
  export * from './highestOffer';
7
8
  export * from './inventory';
8
9
  export * from './listBalances';
9
10
  export * from './listCollectibles';
11
+ export * from './listCollections';
10
12
  export * from './listTokenMetadata';
11
13
  export * from './lowestListing';
12
14
  export * from './marketCurrencies';
15
+ export * from './tokenSupplies';
@@ -38,6 +38,11 @@ interface InventoryState {
38
38
  // Store state per collection
39
39
  const stateByCollection = new Map<string, InventoryState>();
40
40
 
41
+ // Test helper to clear state between tests
42
+ export const clearInventoryState = () => {
43
+ stateByCollection.clear();
44
+ };
45
+
41
46
  const getCollectionKey = (args: UseInventoryArgs) =>
42
47
  `${args.chainId}-${args.collectionAddress}-${args.accountAddress}`;
43
48
 
@@ -105,6 +110,7 @@ async function fetchAllIndexerTokens(
105
110
  chainId: chainId.toString(),
106
111
  accountAddress,
107
112
  includeMetadata: true,
113
+ contractAddress: collectionAddress,
108
114
  page: {
109
115
  sort: [
110
116
  {