2021-11-05 18:36:07 +01:00
|
|
|
|
# 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
|
2021-11-06 04:42:18 +01:00
|
|
|
|
from clicada.error import ExpiredRecordError
|
2021-11-05 18:36:07 +01:00
|
|
|
|
|
|
|
|
|
logg = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ResolvedTokenTx(TokenTx):
|
|
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
|
super(ResolvedTokenTx, self).__init__()
|
|
|
|
|
self.source_token_name = None
|
|
|
|
|
self.destination_token_name = None
|
2021-11-06 11:37:21 +01:00
|
|
|
|
self.source_token_decimals = None
|
|
|
|
|
self.destination_token_decimals = None
|
2021-11-05 18:36:07 +01:00
|
|
|
|
self.symmetric = True
|
|
|
|
|
self.sender_entity = None
|
|
|
|
|
self.recipient_entity = None
|
|
|
|
|
|
|
|
|
|
|
2021-11-06 04:42:18 +01:00
|
|
|
|
def resolve_tokens(self, token_store, show_decimals=False, update=False):
|
2021-11-05 18:36:07 +01:00
|
|
|
|
(token_symbol, token_decimals) = token_store.by_address(self.source_token)
|
2021-11-06 11:37:21 +01:00
|
|
|
|
self.source_token_decimals = token_decimals
|
2021-11-05 18:36:07 +01:00
|
|
|
|
self.source_token_label = token_symbol
|
|
|
|
|
token_value = self.to_value / (10 ** token_decimals)
|
2021-11-06 11:37:21 +01:00
|
|
|
|
show_token_decimals = token_decimals
|
2021-11-05 18:36:07 +01:00
|
|
|
|
if not show_decimals:
|
2021-11-06 11:37:21 +01:00
|
|
|
|
show_token_decimals = 0
|
|
|
|
|
fmt = '{:.' + str(show_token_decimals) + 'f}'
|
2021-11-05 18:36:07 +01:00
|
|
|
|
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)
|
2021-11-06 11:37:21 +01:00
|
|
|
|
show_token_decimals = token_decimals
|
2021-11-05 18:36:07 +01:00
|
|
|
|
|
|
|
|
|
self.destination_token_label = token_symbol
|
2021-11-06 11:37:21 +01:00
|
|
|
|
self.destination_token_decimals = token_decimals
|
2021-11-05 18:36:07 +01:00
|
|
|
|
token_value = self.to_value / (10 ** token_decimals)
|
|
|
|
|
if not show_decimals:
|
2021-11-06 11:37:21 +01:00
|
|
|
|
show_token_decimals = 0
|
|
|
|
|
fmt = '{:.' + str(show_token_decimals) + 'f}'
|
2021-11-05 18:36:07 +01:00
|
|
|
|
|
|
|
|
|
self.to_value_label = fmt.format(token_value)
|
|
|
|
|
|
|
|
|
|
|
2021-11-06 04:42:18 +01:00
|
|
|
|
def resolve_stored_entity(self, user_store, address, update=False):
|
|
|
|
|
if update:
|
|
|
|
|
return None
|
2021-11-05 18:36:07 +01:00
|
|
|
|
address = tx_normalize.wallet_address(address)
|
|
|
|
|
try:
|
|
|
|
|
v = user_store.get(address)
|
|
|
|
|
return v
|
|
|
|
|
except FileNotFoundError:
|
|
|
|
|
return None
|
2021-11-06 04:42:18 +01:00
|
|
|
|
except ExpiredRecordError:
|
|
|
|
|
return None
|
2021-11-05 18:36:07 +01:00
|
|
|
|
|
|
|
|
|
|
2021-11-06 04:42:18 +01:00
|
|
|
|
def resolve_sender_entity(self, user_store, update=False):
|
|
|
|
|
v = self.resolve_stored_entity(user_store, self.sender, update=update)
|
2021-11-05 18:36:07 +01:00
|
|
|
|
if v != None:
|
|
|
|
|
return v
|
|
|
|
|
if self.tx_type == TokenTxType.faucet_giveto.value:
|
|
|
|
|
return 'FAUCET'
|
2021-11-06 10:34:40 +01:00
|
|
|
|
r = user_store.by_address(self.sender)
|
|
|
|
|
return str(r)
|
2021-11-05 18:36:07 +01:00
|
|
|
|
|
|
|
|
|
|
2021-11-06 04:42:18 +01:00
|
|
|
|
def resolve_recipient_entity(self, user_store, update=False):
|
|
|
|
|
v = self.resolve_stored_entity(user_store, self.recipient, update=update)
|
2021-11-05 18:36:07 +01:00
|
|
|
|
if v != None:
|
|
|
|
|
return v
|
2021-11-06 10:34:40 +01:00
|
|
|
|
r = user_store.by_address(self.recipient, update=update)
|
|
|
|
|
return str(r)
|
2021-11-05 18:36:07 +01:00
|
|
|
|
|
|
|
|
|
|
2021-11-06 04:42:18 +01:00
|
|
|
|
def resolve_entities(self, user_store, update=False):
|
|
|
|
|
self.sender_label = self.resolve_sender_entity(user_store, update=update)
|
|
|
|
|
self.recipient_label = self.resolve_recipient_entity(user_store, update=update)
|
2021-11-05 18:36:07 +01:00
|
|
|
|
|
|
|
|
|
|
2021-11-06 04:42:18 +01:00
|
|
|
|
def resolve(self, token_store, user_store, show_decimals=False, update=False):
|
|
|
|
|
self.resolve_tokens(token_store, show_decimals, update=update)
|
|
|
|
|
self.resolve_entities(user_store, update=update)
|
2021-11-05 18:36:07 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
if self.symmetric:
|
2021-11-06 11:37:21 +01:00
|
|
|
|
return '{}\t{} => {}\t{} {}'.format(
|
2021-11-05 18:36:07 +01:00
|
|
|
|
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)
|