diff --git a/blockapi/test/v2/api/nft/test_unisat.py b/blockapi/test/v2/api/nft/test_unisat.py index 288519d8..186d1738 100644 --- a/blockapi/test/v2/api/nft/test_unisat.py +++ b/blockapi/test/v2/api/nft/test_unisat.py @@ -49,11 +49,11 @@ def test_fetch_collection(requests_mock, unisat_client, collection_stats): assert not collection.is_disabled assert not collection.is_nsfw assert collection.blockchain == Blockchain.BITCOIN - assert str(collection.total_stats.floor_price) == "990000" + assert str(collection.total_stats.floor_price) == "0.0099" assert str(collection.total_stats.owners_count) == "1563" assert str(collection.total_stats.sales_count) == "20" - assert str(collection.total_stats.volume) == "39900000" - assert str(collection.total_stats.market_cap) == str(990000 * 1563) + assert str(collection.total_stats.volume) == "0.399" + assert str(collection.total_stats.market_cap) == "15.4737" def test_fetch_listings(requests_mock, unisat_client, listings_data): diff --git a/blockapi/v2/api/nft/unisat.py b/blockapi/v2/api/nft/unisat.py index a5a1136d..c323eff1 100644 --- a/blockapi/v2/api/nft/unisat.py +++ b/blockapi/v2/api/nft/unisat.py @@ -21,6 +21,7 @@ NftOfferDirection, BtcNftType, ) +from blockapi.utils.num import raw_to_decimals from requests import HTTPError import requests @@ -81,7 +82,7 @@ def __init__( } self.limit = limit - self._collection_map: Dict[str, Tuple[str, str]] | None = None + self._collection_map = None def fetch_nfts(self, address: str) -> FetchResult: """ @@ -187,12 +188,12 @@ def _yield_parsed_nfts(self, data: Dict) -> Generator[NftToken, None, None]: ident=iid, collection=cid, collection_name=cname, - contract=utxo["txid"], + contract=cid, standard="ordinals", name=f"Ordinal #{item['inscriptionNumber']}", description="", amount=1, - image_url="", + image_url=f"https://open-api.unisat.io/v1/indexer/inscription/content/{iid}", metadata_url=None, updated_time=str(item["timestamp"]), is_disabled=False, @@ -295,14 +296,15 @@ def parse_collection(self, fetch_result: FetchResult) -> ParseResult: if icon: icon_url = f"https://static.unisat.io/content/{icon}" - # Create NftCollectionTotalStats - floor_price = stats.get("floorPrice", 0) + floor_price = raw_to_decimals(stats.get("floorPrice", 0), self.coin.decimals) + + volume = raw_to_decimals(stats.get("btcValue", 0), self.coin.decimals) + total_nfts = stats.get("total", 0) - # Calculate market cap as floor price × total supply - market_cap = floor_price * total_nfts if floor_price and total_nfts else 0 + market_cap = floor_price * total_nfts if total_nfts else 0 total_stats = NftCollectionTotalStats.from_api( - volume=str(stats.get("btcValue", 0)), + volume=str(volume), sales_count=str(stats.get("listed", 0)), owners_count=str(total_nfts), market_cap=str(market_cap), @@ -376,6 +378,7 @@ def fetch_listings( all_items: Optional[bool] = None, sort_by: NftSortBy = NftSortBy.UNIT_PRICE, sort_order: int = -1, + cursor: Optional[str] = None, ) -> FetchResult: """ Fetch all current listings (sell offers) for a specific collection. @@ -515,9 +518,7 @@ def _yield_parsed_listings( if amount is None: amount = 1 - price = item.get('price') - if price is None: - price = 0 + price_sat = item.get('price') or 0 yield NftOffer.from_api( offer_key=item["auctionId"], @@ -534,7 +535,7 @@ def _yield_parsed_listings( offer_ident=item["inscriptionId"], pay_contract=None, pay_ident=None, - pay_amount=price, + pay_amount=price_sat, pay_coin=self.coin, ) @@ -548,6 +549,7 @@ def fetch_offers( domain_type: Optional[str] = None, collection: Optional[str] = None, limit: int = 499, + cursor: Optional[str] = None, ) -> FetchResult: """ Fetch listing events (historical or recent) in a collection. @@ -674,9 +676,7 @@ def _yield_parsed_offers( f"Could not parse timestamp {timestamp} for item {item.get('auctionId')}" ) - price = item.get('price') - if price is None: - price = 0 + price_sat = item.get('price') or 0 yield NftOffer.from_api( offer_key=item["auctionId"], @@ -693,6 +693,6 @@ def _yield_parsed_offers( offer_ident=item["inscriptionId"], pay_contract=None, pay_ident=None, - pay_amount=price, + pay_amount=price_sat, pay_coin=self.coin, )