blockapi 2.5.2__tar.gz → 2.5.4__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-2.5.2 → blockapi-2.5.4}/PKG-INFO +1 -1
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/blockchair.py +12 -6
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/cosmos.py +3 -2
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/base.py +3 -3
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/debank.py +9 -7
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/ethplorer.py +3 -3
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/nft/magic_eden.py +16 -9
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/nft/opensea.py +3 -4
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/optimistic_etherscan.py +9 -3
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/perpetual/perpetual.py +3 -2
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/solana.py +10 -2
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/subscan.py +1 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/synthetix/synthetix.py +19 -7
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/terra.py +2 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi.egg-info/PKG-INFO +1 -1
- {blockapi-2.5.2 → blockapi-2.5.4}/setup.py +1 -1
- {blockapi-2.5.2 → blockapi-2.5.4}/LICENSE.md +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/README.md +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/__init__.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/services.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/__init__.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/test_blockapi.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/test_num.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/test_random_user_agent.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/__init__.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/__init__.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/conftest.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/covalenth/__init__.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/covalenth/test_ethereum.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/fake_sleep_provider.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/nft/__init__.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/nft/test_magic_eden.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/nft/test_opensea.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/nft/test_simple_hash.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/nft/test_unisat.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/perpetual/__init__.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/perpetual/test_perpetual.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/synthetix/__init__.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/synthetix/test_synthetix.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_blockchain_info.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_blockchainos.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_blockchair_btc.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_blockchair_doge.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_blockchair_ltc.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_cosmos.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_ethplorer.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_haskoin.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_multisources.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_optimistic_etherscan.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_solana.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_subscan_polkadot.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_sui.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_trezor_btc.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_trezor_zec.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/test_base.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/test_blockchain_api.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/test_blockchain_mapping.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/test_data.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/test_enumerate_classes.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/test_generic.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/test_models.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test_data.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/utils/__init__.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/utils/address.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/utils/datetime.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/utils/num.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/utils/user_agent.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/__init__.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/__init__.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/blockchain_info.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/blockchainos.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/__init__.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/arbitrum.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/astar.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/avalanche.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/axie.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/binance_smart_chain.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/ethereum.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/fantom.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/heco.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/iotex.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/klaytn.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/moonbeam.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/palm.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/polygon.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/rsk.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/debank_maps.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/haskoin.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/nft/__init__.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/nft/simple_hash.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/nft/unisat.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/perpetual/__init__.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/perpetual/perp_abi.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/sui.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/synthetix/__init__.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/synthetix/synthetix_abi.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/trezor.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/web3_utils.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/base.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/blockchain_mapping.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/coin_mapping.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/coins.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/models.py +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi.egg-info/SOURCES.txt +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi.egg-info/dependency_links.txt +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi.egg-info/requires.txt +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/blockapi.egg-info/top_level.txt +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/pyproject.toml +0 -0
- {blockapi-2.5.2 → blockapi-2.5.4}/setup.cfg +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from abc import ABC
|
|
2
2
|
from typing import Iterable, List
|
|
3
3
|
|
|
4
|
-
from blockapi.v2.base import BalanceMixin, BlockchainApi, ITransactions
|
|
4
|
+
from blockapi.v2.base import BalanceMixin, BlockchainApi, ISleepProvider, ITransactions
|
|
5
5
|
from blockapi.v2.coins import COIN_BTC, COIN_DOGE, COIN_LTC
|
|
6
6
|
from blockapi.v2.models import (
|
|
7
7
|
ApiOptions,
|
|
@@ -19,8 +19,8 @@ from blockapi.v2.models import (
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
class BlockchairApi(BlockchainApi, BalanceMixin, ITransactions, ABC):
|
|
22
|
-
def __init__(self, offset=0, limit=10):
|
|
23
|
-
super().__init__()
|
|
22
|
+
def __init__(self, offset=0, limit=10, sleep_provider: ISleepProvider = None):
|
|
23
|
+
super().__init__(sleep_provider=sleep_provider)
|
|
24
24
|
self._offset = offset
|
|
25
25
|
self._limit = limit
|
|
26
26
|
|
|
@@ -194,7 +194,9 @@ class BlockchairApi(BlockchainApi, BalanceMixin, ITransactions, ABC):
|
|
|
194
194
|
|
|
195
195
|
class BlockchairBitcoinApi(BlockchairApi):
|
|
196
196
|
api_options = ApiOptions(
|
|
197
|
-
blockchain=Blockchain.BITCOIN,
|
|
197
|
+
blockchain=Blockchain.BITCOIN,
|
|
198
|
+
base_url='https://api.blockchair.com/bitcoin/',
|
|
199
|
+
rate_limit=1,
|
|
198
200
|
)
|
|
199
201
|
|
|
200
202
|
coin = COIN_BTC
|
|
@@ -202,7 +204,9 @@ class BlockchairBitcoinApi(BlockchairApi):
|
|
|
202
204
|
|
|
203
205
|
class BlockchairDogecoinApi(BlockchairApi):
|
|
204
206
|
api_options = ApiOptions(
|
|
205
|
-
blockchain=Blockchain.DOGECHAIN,
|
|
207
|
+
blockchain=Blockchain.DOGECHAIN,
|
|
208
|
+
base_url='https://api.blockchair.com/dogecoin/',
|
|
209
|
+
rate_limit=1,
|
|
206
210
|
)
|
|
207
211
|
|
|
208
212
|
coin = COIN_DOGE
|
|
@@ -210,7 +214,9 @@ class BlockchairDogecoinApi(BlockchairApi):
|
|
|
210
214
|
|
|
211
215
|
class BlockchairLitecoinApi(BlockchairApi):
|
|
212
216
|
api_options = ApiOptions(
|
|
213
|
-
blockchain=Blockchain.LITECOIN,
|
|
217
|
+
blockchain=Blockchain.LITECOIN,
|
|
218
|
+
base_url='https://api.blockchair.com/litecoin/',
|
|
219
|
+
rate_limit=1,
|
|
214
220
|
)
|
|
215
221
|
|
|
216
222
|
coin = COIN_LTC
|
|
@@ -7,7 +7,7 @@ from typing import Iterable, Optional, Union
|
|
|
7
7
|
from requests import Session
|
|
8
8
|
|
|
9
9
|
from blockapi.utils.num import to_decimal
|
|
10
|
-
from blockapi.v2.base import ApiOptions, BlockchainApi, IBalance
|
|
10
|
+
from blockapi.v2.base import ApiOptions, BlockchainApi, IBalance, ISleepProvider
|
|
11
11
|
from blockapi.v2.coins import COIN_ATOM, COIN_CELESTIA, COIN_DYDX, COIN_OSMOSIS
|
|
12
12
|
from blockapi.v2.models import AssetType, BalanceItem, Blockchain, Coin, CoinInfo
|
|
13
13
|
|
|
@@ -102,8 +102,9 @@ class CosmosApiBase(BlockchainApi, IBalance, metaclass=ABCMeta):
|
|
|
102
102
|
self,
|
|
103
103
|
tokens_map: defaultdict[str, dict] = None,
|
|
104
104
|
enable_token_mapping=True,
|
|
105
|
+
sleep_provider: ISleepProvider = None,
|
|
105
106
|
):
|
|
106
|
-
super().__init__()
|
|
107
|
+
super().__init__(sleep_provider=sleep_provider)
|
|
107
108
|
self._tokens_map = tokens_map
|
|
108
109
|
self.enable_token_mapping = enable_token_mapping
|
|
109
110
|
|
|
@@ -4,7 +4,7 @@ from typing import Dict
|
|
|
4
4
|
|
|
5
5
|
from eth_utils import to_checksum_address
|
|
6
6
|
|
|
7
|
-
from blockapi.v2.base import BlockchainApi, IBalance
|
|
7
|
+
from blockapi.v2.base import BlockchainApi, IBalance, ISleepProvider
|
|
8
8
|
from blockapi.v2.models import BalanceItem, Coin, CoinInfo
|
|
9
9
|
|
|
10
10
|
logger = logging.getLogger(__name__)
|
|
@@ -37,8 +37,8 @@ class CovalentApiBase(BlockchainApi, IBalance, metaclass=ABCMeta):
|
|
|
37
37
|
'get_balance': '/v1/{chain_id}/address/{address}/balances_v2/'
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
def __init__(self, api_key: str):
|
|
41
|
-
super().__init__(api_key)
|
|
40
|
+
def __init__(self, api_key: str, sleep_provider: ISleepProvider = None):
|
|
41
|
+
super().__init__(api_key, sleep_provider=sleep_provider)
|
|
42
42
|
|
|
43
43
|
# Set http basic auth for requests.
|
|
44
44
|
self._session.auth = (api_key, "")
|
|
@@ -22,8 +22,10 @@ from blockapi.v2.base import (
|
|
|
22
22
|
BalanceMixin,
|
|
23
23
|
CustomizableBlockchainApi,
|
|
24
24
|
IPortfolio,
|
|
25
|
+
ISleepProvider,
|
|
25
26
|
)
|
|
26
27
|
from blockapi.v2.blockchain_mapping import get_blockchain_from_debank_chain
|
|
28
|
+
from blockapi.v2.coin_mapping import symbol_to_coin_map
|
|
27
29
|
from blockapi.v2.models import (
|
|
28
30
|
AssetType,
|
|
29
31
|
BalanceItem,
|
|
@@ -31,18 +33,17 @@ from blockapi.v2.models import (
|
|
|
31
33
|
Coin,
|
|
32
34
|
CoingeckoId,
|
|
33
35
|
CoinInfo,
|
|
36
|
+
DebankApp,
|
|
37
|
+
DebankModelApp,
|
|
38
|
+
DebankModelAppPortfolioItem,
|
|
39
|
+
DebankModelPredictionDetail,
|
|
40
|
+
DebankPrediction,
|
|
34
41
|
FetchResult,
|
|
35
42
|
ParseResult,
|
|
36
43
|
Pool,
|
|
37
44
|
PoolInfo,
|
|
38
45
|
Protocol,
|
|
39
|
-
DebankApp,
|
|
40
|
-
DebankPrediction,
|
|
41
|
-
DebankModelAppPortfolioItem,
|
|
42
|
-
DebankModelApp,
|
|
43
|
-
DebankModelPredictionDetail,
|
|
44
46
|
)
|
|
45
|
-
from blockapi.v2.coin_mapping import symbol_to_coin_map
|
|
46
47
|
|
|
47
48
|
logger = logging.getLogger(__name__)
|
|
48
49
|
|
|
@@ -733,8 +734,9 @@ class DebankApi(CustomizableBlockchainApi, BalanceMixin, IPortfolio):
|
|
|
733
734
|
is_all: bool,
|
|
734
735
|
protocol_cache: Optional[DebankProtocolCache] = None,
|
|
735
736
|
base_url: Optional[str] = None,
|
|
737
|
+
sleep_provider: ISleepProvider = None,
|
|
736
738
|
):
|
|
737
|
-
super().__init__(base_url=base_url)
|
|
739
|
+
super().__init__(base_url=base_url, sleep_provider=sleep_provider)
|
|
738
740
|
|
|
739
741
|
self._is_all = bool(is_all)
|
|
740
742
|
self._headers = {'AccessKey': api_key}
|
|
@@ -2,7 +2,7 @@ from typing import Dict, Iterable, Optional
|
|
|
2
2
|
|
|
3
3
|
from eth_utils import to_checksum_address
|
|
4
4
|
|
|
5
|
-
from blockapi.v2.base import ApiOptions, BalanceMixin, BlockchainApi
|
|
5
|
+
from blockapi.v2.base import ApiOptions, BalanceMixin, BlockchainApi, ISleepProvider
|
|
6
6
|
from blockapi.v2.coins import COIN_ETH
|
|
7
7
|
from blockapi.v2.models import (
|
|
8
8
|
BalanceItem,
|
|
@@ -30,8 +30,8 @@ class EthplorerApi(BlockchainApi, BalanceMixin):
|
|
|
30
30
|
|
|
31
31
|
supported_requests = {'get_info': '/getAddressInfo/{address}?apiKey={api_key}'}
|
|
32
32
|
|
|
33
|
-
def __init__(self, api_key: str = 'freekey'):
|
|
34
|
-
super().__init__(api_key)
|
|
33
|
+
def __init__(self, api_key: str = 'freekey', sleep_provider: ISleepProvider = None):
|
|
34
|
+
super().__init__(api_key, sleep_provider=sleep_provider)
|
|
35
35
|
|
|
36
36
|
def fetch_balances(self, address: str) -> FetchResult:
|
|
37
37
|
return self.get_data(
|
|
@@ -2,7 +2,13 @@ import logging
|
|
|
2
2
|
from decimal import Decimal
|
|
3
3
|
from typing import Iterable, Optional, Tuple
|
|
4
4
|
|
|
5
|
-
from blockapi.v2.base import
|
|
5
|
+
from blockapi.v2.base import (
|
|
6
|
+
BlockchainApi,
|
|
7
|
+
INftParser,
|
|
8
|
+
INftProvider,
|
|
9
|
+
ISleepProvider,
|
|
10
|
+
SleepProvider,
|
|
11
|
+
)
|
|
6
12
|
from blockapi.v2.coins import COIN_SOL
|
|
7
13
|
from blockapi.v2.models import (
|
|
8
14
|
ApiOptions,
|
|
@@ -46,9 +52,10 @@ class MagicEdenApi(BlockchainApi, INftProvider, INftParser):
|
|
|
46
52
|
|
|
47
53
|
coin_map = NotImplemented
|
|
48
54
|
|
|
49
|
-
def __init__(
|
|
50
|
-
|
|
51
|
-
|
|
55
|
+
def __init__(
|
|
56
|
+
self, sleep_provider: ISleepProvider = None, max_listings=500, max_offers=500
|
|
57
|
+
):
|
|
58
|
+
super().__init__(sleep_provider=sleep_provider or SleepProvider())
|
|
52
59
|
|
|
53
60
|
self.max_offers = max_offers
|
|
54
61
|
if max_listings > 15000:
|
|
@@ -67,7 +74,7 @@ class MagicEdenApi(BlockchainApi, INftProvider, INftParser):
|
|
|
67
74
|
items = []
|
|
68
75
|
|
|
69
76
|
while True:
|
|
70
|
-
self.
|
|
77
|
+
self.sleep_provider.sleep(self.base_url, self.api_options.rate_limit)
|
|
71
78
|
data = self.get_data(
|
|
72
79
|
'get_nfts',
|
|
73
80
|
address=address,
|
|
@@ -131,7 +138,7 @@ class MagicEdenApi(BlockchainApi, INftProvider, INftParser):
|
|
|
131
138
|
|
|
132
139
|
def fetch_collection(self, collection: str) -> FetchResult:
|
|
133
140
|
while True:
|
|
134
|
-
self.
|
|
141
|
+
self.sleep_provider.sleep(self.base_url, self.api_options.rate_limit)
|
|
135
142
|
|
|
136
143
|
data = self.get_data(
|
|
137
144
|
'get_collection',
|
|
@@ -186,7 +193,7 @@ class MagicEdenApi(BlockchainApi, INftProvider, INftParser):
|
|
|
186
193
|
items = []
|
|
187
194
|
|
|
188
195
|
while True:
|
|
189
|
-
self.
|
|
196
|
+
self.sleep_provider.sleep(self.base_url, self.api_options.rate_limit)
|
|
190
197
|
logger.info(f'get_pools: {collection} offset={offset} limit={limit}')
|
|
191
198
|
data = self.get_data(
|
|
192
199
|
'get_pools', slug=collection, offset=offset, limit=limit
|
|
@@ -283,7 +290,7 @@ class MagicEdenApi(BlockchainApi, INftProvider, INftParser):
|
|
|
283
290
|
items = []
|
|
284
291
|
|
|
285
292
|
while True:
|
|
286
|
-
self.
|
|
293
|
+
self.sleep_provider.sleep(self.base_url, self.api_options.rate_limit)
|
|
287
294
|
data = self.get_data(
|
|
288
295
|
'get_listings',
|
|
289
296
|
slug=collection,
|
|
@@ -396,7 +403,7 @@ class MagicEdenApi(BlockchainApi, INftProvider, INftParser):
|
|
|
396
403
|
)
|
|
397
404
|
if retry:
|
|
398
405
|
logger.warning('Service unavailable - will retry after long sleep')
|
|
399
|
-
self.
|
|
406
|
+
self.sleep_provider.sleep(self.base_url, seconds=60)
|
|
400
407
|
return True
|
|
401
408
|
|
|
402
409
|
return False
|
|
@@ -100,7 +100,7 @@ class OpenSeaApi(BlockchainApi, INftProvider, INftParser):
|
|
|
100
100
|
max_listings=500,
|
|
101
101
|
max_offers=500,
|
|
102
102
|
):
|
|
103
|
-
super().__init__(api_key)
|
|
103
|
+
super().__init__(api_key, sleep_provider=sleep_provider or SleepProvider())
|
|
104
104
|
|
|
105
105
|
self._blockchain = blockchain
|
|
106
106
|
self._opensea_chain = self.supported_blockchains_map.get(blockchain)
|
|
@@ -108,7 +108,6 @@ class OpenSeaApi(BlockchainApi, INftProvider, INftParser):
|
|
|
108
108
|
raise ApiException(f"Blockchain '{blockchain.value}' is not supported")
|
|
109
109
|
|
|
110
110
|
self._headers = {'accept': 'application/json', 'x-api-key': api_key}
|
|
111
|
-
self._sleep_provider = sleep_provider or SleepProvider()
|
|
112
111
|
self._limit = limit
|
|
113
112
|
|
|
114
113
|
self.max_listings = max_listings
|
|
@@ -264,7 +263,7 @@ class OpenSeaApi(BlockchainApi, INftProvider, INftParser):
|
|
|
264
263
|
item_count = 0
|
|
265
264
|
|
|
266
265
|
while True:
|
|
267
|
-
self.
|
|
266
|
+
self.sleep_provider.sleep(self.base_url, self.api_options.rate_limit)
|
|
268
267
|
page_count += 1
|
|
269
268
|
logger.debug(f'Fetching page {page_count} of {key} from {cursor}')
|
|
270
269
|
fetched, next_cursor = fetch_method(key, cursor)
|
|
@@ -659,7 +658,7 @@ class OpenSeaApi(BlockchainApi, INftProvider, INftParser):
|
|
|
659
658
|
|
|
660
659
|
logger.warning(f'Service unavailable - will retry after {seconds}s sleep')
|
|
661
660
|
|
|
662
|
-
self.
|
|
661
|
+
self.sleep_provider.sleep(self.base_url, seconds=seconds)
|
|
663
662
|
return True
|
|
664
663
|
|
|
665
664
|
return False
|
|
@@ -3,7 +3,13 @@ from typing import Dict, List
|
|
|
3
3
|
from requests import Response
|
|
4
4
|
|
|
5
5
|
from blockapi.utils.user_agent import get_random_user_agent
|
|
6
|
-
from blockapi.v2.base import
|
|
6
|
+
from blockapi.v2.base import (
|
|
7
|
+
ApiException,
|
|
8
|
+
ApiOptions,
|
|
9
|
+
BalanceMixin,
|
|
10
|
+
BlockchainApi,
|
|
11
|
+
ISleepProvider,
|
|
12
|
+
)
|
|
7
13
|
from blockapi.v2.coins import COIN_ETH
|
|
8
14
|
from blockapi.v2.models import BalanceItem, Blockchain, FetchResult, ParseResult
|
|
9
15
|
|
|
@@ -25,8 +31,8 @@ class OptimismEtherscanApi(BlockchainApi, BalanceMixin):
|
|
|
25
31
|
'get_balance': '?module=account&action=balance&address={address}&tag=latest&apikey={api_key}'
|
|
26
32
|
}
|
|
27
33
|
|
|
28
|
-
def __init__(self, api_key: str = ''):
|
|
29
|
-
super().__init__(api_key)
|
|
34
|
+
def __init__(self, api_key: str = '', sleep_provider: ISleepProvider = None):
|
|
35
|
+
super().__init__(api_key, sleep_provider=sleep_provider)
|
|
30
36
|
|
|
31
37
|
def _parse_eth_balance(self, response: Dict) -> BalanceItem:
|
|
32
38
|
return BalanceItem.from_api(
|
|
@@ -18,6 +18,7 @@ from blockapi.v2.base import (
|
|
|
18
18
|
BalanceMixin,
|
|
19
19
|
CustomizableBlockchainApi,
|
|
20
20
|
IBalance,
|
|
21
|
+
ISleepProvider,
|
|
21
22
|
)
|
|
22
23
|
from blockapi.v2.coins import COIN_PERP
|
|
23
24
|
from blockapi.v2.models import (
|
|
@@ -217,8 +218,8 @@ class PerpetualApi(CustomizableBlockchainApi, BalanceMixin):
|
|
|
217
218
|
blockchain=Blockchain.ETHEREUM, base_url=None, rate_limit=0.2
|
|
218
219
|
)
|
|
219
220
|
|
|
220
|
-
def __init__(self, base_url: str) -> None:
|
|
221
|
-
super().__init__(base_url=base_url)
|
|
221
|
+
def __init__(self, base_url: str, sleep_provider: ISleepProvider = None) -> None:
|
|
222
|
+
super().__init__(base_url=base_url, sleep_provider=sleep_provider)
|
|
222
223
|
|
|
223
224
|
def fetch_balances(self, address: str) -> FetchResult:
|
|
224
225
|
try:
|
|
@@ -14,6 +14,7 @@ from blockapi.v2.base import (
|
|
|
14
14
|
BlockchainApi,
|
|
15
15
|
CustomizableBlockchainApi,
|
|
16
16
|
InvalidAddressException,
|
|
17
|
+
ISleepProvider,
|
|
17
18
|
)
|
|
18
19
|
from blockapi.v2.coins import COIN_SOL
|
|
19
20
|
from blockapi.v2.models import (
|
|
@@ -65,6 +66,7 @@ class SolanaApi(CustomizableBlockchainApi, BalanceMixin):
|
|
|
65
66
|
api_options = ApiOptions(
|
|
66
67
|
blockchain=Blockchain.SOLANA,
|
|
67
68
|
base_url='https://api.mainnet-beta.solana.com/',
|
|
69
|
+
rate_limit=1,
|
|
68
70
|
start_offset=0,
|
|
69
71
|
max_items_per_page=1000,
|
|
70
72
|
page_offset_step=1,
|
|
@@ -85,8 +87,13 @@ class SolanaApi(CustomizableBlockchainApi, BalanceMixin):
|
|
|
85
87
|
|
|
86
88
|
# ── Initialization ─────────────────────────────────────────
|
|
87
89
|
|
|
88
|
-
def __init__(
|
|
89
|
-
|
|
90
|
+
def __init__(
|
|
91
|
+
self,
|
|
92
|
+
base_url: Optional[str] = None,
|
|
93
|
+
include_nfts: bool = False,
|
|
94
|
+
sleep_provider: ISleepProvider = None,
|
|
95
|
+
):
|
|
96
|
+
super().__init__(base_url, sleep_provider=sleep_provider)
|
|
90
97
|
self.include_nfts = include_nfts
|
|
91
98
|
self._request_id = 0
|
|
92
99
|
|
|
@@ -419,6 +426,7 @@ class SolscanApi(BlockchainApi):
|
|
|
419
426
|
api_options = ApiOptions(
|
|
420
427
|
blockchain=Blockchain.SOLANA,
|
|
421
428
|
base_url='https://api.solscan.io/',
|
|
429
|
+
rate_limit=1,
|
|
422
430
|
start_offset=0,
|
|
423
431
|
max_items_per_page=1000,
|
|
424
432
|
page_offset_step=1,
|
|
@@ -27,7 +27,7 @@ from blockapi.v2.api.web3_utils import (
|
|
|
27
27
|
ensure_checksum_address,
|
|
28
28
|
get_eth_client,
|
|
29
29
|
)
|
|
30
|
-
from blockapi.v2.base import CustomizableBlockchainApi, IBalance
|
|
30
|
+
from blockapi.v2.base import CustomizableBlockchainApi, IBalance, ISleepProvider
|
|
31
31
|
from blockapi.v2.coins import COIN_SNX
|
|
32
32
|
from blockapi.v2.models import ApiOptions, AssetType, BalanceItem, Blockchain, Coin
|
|
33
33
|
|
|
@@ -128,8 +128,10 @@ class SynthetixApi(CustomizableBlockchainApi, IBalance, ABC):
|
|
|
128
128
|
decimals: Decimal = Decimal('18')
|
|
129
129
|
coin = COIN_SNX
|
|
130
130
|
|
|
131
|
-
def __init__(
|
|
132
|
-
|
|
131
|
+
def __init__(
|
|
132
|
+
self, network: str, api_url: str, sleep_provider: ISleepProvider = None
|
|
133
|
+
):
|
|
134
|
+
super().__init__(base_url=api_url, sleep_provider=sleep_provider)
|
|
133
135
|
self.network = network
|
|
134
136
|
self.w3 = get_eth_client(api_url)
|
|
135
137
|
|
|
@@ -400,20 +402,30 @@ class SynthetixApi(CustomizableBlockchainApi, IBalance, ABC):
|
|
|
400
402
|
|
|
401
403
|
|
|
402
404
|
class SynthetixMainnetApi(SynthetixApi):
|
|
403
|
-
api_options = ApiOptions(
|
|
405
|
+
api_options = ApiOptions(
|
|
406
|
+
blockchain=Blockchain.ETHEREUM, base_url=None, rate_limit=1
|
|
407
|
+
)
|
|
404
408
|
|
|
405
409
|
def __init__(
|
|
406
410
|
self,
|
|
407
411
|
api_url: str,
|
|
412
|
+
sleep_provider: ISleepProvider = None,
|
|
408
413
|
):
|
|
409
|
-
super().__init__(
|
|
414
|
+
super().__init__(
|
|
415
|
+
network="mainnet", api_url=api_url, sleep_provider=sleep_provider
|
|
416
|
+
)
|
|
410
417
|
|
|
411
418
|
|
|
412
419
|
class SynthetixOptimismApi(SynthetixApi):
|
|
413
|
-
api_options = ApiOptions(
|
|
420
|
+
api_options = ApiOptions(
|
|
421
|
+
blockchain=Blockchain.OPTIMISM, base_url=None, rate_limit=1
|
|
422
|
+
)
|
|
414
423
|
|
|
415
424
|
def __init__(
|
|
416
425
|
self,
|
|
417
426
|
api_url: str,
|
|
427
|
+
sleep_provider: ISleepProvider = None,
|
|
418
428
|
):
|
|
419
|
-
super().__init__(
|
|
429
|
+
super().__init__(
|
|
430
|
+
network='optimism', api_url=api_url, sleep_provider=sleep_provider
|
|
431
|
+
)
|
|
@@ -76,6 +76,7 @@ class TerraFcdApi(BlockchainApi):
|
|
|
76
76
|
api_options = ApiOptions(
|
|
77
77
|
blockchain=Blockchain.TERRA,
|
|
78
78
|
base_url='https://fcd.terra.dev/',
|
|
79
|
+
rate_limit=1,
|
|
79
80
|
)
|
|
80
81
|
|
|
81
82
|
supported_requests = {
|
|
@@ -202,6 +203,7 @@ class TerraMantleApi(BlockchainApi):
|
|
|
202
203
|
api_options = ApiOptions(
|
|
203
204
|
blockchain=Blockchain.TERRA,
|
|
204
205
|
base_url='https://mantle.terra.dev',
|
|
206
|
+
rate_limit=1,
|
|
205
207
|
)
|
|
206
208
|
|
|
207
209
|
# API uses post requests
|
|
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
|