@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.
- package/.storybook/main.ts +63 -0
- package/.storybook/preview.ts +24 -0
- package/.storybook/vitest.setup.ts +6 -0
- package/CHANGELOG.md +77 -8
- package/dist/{CalendarIcon-DbQ7Vxcw.js → CalendarIcon-CqsuAuCm.js} +4 -51
- package/dist/CalendarIcon-CqsuAuCm.js.map +1 -0
- package/dist/{CollectibleCard-C8Ae64Ab.d.ts → CollectibleCard-Dd-CG6dE.d.ts} +8 -7
- package/dist/InfoIcon-v0w_Lu7t.js +53 -0
- package/dist/InfoIcon-v0w_Lu7t.js.map +1 -0
- package/dist/{_internal-BgWcRIak.js → _internal-C75gOSNo.js} +2 -10
- package/dist/_internal-C75gOSNo.js.map +1 -0
- package/dist/actionModal-CMUeVsFX.js +116 -0
- package/dist/actionModal-CMUeVsFX.js.map +1 -0
- package/dist/{alien_swap-B_76IMma.js → alien_swap-CYv6YlOF.js} +1 -1
- package/dist/{alien_swap-B_76IMma.js.map → alien_swap-CYv6YlOF.js.map} +1 -1
- package/dist/{api-DTIan01C.js → api-BiMGqWdz.js} +17 -34
- package/dist/api-BiMGqWdz.js.map +1 -0
- package/dist/{aqua-xyz-CMN_TFY5.js → aqua-xyz-Bzn5baeH.js} +1 -1
- package/dist/{aqua-xyz-CMN_TFY5.js.map → aqua-xyz-Bzn5baeH.js.map} +1 -1
- package/dist/{aura-Cye_TuHj.js → aura-DzIWh8WT.js} +1 -1
- package/dist/{aura-Cye_TuHj.js.map → aura-DzIWh8WT.js.map} +1 -1
- package/dist/base-DqaJPvfN.js +22 -0
- package/dist/base-DqaJPvfN.js.map +1 -0
- package/dist/{blur-DWDMyMpK.js → blur-DSH-Cbpj.js} +1 -1
- package/dist/{blur-DWDMyMpK.js.map → blur-DSH-Cbpj.js.map} +1 -1
- package/dist/{coinbase-ByA_XRB0.js → coinbase-Df8URNxq.js} +1 -1
- package/dist/{coinbase-ByA_XRB0.js.map → coinbase-Df8URNxq.js.map} +1 -1
- package/dist/{new-marketplace-types-Bfis0U4J.d.ts → create-config-DKJ-F0jc.d.ts} +402 -41
- package/dist/{wagmi-CDzEQbfk.js → create-config-fQ-jbJD1.js} +20 -10
- package/dist/create-config-fQ-jbJD1.js.map +1 -0
- package/dist/{element-b77CyXIZ.js → element-Cx6uJu5N.js} +1 -1
- package/dist/{element-b77CyXIZ.js.map → element-Cx6uJu5N.js.map} +1 -1
- package/dist/{foundation-DbOrKP9Y.js → foundation-D6U4aRLN.js} +1 -1
- package/dist/{foundation-DbOrKP9Y.js.map → foundation-D6U4aRLN.js.map} +1 -1
- package/dist/get-provider-CYYHfrlg.js +10 -0
- package/dist/get-provider-CYYHfrlg.js.map +1 -0
- package/dist/get-query-client-D19vvfJo.js +23 -0
- package/dist/get-query-client-D19vvfJo.js.map +1 -0
- package/dist/hooks-4pxIbLbM.js +4044 -0
- package/dist/hooks-4pxIbLbM.js.map +1 -0
- package/dist/{index-BL9RUSEK.d.ts → index-136YrWDH.d.ts} +1 -1
- package/dist/{index-D5v5iluA.d.ts → index-BAhaEfqY.d.ts} +1 -1
- package/dist/index-BKBin-rq.d.ts +979 -0
- package/dist/{index-BQsgAvtX.d.ts → index-BUWB_RXp.d.ts} +776 -570
- package/dist/{index-21LE7OhL.d.ts → index-BhVFc2rX.d.ts} +6 -3
- package/dist/{index-DXMfTZ1F.d.ts → index-C5aqo8xu.d.ts} +1 -1
- package/dist/{index-ByznONYE.d.ts → index-CKrYP7ot.d.ts} +20 -48
- package/dist/{index-DaE5ZNHb.d.ts → index-CUwMH7Ht.d.ts} +5 -5
- package/dist/{index-CLy8y5hm.d.ts → index-Cu70Lw-w.d.ts} +1 -1
- package/dist/index.css +414 -1
- package/dist/index.d.ts +8 -10
- package/dist/index.js +13 -9
- package/dist/{looks-rare-C1VqNcSM.js → looks-rare-ChBRBY-p.js} +1 -1
- package/dist/{looks-rare-C1VqNcSM.js.map → looks-rare-ChBRBY-p.js.map} +1 -1
- package/dist/{magic-eden-ea_AGCZr.js → magic-eden-D5U7N1xL.js} +1 -1
- package/dist/{magic-eden-ea_AGCZr.js.map → magic-eden-D5U7N1xL.js.map} +1 -1
- package/dist/{manifold-8y8J2sjT.js → manifold-CtLF52zU.js} +1 -1
- package/dist/{manifold-8y8J2sjT.js.map → manifold-CtLF52zU.js.map} +1 -1
- package/dist/{marketplace-nwnZv9Cb.js → marketplace-DmFiyBoS.js} +1 -1
- package/dist/{marketplace-nwnZv9Cb.js.map → marketplace-DmFiyBoS.js.map} +1 -1
- package/dist/{marketplace-logos-CSeGcPW4.js → marketplace-logos-Cd6W-qOq.js} +21 -21
- package/dist/{marketplace-logos-CSeGcPW4.js.map → marketplace-logos-Cd6W-qOq.js.map} +1 -1
- package/dist/{marketplace.gen-BSDIX7NZ.js → marketplace.gen-HpnpL5xU.js} +3 -3
- package/dist/marketplace.gen-HpnpL5xU.js.map +1 -0
- package/dist/{marketplaceConfig-C6X1SUik.js → marketplaceConfig-GQTTmihy.js} +3 -3
- package/dist/marketplaceConfig-GQTTmihy.js.map +1 -0
- package/dist/{mintify-LA68TzWg.js → mintify-Bi3Bce68.js} +1 -1
- package/dist/{mintify-LA68TzWg.js.map → mintify-Bi3Bce68.js.map} +1 -1
- package/dist/network-CGD0oKtS.js +15 -0
- package/dist/network-CGD0oKtS.js.map +1 -0
- package/dist/{nftx-D3Tc8nzd.js → nftx-BDQZjtkX.js} +1 -1
- package/dist/{nftx-D3Tc8nzd.js.map → nftx-BDQZjtkX.js.map} +1 -1
- package/dist/{okx-hbqg6oIJ.js → okx-D4meadLe.js} +1 -1
- package/dist/{okx-hbqg6oIJ.js.map → okx-D4meadLe.js.map} +1 -1
- package/dist/{open-sea-BccuK8-t.js → open-sea-DN0hgfVw.js} +1 -1
- package/dist/{open-sea-BccuK8-t.js.map → open-sea-DN0hgfVw.js.map} +1 -1
- package/dist/{primary-sale-C55ALnfQ.js → primary-sale-CmWxSfFQ.js} +1 -1
- package/dist/{primary-sale-C55ALnfQ.js.map → primary-sale-CmWxSfFQ.js.map} +1 -1
- package/dist/provider-DPGUA10G.js +125 -0
- package/dist/provider-DPGUA10G.js.map +1 -0
- package/dist/{queries-CUU65uYZ.js → queries-Ce_2othB.js} +165 -7
- package/dist/queries-Ce_2othB.js.map +1 -0
- package/dist/{rarible-BgTwwj9g.js → rarible-B0xlD88A.js} +1 -1
- package/dist/{rarible-BgTwwj9g.js.map → rarible-B0xlD88A.js.map} +1 -1
- package/dist/react/_internal/api/index.d.ts +2 -4
- package/dist/react/_internal/api/index.js +7 -4
- package/dist/react/_internal/databeat/index.d.ts +2 -73
- package/dist/react/_internal/databeat/index.js +4 -21
- package/dist/react/_internal/index.d.ts +2 -7
- package/dist/react/_internal/index.js +11 -6
- package/dist/react/_internal/wagmi/index.d.ts +2 -4
- package/dist/react/_internal/wagmi/index.js +5 -3
- package/dist/react/hooks/index.d.ts +12 -17
- package/dist/react/hooks/index.js +23 -19
- package/dist/react/hooks/options/index.d.ts +2 -3
- package/dist/react/hooks/options/index.js +12 -7
- package/dist/react/index.d.ts +12 -17
- package/dist/react/index.js +28 -19
- package/dist/react/queries/index.d.ts +9 -8
- package/dist/react/queries/index.js +20 -15
- package/dist/react/ssr/index.d.ts +7 -9
- package/dist/react/ssr/index.js +11 -6
- package/dist/react/ssr/index.js.map +1 -1
- package/dist/react/ui/components/marketplace-collectible-card/index.d.ts +3 -8
- package/dist/react/ui/components/marketplace-collectible-card/index.js +27 -18
- package/dist/react/ui/components/marketplace-collectible-card/utils/index.d.ts +2 -7
- package/dist/react/ui/components/marketplace-collectible-card/utils/index.js +11 -6
- package/dist/react/ui/components/marketplace-logos/index.d.ts +21 -21
- package/dist/react/ui/components/marketplace-logos/index.js +1 -1
- package/dist/react/ui/icons/index.js +13 -9
- package/dist/react/ui/index.d.ts +3 -8
- package/dist/react/ui/index.js +27 -18
- package/dist/react/ui/modals/_internal/components/actionModal/index.d.ts +2 -2
- package/dist/react/ui/modals/_internal/components/actionModal/index.js +23 -18
- package/dist/{react-DAIicQPT.js → react-DP0M2Wfm.js} +799 -4306
- package/dist/react-DP0M2Wfm.js.map +1 -0
- package/dist/{react-BbHBl6gg.css → react-DeDyTgo7.css} +1 -1
- package/dist/{react-BbHBl6gg.css.map → react-DeDyTgo7.css.map} +1 -1
- package/dist/{sequence-Do3kzb4J.js → sequence-BIrOVRXO.js} +1 -1
- package/dist/{sequence-Do3kzb4J.js.map → sequence-BIrOVRXO.js.map} +1 -1
- package/dist/{sudo-swap-B6vPKxBz.js → sudo-swap-BPMon-M5.js} +1 -1
- package/dist/{sudo-swap-B6vPKxBz.js.map → sudo-swap-BPMon-M5.js.map} +1 -1
- package/dist/{super-rare-eCm1SE6O.js → super-rare-kPN6Ua8i.js} +1 -1
- package/dist/{super-rare-eCm1SE6O.js.map → super-rare-kPN6Ua8i.js.map} +1 -1
- package/dist/{token-Da4TdyUk.js → token-CHSBPYVG.js} +1 -1
- package/dist/{token-Da4TdyUk.js.map → token-CHSBPYVG.js.map} +1 -1
- package/dist/{transaction-CcVViHEL.js → transaction-CnctdNzS.js} +3 -21
- package/dist/transaction-CnctdNzS.js.map +1 -0
- package/dist/types/index.d.ts +2 -3
- package/dist/types/index.js +2 -2
- package/dist/{types-DwWE6xOF.js → types-Yw2ywj6j.js} +1 -1
- package/dist/{types-DwWE6xOF.js.map → types-Yw2ywj6j.js.map} +1 -1
- package/dist/utils/abi/index.d.ts +4 -4
- package/dist/utils/abi/index.js +4 -4
- package/dist/utils/abi/marketplace/index.d.ts +1 -1
- package/dist/utils/abi/marketplace/index.js +1 -1
- package/dist/utils/abi/primary-sale/index.d.ts +1 -1
- package/dist/utils/abi/primary-sale/index.js +1 -1
- package/dist/utils/abi/token/index.d.ts +1 -1
- package/dist/utils/abi/token/index.js +1 -1
- package/dist/utils/index.d.ts +7 -8
- package/dist/utils/index.js +12 -9
- package/dist/{utils-CW2NA5KG.js → utils-9RXDgcBl.js} +4 -11
- package/dist/utils-9RXDgcBl.js.map +1 -0
- package/dist/{utils-BPYfgDSL.js → utils-DjVJ9tov.js} +5 -6
- package/dist/utils-DjVJ9tov.js.map +1 -0
- package/dist/wagmi-Do_KW5ke.js +0 -0
- package/dist/{x2y2-DD17tT91.js → x2y2-BLz-_Q2O.js} +1 -1
- package/dist/{x2y2-DD17tT91.js.map → x2y2-BLz-_Q2O.js.map} +1 -1
- package/dist/{zora-BpSG9UzS.js → zora-UGhKs-aL.js} +1 -1
- package/dist/{zora-BpSG9UzS.js.map → zora-UGhKs-aL.js.map} +1 -1
- package/eslint.config.mjs +4 -0
- package/package.json +27 -14
- package/postcss.config.mjs +6 -0
- package/src/index.css +5 -4
- package/src/index.ts +1 -0
- package/src/react/__tests__/provider.test.tsx +4 -3
- package/src/react/_internal/api/__mocks__/indexer.msw.ts +16 -0
- package/src/react/_internal/api/__mocks__/laos.msw.ts +387 -0
- package/src/react/_internal/api/__mocks__/marketplace.msw.ts +2 -0
- package/src/react/_internal/api/__tests__/laos-api.test.ts +756 -0
- package/src/react/_internal/api/laos-api.ts +3 -0
- package/src/react/_internal/api/marketplace.gen.ts +5 -3
- package/src/react/_internal/api/query-keys.ts +12 -4
- package/src/react/_internal/api/services.ts +2 -14
- package/src/react/_internal/databeat/index.ts +15 -14
- package/src/react/_internal/databeat/types.ts +22 -0
- package/src/react/_internal/databeat/utils.ts +26 -0
- package/src/react/_internal/utils.ts +4 -4
- package/src/react/_internal/wagmi/create-config.ts +28 -13
- package/src/react/_internal/wallet/wallet.ts +4 -4
- package/src/react/hooks/__tests__/useBalanceOfCollectible.laos.test.tsx +367 -0
- package/src/react/hooks/__tests__/useCheckoutOptions.test.tsx +158 -0
- package/src/react/hooks/__tests__/useCheckoutOptionsSalesContract.test.tsx +42 -65
- package/src/react/hooks/__tests__/useCollectionBalanceDetails.test.tsx +17 -0
- package/src/react/hooks/__tests__/useCollectionDetailsPolling.test.tsx +11 -3
- package/src/react/hooks/__tests__/useConvertPriceToUSD.test.tsx +3 -3
- package/src/react/hooks/__tests__/useCurrencyBalance.test.tsx +7 -3
- package/src/react/hooks/__tests__/useFilters.test.tsx +2 -2
- package/src/react/hooks/__tests__/useGetTokenRanges.test.tsx +111 -0
- package/src/react/hooks/__tests__/useListTokenMetadata.test.tsx +83 -57
- package/src/react/hooks/__tests__/useTransferTokens.test.tsx +469 -0
- package/src/react/hooks/index.ts +3 -1
- package/src/react/hooks/useCheckoutOptions.tsx +96 -0
- package/src/react/hooks/useCheckoutOptionsSalesContract.tsx +98 -57
- package/src/react/hooks/useCollectionBalanceDetails.tsx +95 -68
- package/src/react/hooks/useCollectionDetailsPolling.tsx +3 -7
- package/src/react/hooks/useComparePrices.tsx +90 -82
- package/src/react/hooks/useConvertPriceToUSD.tsx +85 -71
- package/src/react/hooks/useCurrencyBalance.tsx +132 -46
- package/src/react/hooks/useERC721SaleMintedTokens.tsx +8 -5
- package/src/react/hooks/useFilters.tsx +154 -111
- package/src/react/hooks/useGetCountOfPrimarySaleItems.tsx +48 -0
- package/src/react/hooks/useGetTokenRanges.tsx +83 -22
- package/src/react/hooks/useList1155ShopCardData.tsx +2 -0
- package/src/react/hooks/useList721ShopCardData.tsx +12 -7
- package/src/react/hooks/useListCollections.tsx +25 -25
- package/src/react/hooks/useListMarketCardData.tsx +2 -1
- package/src/react/hooks/useListPrimarySaleItems.tsx +66 -0
- package/src/react/hooks/useListTokenMetadata.ts +71 -0
- package/src/react/hooks/useOpenConnectModal.tsx +9 -0
- package/src/react/hooks/useTokenSaleDetailsBatch.tsx +3 -7
- package/src/react/hooks/useTokenSupplies.ts +81 -0
- package/src/react/hooks/useTransferTokens.tsx +2 -2
- package/src/react/provider.tsx +73 -9
- package/src/react/queries/__tests__/balanceOfCollectible.laos.test.ts +123 -0
- package/src/react/queries/__tests__/inventory.laos.test.ts +496 -0
- package/src/react/queries/balanceOfCollectible.ts +7 -4
- package/src/react/queries/checkoutOptions.ts +85 -0
- package/src/react/queries/checkoutOptionsSalesContract.ts +89 -0
- package/src/react/queries/collectionBalanceDetails.ts +92 -0
- package/src/react/queries/comparePrices.ts +108 -0
- package/src/react/queries/convertPriceToUSD.ts +92 -0
- package/src/react/queries/filters.ts +138 -0
- package/src/react/queries/getTokenRanges.ts +62 -0
- package/src/react/queries/index.ts +3 -0
- package/src/react/queries/inventory.ts +6 -0
- package/src/react/queries/listBalances.ts +4 -3
- package/src/react/queries/listCollections.ts +7 -3
- package/src/react/queries/listTokenMetadata.ts +2 -2
- package/src/react/queries/marketplaceConfig.ts +1 -1
- package/src/react/queries/primarySaleItems.ts +85 -0
- package/src/react/queries/primarySaleItemsCount.ts +64 -0
- package/src/react/queries/tokenSupplies.ts +93 -0
- package/src/react/ui/components/_internals/action-button/ActionButton.tsx +66 -66
- package/src/react/ui/components/_internals/action-button/__tests__/ActionButtonBody.test.tsx +22 -4
- package/src/react/ui/components/_internals/action-button/components/ActionButtonBody.tsx +5 -4
- package/src/react/ui/components/_internals/action-button/components/NonOwnerActions.tsx +3 -0
- package/src/react/ui/components/_internals/action-button/components/OwnerActions.tsx +4 -4
- package/src/react/ui/components/_internals/action-button/hooks/useActionButtonLogic.ts +13 -8
- package/src/react/ui/components/_internals/action-button/store.ts +44 -34
- package/src/react/ui/components/_internals/custom-select/CustomSelect.stories.tsx +582 -0
- package/src/react/ui/components/_internals/pill/Pill.stories.tsx +83 -0
- package/src/react/ui/components/marketplace-collectible-card/Footer.tsx +11 -4
- package/src/react/ui/components/marketplace-collectible-card/components/ActionButtonWrapper.tsx +7 -4
- package/src/react/ui/components/marketplace-collectible-card/types.ts +4 -3
- package/src/react/ui/components/marketplace-collectible-card/utils/supplyStatus.ts +4 -7
- package/src/react/ui/components/marketplace-collectible-card/variants/ShopCard.tsx +5 -1
- package/src/react/ui/components/marketplace-logos/marketplace-logos.stories.tsx +199 -0
- package/src/react/ui/components/media/Media.stories.tsx +642 -0
- package/src/react/ui/components/media/Media.tsx +24 -19
- package/src/react/ui/components/media/types.ts +6 -0
- package/src/react/ui/modals/BuyModal/__tests__/BuyModalRouter.test.tsx +15 -0
- package/src/react/ui/modals/BuyModal/__tests__/ERC1155ShopModal.test.tsx +6 -0
- package/src/react/ui/modals/BuyModal/__tests__/Modal1155.test.tsx +7 -1
- package/src/react/ui/modals/BuyModal/__tests__/store.test.ts +9 -1
- package/src/react/ui/modals/BuyModal/components/ERC1155QuantityModal.tsx +15 -8
- package/src/react/ui/modals/BuyModal/components/ERC1155ShopModal.tsx +3 -0
- package/src/react/ui/modals/BuyModal/hooks/__tests__/useERC1155Checkout.test.tsx +30 -27
- package/src/react/ui/modals/BuyModal/hooks/useCheckoutOptions.ts +2 -2
- package/src/react/ui/modals/BuyModal/hooks/useERC1155Checkout.ts +11 -2
- package/src/react/ui/modals/BuyModal/hooks/useERC721SalePaymentParams.ts +1 -1
- package/src/react/ui/modals/BuyModal/hooks/usePaymentModalParams.ts +7 -0
- package/src/react/ui/modals/BuyModal/index.tsx +9 -1
- package/src/react/ui/modals/BuyModal/store.ts +26 -0
- package/src/react/ui/modals/CreateListingModal/Modal.tsx +28 -11
- package/src/react/ui/modals/CreateListingModal/store.ts +3 -3
- package/src/react/ui/modals/MakeOfferModal/Modal.tsx +30 -13
- package/src/react/ui/modals/MakeOfferModal/store.ts +3 -3
- package/src/react/ui/modals/SellModal/Modal.tsx +11 -8
- package/src/react/ui/modals/SellModal/store.ts +3 -3
- package/src/react/ui/modals/TransferModal/__tests__/__snapshots__/store.test.ts.snap +17 -0
- package/src/react/ui/modals/TransferModal/__tests__/store.test.ts +366 -0
- package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/__tests__/useHandleTransfer.test.tsx +402 -0
- package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/_components/TokenQuantityInput.tsx +51 -48
- package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/_components/TransferButton.tsx +39 -47
- package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/_components/WalletAddressInput.tsx +9 -8
- package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/index.tsx +31 -35
- package/src/react/ui/modals/TransferModal/_views/enterWalletAddress/useHandleTransfer.tsx +19 -10
- package/src/react/ui/modals/TransferModal/index.tsx +28 -31
- package/src/react/ui/modals/TransferModal/messages.ts +1 -1
- package/src/react/ui/modals/TransferModal/store.ts +122 -0
- package/src/react/ui/modals/_internal/components/calendar/index.tsx +0 -1
- package/src/react/ui/modals/_internal/components/currencyImage/index.tsx +10 -14
- package/src/react/ui/modals/_internal/components/currencyOptionsSelect/__tests__/index.test.tsx +5 -2
- package/src/react/ui/modals/_internal/components/currencyOptionsSelect/index.tsx +23 -17
- package/src/react/ui/modals/_internal/components/expirationDateSelect/index.tsx +10 -10
- package/src/react/ui/modals/_internal/components/floorPriceText/__tests__/FloorPriceText.test.tsx +6 -6
- package/src/react/ui/modals/_internal/components/priceInput/__tests__/PriceInput.test.tsx +13 -5
- package/src/react/ui/modals/_internal/components/priceInput/index.tsx +41 -26
- package/src/react/ui/modals/_internal/components/quantityInput/__tests__/index.test.tsx +68 -59
- package/src/react/ui/modals/_internal/components/quantityInput/index.tsx +155 -20
- package/src/react/ui/modals/_internal/components/selectWaasFeeOptions/__tests__/SelectWaasFeeOptions.test.tsx +339 -40
- package/src/react/ui/modals/_internal/components/selectWaasFeeOptions/index.tsx +95 -101
- package/src/react/ui/modals/_internal/components/selectWaasFeeOptions/store.ts +72 -14
- package/src/react/ui/modals/_internal/components/selectWaasFeeOptions/useWaasFeeOptionManager.tsx +29 -13
- package/src/react/ui/modals/_internal/components/tokenPreview/index.tsx +2 -2
- package/src/react/ui/modals/_internal/components/transactionDetails/index.tsx +2 -2
- package/src/react/ui/modals/_internal/components/transactionPreview/index.tsx +88 -89
- package/src/react/ui/modals/_internal/components/transactionStatusModal/__tests__/TransactionStatusModal.test.tsx +36 -10
- package/src/react/ui/modals/_internal/components/transactionStatusModal/index.tsx +32 -20
- package/src/react/ui/modals/_internal/components/transactionStatusModal/store.ts +91 -62
- package/src/react/ui/modals/_internal/components/waasFeeOptionsSelect/WaasFeeOptionsSelect.tsx +43 -44
- package/src/react/ui/modals/_internal/types.ts +2 -2
- package/src/types/sdk-config.ts +6 -1
- package/src/utils/network.ts +15 -0
- package/test/test-utils.tsx +2 -0
- package/vitest.shims.d.ts +2 -0
- package/vitest.storybook.config.js +33 -0
- package/dist/CalendarIcon-DbQ7Vxcw.js.map +0 -1
- package/dist/_internal-BgWcRIak.js.map +0 -1
- package/dist/api-DTIan01C.js.map +0 -1
- package/dist/builder-api-C_zj5mr3.d.ts +0 -12
- package/dist/index-BUVWziLP.d.ts +0 -60
- package/dist/index-COt10OgI.d.ts +0 -24
- package/dist/index-DPNWNa7t.d.ts +0 -414
- package/dist/index-DsfCs3-x.d.ts +0 -122
- package/dist/index-dUb6wb4Y.d.ts +0 -22
- package/dist/marketplace.gen-BSDIX7NZ.js.map +0 -1
- package/dist/marketplaceConfig-C6X1SUik.js.map +0 -1
- package/dist/queries-CUU65uYZ.js.map +0 -1
- package/dist/react-DAIicQPT.js.map +0 -1
- package/dist/transaction-CcVViHEL.js.map +0 -1
- package/dist/utils-BPYfgDSL.js.map +0 -1
- package/dist/utils-CW2NA5KG.js.map +0 -1
- package/dist/wagmi-CDzEQbfk.js.map +0 -1
- package/src/react/hooks/__tests__/useGetTokenSuppliesMap.test.tsx +0 -104
- package/src/react/hooks/useGetTokenSuppliesMap.tsx +0 -73
- package/src/react/hooks/useListPrimarySaleItems.ts +0 -102
- package/src/react/queries/getTokenSuppliesMap.ts +0 -77
- package/src/react/ui/modals/TransferModal/_store.ts +0 -66
- package/src/react/ui/modals/_internal/components/quantityInput/QuantityInputBase.tsx +0 -166
- package/src/react/ui/modals/_internal/stores/accountModal.ts +0 -3
- /package/dist/{abi-BKyRjVcZ.js → abi-BMvgNbKQ.js} +0 -0
- /package/dist/{index-C39K_8SG.d.ts → index-CD2bj_xW.d.ts} +0 -0
- /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
|
{
|