diff --git a/blockapi/api/trezor.py b/blockapi/api/trezor.py index 133ed738..3f50e5fd 100644 --- a/blockapi/api/trezor.py +++ b/blockapi/api/trezor.py @@ -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 @@ -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', @@ -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'