115 lines
3.4 KiB
Python
115 lines
3.4 KiB
Python
# 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)
|