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.
73 lines
2.6 KiB
73 lines
2.6 KiB
# Copyright (c) 2018, John L. Jegutanis
|
|
#
|
|
# All rights reserved.
|
|
#
|
|
# See the file "LICENCE" for information about the copyright
|
|
# and warranty status of this software.
|
|
|
|
import json
|
|
import os
|
|
from binascii import unhexlify
|
|
|
|
import pytest
|
|
|
|
from electrumx.lib.coins import Coin, Namecoin
|
|
from electrumx.lib.hash import hash_to_hex_str
|
|
from electrumx.lib.script import OpCodes, Script
|
|
|
|
TRANSACTION_DIR = os.path.join(
|
|
os.path.dirname(os.path.realpath(__file__)), 'transactions')
|
|
|
|
# Find out which db engines to test
|
|
# Those that are not installed will be skipped
|
|
transactions = []
|
|
|
|
for name in os.listdir(TRANSACTION_DIR):
|
|
try:
|
|
name_parts = name.split("_")
|
|
coinFound = Coin.lookup_coin_class(name_parts[0], name_parts[1])
|
|
with open(os.path.join(TRANSACTION_DIR, name)) as f:
|
|
transactions.append((coinFound, json.load(f)))
|
|
except Exception as e:
|
|
transactions.append(pytest.fail(name))
|
|
|
|
|
|
@pytest.fixture(params=transactions)
|
|
def transaction_details(request):
|
|
return request.param
|
|
|
|
|
|
def test_transaction(transaction_details):
|
|
coin, tx_info = transaction_details
|
|
|
|
raw_tx = unhexlify(tx_info['hex'])
|
|
tx, tx_hash = coin.DESERIALIZER(raw_tx, 0).read_tx_and_hash()
|
|
assert tx_info['txid'] == hash_to_hex_str(tx_hash)
|
|
|
|
vin = tx_info['vin']
|
|
for i in range(len(vin)):
|
|
assert vin[i]['txid'] == hash_to_hex_str(tx.inputs[i].prev_hash)
|
|
assert vin[i]['vout'] == tx.inputs[i].prev_idx
|
|
|
|
vout = tx_info['vout']
|
|
for i in range(len(vout)):
|
|
# value pk_script
|
|
assert vout[i]['value'] == tx.outputs[i].value
|
|
spk = vout[i]['scriptPubKey']
|
|
tx_pks = tx.outputs[i].pk_script
|
|
assert spk['hex'] == tx_pks.hex()
|
|
assert coin.address_to_hashX(spk['address']) == \
|
|
coin.hashX_from_script(tx_pks)
|
|
if issubclass(coin, Namecoin):
|
|
if "nameOp" not in spk or "name" not in spk["nameOp"]:
|
|
assert coin.name_hashX_from_script(tx_pks) is None
|
|
else:
|
|
OP_NAME_UPDATE = OpCodes.OP_3
|
|
normalized_name_op_script = bytearray()
|
|
normalized_name_op_script.append(OP_NAME_UPDATE)
|
|
normalized_name_op_script.extend(Script.push_data(spk["nameOp"]["name"].encode("ascii")))
|
|
normalized_name_op_script.extend(Script.push_data(bytes([])))
|
|
normalized_name_op_script.append(OpCodes.OP_2DROP)
|
|
normalized_name_op_script.append(OpCodes.OP_DROP)
|
|
normalized_name_op_script.append(OpCodes.OP_RETURN)
|
|
assert coin.name_hashX_from_script(tx_pks) == Coin.hashX_from_script(normalized_name_op_script)
|
|
|