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

#!/usr/bin/env python3# Copyright (c) 2014-2018 The Bitcoin Core developers# Distributed under the MIT software license, see the accompanying# file COPYING or http://www.opensource.org/licenses/mit-license.php."""Test spending coinbase transactions.The coinbase transaction in block N can appear in blockN+100... so is valid in the mempool when the best blockheight is N+99.This test makes sure coinbase spends that will be maturein the next block are accepted into the memory pool,but less mature coinbase spends are NOT."""from test_framework.test_framework import BitcoinTestFrameworkfrom test_framework.blocktools import create_raw_transactionfrom test_framework.util import assert_equal, assert_raises_rpc_errorclass MempoolSpendCoinbaseTest(BitcoinTestFramework):    def set_test_params(self):        self.num_nodes = 1    def skip_test_if_missing_module(self):        self.skip_if_no_wallet()    def run_test(self):        chain_height = self.nodes[0].getblockcount()        assert_equal(chain_height, 200)        node0_address = self.nodes[0].getnewaddress()        # Coinbase at height chain_height-100+1 ok in mempool, should        # get mined. Coinbase at height chain_height-100+2 is        # is too immature to spend.        b = [self.nodes[0].getblockhash(n) for n in range(101, 103)]        coinbase_txids = [self.nodes[0].getblock(h)['tx'][0] for h in b]        spends_raw = [create_raw_transaction(self.nodes[0], txid, node0_address, amount=49.99) for txid in coinbase_txids]        spend_101_id = self.nodes[0].sendrawtransaction(spends_raw[0])        # coinbase at height 102 should be too immature to spend        assert_raises_rpc_error(-26,"bad-txns-premature-spend-of-coinbase", self.nodes[0].sendrawtransaction, spends_raw[1])        # mempool should have just spend_101:        assert_equal(self.nodes[0].getrawmempool(), [ spend_101_id ])        # mine a block, spend_101 should get confirmed        self.nodes[0].generate(1)        assert_equal(set(self.nodes[0].getrawmempool()), set())        # ... and now height 102 can be spent:        spend_102_id = self.nodes[0].sendrawtransaction(spends_raw[1])        assert_equal(self.nodes[0].getrawmempool(), [ spend_102_id ])if __name__ == '__main__':    MempoolSpendCoinbaseTest().main()