git / moonbite-core / test/functional/wallet_listwallettransactions.py · raw

#!/usr/bin/env python3"""Test the listwallettransactions API for MWEB transactions."""from decimal import Decimalfrom io import BytesIOfrom test_framework.messages import COIN, CTransactionfrom test_framework.test_framework import BitcoinTestFrameworkfrom test_framework.ltc_util import setup_mweb_chainfrom test_framework.util import (    assert_array_result,    assert_equal,    hex_str_to_bytes,)def tx_from_hex(hexstring):    tx = CTransaction()    f = BytesIO(hex_str_to_bytes(hexstring))    tx.deserialize(f)    return txclass ListWalletTransactionsTest(BitcoinTestFramework):    def set_test_params(self):        self.setup_clean_chain = True        self.num_nodes = 3        self.extra_args = [['-whitelist=noban@127.0.0.1'],['-whitelist=noban@127.0.0.1'],[]]  # immediate tx relay            def skip_test_if_missing_module(self):        self.skip_if_no_wallet()    def run_test(self):        node0 = self.nodes[0]        node1 = self.nodes[1]        node2 = self.nodes[2]        # Setup MWEB chain using node0 as miner        setup_mweb_chain(node0)        self.sync_all()        # Simple send, 0 to 1:        txid = node0.sendtoaddress(node1.getnewaddress(), 0.1)        self.sync_all()        assert_array_result(node0.listwallettransactions(txid),                            {"txid": txid},                            {"type": "SendToAddress", "amount": Decimal("-0.1"), "confirmations": 0})        assert_array_result(node1.listwallettransactions(),                            {"txid": txid},                            {"type": "RecvWithAddress", "amount": Decimal("0.1"), "confirmations": 0})        # mine a block, confirmations should change:        blockhash = node0.generate(1)[0]        blockheight = node0.getblockheader(blockhash)['height']        self.sync_all()        assert_array_result(node0.listwallettransactions(),                            {"txid": txid},                            {"type": "SendToAddress", "amount": Decimal("-0.1"), "confirmations": 1, "blockhash": blockhash, "blockheight": blockheight})        assert_array_result(node1.listwallettransactions(),                            {"txid": txid},                            {"type": "RecvWithAddress", "amount": Decimal("0.1"), "confirmations": 1, "blockhash": blockhash, "blockheight": blockheight})        # send-to-self:        txid = node0.sendtoaddress(node0.getnewaddress(), 0.2)        assert_array_result(node0.listwallettransactions(),                            {"txid": txid, "type": "SendToSelf"},                            {"amount": Decimal("0.2")})        # pegin to self        node0_mweb_addr = node0.getnewaddress(address_type='mweb')         txid = node0.sendtoaddress(node0_mweb_addr, 0.4)        assert_array_result(node0.listwallettransactions(),                            {"txid": txid, "type": "SendToSelf"},                            {"amount": Decimal("0.4")})                # mine a block, confirmations should change:        blockhash = node0.generate(1)[0]        blockheight = node0.getblockheader(blockhash)['height']        self.sync_all()        assert_array_result(node0.listwallettransactions(),                            {"txid": txid, "type": "SendToSelf"},                            {"amount": Decimal("0.4"), "confirmations": 1, "blockhash": blockhash, "blockheight": blockheight})        # pegin from 0 to 1        node1_mweb_addr = node1.getnewaddress(address_type='mweb')        txid = node0.sendtoaddress(node1_mweb_addr, 5)        self.sync_all()        assert_array_result(node0.listwallettransactions(txid),                            {"txid": txid},                            {"type": "SendToAddress", "amount": Decimal("-5.0"), "confirmations": 0, "address": node1_mweb_addr})        assert_array_result(node1.listwallettransactions(),                            {"address": node1_mweb_addr},                            {"type": "RecvWithAddress", "amount": Decimal("5.0"), "confirmations": 0})                # mine a block, confirmations should change:        blockhash = node0.generate(1)[0]        blockheight = node0.getblockheader(blockhash)['height']        self.sync_all()        assert_array_result(node0.listwallettransactions(txid),                            {"txid": txid},                            {"type": "SendToAddress", "amount": Decimal("-5.0"), "confirmations": 1, "blockheight": blockheight, "address": node1_mweb_addr})        assert_array_result(node1.listwallettransactions(),                            {"address": node1_mweb_addr},                            {"type": "RecvWithAddress", "amount": Decimal("5.0"), "confirmations": 1, "blockheight": blockheight})                # pegout from 1 to 0 (node0 online)        node0_addr = node0.getnewaddress()        txid = node1.sendtoaddress(node0_addr, 3)        self.sync_all()        assert_array_result(node1.listwallettransactions(),                            {"address": node0_addr},                            {"txid": txid, "type": "SendToAddress", "amount": Decimal("-3.0"), "confirmations": 0})        assert_array_result(node0.listwallettransactions(),                            {"address": node0_addr},                            {"txid": txid, "type": "RecvWithAddress", "amount": Decimal("3.0"), "confirmations": 0})        # mine a block, confirmations should change:        blockhash = node0.generate(1)[0]        blockheight = node0.getblockheader(blockhash)['height']        self.sync_all()        assert_array_result(node1.listwallettransactions(),                            {"address": node0_addr},                            {"txid": txid, "type": "SendToAddress", "amount": Decimal("-3.0"), "confirmations": 1, "blockheight": blockheight})        assert_array_result(node0.listwallettransactions(),                            {"address": node0_addr},                            {"type": "RecvWithAddress", "amount": Decimal("3.0"), "confirmations": 1, "blockheight": blockheight})        # pegout from 1 to 2 and mine a block while node2 is offline        # node2 won't see the original MWEB transaction; just the pegout kernel and hogex output.        node2_addr = node2.getnewaddress()        self.stop_node(2)        txid = node1.sendtoaddress(node2_addr, 1)        blockhash = node1.generate(1)[0]        blockheight = node1.getblockheader(blockhash)['height']        hogex_txid = node1.getblock(blockhash)['tx'][-1]        self.start_node(2)        self.connect_nodes(2, 0)        self.connect_nodes(2, 1)        self.sync_all()        assert_array_result(node1.listwallettransactions(),                            {"address": node2_addr},                            {"txid": txid, "type": "SendToAddress", "amount": Decimal("-1.0"), "confirmations": 1, "blockheight": blockheight})        assert_array_result(node2.listwallettransactions(),                            {"address": node2_addr},                            {"txid": hogex_txid, "type": "RecvWithAddress", "amount": Decimal("1.0"), "confirmations": 1, "blockheight": blockheight})        # TODO: Reorg and ensure hogex is marked as not acceptedif __name__ == '__main__':    ListWalletTransactionsTest().main()