@net-protocol/bazaar 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/abis/helpers.ts","../src/abis/seaport.ts","../src/abis/index.ts","../src/chainConfig.ts","../src/utils/seaport.ts","../src/utils/validation.ts","../src/utils/parsing.ts","../src/client/BazaarClient.ts","../src/hooks/useBazaarListings.ts","../src/hooks/useBazaarCollectionOffers.ts","../src/hooks/useBazaarErc20Offers.ts","../src/hooks/useBazaarErc20Listings.ts"],"names":["decodeAbiParameters","ethers","Seaport","formatEther","readContract","createPublicClient","defineChain","http","NetClient","useState","useMemo","useNetMessageCount","useNetMessages","useEffect"],"mappings":"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","file":"react.js","sourcesContent":["export const BULK_SEAPORT_ORDER_STATUS_FETCHER_ABI = [\n { type: \"constructor\", inputs: [], stateMutability: \"nonpayable\" },\n {\n type: \"function\",\n name: \"getOrderStatuses\",\n inputs: [\n { name: \"seaport\", type: \"address\", internalType: \"address\" },\n { name: \"orderHashes\", type: \"bytes32[]\", internalType: \"bytes32[]\" },\n ],\n outputs: [\n {\n name: \"results\",\n type: \"tuple[]\",\n internalType: \"struct BulkSeaportOrderStatusFetcher.OrderStatusInfo[]\",\n components: [\n { name: \"isValidated\", type: \"bool\", internalType: \"bool\" },\n { name: \"isCancelled\", type: \"bool\", internalType: \"bool\" },\n { name: \"totalFilled\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"totalSize\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n ],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const ERC721_OWNER_OF_HELPER_ABI = [\n {\n type: \"function\",\n name: \"getTokenOwners\",\n inputs: [\n { name: \"nftContract\", type: \"address\", internalType: \"address\" },\n { name: \"tokenIds\", type: \"uint256[]\", internalType: \"uint256[]\" },\n ],\n outputs: [\n { name: \"owners\", type: \"address[]\", internalType: \"address[]\" },\n ],\n stateMutability: \"view\",\n },\n { type: \"error\", name: \"InvalidAddress\", inputs: [] },\n { type: \"error\", name: \"TokenQueryFailed\", inputs: [] },\n] as const;\n\nexport const ERC20_BULK_BALANCE_CHECKER_ABI = [\n {\n type: \"function\",\n name: \"getBalances\",\n inputs: [\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"addresses\", type: \"address[]\", internalType: \"address[]\" },\n ],\n outputs: [\n { name: \"balances\", type: \"uint256[]\", internalType: \"uint256[]\" },\n ],\n stateMutability: \"view\",\n },\n] as const;\n","/**\n * Minimal Seaport ABI for cancel operations\n */\nexport const SEAPORT_CANCEL_ABI = [\n {\n inputs: [\n {\n components: [\n { internalType: \"address\", name: \"offerer\", type: \"address\" },\n { internalType: \"address\", name: \"zone\", type: \"address\" },\n {\n components: [\n { internalType: \"enum ItemType\", name: \"itemType\", type: \"uint8\" },\n { internalType: \"address\", name: \"token\", type: \"address\" },\n { internalType: \"uint256\", name: \"identifierOrCriteria\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"startAmount\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"endAmount\", type: \"uint256\" },\n ],\n internalType: \"struct OfferItem[]\",\n name: \"offer\",\n type: \"tuple[]\",\n },\n {\n components: [\n { internalType: \"enum ItemType\", name: \"itemType\", type: \"uint8\" },\n { internalType: \"address\", name: \"token\", type: \"address\" },\n { internalType: \"uint256\", name: \"identifierOrCriteria\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"startAmount\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"endAmount\", type: \"uint256\" },\n { internalType: \"address payable\", name: \"recipient\", type: \"address\" },\n ],\n internalType: \"struct ConsiderationItem[]\",\n name: \"consideration\",\n type: \"tuple[]\",\n },\n { internalType: \"enum OrderType\", name: \"orderType\", type: \"uint8\" },\n { internalType: \"uint256\", name: \"startTime\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"endTime\", type: \"uint256\" },\n { internalType: \"bytes32\", name: \"zoneHash\", type: \"bytes32\" },\n { internalType: \"uint256\", name: \"salt\", type: \"uint256\" },\n { internalType: \"bytes32\", name: \"conduitKey\", type: \"bytes32\" },\n { internalType: \"uint256\", name: \"counter\", type: \"uint256\" },\n ],\n internalType: \"struct OrderComponents[]\",\n name: \"orders\",\n type: \"tuple[]\",\n },\n ],\n name: \"cancel\",\n outputs: [{ internalType: \"bool\", name: \"cancelled\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n","export { BAZAAR_V2_ABI, BAZAAR_COLLECTION_OFFERS_ABI } from \"./bazaarV2\";\nexport {\n BULK_SEAPORT_ORDER_STATUS_FETCHER_ABI,\n ERC721_OWNER_OF_HELPER_ABI,\n ERC20_BULK_BALANCE_CHECKER_ABI,\n} from \"./helpers\";\nexport { SEAPORT_CANCEL_ABI } from \"./seaport\";\n\n/**\n * ABI for decoding Seaport submission from Net message data\n */\nexport const BAZAAR_SUBMISSION_ABI = [\n {\n name: \"submission\",\n type: \"tuple\",\n internalType: \"struct BazaarV2.Submission\",\n components: [\n {\n name: \"parameters\",\n type: \"tuple\",\n internalType: \"struct OrderParameters\",\n components: [\n { name: \"offerer\", type: \"address\", internalType: \"address\" },\n { name: \"zone\", type: \"address\", internalType: \"address\" },\n {\n name: \"offer\",\n type: \"tuple[]\",\n internalType: \"struct OfferItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n {\n name: \"consideration\",\n type: \"tuple[]\",\n internalType: \"struct ConsiderationItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"recipient\", type: \"address\", internalType: \"address payable\" },\n ],\n },\n { name: \"orderType\", type: \"uint8\", internalType: \"enum OrderType\" },\n { name: \"startTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"zoneHash\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"salt\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"conduitKey\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"totalOriginalConsiderationItems\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"counter\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n },\n] as const;\n","/**\n * Bazaar chain configuration\n *\n * Contains contract addresses and configuration for each supported chain.\n */\n\nexport interface WrappedNativeCurrency {\n address: `0x${string}`;\n name: string;\n symbol: string;\n}\n\nexport interface BazaarChainConfig {\n /** Main NFT listing contract */\n bazaarAddress: `0x${string}`;\n /** Collection offers contract */\n collectionOffersAddress: `0x${string}`;\n /** ERC20 offers contract (only on Base and HyperEVM) */\n erc20OffersAddress?: `0x${string}`;\n /** ERC20 listings contract */\n erc20BazaarAddress?: `0x${string}`;\n /** Seaport contract address */\n seaportAddress: `0x${string}`;\n /** Fee collector address */\n feeCollectorAddress: `0x${string}`;\n /** Fee in basis points for NFT trades */\n nftFeeBps: number;\n /** Wrapped native currency (WETH, etc.) */\n wrappedNativeCurrency: WrappedNativeCurrency;\n /** Address with high ETH balance for Seaport checks */\n highEthAddress?: `0x${string}`;\n /** Native currency symbol (lowercase) */\n currencySymbol: string;\n}\n\n// Default addresses used by most chains\nconst DEFAULT_SEAPORT_ADDRESS = \"0x0000000000000068F116a894984e2DB1123eB395\" as const;\nconst DEFAULT_BAZAAR_ADDRESS = \"0x00000000E3dA5fC031282A39759bDDA78ae7fAE5\" as const;\nconst DEFAULT_COLLECTION_OFFERS_ADDRESS = \"0x0000000D43423E0A12CecB307a74591999b32B32\" as const;\nconst DEFAULT_FEE_COLLECTOR_ADDRESS = \"0x32D16C15410248bef498D7aF50D10Db1a546b9E5\" as const;\nconst DEFAULT_ERC20_BAZAAR_ADDRESS = \"0x00000000a2d173a4610c85c7471a25b6bc216a70\" as const;\nconst DEFAULT_NFT_FEE_BPS = 500; // 5%\n\n// Helper contract addresses (same on all chains)\nexport const BULK_SEAPORT_ORDER_STATUS_FETCHER_ADDRESS = \"0x0000009112ABCE652674b4fE3eD9C765B22d11A7\" as const;\nexport const ERC721_OWNER_OF_HELPER_ADDRESS = \"0x000000aa4eFa2e5A4a6002C7F08B6e8Ec8cf1dDa\" as const;\nexport const ERC20_BULK_BALANCE_CHECKER_ADDRESS = \"0x000000b50a9f2923f2db931391824f6d1278f712\" as const;\n\n// Zone contract addresses (same on all chains)\nexport const NET_SEAPORT_ZONE_ADDRESS = \"0x000000007F8c58fbf215bF91Bda7421A806cf3ae\" as const;\nexport const NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS = \"0x000000B799ec6D7aCC1B578f62bFc324c25DFC5A\" as const;\n\n/**\n * Chain-specific bazaar configuration\n */\nconst BAZAAR_CHAIN_CONFIGS: Record<number, BazaarChainConfig> = {\n // Base Mainnet\n 8453: {\n bazaarAddress: \"0x000000058f3ade587388daf827174d0e6fc97595\",\n collectionOffersAddress: \"0x0000000f9c45efcff0f78d8b54aa6a40092d66dc\",\n erc20OffersAddress: \"0x0000000e23a89aa06f317306aa1ae231d3503082\",\n erc20BazaarAddress: \"0x00000006557e3629e2fc50bbad0c002b27cac492\",\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: \"0x66547ff4f7206e291F7BC157b54C026Fc6660961\",\n nftFeeBps: 0, // 0% on Base\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n },\n currencySymbol: \"eth\",\n },\n\n // Base Sepolia (Testnet)\n 84532: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n },\n currencySymbol: \"eth\",\n },\n\n // Degen\n 666666666: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0xEb54dACB4C2ccb64F8074eceEa33b5eBb38E5387\",\n name: \"Wrapped Degen\",\n symbol: \"WDEGEN\",\n },\n currencySymbol: \"degen\",\n },\n\n // Ham Chain\n 5112: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n },\n highEthAddress: \"0x4200000000000000000000000000000000000006\",\n currencySymbol: \"eth\",\n },\n\n // Ink Chain\n 57073: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n // Custom Seaport address for Ink (no create2 factory)\n seaportAddress: \"0xD00C96804e9fF35f10C7D2a92239C351Ff3F94e5\",\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped ETH\",\n symbol: \"WETH\",\n },\n highEthAddress: \"0x4200000000000000000000000000000000000006\",\n currencySymbol: \"eth\",\n },\n\n // Unichain\n 130: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n },\n currencySymbol: \"eth\",\n },\n\n // HyperEVM (Hyperliquid)\n 999: {\n bazaarAddress: \"0x000000058f3ade587388daf827174d0e6fc97595\",\n collectionOffersAddress: \"0x0000000f9c45efcff0f78d8b54aa6a40092d66dc\",\n erc20OffersAddress: \"0x0000000e23a89aa06f317306aa1ae231d3503082\",\n erc20BazaarAddress: \"0x00000006557e3629e2fc50bbad0c002b27cac492\",\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: \"0x66547ff4f7206e291F7BC157b54C026Fc6660961\",\n nftFeeBps: 0, // 0% on HyperEVM\n wrappedNativeCurrency: {\n address: \"0x5555555555555555555555555555555555555555\",\n name: \"Wrapped Hype\",\n symbol: \"WHYPE\",\n },\n currencySymbol: \"hype\",\n },\n\n // Plasma\n 9745: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x6100e367285b01f48d07953803a2d8dca5d19873\",\n name: \"Wrapped XPL\",\n symbol: \"WXPL\",\n },\n currencySymbol: \"xpl\",\n },\n\n // Monad\n 143: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A\",\n name: \"Wrapped Monad\",\n symbol: \"WMONAD\",\n },\n currencySymbol: \"monad\",\n },\n};\n\n/**\n * Get bazaar configuration for a chain\n */\nexport function getBazaarChainConfig(chainId: number): BazaarChainConfig | undefined {\n return BAZAAR_CHAIN_CONFIGS[chainId];\n}\n\n/**\n * Get all supported bazaar chain IDs\n */\nexport function getBazaarSupportedChainIds(): number[] {\n return Object.keys(BAZAAR_CHAIN_CONFIGS).map(Number);\n}\n\n/**\n * Check if bazaar is supported on a chain\n */\nexport function isBazaarSupportedOnChain(chainId: number): boolean {\n return chainId in BAZAAR_CHAIN_CONFIGS;\n}\n\n/**\n * Get bazaar contract address for a chain\n */\nexport function getBazaarAddress(chainId: number): `0x${string}` {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.bazaarAddress ?? DEFAULT_BAZAAR_ADDRESS;\n}\n\n/**\n * Get collection offers contract address for a chain\n */\nexport function getCollectionOffersAddress(chainId: number): `0x${string}` {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.collectionOffersAddress ?? DEFAULT_COLLECTION_OFFERS_ADDRESS;\n}\n\n/**\n * Get Seaport contract address for a chain\n */\nexport function getSeaportAddress(chainId: number): `0x${string}` {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.seaportAddress ?? DEFAULT_SEAPORT_ADDRESS;\n}\n\n/**\n * Get fee collector address for a chain\n */\nexport function getFeeCollectorAddress(chainId: number): `0x${string}` {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.feeCollectorAddress ?? DEFAULT_FEE_COLLECTOR_ADDRESS;\n}\n\n/**\n * Get NFT fee in basis points for a chain\n */\nexport function getNftFeeBps(chainId: number): number {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.nftFeeBps ?? DEFAULT_NFT_FEE_BPS;\n}\n\n/**\n * Get wrapped native currency for a chain\n */\nexport function getWrappedNativeCurrency(chainId: number): WrappedNativeCurrency | undefined {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.wrappedNativeCurrency;\n}\n\n/**\n * Get currency symbol for a chain (lowercase)\n */\nexport function getCurrencySymbol(chainId: number): string {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.currencySymbol ?? \"eth\";\n}\n\n/**\n * Get high ETH address for Seaport balance checks\n */\nexport function getHighEthAddress(chainId: number): `0x${string}` | undefined {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.highEthAddress;\n}\n\n/**\n * Get ERC20 offers contract address for a chain\n * Only deployed on Base (8453) and HyperEVM (999)\n */\nexport function getErc20OffersAddress(chainId: number): `0x${string}` | undefined {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.erc20OffersAddress;\n}\n\n/**\n * Get ERC20 bazaar (listings) contract address for a chain\n */\nexport function getErc20BazaarAddress(chainId: number): `0x${string}` {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.erc20BazaarAddress ?? DEFAULT_ERC20_BAZAAR_ADDRESS;\n}\n","/**\n * Seaport-related utilities for decoding and computing order hashes\n */\n\nimport { decodeAbiParameters, formatEther } from \"viem\";\nimport { Seaport } from \"@opensea/seaport-js\";\nimport { ethers } from \"ethers\";\nimport { BAZAAR_SUBMISSION_ABI } from \"../abis\";\nimport {\n SeaportSubmission,\n SeaportOrderParameters,\n SeaportOrderStatus,\n SeaportOrderStatusInfo,\n} from \"../types\";\nimport { getSeaportAddress, getHighEthAddress } from \"../chainConfig\";\n\n/**\n * Decode Seaport submission from Net message data\n */\nexport function decodeSeaportSubmission(messageData: `0x${string}`): SeaportSubmission {\n const [decoded] = decodeAbiParameters(BAZAAR_SUBMISSION_ABI, messageData);\n\n return {\n parameters: {\n offerer: decoded.parameters.offerer as `0x${string}`,\n zone: decoded.parameters.zone as `0x${string}`,\n offer: decoded.parameters.offer.map((item: any) => ({\n itemType: item.itemType,\n token: item.token as `0x${string}`,\n identifierOrCriteria: BigInt(item.identifierOrCriteria),\n startAmount: BigInt(item.startAmount),\n endAmount: BigInt(item.endAmount),\n })),\n consideration: decoded.parameters.consideration.map((item: any) => ({\n itemType: item.itemType,\n token: item.token as `0x${string}`,\n identifierOrCriteria: BigInt(item.identifierOrCriteria),\n startAmount: BigInt(item.startAmount),\n endAmount: BigInt(item.endAmount),\n recipient: item.recipient as `0x${string}`,\n })),\n orderType: decoded.parameters.orderType,\n startTime: BigInt(decoded.parameters.startTime),\n endTime: BigInt(decoded.parameters.endTime),\n zoneHash: decoded.parameters.zoneHash as `0x${string}`,\n salt: BigInt(decoded.parameters.salt),\n conduitKey: decoded.parameters.conduitKey as `0x${string}`,\n totalOriginalConsiderationItems: BigInt(decoded.parameters.totalOriginalConsiderationItems),\n },\n counter: BigInt(decoded.counter),\n signature: decoded.signature as `0x${string}`,\n };\n}\n\n/**\n * Get Seaport order from message data with string identifiers\n * (needed for Seaport SDK compatibility)\n */\nexport function getSeaportOrderFromMessageData(messageData: `0x${string}`): {\n parameters: any;\n signature: `0x${string}`;\n counter: bigint;\n} {\n const submission = decodeSeaportSubmission(messageData);\n\n return {\n parameters: {\n ...submission.parameters,\n // Convert BigInts to strings for Seaport SDK compatibility\n offer: submission.parameters.offer.map((item) => ({\n ...item,\n identifierOrCriteria: item.identifierOrCriteria.toString(),\n startAmount: item.startAmount.toString(),\n endAmount: item.endAmount.toString(),\n })),\n consideration: submission.parameters.consideration.map((item) => ({\n ...item,\n identifierOrCriteria: item.identifierOrCriteria.toString(),\n startAmount: item.startAmount.toString(),\n endAmount: item.endAmount.toString(),\n })),\n startTime: submission.parameters.startTime.toString(),\n endTime: submission.parameters.endTime.toString(),\n salt: submission.parameters.salt.toString(),\n totalOriginalConsiderationItems: submission.parameters.totalOriginalConsiderationItems.toString(),\n counter: submission.counter.toString(),\n },\n signature: submission.signature,\n counter: submission.counter,\n };\n}\n\n/**\n * Create a Seaport instance for a chain using a public RPC\n */\nexport function createSeaportInstance(chainId: number, rpcUrl: string): Seaport {\n const provider = new ethers.JsonRpcProvider(rpcUrl);\n\n // Use a dummy signer for read-only operations\n const signer = new ethers.Wallet(\n // Random private key for read-only operations\n \"dc63e9af2088e2afd61499411cb6dd718d00a3d9e46e2cb5e33912c781bd77fe\",\n provider\n );\n\n // Override getAddress to return a high-balance address for checks\n const highEthAddress = getHighEthAddress(chainId);\n const finalSigner = highEthAddress\n ? {\n ...signer,\n getAddress: () => highEthAddress,\n address: highEthAddress,\n }\n : signer;\n\n return new Seaport(finalSigner as any, {\n overrides: { contractAddress: getSeaportAddress(chainId) },\n });\n}\n\n/**\n * Compute Seaport order hash\n */\nexport function computeOrderHash(\n seaport: Seaport,\n orderParameters: any,\n counter: bigint | string\n): string {\n return seaport.getOrderHash({\n ...orderParameters,\n counter: counter.toString(),\n });\n}\n\n/**\n * Determine order status from on-chain status info\n */\nexport function getOrderStatusFromInfo(\n orderParameters: SeaportOrderParameters,\n statusInfo: SeaportOrderStatusInfo\n): SeaportOrderStatus {\n if (statusInfo.isCancelled) {\n return SeaportOrderStatus.CANCELLED;\n }\n\n if (\n statusInfo.totalFilled === statusInfo.totalSize &&\n statusInfo.totalFilled > BigInt(0)\n ) {\n return SeaportOrderStatus.FILLED;\n }\n\n const now = BigInt(Math.floor(Date.now() / 1000));\n if (orderParameters.endTime < now) {\n return SeaportOrderStatus.EXPIRED;\n }\n\n return SeaportOrderStatus.OPEN;\n}\n\n/**\n * Calculate total consideration amount (price) from order\n */\nexport function getTotalConsiderationAmount(parameters: SeaportOrderParameters): bigint {\n return parameters.consideration.reduce(\n (acc, item) => acc + item.startAmount,\n BigInt(0)\n );\n}\n\n/**\n * Format price from wei to display string\n */\nexport function formatPrice(priceWei: bigint): number {\n return parseFloat(formatEther(priceWei));\n}\n","/**\n * Validation utilities for checking order status and ownership\n */\n\nimport { PublicClient } from \"viem\";\nimport { readContract } from \"viem/actions\";\nimport {\n BULK_SEAPORT_ORDER_STATUS_FETCHER_ABI,\n ERC721_OWNER_OF_HELPER_ABI,\n ERC20_BULK_BALANCE_CHECKER_ABI,\n} from \"../abis\";\nimport {\n BULK_SEAPORT_ORDER_STATUS_FETCHER_ADDRESS,\n ERC721_OWNER_OF_HELPER_ADDRESS,\n ERC20_BULK_BALANCE_CHECKER_ADDRESS,\n getSeaportAddress,\n} from \"../chainConfig\";\nimport { SeaportOrderStatusInfo, SeaportOrderStatus } from \"../types\";\n\n/**\n * Bulk fetch Seaport order statuses\n */\nexport async function bulkFetchOrderStatuses(\n client: PublicClient,\n chainId: number,\n orderHashes: `0x${string}`[]\n): Promise<SeaportOrderStatusInfo[]> {\n if (orderHashes.length === 0) {\n return [];\n }\n\n const seaportAddress = getSeaportAddress(chainId);\n\n const results = await readContract(client, {\n address: BULK_SEAPORT_ORDER_STATUS_FETCHER_ADDRESS,\n abi: BULK_SEAPORT_ORDER_STATUS_FETCHER_ABI,\n functionName: \"getOrderStatuses\",\n args: [seaportAddress, orderHashes],\n });\n\n return (results as any[]).map((r) => ({\n isValidated: r.isValidated,\n isCancelled: r.isCancelled,\n totalFilled: BigInt(r.totalFilled),\n totalSize: BigInt(r.totalSize),\n }));\n}\n\n/**\n * Create a mapping of order hash to status\n */\nexport async function createOrderStatusMap(\n client: PublicClient,\n chainId: number,\n orderHashes: `0x${string}`[]\n): Promise<Map<string, SeaportOrderStatusInfo>> {\n const statuses = await bulkFetchOrderStatuses(client, chainId, orderHashes);\n\n const map = new Map<string, SeaportOrderStatusInfo>();\n orderHashes.forEach((hash, index) => {\n map.set(hash.toLowerCase(), statuses[index]);\n });\n\n return map;\n}\n\n/**\n * Bulk fetch NFT owners for specific token IDs\n */\nexport async function bulkFetchNftOwners(\n client: PublicClient,\n nftAddress: `0x${string}`,\n tokenIds: string[]\n): Promise<(`0x${string}` | null)[]> {\n if (tokenIds.length === 0) {\n return [];\n }\n\n try {\n const owners = await readContract(client, {\n address: ERC721_OWNER_OF_HELPER_ADDRESS,\n abi: ERC721_OWNER_OF_HELPER_ABI,\n functionName: \"getTokenOwners\",\n args: [nftAddress, tokenIds.map((id) => BigInt(id))],\n });\n\n return (owners as `0x${string}`[]).map((owner) =>\n owner === \"0x0000000000000000000000000000000000000000\" ? null : owner\n );\n } catch {\n // If the helper fails, return nulls\n return tokenIds.map(() => null);\n }\n}\n\n/**\n * Create a mapping of token ID to owner address\n */\nexport async function createOwnershipMap(\n client: PublicClient,\n nftAddress: `0x${string}`,\n tokenIds: string[]\n): Promise<Map<string, `0x${string}` | null>> {\n const owners = await bulkFetchNftOwners(client, nftAddress, tokenIds);\n\n const map = new Map<string, `0x${string}` | null>();\n tokenIds.forEach((tokenId, index) => {\n map.set(tokenId, owners[index]);\n });\n\n return map;\n}\n\n/**\n * Bulk fetch ERC20 balances for addresses\n */\nexport async function bulkFetchErc20Balances(\n client: PublicClient,\n tokenAddress: `0x${string}`,\n addresses: `0x${string}`[]\n): Promise<bigint[]> {\n if (addresses.length === 0) {\n return [];\n }\n\n try {\n const balances = await readContract(client, {\n address: ERC20_BULK_BALANCE_CHECKER_ADDRESS,\n abi: ERC20_BULK_BALANCE_CHECKER_ABI,\n functionName: \"getBalances\",\n args: [tokenAddress, addresses],\n });\n\n return (balances as bigint[]).map((b) => BigInt(b));\n } catch {\n // If the helper fails, return zeros\n return addresses.map(() => BigInt(0));\n }\n}\n\n/**\n * Create a mapping of address to ERC20 balance\n */\nexport async function createBalanceMap(\n client: PublicClient,\n tokenAddress: `0x${string}`,\n addresses: `0x${string}`[]\n): Promise<Map<string, bigint>> {\n const balances = await bulkFetchErc20Balances(client, tokenAddress, addresses);\n\n const map = new Map<string, bigint>();\n addresses.forEach((address, index) => {\n map.set(address.toLowerCase(), balances[index]);\n });\n\n return map;\n}\n\n/**\n * Validate that a listing is still valid:\n * - Order is OPEN\n * - Not expired\n * - Seller still owns the NFT\n */\nexport function isListingValid(\n orderStatus: SeaportOrderStatus,\n expirationDate: number,\n sellerAddress: `0x${string}`,\n currentOwner: `0x${string}` | null\n): boolean {\n if (orderStatus !== SeaportOrderStatus.OPEN) {\n return false;\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (expirationDate <= now) {\n return false;\n }\n\n if (!currentOwner || currentOwner.toLowerCase() !== sellerAddress.toLowerCase()) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate that a collection offer is still valid:\n * - Order is OPEN\n * - Not expired\n * - Buyer has sufficient WETH balance\n */\nexport function isCollectionOfferValid(\n orderStatus: SeaportOrderStatus,\n expirationDate: number,\n priceWei: bigint,\n buyerBalance: bigint\n): boolean {\n if (orderStatus !== SeaportOrderStatus.OPEN) {\n return false;\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (expirationDate <= now) {\n return false;\n }\n\n if (buyerBalance < priceWei) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate that an ERC20 offer is still valid:\n * - Order is OPEN\n * - Not expired\n * - Buyer has sufficient WETH balance\n */\nexport function isErc20OfferValid(\n orderStatus: SeaportOrderStatus,\n expirationDate: number,\n priceWei: bigint,\n buyerWethBalance: bigint\n): boolean {\n if (orderStatus !== SeaportOrderStatus.OPEN) {\n return false;\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (expirationDate <= now) {\n return false;\n }\n\n if (buyerWethBalance < priceWei) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate that an ERC20 listing is still valid:\n * - Order is OPEN\n * - Not expired\n * - Seller has sufficient ERC20 token balance\n */\nexport function isErc20ListingValid(\n orderStatus: SeaportOrderStatus,\n expirationDate: number,\n tokenAmount: bigint,\n sellerTokenBalance: bigint\n): boolean {\n if (orderStatus !== SeaportOrderStatus.OPEN) {\n return false;\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (expirationDate <= now) {\n return false;\n }\n\n if (sellerTokenBalance < tokenAmount) {\n return false;\n }\n\n return true;\n}\n","/**\n * Utilities for parsing Net messages into listings and offers\n */\n\nimport { NetMessage } from \"@net-protocol/core\";\nimport { Listing, CollectionOffer, Erc20Offer, Erc20Listing, SeaportOrderStatus, ItemType } from \"../types\";\nimport {\n decodeSeaportSubmission,\n getSeaportOrderFromMessageData,\n getTotalConsiderationAmount,\n formatPrice,\n} from \"./seaport\";\nimport { getCurrencySymbol, NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS } from \"../chainConfig\";\n\n/**\n * Parse a Net message into an NFT listing\n */\nexport function parseListingFromMessage(\n message: NetMessage,\n chainId: number\n): Listing | null {\n try {\n const submission = decodeSeaportSubmission(message.data as `0x${string}`);\n const { parameters } = submission;\n\n // NFT listings have the NFT in the offer array\n const offerItem = parameters.offer[0];\n if (!offerItem) {\n return null;\n }\n\n // Must be ERC721 or ERC1155\n if (offerItem.itemType !== ItemType.ERC721 && offerItem.itemType !== ItemType.ERC1155) {\n return null;\n }\n\n const priceWei = getTotalConsiderationAmount(parameters);\n const tokenId = offerItem.identifierOrCriteria.toString();\n\n return {\n maker: parameters.offerer,\n nftAddress: offerItem.token,\n tokenId,\n priceWei,\n price: formatPrice(priceWei),\n currency: getCurrencySymbol(chainId),\n expirationDate: Number(parameters.endTime),\n orderHash: \"\", // Will be computed later\n orderStatus: SeaportOrderStatus.OPEN, // Will be validated later\n messageData: message.data as `0x${string}`,\n orderComponents: {\n ...parameters,\n counter: submission.counter,\n },\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Parse a Net message into a collection offer\n */\nexport function parseCollectionOfferFromMessage(\n message: NetMessage,\n chainId: number\n): CollectionOffer | null {\n try {\n const submission = decodeSeaportSubmission(message.data as `0x${string}`);\n const { parameters } = submission;\n\n // Collection offers must use the collection offer zone\n if (\n parameters.zone.toLowerCase() !==\n NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS.toLowerCase()\n ) {\n return null;\n }\n\n // Collection offers have WETH in the offer array\n const offerItem = parameters.offer[0];\n if (!offerItem || offerItem.itemType !== ItemType.ERC20) {\n return null;\n }\n\n // The NFT is in the consideration array with criteria type\n const nftConsideration = parameters.consideration.find(\n (item) =>\n item.itemType === ItemType.ERC721_WITH_CRITERIA ||\n item.itemType === ItemType.ERC1155_WITH_CRITERIA\n );\n\n if (!nftConsideration) {\n return null;\n }\n\n // Only support single NFT offers\n if (nftConsideration.startAmount !== BigInt(1)) {\n return null;\n }\n\n const priceWei = offerItem.startAmount;\n\n return {\n maker: parameters.offerer,\n nftAddress: nftConsideration.token,\n priceWei,\n price: formatPrice(priceWei),\n currency: getCurrencySymbol(chainId),\n expirationDate: Number(parameters.endTime),\n orderHash: \"\", // Will be computed later\n orderStatus: SeaportOrderStatus.OPEN, // Will be validated later\n messageData: message.data as `0x${string}`,\n orderComponents: {\n ...parameters,\n counter: submission.counter,\n },\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Get the best listing for each token (lowest price)\n */\nexport function getBestListingPerToken(listings: Listing[]): Listing[] {\n const tokenMap = new Map<string, Listing>();\n\n for (const listing of listings) {\n const key = `${listing.nftAddress.toLowerCase()}-${listing.tokenId}`;\n const existing = tokenMap.get(key);\n\n if (!existing || listing.priceWei < existing.priceWei) {\n tokenMap.set(key, listing);\n }\n }\n\n return Array.from(tokenMap.values());\n}\n\n/**\n * Get the best collection offer (highest price)\n */\nexport function getBestCollectionOffer(offers: CollectionOffer[]): CollectionOffer | null {\n if (offers.length === 0) {\n return null;\n }\n\n return offers.reduce((best, current) =>\n current.priceWei > best.priceWei ? current : best\n );\n}\n\n/**\n * Sort listings by price (lowest first)\n */\nexport function sortListingsByPrice(listings: Listing[]): Listing[] {\n return [...listings].sort((a, b) => {\n const diff = a.priceWei - b.priceWei;\n if (diff < BigInt(0)) return -1;\n if (diff > BigInt(0)) return 1;\n return 0;\n });\n}\n\n/**\n * Sort offers by price (highest first)\n */\nexport function sortOffersByPrice(offers: CollectionOffer[]): CollectionOffer[] {\n return [...offers].sort((a, b) => {\n const diff = b.priceWei - a.priceWei;\n if (diff < BigInt(0)) return -1;\n if (diff > BigInt(0)) return 1;\n return 0;\n });\n}\n\n/**\n * Parse a Net message into an ERC20 offer\n */\nexport function parseErc20OfferFromMessage(\n message: NetMessage,\n chainId: number\n): Erc20Offer | null {\n try {\n const submission = decodeSeaportSubmission(message.data as `0x${string}`);\n const { parameters } = submission;\n\n // ERC20 offers must use the collection offer zone\n if (\n parameters.zone.toLowerCase() !==\n NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS.toLowerCase()\n ) {\n return null;\n }\n\n // ERC20 offers have WETH in the offer array\n const offerItem = parameters.offer[0];\n if (!offerItem || offerItem.itemType !== ItemType.ERC20) {\n return null;\n }\n\n // The ERC20 token being purchased is in the consideration array\n const erc20Consideration = parameters.consideration.find(\n (item) => item.itemType === ItemType.ERC20\n );\n\n if (!erc20Consideration) {\n return null;\n }\n\n // Must have a non-zero token amount\n const tokenAmount = erc20Consideration.startAmount;\n if (tokenAmount === BigInt(0)) {\n return null;\n }\n\n const priceWei = offerItem.startAmount;\n const pricePerTokenWei = priceWei / tokenAmount;\n\n return {\n maker: parameters.offerer,\n tokenAddress: erc20Consideration.token,\n tokenAmount,\n priceWei,\n pricePerTokenWei,\n price: formatPrice(priceWei),\n pricePerToken: formatPrice(pricePerTokenWei),\n currency: getCurrencySymbol(chainId),\n expirationDate: Number(parameters.endTime),\n orderHash: \"0x\" as `0x${string}`, // Will be computed later\n orderStatus: SeaportOrderStatus.OPEN, // Will be validated later\n messageData: message.data as `0x${string}`,\n orderComponents: {\n ...parameters,\n counter: submission.counter,\n },\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Sort ERC20 offers by price per token (highest first)\n */\nexport function sortErc20OffersByPricePerToken(offers: Erc20Offer[]): Erc20Offer[] {\n return [...offers].sort((a, b) => {\n const diff = b.pricePerTokenWei - a.pricePerTokenWei;\n if (diff < BigInt(0)) return -1;\n if (diff > BigInt(0)) return 1;\n return 0;\n });\n}\n\n/**\n * Parse a Net message into an ERC20 listing\n *\n * ERC20 listings have the ERC20 token in the offer array (seller is offering tokens)\n * and native currency payments in the consideration array.\n * They do NOT use the collection offer zone (that would be an offer, not a listing).\n */\nexport function parseErc20ListingFromMessage(\n message: NetMessage,\n chainId: number\n): Erc20Listing | null {\n try {\n const submission = decodeSeaportSubmission(message.data as `0x${string}`);\n const { parameters } = submission;\n\n // ERC20 listings must NOT use the collection offer zone (that would be an offer)\n if (\n parameters.zone.toLowerCase() ===\n NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS.toLowerCase()\n ) {\n return null;\n }\n\n // ERC20 listings have the ERC20 token in the offer array\n const offerItem = parameters.offer[0];\n if (!offerItem || offerItem.itemType !== ItemType.ERC20) {\n return null;\n }\n\n const tokenAmount = offerItem.startAmount;\n if (tokenAmount === BigInt(0)) {\n return null;\n }\n\n const priceWei = getTotalConsiderationAmount(parameters);\n if (priceWei === BigInt(0)) {\n return null;\n }\n\n const pricePerTokenWei = priceWei / tokenAmount;\n\n return {\n maker: parameters.offerer,\n tokenAddress: offerItem.token,\n tokenAmount,\n priceWei,\n pricePerTokenWei,\n price: formatPrice(priceWei),\n pricePerToken: formatPrice(pricePerTokenWei),\n currency: getCurrencySymbol(chainId),\n expirationDate: Number(parameters.endTime),\n orderHash: \"0x\" as `0x${string}`, // Will be computed later\n orderStatus: SeaportOrderStatus.OPEN, // Will be validated later\n messageData: message.data as `0x${string}`,\n orderComponents: {\n ...parameters,\n counter: submission.counter,\n },\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Sort ERC20 listings by price per token (lowest first)\n */\nexport function sortErc20ListingsByPricePerToken(listings: Erc20Listing[]): Erc20Listing[] {\n return [...listings].sort((a, b) => {\n const diff = a.pricePerTokenWei - b.pricePerTokenWei;\n if (diff < BigInt(0)) return -1;\n if (diff > BigInt(0)) return 1;\n return 0;\n });\n}\n","/**\n * BazaarClient - Client for interacting with Net Bazaar (NFT marketplace)\n *\n * Provides methods for:\n * - Reading NFT listings and collection offers\n * - Preparing transactions for creating/canceling listings and offers\n */\n\nimport { PublicClient, createPublicClient, defineChain, http } from \"viem\";\nimport { NetClient } from \"@net-protocol/core\";\nimport {\n Listing,\n CollectionOffer,\n Erc20Offer,\n Erc20Listing,\n GetListingsOptions,\n GetCollectionOffersOptions,\n GetErc20OffersOptions,\n GetErc20ListingsOptions,\n SeaportOrderStatus,\n WriteTransactionConfig,\n SeaportOrderComponents,\n} from \"../types\";\nimport { SEAPORT_CANCEL_ABI } from \"../abis\";\nimport {\n getBazaarChainConfig,\n getBazaarAddress,\n getCollectionOffersAddress,\n getErc20OffersAddress,\n getErc20BazaarAddress,\n getSeaportAddress,\n getWrappedNativeCurrency,\n isBazaarSupportedOnChain,\n} from \"../chainConfig\";\nimport {\n parseListingFromMessage,\n parseCollectionOfferFromMessage,\n parseErc20OfferFromMessage,\n parseErc20ListingFromMessage,\n getBestListingPerToken,\n sortListingsByPrice,\n sortOffersByPrice,\n sortErc20OffersByPricePerToken,\n sortErc20ListingsByPricePerToken,\n createSeaportInstance,\n computeOrderHash,\n getSeaportOrderFromMessageData,\n getOrderStatusFromInfo,\n} from \"../utils\";\nimport {\n bulkFetchOrderStatuses,\n bulkFetchNftOwners,\n bulkFetchErc20Balances,\n isListingValid,\n isCollectionOfferValid,\n isErc20OfferValid,\n isErc20ListingValid,\n} from \"../utils/validation\";\n\n// Default RPC URLs for chains (same as @net-protocol/core)\nconst CHAIN_RPC_URLS: Record<number, string[]> = {\n 8453: [\"https://base-mainnet.public.blastapi.io\", \"https://mainnet.base.org\"],\n 84532: [\"https://sepolia.base.org\"],\n 666666666: [\"https://rpc.degen.tips\"],\n 5112: [\"https://rpc.ham.fun\"],\n 57073: [\"https://rpc-qnd.inkonchain.com\"],\n 130: [\"https://mainnet.unichain.org\"],\n 999: [\"https://rpc.hyperliquid.xyz/evm\"],\n 9745: [\"https://rpc.plasma.to\"],\n 143: [\"https://rpc3.monad.xyz\"],\n};\n\nexport class BazaarClient {\n private chainId: number;\n private client: PublicClient;\n private netClient: NetClient;\n private rpcUrl: string;\n\n constructor(params: { chainId: number; rpcUrl?: string }) {\n if (!isBazaarSupportedOnChain(params.chainId)) {\n throw new Error(`Bazaar is not supported on chain ${params.chainId}`);\n }\n\n this.chainId = params.chainId;\n this.rpcUrl = params.rpcUrl || CHAIN_RPC_URLS[params.chainId]?.[0] || \"\";\n\n if (!this.rpcUrl) {\n throw new Error(`No RPC URL available for chain ${params.chainId}`);\n }\n\n const config = getBazaarChainConfig(params.chainId)!;\n\n this.client = createPublicClient({\n chain: defineChain({\n id: params.chainId,\n name: `Chain ${params.chainId}`,\n nativeCurrency: {\n name: config.wrappedNativeCurrency.name.replace(\"Wrapped \", \"\"),\n symbol: config.currencySymbol.toUpperCase(),\n decimals: 18,\n },\n rpcUrls: {\n default: { http: [this.rpcUrl] },\n },\n }),\n transport: http(this.rpcUrl),\n batch: { multicall: true },\n });\n\n this.netClient = new NetClient({\n chainId: params.chainId,\n overrides: params.rpcUrl ? { rpcUrls: [params.rpcUrl] } : undefined,\n });\n }\n\n /**\n * Get valid NFT listings for a collection\n *\n * Returns listings that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Seller still owns the NFT\n *\n * Results are deduplicated (one per token) and sorted by price (lowest first)\n */\n async getListings(options: GetListingsOptions): Promise<Listing[]> {\n const { nftAddress, excludeMaker, maxMessages = 200 } = options;\n const bazaarAddress = getBazaarAddress(this.chainId);\n\n // Get message count\n const count = await this.netClient.getMessageCount({\n filter: {\n appAddress: bazaarAddress,\n topic: nftAddress.toLowerCase(),\n },\n });\n\n if (count === 0) {\n return [];\n }\n\n // Fetch messages (most recent)\n const startIndex = Math.max(0, count - maxMessages);\n const messages = await this.netClient.getMessages({\n filter: {\n appAddress: bazaarAddress,\n topic: nftAddress.toLowerCase(),\n },\n startIndex,\n endIndex: count,\n });\n\n // Parse messages into listings\n let listings: Listing[] = [];\n for (const message of messages) {\n const listing = parseListingFromMessage(message, this.chainId);\n if (!listing) continue;\n\n // Filter by excludeMaker\n if (excludeMaker && listing.maker.toLowerCase() === excludeMaker.toLowerCase()) {\n continue;\n }\n\n listings.push(listing);\n }\n\n if (listings.length === 0) {\n return [];\n }\n\n // Compute order hashes\n const seaport = createSeaportInstance(this.chainId, this.rpcUrl);\n for (const listing of listings) {\n const order = getSeaportOrderFromMessageData(listing.messageData);\n listing.orderHash = computeOrderHash(seaport, order.parameters, order.counter) as `0x${string}`;\n }\n\n // Fetch order statuses\n const orderHashes = listings.map((l) => l.orderHash as `0x${string}`);\n const statusInfos = await bulkFetchOrderStatuses(this.client, this.chainId, orderHashes);\n\n // Update order statuses\n listings.forEach((listing, index) => {\n const statusInfo = statusInfos[index];\n listing.orderStatus = getOrderStatusFromInfo(listing.orderComponents!, statusInfo);\n });\n\n // Filter to OPEN orders only\n listings = listings.filter(\n (l) =>\n l.orderStatus === SeaportOrderStatus.OPEN &&\n l.expirationDate > Math.floor(Date.now() / 1000)\n );\n\n if (listings.length === 0) {\n return [];\n }\n\n // Validate ownership\n const tokenIds = listings.map((l) => l.tokenId);\n const owners = await bulkFetchNftOwners(this.client, nftAddress, tokenIds);\n\n // Filter to listings where seller still owns the NFT\n listings = listings.filter((listing, index) => {\n const owner = owners[index];\n return isListingValid(\n listing.orderStatus,\n listing.expirationDate,\n listing.maker,\n owner\n );\n });\n\n // Deduplicate (best price per token) and sort\n return sortListingsByPrice(getBestListingPerToken(listings));\n }\n\n /**\n * Get valid collection offers for a collection\n *\n * Returns offers that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Buyer has sufficient WETH balance\n *\n * Results are sorted by price (highest first)\n */\n async getCollectionOffers(options: GetCollectionOffersOptions): Promise<CollectionOffer[]> {\n const { nftAddress, excludeMaker, maxMessages = 100 } = options;\n const collectionOffersAddress = getCollectionOffersAddress(this.chainId);\n const weth = getWrappedNativeCurrency(this.chainId);\n\n if (!weth) {\n return [];\n }\n\n // Get message count\n const count = await this.netClient.getMessageCount({\n filter: {\n appAddress: collectionOffersAddress,\n topic: nftAddress.toLowerCase(),\n },\n });\n\n if (count === 0) {\n return [];\n }\n\n // Fetch messages (most recent)\n const startIndex = Math.max(0, count - maxMessages);\n const messages = await this.netClient.getMessages({\n filter: {\n appAddress: collectionOffersAddress,\n topic: nftAddress.toLowerCase(),\n },\n startIndex,\n endIndex: count,\n });\n\n // Parse messages into offers\n let offers: CollectionOffer[] = [];\n for (const message of messages) {\n const offer = parseCollectionOfferFromMessage(message, this.chainId);\n if (!offer) continue;\n\n // Validate WETH token matches\n const order = getSeaportOrderFromMessageData(offer.messageData);\n const offerToken = order.parameters.offer?.[0]?.token?.toLowerCase();\n if (offerToken !== weth.address.toLowerCase()) {\n continue;\n }\n\n // Filter by excludeMaker\n if (excludeMaker && offer.maker.toLowerCase() === excludeMaker.toLowerCase()) {\n continue;\n }\n\n offers.push(offer);\n }\n\n if (offers.length === 0) {\n return [];\n }\n\n // Compute order hashes\n const seaport = createSeaportInstance(this.chainId, this.rpcUrl);\n for (const offer of offers) {\n const order = getSeaportOrderFromMessageData(offer.messageData);\n offer.orderHash = computeOrderHash(seaport, order.parameters, order.counter) as `0x${string}`;\n }\n\n // Fetch order statuses\n const orderHashes = offers.map((o) => o.orderHash as `0x${string}`);\n const statusInfos = await bulkFetchOrderStatuses(this.client, this.chainId, orderHashes);\n\n // Update order statuses\n offers.forEach((offer, index) => {\n const statusInfo = statusInfos[index];\n offer.orderStatus = getOrderStatusFromInfo(offer.orderComponents!, statusInfo);\n });\n\n // Filter to OPEN orders only\n offers = offers.filter(\n (o) =>\n o.orderStatus === SeaportOrderStatus.OPEN &&\n o.expirationDate > Math.floor(Date.now() / 1000)\n );\n\n if (offers.length === 0) {\n return [];\n }\n\n // Validate WETH balances\n const uniqueMakers = [...new Set(offers.map((o) => o.maker))];\n const balances = await bulkFetchErc20Balances(this.client, weth.address, uniqueMakers);\n\n const balanceMap = new Map<string, bigint>();\n uniqueMakers.forEach((maker, index) => {\n balanceMap.set(maker.toLowerCase(), balances[index]);\n });\n\n // Filter to offers where buyer has sufficient balance\n offers = offers.filter((offer) => {\n const balance = balanceMap.get(offer.maker.toLowerCase()) || BigInt(0);\n return isCollectionOfferValid(\n offer.orderStatus,\n offer.expirationDate,\n offer.priceWei,\n balance\n );\n });\n\n // Sort by price (highest first)\n return sortOffersByPrice(offers);\n }\n\n /**\n * Get valid ERC20 offers for a token\n *\n * ERC20 offers are only available on Base (8453) and HyperEVM (999).\n *\n * Returns offers that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Buyer has sufficient WETH balance\n *\n * Results are sorted by price per token (highest first)\n */\n async getErc20Offers(options: GetErc20OffersOptions): Promise<Erc20Offer[]> {\n const { tokenAddress, excludeMaker, maxMessages = 200 } = options;\n const erc20OffersAddress = getErc20OffersAddress(this.chainId);\n const weth = getWrappedNativeCurrency(this.chainId);\n\n // ERC20 offers only available on Base and HyperEVM\n if (!erc20OffersAddress || !weth) {\n return [];\n }\n\n // Get message count\n const count = await this.netClient.getMessageCount({\n filter: {\n appAddress: erc20OffersAddress,\n topic: tokenAddress.toLowerCase(),\n },\n });\n\n if (count === 0) {\n return [];\n }\n\n // Fetch messages (most recent)\n const startIndex = Math.max(0, count - maxMessages);\n const messages = await this.netClient.getMessages({\n filter: {\n appAddress: erc20OffersAddress,\n topic: tokenAddress.toLowerCase(),\n },\n startIndex,\n endIndex: count,\n });\n\n // Parse messages into offers\n let offers: Erc20Offer[] = [];\n for (const message of messages) {\n const offer = parseErc20OfferFromMessage(message, this.chainId);\n if (!offer) continue;\n\n // Validate WETH token matches\n const order = getSeaportOrderFromMessageData(offer.messageData);\n const offerToken = order.parameters.offer?.[0]?.token?.toLowerCase();\n if (offerToken !== weth.address.toLowerCase()) {\n continue;\n }\n\n // Validate the consideration token matches the requested token\n if (offer.tokenAddress.toLowerCase() !== tokenAddress.toLowerCase()) {\n continue;\n }\n\n // Filter by excludeMaker\n if (excludeMaker && offer.maker.toLowerCase() === excludeMaker.toLowerCase()) {\n continue;\n }\n\n offers.push(offer);\n }\n\n if (offers.length === 0) {\n return [];\n }\n\n // Compute order hashes\n const seaport = createSeaportInstance(this.chainId, this.rpcUrl);\n for (const offer of offers) {\n const order = getSeaportOrderFromMessageData(offer.messageData);\n offer.orderHash = computeOrderHash(seaport, order.parameters, order.counter) as `0x${string}`;\n }\n\n // Fetch order statuses\n const orderHashes = offers.map((o) => o.orderHash);\n const statusInfos = await bulkFetchOrderStatuses(this.client, this.chainId, orderHashes);\n\n // Update order statuses\n offers.forEach((offer, index) => {\n const statusInfo = statusInfos[index];\n offer.orderStatus = getOrderStatusFromInfo(offer.orderComponents!, statusInfo);\n });\n\n // Filter to OPEN orders only\n offers = offers.filter(\n (o) =>\n o.orderStatus === SeaportOrderStatus.OPEN &&\n o.expirationDate > Math.floor(Date.now() / 1000)\n );\n\n if (offers.length === 0) {\n return [];\n }\n\n // Validate WETH balances\n const uniqueMakers = [...new Set(offers.map((o) => o.maker))];\n const balances = await bulkFetchErc20Balances(this.client, weth.address, uniqueMakers);\n\n const balanceMap = new Map<string, bigint>();\n uniqueMakers.forEach((maker, index) => {\n balanceMap.set(maker.toLowerCase(), balances[index]);\n });\n\n // Filter to offers where buyer has sufficient balance\n offers = offers.filter((offer) => {\n const balance = balanceMap.get(offer.maker.toLowerCase()) || BigInt(0);\n return isErc20OfferValid(\n offer.orderStatus,\n offer.expirationDate,\n offer.priceWei,\n balance\n );\n });\n\n // Sort by price per token (highest first) - no deduplication for ERC20 offers\n return sortErc20OffersByPricePerToken(offers);\n }\n\n /**\n * Get valid ERC20 listings for a token\n *\n * Returns listings that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Seller has sufficient ERC20 token balance\n *\n * Results are sorted by price per token (lowest first). No deduplication —\n * all valid listings are returned (grouped by maker in the UI).\n */\n async getErc20Listings(options: GetErc20ListingsOptions): Promise<Erc20Listing[]> {\n const { tokenAddress, excludeMaker, maxMessages = 200 } = options;\n const erc20BazaarAddress = getErc20BazaarAddress(this.chainId);\n\n // Get message count\n const count = await this.netClient.getMessageCount({\n filter: {\n appAddress: erc20BazaarAddress,\n topic: tokenAddress.toLowerCase(),\n },\n });\n\n if (count === 0) {\n return [];\n }\n\n // Fetch messages (most recent)\n const startIndex = Math.max(0, count - maxMessages);\n const messages = await this.netClient.getMessages({\n filter: {\n appAddress: erc20BazaarAddress,\n topic: tokenAddress.toLowerCase(),\n },\n startIndex,\n endIndex: count,\n });\n\n // Parse messages into listings\n let listings: Erc20Listing[] = [];\n for (const message of messages) {\n const listing = parseErc20ListingFromMessage(message, this.chainId);\n if (!listing) continue;\n\n // Validate the offer token matches the requested token\n if (listing.tokenAddress.toLowerCase() !== tokenAddress.toLowerCase()) {\n continue;\n }\n\n // Filter by excludeMaker\n if (excludeMaker && listing.maker.toLowerCase() === excludeMaker.toLowerCase()) {\n continue;\n }\n\n listings.push(listing);\n }\n\n if (listings.length === 0) {\n return [];\n }\n\n // Compute order hashes\n const seaport = createSeaportInstance(this.chainId, this.rpcUrl);\n for (const listing of listings) {\n const order = getSeaportOrderFromMessageData(listing.messageData);\n listing.orderHash = computeOrderHash(seaport, order.parameters, order.counter) as `0x${string}`;\n }\n\n // Fetch order statuses\n const orderHashes = listings.map((l) => l.orderHash);\n const statusInfos = await bulkFetchOrderStatuses(this.client, this.chainId, orderHashes);\n\n // Update order statuses\n listings.forEach((listing, index) => {\n const statusInfo = statusInfos[index];\n listing.orderStatus = getOrderStatusFromInfo(listing.orderComponents!, statusInfo);\n });\n\n // Filter to OPEN orders only\n listings = listings.filter(\n (l) =>\n l.orderStatus === SeaportOrderStatus.OPEN &&\n l.expirationDate > Math.floor(Date.now() / 1000)\n );\n\n if (listings.length === 0) {\n return [];\n }\n\n // Validate seller's ERC20 balances\n const uniqueMakers = [...new Set(listings.map((l) => l.maker))];\n const balances = await bulkFetchErc20Balances(this.client, tokenAddress, uniqueMakers);\n\n const balanceMap = new Map<string, bigint>();\n uniqueMakers.forEach((maker, index) => {\n balanceMap.set(maker.toLowerCase(), balances[index]);\n });\n\n // Filter to listings where seller has sufficient token balance\n listings = listings.filter((listing) => {\n const balance = balanceMap.get(listing.maker.toLowerCase()) || BigInt(0);\n return isErc20ListingValid(\n listing.orderStatus,\n listing.expirationDate,\n listing.tokenAmount,\n balance\n );\n });\n\n // Sort by price per token (lowest first) — no deduplication for ERC20 listings\n return sortErc20ListingsByPricePerToken(listings);\n }\n\n /**\n * Get the chain ID this client is configured for\n */\n getChainId(): number {\n return this.chainId;\n }\n\n /**\n * Get the bazaar contract address for this chain\n */\n getBazaarAddress(): `0x${string}` {\n return getBazaarAddress(this.chainId);\n }\n\n /**\n * Get the collection offers contract address for this chain\n */\n getCollectionOffersAddress(): `0x${string}` {\n return getCollectionOffersAddress(this.chainId);\n }\n\n /**\n * Get the ERC20 offers contract address for this chain\n * Only available on Base (8453) and HyperEVM (999)\n */\n getErc20OffersAddress(): `0x${string}` | undefined {\n return getErc20OffersAddress(this.chainId);\n }\n\n /**\n * Get the ERC20 bazaar (listings) contract address for this chain\n */\n getErc20BazaarAddress(): `0x${string}` {\n return getErc20BazaarAddress(this.chainId);\n }\n\n /**\n * Get the Seaport contract address for this chain\n */\n getSeaportAddress(): `0x${string}` {\n return getSeaportAddress(this.chainId);\n }\n\n /**\n * Prepare a transaction to cancel a listing\n *\n * The listing must have been created by the caller.\n * Use the orderComponents from the Listing object returned by getListings().\n */\n prepareCancelListing(listing: Listing): WriteTransactionConfig {\n if (!listing.orderComponents) {\n throw new Error(\"Listing does not have order components\");\n }\n\n return this.prepareCancelOrder(listing.orderComponents);\n }\n\n /**\n * Prepare a transaction to cancel a collection offer\n *\n * The offer must have been created by the caller.\n * Use the orderComponents from the CollectionOffer object returned by getCollectionOffers().\n */\n prepareCancelCollectionOffer(offer: CollectionOffer): WriteTransactionConfig {\n if (!offer.orderComponents) {\n throw new Error(\"Offer does not have order components\");\n }\n\n return this.prepareCancelOrder(offer.orderComponents);\n }\n\n /**\n * Prepare a transaction to cancel an ERC20 listing\n *\n * The listing must have been created by the caller.\n * Use the orderComponents from the Erc20Listing object returned by getErc20Listings().\n */\n prepareCancelErc20Listing(listing: Erc20Listing): WriteTransactionConfig {\n if (!listing.orderComponents) {\n throw new Error(\"Listing does not have order components\");\n }\n\n return this.prepareCancelOrder(listing.orderComponents);\n }\n\n /**\n * Prepare a transaction to cancel a Seaport order\n *\n * This is a low-level method. Prefer prepareCancelListing or prepareCancelCollectionOffer.\n */\n prepareCancelOrder(orderComponents: SeaportOrderComponents): WriteTransactionConfig {\n const seaportAddress = getSeaportAddress(this.chainId);\n\n // Convert order components to the format expected by Seaport\n const orderForCancel = {\n offerer: orderComponents.offerer,\n zone: orderComponents.zone,\n offer: orderComponents.offer.map((item) => ({\n itemType: item.itemType,\n token: item.token,\n identifierOrCriteria: item.identifierOrCriteria,\n startAmount: item.startAmount,\n endAmount: item.endAmount,\n })),\n consideration: orderComponents.consideration.map((item) => ({\n itemType: item.itemType,\n token: item.token,\n identifierOrCriteria: item.identifierOrCriteria,\n startAmount: item.startAmount,\n endAmount: item.endAmount,\n recipient: item.recipient,\n })),\n orderType: orderComponents.orderType,\n startTime: orderComponents.startTime,\n endTime: orderComponents.endTime,\n zoneHash: orderComponents.zoneHash,\n salt: orderComponents.salt,\n conduitKey: orderComponents.conduitKey,\n counter: orderComponents.counter,\n };\n\n return {\n to: seaportAddress,\n functionName: \"cancel\",\n args: [[orderForCancel]],\n abi: SEAPORT_CANCEL_ABI,\n };\n }\n}\n","/**\n * React hook for fetching NFT listings from Bazaar\n */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { useNetMessages, useNetMessageCount } from \"@net-protocol/core/react\";\nimport { BazaarClient } from \"../client/BazaarClient\";\nimport { Listing, SeaportOrderStatus } from \"../types\";\nimport { getBazaarAddress, isBazaarSupportedOnChain } from \"../chainConfig\";\n\nexport interface UseBazaarListingsOptions {\n /** Chain ID to query */\n chainId: number;\n /** NFT collection address */\n nftAddress: `0x${string}`;\n /** Exclude listings from this address */\n excludeMaker?: `0x${string}`;\n /** Maximum number of messages to fetch (default: 200) */\n maxMessages?: number;\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseBazaarListingsResult {\n /** Valid listings (deduplicated, sorted by price) */\n listings: Listing[];\n /** Whether the data is loading */\n isLoading: boolean;\n /** Error if any */\n error: Error | undefined;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * React hook for fetching valid NFT listings from Bazaar\n *\n * Returns listings that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Seller still owns the NFT\n *\n * Results are deduplicated (one per token) and sorted by price (lowest first)\n *\n * @example\n * ```tsx\n * const { listings, isLoading, error } = useBazaarListings({\n * chainId: 8453,\n * nftAddress: \"0x...\",\n * maxMessages: 100,\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return (\n * <ul>\n * {listings.map((listing) => (\n * <li key={listing.orderHash}>\n * Token #{listing.tokenId} - {listing.price} {listing.currency}\n * </li>\n * ))}\n * </ul>\n * );\n * ```\n */\nexport function useBazaarListings({\n chainId,\n nftAddress,\n excludeMaker,\n maxMessages = 200,\n enabled = true,\n}: UseBazaarListingsOptions): UseBazaarListingsResult {\n const [listings, setListings] = useState<Listing[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [processingError, setProcessingError] = useState<Error | undefined>();\n const [refetchTrigger, setRefetchTrigger] = useState(0);\n\n // Check if chain is supported\n const isSupported = useMemo(\n () => isBazaarSupportedOnChain(chainId),\n [chainId]\n );\n\n // Get bazaar address for the chain\n const bazaarAddress = useMemo(\n () => (isSupported ? getBazaarAddress(chainId) : undefined),\n [chainId, isSupported]\n );\n\n // Build filter\n const filter = useMemo(\n () => ({\n appAddress: bazaarAddress as `0x${string}`,\n topic: nftAddress.toLowerCase(),\n }),\n [bazaarAddress, nftAddress]\n );\n\n // Get message count\n const { count: totalCount, isLoading: isLoadingCount } = useNetMessageCount({\n chainId,\n filter,\n enabled: enabled && isSupported,\n });\n\n // Calculate range\n const startIndex = useMemo(\n () => Math.max(0, totalCount - maxMessages),\n [totalCount, maxMessages]\n );\n\n // Get messages\n const {\n messages,\n isLoading: isLoadingMessages,\n error: messagesError,\n refetch: refetchMessages,\n } = useNetMessages({\n chainId,\n filter,\n startIndex,\n endIndex: totalCount,\n enabled: enabled && isSupported && totalCount > 0,\n });\n\n // Process listings when messages change\n useEffect(() => {\n if (!isSupported || !enabled) {\n setListings([]);\n return;\n }\n\n if (!messages || messages.length === 0) {\n setListings([]);\n return;\n }\n\n let cancelled = false;\n\n async function processListings() {\n setIsProcessing(true);\n setProcessingError(undefined);\n\n try {\n const client = new BazaarClient({ chainId });\n const validListings = await client.getListings({\n nftAddress,\n excludeMaker,\n maxMessages,\n });\n\n if (!cancelled) {\n setListings(validListings);\n }\n } catch (err) {\n if (!cancelled) {\n setProcessingError(err instanceof Error ? err : new Error(String(err)));\n setListings([]);\n }\n } finally {\n if (!cancelled) {\n setIsProcessing(false);\n }\n }\n }\n\n processListings();\n\n return () => {\n cancelled = true;\n };\n }, [chainId, nftAddress, excludeMaker, maxMessages, messages, isSupported, enabled, refetchTrigger]);\n\n const refetch = () => {\n refetchMessages();\n setRefetchTrigger((t) => t + 1);\n };\n\n return {\n listings,\n isLoading: isLoadingCount || isLoadingMessages || isProcessing,\n error: messagesError || processingError,\n refetch,\n };\n}\n","/**\n * React hook for fetching collection offers from Bazaar\n */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { useNetMessages, useNetMessageCount } from \"@net-protocol/core/react\";\nimport { BazaarClient } from \"../client/BazaarClient\";\nimport { CollectionOffer } from \"../types\";\nimport { getCollectionOffersAddress, isBazaarSupportedOnChain } from \"../chainConfig\";\n\nexport interface UseBazaarCollectionOffersOptions {\n /** Chain ID to query */\n chainId: number;\n /** NFT collection address */\n nftAddress: `0x${string}`;\n /** Exclude offers from this address */\n excludeMaker?: `0x${string}`;\n /** Maximum number of messages to fetch (default: 100) */\n maxMessages?: number;\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseBazaarCollectionOffersResult {\n /** Valid collection offers (sorted by price, highest first) */\n offers: CollectionOffer[];\n /** Whether the data is loading */\n isLoading: boolean;\n /** Error if any */\n error: Error | undefined;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * React hook for fetching valid collection offers from Bazaar\n *\n * Returns offers that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Buyer has sufficient WETH balance\n *\n * Results are sorted by price (highest first)\n *\n * @example\n * ```tsx\n * const { offers, isLoading, error } = useBazaarCollectionOffers({\n * chainId: 8453,\n * nftAddress: \"0x...\",\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * const bestOffer = offers[0];\n * if (bestOffer) {\n * return <div>Best offer: {bestOffer.price} {bestOffer.currency}</div>;\n * }\n * ```\n */\nexport function useBazaarCollectionOffers({\n chainId,\n nftAddress,\n excludeMaker,\n maxMessages = 100,\n enabled = true,\n}: UseBazaarCollectionOffersOptions): UseBazaarCollectionOffersResult {\n const [offers, setOffers] = useState<CollectionOffer[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [processingError, setProcessingError] = useState<Error | undefined>();\n const [refetchTrigger, setRefetchTrigger] = useState(0);\n\n // Check if chain is supported\n const isSupported = useMemo(\n () => isBazaarSupportedOnChain(chainId),\n [chainId]\n );\n\n // Get collection offers address for the chain\n const collectionOffersAddress = useMemo(\n () => (isSupported ? getCollectionOffersAddress(chainId) : undefined),\n [chainId, isSupported]\n );\n\n // Build filter\n const filter = useMemo(\n () => ({\n appAddress: collectionOffersAddress as `0x${string}`,\n topic: nftAddress.toLowerCase(),\n }),\n [collectionOffersAddress, nftAddress]\n );\n\n // Get message count\n const { count: totalCount, isLoading: isLoadingCount } = useNetMessageCount({\n chainId,\n filter,\n enabled: enabled && isSupported,\n });\n\n // Calculate range\n const startIndex = useMemo(\n () => Math.max(0, totalCount - maxMessages),\n [totalCount, maxMessages]\n );\n\n // Get messages\n const {\n messages,\n isLoading: isLoadingMessages,\n error: messagesError,\n refetch: refetchMessages,\n } = useNetMessages({\n chainId,\n filter,\n startIndex,\n endIndex: totalCount,\n enabled: enabled && isSupported && totalCount > 0,\n });\n\n // Process offers when messages change\n useEffect(() => {\n if (!isSupported || !enabled) {\n setOffers([]);\n return;\n }\n\n if (!messages || messages.length === 0) {\n setOffers([]);\n return;\n }\n\n let cancelled = false;\n\n async function processOffers() {\n setIsProcessing(true);\n setProcessingError(undefined);\n\n try {\n const client = new BazaarClient({ chainId });\n const validOffers = await client.getCollectionOffers({\n nftAddress,\n excludeMaker,\n maxMessages,\n });\n\n if (!cancelled) {\n setOffers(validOffers);\n }\n } catch (err) {\n if (!cancelled) {\n setProcessingError(err instanceof Error ? err : new Error(String(err)));\n setOffers([]);\n }\n } finally {\n if (!cancelled) {\n setIsProcessing(false);\n }\n }\n }\n\n processOffers();\n\n return () => {\n cancelled = true;\n };\n }, [chainId, nftAddress, excludeMaker, maxMessages, messages, isSupported, enabled, refetchTrigger]);\n\n const refetch = () => {\n refetchMessages();\n setRefetchTrigger((t) => t + 1);\n };\n\n return {\n offers,\n isLoading: isLoadingCount || isLoadingMessages || isProcessing,\n error: messagesError || processingError,\n refetch,\n };\n}\n","/**\n * React hook for fetching ERC20 offers from Bazaar\n */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { useNetMessages, useNetMessageCount } from \"@net-protocol/core/react\";\nimport { BazaarClient } from \"../client/BazaarClient\";\nimport { Erc20Offer } from \"../types\";\nimport { getErc20OffersAddress, isBazaarSupportedOnChain } from \"../chainConfig\";\n\nexport interface UseBazaarErc20OffersOptions {\n /** Chain ID to query */\n chainId: number;\n /** ERC20 token address */\n tokenAddress: `0x${string}`;\n /** Exclude offers from this address */\n excludeMaker?: `0x${string}`;\n /** Maximum number of messages to fetch (default: 200) */\n maxMessages?: number;\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseBazaarErc20OffersResult {\n /** Valid ERC20 offers (sorted by price per token, highest first) */\n offers: Erc20Offer[];\n /** Whether the data is loading */\n isLoading: boolean;\n /** Error if any */\n error: Error | undefined;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * React hook for fetching valid ERC20 offers from Bazaar\n *\n * ERC20 offers are only available on Base (8453) and HyperEVM (999).\n *\n * Returns offers that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Buyer has sufficient WETH balance\n *\n * Results are sorted by price per token (highest first)\n *\n * @example\n * ```tsx\n * const { offers, isLoading, error } = useBazaarErc20Offers({\n * chainId: 8453,\n * tokenAddress: \"0x...\",\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * const bestOffer = offers[0];\n * if (bestOffer) {\n * return (\n * <div>\n * Best offer: {bestOffer.pricePerToken} {bestOffer.currency} per token\n * (total: {bestOffer.price} {bestOffer.currency} for {bestOffer.tokenAmount.toString()} tokens)\n * </div>\n * );\n * }\n * ```\n */\nexport function useBazaarErc20Offers({\n chainId,\n tokenAddress,\n excludeMaker,\n maxMessages = 200,\n enabled = true,\n}: UseBazaarErc20OffersOptions): UseBazaarErc20OffersResult {\n const [offers, setOffers] = useState<Erc20Offer[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [processingError, setProcessingError] = useState<Error | undefined>();\n const [refetchTrigger, setRefetchTrigger] = useState(0);\n\n // Check if chain is supported and has ERC20 offers\n const isSupported = useMemo(\n () => isBazaarSupportedOnChain(chainId),\n [chainId]\n );\n\n // Get ERC20 offers address for the chain (only Base and HyperEVM)\n const erc20OffersAddress = useMemo(\n () => (isSupported ? getErc20OffersAddress(chainId) : undefined),\n [chainId, isSupported]\n );\n\n // ERC20 offers only available on chains with the contract deployed\n const hasErc20Offers = Boolean(erc20OffersAddress);\n\n // Build filter\n const filter = useMemo(\n () => ({\n appAddress: erc20OffersAddress as `0x${string}`,\n topic: tokenAddress.toLowerCase(),\n }),\n [erc20OffersAddress, tokenAddress]\n );\n\n // Get message count\n const { count: totalCount, isLoading: isLoadingCount } = useNetMessageCount({\n chainId,\n filter,\n enabled: enabled && hasErc20Offers,\n });\n\n // Calculate range\n const startIndex = useMemo(\n () => Math.max(0, totalCount - maxMessages),\n [totalCount, maxMessages]\n );\n\n // Get messages\n const {\n messages,\n isLoading: isLoadingMessages,\n error: messagesError,\n refetch: refetchMessages,\n } = useNetMessages({\n chainId,\n filter,\n startIndex,\n endIndex: totalCount,\n enabled: enabled && hasErc20Offers && totalCount > 0,\n });\n\n // Process offers when messages change\n useEffect(() => {\n if (!hasErc20Offers || !enabled) {\n setOffers([]);\n return;\n }\n\n if (!messages || messages.length === 0) {\n setOffers([]);\n return;\n }\n\n let cancelled = false;\n\n async function processOffers() {\n setIsProcessing(true);\n setProcessingError(undefined);\n\n try {\n const client = new BazaarClient({ chainId });\n const validOffers = await client.getErc20Offers({\n tokenAddress,\n excludeMaker,\n maxMessages,\n });\n\n if (!cancelled) {\n setOffers(validOffers);\n }\n } catch (err) {\n if (!cancelled) {\n setProcessingError(err instanceof Error ? err : new Error(String(err)));\n setOffers([]);\n }\n } finally {\n if (!cancelled) {\n setIsProcessing(false);\n }\n }\n }\n\n processOffers();\n\n return () => {\n cancelled = true;\n };\n }, [chainId, tokenAddress, excludeMaker, maxMessages, messages, hasErc20Offers, enabled, refetchTrigger]);\n\n const refetch = () => {\n refetchMessages();\n setRefetchTrigger((t) => t + 1);\n };\n\n return {\n offers,\n isLoading: isLoadingCount || isLoadingMessages || isProcessing,\n error: messagesError || processingError,\n refetch,\n };\n}\n","/**\n * React hook for fetching ERC20 listings from Bazaar\n */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { useNetMessages, useNetMessageCount } from \"@net-protocol/core/react\";\nimport { BazaarClient } from \"../client/BazaarClient\";\nimport { Erc20Listing } from \"../types\";\nimport { getErc20BazaarAddress, isBazaarSupportedOnChain } from \"../chainConfig\";\n\nexport interface UseBazaarErc20ListingsOptions {\n /** Chain ID to query */\n chainId: number;\n /** ERC20 token address */\n tokenAddress: `0x${string}`;\n /** Exclude listings from this address */\n excludeMaker?: `0x${string}`;\n /** Maximum number of messages to fetch (default: 200) */\n maxMessages?: number;\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseBazaarErc20ListingsResult {\n /** Valid ERC20 listings (sorted by price per token, lowest first) */\n listings: Erc20Listing[];\n /** Whether the data is loading */\n isLoading: boolean;\n /** Error if any */\n error: Error | undefined;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * React hook for fetching valid ERC20 listings from Bazaar\n *\n * ERC20 listings are available on all supported chains.\n *\n * Returns listings that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Seller has sufficient ERC20 token balance\n *\n * Results are sorted by price per token (lowest first)\n *\n * @example\n * ```tsx\n * const { listings, isLoading, error } = useBazaarErc20Listings({\n * chainId: 8453,\n * tokenAddress: \"0x...\",\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * const bestListing = listings[0];\n * if (bestListing) {\n * return (\n * <div>\n * Best listing: {bestListing.pricePerToken} {bestListing.currency} per token\n * (total: {bestListing.price} {bestListing.currency} for {bestListing.tokenAmount.toString()} tokens)\n * </div>\n * );\n * }\n * ```\n */\nexport function useBazaarErc20Listings({\n chainId,\n tokenAddress,\n excludeMaker,\n maxMessages = 200,\n enabled = true,\n}: UseBazaarErc20ListingsOptions): UseBazaarErc20ListingsResult {\n const [listings, setListings] = useState<Erc20Listing[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [processingError, setProcessingError] = useState<Error | undefined>();\n const [refetchTrigger, setRefetchTrigger] = useState(0);\n\n // Check if chain is supported\n const isSupported = useMemo(\n () => isBazaarSupportedOnChain(chainId),\n [chainId]\n );\n\n // Get ERC20 bazaar address for the chain (available on all chains)\n const erc20BazaarAddress = useMemo(\n () => (isSupported ? getErc20BazaarAddress(chainId) : undefined),\n [chainId, isSupported]\n );\n\n // Build filter\n const filter = useMemo(\n () => ({\n appAddress: erc20BazaarAddress as `0x${string}`,\n topic: tokenAddress.toLowerCase(),\n }),\n [erc20BazaarAddress, tokenAddress]\n );\n\n // Get message count\n const { count: totalCount, isLoading: isLoadingCount } = useNetMessageCount({\n chainId,\n filter,\n enabled: enabled && isSupported,\n });\n\n // Calculate range\n const startIndex = useMemo(\n () => Math.max(0, totalCount - maxMessages),\n [totalCount, maxMessages]\n );\n\n // Get messages\n const {\n messages,\n isLoading: isLoadingMessages,\n error: messagesError,\n refetch: refetchMessages,\n } = useNetMessages({\n chainId,\n filter,\n startIndex,\n endIndex: totalCount,\n enabled: enabled && isSupported && totalCount > 0,\n });\n\n // Process listings when messages change\n useEffect(() => {\n if (!isSupported || !enabled) {\n setListings([]);\n return;\n }\n\n if (!messages || messages.length === 0) {\n setListings([]);\n return;\n }\n\n let cancelled = false;\n\n async function processListings() {\n setIsProcessing(true);\n setProcessingError(undefined);\n\n try {\n const client = new BazaarClient({ chainId });\n const validListings = await client.getErc20Listings({\n tokenAddress,\n excludeMaker,\n maxMessages,\n });\n\n if (!cancelled) {\n setListings(validListings);\n }\n } catch (err) {\n if (!cancelled) {\n setProcessingError(err instanceof Error ? err : new Error(String(err)));\n setListings([]);\n }\n } finally {\n if (!cancelled) {\n setIsProcessing(false);\n }\n }\n }\n\n processListings();\n\n return () => {\n cancelled = true;\n };\n }, [chainId, tokenAddress, excludeMaker, maxMessages, messages, isSupported, enabled, refetchTrigger]);\n\n const refetch = () => {\n refetchMessages();\n setRefetchTrigger((t) => t + 1);\n };\n\n return {\n listings,\n isLoading: isLoadingCount || isLoadingMessages || isProcessing,\n error: messagesError || processingError,\n refetch,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/abis/helpers.ts","../src/abis/seaport.ts","../src/abis/index.ts","../src/chainConfig.ts","../src/utils/seaport.ts","../src/utils/validation.ts","../src/utils/parsing.ts","../src/client/BazaarClient.ts","../src/hooks/useBazaarListings.ts","../src/hooks/useBazaarCollectionOffers.ts","../src/hooks/useBazaarErc20Offers.ts","../src/hooks/useBazaarErc20Listings.ts"],"names":["decodeAbiParameters","ethers","Seaport","formatEther","readContract","createPublicClient","defineChain","http","NetClient","maker","useState","useMemo","useNetMessageCount","useNetMessages","useEffect"],"mappings":"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","file":"react.js","sourcesContent":["export const BULK_SEAPORT_ORDER_STATUS_FETCHER_ABI = [\n { type: \"constructor\", inputs: [], stateMutability: \"nonpayable\" },\n {\n type: \"function\",\n name: \"getOrderStatuses\",\n inputs: [\n { name: \"seaport\", type: \"address\", internalType: \"address\" },\n { name: \"orderHashes\", type: \"bytes32[]\", internalType: \"bytes32[]\" },\n ],\n outputs: [\n {\n name: \"results\",\n type: \"tuple[]\",\n internalType: \"struct BulkSeaportOrderStatusFetcher.OrderStatusInfo[]\",\n components: [\n { name: \"isValidated\", type: \"bool\", internalType: \"bool\" },\n { name: \"isCancelled\", type: \"bool\", internalType: \"bool\" },\n { name: \"totalFilled\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"totalSize\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n ],\n stateMutability: \"view\",\n },\n] as const;\n\nexport const ERC721_OWNER_OF_HELPER_ABI = [\n {\n type: \"function\",\n name: \"getTokenOwners\",\n inputs: [\n { name: \"nftContract\", type: \"address\", internalType: \"address\" },\n { name: \"tokenIds\", type: \"uint256[]\", internalType: \"uint256[]\" },\n ],\n outputs: [\n { name: \"owners\", type: \"address[]\", internalType: \"address[]\" },\n ],\n stateMutability: \"view\",\n },\n { type: \"error\", name: \"InvalidAddress\", inputs: [] },\n { type: \"error\", name: \"TokenQueryFailed\", inputs: [] },\n] as const;\n\nexport const ERC20_BULK_BALANCE_CHECKER_ABI = [\n {\n type: \"function\",\n name: \"getBalances\",\n inputs: [\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"addresses\", type: \"address[]\", internalType: \"address[]\" },\n ],\n outputs: [\n { name: \"balances\", type: \"uint256[]\", internalType: \"uint256[]\" },\n ],\n stateMutability: \"view\",\n },\n] as const;\n","/**\n * Minimal Seaport ABI for cancel operations\n */\nexport const SEAPORT_CANCEL_ABI = [\n {\n inputs: [\n {\n components: [\n { internalType: \"address\", name: \"offerer\", type: \"address\" },\n { internalType: \"address\", name: \"zone\", type: \"address\" },\n {\n components: [\n { internalType: \"enum ItemType\", name: \"itemType\", type: \"uint8\" },\n { internalType: \"address\", name: \"token\", type: \"address\" },\n { internalType: \"uint256\", name: \"identifierOrCriteria\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"startAmount\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"endAmount\", type: \"uint256\" },\n ],\n internalType: \"struct OfferItem[]\",\n name: \"offer\",\n type: \"tuple[]\",\n },\n {\n components: [\n { internalType: \"enum ItemType\", name: \"itemType\", type: \"uint8\" },\n { internalType: \"address\", name: \"token\", type: \"address\" },\n { internalType: \"uint256\", name: \"identifierOrCriteria\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"startAmount\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"endAmount\", type: \"uint256\" },\n { internalType: \"address payable\", name: \"recipient\", type: \"address\" },\n ],\n internalType: \"struct ConsiderationItem[]\",\n name: \"consideration\",\n type: \"tuple[]\",\n },\n { internalType: \"enum OrderType\", name: \"orderType\", type: \"uint8\" },\n { internalType: \"uint256\", name: \"startTime\", type: \"uint256\" },\n { internalType: \"uint256\", name: \"endTime\", type: \"uint256\" },\n { internalType: \"bytes32\", name: \"zoneHash\", type: \"bytes32\" },\n { internalType: \"uint256\", name: \"salt\", type: \"uint256\" },\n { internalType: \"bytes32\", name: \"conduitKey\", type: \"bytes32\" },\n { internalType: \"uint256\", name: \"counter\", type: \"uint256\" },\n ],\n internalType: \"struct OrderComponents[]\",\n name: \"orders\",\n type: \"tuple[]\",\n },\n ],\n name: \"cancel\",\n outputs: [{ internalType: \"bool\", name: \"cancelled\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n","export { BAZAAR_V2_ABI, BAZAAR_COLLECTION_OFFERS_ABI } from \"./bazaarV2\";\nexport {\n BULK_SEAPORT_ORDER_STATUS_FETCHER_ABI,\n ERC721_OWNER_OF_HELPER_ABI,\n ERC20_BULK_BALANCE_CHECKER_ABI,\n} from \"./helpers\";\nexport { SEAPORT_CANCEL_ABI } from \"./seaport\";\n\n/**\n * ABI for decoding Seaport submission from Net message data\n */\nexport const BAZAAR_SUBMISSION_ABI = [\n {\n name: \"submission\",\n type: \"tuple\",\n internalType: \"struct BazaarV2.Submission\",\n components: [\n {\n name: \"parameters\",\n type: \"tuple\",\n internalType: \"struct OrderParameters\",\n components: [\n { name: \"offerer\", type: \"address\", internalType: \"address\" },\n { name: \"zone\", type: \"address\", internalType: \"address\" },\n {\n name: \"offer\",\n type: \"tuple[]\",\n internalType: \"struct OfferItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n {\n name: \"consideration\",\n type: \"tuple[]\",\n internalType: \"struct ConsiderationItem[]\",\n components: [\n { name: \"itemType\", type: \"uint8\", internalType: \"enum ItemType\" },\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"identifierOrCriteria\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"startAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endAmount\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"recipient\", type: \"address\", internalType: \"address payable\" },\n ],\n },\n { name: \"orderType\", type: \"uint8\", internalType: \"enum OrderType\" },\n { name: \"startTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"endTime\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"zoneHash\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"salt\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"conduitKey\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"totalOriginalConsiderationItems\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"counter\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n },\n] as const;\n","/**\n * Bazaar chain configuration\n *\n * Contains contract addresses and configuration for each supported chain.\n */\n\nexport interface WrappedNativeCurrency {\n address: `0x${string}`;\n name: string;\n symbol: string;\n}\n\nexport interface BazaarChainConfig {\n /** Main NFT listing contract */\n bazaarAddress: `0x${string}`;\n /** Collection offers contract */\n collectionOffersAddress: `0x${string}`;\n /** ERC20 offers contract (only on Base and HyperEVM) */\n erc20OffersAddress?: `0x${string}`;\n /** ERC20 listings contract */\n erc20BazaarAddress?: `0x${string}`;\n /** Seaport contract address */\n seaportAddress: `0x${string}`;\n /** Fee collector address */\n feeCollectorAddress: `0x${string}`;\n /** Fee in basis points for NFT trades */\n nftFeeBps: number;\n /** Wrapped native currency (WETH, etc.) */\n wrappedNativeCurrency: WrappedNativeCurrency;\n /** Address with high ETH balance for Seaport checks */\n highEthAddress?: `0x${string}`;\n /** Native currency symbol (lowercase) */\n currencySymbol: string;\n}\n\n// Default addresses used by most chains\nconst DEFAULT_SEAPORT_ADDRESS = \"0x0000000000000068F116a894984e2DB1123eB395\" as const;\nconst DEFAULT_BAZAAR_ADDRESS = \"0x00000000E3dA5fC031282A39759bDDA78ae7fAE5\" as const;\nconst DEFAULT_COLLECTION_OFFERS_ADDRESS = \"0x0000000D43423E0A12CecB307a74591999b32B32\" as const;\nconst DEFAULT_FEE_COLLECTOR_ADDRESS = \"0x32D16C15410248bef498D7aF50D10Db1a546b9E5\" as const;\nconst DEFAULT_ERC20_BAZAAR_ADDRESS = \"0x00000000a2d173a4610c85c7471a25b6bc216a70\" as const;\nconst DEFAULT_NFT_FEE_BPS = 500; // 5%\n\n// Helper contract addresses (same on all chains)\nexport const BULK_SEAPORT_ORDER_STATUS_FETCHER_ADDRESS = \"0x0000009112ABCE652674b4fE3eD9C765B22d11A7\" as const;\nexport const ERC721_OWNER_OF_HELPER_ADDRESS = \"0x000000aa4eFa2e5A4a6002C7F08B6e8Ec8cf1dDa\" as const;\nexport const ERC20_BULK_BALANCE_CHECKER_ADDRESS = \"0x000000b50a9f2923f2db931391824f6d1278f712\" as const;\n\n// Zone contract addresses (same on all chains)\nexport const NET_SEAPORT_ZONE_ADDRESS = \"0x000000007F8c58fbf215bF91Bda7421A806cf3ae\" as const;\nexport const NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS = \"0x000000B799ec6D7aCC1B578f62bFc324c25DFC5A\" as const;\nexport const NET_SEAPORT_PRIVATE_ORDER_ZONE_ADDRESS = \"0x000000bC63761cbb05305632212e2f3AE2BE7a9B\" as const;\n\n/**\n * Chain-specific bazaar configuration\n */\nconst BAZAAR_CHAIN_CONFIGS: Record<number, BazaarChainConfig> = {\n // Base Mainnet\n 8453: {\n bazaarAddress: \"0x000000058f3ade587388daf827174d0e6fc97595\",\n collectionOffersAddress: \"0x0000000f9c45efcff0f78d8b54aa6a40092d66dc\",\n erc20OffersAddress: \"0x0000000e23a89aa06f317306aa1ae231d3503082\",\n erc20BazaarAddress: \"0x00000006557e3629e2fc50bbad0c002b27cac492\",\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: \"0x66547ff4f7206e291F7BC157b54C026Fc6660961\",\n nftFeeBps: 0, // 0% on Base\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n },\n currencySymbol: \"eth\",\n },\n\n // Base Sepolia (Testnet)\n 84532: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n },\n currencySymbol: \"eth\",\n },\n\n // Degen\n 666666666: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0xEb54dACB4C2ccb64F8074eceEa33b5eBb38E5387\",\n name: \"Wrapped Degen\",\n symbol: \"WDEGEN\",\n },\n currencySymbol: \"degen\",\n },\n\n // Ham Chain\n 5112: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n },\n highEthAddress: \"0x4200000000000000000000000000000000000006\",\n currencySymbol: \"eth\",\n },\n\n // Ink Chain\n 57073: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n // Custom Seaport address for Ink (no create2 factory)\n seaportAddress: \"0xD00C96804e9fF35f10C7D2a92239C351Ff3F94e5\",\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped ETH\",\n symbol: \"WETH\",\n },\n highEthAddress: \"0x4200000000000000000000000000000000000006\",\n currencySymbol: \"eth\",\n },\n\n // Unichain\n 130: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x4200000000000000000000000000000000000006\",\n name: \"Wrapped Ether\",\n symbol: \"WETH\",\n },\n currencySymbol: \"eth\",\n },\n\n // HyperEVM (Hyperliquid)\n 999: {\n bazaarAddress: \"0x000000058f3ade587388daf827174d0e6fc97595\",\n collectionOffersAddress: \"0x0000000f9c45efcff0f78d8b54aa6a40092d66dc\",\n erc20OffersAddress: \"0x0000000e23a89aa06f317306aa1ae231d3503082\",\n erc20BazaarAddress: \"0x00000006557e3629e2fc50bbad0c002b27cac492\",\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: \"0x66547ff4f7206e291F7BC157b54C026Fc6660961\",\n nftFeeBps: 0, // 0% on HyperEVM\n wrappedNativeCurrency: {\n address: \"0x5555555555555555555555555555555555555555\",\n name: \"Wrapped Hype\",\n symbol: \"WHYPE\",\n },\n currencySymbol: \"hype\",\n },\n\n // Plasma\n 9745: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x6100e367285b01f48d07953803a2d8dca5d19873\",\n name: \"Wrapped XPL\",\n symbol: \"WXPL\",\n },\n currencySymbol: \"xpl\",\n },\n\n // Monad\n 143: {\n bazaarAddress: DEFAULT_BAZAAR_ADDRESS,\n collectionOffersAddress: DEFAULT_COLLECTION_OFFERS_ADDRESS,\n seaportAddress: DEFAULT_SEAPORT_ADDRESS,\n feeCollectorAddress: DEFAULT_FEE_COLLECTOR_ADDRESS,\n nftFeeBps: DEFAULT_NFT_FEE_BPS,\n wrappedNativeCurrency: {\n address: \"0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A\",\n name: \"Wrapped Monad\",\n symbol: \"WMONAD\",\n },\n currencySymbol: \"monad\",\n },\n};\n\n/**\n * Get bazaar configuration for a chain\n */\nexport function getBazaarChainConfig(chainId: number): BazaarChainConfig | undefined {\n return BAZAAR_CHAIN_CONFIGS[chainId];\n}\n\n/**\n * Get all supported bazaar chain IDs\n */\nexport function getBazaarSupportedChainIds(): number[] {\n return Object.keys(BAZAAR_CHAIN_CONFIGS).map(Number);\n}\n\n/**\n * Check if bazaar is supported on a chain\n */\nexport function isBazaarSupportedOnChain(chainId: number): boolean {\n return chainId in BAZAAR_CHAIN_CONFIGS;\n}\n\n/**\n * Get bazaar contract address for a chain\n */\nexport function getBazaarAddress(chainId: number): `0x${string}` {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.bazaarAddress ?? DEFAULT_BAZAAR_ADDRESS;\n}\n\n/**\n * Get collection offers contract address for a chain\n */\nexport function getCollectionOffersAddress(chainId: number): `0x${string}` {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.collectionOffersAddress ?? DEFAULT_COLLECTION_OFFERS_ADDRESS;\n}\n\n/**\n * Get Seaport contract address for a chain\n */\nexport function getSeaportAddress(chainId: number): `0x${string}` {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.seaportAddress ?? DEFAULT_SEAPORT_ADDRESS;\n}\n\n/**\n * Get fee collector address for a chain\n */\nexport function getFeeCollectorAddress(chainId: number): `0x${string}` {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.feeCollectorAddress ?? DEFAULT_FEE_COLLECTOR_ADDRESS;\n}\n\n/**\n * Get NFT fee in basis points for a chain\n */\nexport function getNftFeeBps(chainId: number): number {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.nftFeeBps ?? DEFAULT_NFT_FEE_BPS;\n}\n\n/**\n * Get wrapped native currency for a chain\n */\nexport function getWrappedNativeCurrency(chainId: number): WrappedNativeCurrency | undefined {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.wrappedNativeCurrency;\n}\n\n/**\n * Get currency symbol for a chain (lowercase)\n */\nexport function getCurrencySymbol(chainId: number): string {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.currencySymbol ?? \"eth\";\n}\n\n/**\n * Get high ETH address for Seaport balance checks\n */\nexport function getHighEthAddress(chainId: number): `0x${string}` | undefined {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.highEthAddress;\n}\n\n/**\n * Get ERC20 offers contract address for a chain\n * Only deployed on Base (8453) and HyperEVM (999)\n */\nexport function getErc20OffersAddress(chainId: number): `0x${string}` | undefined {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.erc20OffersAddress;\n}\n\n/**\n * Get ERC20 bazaar (listings) contract address for a chain\n */\nexport function getErc20BazaarAddress(chainId: number): `0x${string}` {\n return BAZAAR_CHAIN_CONFIGS[chainId]?.erc20BazaarAddress ?? DEFAULT_ERC20_BAZAAR_ADDRESS;\n}\n","/**\n * Seaport-related utilities for decoding and computing order hashes\n */\n\nimport { decodeAbiParameters, formatEther } from \"viem\";\nimport { Seaport } from \"@opensea/seaport-js\";\nimport { ethers } from \"ethers\";\nimport { BAZAAR_SUBMISSION_ABI } from \"../abis\";\nimport {\n SeaportSubmission,\n SeaportOrderParameters,\n SeaportOrderStatus,\n SeaportOrderStatusInfo,\n} from \"../types\";\nimport { getSeaportAddress, getHighEthAddress } from \"../chainConfig\";\n\n/**\n * Decode Seaport submission from Net message data\n */\nexport function decodeSeaportSubmission(messageData: `0x${string}`): SeaportSubmission {\n const [decoded] = decodeAbiParameters(BAZAAR_SUBMISSION_ABI, messageData);\n\n return {\n parameters: {\n offerer: decoded.parameters.offerer as `0x${string}`,\n zone: decoded.parameters.zone as `0x${string}`,\n offer: decoded.parameters.offer.map((item: any) => ({\n itemType: item.itemType,\n token: item.token as `0x${string}`,\n identifierOrCriteria: BigInt(item.identifierOrCriteria),\n startAmount: BigInt(item.startAmount),\n endAmount: BigInt(item.endAmount),\n })),\n consideration: decoded.parameters.consideration.map((item: any) => ({\n itemType: item.itemType,\n token: item.token as `0x${string}`,\n identifierOrCriteria: BigInt(item.identifierOrCriteria),\n startAmount: BigInt(item.startAmount),\n endAmount: BigInt(item.endAmount),\n recipient: item.recipient as `0x${string}`,\n })),\n orderType: decoded.parameters.orderType,\n startTime: BigInt(decoded.parameters.startTime),\n endTime: BigInt(decoded.parameters.endTime),\n zoneHash: decoded.parameters.zoneHash as `0x${string}`,\n salt: BigInt(decoded.parameters.salt),\n conduitKey: decoded.parameters.conduitKey as `0x${string}`,\n totalOriginalConsiderationItems: BigInt(decoded.parameters.totalOriginalConsiderationItems),\n },\n counter: BigInt(decoded.counter),\n signature: decoded.signature as `0x${string}`,\n };\n}\n\n/**\n * Get Seaport order from message data with string identifiers\n * (needed for Seaport SDK compatibility)\n */\nexport function getSeaportOrderFromMessageData(messageData: `0x${string}`): {\n parameters: any;\n signature: `0x${string}`;\n counter: bigint;\n} {\n const submission = decodeSeaportSubmission(messageData);\n\n return {\n parameters: {\n ...submission.parameters,\n // Convert BigInts to strings for Seaport SDK compatibility\n offer: submission.parameters.offer.map((item) => ({\n ...item,\n identifierOrCriteria: item.identifierOrCriteria.toString(),\n startAmount: item.startAmount.toString(),\n endAmount: item.endAmount.toString(),\n })),\n consideration: submission.parameters.consideration.map((item) => ({\n ...item,\n identifierOrCriteria: item.identifierOrCriteria.toString(),\n startAmount: item.startAmount.toString(),\n endAmount: item.endAmount.toString(),\n })),\n startTime: submission.parameters.startTime.toString(),\n endTime: submission.parameters.endTime.toString(),\n salt: submission.parameters.salt.toString(),\n totalOriginalConsiderationItems: submission.parameters.totalOriginalConsiderationItems.toString(),\n counter: submission.counter.toString(),\n },\n signature: submission.signature,\n counter: submission.counter,\n };\n}\n\n/**\n * Create a Seaport instance for a chain using a public RPC\n */\nexport function createSeaportInstance(chainId: number, rpcUrl: string): Seaport {\n const provider = new ethers.JsonRpcProvider(rpcUrl);\n\n // Use a dummy signer for read-only operations\n const signer = new ethers.Wallet(\n // Random private key for read-only operations\n \"dc63e9af2088e2afd61499411cb6dd718d00a3d9e46e2cb5e33912c781bd77fe\",\n provider\n );\n\n // Override getAddress to return a high-balance address for checks\n const highEthAddress = getHighEthAddress(chainId);\n const finalSigner = highEthAddress\n ? {\n ...signer,\n getAddress: () => highEthAddress,\n address: highEthAddress,\n }\n : signer;\n\n return new Seaport(finalSigner as any, {\n overrides: { contractAddress: getSeaportAddress(chainId) },\n });\n}\n\n/**\n * Compute Seaport order hash\n */\nexport function computeOrderHash(\n seaport: Seaport,\n orderParameters: any,\n counter: bigint | string\n): string {\n return seaport.getOrderHash({\n ...orderParameters,\n counter: counter.toString(),\n });\n}\n\n/**\n * Determine order status from on-chain status info\n */\nexport function getOrderStatusFromInfo(\n orderParameters: SeaportOrderParameters,\n statusInfo: SeaportOrderStatusInfo\n): SeaportOrderStatus {\n if (statusInfo.isCancelled) {\n return SeaportOrderStatus.CANCELLED;\n }\n\n if (\n statusInfo.totalFilled === statusInfo.totalSize &&\n statusInfo.totalFilled > BigInt(0)\n ) {\n return SeaportOrderStatus.FILLED;\n }\n\n const now = BigInt(Math.floor(Date.now() / 1000));\n if (orderParameters.endTime < now) {\n return SeaportOrderStatus.EXPIRED;\n }\n\n return SeaportOrderStatus.OPEN;\n}\n\n/**\n * Calculate total consideration amount (price) from order\n */\nexport function getTotalConsiderationAmount(parameters: SeaportOrderParameters): bigint {\n return parameters.consideration.reduce(\n (acc, item) => acc + item.startAmount,\n BigInt(0)\n );\n}\n\n/**\n * Format price from wei to display string\n */\nexport function formatPrice(priceWei: bigint): number {\n return parseFloat(formatEther(priceWei));\n}\n","/**\n * Validation utilities for checking order status and ownership\n */\n\nimport { PublicClient } from \"viem\";\nimport { readContract } from \"viem/actions\";\nimport {\n BULK_SEAPORT_ORDER_STATUS_FETCHER_ABI,\n ERC721_OWNER_OF_HELPER_ABI,\n ERC20_BULK_BALANCE_CHECKER_ABI,\n} from \"../abis\";\nimport {\n BULK_SEAPORT_ORDER_STATUS_FETCHER_ADDRESS,\n ERC721_OWNER_OF_HELPER_ADDRESS,\n ERC20_BULK_BALANCE_CHECKER_ADDRESS,\n getSeaportAddress,\n} from \"../chainConfig\";\nimport { SeaportOrderStatusInfo, SeaportOrderStatus } from \"../types\";\n\n/**\n * Bulk fetch Seaport order statuses\n */\nexport async function bulkFetchOrderStatuses(\n client: PublicClient,\n chainId: number,\n orderHashes: `0x${string}`[]\n): Promise<SeaportOrderStatusInfo[]> {\n if (orderHashes.length === 0) {\n return [];\n }\n\n const seaportAddress = getSeaportAddress(chainId);\n\n const results = await readContract(client, {\n address: BULK_SEAPORT_ORDER_STATUS_FETCHER_ADDRESS,\n abi: BULK_SEAPORT_ORDER_STATUS_FETCHER_ABI,\n functionName: \"getOrderStatuses\",\n args: [seaportAddress, orderHashes],\n });\n\n return (results as any[]).map((r) => ({\n isValidated: r.isValidated,\n isCancelled: r.isCancelled,\n totalFilled: BigInt(r.totalFilled),\n totalSize: BigInt(r.totalSize),\n }));\n}\n\n/**\n * Create a mapping of order hash to status\n */\nexport async function createOrderStatusMap(\n client: PublicClient,\n chainId: number,\n orderHashes: `0x${string}`[]\n): Promise<Map<string, SeaportOrderStatusInfo>> {\n const statuses = await bulkFetchOrderStatuses(client, chainId, orderHashes);\n\n const map = new Map<string, SeaportOrderStatusInfo>();\n orderHashes.forEach((hash, index) => {\n map.set(hash.toLowerCase(), statuses[index]);\n });\n\n return map;\n}\n\n/**\n * Bulk fetch NFT owners for specific token IDs\n */\nexport async function bulkFetchNftOwners(\n client: PublicClient,\n nftAddress: `0x${string}`,\n tokenIds: string[]\n): Promise<(`0x${string}` | null)[]> {\n if (tokenIds.length === 0) {\n return [];\n }\n\n try {\n const owners = await readContract(client, {\n address: ERC721_OWNER_OF_HELPER_ADDRESS,\n abi: ERC721_OWNER_OF_HELPER_ABI,\n functionName: \"getTokenOwners\",\n args: [nftAddress, tokenIds.map((id) => BigInt(id))],\n });\n\n return (owners as `0x${string}`[]).map((owner) =>\n owner === \"0x0000000000000000000000000000000000000000\" ? null : owner\n );\n } catch {\n // If the helper fails, return nulls\n return tokenIds.map(() => null);\n }\n}\n\n/**\n * Create a mapping of token ID to owner address\n */\nexport async function createOwnershipMap(\n client: PublicClient,\n nftAddress: `0x${string}`,\n tokenIds: string[]\n): Promise<Map<string, `0x${string}` | null>> {\n const owners = await bulkFetchNftOwners(client, nftAddress, tokenIds);\n\n const map = new Map<string, `0x${string}` | null>();\n tokenIds.forEach((tokenId, index) => {\n map.set(tokenId, owners[index]);\n });\n\n return map;\n}\n\n/**\n * Bulk fetch ERC20 balances for addresses\n */\nexport async function bulkFetchErc20Balances(\n client: PublicClient,\n tokenAddress: `0x${string}`,\n addresses: `0x${string}`[]\n): Promise<bigint[]> {\n if (addresses.length === 0) {\n return [];\n }\n\n try {\n const balances = await readContract(client, {\n address: ERC20_BULK_BALANCE_CHECKER_ADDRESS,\n abi: ERC20_BULK_BALANCE_CHECKER_ABI,\n functionName: \"getBalances\",\n args: [tokenAddress, addresses],\n });\n\n return (balances as bigint[]).map((b) => BigInt(b));\n } catch {\n // If the helper fails, return zeros\n return addresses.map(() => BigInt(0));\n }\n}\n\n/**\n * Create a mapping of address to ERC20 balance\n */\nexport async function createBalanceMap(\n client: PublicClient,\n tokenAddress: `0x${string}`,\n addresses: `0x${string}`[]\n): Promise<Map<string, bigint>> {\n const balances = await bulkFetchErc20Balances(client, tokenAddress, addresses);\n\n const map = new Map<string, bigint>();\n addresses.forEach((address, index) => {\n map.set(address.toLowerCase(), balances[index]);\n });\n\n return map;\n}\n\n/**\n * Validate that a listing is still valid:\n * - Order is OPEN\n * - Not expired\n * - Seller still owns the NFT\n */\nexport function isListingValid(\n orderStatus: SeaportOrderStatus,\n expirationDate: number,\n sellerAddress: `0x${string}`,\n currentOwner: `0x${string}` | null\n): boolean {\n if (orderStatus !== SeaportOrderStatus.OPEN) {\n return false;\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (expirationDate <= now) {\n return false;\n }\n\n if (!currentOwner || currentOwner.toLowerCase() !== sellerAddress.toLowerCase()) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate that a collection offer is still valid:\n * - Order is OPEN\n * - Not expired\n * - Buyer has sufficient WETH balance\n */\nexport function isCollectionOfferValid(\n orderStatus: SeaportOrderStatus,\n expirationDate: number,\n priceWei: bigint,\n buyerBalance: bigint\n): boolean {\n if (orderStatus !== SeaportOrderStatus.OPEN) {\n return false;\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (expirationDate <= now) {\n return false;\n }\n\n if (buyerBalance < priceWei) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate that an ERC20 offer is still valid:\n * - Order is OPEN\n * - Not expired\n * - Buyer has sufficient WETH balance\n */\nexport function isErc20OfferValid(\n orderStatus: SeaportOrderStatus,\n expirationDate: number,\n priceWei: bigint,\n buyerWethBalance: bigint\n): boolean {\n if (orderStatus !== SeaportOrderStatus.OPEN) {\n return false;\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (expirationDate <= now) {\n return false;\n }\n\n if (buyerWethBalance < priceWei) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate that an ERC20 listing is still valid:\n * - Order is OPEN\n * - Not expired\n * - Seller has sufficient ERC20 token balance\n */\nexport function isErc20ListingValid(\n orderStatus: SeaportOrderStatus,\n expirationDate: number,\n tokenAmount: bigint,\n sellerTokenBalance: bigint\n): boolean {\n if (orderStatus !== SeaportOrderStatus.OPEN) {\n return false;\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (expirationDate <= now) {\n return false;\n }\n\n if (sellerTokenBalance < tokenAmount) {\n return false;\n }\n\n return true;\n}\n","/**\n * Utilities for parsing Net messages into listings and offers\n */\n\nimport { NetMessage } from \"@net-protocol/core\";\nimport { Listing, CollectionOffer, Erc20Offer, Erc20Listing, SeaportOrderStatus, ItemType } from \"../types\";\nimport {\n decodeSeaportSubmission,\n getSeaportOrderFromMessageData,\n getTotalConsiderationAmount,\n formatPrice,\n} from \"./seaport\";\nimport { getCurrencySymbol, NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS, NET_SEAPORT_PRIVATE_ORDER_ZONE_ADDRESS } from \"../chainConfig\";\n\n/**\n * Parse a Net message into an NFT listing\n */\nexport function parseListingFromMessage(\n message: NetMessage,\n chainId: number\n): Listing | null {\n try {\n const submission = decodeSeaportSubmission(message.data as `0x${string}`);\n const { parameters } = submission;\n\n // NFT listings have the NFT in the offer array\n const offerItem = parameters.offer[0];\n if (!offerItem) {\n return null;\n }\n\n // Must be ERC721 or ERC1155\n if (offerItem.itemType !== ItemType.ERC721 && offerItem.itemType !== ItemType.ERC1155) {\n return null;\n }\n\n const priceWei = getTotalConsiderationAmount(parameters);\n const tokenId = offerItem.identifierOrCriteria.toString();\n\n const targetFulfiller =\n parameters.zone.toLowerCase() === NET_SEAPORT_PRIVATE_ORDER_ZONE_ADDRESS.toLowerCase() &&\n parameters.zoneHash !== \"0x0000000000000000000000000000000000000000000000000000000000000000\"\n ? parameters.zoneHash\n : undefined;\n\n return {\n maker: parameters.offerer,\n nftAddress: offerItem.token,\n tokenId,\n priceWei,\n price: formatPrice(priceWei),\n currency: getCurrencySymbol(chainId),\n expirationDate: Number(parameters.endTime),\n orderHash: \"\", // Will be computed later\n orderStatus: SeaportOrderStatus.OPEN, // Will be validated later\n messageData: message.data as `0x${string}`,\n orderComponents: {\n ...parameters,\n counter: submission.counter,\n },\n targetFulfiller,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Parse a Net message into a collection offer\n */\nexport function parseCollectionOfferFromMessage(\n message: NetMessage,\n chainId: number\n): CollectionOffer | null {\n try {\n const submission = decodeSeaportSubmission(message.data as `0x${string}`);\n const { parameters } = submission;\n\n // Collection offers must use the collection offer zone\n if (\n parameters.zone.toLowerCase() !==\n NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS.toLowerCase()\n ) {\n return null;\n }\n\n // Collection offers have WETH in the offer array\n const offerItem = parameters.offer[0];\n if (!offerItem || offerItem.itemType !== ItemType.ERC20) {\n return null;\n }\n\n // The NFT is in the consideration array with criteria type\n const nftConsideration = parameters.consideration.find(\n (item) =>\n item.itemType === ItemType.ERC721_WITH_CRITERIA ||\n item.itemType === ItemType.ERC1155_WITH_CRITERIA\n );\n\n if (!nftConsideration) {\n return null;\n }\n\n // Only support single NFT offers\n if (nftConsideration.startAmount !== BigInt(1)) {\n return null;\n }\n\n const priceWei = offerItem.startAmount;\n\n return {\n maker: parameters.offerer,\n nftAddress: nftConsideration.token,\n priceWei,\n price: formatPrice(priceWei),\n currency: getCurrencySymbol(chainId),\n expirationDate: Number(parameters.endTime),\n orderHash: \"\", // Will be computed later\n orderStatus: SeaportOrderStatus.OPEN, // Will be validated later\n messageData: message.data as `0x${string}`,\n orderComponents: {\n ...parameters,\n counter: submission.counter,\n },\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Get the best listing for each token (lowest price)\n */\nexport function getBestListingPerToken(listings: Listing[]): Listing[] {\n const tokenMap = new Map<string, Listing>();\n\n for (const listing of listings) {\n const key = `${listing.nftAddress.toLowerCase()}-${listing.tokenId}`;\n const existing = tokenMap.get(key);\n\n if (!existing || listing.priceWei < existing.priceWei) {\n tokenMap.set(key, listing);\n }\n }\n\n return Array.from(tokenMap.values());\n}\n\n/**\n * Get the best collection offer (highest price)\n */\nexport function getBestCollectionOffer(offers: CollectionOffer[]): CollectionOffer | null {\n if (offers.length === 0) {\n return null;\n }\n\n return offers.reduce((best, current) =>\n current.priceWei > best.priceWei ? current : best\n );\n}\n\n/**\n * Sort listings by price (lowest first)\n */\nexport function sortListingsByPrice(listings: Listing[]): Listing[] {\n return [...listings].sort((a, b) => {\n const diff = a.priceWei - b.priceWei;\n if (diff < BigInt(0)) return -1;\n if (diff > BigInt(0)) return 1;\n return 0;\n });\n}\n\n/**\n * Sort offers by price (highest first)\n */\nexport function sortOffersByPrice(offers: CollectionOffer[]): CollectionOffer[] {\n return [...offers].sort((a, b) => {\n const diff = b.priceWei - a.priceWei;\n if (diff < BigInt(0)) return -1;\n if (diff > BigInt(0)) return 1;\n return 0;\n });\n}\n\n/**\n * Parse a Net message into an ERC20 offer\n */\nexport function parseErc20OfferFromMessage(\n message: NetMessage,\n chainId: number\n): Erc20Offer | null {\n try {\n const submission = decodeSeaportSubmission(message.data as `0x${string}`);\n const { parameters } = submission;\n\n // ERC20 offers must use the collection offer zone\n if (\n parameters.zone.toLowerCase() !==\n NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS.toLowerCase()\n ) {\n return null;\n }\n\n // ERC20 offers have WETH in the offer array\n const offerItem = parameters.offer[0];\n if (!offerItem || offerItem.itemType !== ItemType.ERC20) {\n return null;\n }\n\n // The ERC20 token being purchased is in the consideration array\n const erc20Consideration = parameters.consideration.find(\n (item) => item.itemType === ItemType.ERC20\n );\n\n if (!erc20Consideration) {\n return null;\n }\n\n // Must have a non-zero token amount\n const tokenAmount = erc20Consideration.startAmount;\n if (tokenAmount === BigInt(0)) {\n return null;\n }\n\n const priceWei = offerItem.startAmount;\n const pricePerTokenWei = priceWei / tokenAmount;\n\n return {\n maker: parameters.offerer,\n tokenAddress: erc20Consideration.token,\n tokenAmount,\n priceWei,\n pricePerTokenWei,\n price: formatPrice(priceWei),\n pricePerToken: formatPrice(pricePerTokenWei),\n currency: getCurrencySymbol(chainId),\n expirationDate: Number(parameters.endTime),\n orderHash: \"0x\" as `0x${string}`, // Will be computed later\n orderStatus: SeaportOrderStatus.OPEN, // Will be validated later\n messageData: message.data as `0x${string}`,\n orderComponents: {\n ...parameters,\n counter: submission.counter,\n },\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Sort ERC20 offers by price per token (highest first)\n */\nexport function sortErc20OffersByPricePerToken(offers: Erc20Offer[]): Erc20Offer[] {\n return [...offers].sort((a, b) => {\n const diff = b.pricePerTokenWei - a.pricePerTokenWei;\n if (diff < BigInt(0)) return -1;\n if (diff > BigInt(0)) return 1;\n return 0;\n });\n}\n\n/**\n * Parse a Net message into an ERC20 listing\n *\n * ERC20 listings have the ERC20 token in the offer array (seller is offering tokens)\n * and native currency payments in the consideration array.\n * They do NOT use the collection offer zone (that would be an offer, not a listing).\n */\nexport function parseErc20ListingFromMessage(\n message: NetMessage,\n chainId: number\n): Erc20Listing | null {\n try {\n const submission = decodeSeaportSubmission(message.data as `0x${string}`);\n const { parameters } = submission;\n\n // ERC20 listings must NOT use the collection offer zone (that would be an offer)\n if (\n parameters.zone.toLowerCase() ===\n NET_SEAPORT_COLLECTION_OFFER_ZONE_ADDRESS.toLowerCase()\n ) {\n return null;\n }\n\n // ERC20 listings have the ERC20 token in the offer array\n const offerItem = parameters.offer[0];\n if (!offerItem || offerItem.itemType !== ItemType.ERC20) {\n return null;\n }\n\n const tokenAmount = offerItem.startAmount;\n if (tokenAmount === BigInt(0)) {\n return null;\n }\n\n const priceWei = getTotalConsiderationAmount(parameters);\n if (priceWei === BigInt(0)) {\n return null;\n }\n\n const pricePerTokenWei = priceWei / tokenAmount;\n\n return {\n maker: parameters.offerer,\n tokenAddress: offerItem.token,\n tokenAmount,\n priceWei,\n pricePerTokenWei,\n price: formatPrice(priceWei),\n pricePerToken: formatPrice(pricePerTokenWei),\n currency: getCurrencySymbol(chainId),\n expirationDate: Number(parameters.endTime),\n orderHash: \"0x\" as `0x${string}`, // Will be computed later\n orderStatus: SeaportOrderStatus.OPEN, // Will be validated later\n messageData: message.data as `0x${string}`,\n orderComponents: {\n ...parameters,\n counter: submission.counter,\n },\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Sort ERC20 listings by price per token (lowest first)\n */\nexport function sortErc20ListingsByPricePerToken(listings: Erc20Listing[]): Erc20Listing[] {\n return [...listings].sort((a, b) => {\n const diff = a.pricePerTokenWei - b.pricePerTokenWei;\n if (diff < BigInt(0)) return -1;\n if (diff > BigInt(0)) return 1;\n return 0;\n });\n}\n","/**\n * BazaarClient - Client for interacting with Net Bazaar (NFT marketplace)\n *\n * Provides methods for:\n * - Reading NFT listings and collection offers\n * - Preparing transactions for creating/canceling listings and offers\n */\n\nimport { PublicClient, createPublicClient, defineChain, http } from \"viem\";\nimport { NetClient } from \"@net-protocol/core\";\nimport {\n Listing,\n CollectionOffer,\n Erc20Offer,\n Erc20Listing,\n GetListingsOptions,\n GetCollectionOffersOptions,\n GetErc20OffersOptions,\n GetErc20ListingsOptions,\n SeaportOrderStatus,\n WriteTransactionConfig,\n SeaportOrderComponents,\n} from \"../types\";\nimport { SEAPORT_CANCEL_ABI } from \"../abis\";\nimport {\n getBazaarChainConfig,\n getBazaarAddress,\n getCollectionOffersAddress,\n getErc20OffersAddress,\n getErc20BazaarAddress,\n getSeaportAddress,\n getWrappedNativeCurrency,\n isBazaarSupportedOnChain,\n} from \"../chainConfig\";\nimport {\n parseListingFromMessage,\n parseCollectionOfferFromMessage,\n parseErc20OfferFromMessage,\n parseErc20ListingFromMessage,\n getBestListingPerToken,\n sortListingsByPrice,\n sortOffersByPrice,\n sortErc20OffersByPricePerToken,\n sortErc20ListingsByPricePerToken,\n createSeaportInstance,\n computeOrderHash,\n getSeaportOrderFromMessageData,\n getOrderStatusFromInfo,\n} from \"../utils\";\nimport {\n bulkFetchOrderStatuses,\n bulkFetchNftOwners,\n bulkFetchErc20Balances,\n isListingValid,\n isCollectionOfferValid,\n isErc20OfferValid,\n isErc20ListingValid,\n} from \"../utils/validation\";\n\n// Default RPC URLs for chains (same as @net-protocol/core)\nconst CHAIN_RPC_URLS: Record<number, string[]> = {\n 8453: [\"https://base-mainnet.public.blastapi.io\", \"https://mainnet.base.org\"],\n 84532: [\"https://sepolia.base.org\"],\n 666666666: [\"https://rpc.degen.tips\"],\n 5112: [\"https://rpc.ham.fun\"],\n 57073: [\"https://rpc-qnd.inkonchain.com\"],\n 130: [\"https://mainnet.unichain.org\"],\n 999: [\"https://rpc.hyperliquid.xyz/evm\"],\n 9745: [\"https://rpc.plasma.to\"],\n 143: [\"https://rpc3.monad.xyz\"],\n};\n\nexport class BazaarClient {\n private chainId: number;\n private client: PublicClient;\n private netClient: NetClient;\n private rpcUrl: string;\n\n constructor(params: { chainId: number; rpcUrl?: string }) {\n if (!isBazaarSupportedOnChain(params.chainId)) {\n throw new Error(`Bazaar is not supported on chain ${params.chainId}`);\n }\n\n this.chainId = params.chainId;\n this.rpcUrl = params.rpcUrl || CHAIN_RPC_URLS[params.chainId]?.[0] || \"\";\n\n if (!this.rpcUrl) {\n throw new Error(`No RPC URL available for chain ${params.chainId}`);\n }\n\n const config = getBazaarChainConfig(params.chainId)!;\n\n this.client = createPublicClient({\n chain: defineChain({\n id: params.chainId,\n name: `Chain ${params.chainId}`,\n nativeCurrency: {\n name: config.wrappedNativeCurrency.name.replace(\"Wrapped \", \"\"),\n symbol: config.currencySymbol.toUpperCase(),\n decimals: 18,\n },\n rpcUrls: {\n default: { http: [this.rpcUrl] },\n },\n }),\n transport: http(this.rpcUrl),\n batch: { multicall: true },\n });\n\n this.netClient = new NetClient({\n chainId: params.chainId,\n overrides: params.rpcUrl ? { rpcUrls: [params.rpcUrl] } : undefined,\n });\n }\n\n /**\n * Get valid NFT listings for a collection\n *\n * Returns listings that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Seller still owns the NFT\n *\n * Results are deduplicated (one per token) and sorted by price (lowest first)\n */\n async getListings(options: GetListingsOptions): Promise<Listing[]> {\n const { nftAddress, excludeMaker, maker, maxMessages = 200 } = options;\n const bazaarAddress = getBazaarAddress(this.chainId);\n\n const filter = {\n appAddress: bazaarAddress,\n topic: nftAddress.toLowerCase(),\n maker,\n };\n\n let startIndex: number;\n let endIndex: number;\n\n if (options.startIndex != null && options.endIndex != null) {\n startIndex = options.startIndex;\n endIndex = options.endIndex;\n } else {\n // Get message count\n const count = await this.netClient.getMessageCount({ filter });\n if (count === 0) {\n return [];\n }\n startIndex = Math.max(0, count - maxMessages);\n endIndex = count;\n }\n\n // Fetch messages (most recent)\n const messages = await this.netClient.getMessages({\n filter,\n startIndex,\n endIndex,\n });\n\n // Parse messages into listings\n let listings: Listing[] = [];\n for (const message of messages) {\n const listing = parseListingFromMessage(message, this.chainId);\n if (!listing) continue;\n\n // Filter by excludeMaker\n if (excludeMaker && listing.maker.toLowerCase() === excludeMaker.toLowerCase()) {\n continue;\n }\n\n listings.push(listing);\n }\n\n if (listings.length === 0) {\n return [];\n }\n\n // Compute order hashes\n const seaport = createSeaportInstance(this.chainId, this.rpcUrl);\n for (const listing of listings) {\n const order = getSeaportOrderFromMessageData(listing.messageData);\n listing.orderHash = computeOrderHash(seaport, order.parameters, order.counter) as `0x${string}`;\n }\n\n // Fetch order statuses\n const orderHashes = listings.map((l) => l.orderHash as `0x${string}`);\n const statusInfos = await bulkFetchOrderStatuses(this.client, this.chainId, orderHashes);\n\n // Update order statuses\n listings.forEach((listing, index) => {\n const statusInfo = statusInfos[index];\n listing.orderStatus = getOrderStatusFromInfo(listing.orderComponents!, statusInfo);\n });\n\n // Filter to OPEN orders only\n listings = listings.filter(\n (l) =>\n l.orderStatus === SeaportOrderStatus.OPEN &&\n l.expirationDate > Math.floor(Date.now() / 1000)\n );\n\n if (listings.length === 0) {\n return [];\n }\n\n // Validate ownership\n const tokenIds = listings.map((l) => l.tokenId);\n const owners = await bulkFetchNftOwners(this.client, nftAddress, tokenIds);\n\n // Filter to listings where seller still owns the NFT\n listings = listings.filter((listing, index) => {\n const owner = owners[index];\n return isListingValid(\n listing.orderStatus,\n listing.expirationDate,\n listing.maker,\n owner\n );\n });\n\n // Deduplicate (best price per token) and sort\n return sortListingsByPrice(getBestListingPerToken(listings));\n }\n\n /**\n * Get valid collection offers for a collection\n *\n * Returns offers that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Buyer has sufficient WETH balance\n *\n * Results are sorted by price (highest first)\n */\n async getCollectionOffers(options: GetCollectionOffersOptions): Promise<CollectionOffer[]> {\n const { nftAddress, excludeMaker, maxMessages = 100 } = options;\n const collectionOffersAddress = getCollectionOffersAddress(this.chainId);\n const weth = getWrappedNativeCurrency(this.chainId);\n\n if (!weth) {\n return [];\n }\n\n // Get message count\n const count = await this.netClient.getMessageCount({\n filter: {\n appAddress: collectionOffersAddress,\n topic: nftAddress.toLowerCase(),\n },\n });\n\n if (count === 0) {\n return [];\n }\n\n // Fetch messages (most recent)\n const startIndex = Math.max(0, count - maxMessages);\n const messages = await this.netClient.getMessages({\n filter: {\n appAddress: collectionOffersAddress,\n topic: nftAddress.toLowerCase(),\n },\n startIndex,\n endIndex: count,\n });\n\n // Parse messages into offers\n let offers: CollectionOffer[] = [];\n for (const message of messages) {\n const offer = parseCollectionOfferFromMessage(message, this.chainId);\n if (!offer) continue;\n\n // Validate WETH token matches\n const order = getSeaportOrderFromMessageData(offer.messageData);\n const offerToken = order.parameters.offer?.[0]?.token?.toLowerCase();\n if (offerToken !== weth.address.toLowerCase()) {\n continue;\n }\n\n // Filter by excludeMaker\n if (excludeMaker && offer.maker.toLowerCase() === excludeMaker.toLowerCase()) {\n continue;\n }\n\n offers.push(offer);\n }\n\n if (offers.length === 0) {\n return [];\n }\n\n // Compute order hashes\n const seaport = createSeaportInstance(this.chainId, this.rpcUrl);\n for (const offer of offers) {\n const order = getSeaportOrderFromMessageData(offer.messageData);\n offer.orderHash = computeOrderHash(seaport, order.parameters, order.counter) as `0x${string}`;\n }\n\n // Fetch order statuses\n const orderHashes = offers.map((o) => o.orderHash as `0x${string}`);\n const statusInfos = await bulkFetchOrderStatuses(this.client, this.chainId, orderHashes);\n\n // Update order statuses\n offers.forEach((offer, index) => {\n const statusInfo = statusInfos[index];\n offer.orderStatus = getOrderStatusFromInfo(offer.orderComponents!, statusInfo);\n });\n\n // Filter to OPEN orders only\n offers = offers.filter(\n (o) =>\n o.orderStatus === SeaportOrderStatus.OPEN &&\n o.expirationDate > Math.floor(Date.now() / 1000)\n );\n\n if (offers.length === 0) {\n return [];\n }\n\n // Validate WETH balances\n const uniqueMakers = [...new Set(offers.map((o) => o.maker))];\n const balances = await bulkFetchErc20Balances(this.client, weth.address, uniqueMakers);\n\n const balanceMap = new Map<string, bigint>();\n uniqueMakers.forEach((maker, index) => {\n balanceMap.set(maker.toLowerCase(), balances[index]);\n });\n\n // Filter to offers where buyer has sufficient balance\n offers = offers.filter((offer) => {\n const balance = balanceMap.get(offer.maker.toLowerCase()) || BigInt(0);\n return isCollectionOfferValid(\n offer.orderStatus,\n offer.expirationDate,\n offer.priceWei,\n balance\n );\n });\n\n // Sort by price (highest first)\n return sortOffersByPrice(offers);\n }\n\n /**\n * Get valid ERC20 offers for a token\n *\n * ERC20 offers are only available on Base (8453) and HyperEVM (999).\n *\n * Returns offers that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Buyer has sufficient WETH balance\n *\n * Results are sorted by price per token (highest first)\n */\n async getErc20Offers(options: GetErc20OffersOptions): Promise<Erc20Offer[]> {\n const { tokenAddress, excludeMaker, maxMessages = 200 } = options;\n const erc20OffersAddress = getErc20OffersAddress(this.chainId);\n const weth = getWrappedNativeCurrency(this.chainId);\n\n // ERC20 offers only available on Base and HyperEVM\n if (!erc20OffersAddress || !weth) {\n return [];\n }\n\n // Get message count\n const count = await this.netClient.getMessageCount({\n filter: {\n appAddress: erc20OffersAddress,\n topic: tokenAddress.toLowerCase(),\n },\n });\n\n if (count === 0) {\n return [];\n }\n\n // Fetch messages (most recent)\n const startIndex = Math.max(0, count - maxMessages);\n const messages = await this.netClient.getMessages({\n filter: {\n appAddress: erc20OffersAddress,\n topic: tokenAddress.toLowerCase(),\n },\n startIndex,\n endIndex: count,\n });\n\n // Parse messages into offers\n let offers: Erc20Offer[] = [];\n for (const message of messages) {\n const offer = parseErc20OfferFromMessage(message, this.chainId);\n if (!offer) continue;\n\n // Validate WETH token matches\n const order = getSeaportOrderFromMessageData(offer.messageData);\n const offerToken = order.parameters.offer?.[0]?.token?.toLowerCase();\n if (offerToken !== weth.address.toLowerCase()) {\n continue;\n }\n\n // Validate the consideration token matches the requested token\n if (offer.tokenAddress.toLowerCase() !== tokenAddress.toLowerCase()) {\n continue;\n }\n\n // Filter by excludeMaker\n if (excludeMaker && offer.maker.toLowerCase() === excludeMaker.toLowerCase()) {\n continue;\n }\n\n offers.push(offer);\n }\n\n if (offers.length === 0) {\n return [];\n }\n\n // Compute order hashes\n const seaport = createSeaportInstance(this.chainId, this.rpcUrl);\n for (const offer of offers) {\n const order = getSeaportOrderFromMessageData(offer.messageData);\n offer.orderHash = computeOrderHash(seaport, order.parameters, order.counter) as `0x${string}`;\n }\n\n // Fetch order statuses\n const orderHashes = offers.map((o) => o.orderHash);\n const statusInfos = await bulkFetchOrderStatuses(this.client, this.chainId, orderHashes);\n\n // Update order statuses\n offers.forEach((offer, index) => {\n const statusInfo = statusInfos[index];\n offer.orderStatus = getOrderStatusFromInfo(offer.orderComponents!, statusInfo);\n });\n\n // Filter to OPEN orders only\n offers = offers.filter(\n (o) =>\n o.orderStatus === SeaportOrderStatus.OPEN &&\n o.expirationDate > Math.floor(Date.now() / 1000)\n );\n\n if (offers.length === 0) {\n return [];\n }\n\n // Validate WETH balances\n const uniqueMakers = [...new Set(offers.map((o) => o.maker))];\n const balances = await bulkFetchErc20Balances(this.client, weth.address, uniqueMakers);\n\n const balanceMap = new Map<string, bigint>();\n uniqueMakers.forEach((maker, index) => {\n balanceMap.set(maker.toLowerCase(), balances[index]);\n });\n\n // Filter to offers where buyer has sufficient balance\n offers = offers.filter((offer) => {\n const balance = balanceMap.get(offer.maker.toLowerCase()) || BigInt(0);\n return isErc20OfferValid(\n offer.orderStatus,\n offer.expirationDate,\n offer.priceWei,\n balance\n );\n });\n\n // Sort by price per token (highest first) - no deduplication for ERC20 offers\n return sortErc20OffersByPricePerToken(offers);\n }\n\n /**\n * Get valid ERC20 listings for a token\n *\n * Returns listings that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Seller has sufficient ERC20 token balance\n *\n * Results are sorted by price per token (lowest first). No deduplication —\n * all valid listings are returned (grouped by maker in the UI).\n */\n async getErc20Listings(options: GetErc20ListingsOptions): Promise<Erc20Listing[]> {\n const { tokenAddress, excludeMaker, maker, maxMessages = 200 } = options;\n const erc20BazaarAddress = getErc20BazaarAddress(this.chainId);\n\n const filter = {\n appAddress: erc20BazaarAddress,\n topic: tokenAddress.toLowerCase(),\n maker,\n };\n\n let startIndex: number;\n let endIndex: number;\n\n if (options.startIndex != null && options.endIndex != null) {\n startIndex = options.startIndex;\n endIndex = options.endIndex;\n } else {\n // Get message count\n const count = await this.netClient.getMessageCount({ filter });\n if (count === 0) {\n return [];\n }\n startIndex = Math.max(0, count - maxMessages);\n endIndex = count;\n }\n\n // Fetch messages (most recent)\n const messages = await this.netClient.getMessages({\n filter,\n startIndex,\n endIndex,\n });\n\n // Parse messages into listings\n let listings: Erc20Listing[] = [];\n for (const message of messages) {\n const listing = parseErc20ListingFromMessage(message, this.chainId);\n if (!listing) continue;\n\n // Validate the offer token matches the requested token\n if (listing.tokenAddress.toLowerCase() !== tokenAddress.toLowerCase()) {\n continue;\n }\n\n // Filter by excludeMaker\n if (excludeMaker && listing.maker.toLowerCase() === excludeMaker.toLowerCase()) {\n continue;\n }\n\n listings.push(listing);\n }\n\n if (listings.length === 0) {\n return [];\n }\n\n // Compute order hashes\n const seaport = createSeaportInstance(this.chainId, this.rpcUrl);\n for (const listing of listings) {\n const order = getSeaportOrderFromMessageData(listing.messageData);\n listing.orderHash = computeOrderHash(seaport, order.parameters, order.counter) as `0x${string}`;\n }\n\n // Fetch order statuses\n const orderHashes = listings.map((l) => l.orderHash);\n const statusInfos = await bulkFetchOrderStatuses(this.client, this.chainId, orderHashes);\n\n // Update order statuses\n listings.forEach((listing, index) => {\n const statusInfo = statusInfos[index];\n listing.orderStatus = getOrderStatusFromInfo(listing.orderComponents!, statusInfo);\n });\n\n // Filter to OPEN orders only\n listings = listings.filter(\n (l) =>\n l.orderStatus === SeaportOrderStatus.OPEN &&\n l.expirationDate > Math.floor(Date.now() / 1000)\n );\n\n if (listings.length === 0) {\n return [];\n }\n\n // Validate seller's ERC20 balances\n const uniqueMakers = [...new Set(listings.map((l) => l.maker))];\n const balances = await bulkFetchErc20Balances(this.client, tokenAddress, uniqueMakers);\n\n const balanceMap = new Map<string, bigint>();\n uniqueMakers.forEach((maker, index) => {\n balanceMap.set(maker.toLowerCase(), balances[index]);\n });\n\n // Filter to listings where seller has sufficient token balance\n listings = listings.filter((listing) => {\n const balance = balanceMap.get(listing.maker.toLowerCase()) || BigInt(0);\n return isErc20ListingValid(\n listing.orderStatus,\n listing.expirationDate,\n listing.tokenAmount,\n balance\n );\n });\n\n // Sort by price per token (lowest first) — no deduplication for ERC20 listings\n return sortErc20ListingsByPricePerToken(listings);\n }\n\n /**\n * Get the chain ID this client is configured for\n */\n getChainId(): number {\n return this.chainId;\n }\n\n /**\n * Get the bazaar contract address for this chain\n */\n getBazaarAddress(): `0x${string}` {\n return getBazaarAddress(this.chainId);\n }\n\n /**\n * Get the collection offers contract address for this chain\n */\n getCollectionOffersAddress(): `0x${string}` {\n return getCollectionOffersAddress(this.chainId);\n }\n\n /**\n * Get the ERC20 offers contract address for this chain\n * Only available on Base (8453) and HyperEVM (999)\n */\n getErc20OffersAddress(): `0x${string}` | undefined {\n return getErc20OffersAddress(this.chainId);\n }\n\n /**\n * Get the ERC20 bazaar (listings) contract address for this chain\n */\n getErc20BazaarAddress(): `0x${string}` {\n return getErc20BazaarAddress(this.chainId);\n }\n\n /**\n * Get the Seaport contract address for this chain\n */\n getSeaportAddress(): `0x${string}` {\n return getSeaportAddress(this.chainId);\n }\n\n /**\n * Prepare a transaction to cancel a listing\n *\n * The listing must have been created by the caller.\n * Use the orderComponents from the Listing object returned by getListings().\n */\n prepareCancelListing(listing: Listing): WriteTransactionConfig {\n if (!listing.orderComponents) {\n throw new Error(\"Listing does not have order components\");\n }\n\n return this.prepareCancelOrder(listing.orderComponents);\n }\n\n /**\n * Prepare a transaction to cancel a collection offer\n *\n * The offer must have been created by the caller.\n * Use the orderComponents from the CollectionOffer object returned by getCollectionOffers().\n */\n prepareCancelCollectionOffer(offer: CollectionOffer): WriteTransactionConfig {\n if (!offer.orderComponents) {\n throw new Error(\"Offer does not have order components\");\n }\n\n return this.prepareCancelOrder(offer.orderComponents);\n }\n\n /**\n * Prepare a transaction to cancel an ERC20 listing\n *\n * The listing must have been created by the caller.\n * Use the orderComponents from the Erc20Listing object returned by getErc20Listings().\n */\n prepareCancelErc20Listing(listing: Erc20Listing): WriteTransactionConfig {\n if (!listing.orderComponents) {\n throw new Error(\"Listing does not have order components\");\n }\n\n return this.prepareCancelOrder(listing.orderComponents);\n }\n\n /**\n * Prepare a transaction to cancel a Seaport order\n *\n * This is a low-level method. Prefer prepareCancelListing or prepareCancelCollectionOffer.\n */\n prepareCancelOrder(orderComponents: SeaportOrderComponents): WriteTransactionConfig {\n const seaportAddress = getSeaportAddress(this.chainId);\n\n // Convert order components to the format expected by Seaport\n const orderForCancel = {\n offerer: orderComponents.offerer,\n zone: orderComponents.zone,\n offer: orderComponents.offer.map((item) => ({\n itemType: item.itemType,\n token: item.token,\n identifierOrCriteria: item.identifierOrCriteria,\n startAmount: item.startAmount,\n endAmount: item.endAmount,\n })),\n consideration: orderComponents.consideration.map((item) => ({\n itemType: item.itemType,\n token: item.token,\n identifierOrCriteria: item.identifierOrCriteria,\n startAmount: item.startAmount,\n endAmount: item.endAmount,\n recipient: item.recipient,\n })),\n orderType: orderComponents.orderType,\n startTime: orderComponents.startTime,\n endTime: orderComponents.endTime,\n zoneHash: orderComponents.zoneHash,\n salt: orderComponents.salt,\n conduitKey: orderComponents.conduitKey,\n counter: orderComponents.counter,\n };\n\n return {\n to: seaportAddress,\n functionName: \"cancel\",\n args: [[orderForCancel]],\n abi: SEAPORT_CANCEL_ABI,\n };\n }\n}\n","/**\n * React hook for fetching NFT listings from Bazaar\n */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { useNetMessages, useNetMessageCount } from \"@net-protocol/core/react\";\nimport { BazaarClient } from \"../client/BazaarClient\";\nimport { Listing, SeaportOrderStatus } from \"../types\";\nimport { getBazaarAddress, isBazaarSupportedOnChain } from \"../chainConfig\";\n\nexport interface UseBazaarListingsOptions {\n /** Chain ID to query */\n chainId: number;\n /** NFT collection address */\n nftAddress: `0x${string}`;\n /** Exclude listings from this address */\n excludeMaker?: `0x${string}`;\n /** Only include listings from this address */\n maker?: `0x${string}`;\n /** Maximum number of messages to fetch (default: 200) */\n maxMessages?: number;\n /** Override start index for message range */\n startIndex?: number;\n /** Override end index for message range */\n endIndex?: number;\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseBazaarListingsResult {\n /** Valid listings (deduplicated, sorted by price) */\n listings: Listing[];\n /** Whether the data is loading */\n isLoading: boolean;\n /** Error if any */\n error: Error | undefined;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * React hook for fetching valid NFT listings from Bazaar\n *\n * Returns listings that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Seller still owns the NFT\n *\n * Results are deduplicated (one per token) and sorted by price (lowest first)\n *\n * @example\n * ```tsx\n * const { listings, isLoading, error } = useBazaarListings({\n * chainId: 8453,\n * nftAddress: \"0x...\",\n * maxMessages: 100,\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * return (\n * <ul>\n * {listings.map((listing) => (\n * <li key={listing.orderHash}>\n * Token #{listing.tokenId} - {listing.price} {listing.currency}\n * </li>\n * ))}\n * </ul>\n * );\n * ```\n */\nexport function useBazaarListings({\n chainId,\n nftAddress,\n excludeMaker,\n maker,\n maxMessages = 200,\n startIndex: startIndexOverride,\n endIndex: endIndexOverride,\n enabled = true,\n}: UseBazaarListingsOptions): UseBazaarListingsResult {\n const [listings, setListings] = useState<Listing[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [processingError, setProcessingError] = useState<Error | undefined>();\n const [refetchTrigger, setRefetchTrigger] = useState(0);\n\n const hasRangeOverride = startIndexOverride != null && endIndexOverride != null;\n\n // Check if chain is supported\n const isSupported = useMemo(\n () => isBazaarSupportedOnChain(chainId),\n [chainId]\n );\n\n // Get bazaar address for the chain\n const bazaarAddress = useMemo(\n () => (isSupported ? getBazaarAddress(chainId) : undefined),\n [chainId, isSupported]\n );\n\n // Build filter\n const filter = useMemo(\n () => ({\n appAddress: bazaarAddress as `0x${string}`,\n topic: nftAddress.toLowerCase(),\n maker,\n }),\n [bazaarAddress, nftAddress, maker]\n );\n\n // Get message count (skip when range overrides are provided)\n const { count: totalCount, isLoading: isLoadingCount } = useNetMessageCount({\n chainId,\n filter,\n enabled: enabled && isSupported && !hasRangeOverride,\n });\n\n // Calculate range\n const startIndex = hasRangeOverride\n ? startIndexOverride!\n : Math.max(0, totalCount - maxMessages);\n const endIndex = hasRangeOverride ? endIndexOverride! : totalCount;\n\n // Get messages\n const {\n messages,\n isLoading: isLoadingMessages,\n error: messagesError,\n refetch: refetchMessages,\n } = useNetMessages({\n chainId,\n filter,\n startIndex,\n endIndex,\n enabled: enabled && isSupported && (hasRangeOverride || totalCount > 0),\n });\n\n // Process listings when messages change\n useEffect(() => {\n if (!isSupported || !enabled) {\n setListings([]);\n return;\n }\n\n if (!messages || messages.length === 0) {\n setListings([]);\n return;\n }\n\n let cancelled = false;\n\n async function processListings() {\n setIsProcessing(true);\n setProcessingError(undefined);\n\n try {\n const client = new BazaarClient({ chainId });\n const validListings = await client.getListings({\n nftAddress,\n excludeMaker,\n maker,\n maxMessages,\n startIndex: hasRangeOverride ? startIndexOverride : undefined,\n endIndex: hasRangeOverride ? endIndexOverride : undefined,\n });\n\n if (!cancelled) {\n setListings(validListings);\n }\n } catch (err) {\n if (!cancelled) {\n setProcessingError(err instanceof Error ? err : new Error(String(err)));\n setListings([]);\n }\n } finally {\n if (!cancelled) {\n setIsProcessing(false);\n }\n }\n }\n\n processListings();\n\n return () => {\n cancelled = true;\n };\n }, [chainId, nftAddress, excludeMaker, maker, maxMessages, startIndexOverride, endIndexOverride, hasRangeOverride, messages, isSupported, enabled, refetchTrigger]);\n\n const refetch = () => {\n refetchMessages();\n setRefetchTrigger((t) => t + 1);\n };\n\n return {\n listings,\n isLoading: (hasRangeOverride ? false : isLoadingCount) || isLoadingMessages || isProcessing,\n error: messagesError || processingError,\n refetch,\n };\n}\n","/**\n * React hook for fetching collection offers from Bazaar\n */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { useNetMessages, useNetMessageCount } from \"@net-protocol/core/react\";\nimport { BazaarClient } from \"../client/BazaarClient\";\nimport { CollectionOffer } from \"../types\";\nimport { getCollectionOffersAddress, isBazaarSupportedOnChain } from \"../chainConfig\";\n\nexport interface UseBazaarCollectionOffersOptions {\n /** Chain ID to query */\n chainId: number;\n /** NFT collection address */\n nftAddress: `0x${string}`;\n /** Exclude offers from this address */\n excludeMaker?: `0x${string}`;\n /** Maximum number of messages to fetch (default: 100) */\n maxMessages?: number;\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseBazaarCollectionOffersResult {\n /** Valid collection offers (sorted by price, highest first) */\n offers: CollectionOffer[];\n /** Whether the data is loading */\n isLoading: boolean;\n /** Error if any */\n error: Error | undefined;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * React hook for fetching valid collection offers from Bazaar\n *\n * Returns offers that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Buyer has sufficient WETH balance\n *\n * Results are sorted by price (highest first)\n *\n * @example\n * ```tsx\n * const { offers, isLoading, error } = useBazaarCollectionOffers({\n * chainId: 8453,\n * nftAddress: \"0x...\",\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * const bestOffer = offers[0];\n * if (bestOffer) {\n * return <div>Best offer: {bestOffer.price} {bestOffer.currency}</div>;\n * }\n * ```\n */\nexport function useBazaarCollectionOffers({\n chainId,\n nftAddress,\n excludeMaker,\n maxMessages = 100,\n enabled = true,\n}: UseBazaarCollectionOffersOptions): UseBazaarCollectionOffersResult {\n const [offers, setOffers] = useState<CollectionOffer[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [processingError, setProcessingError] = useState<Error | undefined>();\n const [refetchTrigger, setRefetchTrigger] = useState(0);\n\n // Check if chain is supported\n const isSupported = useMemo(\n () => isBazaarSupportedOnChain(chainId),\n [chainId]\n );\n\n // Get collection offers address for the chain\n const collectionOffersAddress = useMemo(\n () => (isSupported ? getCollectionOffersAddress(chainId) : undefined),\n [chainId, isSupported]\n );\n\n // Build filter\n const filter = useMemo(\n () => ({\n appAddress: collectionOffersAddress as `0x${string}`,\n topic: nftAddress.toLowerCase(),\n }),\n [collectionOffersAddress, nftAddress]\n );\n\n // Get message count\n const { count: totalCount, isLoading: isLoadingCount } = useNetMessageCount({\n chainId,\n filter,\n enabled: enabled && isSupported,\n });\n\n // Calculate range\n const startIndex = useMemo(\n () => Math.max(0, totalCount - maxMessages),\n [totalCount, maxMessages]\n );\n\n // Get messages\n const {\n messages,\n isLoading: isLoadingMessages,\n error: messagesError,\n refetch: refetchMessages,\n } = useNetMessages({\n chainId,\n filter,\n startIndex,\n endIndex: totalCount,\n enabled: enabled && isSupported && totalCount > 0,\n });\n\n // Process offers when messages change\n useEffect(() => {\n if (!isSupported || !enabled) {\n setOffers([]);\n return;\n }\n\n if (!messages || messages.length === 0) {\n setOffers([]);\n return;\n }\n\n let cancelled = false;\n\n async function processOffers() {\n setIsProcessing(true);\n setProcessingError(undefined);\n\n try {\n const client = new BazaarClient({ chainId });\n const validOffers = await client.getCollectionOffers({\n nftAddress,\n excludeMaker,\n maxMessages,\n });\n\n if (!cancelled) {\n setOffers(validOffers);\n }\n } catch (err) {\n if (!cancelled) {\n setProcessingError(err instanceof Error ? err : new Error(String(err)));\n setOffers([]);\n }\n } finally {\n if (!cancelled) {\n setIsProcessing(false);\n }\n }\n }\n\n processOffers();\n\n return () => {\n cancelled = true;\n };\n }, [chainId, nftAddress, excludeMaker, maxMessages, messages, isSupported, enabled, refetchTrigger]);\n\n const refetch = () => {\n refetchMessages();\n setRefetchTrigger((t) => t + 1);\n };\n\n return {\n offers,\n isLoading: isLoadingCount || isLoadingMessages || isProcessing,\n error: messagesError || processingError,\n refetch,\n };\n}\n","/**\n * React hook for fetching ERC20 offers from Bazaar\n */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { useNetMessages, useNetMessageCount } from \"@net-protocol/core/react\";\nimport { BazaarClient } from \"../client/BazaarClient\";\nimport { Erc20Offer } from \"../types\";\nimport { getErc20OffersAddress, isBazaarSupportedOnChain } from \"../chainConfig\";\n\nexport interface UseBazaarErc20OffersOptions {\n /** Chain ID to query */\n chainId: number;\n /** ERC20 token address */\n tokenAddress: `0x${string}`;\n /** Exclude offers from this address */\n excludeMaker?: `0x${string}`;\n /** Maximum number of messages to fetch (default: 200) */\n maxMessages?: number;\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseBazaarErc20OffersResult {\n /** Valid ERC20 offers (sorted by price per token, highest first) */\n offers: Erc20Offer[];\n /** Whether the data is loading */\n isLoading: boolean;\n /** Error if any */\n error: Error | undefined;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * React hook for fetching valid ERC20 offers from Bazaar\n *\n * ERC20 offers are only available on Base (8453) and HyperEVM (999).\n *\n * Returns offers that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Buyer has sufficient WETH balance\n *\n * Results are sorted by price per token (highest first)\n *\n * @example\n * ```tsx\n * const { offers, isLoading, error } = useBazaarErc20Offers({\n * chainId: 8453,\n * tokenAddress: \"0x...\",\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * const bestOffer = offers[0];\n * if (bestOffer) {\n * return (\n * <div>\n * Best offer: {bestOffer.pricePerToken} {bestOffer.currency} per token\n * (total: {bestOffer.price} {bestOffer.currency} for {bestOffer.tokenAmount.toString()} tokens)\n * </div>\n * );\n * }\n * ```\n */\nexport function useBazaarErc20Offers({\n chainId,\n tokenAddress,\n excludeMaker,\n maxMessages = 200,\n enabled = true,\n}: UseBazaarErc20OffersOptions): UseBazaarErc20OffersResult {\n const [offers, setOffers] = useState<Erc20Offer[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [processingError, setProcessingError] = useState<Error | undefined>();\n const [refetchTrigger, setRefetchTrigger] = useState(0);\n\n // Check if chain is supported and has ERC20 offers\n const isSupported = useMemo(\n () => isBazaarSupportedOnChain(chainId),\n [chainId]\n );\n\n // Get ERC20 offers address for the chain (only Base and HyperEVM)\n const erc20OffersAddress = useMemo(\n () => (isSupported ? getErc20OffersAddress(chainId) : undefined),\n [chainId, isSupported]\n );\n\n // ERC20 offers only available on chains with the contract deployed\n const hasErc20Offers = Boolean(erc20OffersAddress);\n\n // Build filter\n const filter = useMemo(\n () => ({\n appAddress: erc20OffersAddress as `0x${string}`,\n topic: tokenAddress.toLowerCase(),\n }),\n [erc20OffersAddress, tokenAddress]\n );\n\n // Get message count\n const { count: totalCount, isLoading: isLoadingCount } = useNetMessageCount({\n chainId,\n filter,\n enabled: enabled && hasErc20Offers,\n });\n\n // Calculate range\n const startIndex = useMemo(\n () => Math.max(0, totalCount - maxMessages),\n [totalCount, maxMessages]\n );\n\n // Get messages\n const {\n messages,\n isLoading: isLoadingMessages,\n error: messagesError,\n refetch: refetchMessages,\n } = useNetMessages({\n chainId,\n filter,\n startIndex,\n endIndex: totalCount,\n enabled: enabled && hasErc20Offers && totalCount > 0,\n });\n\n // Process offers when messages change\n useEffect(() => {\n if (!hasErc20Offers || !enabled) {\n setOffers([]);\n return;\n }\n\n if (!messages || messages.length === 0) {\n setOffers([]);\n return;\n }\n\n let cancelled = false;\n\n async function processOffers() {\n setIsProcessing(true);\n setProcessingError(undefined);\n\n try {\n const client = new BazaarClient({ chainId });\n const validOffers = await client.getErc20Offers({\n tokenAddress,\n excludeMaker,\n maxMessages,\n });\n\n if (!cancelled) {\n setOffers(validOffers);\n }\n } catch (err) {\n if (!cancelled) {\n setProcessingError(err instanceof Error ? err : new Error(String(err)));\n setOffers([]);\n }\n } finally {\n if (!cancelled) {\n setIsProcessing(false);\n }\n }\n }\n\n processOffers();\n\n return () => {\n cancelled = true;\n };\n }, [chainId, tokenAddress, excludeMaker, maxMessages, messages, hasErc20Offers, enabled, refetchTrigger]);\n\n const refetch = () => {\n refetchMessages();\n setRefetchTrigger((t) => t + 1);\n };\n\n return {\n offers,\n isLoading: isLoadingCount || isLoadingMessages || isProcessing,\n error: messagesError || processingError,\n refetch,\n };\n}\n","/**\n * React hook for fetching ERC20 listings from Bazaar\n */\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport { useNetMessages, useNetMessageCount } from \"@net-protocol/core/react\";\nimport { BazaarClient } from \"../client/BazaarClient\";\nimport { Erc20Listing } from \"../types\";\nimport { getErc20BazaarAddress, isBazaarSupportedOnChain } from \"../chainConfig\";\n\nexport interface UseBazaarErc20ListingsOptions {\n /** Chain ID to query */\n chainId: number;\n /** ERC20 token address */\n tokenAddress: `0x${string}`;\n /** Exclude listings from this address */\n excludeMaker?: `0x${string}`;\n /** Only include listings from this address */\n maker?: `0x${string}`;\n /** Maximum number of messages to fetch (default: 200) */\n maxMessages?: number;\n /** Override start index for message range */\n startIndex?: number;\n /** Override end index for message range */\n endIndex?: number;\n /** Whether the query is enabled (default: true) */\n enabled?: boolean;\n}\n\nexport interface UseBazaarErc20ListingsResult {\n /** Valid ERC20 listings (sorted by price per token, lowest first) */\n listings: Erc20Listing[];\n /** Whether the data is loading */\n isLoading: boolean;\n /** Error if any */\n error: Error | undefined;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * React hook for fetching valid ERC20 listings from Bazaar\n *\n * ERC20 listings are available on all supported chains.\n *\n * Returns listings that are:\n * - OPEN status (not filled, cancelled, or expired)\n * - Not expired\n * - Seller has sufficient ERC20 token balance\n *\n * Results are sorted by price per token (lowest first)\n *\n * @example\n * ```tsx\n * const { listings, isLoading, error } = useBazaarErc20Listings({\n * chainId: 8453,\n * tokenAddress: \"0x...\",\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * const bestListing = listings[0];\n * if (bestListing) {\n * return (\n * <div>\n * Best listing: {bestListing.pricePerToken} {bestListing.currency} per token\n * (total: {bestListing.price} {bestListing.currency} for {bestListing.tokenAmount.toString()} tokens)\n * </div>\n * );\n * }\n * ```\n */\nexport function useBazaarErc20Listings({\n chainId,\n tokenAddress,\n excludeMaker,\n maker,\n maxMessages = 200,\n startIndex: startIndexOverride,\n endIndex: endIndexOverride,\n enabled = true,\n}: UseBazaarErc20ListingsOptions): UseBazaarErc20ListingsResult {\n const [listings, setListings] = useState<Erc20Listing[]>([]);\n const [isProcessing, setIsProcessing] = useState(false);\n const [processingError, setProcessingError] = useState<Error | undefined>();\n const [refetchTrigger, setRefetchTrigger] = useState(0);\n\n const hasRangeOverride = startIndexOverride != null && endIndexOverride != null;\n\n // Check if chain is supported\n const isSupported = useMemo(\n () => isBazaarSupportedOnChain(chainId),\n [chainId]\n );\n\n // Get ERC20 bazaar address for the chain (available on all chains)\n const erc20BazaarAddress = useMemo(\n () => (isSupported ? getErc20BazaarAddress(chainId) : undefined),\n [chainId, isSupported]\n );\n\n // Build filter\n const filter = useMemo(\n () => ({\n appAddress: erc20BazaarAddress as `0x${string}`,\n topic: tokenAddress.toLowerCase(),\n maker,\n }),\n [erc20BazaarAddress, tokenAddress, maker]\n );\n\n // Get message count (skip when range overrides are provided)\n const { count: totalCount, isLoading: isLoadingCount } = useNetMessageCount({\n chainId,\n filter,\n enabled: enabled && isSupported && !hasRangeOverride,\n });\n\n // Calculate range\n const startIndex = hasRangeOverride\n ? startIndexOverride!\n : Math.max(0, totalCount - maxMessages);\n const endIndex = hasRangeOverride ? endIndexOverride! : totalCount;\n\n // Get messages\n const {\n messages,\n isLoading: isLoadingMessages,\n error: messagesError,\n refetch: refetchMessages,\n } = useNetMessages({\n chainId,\n filter,\n startIndex,\n endIndex,\n enabled: enabled && isSupported && (hasRangeOverride || totalCount > 0),\n });\n\n // Process listings when messages change\n useEffect(() => {\n if (!isSupported || !enabled) {\n setListings([]);\n return;\n }\n\n if (!messages || messages.length === 0) {\n setListings([]);\n return;\n }\n\n let cancelled = false;\n\n async function processListings() {\n setIsProcessing(true);\n setProcessingError(undefined);\n\n try {\n const client = new BazaarClient({ chainId });\n const validListings = await client.getErc20Listings({\n tokenAddress,\n excludeMaker,\n maker,\n maxMessages,\n startIndex: hasRangeOverride ? startIndexOverride : undefined,\n endIndex: hasRangeOverride ? endIndexOverride : undefined,\n });\n\n if (!cancelled) {\n setListings(validListings);\n }\n } catch (err) {\n if (!cancelled) {\n setProcessingError(err instanceof Error ? err : new Error(String(err)));\n setListings([]);\n }\n } finally {\n if (!cancelled) {\n setIsProcessing(false);\n }\n }\n }\n\n processListings();\n\n return () => {\n cancelled = true;\n };\n }, [chainId, tokenAddress, excludeMaker, maker, maxMessages, startIndexOverride, endIndexOverride, hasRangeOverride, messages, isSupported, enabled, refetchTrigger]);\n\n const refetch = () => {\n refetchMessages();\n setRefetchTrigger((t) => t + 1);\n };\n\n return {\n listings,\n isLoading: (hasRangeOverride ? false : isLoadingCount) || isLoadingMessages || isProcessing,\n error: messagesError || processingError,\n refetch,\n };\n}\n"]}