def run_test(self):
    miner_reward = Decimal('0.005')
    starting_balance = (BASE_CB_AMOUNT * 25)
    for i in range(self.num_nodes):
        assert_equal(self.nodes[i].getbalance(), starting_balance)
        self.nodes[i].getnewaddress('')
    self.nodes[0].settxfee(0.001)
    node0_address_foo = self.nodes[0].getnewaddress('foo')
    fund_foo_txid = self.nodes[0].sendfrom('', node0_address_foo, 1219)
    fund_foo_tx = self.nodes[0].gettransaction(fund_foo_txid)
    burn_foo = (- find_burned_amount_in_tx(fund_foo_tx))
    node0_address_bar = self.nodes[0].getnewaddress('bar')
    fund_bar_txid = self.nodes[0].sendfrom('', node0_address_bar, 29)
    fund_bar_tx = self.nodes[0].gettransaction(fund_bar_txid)
    burn_bar = (- find_burned_amount_in_tx(fund_bar_tx))
    assert_equal(self.nodes[0].getbalance(''), ((((((starting_balance - 1219) - 29) + fund_foo_tx['fee']) + fund_bar_tx['fee']) - burn_foo) - burn_bar))
    node1_address = self.nodes[1].getnewaddress('from0')
    txid1 = self.nodes[0].sendfrom('foo', node1_address, 40, 0)
    txid2 = self.nodes[0].sendfrom('bar', node1_address, 20, 0)
    rawtx1 = self.nodes[0].getrawtransaction(txid1, 1)
    outputs_count = 4
    assert_equal(len(rawtx1['vout']), outputs_count)
    tx1_cl = CTransaction()
    tx1_cl.nVersion = 2
    tx1_cl.vin = [CTxIn(COutPoint(int(rawtx1['vin'][0]['txid'], 16), rawtx1['vin'][0]['vout']), b'', 4294967294)]
    for out in rawtx1['vout']:
        tx1_cl.vout.append(CTxOut(ToSatoshi(out['value']), hex_str_to_bytes(out['scriptPubKey']['hex'])))
    tx1_cl.nLockTime = rawtx1['locktime']
    clone_raw = bytes_to_hex_str(tx1_cl.serialize())
    tx1_clone = self.nodes[0].signrawtransaction(clone_raw, None, None, 'ALL|ANYONECANPAY')
    assert_equal(tx1_clone['complete'], True)
    if self.options.mine_block:
        self.nodes[0].generate(1)
        sync_blocks(self.nodes[0:2])
    tx1 = self.nodes[0].gettransaction(txid1)
    tx2 = self.nodes[0].gettransaction(txid2)
    expected = ((((starting_balance + fund_foo_tx['fee']) + fund_bar_tx['fee']) - burn_foo) - burn_bar)
    if self.options.mine_block:
        expected += miner_reward
    expected += (tx1['amount'] + tx1['fee'])
    expected += (tx2['amount'] + tx2['fee'])
    assert_equal(self.nodes[0].getbalance(), expected)
    assert_equal(self.nodes[0].getbalance('foo', 0), ((1219 + tx1['amount']) + tx1['fee']))
    assert_equal(self.nodes[0].getbalance('bar', 0), ((29 + tx2['amount']) + tx2['fee']))
    if self.options.mine_block:
        assert_equal(tx1['confirmations'], 1)
        assert_equal(tx2['confirmations'], 1)
        burned1 = (- find_burned_amount_in_tx(tx1))
        burned2 = (- find_burned_amount_in_tx(tx2))
        assert_equal(self.nodes[1].getbalance('from0'), (((- (tx1['amount'] + tx2['amount'])) - burned1) - burned2))
    else:
        assert_equal(tx1['confirmations'], 0)
        assert_equal(tx2['confirmations'], 0)
    self.nodes[2].sendrawtransaction(fund_foo_tx['hex'])
    txid1_clone = self.nodes[2].sendrawtransaction(tx1_clone['hex'])
    self.nodes[2].generate(1)
    connect_nodes(self.nodes[1], 2)
    self.nodes[2].sendrawtransaction(fund_bar_tx['hex'])
    self.nodes[2].sendrawtransaction(tx2['hex'])
    self.nodes[2].generate(1)
    sync_blocks(self.nodes)
    tx1 = self.nodes[0].gettransaction(txid1)
    tx1_clone = self.nodes[0].gettransaction(txid1_clone)
    tx2 = self.nodes[0].gettransaction(txid2)
    assert_equal(tx1['confirmations'], (- 2))
    assert_equal(tx1_clone['confirmations'], 2)
    assert_equal(tx2['confirmations'], 1)
    expected += (miner_reward * 2)
    if self.options.mine_block:
        expected -= miner_reward
    assert_equal(self.nodes[0].getbalance(), expected)
    assert_equal(self.nodes[0].getbalance('*', 0), expected)
    assert_equal(self.nodes[0].getbalance('foo'), ((1219 + tx1['amount']) + tx1['fee']))
    assert_equal(self.nodes[0].getbalance('bar', 0), ((29 + tx2['amount']) + tx2['fee']))
    assert_equal(self.nodes[0].getbalance('', 0), (((((((starting_balance - 1219) + fund_foo_tx['fee']) - burn_foo) - 29) + fund_bar_tx['fee']) - burn_bar) + (miner_reward * 2)))
    burned1 = (- find_burned_amount_in_tx(tx1))
    burned2 = (- find_burned_amount_in_tx(tx2))
    assert_equal(self.nodes[1].getbalance('from0', 0), (((- (tx1['amount'] + tx2['amount'])) - burned1) - burned2))
def run_test(self):
    miner_reward = Decimal('0.005')
    starting_balance = (BASE_CB_AMOUNT * 25)
    for i in range(self.num_nodes):
        assert_equal(self.nodes[i].getbalance(), starting_balance)
        self.nodes[i].getnewaddress()
    self.nodes[0].settxfee(0.001)
    node0_address_foo = self.nodes[0].getnewaddress('foo')
    fund_foo_txid = self.nodes[0].sendfrom(, node0_address_foo, 1219)
    fund_foo_tx = self.nodes[0].gettransaction(fund_foo_txid)
    burn_foo = (- find_burned_amount_in_tx(fund_foo_tx))
    node0_address_bar = self.nodes[0].getnewaddress('bar')
    fund_bar_txid = self.nodes[0].sendfrom(, node0_address_bar, 29)
    fund_bar_tx = self.nodes[0].gettransaction(fund_bar_txid)
    burn_bar = (- find_burned_amount_in_tx(fund_bar_tx))
    assert_equal(self.nodes[0].getbalance(), ((((((starting_balance - 1219) - 29) + fund_foo_tx['fee']) + fund_bar_tx['fee']) - burn_foo) - burn_bar))
    node1_address = self.nodes[1].getnewaddress('from0')
    txid1 = self.nodes[0].sendfrom('foo', node1_address, 40, 0)
    txid2 = self.nodes[0].sendfrom('bar', node1_address, 20, 0)
    rawtx1 = self.nodes[0].getrawtransaction(txid1, 1)
    outputs_count = 4
    assert_equal(len(rawtx1['vout']), outputs_count)
    tx1_cl = CTransaction()
    tx1_cl.nVersion = 2
    tx1_cl.vin = [CTxIn(COutPoint(int(rawtx1['vin'][0]['txid'], 16), rawtx1['vin'][0]['vout']), b, 4294967294)]
    for out in rawtx1['vout']:
        tx1_cl.vout.append(CTxOut(ToSatoshi(out['value']), hex_str_to_bytes(out['scriptPubKey']['hex'])))
    tx1_cl.nLockTime = rawtx1['locktime']
    clone_raw = bytes_to_hex_str(tx1_cl.serialize())
    tx1_clone = self.nodes[0].signrawtransaction(clone_raw, None, None, 'ALL|ANYONECANPAY')
    assert_equal(tx1_clone['complete'], True)
    if self.options.mine_block:
        self.nodes[0].generate(1)
        sync_blocks(self.nodes[0:2])
    tx1 = self.nodes[0].gettransaction(txid1)
    tx2 = self.nodes[0].gettransaction(txid2)
    expected = ((((starting_balance + fund_foo_tx['fee']) + fund_bar_tx['fee']) - burn_foo) - burn_bar)
    if self.options.mine_block:
        expected += miner_reward
    expected += (tx1['amount'] + tx1['fee'])
    expected += (tx2['amount'] + tx2['fee'])
    assert_equal(self.nodes[0].getbalance(), expected)
    assert_equal(self.nodes[0].getbalance('foo', 0), ((1219 + tx1['amount']) + tx1['fee']))
    assert_equal(self.nodes[0].getbalance('bar', 0), ((29 + tx2['amount']) + tx2['fee']))
    if self.options.mine_block:
        assert_equal(tx1['confirmations'], 1)
        assert_equal(tx2['confirmations'], 1)
        burned1 = (- find_burned_amount_in_tx(tx1))
        burned2 = (- find_burned_amount_in_tx(tx2))
        assert_equal(self.nodes[1].getbalance('from0'), (((- (tx1['amount'] + tx2['amount'])) - burned1) - burned2))
    else:
        assert_equal(tx1['confirmations'], 0)
        assert_equal(tx2['confirmations'], 0)
    self.nodes[2].sendrawtransaction(fund_foo_tx['hex'])
    txid1_clone = self.nodes[2].sendrawtransaction(tx1_clone['hex'])
    self.nodes[2].generate(1)
    connect_nodes(self.nodes[1], 2)
    self.nodes[2].sendrawtransaction(fund_bar_tx['hex'])
    self.nodes[2].sendrawtransaction(tx2['hex'])
    self.nodes[2].generate(1)
    sync_blocks(self.nodes)
    tx1 = self.nodes[0].gettransaction(txid1)
    tx1_clone = self.nodes[0].gettransaction(txid1_clone)
    tx2 = self.nodes[0].gettransaction(txid2)
    assert_equal(tx1['confirmations'], (- 2))
    assert_equal(tx1_clone['confirmations'], 2)
    assert_equal(tx2['confirmations'], 1)
    expected += (miner_reward * 2)
    if self.options.mine_block:
        expected -= miner_reward
    assert_equal(self.nodes[0].getbalance(), expected)
    assert_equal(self.nodes[0].getbalance('*', 0), expected)
    assert_equal(self.nodes[0].getbalance('foo'), ((1219 + tx1['amount']) + tx1['fee']))
    assert_equal(self.nodes[0].getbalance('bar', 0), ((29 + tx2['amount']) + tx2['fee']))
    assert_equal(self.nodes[0].getbalance(, 0), (((((((starting_balance - 1219) + fund_foo_tx['fee']) - burn_foo) - 29) + fund_bar_tx['fee']) - burn_bar) + (miner_reward * 2)))
    burned1 = (- find_burned_amount_in_tx(tx1))
    burned2 = (- find_burned_amount_in_tx(tx2))
    assert_equal(self.nodes[1].getbalance('from0', 0), (((- (tx1['amount'] + tx2['amount'])) - burned1) - burned2))