Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions blockapi/test/v2/api/data/bitaps_ltc_balance_response.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"data": {
"balance": 75763,
"receivedAmount": 1137420376400653,
"receivedTxCount": 629,
"sentAmount": 1137420376324890,
"sentTxCount": 20,
"firstReceivedTxPointer": "1512464:19",
"firstSentTxPointer": "1512466:8",
"lastTxPointer": "3038651:188",
"largestSpentTxAmount": 150393732845214,
"largestSpentTxPointer": "2784397:708",
"largestReceivedTxAmount": 65763,
"largestReceivedTxPointer": "3038651:188",
"receivedOutsCount": 629,
"spentOutsCount": 627,
"pendingReceivedAmount": 0,
"pendingSentAmount": 0,
"pendingReceivedTxCount": 0,
"pendingSentTxCount": 0,
"pendingReceivedOutsCount": 0,
"pendingSpentOutsCount": 0,
"type": "P2SH"
},
"time": 0.0047
}
17 changes: 17 additions & 0 deletions blockapi/test/v2/api/data/litecoinspace_balance_response.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"address": "M8T1B2Z97gVdvmfkQcAtYbEepune1tzGua",
"chain_stats": {
"funded_txo_count": 629,
"funded_txo_sum": 1137420376400653,
"spent_txo_count": 627,
"spent_txo_sum": 1137420376324890,
"tx_count": 649
},
"mempool_stats": {
"funded_txo_count": 0,
"funded_txo_sum": 0,
"spent_txo_count": 0,
"spent_txo_sum": 0,
"tx_count": 0
}
}
39 changes: 39 additions & 0 deletions blockapi/test/v2/api/test_bitaps_ltc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
from decimal import Decimal

import pytest

from blockapi.test.v2.api.conftest import read_file
from blockapi.test.v2.test_data import ltc_test_address
from blockapi.v2.api.bitaps import BitapsLitecoinApi
from blockapi.v2.models import FetchResult


def test_fetch_balances(requests_mock, bitaps_ltc_balance_response):
requests_mock.get(
f'https://api.bitaps.com/ltc/v1/blockchain/address/state/{ltc_test_address}',
text=bitaps_ltc_balance_response,
)

api = BitapsLitecoinApi()
balances = api.get_balance(ltc_test_address)
assert len(balances) == 1
assert balances[0].balance == Decimal('0.00075763')


def test_parse_zero_balance():
api = BitapsLitecoinApi()
fetch_result = FetchResult(data={'data': {'balance': 0}})
result = api.parse_balances(fetch_result)
assert result.data is None


def test_parse_empty_response():
api = BitapsLitecoinApi()
fetch_result = FetchResult(data=None)
result = api.parse_balances(fetch_result)
assert result.data is None


@pytest.fixture
def bitaps_ltc_balance_response():
return read_file('data/bitaps_ltc_balance_response.json')
46 changes: 46 additions & 0 deletions blockapi/test/v2/api/test_litecoinspace.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
from decimal import Decimal

import pytest

from blockapi.test.v2.api.conftest import read_file
from blockapi.test.v2.test_data import ltc_test_address
from blockapi.v2.api.litecoinspace import LitecoinSpaceApi
from blockapi.v2.models import FetchResult


def test_fetch_balances(requests_mock, litecoinspace_balance_response):
requests_mock.get(
f'https://litecoinspace.org/api/address/{ltc_test_address}',
text=litecoinspace_balance_response,
)

api = LitecoinSpaceApi()
balances = api.get_balance(ltc_test_address)
assert len(balances) == 1
assert balances[0].balance == Decimal('0.00075763')


def test_parse_zero_balance():
api = LitecoinSpaceApi()
fetch_result = FetchResult(
data={
'chain_stats': {
'funded_txo_sum': 100,
'spent_txo_sum': 100,
}
}
)
result = api.parse_balances(fetch_result)
assert result.data is None


def test_parse_empty_response():
api = LitecoinSpaceApi()
fetch_result = FetchResult(data=None)
result = api.parse_balances(fetch_result)
assert result.data is None


@pytest.fixture
def litecoinspace_balance_response():
return read_file('data/litecoinspace_balance_response.json')
2 changes: 2 additions & 0 deletions blockapi/v2/api/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from blockapi.v2.api.bitaps import BitapsLitecoinApi
from blockapi.v2.api.blockchain_info import BlockchainInfoApi
from blockapi.v2.api.blockchainos import BlockchainosApi
from blockapi.v2.api.blockchair import (
Expand All @@ -9,6 +10,7 @@
from blockapi.v2.api.debank import DebankApi, DebankApp, DebankPrediction
from blockapi.v2.api.ethplorer import EthplorerApi
from blockapi.v2.api.haskoin import HaskoinApi
from blockapi.v2.api.litecoinspace import LitecoinSpaceApi
from blockapi.v2.api.optimistic_etherscan import OptimismEtherscanApi
from blockapi.v2.api.perpetual import PerpetualApi, perp_contract_address
from blockapi.v2.api.solana import SolanaApi, SolscanApi
Expand Down
53 changes: 53 additions & 0 deletions blockapi/v2/api/bitaps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
from blockapi.v2.base import BalanceMixin, BlockchainApi
from blockapi.v2.coins import COIN_LTC
from blockapi.v2.models import (
ApiOptions,
AssetType,
BalanceItem,
Blockchain,
FetchResult,
ParseResult,
)


class BitapsLitecoinApi(BlockchainApi, BalanceMixin):
"""
Coin: Litecoin
API docs: https://developer.bitaps.com/
Explorer: https://ltc.bitaps.com
"""

coin = COIN_LTC
api_options = ApiOptions(
blockchain=Blockchain.LITECOIN,
base_url='https://api.bitaps.com/ltc/v1/',
rate_limit=0.1,
)

supported_requests = {
'get_balance': 'blockchain/address/state/{address}',
}

def fetch_balances(self, address: str) -> FetchResult:
return self.get_data('get_balance', address=address)

def parse_balances(self, fetch_result: FetchResult) -> ParseResult:
if not fetch_result.data:
return ParseResult()

data = fetch_result.data.get('data', {})
balance_raw = data.get('balance')

if not balance_raw:
return ParseResult()

return ParseResult(
data=[
BalanceItem.from_api(
balance_raw=balance_raw,
coin=self.coin,
asset_type=AssetType.AVAILABLE,
raw=fetch_result.data,
)
]
)
55 changes: 55 additions & 0 deletions blockapi/v2/api/litecoinspace.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
from blockapi.v2.base import BalanceMixin, BlockchainApi
from blockapi.v2.coins import COIN_LTC
from blockapi.v2.models import (
ApiOptions,
AssetType,
BalanceItem,
Blockchain,
FetchResult,
ParseResult,
)


class LitecoinSpaceApi(BlockchainApi, BalanceMixin):
"""
Coin: Litecoin
API docs: https://litecoinspace.org/docs/api/rest
Explorer: https://litecoinspace.org
"""

coin = COIN_LTC
api_options = ApiOptions(
blockchain=Blockchain.LITECOIN,
base_url='https://litecoinspace.org',
rate_limit=0.2,
)

supported_requests = {
'get_balance': '/api/address/{address}',
}

def fetch_balances(self, address: str) -> FetchResult:
return self.get_data('get_balance', address=address)

def parse_balances(self, fetch_result: FetchResult) -> ParseResult:
if not fetch_result.data:
return ParseResult()

chain_stats = fetch_result.data.get('chain_stats', {})
funded = chain_stats.get('funded_txo_sum', 0)
spent = chain_stats.get('spent_txo_sum', 0)
balance_raw = funded - spent

if not balance_raw:
return ParseResult()

return ParseResult(
data=[
BalanceItem.from_api(
balance_raw=balance_raw,
coin=self.coin,
asset_type=AssetType.AVAILABLE,
raw=fetch_result.data,
)
]
)
Loading