clicada/clicada/tx/tx.py

115 lines
3.4 KiB
Python
Raw Normal View History

# 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)