You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
trezor-firmware/tests/tx_cache.py

62 lines
2.0 KiB

# This file is part of the Trezor project.
#
# Copyright (C) 2012-2019 SatoshiLabs and contributors
#
# This library is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License version 3
# as published by the Free Software Foundation.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the License along with this library.
# If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>.
import decimal
import json
import os.path
from trezorlib import coins
from trezorlib.tx_api import json_to_tx
CACHE_PATH = os.path.join(os.path.dirname(__file__), "txcache")
def tx_cache(coin_name, allow_fetch=True):
coin_data = coins.by_name[coin_name]
fetch = coins.tx_api[coin_name].get_tx_data if allow_fetch else None
return TxCache(CACHE_PATH, coin_data, fetch)
class TxCache:
def __init__(self, path, coin_data, fetch=None):
self.path = path
self.coin_data = coin_data
self.fetch = fetch
coin_slug = coin_data["coin_name"].lower().replace(" ", "_")
prefix = "insight_" + coin_slug + "_tx_"
self.file_pattern = os.path.join(self.path, prefix + "{}.json")
def get_tx(self, txhash):
cache_file = self.file_pattern.format(txhash)
try:
with open(cache_file) as f:
data = json.load(f, parse_float=decimal.Decimal)
return json_to_tx(self.coin_data, data)
except Exception as e:
if self.fetch is None:
raise Exception("Unhandled cache miss") from e
# cache miss, try to use backend
data = self.fetch(txhash)
with open(cache_file, "w") as f:
json.dump(data, f)
return json_to_tx(self.coin_data, data)
def __getitem__(self, key):
return self.get_tx(key.hex())