blockapi 1.1.4__tar.gz → 1.2.0__tar.gz
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.
- {blockapi-1.1.4 → blockapi-1.2.0}/PKG-INFO +1 -1
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/nft/test_unisat.py +56 -38
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/nft/unisat.py +9 -8
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi.egg-info/PKG-INFO +1 -1
- {blockapi-1.1.4 → blockapi-1.2.0}/setup.py +1 -1
- {blockapi-1.1.4 → blockapi-1.2.0}/LICENSE.md +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/README.md +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/__init__.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/__init__.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/alethio.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/amberdata.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/binance.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/blockchaininfo.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/blockchainos.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/blockchair.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/blockcypher.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/blockonomics.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/blockscout.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/btc.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/cardanoexplorer.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/chainso.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/cosmos.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/cryptoid.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/dcrdata.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/digonchain.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/eospark.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/etherscan.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/ethplorer.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/greymass.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/insight.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/kyber.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/neoscan.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/ontology.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/solana.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/stellar.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/subscan.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/terra_money.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/trezor.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/tronscan.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/tzscan.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/tzstats.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/zchain.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/api/zensystem.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/services.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/__init__.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/api/__init__.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/api/test_amberdata.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/api/test_balances.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/api/test_binance.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/api/test_blockchainos.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/api/test_blockchair.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/api/test_blockscout.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/api/test_btc.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/api/test_cosmos.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/api/test_dcrdata.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/api/test_digonchain.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/api/test_insight.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/api/test_kyber.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/api/test_ontio.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/api/test_solana.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/api/test_subscan.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/api/test_terra_money.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/api/test_tronscan.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/api/test_tzscan.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/api/test_tzstats.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/test_blockapi.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/test_num.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/test_random_user_agent.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/__init__.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/__init__.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/conftest.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/covalenth/__init__.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/covalenth/test_ethereum.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/fake_sleep_provider.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/nft/__init__.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/nft/test_magic_eden.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/nft/test_opensea.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/nft/test_simple_hash.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/perpetual/__init__.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/perpetual/test_perpetual.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/synthetix/__init__.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/synthetix/test_synthetix.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/test_blockchainos.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/test_blockchair_btc.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/test_blockchair_doge.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/test_blockchair_ltc.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/test_cosmos.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/test_ethplorer.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/test_multisources.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/test_optimistic_etherscan.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/test_solana.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/test_subscan_polkadot.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/test_sui.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/api/test_trezor_btc.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/test_base.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/test_blockchain_api.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/test_blockchain_mapping.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/test_data.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/test_enumerate_classes.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/test_generic.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test/v2/test_models.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/test_data.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/utils/__init__.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/utils/address.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/utils/datetime.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/utils/ethereum.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/utils/num.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/utils/user_agent.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/__init__.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/__init__.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/blockchainos.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/blockchair.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/cosmos.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/covalenth/__init__.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/covalenth/arbitrum.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/covalenth/astar.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/covalenth/avalanche.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/covalenth/axie.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/covalenth/base.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/covalenth/binance_smart_chain.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/covalenth/ethereum.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/covalenth/fantom.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/covalenth/heco.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/covalenth/iotex.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/covalenth/klaytn.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/covalenth/moonbeam.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/covalenth/palm.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/covalenth/polygon.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/covalenth/rsk.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/debank.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/debank_maps.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/ethplorer.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/nft/__init__.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/nft/magic_eden.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/nft/opensea.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/nft/simple_hash.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/optimistic_etherscan.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/perpetual/__init__.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/perpetual/perp_abi.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/perpetual/perpetual.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/solana.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/subscan.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/sui.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/synthetix/__init__.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/synthetix/synthetix.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/synthetix/synthetix_abi.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/terra.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/trezor.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/api/web3_utils.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/base.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/blockchain_mapping.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/coin_mapping.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/coins.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi/v2/models.py +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi.egg-info/SOURCES.txt +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi.egg-info/dependency_links.txt +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi.egg-info/requires.txt +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/blockapi.egg-info/top_level.txt +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/pyproject.toml +0 -0
- {blockapi-1.1.4 → blockapi-1.2.0}/setup.cfg +0 -0
|
@@ -24,36 +24,62 @@ test_collection_id = (
|
|
|
24
24
|
test_nft_type = BtcNftType.COLLECTION
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
def
|
|
27
|
+
def test_fetch_collection_icon_code(requests_mock, unisat_client, collection_stats):
|
|
28
|
+
"""
|
|
29
|
+
UniSat sometimes sends only the icon *code* ― no URL.
|
|
30
|
+
We expect `parse_collection` to prepend the static CDN prefix automatically.
|
|
31
|
+
"""
|
|
28
32
|
requests_mock.post(
|
|
29
|
-
f"{unisat_client.api_options.base_url}
|
|
33
|
+
f"{unisat_client.api_options.base_url}"
|
|
34
|
+
"v3/market/collection/auction/collection_statistic",
|
|
30
35
|
text=collection_stats,
|
|
31
36
|
)
|
|
32
37
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
38
|
+
fetch_result = unisat_client.fetch_collection("pixel-pepes")
|
|
39
|
+
assert not fetch_result.errors
|
|
40
|
+
|
|
41
|
+
parsed = unisat_client.parse_collection(fetch_result)
|
|
42
|
+
assert not parsed.errors and len(parsed.data) == 1
|
|
43
|
+
|
|
44
|
+
col: NftCollection = parsed.data[0]
|
|
45
|
+
assert col.ident == "pixel-pepes"
|
|
46
|
+
assert col.name == "Pixel Pepes"
|
|
47
|
+
assert (
|
|
48
|
+
col.image == "https://static.unisat.io/content/"
|
|
49
|
+
"47c1d21c508f6d49dfde64d958f14acd041244e1bb616f9b78114b8d9dc7b945i0"
|
|
50
|
+
)
|
|
51
|
+
assert str(col.total_stats.floor_price) == "0.0099"
|
|
52
|
+
assert str(col.total_stats.volume) == "0.399"
|
|
53
|
+
|
|
36
54
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
55
|
+
def test_fetch_collection_icon_full_url(
|
|
56
|
+
requests_mock, unisat_client, collection_stats_full_url
|
|
57
|
+
):
|
|
58
|
+
"""
|
|
59
|
+
UniSat may also deliver a *fully-qualified* icon URL.
|
|
60
|
+
In that case we should **not** touch the value.
|
|
61
|
+
"""
|
|
62
|
+
requests_mock.post(
|
|
63
|
+
f"{unisat_client.api_options.base_url}"
|
|
64
|
+
"v3/market/collection/auction/collection_statistic",
|
|
65
|
+
text=collection_stats_full_url,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
fetch_result = unisat_client.fetch_collection("rune-mania-miner")
|
|
69
|
+
assert not fetch_result.errors
|
|
40
70
|
|
|
41
|
-
|
|
42
|
-
assert
|
|
43
|
-
|
|
44
|
-
|
|
71
|
+
parsed = unisat_client.parse_collection(fetch_result)
|
|
72
|
+
assert not parsed.errors and len(parsed.data) == 1
|
|
73
|
+
|
|
74
|
+
col: NftCollection = parsed.data[0]
|
|
75
|
+
assert col.ident == "rune-mania-miner"
|
|
76
|
+
assert col.name == "Rune Mania Miner"
|
|
45
77
|
assert (
|
|
46
|
-
|
|
47
|
-
|
|
78
|
+
col.image == "https://creator-hub-prod.s3.us-east-2.amazonaws.com/"
|
|
79
|
+
"ord-rmm_pfp_1708461604099.png"
|
|
48
80
|
)
|
|
49
|
-
|
|
50
|
-
assert
|
|
51
|
-
assert collection.blockchain == Blockchain.BITCOIN
|
|
52
|
-
assert str(collection.total_stats.floor_price) == "0.0099"
|
|
53
|
-
assert str(collection.total_stats.owners_count) == "1563"
|
|
54
|
-
assert str(collection.total_stats.sales_count) == "20"
|
|
55
|
-
assert str(collection.total_stats.volume) == "0.399"
|
|
56
|
-
assert str(collection.total_stats.market_cap) == "15.4737"
|
|
81
|
+
|
|
82
|
+
assert str(col.total_stats.floor_price) == "0.0008"
|
|
57
83
|
|
|
58
84
|
|
|
59
85
|
def test_fetch_listings(requests_mock, unisat_client, listings_data):
|
|
@@ -153,21 +179,6 @@ def unisat_client(fake_sleep_provider):
|
|
|
153
179
|
return UnisatApi(api_key="test_key", sleep_provider=fake_sleep_provider)
|
|
154
180
|
|
|
155
181
|
|
|
156
|
-
@pytest.fixture
|
|
157
|
-
def inscription_data():
|
|
158
|
-
return read_file('data/unisat/inscription_data.json')
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
@pytest.fixture
|
|
162
|
-
def inscription_data_edge_cases():
|
|
163
|
-
return read_file('data/unisat/inscription_data_edge_cases.json')
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
@pytest.fixture
|
|
167
|
-
def collection_edge_cases():
|
|
168
|
-
return read_file('data/unisat/collection_edge_cases.json')
|
|
169
|
-
|
|
170
|
-
|
|
171
182
|
@pytest.fixture
|
|
172
183
|
def listings_data():
|
|
173
184
|
return read_file('data/unisat/listings.json')
|
|
@@ -180,4 +191,11 @@ def offers_data():
|
|
|
180
191
|
|
|
181
192
|
@pytest.fixture
|
|
182
193
|
def collection_stats():
|
|
183
|
-
|
|
194
|
+
"""Pixel Pepes – icon **code** only."""
|
|
195
|
+
return read_file("data/unisat/collection_stats.json")
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
@pytest.fixture
|
|
199
|
+
def collection_stats_full_url():
|
|
200
|
+
"""Rune Mania Miner – icon is a full URL."""
|
|
201
|
+
return read_file("data/unisat/collection_stats_full_url.json")
|
|
@@ -293,23 +293,24 @@ class UnisatApi(BlockchainApi, INftParser, INftProvider):
|
|
|
293
293
|
# Format the icon URL
|
|
294
294
|
icon = stats.get("icon")
|
|
295
295
|
icon_url = None
|
|
296
|
+
|
|
296
297
|
if icon:
|
|
297
|
-
|
|
298
|
+
if icon.startswith(("http://", "https://")):
|
|
299
|
+
icon_url = icon
|
|
300
|
+
else:
|
|
301
|
+
icon_url = f"https://static.unisat.io/content/{icon.lstrip('/')}"
|
|
298
302
|
|
|
299
303
|
floor_price = raw_to_decimals(stats.get("floorPrice", 0), self.coin.decimals)
|
|
300
304
|
|
|
301
305
|
volume = raw_to_decimals(stats.get("btcValue", 0), self.coin.decimals)
|
|
302
306
|
|
|
303
|
-
total_nfts = stats.get("total", 0)
|
|
304
|
-
market_cap = floor_price * total_nfts if total_nfts else 0
|
|
305
|
-
|
|
306
307
|
total_stats = NftCollectionTotalStats.from_api(
|
|
307
308
|
volume=str(volume),
|
|
308
|
-
sales_count=
|
|
309
|
-
owners_count=
|
|
310
|
-
market_cap=
|
|
309
|
+
sales_count=None,
|
|
310
|
+
owners_count=None,
|
|
311
|
+
market_cap=None,
|
|
311
312
|
floor_price=str(floor_price),
|
|
312
|
-
average_price=
|
|
313
|
+
average_price=None,
|
|
313
314
|
coin=self.coin,
|
|
314
315
|
)
|
|
315
316
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|