clicada/clicada/tx/tx.py

115 lines
3.4 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# standard imports
import urllib.request
import urllib.parse
import logging
import json
# external imports
from cic_types.models.tx import (
TokenTx,
TokenTxType,
)
# local imports
from clicada.encode import tx_normalize
logg = logging.getLogger(__name__)
class ResolvedTokenTx(TokenTx):
def __init__(self):
super(ResolvedTokenTx, self).__init__()
self.source_token_name = None
self.destination_token_name = None
self.symmetric = True
self.sender_entity = None
self.recipient_entity = None
def resolve_tokens(self, token_store, show_decimals=False):
(token_symbol, token_decimals) = token_store.by_address(self.source_token)
self.source_token_label = token_symbol
token_value = self.to_value / (10 ** token_decimals)
if not show_decimals:
token_decimals = 0
fmt = '{:.' + str(token_decimals) + 'f}'
self.from_value_label = fmt.format(token_value)
if self.destination_token != self.source_token:
self.symmetric = False
(token_symbol, token_decimals) = token_store.by_address(self.destination_token)
self.destination_token_label = token_symbol
token_value = self.to_value / (10 ** token_decimals)
if not show_decimals:
token_decimals = 0
fmt = '{:.' + str(token_decimals) + 'f}'
self.to_value_label = fmt.format(token_value)
def resolve_stored_entity(self, user_store, address):
address = tx_normalize.wallet_address(address)
try:
v = user_store.get(address)
return v
except FileNotFoundError:
return None
def resolve_sender_entity(self, user_store):
v = self.resolve_stored_entity(user_store, self.sender)
if v != None:
return v
if self.tx_type == TokenTxType.faucet_giveto.value:
return 'FAUCET'
return user_store.get_metadata(self.sender)
def resolve_recipient_entity(self, user_store):
v = self.resolve_stored_entity(user_store, self.recipient)
if v != None:
return v
return user_store.get_metadata(self.recipient)
def resolve_entities(self, user_store):
self.sender_label = self.resolve_sender_entity(user_store)
self.recipient_label = self.resolve_recipient_entity(user_store)
def resolve(self, token_store, user_store, show_decimals=False):
self.resolve_tokens(token_store, show_decimals)
self.resolve_entities(user_store)
def __str__(self):
if self.symmetric:
return '{}: {} => {}\t{} {}'.format(
self.date_block_label,
self.sender_label,
self.recipient_label,
self.destination_token_label,
self.to_value_label,
)
class TxGetter:
def __init__(self, cache_url, limit=0):
self.cache_url = cache_url
self.limit = limit
if limit == 0:
url = urllib.parse.urljoin(self.cache_url, 'defaultlimit')
r = urllib.request.urlopen(url)
self.limit = json.load(r)
logg.debug('set limit {} from {}'.format(self.limit, self.cache_url))
def get(self, address, offset=0, limit=0):
url = urllib.parse.urljoin(self.cache_url, '/txa/user/{}/{}/{}'.format(address, limit, offset))
r = urllib.request.urlopen(url)
return json.load(r)