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..0b7a9d4e 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), @@ -515,9 +517,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 +534,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, ) @@ -674,9 +674,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 +691,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, )