Skip to content
Open
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
71 changes: 50 additions & 21 deletions blockapi/api/trezor.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,21 +20,29 @@ class TrezorAPI(BlockchainAPI):
page_offset_step = None
confirmed_num = None
xpub_support = True
_tokens = []

supported_requests = {
'get_balance': '/api/v2/address/{address}',
'get_balance_xpub': '/api/v2/xpub/{address}',
'get_txs': '/api/v2/utxo/{address}?confirmed={confirmed}',
'get_tx': '/api/v2/tx/{tx_hash}',
'get_address': '/api/v2/address/{address}?page={page}&pageSize={page_size}&details={details}&contract= \
{contract_address}',
'get_xpub': '/api/v2/xpub/{address}?page={page}&pageSize={page_size}&details={details}&tokens={tokens}',
}

def get_balance(self):
if len(self.address) == 111:
response = self.request('get_balance_xpub',
address=self.address)
response = self.request('get_xpub',
address=self.address,
page = None,
page_size=None,
details=None,
tokens=None)
else:
response = self.request('get_balance',
address=self.address)
response = self.request('get_address',
address=self.address,
page=None,
page_size=None,
details=None,
contract_address=None)

if not response:
return None
Expand All @@ -43,28 +51,42 @@ def get_balance(self):
return [{'symbol': self.symbol, 'amount': retval}]

def get_txs(self, offset=None, limit=None, unconfirmed=False):
response = self.request('get_txs',
if len(self.address) == 111:
response = self.request('get_xpub',
address=self.address,
confirmed=not unconfirmed)

return [self.parse_tx(tx) for tx in response]
page=offset,
page_size=limit,
details='txs',
tokens='used')
if not 'tokens' in response:
return []
if offset and int(response['totalPages']) < offset:
return []
self._tokens = [t['name'] for t in response['tokens']]

return [self.parse_tx(tx) for tx in response['transactions']]
else:
return None

def parse_tx(self, tx):
txdata = self.request('get_tx',
tx_hash=tx['txid'])
def parse_tx(self, txdata):
in_addrs = [a['addresses'][0] for a in txdata['vin']]
out_addrs = [a['addresses'][0] for a in txdata['vout']]
received = self._get_value_sum(out_addrs, txdata['vout'])

if self.address in txdata['vin'][0]['addresses']:
if len(set(in_addrs) & set(self._tokens)):
direction = 'outgoing'
amount = self._get_value_sum(in_addrs, txdata['vin']) - received
else:
direction = 'incoming'
amount = received

return {
'date': datetime.fromtimestamp(txdata['blockTime'], pytz.utc),
'from_address': txdata['vin'][0]['addresses'],
'to_address': txdata['vout'][0]['addresses'],
'amount': float(txdata['value']) * self.coef,
'date': str(datetime.fromtimestamp(txdata['blockTime'], pytz.utc)),
'from_address': in_addrs,
'to_address': out_addrs,
'amount': float(amount) * self.coef,
'fee': float(txdata['fees']) * self.coef,
'hash': tx['txid'],
'hash': txdata['txid'],
'confirmed': txdata['confirmations'],
'is_error': False,
'type': 'normal',
Expand All @@ -75,6 +97,13 @@ def parse_tx(self, tx):
'raw': txdata
}

def _get_value_sum(self, addrs, txs):
my_addrs = list(set(addrs) & set(self._tokens))
value = 0
for tx in txs:
if tx['addresses'][0] in my_addrs:
value += float(tx['value'])
return value

class Btc1TrezorAPI(TrezorAPI):
base_url = 'https://btc1.trezor.io'
Expand Down