Skip to content

Commit d667526

Browse files
committed
feat: add Zcash support to Trezor API
1 parent 8ab43bc commit d667526

7 files changed

Lines changed: 84 additions & 8 deletions

File tree

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"page": 1,
3+
"totalPages": 1,
4+
"itemsOnPage": 1000,
5+
"address": "t1KstBMLVrYoHN5jrq5hKNGgERC1NodvfnS",
6+
"balance": "1234500000",
7+
"totalReceived": "5000000000",
8+
"totalSent": "3765500000",
9+
"unconfirmedBalance": "0",
10+
"unconfirmedTxs": 0,
11+
"txs": 5,
12+
"txids": [
13+
"a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2"
14+
]
15+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from decimal import Decimal
2+
3+
import pytest
4+
5+
from blockapi.test.v2.api.conftest import read_file
6+
from blockapi.test.v2.test_data import zec_test_address
7+
from blockapi.v2.api import TrezorZcashApi
8+
from blockapi.v2.models import FetchResult
9+
10+
11+
def test_fetch_balances(requests_mock, trezor_zec_balance_response):
12+
requests_mock.get(
13+
f'https://blockbook.zec.zelcore.io/api/v2/address/{zec_test_address}',
14+
text=trezor_zec_balance_response,
15+
)
16+
17+
api = TrezorZcashApi()
18+
balances = api.get_balance(zec_test_address)
19+
assert len(balances) == 1
20+
assert balances[0].balance == Decimal('12.345')
21+
22+
23+
def test_fetch_only(requests_mock, trezor_zec_balance_response):
24+
requests_mock.get(
25+
f'https://blockbook.zec.zelcore.io/api/v2/address/{zec_test_address}',
26+
text=trezor_zec_balance_response,
27+
)
28+
29+
api = TrezorZcashApi()
30+
result = api.fetch_balances(zec_test_address)
31+
assert result.data['balance'] == '1234500000'
32+
33+
34+
def test_parse_only():
35+
api = TrezorZcashApi()
36+
fetch_result = FetchResult(data=dict(balance='1234500000'))
37+
result = api.parse_balances(fetch_result)
38+
assert result.data[0].balance == Decimal('12.345')
39+
40+
41+
@pytest.fixture
42+
def trezor_zec_balance_response():
43+
return read_file('data/trezor_zec_balance_response.json')

blockapi/test/v2/test_data.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@
6666
xpub_test_address = 'xpub6CUGRUonZSQ4TWtTMmzXdrXDtypWKiKrhko4egpiMZbpiaQL2jkwSB1icqYh2cfDfVxdx4df189oLKnC5fSwqPfgyP3hooxujYzAu3fDVmz'
6767
# noinspection SpellCheckingInspection
6868
ltc_test_address = 'M8T1B2Z97gVdvmfkQcAtYbEepune1tzGua'
69+
# noinspection SpellCheckingInspection
70+
zec_test_address = 't1KstBMLVrYoHN5jrq5hKNGgERC1NodvfnS'
6971

7072

7173
API_CLASSES = [

blockapi/v2/api/__init__.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,7 @@
55
BlockchairDogecoinApi,
66
BlockchairLitecoinApi,
77
)
8-
from blockapi.v2.api.debank import (
9-
DebankApi,
10-
DebankApp,
11-
DebankPrediction,
12-
)
8+
from blockapi.v2.api.debank import DebankApi, DebankApp, DebankPrediction
139
from blockapi.v2.api.ethplorer import EthplorerApi
1410
from blockapi.v2.api.optimistic_etherscan import OptimismEtherscanApi
1511
from blockapi.v2.api.perpetual import PerpetualApi, perp_contract_address
@@ -21,4 +17,5 @@
2117
TrezorBitcoin1Api,
2218
TrezorBitcoin2Api,
2319
TrezorLitecoinApi,
20+
TrezorZcashApi,
2421
)

blockapi/v2/api/trezor.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from blockapi.utils.user_agent import get_random_user_agent
55
from blockapi.v2.base import BalanceMixin, BlockchainApi, ITransactions
6-
from blockapi.v2.coins import COIN_BTC, COIN_LTC
6+
from blockapi.v2.coins import COIN_BTC, COIN_LTC, COIN_ZEC
77
from blockapi.v2.models import (
88
ApiOptions,
99
AssetType,
@@ -21,7 +21,7 @@
2121

2222
class TrezorApi(BlockchainApi, ITransactions, BalanceMixin, ABC):
2323
"""
24-
Coins: Bitcoin, Litecoin
24+
Coins: Bitcoin, Litecoin, Zcash
2525
API docs: https://github.com/trezor/blockbook/blob/master/docs/api.md
2626
Explorer:
2727
"""
@@ -128,3 +128,12 @@ class TrezorLitecoinApi(TrezorApi):
128128
base_url='https://ltc1.trezor.io',
129129
rate_limit=0,
130130
)
131+
132+
133+
class TrezorZcashApi(TrezorApi):
134+
coin = COIN_ZEC
135+
api_options = ApiOptions(
136+
blockchain=Blockchain.ZCASH,
137+
base_url='https://blockbook.zec.zelcore.io',
138+
rate_limit=1.0,
139+
)

blockapi/v2/coins.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,3 +505,11 @@
505505
address="0x2::sui::SUI",
506506
info=CoinInfo(coingecko_id=CoingeckoId.SUI),
507507
)
508+
509+
COIN_ZEC = Coin(
510+
symbol='ZEC',
511+
name='Zcash',
512+
decimals=8,
513+
blockchain=Blockchain.ZCASH,
514+
info=CoinInfo(coingecko_id=CoingeckoId.ZCASH),
515+
)

blockapi/v2/models.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
from typing import Dict, List, Literal, Optional, Union
66

77
import attr
8+
from pydantic import BaseModel, Field
89

910
from blockapi.utils.datetime import parse_dt
1011
from blockapi.utils.num import raw_to_decimals, to_decimal, to_int
11-
from pydantic import BaseModel, Field
1212

1313
UNKNOWN = 'unknown'
1414

@@ -359,6 +359,7 @@ class Blockchain(str, Enum):
359359
YOCOIN = 'yocoin'
360360
ZEDXION = 'zedxion'
361361
ZERO = 'zero'
362+
ZCASH = 'zcash'
362363
ZETA_CHAIN = 'zetachain'
363364
ZILLIQA = 'zilliqa'
364365
ZIRCUIT = 'zircuit'
@@ -465,6 +466,7 @@ class CoingeckoId(str, Enum):
465466
WANCHAIN = 'wanchain'
466467
WETH = 'weth'
467468
XDAI = 'xdai'
469+
ZCASH = 'zcash'
468470

469471

470472
class NftOfferDirection(str, Enum):

0 commit comments

Comments
 (0)