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.
Files changed (109) hide show
  1. {blockapi-2.5.2 → blockapi-2.5.4}/PKG-INFO +1 -1
  2. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/blockchair.py +12 -6
  3. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/cosmos.py +3 -2
  4. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/base.py +3 -3
  5. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/debank.py +9 -7
  6. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/ethplorer.py +3 -3
  7. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/nft/magic_eden.py +16 -9
  8. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/nft/opensea.py +3 -4
  9. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/optimistic_etherscan.py +9 -3
  10. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/perpetual/perpetual.py +3 -2
  11. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/solana.py +10 -2
  12. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/subscan.py +1 -0
  13. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/synthetix/synthetix.py +19 -7
  14. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/terra.py +2 -0
  15. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi.egg-info/PKG-INFO +1 -1
  16. {blockapi-2.5.2 → blockapi-2.5.4}/setup.py +1 -1
  17. {blockapi-2.5.2 → blockapi-2.5.4}/LICENSE.md +0 -0
  18. {blockapi-2.5.2 → blockapi-2.5.4}/README.md +0 -0
  19. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/__init__.py +0 -0
  20. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/services.py +0 -0
  21. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/__init__.py +0 -0
  22. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/test_blockapi.py +0 -0
  23. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/test_num.py +0 -0
  24. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/test_random_user_agent.py +0 -0
  25. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/__init__.py +0 -0
  26. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/__init__.py +0 -0
  27. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/conftest.py +0 -0
  28. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/covalenth/__init__.py +0 -0
  29. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/covalenth/test_ethereum.py +0 -0
  30. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/fake_sleep_provider.py +0 -0
  31. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/nft/__init__.py +0 -0
  32. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/nft/test_magic_eden.py +0 -0
  33. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/nft/test_opensea.py +0 -0
  34. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/nft/test_simple_hash.py +0 -0
  35. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/nft/test_unisat.py +0 -0
  36. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/perpetual/__init__.py +0 -0
  37. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/perpetual/test_perpetual.py +0 -0
  38. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/synthetix/__init__.py +0 -0
  39. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/synthetix/test_synthetix.py +0 -0
  40. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_blockchain_info.py +0 -0
  41. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_blockchainos.py +0 -0
  42. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_blockchair_btc.py +0 -0
  43. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_blockchair_doge.py +0 -0
  44. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_blockchair_ltc.py +0 -0
  45. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_cosmos.py +0 -0
  46. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_ethplorer.py +0 -0
  47. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_haskoin.py +0 -0
  48. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_multisources.py +0 -0
  49. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_optimistic_etherscan.py +0 -0
  50. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_solana.py +0 -0
  51. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_subscan_polkadot.py +0 -0
  52. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_sui.py +0 -0
  53. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_trezor_btc.py +0 -0
  54. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/api/test_trezor_zec.py +0 -0
  55. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/test_base.py +0 -0
  56. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/test_blockchain_api.py +0 -0
  57. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/test_blockchain_mapping.py +0 -0
  58. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/test_data.py +0 -0
  59. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/test_enumerate_classes.py +0 -0
  60. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/test_generic.py +0 -0
  61. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test/v2/test_models.py +0 -0
  62. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/test_data.py +0 -0
  63. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/utils/__init__.py +0 -0
  64. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/utils/address.py +0 -0
  65. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/utils/datetime.py +0 -0
  66. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/utils/num.py +0 -0
  67. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/utils/user_agent.py +0 -0
  68. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/__init__.py +0 -0
  69. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/__init__.py +0 -0
  70. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/blockchain_info.py +0 -0
  71. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/blockchainos.py +0 -0
  72. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/__init__.py +0 -0
  73. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/arbitrum.py +0 -0
  74. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/astar.py +0 -0
  75. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/avalanche.py +0 -0
  76. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/axie.py +0 -0
  77. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/binance_smart_chain.py +0 -0
  78. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/ethereum.py +0 -0
  79. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/fantom.py +0 -0
  80. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/heco.py +0 -0
  81. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/iotex.py +0 -0
  82. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/klaytn.py +0 -0
  83. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/moonbeam.py +0 -0
  84. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/palm.py +0 -0
  85. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/polygon.py +0 -0
  86. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/covalenth/rsk.py +0 -0
  87. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/debank_maps.py +0 -0
  88. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/haskoin.py +0 -0
  89. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/nft/__init__.py +0 -0
  90. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/nft/simple_hash.py +0 -0
  91. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/nft/unisat.py +0 -0
  92. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/perpetual/__init__.py +0 -0
  93. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/perpetual/perp_abi.py +0 -0
  94. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/sui.py +0 -0
  95. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/synthetix/__init__.py +0 -0
  96. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/synthetix/synthetix_abi.py +0 -0
  97. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/trezor.py +0 -0
  98. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/api/web3_utils.py +0 -0
  99. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/base.py +0 -0
  100. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/blockchain_mapping.py +0 -0
  101. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/coin_mapping.py +0 -0
  102. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/coins.py +0 -0
  103. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi/v2/models.py +0 -0
  104. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi.egg-info/SOURCES.txt +0 -0
  105. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi.egg-info/dependency_links.txt +0 -0
  106. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi.egg-info/requires.txt +0 -0
  107. {blockapi-2.5.2 → blockapi-2.5.4}/blockapi.egg-info/top_level.txt +0 -0
  108. {blockapi-2.5.2 → blockapi-2.5.4}/pyproject.toml +0 -0
  109. {blockapi-2.5.2 → blockapi-2.5.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: blockapi
3
- Version: 2.5.2
3
+ Version: 2.5.4
4
4
  Summary: BlockAPI library
5
5
  Home-page: https://github.com/crypkit/blockapi
6
6
  Author: Devmons s.r.o.
@@ -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, base_url='https://api.blockchair.com/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, base_url='https://api.blockchair.com/dogecoin/'
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, base_url='https://api.blockchair.com/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 BlockchainApi, INftParser, INftProvider
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__(self, sleep_provider, max_listings=500, max_offers=500):
50
- super().__init__()
51
- self._sleep_provider = sleep_provider
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._sleep_provider.sleep(self.base_url, self.api_options.rate_limit)
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._sleep_provider.sleep(self.base_url, self.api_options.rate_limit)
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._sleep_provider.sleep(self.base_url, self.api_options.rate_limit)
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._sleep_provider.sleep(self.base_url, self.api_options.rate_limit)
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._sleep_provider.sleep(self.base_url, seconds=60)
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._sleep_provider.sleep(self.base_url, self.api_options.rate_limit)
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._sleep_provider.sleep(self.base_url, seconds=seconds)
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 ApiException, ApiOptions, BalanceMixin, BlockchainApi
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__(self, base_url: Optional[str] = None, include_nfts: bool = False):
89
- super().__init__(base_url)
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,
@@ -143,6 +143,7 @@ class SubscanApi(BlockchainApi, BalanceMixin, ABC):
143
143
  return ApiOptions(
144
144
  blockchain=blockchain,
145
145
  base_url=base_url,
146
+ rate_limit=1,
146
147
  start_offset=0,
147
148
  max_items_per_page=100,
148
149
  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__(self, network: str, api_url: str):
132
- super().__init__(base_url=api_url)
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(blockchain=Blockchain.ETHEREUM, base_url=None)
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__(network="mainnet", api_url=api_url)
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(blockchain=Blockchain.OPTIMISM, base_url=None)
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__(network='optimism', api_url=api_url)
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: blockapi
3
- Version: 2.5.2
3
+ Version: 2.5.4
4
4
  Summary: BlockAPI library
5
5
  Home-page: https://github.com/crypkit/blockapi
6
6
  Author: Devmons s.r.o.
@@ -6,7 +6,7 @@ with open("README.md", "r") as f:
6
6
 
7
7
  PACKAGES = find_packages(where='.')
8
8
 
9
- __version__ = "2.5.2"
9
+ __version__ = "2.5.4"
10
10
 
11
11
  setuptools.setup(
12
12
  name='blockapi',
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