def run_rbf_opt_in_test(self):

    def is_opt_in(node, txid):
        rawtx = node.getrawtransaction(txid, 1)
        for x in rawtx['vin']:
            if (x['sequence'] < 4294967294):
                return True
        return False

    def get_unconfirmed_utxo_entry(node, txid_to_match):
        utxo = node.listunspent(0, 0)
        for i in utxo:
            if (i['txid'] == txid_to_match):
                return i
        return None
    txid_1 = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 1)
    assert (not is_opt_in(self.nodes[0], txid_1))
    assert_array_result(self.nodes[0].listtransactions(), {'txid': txid_1}, {'bip125-replaceable': 'no'})
    sync_mempools(self.nodes)
    assert_array_result(self.nodes[1].listtransactions(), {'txid': txid_1}, {'bip125-replaceable': 'no'})
    utxo_to_use = get_unconfirmed_utxo_entry(self.nodes[1], txid_1)
    inputs = [{'txid': utxo_to_use['txid'], 'vout': utxo_to_use['vout']}]
    outputs = {self.nodes[0].getnewaddress(): 0.999}
    tx2 = self.nodes[1].createrawtransaction(inputs, outputs)
    tx2_signed = self.nodes[1].signrawtransaction(tx2)['hex']
    txid_2 = self.nodes[1].sendrawtransaction(tx2_signed)
    assert (not is_opt_in(self.nodes[1], txid_2))
    assert_array_result(self.nodes[1].listtransactions(), {'txid': txid_2}, {'bip125-replaceable': 'no'})
    sync_mempools(self.nodes)
    assert_array_result(self.nodes[0].listtransactions(), {'txid': txid_2}, {'bip125-replaceable': 'no'})
    utxo_to_use = get_unconfirmed_utxo_entry(self.nodes[0], txid_2)
    inputs = [{'txid': txid_2, 'vout': utxo_to_use['vout']}]
    outputs = {self.nodes[1].getnewaddress(): 0.998}
    tx3 = self.nodes[0].createrawtransaction(inputs, outputs)
    tx3_modified = txFromHex(tx3)
    tx3_modified.vin[0].nSequence = 0
    tx3 = bytes_to_hex_str(tx3_modified.serialize())
    tx3_signed = self.nodes[0].signrawtransaction(tx3)['hex']
    txid_3 = self.nodes[0].sendrawtransaction(tx3_signed)
    assert is_opt_in(self.nodes[0], txid_3)
    assert_array_result(self.nodes[0].listtransactions(), {'txid': txid_3}, {'bip125-replaceable': 'yes'})
    sync_mempools(self.nodes)
    assert_array_result(self.nodes[1].listtransactions(), {'txid': txid_3}, {'bip125-replaceable': 'yes'})
    utxo_to_use = get_unconfirmed_utxo_entry(self.nodes[1], txid_3)
    inputs = [{'txid': txid_3, 'vout': utxo_to_use['vout']}]
    outputs = {self.nodes[0].getnewaddress(): 0.997}
    tx4 = self.nodes[1].createrawtransaction(inputs, outputs)
    tx4_signed = self.nodes[1].signrawtransaction(tx4)['hex']
    txid_4 = self.nodes[1].sendrawtransaction(tx4_signed)
    assert (not is_opt_in(self.nodes[1], txid_4))
    assert_array_result(self.nodes[1].listtransactions(), {'txid': txid_4}, {'bip125-replaceable': 'yes'})
    sync_mempools(self.nodes)
    assert_array_result(self.nodes[0].listtransactions(), {'txid': txid_4}, {'bip125-replaceable': 'yes'})
    tx3_b = tx3_modified
    tx3_b.vout[0].nValue -= int((Decimal('0.004') * COIN))
    tx3_b = bytes_to_hex_str(tx3_b.serialize())
    tx3_b_signed = self.nodes[0].signrawtransaction(tx3_b)['hex']
    txid_3b = self.nodes[0].sendrawtransaction(tx3_b_signed, True)
    assert is_opt_in(self.nodes[0], txid_3b)
    assert_array_result(self.nodes[0].listtransactions(), {'txid': txid_4}, {'bip125-replaceable': 'unknown'})
    sync_mempools(self.nodes)
    assert_array_result(self.nodes[1].listtransactions(), {'txid': txid_4}, {'bip125-replaceable': 'unknown'})
    for n in self.nodes[0:2]:
        assert_equal(n.gettransaction(txid_1)['bip125-replaceable'], 'no')
        assert_equal(n.gettransaction(txid_2)['bip125-replaceable'], 'no')
        assert_equal(n.gettransaction(txid_3)['bip125-replaceable'], 'yes')
        assert_equal(n.gettransaction(txid_3b)['bip125-replaceable'], 'yes')
        assert_equal(n.gettransaction(txid_4)['bip125-replaceable'], 'unknown')
    self.nodes[0].generate(1)
    assert (txid_3b not in self.nodes[0].getrawmempool())
    assert_equal(self.nodes[0].gettransaction(txid_3b)['bip125-replaceable'], 'no')
    assert_equal(self.nodes[0].gettransaction(txid_4)['bip125-replaceable'], 'unknown')
def run_rbf_opt_in_test(self):

    def is_opt_in(node, txid):
        rawtx = node.getrawtransaction(txid, 1)
        for x in rawtx['vin']:
            if (x['sequence'] < 4294967294):
                return True
        return False

    def get_unconfirmed_utxo_entry(node, txid_to_match):
        utxo = node.listunspent(0, 0)
        for i in utxo:
            if (i['txid'] == txid_to_match):
                return i
        return None
    txid_1 = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 1)
    assert (not is_opt_in(self.nodes[0], txid_1))
    assert_array_result(self.nodes[0].listtransactions(), {'txid': txid_1}, {'bip125-replaceable': 'no'})
    sync_mempools(self.nodes)
    assert_array_result(self.nodes[1].listtransactions(), {'txid': txid_1}, {'bip125-replaceable': 'no'})
    utxo_to_use = get_unconfirmed_utxo_entry(self.nodes[1], txid_1)
    inputs = [{'txid': utxo_to_use['txid'], 'vout': utxo_to_use['vout']}]
    outputs = {self.nodes[0].getnewaddress(): 0.999}
    tx2 = self.nodes[1].createrawtransaction(inputs, outputs)
    tx2_signed = self.nodes[1].signrawtransaction(tx2)['hex']
    txid_2 = self.nodes[1].sendrawtransaction(tx2_signed)
    assert (not is_opt_in(self.nodes[1], txid_2))
    assert_array_result(self.nodes[1].listtransactions(), {'txid': txid_2}, {'bip125-replaceable': 'no'})
    sync_mempools(self.nodes)
    assert_array_result(self.nodes[0].listtransactions(), {'txid': txid_2}, {'bip125-replaceable': 'no'})
    utxo_to_use = get_unconfirmed_utxo_entry(self.nodes[0], txid_2)
    inputs = [{'txid': txid_2, 'vout': utxo_to_use['vout']}]
    outputs = {self.nodes[1].getnewaddress(): 0.998}
    tx3 = self.nodes[0].createrawtransaction(inputs, outputs)
    tx3_modified = txFromHex(tx3)
    tx3_modified.vin[0].nSequence = 0
    tx3 = bytes_to_hex_str(tx3_modified.serialize())
    tx3_signed = self.nodes[0].signrawtransaction(tx3)['hex']
    txid_3 = self.nodes[0].sendrawtransaction(tx3_signed)
    assert is_opt_in(self.nodes[0], txid_3)
    assert_array_result(self.nodes[0].listtransactions(), {'txid': txid_3}, {'bip125-replaceable': 'yes'})
    sync_mempools(self.nodes)
    assert_array_result(self.nodes[1].listtransactions(), {'txid': txid_3}, {'bip125-replaceable': 'yes'})
    utxo_to_use = get_unconfirmed_utxo_entry(self.nodes[1], txid_3)
    inputs = [{'txid': txid_3, 'vout': utxo_to_use['vout']}]
    outputs = {self.nodes[0].getnewaddress(): 0.997}
    tx4 = self.nodes[1].createrawtransaction(inputs, outputs)
    tx4_signed = self.nodes[1].signrawtransaction(tx4)['hex']
    txid_4 = self.nodes[1].sendrawtransaction(tx4_signed)
    assert (not is_opt_in(self.nodes[1], txid_4))
    assert_array_result(self.nodes[1].listtransactions(), {'txid': txid_4}, {'bip125-replaceable': 'yes'})
    sync_mempools(self.nodes)
    assert_array_result(self.nodes[0].listtransactions(), {'txid': txid_4}, {'bip125-replaceable': 'yes'})
    tx3_b = tx3_modified
    tx3_b.vout[0].nValue -= int((Decimal('0.004') * COIN))
    tx3_b = bytes_to_hex_str(tx3_b.serialize())
    tx3_b_signed = self.nodes[0].signrawtransaction(tx3_b)['hex']
    txid_3b = self.nodes[0].sendrawtransaction(tx3_b_signed, True)
    assert is_opt_in(self.nodes[0], txid_3b)
    assert_array_result(self.nodes[0].listtransactions(), {'txid': txid_4}, {'bip125-replaceable': 'unknown'})
    sync_mempools(self.nodes)
    assert_array_result(self.nodes[1].listtransactions(), {'txid': txid_4}, {'bip125-replaceable': 'unknown'})
    for n in self.nodes[0:2]:
        assert_equal(n.gettransaction(txid_1)['bip125-replaceable'], 'no')
        assert_equal(n.gettransaction(txid_2)['bip125-replaceable'], 'no')
        assert_equal(n.gettransaction(txid_3)['bip125-replaceable'], 'yes')
        assert_equal(n.gettransaction(txid_3b)['bip125-replaceable'], 'yes')
        assert_equal(n.gettransaction(txid_4)['bip125-replaceable'], 'unknown')
    self.nodes[0].generate(1)
    assert (txid_3b not in self.nodes[0].getrawmempool())
    assert_equal(self.nodes[0].gettransaction(txid_3b)['bip125-replaceable'], 'no')
    assert_equal(self.nodes[0].gettransaction(txid_4)['bip125-replaceable'], 'unknown')