Beispiel #1
0
    def run_test(self):
        nodes = self.nodes

        nodes[0].extkeyimportmaster(
            'abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb'
        )
        assert (nodes[0].getwalletinfo()['total_balance'] == 100000)
        nodes[1].extkeyimportmaster(
            'pact mammal barrel matrix local final lecture chunk wasp survey bid various book strong spread fall ozone daring like topple door fatigue limb olympic',
            '', 'true')
        nodes[1].getnewextaddress('lblExtTest')
        nodes[1].rescanblockchain()
        assert (nodes[1].getwalletinfo()['total_balance'] == 25000)
        nodes[2].extkeyimportmaster(
            'sección grito médula hecho pauta posada nueve ebrio bruto buceo baúl mitad'
        )
        nodes[3].extkeyimportmaster(
            'sección grito médula hecho pauta posada nueve ebrio bruto buceo baúl mitad'
        )

        nodes[0].setwalletflag('avoid_reuse')
        nodes[1].setwalletflag('avoid_reuse')
        nodes[2].setwalletflag('avoid_reuse')

        assert_equal(nodes[0].getwalletinfo()["avoid_reuse"], True)
        assert_equal(nodes[1].getwalletinfo()["avoid_reuse"], True)
        assert_equal(nodes[2].getwalletinfo()["avoid_reuse"], True)
        assert_equal(nodes[3].getwalletinfo()["avoid_reuse"], False)

        addr_plain = nodes[2].getnewaddress()
        nodes[1].sendtoaddress(addr_plain, 1)

        self.sync_all()
        nodes[1].sendtoaddress(addr_plain, 2)

        self.sync_all()
        self.stakeBlocks(1)
        assert (isclose(nodes[2].getbalances()['mine']['trusted'], 3.0))

        nodes[2].sendtoaddress(nodes[1].getnewaddress(), 0.5)
        assert (isclose(nodes[2].getbalances()['mine']['trusted'], 2.499654))

        nodes[1].sendtoaddress(addr_plain, 3)
        self.sync_all()
        self.stakeBlocks(1)

        unspents_2 = nodes[2].listunspent()
        assert (len(unspents_2) == 3)
        num_reused = 0
        for utxo in unspents_2:
            if utxo['reused'] is True:
                num_reused += 1
        assert (num_reused == 2)

        assert (isclose(nodes[2].getbalances()['mine']['trusted'], 0.499654))
        assert (isclose(nodes[2].getbalances()['mine']['used'], 5.0))

        assert (len(nodes[3].listunspent()) == 3)
        assert (isclose(nodes[3].getbalances()['mine']['trusted'], 5.499654))
    def run_test(self):
        nodes = self.nodes

        # Stop staking
        for i in range(len(nodes)):
            nodes[i].reservebalance(True, 10000000)

        nodes[0].extkeyimportmaster(
            'abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb'
        )
        assert (nodes[0].getwalletinfo()['total_balance'] == 100000)

        nodes[1].extkeyimportmaster(nodes[1].mnemonic('new')['master'])

        addr1 = nodes[1].getnewaddress()
        addr2 = nodes[1].getnewstealthaddress()

        txnid = nodes[0].sendmany(
            fromaccount='',
            amounts={
                addr1: 1,
                addr2: 2
            },
            subtractfeefrom=[addr1],
            minconf=0,
        )
        self.sync_all()

        ro = nodes[1].filtertransactions()
        assert (ro[0]['txid'] == txnid)
        assert (isclose(ro[0]['amount'], 2.999512))
        assert (len(ro[0]['outputs']) == 2)
    def run_test(self):
        nodes = self.nodes

        nodes[0].extkeyimportmaster(
            'abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb'
        )
        assert (nodes[0].getwalletinfo()['total_balance'] == 100000)

        addr = 'pcwP4hTtaMb7n4urszBTsgxWLdNLU4yNGz'
        nodes[1].importaddress(addr, addr, True)

        ro = nodes[1].getaddressinfo(addr)
        assert (ro['ismine'] == False)
        assert (ro['iswatchonly'] == True)

        assert (isclose(nodes[1].getwalletinfo()['watchonly_balance'],
                        10000.0))
        assert (len(nodes[1].filtertransactions({'include_watchonly':
                                                 True})) == 1)

        ro = nodes[2].extkey(
            'importaccount', nodes[0].extkey('account', 'default',
                                             'true')['epkey'])
        nodes[2].extkey('setdefaultaccount', ro['account_id'])

        w0 = nodes[0].getwalletinfo()
        w2 = nodes[2].getwalletinfo()

        assert (w0['total_balance'] == w2['watchonly_total_balance'])
        assert (w0['txcount'] == w2['txcount'])
    def run_test(self):
        nodes = self.nodes

        nodes[0].extkeyimportmaster(
            'abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb'
        )
        assert (nodes[0].getwalletinfo()['total_balance'] == 100000)

        addr = 'pcwP4hTtaMb7n4urszBTsgxWLdNLU4yNGz'
        nodes[1].importaddress(addr, addr, True)

        ro = nodes[1].getaddressinfo(addr)
        assert (ro['ismine'] == False)
        assert (ro['iswatchonly'] == True)

        assert (isclose(nodes[1].getwalletinfo()['watchonly_balance'],
                        10000.0))
        assert (len(nodes[1].filtertransactions({'include_watchonly':
                                                 True})) == 1)

        ro = nodes[2].extkey(
            'importaccount', nodes[0].extkey('account', 'default',
                                             'true')['epkey'])
        nodes[2].extkey('setdefaultaccount', ro['account_id'])

        w0 = nodes[0].getwalletinfo()
        w2 = nodes[2].getwalletinfo()

        assert (w0['total_balance'] == w2['watchonly_total_balance'])
        assert (w0['txcount'] == w2['txcount'])

        sxaddr0 = nodes[0].getnewstealthaddress()
        sxaddrs = nodes[0].liststealthaddresses(True)
        addr_info = nodes[0].getaddressinfo(sxaddr0)
        scan_vk = sxaddrs[0]['Stealth Addresses'][0]['Scan Secret']
        spend_pk = sxaddrs[0]['Stealth Addresses'][0]['spend_public_key']
        spend_vk = sxaddrs[0]['Stealth Addresses'][0]['Spend Secret']
        ro = nodes[2].importstealthaddress(scan_vk, spend_pk)
        assert (ro['stealth_address'] == sxaddr0)
        assert (ro['watchonly'] == True)
        ro = nodes[2].getaddressinfo(sxaddr0)
        assert (ro['ismine'] == False)
        assert (ro['iswatchonly'] == True)

        txid = nodes[0].sendtoaddress(sxaddr0, 1.0)
        self.stakeBlocks(1)

        w0 = nodes[0].getwalletinfo()
        w2 = nodes[2].getwalletinfo()

        assert (w0['total_balance'] == w2['watchonly_total_balance'])
        assert (w0['txcount'] == w2['txcount'])

        nodes[2].importstealthaddress(scan_vk, spend_vk)
        ro = nodes[2].getaddressinfo(sxaddr0)
        assert (ro['ismine'] == True)
        assert (ro['iswatchonly'] == False)

        nodes[2].rescanblockchain(0)
Beispiel #5
0
    def run_test(self):
        nodes = self.nodes

        nodes[0].extkeyimportmaster(
            'abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb'
        )
        assert (nodes[0].getwalletinfo()['total_balance'] == 100000)

        nodes[1].extkeyimportmaster(
            'pact mammal barrel matrix local final lecture chunk wasp survey bid various book strong spread fall ozone daring like topple door fatigue limb olympic',
            '', 'true')
        nodes[1].getnewextaddress('lblExtTest')
        nodes[1].rescanblockchain()
        assert (nodes[1].getwalletinfo()['total_balance'] == 25000)

        nodes[2].extkeyimportmaster(nodes[2].mnemonic('new')['master'])

        address1 = nodes[1].getnewaddress()
        nodes[1].smsgaddlocaladdress(address1)
        nodes[2].smsgaddaddress(
            address1, nodes[1].smsglocalkeys()['wallet_keys'][0]['public_key'])

        address0 = nodes[0].getnewaddress()
        address1 = nodes[1].getnewaddress()
        nodes[0].smsgaddlocaladdress(address0)
        nodes[1].smsgaddaddress(
            address0, nodes[0].smsglocalkeys()['wallet_keys'][0]['public_key'])

        text = 'Some text to test'
        ro = nodes[1].smsgsend(address1, address0, text, True, 10)
        assert (ro['result'] == 'Sent.')
        assert (isclose(ro['fee'], 0.00159000))

        self.stakeBlocks(1, nStakeNode=1)

        self.log.info('Waiting for paid smsg to send')
        for i in range(20):
            txns = nodes[1].smsgdebug('dumpfundingtxids')
            if len(txns['txns']) < 1:
                time.sleep(1)
                continue
            break
        assert (len(txns['txns']) > 0)

        now = int(time.time())
        for i in range(len(nodes)):
            nodes[i].setmocktime(now + KEEP_FUNDING_TX_DATA, True)

        self.log.info('Waiting for rolling cache to expire')
        for i in range(60):
            txns = nodes[1].smsgdebug('dumpfundingtxids')
            if len(txns['txns']) > 0:
                time.sleep(1)
                continue
            break
        assert (len(txns['txns']) == 0)

        self.log.info('Done.')
Beispiel #6
0
    def run_test(self):
        nodes = self.nodes

        self.import_genesis_coins_a(nodes[0])
        self.import_genesis_coins_b(nodes[1])
        nodes[2].extkeyimportmaster(
            'sección grito médula hecho pauta posada nueve ebrio bruto buceo baúl mitad'
        )
        nodes[3].extkeyimportmaster(
            'sección grito médula hecho pauta posada nueve ebrio bruto buceo baúl mitad'
        )

        nodes[0].setwalletflag('avoid_reuse')
        nodes[1].setwalletflag('avoid_reuse')
        nodes[2].setwalletflag('avoid_reuse')

        assert_equal(nodes[0].getwalletinfo()["avoid_reuse"], True)
        assert_equal(nodes[1].getwalletinfo()["avoid_reuse"], True)
        assert_equal(nodes[2].getwalletinfo()["avoid_reuse"], True)
        assert_equal(nodes[3].getwalletinfo()["avoid_reuse"], False)

        addr_plain = nodes[2].getnewaddress()
        nodes[1].sendtoaddress(addr_plain, 1)

        self.sync_all()
        nodes[1].sendtoaddress(addr_plain, 2)

        self.sync_all()
        self.stakeBlocks(1)
        assert (isclose(nodes[2].getbalances()['mine']['trusted'], 3.0))

        nodes[2].sendtoaddress(nodes[1].getnewaddress(), 0.5)
        print(nodes[2].getbalances()['mine']['trusted'])
        assert (isclose(nodes[2].getbalances()['mine']['trusted'], 2.499464))

        nodes[1].sendtoaddress(addr_plain, 3)
        self.sync_all()
        self.stakeBlocks(1)

        assert (len(nodes[2].listunspent()) == 2)
        assert (isclose(nodes[2].getbalances()['mine']['trusted'], 2.499464))

        assert (len(nodes[3].listunspent()) == 2)
        assert (isclose(nodes[3].getbalances()['mine']['trusted'], 5.499464))
    def run_test(self):
        nodes = self.nodes

        self.import_genesis_coins_a(nodes[0])
        self.import_genesis_coins_b(nodes[1])

        nodes[2].extkeyimportmaster(nodes[2].mnemonic('new')['master'])

        address1 = nodes[1].getnewaddress()
        nodes[1].smsgaddlocaladdress(address1)
        nodes[2].smsgaddaddress(
            address1, nodes[1].smsglocalkeys()['wallet_keys'][0]['public_key'])

        address0 = nodes[0].getnewaddress()
        address1 = nodes[1].getnewaddress()
        nodes[0].smsgaddlocaladdress(address0)
        nodes[1].smsgaddaddress(
            address0, nodes[0].smsglocalkeys()['wallet_keys'][0]['public_key'])

        text = 'Some text to test'
        ro = nodes[1].smsgsend(address1, address0, text, True, 10)
        assert (ro['result'] == 'Sent.')
        assert (isclose(ro['fee'], 0.00159000))

        self.stakeBlocks(1, nStakeNode=1)

        self.log.info('Waiting for paid smsg to send')
        for i in range(20):
            txns = nodes[1].smsgdebug('dumpfundingtxids')
            if len(txns['txns']) < 1:
                time.sleep(1)
                continue
            break
        assert (len(txns['txns']) > 0)

        now = int(time.time())
        for i in range(len(nodes)):
            nodes[i].setmocktime(now + KEEP_FUNDING_TX_DATA, True)

        self.log.info('Waiting for rolling cache to expire')
        for i in range(60):
            txns = nodes[1].smsgdebug('dumpfundingtxids')
            if len(txns['txns']) > 0:
                time.sleep(1)
                continue
            break
        assert (len(txns['txns']) == 0)

        self.log.info('Done.')
Beispiel #8
0
    def run_test (self):
        tmpdir = self.options.tmpdir
        nodes = self.nodes

        # Stop staking
        ro = nodes[0].reservebalance(True, 10000000)
        ro = nodes[1].reservebalance(True, 10000000)

        ro = nodes[0].mnemonic('new');
        roImport0 = nodes[0].extkeyimportmaster(ro['master'])

        roImport1 = nodes[1].extkeyimportmaster('abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb')

        address0 = nodes[0].getnewaddress() # will be different each run
        address1 = nodes[1].getnewaddress()
        assert(address1 == 'pX9N6S76ZtA5BfsiJmqBbjaEgLMHpt58it')

        ro = nodes[0].smsglocalkeys()
        assert(len(ro['keys']) == 0)

        ro = nodes[0].smsgaddlocaladdress(address0)
        print(json.dumps(ro, indent=4, default=self.jsonDecimal))

        ro = nodes[0].smsglocalkeys()
        assert(len(ro['keys']) == 1)


        ro = nodes[1].smsgaddkey(address0, ro['keys'][0]['public_key'])
        assert(ro['result'] == 'Public key added to db.')

        ro = nodes[1].smsgsend(address1, address0, "['data':'test','value':1]", True, 4, True)
        print(json.dumps(ro, indent=4, default=self.jsonDecimal))
        assert(ro['result'] == 'Not Sent.')
        assert(isclose(ro['fee'], 0.00085800))



        ro = nodes[1].smsgsend(address1, address0, "['data':'test','value':1]", True, 4)
        print(json.dumps(ro, indent=4, default=self.jsonDecimal))

        self.stakeBlocks(1, nStakeNode=1)

        self.waitForExchange(1, 1, 0)

        ro = nodes[0].smsginbox()
        print(json.dumps(ro, indent=4, default=self.jsonDecimal))
        assert(len(ro['messages']) == 1)
    def run_test(self):
        nodes = self.nodes

        nodes[0].extkeyimportmaster(
            'abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb'
        )
        assert (nodes[0].getwalletinfo()['total_balance'] == 100000)

        nodes[1].extkeyimportmaster(nodes[1].mnemonic('new')['master'])

        addr1 = nodes[1].getnewaddress()
        addr2 = nodes[1].getnewstealthaddress()

        txnid = nodes[0].sendmany(
            dummy='',
            amounts={
                addr1: 1,
                addr2: 2
            },
            subtractfeefrom=[addr1],
            minconf=0,
        )
        self.sync_all()

        ro = nodes[1].filtertransactions()
        assert (ro[0]['txid'] == txnid)
        assert (isclose(ro[0]['amount'], 2.999512))
        assert (len(ro[0]['outputs']) == 2)

        extkey_list = nodes[0].extkey('list', True)
        assert (len(extkey_list) == 2)
        for k in extkey_list:
            evkey_info = nodes[0].extkey('info', k['evkey'])['key_info']
            epkey_info = nodes[0].extkey('info', k['epkey'])['key_info']
            assert (k['epkey'] == evkey_info['ext_public_key'])
            assert (evkey_info['depth'] == epkey_info['depth'])
            assert (evkey_info['parent_fingerprint'] ==
                    epkey_info['parent_fingerprint'])
            assert (evkey_info['child_index'] == epkey_info['child_index'])
            assert (evkey_info['chain_code'] == epkey_info['chain_code'])
            assert (evkey_info['pubkey'] == epkey_info['key'])
            assert (evkey_info['address'] == epkey_info['address'])
    def run_test(self):
        nodes = self.nodes

        self.import_genesis_coins_a(nodes[0])

        nodes[1].extkeyimportmaster(nodes[1].mnemonic('new')['master'])

        addr1 = nodes[1].getnewaddress()
        addr2 = nodes[1].getnewstealthaddress()

        txnid = nodes[0].sendmany(
            dummy='',
            amounts={
                addr1: 1,
                addr2: 2
            },
            subtractfeefrom=[addr1],
            minconf=0,
        )
        self.sync_all()

        ro = nodes[1].filtertransactions()
        assert (ro[0]['txid'] == txnid)
        assert (isclose(ro[0]['amount'], 2.999512))
        assert (len(ro[0]['outputs']) == 2)

        extkey_list = nodes[0].extkey('list', True)
        assert (len(extkey_list) == 2)
        for k in extkey_list:
            evkey_info = nodes[0].extkey('info', k['evkey'])['key_info']
            epkey_info = nodes[0].extkey('info', k['epkey'])['key_info']
            assert (k['epkey'] == evkey_info['ext_public_key'])
            assert (evkey_info['depth'] == epkey_info['depth'])
            assert (evkey_info['parent_fingerprint'] ==
                    epkey_info['parent_fingerprint'])
            assert (evkey_info['child_index'] == epkey_info['child_index'])
            assert (evkey_info['chain_code'] == epkey_info['chain_code'])
            assert (evkey_info['pubkey'] == epkey_info['key'])
            assert (evkey_info['address'] == epkey_info['address'])
    def run_test(self):
        nodes = self.nodes

        # Stop staking
        for i in range(len(nodes)):
            nodes[i].reservebalance(True, 10000000)

        nodes[0].extkeyimportmaster(
            'abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb'
        )
        assert (nodes[0].getwalletinfo()['total_balance'] == 100000)

        addr = 'pcwP4hTtaMb7n4urszBTsgxWLdNLU4yNGz'
        nodes[1].importaddress(addr, addr, True)

        ro = nodes[1].getaddressinfo(addr)
        assert (ro['ismine'] == False)
        assert (ro['iswatchonly'] == True)

        ro = nodes[1].getwalletinfo()
        assert (isclose(ro['watchonly_balance'], 10000.0))

        ro = nodes[1].filtertransactions({'include_watchonly': True})
        assert (len(ro) == 1)
Beispiel #12
0
 def run_test(self):
     node = self.nodes[0]
     node1 = self.nodes[1]
     
     # stop staking
     ro = node.reservebalance(True, 10000000)
     
     ro = node.extkeyimportmaster("abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb")
     assert(ro['account_id'] == 'aaaZf2qnNr5T7PWRmqgmusuu5ACnBcX2ev')
     
     #ro = node.extkey("list", "true")
     #print(json.dumps(ro, indent=4))
     
     ro = node.getinfo()
     assert(ro['total_balance'] == 100000)
     
     
     # test reserve balance
     ro = node.getwalletinfo()
     assert(isclose(ro['reserve'], 10000000.0))
     
     ro = node.reservebalance(True, 100)
     assert(ro['reserve'] == True)
     assert(isclose(ro['amount'], 100.0))
     
     ro = node.getwalletinfo()
     assert(ro['reserve'] == 100)
     
     ro = node.reservebalance(False)
     assert(ro['reserve'] == False)
     assert(ro['amount'] == 0)
     
     ro = node.getwalletinfo()
     assert(ro['reserve'] == 0)
     
     assert(self.wait_for_height(node, 1))
     
     # stop staking
     ro = node.reservebalance(True, 10000000)
     
     oRoot1 = node1.mnemonic("new")
     #print(oRoot1['master'])
     
     ro = node1.extkeyimportmaster(oRoot1['master'])
     #print(ro)
     
     addrTo = node1.getnewaddress()
     #print(addrTo)
     
     txnHash = node.sendtoaddress(addrTo, 10)
     print(txnHash)
     
     ro = node.getmempoolentry(txnHash)
     #print("getmempoolentry",ro)
     assert(ro['height'] == 1)
     
     ro = node.listtransactions()
     #print("listtransactions",ro)
     #print(json.dumps(ro, indent=4))
     
     fPass = False
     for txl in ro:
         #print(txl['address'], txl['amount'])
         if txl['address'] == addrTo and txl['amount'] == -10 and txl['category'] == 'send':
             fPass = True
     assert(fPass), "node0, listtransactions failed."
         
     
     assert(self.wait_for_mempool(node1, txnHash))
     
     ro = node1.listtransactions()
     #print("node1 listtransactions",ro)
     assert(len(ro) == 1)
     assert(ro[0]['address'] == addrTo)
     assert(ro[0]['amount'] == 10)
     assert(ro[0]['category'] == 'receive')
     
     
     # start staking
     ro = node.reservebalance(False)
     
     assert(self.wait_for_height(node, 2))
     
     # stop staking
     ro = node.reservebalance(True, 10000000)
     
     block2_hash = node.getblockhash(2)
     
     ro = node.getblock(block2_hash)
     assert(txnHash in ro['tx'])
Beispiel #13
0
    def run_test(self):
        nodes = self.nodes

        # stop staking
        ro = nodes[0].reservebalance(True, 10000000)
        ro = nodes[1].reservebalance(True, 10000000)

        ro = nodes[0].extkeyimportmaster(
            "abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb"
        )
        assert (ro['account_id'] == 'aaaZf2qnNr5T7PWRmqgmusuu5ACnBcX2ev')

        ro = nodes[0].getinfo()
        assert (ro['total_balance'] == 100000)

        #txnHashes = []
        #assert(self.wait_for_height(node, 1))

        addrs = []
        pubkeys = []

        ro = nodes[0].getnewaddress()
        addrs.append(ro)
        ro = nodes[0].validateaddress(ro)
        pubkeys.append(ro['pubkey'])

        ro = nodes[0].getnewaddress()
        addrs.append(ro)
        ro = nodes[0].validateaddress(ro)
        pubkeys.append(ro['pubkey'])

        ro = nodes[1].extkeyimportmaster(
            "drip fog service village program equip minute dentist series hawk crop sphere olympic lazy garbage segment fox library good alley steak jazz force inmate"
        )

        ro = nodes[1].getnewaddress()
        addrs.append(ro)
        ro = nodes[1].validateaddress(ro)
        pubkeys.append(ro['pubkey'])

        mn2 = nodes[2].mnemonic("new", "", "french")

        ro = nodes[2].extkeyimportmaster(mn2['mnemonic'])

        ro = nodes[2].getnewaddress()
        addrs.append(ro)
        ro = nodes[2].validateaddress(ro)
        pubkeys.append(ro['pubkey'])

        #v = '["'+addrs[0]+'","'+addrs[1]+'","'+pubkeys[2]+'","'+pubkeys[3]+'"]'
        #v = [addrs[0],addrs[1],pubkeys[2],pubkeys[3]]
        v = [addrs[0], addrs[1], pubkeys[2]]
        #print("v ", v)
        ro = nodes[0].addmultisigaddress(2, v)
        msAddr = ro
        #print("msAddr ", msAddr)

        ro = nodes[0].validateaddress(msAddr)
        #print("ro ", ro)
        assert (ro['isscript'] == True)
        scriptPubKey = ro['scriptPubKey']
        redeemScript = ro['hex']

        ro = nodes[0].sendtoaddress(msAddr, 10)
        mstxid = ro
        #print("mstxid ", mstxid)

        ro = nodes[0].gettransaction(mstxid)
        #print("gettransaction ", ro)
        hexfund = ro['hex']

        ro = nodes[0].decoderawtransaction(hexfund)
        #print("decoderawtransaction hexfund ", ro)

        fundscriptpubkey = ''
        fundoutid = -1
        for vout in ro['vout']:
            if not isclose(vout['value'], 10.0):
                continue

            fundoutid = vout['n']
            fundscriptpubkey = vout['scriptPubKey']['hex']

        assert (fundoutid >= 0), "fund output not found"
        #print("\nfundscriptpubkey", fundscriptpubkey)
        #print("fundoutid", fundoutid)

        addrTo = nodes[2].getnewaddress()
        #print("addrTo ", addrTo)

        inputs = [{ \
            "txid":mstxid,\
            "vout":fundoutid, \
            "scriptPubKey":fundscriptpubkey, \
            "redeemScript":redeemScript,
            "amount":10.0,
            }]

        outputs = {addrTo: 2, msAddr: 7.99}

        ro = nodes[0].createrawtransaction(inputs, outputs)
        hexRaw = ro
        #print("createrawtransaction ", hexRaw)

        ro = nodes[0].decoderawtransaction(hexRaw)
        #print("decoderawtransaction hexRaw ", ro)

        ro = nodes[0].dumpprivkey(addrs[0])
        #print("dumpprivkey ", ro)
        vk0 = ro

        signkeys = [
            vk0,
        ]
        ro = nodes[0].signrawtransaction(hexRaw, inputs, signkeys)
        #print("signrawtransaction ", ro)
        hexRaw1 = ro['hex']

        vk1 = nodes[0].dumpprivkey(addrs[1])
        signkeys = [
            vk1,
        ]
        ro = nodes[0].signrawtransaction(hexRaw1, inputs, signkeys)
        #print("signrawtransaction ", ro)
        hexRaw2 = ro['hex']
        """
        ro = nodes[0].decoderawtransaction(hexRaw2)
        print("decoderawtransaction ", ro)
        txspendid = ro['txid']
        """

        txnid_spendMultisig = nodes[0].sendrawtransaction(hexRaw2)
        #print("sendrawtransaction ", txnid_spendMultisig)

        # start staking
        ro = nodes[0].walletsettings('stakelimit', {'height': 1})
        ro = nodes[0].reservebalance(False)
        assert (self.wait_for_height(nodes[0], 1))
        block1_hash = nodes[0].getblockhash(1)
        ro = nodes[0].getblock(block1_hash)

        print("txnid_spendMultisig ", txnid_spendMultisig)
        print("ro ", ro)
        assert (txnid_spendMultisig in ro['tx'])
Beispiel #14
0
    def run_test(self):
        nodes = self.nodes

        ro = nodes[0].extkeyimportmaster('abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb')
        assert(ro['account_id'] == 'aaaZf2qnNr5T7PWRmqgmusuu5ACnBcX2ev')
        assert(nodes[0].getwalletinfo()['total_balance'] == 100000)

        addrs = []
        pubkeys = []

        ro = nodes[0].getnewaddress()
        addrs.append(ro)
        pubkeys.append(nodes[0].getaddressinfo(ro)['pubkey'])

        ro = nodes[0].getnewaddress()
        addrs.append(ro)
        pubkeys.append(nodes[0].getaddressinfo(ro)['pubkey'])

        nodes[1].extkeyimportmaster('drip fog service village program equip minute dentist series hawk crop sphere olympic lazy garbage segment fox library good alley steak jazz force inmate')
        nodes[2].extkeyimportmaster(nodes[2].mnemonic('new', '', 'french')['mnemonic'])

        ro = nodes[1].getnewaddress()
        addrs.append(ro)
        pubkeys.append(nodes[1].getaddressinfo(ro)['pubkey'])

        ro = nodes[2].getnewaddress()
        addrs.append(ro)
        pubkeys.append(nodes[2].getaddressinfo(ro)['pubkey'])


        v = [addrs[0], addrs[1], pubkeys[2]]
        msAddr = nodes[0].addmultisigaddress(2, v)['address']

        ro = nodes[0].getaddressinfo(msAddr)
        assert(ro['isscript'] == True)
        scriptPubKey = ro['scriptPubKey']
        redeemScript = ro['hex']


        mstxid = nodes[0].sendtoaddress(msAddr, 10)
        hexfund = nodes[0].gettransaction(mstxid)['hex']
        ro = nodes[0].decoderawtransaction(hexfund)

        fundscriptpubkey = ''
        fundoutid = -1
        for vout in ro['vout']:
            if not isclose(vout['value'], 10.0):
                continue

            fundoutid = vout['n']
            fundscriptpubkey = vout['scriptPubKey']['hex']
        assert(fundoutid >= 0), "fund output not found"


        addrTo = nodes[2].getnewaddress()

        inputs = [{
            "txid":mstxid,
            "vout":fundoutid,
            "scriptPubKey":fundscriptpubkey,
            "redeemScript":redeemScript,
            "amount":10.0,
            }]

        outputs = {addrTo:2, msAddr:7.99}

        hexRaw = nodes[0].createrawtransaction(inputs, outputs)

        vk0 = nodes[0].dumpprivkey(addrs[0])
        signkeys = [vk0,]
        hexRaw1 = nodes[0].signrawtransactionwithkey(hexRaw, signkeys, inputs)['hex']

        vk1 = nodes[0].dumpprivkey(addrs[1])
        signkeys = [vk1,]
        hexRaw2 = nodes[0].signrawtransactionwithkey(hexRaw1, signkeys, inputs)['hex']

        txnid_spendMultisig = nodes[0].sendrawtransaction(hexRaw2)


        self.stakeBlocks(1)
        block1_hash = nodes[0].getblockhash(1)
        ro = nodes[0].getblock(block1_hash)
        assert(txnid_spendMultisig in ro['tx'])


        msAddr256 = nodes[0].addmultisigaddress(2, v, "", False, True)['address']
        ro = nodes[0].getaddressinfo(msAddr256)
        assert(ro['isscript'] == True)

        msAddr256 = nodes[0].addmultisigaddress(2, v, "", True, True)['address']
        assert(msAddr256 == "tpj1vtll9wnsd7dxzygrjp2j5jr5tgrjsjmj3vwjf7vf60f9p50g5ddqmasmut")

        ro = nodes[0].getaddressinfo(msAddr256)
        assert(ro['isscript'] == True)
        scriptPubKey = ro['scriptPubKey']
        redeemScript = ro['hex']

        mstxid2 = nodes[0].sendtoaddress(msAddr256, 9)
        hexfund = nodes[0].gettransaction(mstxid2)['hex']
        ro = nodes[0].decoderawtransaction(hexfund)

        fundscriptpubkey = ''
        fundoutid = -1
        for vout in ro['vout']:
            if not isclose(vout['value'], 9.0):
                continue
            fundoutid = vout['n']
            fundscriptpubkey = vout['scriptPubKey']['hex']
            assert('OP_SHA256' in vout['scriptPubKey']['asm'])
        assert(fundoutid >= 0), "fund output not found"


        inputs = [{
            "txid":mstxid2,
            "vout":fundoutid,
            "scriptPubKey":fundscriptpubkey,
            "redeemScript":redeemScript,
            "amount":9.0, # Must specify amount
            }]

        addrTo = nodes[2].getnewaddress()
        outputs = {addrTo:2, msAddr256:6.99}

        hexRaw = nodes[0].createrawtransaction(inputs, outputs)

        vk0 = nodes[0].dumpprivkey(addrs[0])
        signkeys = [vk0,]
        hexRaw1 = nodes[0].signrawtransactionwithkey(hexRaw, signkeys, inputs)['hex']

        vk1 = nodes[0].dumpprivkey(addrs[1])
        signkeys = [vk1,]
        hexRaw2 = nodes[0].signrawtransactionwithkey(hexRaw1, signkeys, inputs)['hex']

        txnid_spendMultisig2 = nodes[0].sendrawtransaction(hexRaw2)

        self.stakeBlocks(1)
        block2_hash = nodes[0].getblockhash(2)
        ro = nodes[0].getblock(block2_hash)
        assert(txnid_spendMultisig2 in ro['tx'])

        ro = nodes[0].getaddressinfo(msAddr)
        scriptPubKey = ro['scriptPubKey']
        redeemScript = ro['hex']

        opts = {"recipe":"abslocktime","time":946684800,"addr":msAddr}
        scriptTo = nodes[0].buildscript(opts)['hex']

        outputs = [{'address':'script', 'amount':8, 'script':scriptTo},]
        mstxid3 = nodes[0].sendtypeto('part', 'part', outputs)

        hexfund = nodes[0].gettransaction(mstxid3)['hex']
        ro = nodes[0].decoderawtransaction(hexfund)

        fundscriptpubkey = ''
        fundoutid = -1
        for vout in ro['vout']:
            if not isclose(vout['value'], 8.0):
                continue
            fundoutid = vout['n']
            fundscriptpubkey = vout['scriptPubKey']['hex']
            assert('OP_CHECKLOCKTIMEVERIFY' in vout['scriptPubKey']['asm'])
        assert(fundoutid >= 0), "fund output not found"


        inputs = [{
            "txid":mstxid3,
            "vout":fundoutid,
            "scriptPubKey":fundscriptpubkey,
            "redeemScript":redeemScript,
            "amount":8.0, # Must specify amount
            }]

        addrTo = nodes[2].getnewaddress()
        outputs = {addrTo:2, msAddr:5.99}
        locktime = 946684801

        hexRaw = nodes[0].createrawtransaction(inputs, outputs, locktime)

        vk0 = nodes[0].dumpprivkey(addrs[0])
        signkeys = [vk0,]
        hexRaw1 = nodes[0].signrawtransactionwithkey(hexRaw, signkeys, inputs)['hex']

        vk1 = nodes[0].dumpprivkey(addrs[1])
        signkeys = [vk1,]
        hexRaw2 = nodes[0].signrawtransactionwithkey(hexRaw1, signkeys, inputs)['hex']

        txnid_spendMultisig3 = nodes[0].sendrawtransaction(hexRaw2)

        self.stakeBlocks(1)
        block3_hash = nodes[0].getblockhash(3)
        ro = nodes[0].getblock(block3_hash)
        assert(txnid_spendMultisig3 in ro['tx'])


        self.log.info("Coldstake script")

        stakeAddr = nodes[0].getnewaddress()
        addrTo = nodes[0].getnewaddress()

        opts = {"recipe":"ifcoinstake","addrstake":stakeAddr,"addrspend":msAddr}
        scriptTo = nodes[0].buildscript(opts)['hex']

        outputs = [{ 'address':'script', 'amount':1, 'script':scriptTo }]
        txFundId = nodes[0].sendtypeto('part', 'part', outputs)
        hexfund = nodes[0].gettransaction(txFundId)['hex']

        ro = nodes[0].decoderawtransaction(hexfund)
        for vout in ro['vout']:
            if not isclose(vout['value'], 1.0):
                continue
            fundoutn = vout['n']
            fundscriptpubkey = vout['scriptPubKey']['hex']
            assert('OP_ISCOINSTAKE' in vout['scriptPubKey']['asm'])
        assert(fundoutn >= 0), "fund output not found"

        ro = nodes[0].getaddressinfo(msAddr)
        assert(ro['isscript'] == True)
        scriptPubKey = ro['scriptPubKey']
        redeemScript = ro['hex']

        inputs = [{
            'txid': txFundId,
            'vout': fundoutn,
            'scriptPubKey': fundscriptpubkey,
            'redeemScript': redeemScript,
            'amount': 1.0,
            }]

        outputs = {addrTo:0.99}
        hexRaw = nodes[0].createrawtransaction(inputs, outputs)

        sig0 = nodes[0].createsignaturewithwallet(hexRaw, inputs[0], addrs[0])
        sig1 = nodes[0].createsignaturewithwallet(hexRaw, inputs[0], addrs[1])


        self.log.info('Test createsignaturewithwallet without providing prevout details')
        outpoint_only = { 'txid': txFundId, 'vout': fundoutn }
        sig1_check1 = nodes[0].createsignaturewithwallet(hexRaw, outpoint_only, addrs[1])
        assert(sig1 == sig1_check1)
        addr1_privkey = nodes[0].dumpprivkey(addrs[1])
        sig1_check2 = nodes[0].createsignaturewithkey(hexRaw, inputs[0], addr1_privkey)
        assert(sig1 == sig1_check2)
        try:
            sig1_check3 = nodes[0].createsignaturewithkey(hexRaw, outpoint_only, addr1_privkey)
            assert(False), 'createsignaturewithkey passed with no redeemscript'
        except JSONRPCException as e:
            assert('"redeemScript" is required' in e.error['message'])
        outpoint_only['redeemScript'] = redeemScript
        sig1_check3 = nodes[0].createsignaturewithkey(hexRaw, outpoint_only, addr1_privkey)
        assert(sig1 == sig1_check3)


        witnessStack = [
            "",
            sig0,
            sig1,
            redeemScript,
        ]
        hexRawSigned = nodes[0].tx([hexRaw,'witness=0:'+ ':'.join(witnessStack)])

        ro = nodes[0].verifyrawtransaction(hexRawSigned)
        assert(ro['complete'] == True)

        ro = nodes[0].signrawtransactionwithwallet(hexRaw)
        assert(ro['complete'] == True)
        assert(ro['hex'] == hexRawSigned)

        txid = nodes[0].sendrawtransaction(hexRawSigned)

        self.stakeBlocks(1)
        block4_hash = nodes[0].getblockhash(4)
        ro = nodes[0].getblock(block4_hash)
        assert(txid in ro['tx'])


        self.log.info("Test combinerawtransaction")
        unspent0 = nodes[0].listunspent()
        unspent2 = nodes[2].listunspent()

        inputs = [unspent0[0], unspent2[0]]
        outputs = {nodes[0].getnewaddress() : satoshi_round(unspent0[0]['amount'] + unspent2[0]['amount'] - Decimal(0.1))}
        rawtx = nodes[0].createrawtransaction(inputs, outputs)

        rawtx0 = nodes[0].signrawtransactionwithwallet(rawtx)
        assert(rawtx0['complete'] == False)

        rawtx2 = nodes[2].signrawtransactionwithwallet(rawtx0['hex']) # Keeps signature from node0
        assert(rawtx2['complete'])

        rawtx2 = nodes[2].signrawtransactionwithwallet(rawtx)
        assert(rawtx2['complete'] == False)

        rawtx_complete = nodes[0].combinerawtransaction([rawtx0['hex'], rawtx2['hex']])
        nodes[0].sendrawtransaction(rawtx_complete)
    def run_test(self):
        nodes = self.nodes

        self.import_genesis_coins_a(nodes[0])

        nodes[1].extkeyimportmaster(nodes[1].mnemonic('new')['master'])
        nodes[2].extkeyimportmaster(
            'sección grito médula hecho pauta posada nueve ebrio bruto buceo baúl mitad'
        )

        addrTo256 = nodes[2].getnewaddress('256 test', 'True', 'False', 'True')
        assert (
            addrTo256 ==
            'tpl16a6gjrpfwkqrf8fveajkek07l6a0pxgaayk4y6gyq9zlkxxk2hqqmld6tr')
        [nodes[0].sendtoaddress(addrTo256, 1000) for i in range(4)]

        self.log.info('Test reserve balance')
        nodes[0].walletsettings('stakelimit', {'height': 1})
        assert (isclose(nodes[0].getwalletinfo()['reserve'], 10000000.0))

        ro = nodes[0].reservebalance(True, 100)
        assert (ro['reserve'] == True)
        assert (isclose(ro['amount'], 100.0))

        assert (nodes[0].getwalletinfo()['reserve'] == 100)

        ro = nodes[0].reservebalance(False)
        assert (ro['reserve'] == False)
        assert (ro['amount'] == 0)

        assert (nodes[0].getwalletinfo()['reserve'] == 0)

        assert (self.wait_for_height(nodes[0], 1))
        nodes[0].reservebalance(True, 10000000)

        addrTo = nodes[1].getnewaddress()
        txnHash = nodes[0].sendtoaddress(addrTo, 10)
        assert (nodes[0].getmempoolentry(txnHash)['height'] == 1)

        ro = nodes[0].listtransactions()
        fPass = False
        for txl in ro:
            if txl['address'] == addrTo and txl['amount'] == -10 and txl[
                    'category'] == 'send':
                fPass = True
                break
        assert (fPass), 'node0, listtransactions failed.'

        assert (self.wait_for_mempool(nodes[1], txnHash))

        ro = nodes[1].listtransactions()
        assert (len(ro) == 1)
        assert (ro[0]['address'] == addrTo)
        assert (ro[0]['amount'] == 10)
        assert (ro[0]['category'] == 'receive')

        pos_difficulty1 = nodes[0].getposdifficulty()
        self.stakeBlocks(1)
        pos_difficulty = nodes[0].getposdifficulty(1)
        assert (pos_difficulty == pos_difficulty1)

        block2_hash = nodes[0].getblockhash(2)
        ro = nodes[0].getblock(block2_hash)
        assert (txnHash in ro['tx'])

        addrReward = nodes[0].getnewaddress()
        ro = nodes[0].walletsettings('stakingoptions',
                                     {'rewardaddress': addrReward})
        assert (ro['stakingoptions']['rewardaddress'] == addrReward)

        addrReward_stakeonly = nodes[0].validateaddress(
            addrReward, True)['stakeonly_address']
        try:
            ro = nodes[0].walletsettings(
                'stakingoptions', {'rewardaddress': addrReward_stakeonly})
            raise AssertionError('Should have failed.')
        except JSONRPCException as e:
            assert ('Invalid rewardaddress' in e.error['message'])

        self.stakeBlocks(1)
        block3_hash = nodes[0].getblockhash(3)
        coinstakehash = nodes[0].getblock(block3_hash)['tx'][0]
        ro = nodes[0].getrawtransaction(coinstakehash, True)

        fFound = False
        for vout in ro['vout']:
            try:
                addr0 = vout['scriptPubKey']['addresses'][0]
            except:
                continue
            if addr0 == addrReward:
                fFound = True
                assert (vout['valueSat'] == 39637)
                break
        assert (fFound)

        self.log.info('Test staking pkh256 outputs')
        nodes[2].walletsettings('stakelimit', {'height': 1})
        nodes[2].reservebalance(False)
        assert (nodes[2].getstakinginfo()['weight'] == 400000000000)

        self.stakeBlocks(1, nStakeNode=2)

        self.log.info('Test rewardaddress')
        addrRewardExt = nodes[0].getnewextaddress()
        ro = nodes[0].walletsettings('stakingoptions',
                                     {'rewardaddress': addrRewardExt})
        assert (ro['stakingoptions']['rewardaddress'] == addrRewardExt)
        self.stakeBlocks(1)
        block5_hash = nodes[0].getblockhash(5)
        coinstakehash = nodes[0].getblock(block5_hash)['tx'][0]
        ro = nodes[0].getrawtransaction(coinstakehash, True)

        fFound = False
        for vout in ro['vout']:
            try:
                addr0 = vout['scriptPubKey']['addresses'][0]
                ro = nodes[0].getaddressinfo(addr0)
                if ro['from_ext_address_id'] == 'xXZRLYvJgbJyrqJhgNzMjEvVGViCdGmVAt':
                    assert (addr0 == 'pgaKYsNmHTuQB83FguN44WW4ADKmwJwV7e')
                    fFound = True
                    assert (vout['valueSat'] == 39637)
            except:
                continue
        assert (fFound)

        addrRewardSx = nodes[0].getnewstealthaddress()
        ro = nodes[0].walletsettings('stakingoptions',
                                     {'rewardaddress': addrRewardSx})
        assert (ro['stakingoptions']['rewardaddress'] == addrRewardSx)
        self.stakeBlocks(1)
        block6_hash = nodes[0].getblockhash(6)
        coinstakehash = nodes[0].getblock(block6_hash)['tx'][0]
        ro = nodes[0].getrawtransaction(coinstakehash, True)

        fFound = False
        for vout in ro['vout']:
            try:
                addr0 = vout['scriptPubKey']['addresses'][0]
                ro = nodes[0].getaddressinfo(addr0)
                if ro['from_stealth_address'] == addrRewardSx:
                    fFound = True
                    assert (vout['valueSat'] == 39637)
            except:
                continue
        assert (fFound)

        self.log.info('Test clearing rewardaddress')
        ro = nodes[0].walletsettings('stakingoptions', {})

        self.stakeBlocks(1)
        coinstakehash = nodes[0].getblock(nodes[0].getblockhash(7))['tx'][0]
        ro = nodes[0].getrawtransaction(coinstakehash, True)
        stake_kernel_txid = ro['vin'][0]['txid']
        stake_kernel_n = ro['vin'][0]['vout']

        for output in ro['vout'][1:]:
            assert (output['type'] == 'standard')
            assert (output['value'] > 1.0)

        unspent = nodes[0].listunspent()
        for output in unspent:
            assert (output['txid'] != stake_kernel_txid
                    or output['vout'] != stake_kernel_n)

        self.log.info('Test that orphaned coinstake inputs are abandoned')
        nodes[0].rewindchain(6)
        txns = nodes[0].filtertransactions()

        found_orphaned_coinstake = False
        for tx in txns:
            if tx['txid'] == coinstakehash:
                found_orphaned_coinstake = True
                assert (tx['category'] == 'orphaned_stake')
                assert (tx['abandoned'] == True)
        assert (found_orphaned_coinstake)

        unspent = nodes[0].listunspent()
        found_stake_kernel = False
        for output in unspent:
            if output['txid'] == stake_kernel_txid and output[
                    'vout'] == stake_kernel_n:
                found_stake_kernel = True
                break
        assert (found_stake_kernel)
Beispiel #16
0
    def run_test(self):
        node = self.nodes[0]
        node1 = self.nodes[1]
        node2 = self.nodes[2]

        # Stop staking
        ro = node.reservebalance(True, 10000000)
        ro = node1.reservebalance(True, 10000000)
        ro = node2.reservebalance(True, 10000000)

        ro = node.extkeyimportmaster(
            "abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb"
        )
        assert (ro['account_id'] == 'aaaZf2qnNr5T7PWRmqgmusuu5ACnBcX2ev')

        #ro = node.extkey("list", "true")
        #print(json.dumps(ro, indent=4))

        ro = node.getinfo()
        assert (ro['total_balance'] == 100000)

        txnHashes = []

        ro = node1.extkeyimportmaster(
            "drip fog service village program equip minute dentist series hawk crop sphere olympic lazy garbage segment fox library good alley steak jazz force inmate"
        )

        sxAddrTo1 = node1.getnewstealthaddress()
        assert (
            sxAddrTo1 ==
            'TetbYTGv5LiqyFiUD3a5HHbpSinQ9KiRYDGAMvRzPfz4RnHMbKGAwDr1fjLGJ5Eqg1XDwpeGyqWMiwdK3qM3zKWjzHNpaatdoHVzzA'
        )

        txnHash = node.sendtoaddress(sxAddrTo1, 1)
        txnHashes.append(txnHash)

        assert (self.wait_for_mempool(node1, txnHash))

        ro = node1.listtransactions()
        assert (len(ro) == 1)
        assert (ro[0]['stealth_address'] == sxAddrTo1)
        assert (isclose(ro[0]['amount'], 1))

        # Test imported sx address
        ro = node1.importstealthaddress(
            "7pJLDnLxoYmkwpMNDX69dWGT7tuZ45LHgMajQDD8JrXb9LHmzfBA",
            "7uk8ELaUsop2r4vMg415wEGBfRd1MmY7JiXX7CRhwuwq5PaWXQ9N",
            "importedAddr", "5", "0xaaaa")
        sxAddrTo2 = '32eEcCuGkGjP82BTF3kquiCDjZWmZiyhqe7C6isbv6MJZSKAeWNx5g436QuhGNc6DNYpboDm3yNiqYmTmkg76wYr5JCKgdEUPqLCWaMW'
        assert (ro['stealth_address'] == sxAddrTo2)

        ro = node1.liststealthaddresses()
        sro = str(ro)
        assert (sxAddrTo1 in sro)
        assert (sxAddrTo2 in sro)

        txnHash = node.sendtoaddress(sxAddrTo2, 0.2)
        txnHashes.append(txnHash)

        assert (self.wait_for_mempool(node1, txnHash))

        ro = node1.listtransactions()

        sxAddrTo3 = node1.getnewstealthaddress()
        assert (
            sxAddrTo3 ==
            'TetcV5ZNzM6hT6Tz8Vc5t6FM74nojY8oFdeCnPr9Vyx6QNqrR7LKy87aZ1ytGGqBSAJ9CpWDj81pPwYPYHjg6Ks8GKXvGyLoBdTDYQ'
        )

        txnHash = node.sendtoaddress(sxAddrTo3, 0.3, '', '', False,
                                     'narration test')
        txnHashes.append(txnHash)

        assert (self.wait_for_mempool(node1, txnHash))

        ro = node1.listtransactions()
        assert (ro[-1]['stealth_address'] == sxAddrTo3)
        assert (isclose(ro[-1]['amount'], 0.3))
        assert ('narration test' in str(ro[-1]))

        # - Test encrypted narrations on sent wtx (from sending node)
        ro = node.listtransactions()
        assert ('narration test' in str(ro[-1]))

        oRoot2 = node2.mnemonic("new")
        assert ('mnemonic' in oRoot2)

        ro = node2.extkeyimportmaster(oRoot2['mnemonic'])
        assert ('Success.' in ro['result'])

        sxAddrTo2_1 = node2.getnewstealthaddress('lbl test 3 bits', "3")

        ro = node2.importstealthaddress(
            "7uk8ELaUsop2r4vMg415wEGBfRd1MmY7JiXX7CRhwuwq5PaWXQ9N",  # secrets are backwards
            "7pJLDnLxoYmkwpMNDX69dWGT7tuZ45LHgMajQDD8JrXb9LHmzfBA",
            "importedAddr",
            "9",
            "0xabcd")
        sxAddrTo2_2 = '9xFM875J9ApSymuT9Yuz6mqmy36JE1tNANGZmvS6hXFoQaV7ZLx8ZGjT2WULbuxwY4EsmNhHivLd4f8SRkxSjGjUED51SA4WqJRysUk9f'
        assert (ro['stealth_address'] == sxAddrTo2_2)

        ro = node2.encryptwallet("qwerty234")
        assert ("wallet encrypted" in ro)

        self.bitcoind_processes[2].wait(
            timeout=BITCOIND_PROC_WAIT_TIMEOUT
        )  # wait until encryptwallet has shut down node
        # Restart node 2
        self.nodes[2] = self.start_node(2, self.options.tmpdir,
                                        self.extra_args[2])
        node2 = self.nodes[2]
        ro = node2.walletpassphrase("qwerty234", 300)
        ro = node2.reservebalance(True, 10000000)
        ro = node2.walletlock()
        connect_nodes_bi(self.nodes, 0, 2)

        # Test send to locked wallet
        txnHash = node.sendtoaddress(sxAddrTo2_1, 0.4, '', '', False,
                                     'narration test node2')
        txnHashes.append(txnHash)

        assert (self.wait_for_mempool(node2, txnHash))

        ro = node2.listtransactions()
        assert (isclose(ro[-1]['amount'], 0.4))
        assert ('narration test node2' in str(ro[-1]))

        txnHash = node.sendtoaddress(sxAddrTo2_2, 0.5, '', '', False, 'test 5')
        txnHashes.append(txnHash)

        assert (self.wait_for_mempool(node2, txnHash))

        ro = node2.listtransactions()
        assert (isclose(ro[-1]['amount'], 0.5))
        assert ('test 5' in str(ro[-1]))

        txnHash = node.sendtoaddress(sxAddrTo2_2, 0.6, '', '', False, 'test 6')
        txnHashes.append(txnHash)

        assert (self.wait_for_mempool(node2, txnHash))

        ro = node2.listtransactions()
        assert (isclose(ro[-1]['amount'], 0.6))
        assert ('test 6' in str(ro[-1]))

        ro = node2.walletpassphrase("qwerty234", 300)

        # Start staking
        ro = node.walletsettings('stakelimit', {'height': 1})
        ro = node.reservebalance(False)

        assert (self.wait_for_height(node, 1))

        block1_hash = node.getblockhash(1)
        ro = node.getblock(block1_hash)
        for txnHash in txnHashes:
            assert (txnHash in ro['tx'])

        self.sync_all()
        ro = node2.getwalletinfo()
        print("node2.getwalletinfo() ", ro)

        txnHash = node2.sendtoaddress(sxAddrTo3, 1.4, '', '', False,
                                      'node2 -> node1')
        txnHashes.append(txnHash)

        assert (self.wait_for_mempool(node1, txnHash))
        ro = node1.listtransactions()
        assert (isclose(ro[-1]['amount'], 1.4))
        assert ('node2 -> node1' in str(ro[-1]))
Beispiel #17
0
    def run_test(self):
        nodes = self.nodes

        # Stop staking
        ro = nodes[0].reservebalance(True, 10000000)
        ro = nodes[1].reservebalance(True, 10000000)

        ro = nodes[0].extkeyimportmaster(
            "abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb"
        )
        assert (ro['account_id'] == 'aaaZf2qnNr5T7PWRmqgmusuu5ACnBcX2ev')

        ro = nodes[0].getinfo()
        assert (ro['total_balance'] == 100000)

        txnHashes = []

        #assert(self.wait_for_height(node, 1))

        ro = nodes[1].extkeyimportmaster(
            "drip fog service village program equip minute dentist series hawk crop sphere olympic lazy garbage segment fox library good alley steak jazz force inmate"
        )
        sxAddrTo1_1 = nodes[1].getnewstealthaddress()
        assert (
            sxAddrTo1_1 ==
            'TetbYTGv5LiqyFiUD3a5HHbpSinQ9KiRYDGAMvRzPfz4RnHMbKGAwDr1fjLGJ5Eqg1XDwpeGyqWMiwdK3qM3zKWjzHNpaatdoHVzzA'
        )

        txnHash = nodes[0].sendparttoblind(sxAddrTo1_1, 3.4, '', '', False,
                                           'node0 -> node1 p->b')
        print("txnHash ", txnHash)
        txnHashes.append(txnHash)

        ro = nodes[0].listtransactions()
        print("0 listtransactions " +
              json.dumps(ro, indent=4, default=self.jsonDecimal))

        ro = nodes[0].getwalletinfo()
        print("0 getwalletinfo " +
              json.dumps(ro, indent=4, default=self.jsonDecimal))
        assert (isclose(ro['total_balance'], 99996.594196))

        assert (self.wait_for_mempool(nodes[1], txnHash))

        ro = nodes[1].getwalletinfo()
        print("1 getwalletinfo ",
              json.dumps(ro, indent=4, default=self.jsonDecimal))

        ro = nodes[1].listtransactions()
        print("1 listtransactions ",
              json.dumps(ro, indent=4, default=self.jsonDecimal))

        ro = nodes[0].reservebalance(True, 0)
        self.wait_for_height(nodes[0], 2, 2000)
        ro = nodes[0].reservebalance(True, 10000000)

        mnemonic2 = nodes[2].mnemonic("new")
        ro = nodes[2].extkeyimportmaster(mnemonic2["master"])
        sxAddrTo2_1 = nodes[2].getnewstealthaddress()

        txnHash3 = nodes[1].sendblindtoblind(sxAddrTo2_1, 0.2, '', '', False,
                                             'node1 -> node2 b->b')
        print("txnHash3 ", txnHash3)

        ro = nodes[1].getwalletinfo()
        print("1 getwalletinfo ",
              json.dumps(ro, indent=4, default=self.jsonDecimal))

        ro = nodes[1].listtransactions()
        print("1 listtransactions ",
              json.dumps(ro, indent=4, default=self.jsonDecimal))

        assert (self.wait_for_mempool(nodes[2], txnHash3))

        ro = nodes[2].getwalletinfo()
        print("2 getwalletinfo ",
              json.dumps(ro, indent=4, default=self.jsonDecimal))

        ro = nodes[2].listtransactions()
        print("2 listtransactions ",
              json.dumps(ro, indent=4, default=self.jsonDecimal))

        # TODO: Depending on the random split there may not be enough funds in the unspent output here
        sxAddrTo2_2 = nodes[2].getnewextaddress()
        txnHash4 = nodes[1].sendblindtopart(sxAddrTo2_1, 0.5, '', '', False,
                                            'node1 -> node2 b->p')
        #txnHash4 = nodes[1].sendblindtopart(sxAddrTo2_2, 0.5, '', '', False, 'node1 -> node2 b->p')
        print("txnHash4 ", txnHash4)

        ro = nodes[1].getwalletinfo()
        print("1 getwalletinfo ",
              json.dumps(ro, indent=4, default=self.jsonDecimal))

        ro = nodes[1].listtransactions()
        print("1 listtransactions ",
              json.dumps(ro, indent=4, default=self.jsonDecimal))

        assert (self.wait_for_mempool(nodes[2], txnHash4))

        ro = nodes[2].getwalletinfo()
        print("2 getwalletinfo ",
              json.dumps(ro, indent=4, default=self.jsonDecimal))

        ro = nodes[2].listtransactions()
        print("2 listtransactions ",
              json.dumps(ro, indent=4, default=self.jsonDecimal))

        sxAddrTo2_3 = nodes[2].getnewstealthaddress("n2 sx+prefix", "4",
                                                    "0xaaaa")
        print("sxAddrTo2_3 ", sxAddrTo2_3)
        #assert(sxAddrTo2_3 == "32eETczfqSdXkByymvCGrwtkUUkwVfiSosd82tu1K4H7MKzFze6L5pyQL6R29qGzBxuUhLaeg1pEaAhvqicVeWScsdN19kH83JYPC1Tn")

        txnHash5 = nodes[0].sendparttoblind(sxAddrTo2_3, 0.5, '', '', False,
                                            'node0 -> node2 p->b')
        print("txnHash5 ", txnHash5)

        assert (self.wait_for_mempool(nodes[2], txnHash5))

        ro = nodes[2].listtransactions()
        #print("2 listtransactions ", json.dumps(ro, indent=4, default=self.jsonDecimal))
        assert (ro[-1]["txid"] == txnHash5)

        ro = nodes[0].getwalletinfo()
        #print("0 getwalletinfo " + json.dumps(ro, indent=4, default=self.jsonDecimal))
        # Some of the balance will have staked
        assert (isclose(ro['balance'] + ro['staked_balance'], 99996.09498274))
        availableBalance = ro['balance']

        # Check node0 can spend remaining coin
        addrTo0_2 = nodes[0].getnewaddress()
        txnHash2 = nodes[0].sendtoaddress(addrTo0_2, availableBalance, '', '',
                                          True, 'node0 spend remaining')
        #print("txnHash2 ", txnHash2)
        txnHashes.append(txnHash2)

        ro = nodes[0].getwalletinfo()
        #print("0 getwalletinfo " + json.dumps(ro, indent=4, default=self.jsonDecimal))
        assert (isclose(ro['total_balance'], 99996.09294874))
Beispiel #18
0
    def run_test(self):
        tmpdir = self.options.tmpdir
        nodes = self.nodes

        nodes[0].extkeyimportmaster(nodes[0].mnemonic('new')['master'])
        nodes[1].extkeyimportmaster(
            'abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb'
        )

        address0 = nodes[0].getnewaddress()  # Will be different each run
        address1 = nodes[1].getnewaddress()
        assert (address1 == 'pX9N6S76ZtA5BfsiJmqBbjaEgLMHpt58it')

        ro = nodes[0].smsglocalkeys()
        assert (len(ro['wallet_keys']) == 0)

        ro = nodes[0].smsgaddlocaladdress(address0)
        assert ('Receiving messages enabled for address' in ro['result'])

        ro = nodes[0].smsglocalkeys()
        assert (len(ro['wallet_keys']) == 1)

        ro = nodes[1].smsgaddaddress(address0,
                                     ro['wallet_keys'][0]['public_key'])
        assert (ro['result'] == 'Public key added to db.')

        text_1 = "['data':'test','value':1]"
        ro = nodes[1].smsgsend(address1, address0, text_1, True, 4, True)
        assert (ro['result'] == 'Not Sent.')
        assert (isclose(ro['fee'], 0.00085800))

        ro = nodes[1].smsgsend(address1, address0, text_1, True, 4)
        assert (ro['result'] == 'Sent.')

        self.stakeBlocks(1, nStakeNode=1)
        self.waitForSmsgExchange(1, 1, 0)

        ro = nodes[0].smsginbox()
        assert (len(ro['messages']) == 1)
        assert (ro['messages'][0]['text'] == text_1)

        ro = nodes[0].smsgimportprivkey(
            '7pHSJFY1tNwi6d68UttGzB8YnXq2wFWrBVoadLv4Y6ekJD3L1iKs',
            'smsg test key')

        address0_1 = 'pasdoMwEn35xQUXFvsChWAQjuG8rEKJQW9'
        text_2 = "['data':'test','value':2]"
        ro = nodes[0].smsglocalkeys()
        assert (len(ro['smsg_keys']) == 1)
        assert (ro['smsg_keys'][0]['address'] == address0_1)

        ro = nodes[1].smsgaddaddress(address0_1,
                                     ro['smsg_keys'][0]['public_key'])
        assert (ro['result'] == 'Public key added to db.')

        ro = nodes[1].smsgsend(address1, address0_1, text_2, True, 4)
        assert (ro['result'] == 'Sent.')

        self.stakeBlocks(1, nStakeNode=1)
        self.waitForSmsgExchange(2, 1, 0)

        ro = nodes[0].smsginbox()
        assert (len(ro['messages']) == 1)
        assert (ro['messages'][0]['text'] == text_2)

        nodes[0].encryptwallet('qwerty234')
        time.sleep(2)

        ro = nodes[0].getwalletinfo()
        assert (ro['encryptionstatus'] == 'Locked')

        localkeys0 = nodes[0].smsglocalkeys()
        assert (len(localkeys0['smsg_keys']) == 1)
        assert (len(localkeys0['wallet_keys']) == 1)
        assert (localkeys0['smsg_keys'][0]['address'] == address0_1)
        assert (localkeys0['wallet_keys'][0]['address'] == address0)

        text_3 = "['data':'test','value':3]"
        ro = nodes[0].smsglocalkeys()
        assert (len(ro['smsg_keys']) == 1)
        assert (ro['smsg_keys'][0]['address'] == address0_1)

        ro = nodes[1].smsgsend(address1, address0, 'Non paid msg')
        assert (ro['result'] == 'Sent.')

        ro = nodes[1].smsgsend(address1, address0_1, text_3, True, 4)
        assert (ro['result'] == 'Sent.')
        assert (len(ro['txid']) == 64)

        self.sync_all()
        self.stakeBlocks(1, nStakeNode=1)
        self.waitForSmsgExchange(4, 1, 0)

        msgid = ro['msgid']
        for i in range(5):
            try:
                ro = nodes[1].smsg(msgid)
                assert (ro['location'] == 'outbox')
                break
            except Exception as e:
                time.sleep(1)
        assert (ro['text'] == text_3)
        assert (ro['from'] == address1)
        assert (ro['to'] == address0_1)

        ro = nodes[0].walletpassphrase("qwerty234", 300)
        ro = nodes[0].smsginbox()
        assert (len(ro['messages']) == 2)
        flat = json.dumps(ro, default=self.jsonDecimal)
        assert ('Non paid msg' in flat)
        assert (text_3 in flat)

        ro = nodes[0].walletlock()

        ro = nodes[0].smsginbox("all")
        assert (len(ro['messages']) == 4)
        flat = json.dumps(ro, default=self.jsonDecimal)
        assert (flat.count('Wallet is locked') == 2)

        ro = nodes[0].smsg(msgid)
        assert (ro['read'] == True)

        ro = nodes[0].smsg(msgid, {'setread': False})
        assert (ro['read'] == False)

        ro = nodes[0].smsg(msgid, {'delete': True})
        assert (ro['operation'] == 'Deleted')

        try:
            ro = nodes[0].smsg(msgid)
            assert (False), 'Read deleted msg.'
        except:
            pass

        ro = nodes[0].smsggetpubkey(address0_1)
        assert (
            ro['publickey'] == 'h2UfzZxbhxQPcXDfYTBRGSC7GM77qrLjhtqcmfAnAia9')

        filepath = tmpdir + '/sendfile.txt'
        msg = b"msg in file\0after null sep"
        with open(filepath, 'wb', encoding=None) as fp:
            fp.write(msg)

        ro = nodes[1].smsgsend(address1, address0_1, filepath, True, 4, False,
                               True)
        assert (ro['result'] == 'Sent.')
        msgid = ro['msgid']

        ro = nodes[1].smsgsend(address1, address0_1,
                               binascii.hexlify(msg).decode("utf-8"), True, 4,
                               False, False, True)
        msgid2 = ro['msgid']
        self.stakeBlocks(1, nStakeNode=1)

        for i in range(5):
            try:
                ro = nodes[1].smsg(msgid, {'encoding': 'hex'})
                assert (ro['location'] == 'outbox')
                break
            except:
                time.sleep(1)
        assert (msg == bytes.fromhex(ro['hex'][:-2])
                )  # Extra null byte gets tacked on

        for i in range(5):
            try:
                ro = nodes[1].smsg(msgid2, {'encoding': 'hex'})
                assert (ro['location'] == 'outbox')
                break
            except:
                time.sleep(1)
        assert (msg == bytes.fromhex(ro['hex'][:-2]))
        assert (ro['daysretention'] == 4)

        ro = nodes[0].smsgoptions('list', True)
        assert (len(ro['options']) == 3)
        assert (len(ro['options'][0]['description']) > 0)

        ro = nodes[0].smsgoptions('set', 'newAddressAnon', 'false')
        assert ('newAddressAnon = false' in json.dumps(ro))

        addr = nodes[0].getnewaddress('smsg test')
        pubkey = nodes[0].getaddressinfo(addr)['pubkey']
        ro = nodes[1].smsgaddaddress(addr, pubkey)
        assert ('Public key added to db' in json.dumps(ro))

        # Wait for sync
        i = 0
        for i in range(10):
            ro = nodes[0].smsginbox('all')
            if len(ro['messages']) >= 5:
                break
            time.sleep(1)
        assert (i < 10)

        self.log.info('Test filtering')
        ro = nodes[0].smsginbox('all', "'vAlue':2")
        assert (len(ro['messages']) == 1)

        ro = nodes[1].smsgoutbox('all', "'vAlue':2")
        assert (len(ro['messages']) == 1)

        self.log.info('Test clear and rescan')
        ro = nodes[0].smsginbox('clear')
        assert ('Deleted 5 messages' in ro['result'])

        ro = nodes[0].walletpassphrase("qwerty234", 300)
        ro = nodes[0].smsgscanbuckets()
        assert ('Scan Buckets Completed' in ro['result'])

        ro = nodes[0].smsginbox('all')
        # Recover 5 + 1 dropped msg
        assert (len(ro['messages']) == 6)

        self.log.info('Test smsglocalkeys')
        addr = nodes[0].getnewaddress()

        ro = nodes[0].smsglocalkeys('recv', '+', addr)
        assert ('Address not found' in ro['result'])
        ro = nodes[0].smsglocalkeys('anon', '+', addr)
        assert ('Address not found' in ro['result'])

        ro = nodes[0].smsgaddlocaladdress(addr)
        assert ('Receiving messages enabled for address' in ro['result'])

        ro = nodes[0].smsglocalkeys('recv', '-', addr)
        assert ('Receive off' in ro['key'])
        assert (addr in ro['key'])

        ro = nodes[0].smsglocalkeys('anon', '-', addr)
        assert ('Anon off' in ro['key'])
        assert (addr in ro['key'])

        ro = nodes[0].smsglocalkeys('all')

        n = getIndexAtProperty(ro['wallet_keys'], 'address', addr)
        assert (ro['wallet_keys'][n]['receive'] == '0')
        assert (ro['wallet_keys'][n]['anon'] == '0')

        self.log.info('Test smsgpurge')
        ro = nodes[0].smsg(msgid, {'encoding': 'hex'})
        assert (ro['msgid'] == msgid)

        nodes[0].smsgpurge(msgid)

        try:
            nodes[0].smsg(msgid, {'encoding': 'hex'})
            assert (False), 'Purged message in inbox'
        except JSONRPCException as e:
            assert ('Unknown message id' in e.error['message'])

        ro = nodes[0].smsgbuckets()
        assert (int(ro['total']['numpurged']) == 1)
        assert (int(ro['buckets'][0]['no. messages']) == int(
            ro['buckets'][0]['active messages']) + 1)

        self.log.info('Test listunspent include_immature')
        without_immature = nodes[1].listunspent()

        with_immature = nodes[1].listunspent(
            query_options={'include_immature': True})
        assert (len(with_immature) > len(without_immature))

        self.log.info('Test encoding options')
        options = {'encoding': 'hex'}
        ro = nodes[0].smsginbox('all', '', options)
        assert (len(ro['messages']) == 5)
        for msg in ro['messages']:
            assert ('hex' in msg)
        options = {'encoding': 'text'}
        ro = nodes[0].smsginbox('all', '', options)
        assert (len(ro['messages']) == 5)
        for msg in ro['messages']:
            assert ('text' in msg)
        options = {'encoding': 'none'}
        ro = nodes[0].smsginbox('all', '', options)
        assert (len(ro['messages']) == 5)
        for msg in ro['messages']:
            assert ('text' not in msg)
            assert ('hex' not in msg)

        self.log.info('Test disablewallet')
        assert ('SMSG' in nodes[2].getnetworkinfo()['localservices_str'])
        assert_raises_rpc_error(-32601, 'Method not found',
                                nodes[2].getwalletinfo)
        for i in range(20):
            if nodes[0].smsgbuckets('total')['total']['messages'] != nodes[
                    2].smsgbuckets('total')['total']['messages']:
                time.sleep(0.5)
                continue
            break
        assert (nodes[0].smsgbuckets('total')['total']['messages'] ==
                nodes[2].smsgbuckets('total')['total']['messages'])
Beispiel #19
0
    def test_cttx(self):
        nodes = self.nodes
        # Test confidential transactions
        addrA_sx = nodes[0].getnewstealthaddress()  # party A
        addrB_sx = nodes[1].getnewstealthaddress()  # party B

        outputs = [
            {
                'address': addrA_sx,
                'type': 'blind',
                'amount': 100,
            },
            {
                'address': addrB_sx,
                'type': 'blind',
                'amount': 100,
            },
        ]
        ro = nodes[0].createrawparttransaction([], outputs)

        ro = nodes[0].fundrawtransactionfrom('standard', ro['hex'], {},
                                             ro['amounts'])
        rawtx = ro['hex']

        ro = nodes[0].signrawtransactionwithwallet(rawtx)
        assert (ro['complete'] == True)

        ro = nodes[0].sendrawtransaction(ro['hex'])
        txnid = ro

        self.stakeBlocks(1)

        ro = nodes[0].getwalletinfo()
        assert (isclose(ro['blind_balance'], 100.0))

        ro = nodes[0].filtertransactions()
        n = getIndexAtProperty(ro, 'txid', txnid)
        assert (n > -1)
        assert (isclose(ro[n]['amount'], -100.00203200))

        ro = nodes[1].getwalletinfo()
        assert (isclose(ro['blind_balance'], 100.0))

        ro = nodes[1].filtertransactions()
        n = getIndexAtProperty(ro, 'txid', txnid)
        assert (n > -1)
        assert (isclose(ro[n]['amount'], 100.0))

        # Initiate A -> B
        # A has address (addrB_sx) of B

        amountA = 7.0
        amountB = 7.0

        secretA = os.urandom(32)
        secretAHash = sha256(secretA)
        lockTime = int(time.time()) + 10000  # future locktime

        destA = nodes[0].derivefromstealthaddress(addrA_sx)
        pkh0_0 = b58decode(destA['address'])[1:-4]

        ro = nodes[0].derivefromstealthaddress(addrA_sx,
                                               destA['ephemeral_pubkey'])
        privKeyA = ro['privatekey']
        pubKeyA = ro['pubkey']

        destB = nodes[0].derivefromstealthaddress(addrB_sx)
        pkh1_0 = b58decode(destB['address'])[1:-4]

        ro = nodes[1].derivefromstealthaddress(addrB_sx,
                                               destB['ephemeral_pubkey'])
        privKeyB = ro['privatekey']
        pubKeyB = ro['pubkey']

        scriptInitiate = CreateAtomicSwapScript(payTo=pkh1_0,
                                                refundTo=pkh0_0,
                                                lockTime=lockTime,
                                                secretHash=secretAHash)
        p2sh_initiate = script_to_p2sh_part(scriptInitiate)

        outputs = [
            {
                'address': p2sh_initiate,
                'pubkey': destB['pubkey'],
                'type': 'blind',
                'amount': amountA,
            },
        ]
        ro = nodes[0].createrawparttransaction([], outputs)
        ro = nodes[0].fundrawtransactionfrom('blind', ro['hex'], {},
                                             ro['amounts'])
        output_amounts_i = ro['output_amounts']
        ro = nodes[0].signrawtransactionwithwallet(ro['hex'])
        assert (ro['complete'] == True)
        rawtx_i = ro['hex']

        rawtx_i_refund = createRefundTxCT(nodes[0], rawtx_i, output_amounts_i,
                                          scriptInitiate, lockTime, privKeyA,
                                          pubKeyA, addrA_sx)
        ro = nodes[0].testmempoolaccept([
            rawtx_i_refund,
        ])
        print(ro)
        assert ('non-final' in ro[0]['reject-reason'])

        txnid1 = nodes[0].sendrawtransaction(rawtx_i)
        self.stakeBlocks(1)

        # Party A sends B rawtx_i/txnid1, script and output_amounts_i

        # auditcontract
        # Party B extracts the secrethash and verifies the txn:

        ro = nodes[1].decoderawtransaction(rawtx_i)
        n = getOutputByAddr(ro, p2sh_initiate)
        valueCommitment = ro['vout'][n]['valueCommitment']

        amount = output_amounts_i[str(n)]['value']
        blind = output_amounts_i[str(n)]['blind']

        assert (nodes[1].verifycommitment(valueCommitment, blind,
                                          amount)['result'] == True)

        # Participate B -> A
        # needs address and publickey from A, amount and secretAHash

        lockTimeP = int(time.time()) + 10000  # future locktime
        scriptParticipate = CreateAtomicSwapScript(payTo=pkh0_0,
                                                   refundTo=pkh1_0,
                                                   lockTime=lockTimeP,
                                                   secretHash=secretAHash)
        p2sh_participate = script_to_p2sh_part(scriptParticipate)

        outputs = [
            {
                'address': p2sh_participate,
                'pubkey': destA['pubkey'],
                'type': 'blind',
                'amount': amountB,
            },
        ]

        ro = nodes[1].createrawparttransaction([], outputs)
        ro = nodes[1].fundrawtransactionfrom('blind', ro['hex'], {},
                                             ro['amounts'])
        output_amounts_p = ro['output_amounts']
        ro = nodes[1].signrawtransactionwithwallet(ro['hex'])
        rawtx_p = ro['hex']

        rawtx_p_refund = createRefundTxCT(nodes[1], rawtx_p, output_amounts_p,
                                          scriptParticipate, lockTime,
                                          privKeyB, pubKeyB, addrB_sx)
        ro = nodes[1].testmempoolaccept([
            rawtx_p_refund,
        ])
        assert ('non-final' in ro[0]['reject-reason'])

        txnid_p = nodes[0].sendrawtransaction(rawtx_p)
        self.stakeBlocks(1)
        assert (txnid_p in nodes[0].getblock(nodes[0].getblockhash(
            nodes[0].getblockcount()))['tx'])

        # B sends output_amounts to A

        # Party A Redeem/Claim from participate txn
        # Party A spends the funds from the participate txn, and to do so must reveal secretA

        rawtxclaimA = createClaimTxCT(nodes[0], rawtx_p, output_amounts_p,
                                      scriptParticipate, secretA, privKeyA,
                                      pubKeyA, addrA_sx)
        txnidAClaim = nodes[0].sendrawtransaction(rawtxclaimA)

        # Party B claims from initiate txn
        # Get secret from txnidAClaim

        #ro = nodes[1].getrawtransaction(txnidAClaim, True)
        #print('ro', json.dumps(ro, indent=4, default=jsonDecimal))

        rawtxclaimB = createClaimTxCT(nodes[1], rawtx_i, output_amounts_i,
                                      scriptInitiate, secretA, privKeyB,
                                      pubKeyB, addrB_sx)
        txnidBClaim = nodes[0].sendrawtransaction(rawtxclaimB)

        nodes[0].getmempoolentry(txnidAClaim)
        nodes[0].getmempoolentry(txnidBClaim)

        # Test Refund expired initiate tx
        secretA = os.urandom(32)
        secretAHash = sha256(secretA)
        lockTime = int(time.time()) - 100000  # past locktime

        amountA = 7.1
        scriptInitiate = CreateAtomicSwapScript(payTo=pkh1_0,
                                                refundTo=pkh0_0,
                                                lockTime=lockTime,
                                                secretHash=secretAHash)
        p2sh_initiate = script_to_p2sh_part(scriptInitiate)

        outputs = [
            {
                'address': p2sh_initiate,
                'pubkey': destB['pubkey'],
                'type': 'blind',
                'amount': amountA,
            },
        ]
        ro = nodes[0].createrawparttransaction([], outputs)
        ro = nodes[0].fundrawtransactionfrom('blind', ro['hex'], {},
                                             ro['amounts'])

        r2 = nodes[0].verifyrawtransaction(ro['hex'])
        assert (r2['complete'] == False)

        output_amounts_i = ro['output_amounts']
        ro = nodes[0].signrawtransactionwithwallet(ro['hex'])
        assert (ro['complete'] == True)
        rawtx_i = ro['hex']

        r2 = nodes[0].verifyrawtransaction(rawtx_i)
        assert (r2['complete'] == True)

        rawtx_i_refund = createRefundTxCT(nodes[0], rawtx_i, output_amounts_i,
                                          scriptInitiate, lockTime, privKeyA,
                                          pubKeyA, addrA_sx)
        ro = nodes[0].testmempoolaccept([
            rawtx_i_refund,
        ])
        assert ('missing-inputs' in ro[0]['reject-reason'])

        txnid1 = nodes[0].sendrawtransaction(rawtx_i)
        ro = nodes[0].getwalletinfo()
        assert (ro['unconfirmed_blind'] > 6.0
                and ro['unconfirmed_blind'] < 7.0)

        txnidRefund = nodes[0].sendrawtransaction(rawtx_i_refund)
        nodes[0].getmempoolentry(txnidRefund)

        ro = nodes[0].getwalletinfo()
        assert (ro['unconfirmed_blind'] > 14.0
                and ro['unconfirmed_blind'] < 14.1)
Beispiel #20
0
    def run_test(self):
        nodes = self.nodes

        # Stop staking
        for i in range(len(nodes)):
            nodes[i].reservebalance(True, 10000000)

        ro = nodes[0].extkeyimportmaster(
            'abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb'
        )
        assert (ro['account_id'] == 'aaaZf2qnNr5T7PWRmqgmusuu5ACnBcX2ev')
        assert (nodes[0].getwalletinfo()['total_balance'] == 100000)

        txnHashes = []

        ro = nodes[1].extkeyimportmaster(
            'drip fog service village program equip minute dentist series hawk crop sphere olympic lazy garbage segment fox library good alley steak jazz force inmate'
        )
        sxAddrTo1_1 = nodes[1].getnewstealthaddress('lblsx11')
        assert (
            sxAddrTo1_1 ==
            'TetbYTGv5LiqyFiUD3a5HHbpSinQ9KiRYDGAMvRzPfz4RnHMbKGAwDr1fjLGJ5Eqg1XDwpeGyqWMiwdK3qM3zKWjzHNpaatdoHVzzA'
        )

        txnHash = nodes[0].sendparttoblind(sxAddrTo1_1, 3.4, '', '', False,
                                           'node0 -> node1 p->b')
        txnHashes.append(txnHash)

        ro = nodes[0].listtransactions()
        assert (len(ro) == 10)

        ro = nodes[0].getwalletinfo()
        assert (isclose(ro['total_balance'], 99996.594196))
        assert (self.wait_for_mempool(nodes[1], txnHash))

        ro = nodes[1].getwalletinfo()
        assert (isclose(ro['unconfirmed_blind'], 3.4))

        ro = nodes[1].transactionblinds(txnHash)
        assert (len(ro) == 2)

        ro = nodes[1].listtransactions()
        assert (len(ro) == 2)

        self.stakeBlocks(2)

        nodes[2].extkeyimportmaster(nodes[2].mnemonic('new')['master'])
        sxAddrTo2_1 = nodes[2].getnewstealthaddress('lblsx21')

        txnHash3 = nodes[1].sendblindtoblind(sxAddrTo2_1, 0.2, '', '', False,
                                             'node1 -> node2 b->b')

        ro = nodes[1].getwalletinfo()
        assert (ro['blind_balance'] < 3.2 and ro['blind_balance'] > 3.1)

        ro = nodes[1].listtransactions()
        assert (len(ro) == 3)
        fFound = False
        for e in ro:
            if e['category'] == 'send':
                assert (e['type'] == 'blind')
                assert (isclose(e['amount'], -0.2))
                fFound = True
        assert (fFound)

        assert (self.wait_for_mempool(nodes[2], txnHash3))

        ro = nodes[2].getwalletinfo()
        assert (isclose(ro['unconfirmed_blind'], 0.2))

        ro = nodes[2].listtransactions()
        assert (len(ro) == 1)
        e = ro[0]
        assert (e['category'] == 'receive')
        assert (e['type'] == 'blind')
        assert (isclose(e['amount'], 0.2))
        assert (e['stealth_address'] == sxAddrTo2_1)

        txnHash4 = nodes[1].sendblindtopart(sxAddrTo2_1, 0.5, '', '', False,
                                            'node1 -> node2 b->p')

        ro = nodes[1].getwalletinfo()
        assert (ro['blind_balance'] < 2.7 and ro['blind_balance'] > 2.69)

        ro = nodes[1].listtransactions()
        assert (len(ro) == 4)
        fFound = False
        for e in ro:
            if e['category'] == 'send' and e['type'] == 'standard':
                assert (isclose(e['amount'], -0.5))
                fFound = True
        assert (fFound)

        assert (self.wait_for_mempool(nodes[2], txnHash4))

        ro = nodes[2].getwalletinfo()
        assert (isclose(ro['unconfirmed_balance'], 0.5))
        assert (isclose(ro['unconfirmed_blind'], 0.2))

        ro = nodes[2].listtransactions()
        assert (len(ro) == 2)

        sxAddrTo2_3 = nodes[2].getnewstealthaddress('n2 sx+prefix', '4',
                                                    '0xaaaa')
        ro = nodes[2].validateaddress(sxAddrTo2_3)
        assert (ro['isvalid'] == True)
        assert (ro['isstealthaddress'] == True)
        assert (ro['prefix_num_bits'] == 4)
        assert (ro['prefix_bitfield'] == '0x000a')

        txnHash5 = nodes[0].sendparttoblind(sxAddrTo2_3, 0.5, '', '', False,
                                            'node0 -> node2 p->b')

        assert (self.wait_for_mempool(nodes[2], txnHash5))

        ro = nodes[2].listtransactions()
        assert (ro[-1]['txid'] == txnHash5)

        ro = nodes[0].getwalletinfo()
        # Some of the balance will have staked
        assert (isclose(ro['balance'] + ro['staked_balance'], 99996.09498274))
        availableBalance = ro['balance']

        # Check node0 can spend remaining coin
        addrTo0_2 = nodes[0].getnewaddress()
        txnHash2 = nodes[0].sendtoaddress(addrTo0_2, availableBalance, '', '',
                                          True, 'node0 spend remaining')
        txnHashes.append(txnHash2)

        nodes[0].syncwithvalidationinterfacequeue()
        ro = nodes[0].getwalletinfo()
        assert (isclose(ro['total_balance'], 99996.09292874))

        ro = nodes[1].getwalletinfo()
        assert (isclose(ro['blind_balance'], 2.691068))

        unspent = nodes[2].listunspentblind(minconf=0)
        assert (len(unspent[0]['stealth_address']))
        assert (len(unspent[0]['label']))

        # Test lockunspent
        unspent = nodes[1].listunspentblind(minconf=0)
        assert (nodes[1].lockunspent(False, [unspent[0]]) == True)
        assert (len(nodes[1].listlockunspent()) == 1)
        unspentCheck = nodes[1].listunspentblind(minconf=0)
        assert (len(unspentCheck) < len(unspent))
        assert (nodes[1].lockunspent(True, [unspent[0]]) == True)
        unspentCheck = nodes[1].listunspentblind(minconf=0)
        assert (len(unspentCheck) == len(unspent))

        outputs = [
            {
                'address': sxAddrTo2_3,
                'amount': 2.691068,
                'subfee': True
            },
        ]
        ro = nodes[1].sendtypeto('blind', 'part', outputs, 'comment_to',
                                 'comment_from', 4, 64, True)
        feePerKB = (1000.0 / ro['bytes']) * float(ro['fee'])
        assert (feePerKB > 0.001 and feePerKB < 0.004)

        ro = nodes[1].sendtypeto('blind', 'blind', outputs, 'comment_to',
                                 'comment_from', 4, 64, True)
        feePerKB = (1000.0 / ro['bytes']) * float(ro['fee'])
        assert (feePerKB > 0.001 and feePerKB < 0.004)

        ro = nodes[1].sendtypeto('blind', 'part', outputs)

        try:
            ro = nodes[1].sendtypeto('blind', 'blind', outputs)
        except JSONRPCException as e:
            assert ('Insufficient blinded funds' in e.error['message'])
    def run_test(self):
        nodes = self.nodes

        # stop staking
        for i in range(len(nodes)):
            nodes[i].reservebalance(True, 10000000)

        ro = nodes[0].extkeyimportmaster('abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb')
        assert(ro['account_id'] == 'aaaZf2qnNr5T7PWRmqgmusuu5ACnBcX2ev')
        assert(nodes[0].getwalletinfo()['total_balance'] == 100000)

        nodes[1].extkeyimportmaster(nodes[1].mnemonic('new')['master'])
        nodes[2].extkeyimportmaster('sección grito médula hecho pauta posada nueve ebrio bruto buceo baúl mitad')


        addrTo256 = nodes[2].getnewaddress('256 test', 'True', 'False', 'True')
        assert(addrTo256 == 'tpl16a6gjrpfwkqrf8fveajkek07l6a0pxgaayk4y6gyq9zlkxxk2hqqmld6tr')
        [nodes[0].sendtoaddress(addrTo256, 1000) for i in range(4)]


        # test reserve balance
        ro = nodes[0].walletsettings('stakelimit', {'height':1})
        ro = nodes[0].getwalletinfo()
        assert(isclose(ro['reserve'], 10000000.0))

        ro = nodes[0].reservebalance(True, 100)
        assert(ro['reserve'] == True)
        assert(isclose(ro['amount'], 100.0))

        ro = nodes[0].getwalletinfo()
        assert(ro['reserve'] == 100)

        ro = nodes[0].reservebalance(False)
        assert(ro['reserve'] == False)
        assert(ro['amount'] == 0)

        ro = nodes[0].getwalletinfo()
        assert(ro['reserve'] == 0)

        assert(self.wait_for_height(nodes[0], 1))
        ro = nodes[0].reservebalance(True, 10000000)

        addrTo = nodes[1].getnewaddress()
        txnHash = nodes[0].sendtoaddress(addrTo, 10)
        ro = nodes[0].getmempoolentry(txnHash)
        assert(ro['height'] == 1)

        ro = nodes[0].listtransactions()
        fPass = False
        for txl in ro:
            if txl['address'] == addrTo and txl['amount'] == -10 and txl['category'] == 'send':
                fPass = True
                break
        assert(fPass), "node0, listtransactions failed."


        assert(self.wait_for_mempool(nodes[1], txnHash))

        ro = nodes[1].listtransactions()
        assert(len(ro) == 1)
        assert(ro[0]['address'] == addrTo)
        assert(ro[0]['amount'] == 10)
        assert(ro[0]['category'] == 'receive')

        self.stakeBlocks(1)
        block2_hash = nodes[0].getblockhash(2)
        ro = nodes[0].getblock(block2_hash)
        assert(txnHash in ro['tx'])


        addrReward = nodes[0].getnewaddress()
        ro = nodes[0].walletsettings('stakingoptions', {'rewardaddress':addrReward})
        assert(ro['stakingoptions']['rewardaddress'] == addrReward)

        self.stakeBlocks(1)
        block3_hash = nodes[0].getblockhash(3)
        coinstakehash = nodes[0].getblock(block3_hash)['tx'][0]
        ro = nodes[0].getrawtransaction(coinstakehash, True)

        fFound = False
        for vout in ro["vout"]:
            try:
                addr0 = vout['scriptPubKey']['addresses'][0]
            except:
                continue
            if addr0 == addrReward:
                fFound = True
                assert(vout['valueSat'] == 39637)
                break
        assert(fFound)

        # Test staking pkh256 outputs
        ro = nodes[2].walletsettings('stakelimit', {'height':1})
        ro = nodes[2].reservebalance(False)
        ro = nodes[2].getstakinginfo()
        assert(ro['weight'] == 400000000000)

        self.stakeBlocks(1, nStakeNode=2)


        addrRewardExt = nodes[0].getnewextaddress()
        ro = nodes[0].walletsettings('stakingoptions', {'rewardaddress':addrRewardExt})
        assert(ro['stakingoptions']['rewardaddress'] == addrRewardExt)
        self.stakeBlocks(1)
        block5_hash = nodes[0].getblockhash(5)
        coinstakehash = nodes[0].getblock(block5_hash)['tx'][0]
        ro = nodes[0].getrawtransaction(coinstakehash, True)

        fFound = False
        for vout in ro["vout"]:
            try:
                addr0 = vout['scriptPubKey']['addresses'][0]
                ro = nodes[0].getaddressinfo(addr0)
                if ro['from_ext_address_id'] == 'xXZRLYvJgbJyrqJhgNzMjEvVGViCdGmVAt':
                    assert(addr0 == 'pgaKYsNmHTuQB83FguN44WW4ADKmwJwV7e')
                    fFound = True
                    assert(vout['valueSat'] == 39637)
            except:
                continue
        assert(fFound)



        addrRewardSx = nodes[0].getnewstealthaddress()
        ro = nodes[0].walletsettings('stakingoptions', {'rewardaddress':addrRewardSx})
        assert(ro['stakingoptions']['rewardaddress'] == addrRewardSx)
        self.stakeBlocks(1)
        block6_hash = nodes[0].getblockhash(6)
        coinstakehash = nodes[0].getblock(block6_hash)['tx'][0]
        ro = nodes[0].getrawtransaction(coinstakehash, True)

        fFound = False
        for vout in ro["vout"]:
            try:
                addr0 = vout['scriptPubKey']['addresses'][0]
                ro = nodes[0].getaddressinfo(addr0)
                if ro['from_stealth_address'] == addrRewardSx:
                    fFound = True
                    assert(vout['valueSat'] == 39637)
            except:
                continue
        assert(fFound)
    def run_test(self):
        nodes = self.nodes

        ro = nodes[0].extkeyimportmaster(
            'abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb'
        )
        assert (ro['account_id'] == 'aaaZf2qnNr5T7PWRmqgmusuu5ACnBcX2ev')
        assert (nodes[0].getwalletinfo()['total_balance'] == 100000)

        nodes[3].extkeyimportmaster(
            'pact mammal barrel matrix local final lecture chunk wasp survey bid various book strong spread fall ozone daring like topple door fatigue limb olympic',
            '', 'true')
        nodes[3].getnewextaddress('lblExtTest')
        nodes[3].rescanblockchain()
        assert (nodes[3].getwalletinfo()['total_balance'] == 25000)

        txnHashes = []

        nodes[1].extkeyimportmaster(
            'drip fog service village program equip minute dentist series hawk crop sphere olympic lazy garbage segment fox library good alley steak jazz force inmate'
        )
        sxAddrTo1_1 = nodes[1].getnewstealthaddress('lblsx11')
        assert (
            sxAddrTo1_1 ==
            'TetbYTGv5LiqyFiUD3a5HHbpSinQ9KiRYDGAMvRzPfz4RnHMbKGAwDr1fjLGJ5Eqg1XDwpeGyqWMiwdK3qM3zKWjzHNpaatdoHVzzA'
        )

        txnHash = nodes[0].sendparttoblind(sxAddrTo1_1, 3.4, '', '', False,
                                           'node0 -> node1 p->b')
        txnHashes.append(txnHash)

        ro = nodes[0].listtransactions()
        assert (len(ro) == 10)
        assert (ro[9]['narration'] == 'node0 -> node1 p->b')

        ro = nodes[0].getwalletinfo()
        assert (isclose(ro['total_balance'], 99996.597968))
        assert (self.wait_for_mempool(nodes[1], txnHash))

        sync_mempools([nodes[0], nodes[1]])
        ro = nodes[1].getwalletinfo()
        assert (isclose(ro['unconfirmed_blind'], 3.4))

        ro = nodes[1].transactionblinds(txnHash)
        assert (len(ro) == 2)

        ro = nodes[1].listtransactions()
        assert (len(ro) == 2)
        assert (ro[1]['narration'] == 'node0 -> node1 p->b')

        self.stakeBlocks(2)

        nodes[2].extkeyimportmaster(nodes[2].mnemonic('new')['master'])
        sxAddrTo2_1 = nodes[2].getnewstealthaddress('lblsx21')

        txnHash3 = nodes[1].sendblindtoblind(sxAddrTo2_1, 0.2, '', '', False,
                                             'node1 -> node2 b->b')

        ro = nodes[1].getwalletinfo()
        assert (ro['blind_balance'] < 3.2 and ro['blind_balance'] > 3.1)

        ro = nodes[1].listtransactions()
        assert (len(ro) == 3)
        fFound = False
        for e in ro:
            if e['category'] == 'send':
                assert (e['type'] == 'blind')
                assert (isclose(e['amount'], -0.2))
                fFound = True
        assert (fFound)

        assert (self.wait_for_mempool(nodes[2], txnHash3))

        ro = nodes[2].getwalletinfo()
        assert (isclose(ro['unconfirmed_blind'], 0.2))

        ro = nodes[2].listtransactions()
        assert (len(ro) == 1)
        e = ro[0]
        assert (e['category'] == 'receive')
        assert (e['type'] == 'blind')
        assert (isclose(e['amount'], 0.2))
        assert (e['stealth_address'] == sxAddrTo2_1)

        txnHash4 = nodes[1].sendblindtopart(sxAddrTo2_1, 0.5, '', '', False,
                                            'node1 -> node2 b->p')

        ro = nodes[1].getwalletinfo()
        assert (ro['blind_balance'] < 2.7 and ro['blind_balance'] > 2.69)

        ro = nodes[1].listtransactions()
        assert (len(ro) == 4)
        fFound = False
        for e in ro:
            if e['category'] == 'send' and e['type'] == 'standard':
                assert (isclose(e['amount'], -0.5))
                fFound = True
        assert (fFound)

        assert (self.wait_for_mempool(nodes[2], txnHash4))

        ro = nodes[2].getwalletinfo()
        assert (isclose(ro['unconfirmed_balance'], 0.5))
        assert (isclose(ro['unconfirmed_blind'], 0.2))

        ro = nodes[2].listtransactions()
        assert (len(ro) == 2)

        sxAddrTo2_3 = nodes[2].getnewstealthaddress('n2 sx+prefix', '4',
                                                    '0xaaaa')
        ro = nodes[2].validateaddress(sxAddrTo2_3)
        assert (ro['isvalid'] == True)
        assert (ro['isstealthaddress'] == True)
        assert (ro['prefix_num_bits'] == 4)
        assert (ro['prefix_bitfield'] == '0x000a')

        txnHash5 = nodes[0].sendparttoblind(sxAddrTo2_3, 0.5, '', '', False,
                                            'node0 -> node2 p->b')

        assert (self.wait_for_mempool(nodes[2], txnHash5))

        ro = nodes[2].listtransactions()
        assert (ro[-1]['txid'] == txnHash5)

        ro = nodes[0].getwalletinfo()
        # Some of the balance will have staked
        assert (isclose(ro['balance'] + ro['staked_balance'], 99996.09874074))
        availableBalance = ro['balance']

        self.log.info('Check node0 can spend remaining coin')
        self.stakeBlocks(
            1)  # IsTrusted checks that parent txns are also trusted
        nodes[0].syncwithvalidationinterfacequeue()
        availableBalance = nodes[0].getwalletinfo()['balance']
        addrTo0_2 = nodes[0].getnewaddress()
        txnHash2 = nodes[0].sendtoaddress(addrTo0_2, availableBalance, '', '',
                                          True, 'node0 spend remaining')
        txnHashes.append(txnHash2)

        nodes[0].syncwithvalidationinterfacequeue()
        assert (isclose(nodes[0].getwalletinfo()['total_balance'],
                        99996.10316311))
        assert (isclose(nodes[1].getwalletinfo()['blind_balance'], 2.69580200))

        unspent = nodes[2].listunspentblind(minconf=0)
        assert (len(unspent[0]['stealth_address']))
        assert (len(unspent[0]['label']))

        self.log.info('Test lockunspent')
        unspent = nodes[1].listunspentblind(minconf=0)
        assert (nodes[1].lockunspent(False, [unspent[0]]) == True)
        assert (len(nodes[1].listlockunspent()) == 1)
        assert (len(nodes[1].listunspentblind(minconf=0)) < len(unspent))
        assert (nodes[1].lockunspent(True, [unspent[0]]) == True)
        assert (len(nodes[1].listunspentblind(minconf=0)) == len(unspent))

        outputs = [
            {
                'address': sxAddrTo2_3,
                'amount': 2.691068,
                'subfee': True
            },
        ]
        ro = nodes[1].sendtypeto('blind', 'part', outputs, 'comment_to',
                                 'comment_from', 4, 64, True)
        feePerKB = (1000.0 / ro['bytes']) * float(ro['fee'])
        assert (feePerKB > 0.001 and feePerKB < 0.004)

        ro = nodes[1].sendtypeto('blind', 'blind', outputs, 'comment_to',
                                 'comment_from', 4, 64, True)
        feePerKB = (1000.0 / ro['bytes']) * float(ro['fee'])
        assert (feePerKB > 0.001 and feePerKB < 0.004)

        nodes[1].sendtypeto('blind', 'part', outputs)

        try:
            ro = nodes[1].sendtypeto('blind', 'blind', outputs)
            raise AssertionError('Should have failed.')
        except JSONRPCException as e:
            assert ('Insufficient blinded funds' in e.error['message'])

        self.log.info(
            'Test sending to normal addresses which the wallet knows a pubkey for'
        )
        addrPlain = nodes[0].getnewaddress()
        addrLong = nodes[0].getnewaddress('', False, False, True)
        outputs = [{
            'address': addrPlain,
            'amount': 1.0
        }, {
            'address': addrLong,
            'amount': 1.0
        }]
        nodes[0].sendtypeto('part', 'blind', outputs)

        self.log.info('Test sending all blind to blind')
        bal0 = nodes[0].getwalletinfo()

        assert (isclose(bal0['blind_balance'], 2.0))
        outputs = [{
            'address': sxAddrTo1_1,
            'amount': bal0['blind_balance'],
            'subfee': True
        }]
        nodes[0].sendtypeto('blind', 'blind', outputs)

        self.sync_all()
        self.stakeBlocks(1, nStakeNode=3)

        self.log.info('Test sending all blind to part')
        bal1 = nodes[1].getwalletinfo()

        assert (isclose(bal1['blind_balance'], 2.002582))
        outputs = [{
            'address': sxAddrTo1_1,
            'amount': bal1['blind_balance'],
            'subfee': True
        }]
        nodes[1].sendtypeto('blind', 'part', outputs)

        bal1 = nodes[1].getwalletinfo()
        assert (isclose(bal1['blind_balance'], 0.00000001))

        ro = nodes[2].getblockstats(nodes[2].getblockchaininfo()['blocks'])
        assert (ro['height'] == 4)

        self.log.info('Test gettxoutsetinfobyscript')
        ro = nodes[0].gettxoutsetinfobyscript()
        assert (ro['height'] == 4)
        assert (ro['paytopubkeyhash']['num_blinded'] > 5)
Beispiel #23
0
    def run_test(self):
        tmpdir = self.options.tmpdir
        nodes = self.nodes

        nodes[0].extkeyimportmaster(
            'abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb'
        )
        assert (nodes[0].getwalletinfo()['total_balance'] == 100000)

        nodes[1].extkeyimportmaster(
            'pact mammal barrel matrix local final lecture chunk wasp survey bid various book strong spread fall ozone daring like topple door fatigue limb olympic',
            '', 'true')
        nodes[1].getnewextaddress('lblExtTest')
        nodes[1].rescanblockchain()
        assert (nodes[1].getwalletinfo()['total_balance'] == 25000)

        address0 = nodes[0].getnewaddress()
        address1 = nodes[1].getnewaddress()
        nodes[0].smsgaddlocaladdress(address0)
        nodes[1].smsgaddaddress(
            address0, nodes[0].smsglocalkeys()['wallet_keys'][0]['public_key'])

        text = 'Some text to test'
        ro = nodes[1].smsgsend(address1, address0, text, True, 10, True)
        print(ro)
        assert (ro['result'] == 'Not Sent.')
        assert (isclose(ro['fee'], 0.00157000))

        assert (nodes[0].smsggetfeerate() == 50000)
        assert (nodes[1].smsggetfeerate() == 50000)

        ro = nodes[0].walletsettings('stakingoptions',
                                     {'smsgfeeratetarget': 0.001})
        assert (float(ro['stakingoptions']['smsgfeeratetarget']) == 0.001)

        self.stakeBlocks(49)
        assert (nodes[0].smsggetfeerate() == 50000)

        ro = nodes[1].smsgsend(address1, address0, text, True, 10)
        assert (ro['result'] == 'Sent.')
        assert ('msgid' in ro)
        assert ('txid' in ro)
        assert (isclose(ro['fee'], 0.00157000))

        self.stakeBlocks(1)
        assert (nodes[0].smsggetfeerate() == 61939)

        ro = nodes[1].smsgsend(address1, address0, text, True, 10, True)
        assert (ro['result'] == 'Not Sent.')
        assert (isclose(ro['fee'], 0.00186600))

        self.sync_all()

        self.stakeBlocks(1)
        assert (nodes[0].smsggetfeerate() == 61939)

        self.waitForSmsgExchange(1, 1, 0)

        ro = nodes[0].smsginbox('all')
        assert (len(ro['messages']) == 1)
        assert (ro['messages'][0]['text'] == text)
Beispiel #24
0
    def run_test(self):
        node = self.nodes[0]
        node1 = self.nodes[1]

        ro = node.extkeyimportmaster('abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb')
        assert(ro['account_id'] == 'aaaZf2qnNr5T7PWRmqgmusuu5ACnBcX2ev')
        assert(node.getwalletinfo()['total_balance'] == 100000)

        # Start staking
        node.walletsettings('stakelimit', {'height':1})
        node.reservebalance(False)

        assert(self.wait_for_height(node, 1))

        # stop staking
        node.reservebalance(True, 10000000)
        node1.reservebalance(True, 10000000)

        ro = node1.extkeyimportmaster('drip fog service village program equip minute dentist series hawk crop sphere olympic lazy garbage segment fox library good alley steak jazz force inmate')
        assert(ro['account_id'] == 'ahL1QdHhzNCtZWJzv36ScfPipJP1cUzAD8')

        extAddrTo = node1.getnewextaddress('test label')
        assert(extAddrTo == 'pparszNYZ1cpWxnNieFqHCV2rtXmG74a4WAXHHhXaRATzzU6kMixjy1rXDM1UM4LVgkXRpLNM1rQNvkgLf7kUeMXiyaBMK8aSR3td4b4cX4epnHF')

        ro = node1.filteraddresses()
        assert(len(ro) == 1)
        assert(ro[0]['label'] == 'test label')


        ro = node1.getaddressinfo(extAddrTo)
        assert(ro['ismine'] == True)
        assert(ro['isextkey'] == True)

        ro = node1.dumpprivkey(extAddrTo)
        assert(ro == 'xparFnnG7xJkEekTjWGumcEY1BKgryY4txW5Ce56KQPBJG7u3cNsUHxGgjVwHGEaxUGDAjT4SXv7fkWkp4TFaFHjaoZVh8Zricnwz3DjAxtqtmi')

        txnHash = node.sendtoaddress(extAddrTo, 10)

        ro = node.getmempoolentry(txnHash)
        assert(ro['height'] == 1)

        # start staking
        node.walletsettings('stakelimit', {'height':2})
        node.reservebalance(False)

        assert(self.wait_for_height(node, 2))

        # stop staking
        ro = node.reservebalance(True, 10000000)


        ro = node1.listtransactions()
        assert(len(ro) == 1)
        assert(ro[0]['address'] == 'pkGv5xgviEAEjwpRPeEt8c9cvraw2umKYo')
        assert(ro[0]['amount'] == 10)

        ro = node1.getwalletinfo()
        assert(ro['total_balance'] == 10)


        block2_hash = node.getblockhash(2)

        ro = node.getblock(block2_hash)
        assert(txnHash in ro['tx'])


        txnHash2 = node.sendtoaddress(extAddrTo, 20, '', '', False, 'narration test')

        assert(self.wait_for_mempool(node1, txnHash2))

        ro = node1.listtransactions()
        assert(len(ro) == 2)
        assert(ro[1]['address'] == 'pbo5e7tsLJBdUcCWteTTkGBxjW8Xy12o1V')
        assert(ro[1]['amount'] == 20)
        assert('narration test' in ro[1].values())


        ro = node.listtransactions()
        assert('narration test' in ro[-1].values())


        extAddrTo0 = node.getnewextaddress()

        txnHashes = []
        for k in range(24):
            v = round(0.01 * float(k+1), 5)
            node1.syncwithvalidationinterfacequeue()
            txnHash = node1.sendtoaddress(extAddrTo0, v, '', '', False)
            txnHashes.append(txnHash)

        for txnHash in txnHashes:
            assert(self.wait_for_mempool(node, txnHash))

        ro = node.listtransactions('*', 24)
        assert(len(ro) == 24)
        assert[isclose(ro[0]['amount'], 0.01)]
        assert[isclose(ro[23]['amount'], 0.24)]
        assert[ro[23]['address'] == 'pm23xKs3gy6AhZZ7JZe61Rn1m8VB83P49d']


        # start staking
        node.walletsettings('stakelimit', {'height':3})
        node.reservebalance(False)

        assert(self.wait_for_height(node, 3))

        block3_hash = node.getblockhash(3)
        ro = node.getblock(block3_hash)

        for txnHash in txnHashes:
            assert(txnHash in ro['tx'])


        # Test bech32 encoding
        ek_b32 = 'tpep1q3ehtcetqqqqqqesj04mypkmhnly5rktqmcpmjuq09lyevcsjxrgra6x8trd52vp2vpsk6kf86v3npg6x66ymrn5yrqnclxtqrlfdlw3j4f0309dhxct8kc68paxt'
        assert(node.getnewextaddress('lbl_b32', '', True) == ek_b32)
        assert(ek_b32 in json.dumps(node.filteraddresses()))
    def run_test(self):
        nodes = self.nodes

        self.import_genesis_coins_a(nodes[0])

        addr = 'pcwP4hTtaMb7n4urszBTsgxWLdNLU4yNGz'
        nodes[1].importaddress(addr, addr, True)

        ro = nodes[1].getaddressinfo(addr)
        assert (ro['ismine'] == False)
        assert (ro['iswatchonly'] == True)

        assert (isclose(nodes[1].getwalletinfo()['watchonly_balance'],
                        10000.0))
        assert (len(nodes[1].filtertransactions({'include_watchonly':
                                                 True})) == 1)

        self.log.info('Import watchonly account')
        ro = nodes[2].extkey(
            'importaccount', nodes[0].extkey('account', 'default',
                                             'true')['epkey'])
        nodes[2].extkey('setdefaultaccount', ro['account_id'])

        w0 = nodes[0].getwalletinfo()
        w2 = nodes[2].getwalletinfo()

        assert (w0['total_balance'] == w2['watchonly_total_balance'])
        assert (w0['txcount'] == w2['txcount'])

        sxaddr0 = nodes[0].getnewstealthaddress()
        sxaddrs = nodes[0].liststealthaddresses(True)
        addr_info = nodes[0].getaddressinfo(sxaddr0)
        scan_vk = sxaddrs[0]['Stealth Addresses'][0]['Scan Secret']
        spend_pk = sxaddrs[0]['Stealth Addresses'][0]['spend_public_key']
        spend_vk = sxaddrs[0]['Stealth Addresses'][0]['Spend Secret']
        ro = nodes[2].importstealthaddress(scan_vk, spend_pk)
        assert (ro['stealth_address'] == sxaddr0)
        assert (ro['watchonly'] == True)
        ro = nodes[2].getaddressinfo(sxaddr0)
        assert (ro['ismine'] == False)
        assert (ro['iswatchonly'] == True)

        txid = nodes[0].sendtoaddress(sxaddr0, 1.0)
        self.stakeBlocks(1)

        w0 = nodes[0].getwalletinfo()
        w2 = nodes[2].getwalletinfo()

        assert (w0['total_balance'] == w2['watchonly_total_balance'])
        assert (w0['txcount'] == w2['txcount'])

        self.log.info('Test sending blind output to watchonly')
        coincontrol = {'blind_watchonly_visible': True}
        outputs = [
            {
                'address': sxaddr0,
                'amount': 10
            },
        ]
        txid = nodes[0].sendtypeto('part', 'blind', outputs, 'comment',
                                   'comment-to', 4, 64, False, coincontrol)
        self.stakeBlocks(1)
        w0 = nodes[0].getbalances()
        w2 = nodes[2].getbalances()
        assert (isclose(w0['mine']['blind_trusted'], 10.0))
        assert ('watchonly' not in w0)
        assert (isclose(w2['mine']['blind_trusted'], 0.0))
        assert (isclose(w2['watchonly']['blind_trusted'], 10.0))

        self.log.info('Test sending anon output to watchonly')
        coincontrol = {'blind_watchonly_visible': True}
        outputs = [
            {
                'address': sxaddr0,
                'amount': 10
            },
        ]
        txid = nodes[0].sendtypeto('part', 'anon', outputs, 'comment',
                                   'comment-to', 4, 64, False, coincontrol)
        self.stakeBlocks(1)
        w0 = nodes[0].getbalances()
        w2 = nodes[2].getbalances()
        assert (isclose(w0['mine']['anon_immature'], 10.0))
        assert ('watchonly' not in w0)
        assert (isclose(w2['mine']['anon_immature'], 0.0))
        assert (isclose(w2['watchonly']['anon_immature'], 10.0))

        nodes[2].importstealthaddress(scan_vk, spend_vk)
        ro = nodes[2].getaddressinfo(sxaddr0)
        assert (ro['ismine'] == True)
        assert (ro['iswatchonly'] == False)

        nodes[2].rescanblockchain(0)
    def run_test(self):
        nodes = self.nodes
        txnHashes = []

        self.import_genesis_coins_a(nodes[0])

        nodes[1].extkeyimportmaster(
            'drip fog service village program equip minute dentist series hawk crop sphere olympic lazy garbage segment fox library good alley steak jazz force inmate'
        )
        sxAddrTo1 = nodes[1].getnewstealthaddress()
        assert (
            sxAddrTo1 ==
            'TetbYTGv5LiqyFiUD3a5HHbpSinQ9KiRYDGAMvRzPfz4RnHMbKGAwDr1fjLGJ5Eqg1XDwpeGyqWMiwdK3qM3zKWjzHNpaatdoHVzzA'
        )

        ro = nodes[1].getaddressinfo(sxAddrTo1)
        assert (ro['ismine'] == True)
        assert (ro['isstealthaddress'] == True)
        assert (ro['account'] == 'ahL1QdHhzNCtZWJzv36ScfPipJP1cUzAD8')
        assert (ro['scan_path'] == "m/0'/0'")
        assert (ro['spend_path'] == "m/0'/1'")

        txnHash = nodes[0].sendtoaddress(sxAddrTo1, 1)
        txnHashes.append(txnHash)

        assert (self.wait_for_mempool(nodes[1], txnHash))

        ro = nodes[1].listtransactions()
        assert (len(ro) == 1)
        assert (ro[0]['stealth_address'] == sxAddrTo1)
        assert (isclose(ro[0]['amount'], 1))

        ro = nodes[1].getaddressinfo(ro[0]['address'])
        assert (ro['ismine'] == True)
        assert (ro['from_stealth_address'] == sxAddrTo1)

        # Test imported sx address
        ro = nodes[1].importstealthaddress(
            '7pJLDnLxoYmkwpMNDX69dWGT7tuZ45LHgMajQDD8JrXb9LHmzfBA',
            '7uk8ELaUsop2r4vMg415wEGBfRd1MmY7JiXX7CRhwuwq5PaWXQ9N',
            'importedAddr', '5', '0xaaaa')
        sxAddrTo2 = '32eEcCuGkGjP82BTF3kquiCDjZWmZiyhqe7C6isbv6MJZSKAeWNx5g436QuhGNc6DNYpboDm3yNiqYmTmkg76wYr5JCKgdEUPqLCWaMW'
        assert (ro['stealth_address'] == sxAddrTo2)

        sro = str(nodes[1].liststealthaddresses())
        assert (sxAddrTo1 in sro)
        assert (sxAddrTo2 in sro)

        txnHash = nodes[0].sendtoaddress(sxAddrTo2, 0.2)
        txnHashes.append(txnHash)

        assert (self.wait_for_mempool(nodes[1], txnHash))

        ro = nodes[1].listtransactions()

        sxAddrTo3 = nodes[1].getnewstealthaddress()
        assert (
            sxAddrTo3 ==
            'TetcV5ZNzM6hT6Tz8Vc5t6FM74nojY8oFdeCnPr9Vyx6QNqrR7LKy87aZ1ytGGqBSAJ9CpWDj81pPwYPYHjg6Ks8GKXvGyLoBdTDYQ'
        )

        txnHash = nodes[0].sendtoaddress(sxAddrTo3, 0.3, '', '', False,
                                         'narration test')
        txnHashes.append(txnHash)

        assert (self.wait_for_mempool(nodes[1], txnHash))

        ro = nodes[1].listtransactions()
        assert (ro[-1]['stealth_address'] == sxAddrTo3)
        assert (isclose(ro[-1]['amount'], 0.3))
        assert ('narration test' in str(ro[-1]))

        # - Test encrypted narrations on sent wtx (from sending nodes[0])
        ro = nodes[0].listtransactions()
        assert ('narration test' in str(ro[-1]))

        oRoot2 = nodes[2].mnemonic('new')
        assert ('mnemonic' in oRoot2)

        ro = nodes[2].extkeyimportmaster(oRoot2['mnemonic'])
        assert ('Success.' in ro['result'])

        sxAddrTo2_1 = nodes[2].getnewstealthaddress('lbl test 3 bits', '3')

        ro = nodes[2].importstealthaddress(
            '7uk8ELaUsop2r4vMg415wEGBfRd1MmY7JiXX7CRhwuwq5PaWXQ9N',  # secrets are backwards
            '7pJLDnLxoYmkwpMNDX69dWGT7tuZ45LHgMajQDD8JrXb9LHmzfBA',
            'importedAddr',
            '9',
            '0xabcd')
        sxAddrTo2_2 = '9xFM875J9ApSymuT9Yuz6mqmy36JE1tNANGZmvS6hXFoQaV7ZLx8ZGjT2WULbuxwY4EsmNhHivLd4f8SRkxSjGjUED51SA4WqJRysUk9f'
        assert (ro['stealth_address'] == sxAddrTo2_2)

        nodes[2].encryptwallet('qwerty234')

        ro = nodes[2].walletpassphrase('qwerty234', 300)
        ro = nodes[2].reservebalance(True, 10000000)
        ro = nodes[2].walletlock()

        # Test send to locked wallet
        txnHash = nodes[0].sendtoaddress(sxAddrTo2_1, 0.4, '', '', False,
                                         'narration test node2')
        txnHashes.append(txnHash)

        assert (self.wait_for_mempool(nodes[2], txnHash))

        ro = nodes[2].listtransactions()
        assert (isclose(ro[-1]['amount'], 0.4))
        assert ('narration test node2' in str(ro[-1]))

        txnHash = nodes[0].sendtoaddress(sxAddrTo2_2, 0.5, '', '', False,
                                         'test 5')
        txnHashes.append(txnHash)

        assert (self.wait_for_mempool(nodes[2], txnHash))

        ro = nodes[2].listtransactions()
        assert (isclose(ro[-1]['amount'], 0.5))
        assert ('test 5' in str(ro[-1]))

        txnHash = nodes[0].sendtoaddress(sxAddrTo2_2, 0.6, '', '', False,
                                         'test 6')
        txnHashes.append(txnHash)

        assert (self.wait_for_mempool(nodes[2], txnHash))

        ro = nodes[2].listtransactions()
        assert (isclose(ro[-1]['amount'], 0.6))
        assert ('test 6' in str(ro[-1]))

        nodes[2].walletpassphrase('qwerty234', 400)

        self.stakeBlocks(1)

        block1_hash = nodes[0].getblockhash(1)
        ro = nodes[0].getblock(block1_hash)
        for txnHash in txnHashes:
            assert (txnHash in ro['tx'])

        self.sync_all()
        ro = nodes[2].getwalletinfo()

        txnHash = nodes[2].sendtoaddress(sxAddrTo3, 1.4, '', '', False,
                                         'node2 -> node1')
        txnHashes.append(txnHash)

        assert (self.wait_for_mempool(nodes[1], txnHash))
        ro = nodes[1].listtransactions()
        assert (isclose(ro[-1]['amount'], 1.4))
        assert ('node2 -> node1' in str(ro[-1]))

        assert_raises_rpc_error(
            -8, 'Spend secret must be different to scan secret.',
            nodes[0].importstealthaddress,
            '57F59BA2F9D9146635380FA453E4EED7E44290F0AAAE657C300AB0E51184151E',
            '57F59BA2F9D9146635380FA453E4EED7E44290F0AAAE657C300AB0E51184151E',
            '', '9', '0xabcd', True)

        # Test bech32 encoding
        ro = nodes[0].importstealthaddress(
            '57F59BA2F9D9146635380FA453E4EED7E44290F0AAAE657C300AB0E51184151E',
            'F4708BD9B3D367F02EA6581AC446F12AA24350F1E0DEE309FACB561C2D81877A',
            'importedAddr1b32', '9', '0xabcd', True)
        sx1_b32 = 'tps1qqpt67v3g652e5mvqv3hl60zkj3424l0chhvsc0ervrltujd7dgl6uspqfd2hf5dglxt285yp9d9h3nym39cdzdpr5ndcm940lhmg6z3tjuvzqqfe5qs2gep0t'
        assert (ro['stealth_address'] == sx1_b32)

        ro = nodes[0].getnewstealthaddress('importedAddr2b32', '', '', True)
        sx2_b32 = 'tps1qqpxdqs29p7sadu3fqpc808aw93a25k9zjy6f5hzgyf3vluy3n4f4ygpqwkkfhujgzgq83y55enleldy9lh7tkv6dmkaxjrjtyaswjcx3mjyyqqqhefkp7'
        assert (ro == sx2_b32)
        flat = json.dumps(nodes[0].filteraddresses())
        assert (sx1_b32 in flat and sx2_b32 in flat)

        ro = nodes[1].createrawtransaction([], {sx1_b32: 0.1})
        ro = nodes[1].fundrawtransaction(ro)
        ro = nodes[1].signrawtransactionwithwallet(ro['hex'])
        assert (ro['complete'] == True)
        txnHash = nodes[1].sendrawtransaction(ro['hex'])
        txnHashes.append(txnHash)

        assert (self.wait_for_mempool(nodes[0], txnHash))

        ro = nodes[0].filtertransactions({'use_bech32': True})
        assert (ro[0]['outputs'][0]['stealth_address'] == sx1_b32)

        ro = nodes[0].derivefromstealthaddress(sx2_b32)
        assert (len(ro) == 4)
        assert (len(ro['pubkey']) == 66)
        assert (len(ro['ephemeral_pubkey']) == 66)

        recover = nodes[0].derivefromstealthaddress(sx2_b32,
                                                    ro['ephemeral_pubkey'])
        assert (recover['pubkey'] == ro['pubkey'])
        assert (recover['ephemeral_pubkey'] == ro['ephemeral_pubkey'])
        assert (len(recover['privatekey']) > 0)

        replay = nodes[0].derivefromstealthaddress(sx2_b32,
                                                   ro['ephemeral_privatekey'])
        assert (replay['pubkey'] == ro['pubkey'])
        assert (replay['ephemeral_pubkey'] == ro['ephemeral_pubkey'])

        self.log.info('Test v2 stealth address')
        sxAddrV2 = []
        for i in range(6):
            sxAddrV2.append(nodes[1].getnewstealthaddress(
                'addr v2 {}'.format(i), '0', '0', True, True))
        # Import should recover both stealth addresses, despite only detecting txns for the second and sixth.
        nodes[0].sendtoaddress(sxAddrV2[1], 2.0)
        self.stakeBlocks(1)
        nodes[0].sendtoaddress(sxAddrV2[5], 2.0)
        self.stakeBlocks(1)

        self.log.info('Test rescan lookahead')
        nodes[1].createwallet('test_import')
        w_import = nodes[1].get_wallet_rpc('test_import')
        w_import.extkeyimportmaster(
            'drip fog service village program equip minute dentist series hawk crop sphere olympic lazy garbage segment fox library good alley steak jazz force inmate'
        )
        wi_info = w_import.getwalletinfo()

        w1 = nodes[1].get_wallet_rpc('default_wallet')
        w1_info = w1.getwalletinfo()

        rv = w1.liststealthaddresses(False, {'verbose': True})
        found = False
        for sxaddr in rv[0]['Stealth Addresses']:
            if sxaddr['Address'] == sxAddrV2[1]:
                assert (sxaddr['received_addresses'] == 1)
                found = True
                break
        assert (found)

        # Imported wallet should be missing imported sx addr
        assert (wi_info['txcount'] == w1_info['txcount'] - 1)

        wi_ls = w_import.liststealthaddresses()
        w1_ls = w1.liststealthaddresses()
        w1_ls_flat = self.dumpj(w1_ls)
        for sx in wi_ls[0]['Stealth Addresses']:
            assert (sx['Address'] in w1_ls_flat)
Beispiel #27
0
    def run_test(self):
        nodes = self.nodes
        txnHashes = []

        # Stop staking
        for i in range(len(nodes)):
            nodes[i].reservebalance(True, 10000000)

        ro = nodes[0].extkeyimportmaster('abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb')
        assert(ro['account_id'] == 'aaaZf2qnNr5T7PWRmqgmusuu5ACnBcX2ev')
        assert(nodes[0].getwalletinfo()['total_balance'] == 100000)


        ro = nodes[1].extkeyimportmaster('drip fog service village program equip minute dentist series hawk crop sphere olympic lazy garbage segment fox library good alley steak jazz force inmate')
        sxAddrTo1 = nodes[1].getnewstealthaddress()
        assert(sxAddrTo1 == 'TetbYTGv5LiqyFiUD3a5HHbpSinQ9KiRYDGAMvRzPfz4RnHMbKGAwDr1fjLGJ5Eqg1XDwpeGyqWMiwdK3qM3zKWjzHNpaatdoHVzzA')

        ro = nodes[1].getaddressinfo(sxAddrTo1)
        assert(ro['ismine'] == True)
        assert(ro['isstealthaddress'] == True)

        txnHash = nodes[0].sendtoaddress(sxAddrTo1, 1)
        txnHashes.append(txnHash)

        assert(self.wait_for_mempool(nodes[1], txnHash))

        ro = nodes[1].listtransactions()
        assert(len(ro) == 1)
        assert(ro[0]['stealth_address'] == sxAddrTo1)
        assert(isclose(ro[0]['amount'], 1))

        ro = nodes[1].getaddressinfo(ro[0]['address'])
        assert(ro['ismine'] == True)
        assert(ro['from_stealth_address'] == sxAddrTo1)

        # Test imported sx address
        ro = nodes[1].importstealthaddress('7pJLDnLxoYmkwpMNDX69dWGT7tuZ45LHgMajQDD8JrXb9LHmzfBA',
            '7uk8ELaUsop2r4vMg415wEGBfRd1MmY7JiXX7CRhwuwq5PaWXQ9N', 'importedAddr', '5', '0xaaaa')
        sxAddrTo2 = '32eEcCuGkGjP82BTF3kquiCDjZWmZiyhqe7C6isbv6MJZSKAeWNx5g436QuhGNc6DNYpboDm3yNiqYmTmkg76wYr5JCKgdEUPqLCWaMW'
        assert(ro['stealth_address'] == sxAddrTo2)


        ro = nodes[1].liststealthaddresses()
        sro = str(ro)
        assert(sxAddrTo1 in sro)
        assert(sxAddrTo2 in sro)

        txnHash = nodes[0].sendtoaddress(sxAddrTo2, 0.2)
        txnHashes.append(txnHash)

        assert(self.wait_for_mempool(nodes[1], txnHash))

        ro = nodes[1].listtransactions()

        sxAddrTo3 = nodes[1].getnewstealthaddress()
        assert(sxAddrTo3 == 'TetcV5ZNzM6hT6Tz8Vc5t6FM74nojY8oFdeCnPr9Vyx6QNqrR7LKy87aZ1ytGGqBSAJ9CpWDj81pPwYPYHjg6Ks8GKXvGyLoBdTDYQ')

        txnHash = nodes[0].sendtoaddress(sxAddrTo3, 0.3, '', '', False, 'narration test')
        txnHashes.append(txnHash)

        assert(self.wait_for_mempool(nodes[1], txnHash))

        ro = nodes[1].listtransactions()
        assert(ro[-1]['stealth_address'] == sxAddrTo3)
        assert(isclose(ro[-1]['amount'], 0.3))
        assert('narration test' in str(ro[-1]))



        # - Test encrypted narrations on sent wtx (from sending nodes[0])
        ro = nodes[0].listtransactions()
        assert('narration test' in str(ro[-1]))


        oRoot2 = nodes[2].mnemonic('new')
        assert('mnemonic' in oRoot2)

        ro = nodes[2].extkeyimportmaster(oRoot2['mnemonic'])
        assert('Success.' in ro['result'])

        sxAddrTo2_1 = nodes[2].getnewstealthaddress('lbl test 3 bits', '3')


        ro = nodes[2].importstealthaddress('7uk8ELaUsop2r4vMg415wEGBfRd1MmY7JiXX7CRhwuwq5PaWXQ9N', # secrets are backwards
            '7pJLDnLxoYmkwpMNDX69dWGT7tuZ45LHgMajQDD8JrXb9LHmzfBA', 'importedAddr', '9', '0xabcd')
        sxAddrTo2_2 = '9xFM875J9ApSymuT9Yuz6mqmy36JE1tNANGZmvS6hXFoQaV7ZLx8ZGjT2WULbuxwY4EsmNhHivLd4f8SRkxSjGjUED51SA4WqJRysUk9f'
        assert(ro['stealth_address'] == sxAddrTo2_2)


        nodes[2].node_encrypt_wallet('qwerty234')
        self.start_node(2)

        ro = nodes[2].walletpassphrase('qwerty234', 300)
        ro = nodes[2].reservebalance(True, 10000000)
        ro = nodes[2].walletlock()
        connect_nodes_bi(self.nodes, 0, 2)

        # Test send to locked wallet
        txnHash = nodes[0].sendtoaddress(sxAddrTo2_1, 0.4, '', '', False, 'narration test node2')
        txnHashes.append(txnHash)

        assert(self.wait_for_mempool(nodes[2], txnHash))

        ro = nodes[2].listtransactions()
        assert(isclose(ro[-1]['amount'], 0.4))
        assert('narration test node2' in str(ro[-1]))

        txnHash = nodes[0].sendtoaddress(sxAddrTo2_2, 0.5, '', '', False, 'test 5')
        txnHashes.append(txnHash)

        assert(self.wait_for_mempool(nodes[2], txnHash))

        ro = nodes[2].listtransactions()
        assert(isclose(ro[-1]['amount'], 0.5))
        assert('test 5' in str(ro[-1]))

        txnHash = nodes[0].sendtoaddress(sxAddrTo2_2, 0.6, '', '', False, 'test 6')
        txnHashes.append(txnHash)

        assert(self.wait_for_mempool(nodes[2], txnHash))

        ro = nodes[2].listtransactions()
        assert(isclose(ro[-1]['amount'], 0.6))
        assert('test 6' in str(ro[-1]))

        ro = nodes[2].walletpassphrase('qwerty234', 400)



        # Start staking
        ro = nodes[0].walletsettings('stakelimit', {'height':1})
        ro = nodes[0].reservebalance(False)

        assert(self.wait_for_height(nodes[0], 1))

        block1_hash = nodes[0].getblockhash(1)
        ro = nodes[0].getblock(block1_hash)
        for txnHash in txnHashes:
            assert(txnHash in ro['tx'])

        self.sync_all()
        ro = nodes[2].getwalletinfo()

        txnHash = nodes[2].sendtoaddress(sxAddrTo3, 1.4, '', '', False, 'node2 -> node1')
        txnHashes.append(txnHash)

        assert(self.wait_for_mempool(nodes[1], txnHash))
        ro = nodes[1].listtransactions()
        assert(isclose(ro[-1]['amount'], 1.4))
        assert('node2 -> node1' in str(ro[-1]))


        assert_raises_rpc_error(-8, 'Spend secret must be different to scan secret.',
            nodes[0].importstealthaddress, '57F59BA2F9D9146635380FA453E4EED7E44290F0AAAE657C300AB0E51184151E',
            '57F59BA2F9D9146635380FA453E4EED7E44290F0AAAE657C300AB0E51184151E', '', '9', '0xabcd', True)

        # Test bech32 encoding
        ro = nodes[0].importstealthaddress('57F59BA2F9D9146635380FA453E4EED7E44290F0AAAE657C300AB0E51184151E',
            'F4708BD9B3D367F02EA6581AC446F12AA24350F1E0DEE309FACB561C2D81877A', 'importedAddr1b32', '9', '0xabcd', True)
        sx1_b32 = 'tps1qqpt67v3g652e5mvqv3hl60zkj3424l0chhvsc0ervrltujd7dgl6uspqfd2hf5dglxt285yp9d9h3nym39cdzdpr5ndcm940lhmg6z3tjuvzqqfe5qs2gep0t'
        assert(ro['stealth_address'] == sx1_b32)

        ro = nodes[0].getnewstealthaddress('importedAddr2b32', '', '', True)
        sx2_b32 = 'tps1qqpxdqs29p7sadu3fqpc808aw93a25k9zjy6f5hzgyf3vluy3n4f4ygpqwkkfhujgzgq83y55enleldy9lh7tkv6dmkaxjrjtyaswjcx3mjyyqqqhefkp7'
        assert(ro == sx2_b32)
        flat = json.dumps(nodes[0].filteraddresses())
        assert(sx1_b32 in flat and sx2_b32 in flat)

        ro = nodes[1].createrawtransaction([], {sx1_b32:0.1})
        ro = nodes[1].fundrawtransaction(ro)
        ro = nodes[1].signrawtransactionwithwallet(ro['hex'])
        assert(ro['complete'] == True)
        txnHash = nodes[1].sendrawtransaction(ro['hex'])
        txnHashes.append(txnHash)

        assert(self.wait_for_mempool(nodes[0], txnHash))

        ro = nodes[0].filtertransactions({ 'use_bech32': True })
        assert(ro[0]['outputs'][0]['stealth_address'] == sx1_b32)

        ro = nodes[0].derivefromstealthaddress(sx2_b32)
        assert(len(ro) == 4)
        assert(len(ro['pubkey']) == 66)
        assert(len(ro['ephemeral_pubkey']) == 66)

        recover = nodes[0].derivefromstealthaddress(sx2_b32, ro['ephemeral_pubkey'])
        assert(recover['pubkey'] == ro['pubkey'])
        assert(recover['ephemeral_pubkey'] == ro['ephemeral_pubkey'])
        assert(len(recover['privatekey']) > 0)

        replay = nodes[0].derivefromstealthaddress(sx2_b32, ro['ephemeral_privatekey'])
        assert(replay['pubkey'] == ro['pubkey'])
        assert(replay['ephemeral_pubkey'] == ro['ephemeral_pubkey'])
    def run_test(self):

        # Check that particl has been built with USB device enabled
        config = configparser.ConfigParser()
        if not self.options.configfile:
            self.options.configfile = os.path.dirname(
                __file__) + "/../config.ini"
        config.read_file(open(self.options.configfile))

        if not config["components"].getboolean("ENABLE_USBDEVICE"):
            raise SkipTest(
                "particld has not been built with usb device enabled.")

        nodes = self.nodes

        nodes[0].extkeyimportmaster(
            'abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb'
        )
        assert (nodes[0].getwalletinfo()['total_balance'] == 100000)

        ro = nodes[1].listdevices()
        assert (len(ro) == 1)
        assert (ro[0]['vendor'] == 'Debug')
        assert (ro[0]['product'] == 'Device')

        ro = nodes[1].getdeviceinfo()
        assert (ro['device'] == 'debug')

        ro = nodes[1].getdevicepublickey('0')
        assert (ro['address'] == 'praish9BVxVdhykpqBYEs6L65AQ7iKd9z1')
        assert (ro['path'] == "m/44'/1'/0'/0")

        ro = nodes[1].getdevicepublickey('0/1')
        assert (ro['address'] == 'peWvjy33QptC2Gz3ww7jTTLPjC2QJmifBR')
        assert (ro['path'] == "m/44'/1'/0'/0/1")

        ro = nodes[1].getdevicexpub("m/44'/1'/0'", "")
        assert (
            ro ==
            'pparszKXPyRegWYwPacdPduNPNEryRbZDCAiSyo8oZYSsbTjc6FLP4TCPEX58kAeCB6YW9cSdR6fsbpeWDBTgjbkYjXCoD9CNoFVefbkg3exzpQE'
        )

        message = 'This is just a test message'
        sig = nodes[1].devicesignmessage('0/1', message)
        assert (True == nodes[1].verifymessage(
            'peWvjy33QptC2Gz3ww7jTTLPjC2QJmifBR', sig, message))

        ro = nodes[1].initaccountfromdevice('test_acc')
        assert (
            ro['extkey'] ==
            'pparszKXPyRegWYwPacdPduNPNEryRbZDCAiSyo8oZYSsbTjc6FLP4TCPEX58kAeCB6YW9cSdR6fsbpeWDBTgjbkYjXCoD9CNoFVefbkg3exzpQE'
        )
        assert (ro['path'] == "m/44'/1'/0'")

        ro = nodes[1].extkey('list', 'true')
        assert (len(ro) == 1)
        assert (ro[0]['path'] == "m/44h/1h/0h")
        assert (
            ro[0]['epkey'] ==
            'pparszKXPyRegWYwPacdPduNPNEryRbZDCAiSyo8oZYSsbTjc6FLP4TCPEX58kAeCB6YW9cSdR6fsbpeWDBTgjbkYjXCoD9CNoFVefbkg3exzpQE'
        )
        assert (ro[0]['label'] == 'test_acc')
        assert (ro[0]['hardware_device'] == '0xffff 0x0001')

        ro = nodes[1].extkey('account')
        n = getIndexAtProperty(ro['chains'], 'use_type', 'stealth_spend')
        assert (n > -1)
        assert (ro['chains'][n]['path'] == "m/0h/444445h")

        addr1_0 = nodes[1].getnewaddress('lbl1_0')
        ro = nodes[1].filteraddresses()
        assert (len(ro) == 1)
        assert (ro[0]['path'] == 'm/0/0')
        assert (ro[0]['owned'] == 'true')
        assert (ro[0]['label'] == 'lbl1_0')

        va_addr1_0 = nodes[1].getaddressinfo(addr1_0)
        assert (va_addr1_0['ismine'] == True)
        assert (va_addr1_0['iswatchonly'] == False)
        assert (va_addr1_0['isondevice'] == True)
        assert (va_addr1_0['path'] == 'm/0/0')

        try:
            nodes[1].getnewstealthaddress()
        except JSONRPCException as e:
            pass
        else:
            assert (False)

        txnid0 = nodes[0].sendtoaddress(addr1_0, 10)

        self.stakeBlocks(1)

        ro = nodes[1].getwalletinfo()
        assert (isclose(ro['balance'], 10.0))

        addr0_0 = nodes[0].getnewaddress()
        hexRaw = nodes[1].createrawtransaction([], {addr0_0: 1})
        hexFunded = nodes[1].fundrawtransaction(hexRaw)['hex']
        txDecoded = nodes[1].decoderawtransaction(hexFunded)

        ro = nodes[1].devicesignrawtransaction(hexFunded)
        assert (ro['complete'] == True)

        txnid1 = nodes[1].sendrawtransaction(ro['hex'])

        self.sync_all()
        self.stakeBlocks(1)

        ro = nodes[1].devicesignrawtransaction(hexFunded)
        assert (ro['errors'][0]['error'] == 'Input not found or already spent')

        prevtxns = [
            {
                'txid': txDecoded['vin'][0]['txid'],
                'vout': txDecoded['vin'][0]['vout'],
                'scriptPubKey': va_addr1_0['scriptPubKey'],
                'amount': 10
            },
        ]
        ro = nodes[1].devicesignrawtransaction(hexFunded, prevtxns, [
            '0/0',
        ])
        assert (ro['complete'] == True)

        ro = nodes[1].listunspent()
        assert (ro[0]['ondevice'] == True)

        txnid2 = nodes[1].sendtoaddress(addr0_0, 0.1)

        self.sync_all()

        ro = nodes[0].filtertransactions()
        assert (ro[0]['txid'] == txnid2)

        hwsxaddr = nodes[1].devicegetnewstealthaddress()
        assert (
            hwsxaddr ==
            'tps1qqpdwu7gqjqz9s9wfek843akvkzvw0xq3tkzs93sj4ceq60cp54mvzgpqf4tp6d7h0nza2xe362am697dax24hcr33yxqwvq58l5cf6j6q5hkqqqgykgrc'
        )

        hwsxaddr2 = nodes[1].devicegetnewstealthaddress(
            'lbl2 4bits', '4', '0xaaaa', True)
        assert (
            hwsxaddr2 ==
            'tps1qqpewyspjp93axk82zahx5xfjyprpvypfgnp95n9aynxxw3w0qs63acpq0s5z2rwk0raczg8jszl9qy5stncud76ahr5etn9hqmp30e3e86w2qqypgh9sgv0'
        )

        ro = nodes[1].getaddressinfo(hwsxaddr2)
        assert (ro['prefix_num_bits'] == 4)
        assert (ro['prefix_bitfield'] == '0x000a')
        assert (ro['isondevice'] == True)

        ro = nodes[1].liststealthaddresses()
        assert (len(ro[0]['Stealth Addresses']) == 2)

        ro = nodes[1].filteraddresses()
        assert (len(ro) == 3)

        txnid3 = nodes[0].sendtoaddress(hwsxaddr, 0.1, '', '', False,
                                        'test msg')
        self.stakeBlocks(1)

        ro = nodes[1].listtransactions()
        assert (len(ro) == 4)
        assert ('test msg' in json.dumps(ro[3], default=self.jsonDecimal))

        ro = nodes[1].listunspent()
        inputs = []
        for output in ro:
            if output['txid'] == txnid3:
                inputs.append({'txid': txnid3, 'vout': output['vout']})
                break
        assert (len(inputs) > 0)
        hexRaw = nodes[1].createrawtransaction(inputs, {addr0_0: 0.09})

        ro = nodes[1].devicesignrawtransaction(hexRaw)
        assert (ro['complete'] == True)

        # import privkey in node2
        rootkey = nodes[2].extkeyaltversion(
            'xparFdrwJK7K2nfYzrkEqAKr5EcJNdY4c6ZNoLFFx1pMXQSQpo5MAufjogrS17RkqsLAijZJaBDHhG3G7SuJjtsTmRRTEKZDzGMnVCeX59cQCiR'
        )
        ro = nodes[2].extkey('import', rootkey, 'master key', True)
        ro = nodes[2].extkey('setmaster', ro['id'])
        assert (ro['result'] == 'Success.')
        ro = nodes[2].extkey('deriveaccount', 'test account')
        ro = nodes[2].extkey('setdefaultaccount', ro['account'])
        assert (ro['result'] == 'Success.')

        ro = nodes[1].extkey('account')
        n = getIndexAtProperty(ro['chains'], 'use_type', 'stealth_spend')
        assert (n > -1)
        assert (ro['chains'][n]['path'] == "m/0h/444445h")

        addrtest = nodes[2].getnewaddress()
        ro = nodes[1].getdevicepublickey('0/0')
        assert (addrtest == ro['address'])

        addrtest = nodes[2].getnewstealthaddress('', '0', '', True, True)
        assert (addrtest == hwsxaddr)

        addrtest2 = nodes[2].getnewstealthaddress('lbl2 4bits', '4', '0xaaaa',
                                                  True, True)
        assert (addrtest2 == hwsxaddr2)

        extaddr1_0 = nodes[1].getnewextaddress()
        extaddr2_0 = nodes[2].getnewextaddress()
        assert (extaddr1_0 == extaddr2_0)

        # Ensure account matches after node restarts
        account1 = nodes[1].extkey('account')
        self.restart_node(1)
        account1_r = nodes[1].extkey('account')
        assert (json.dumps(account1) == json.dumps(account1_r))
    def run_test(self):
        tmpdir = self.options.tmpdir
        nodes = self.nodes

        nodes[0].extkeyimportmaster('abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb')
        assert(nodes[0].getwalletinfo()['total_balance'] == 100000)

        nodes[1].extkeyimportmaster('pact mammal barrel matrix local final lecture chunk wasp survey bid various book strong spread fall ozone daring like topple door fatigue limb olympic', '', 'true')
        nodes[1].getnewextaddress('lblExtTest')
        nodes[1].rescanblockchain()
        assert(nodes[1].getwalletinfo()['total_balance'] == 25000)

        address0 = nodes[0].getnewaddress()
        address1 = nodes[1].getnewaddress()
        nodes[0].smsgaddlocaladdress(address0)
        nodes[1].smsgaddaddress(address0, nodes[0].smsglocalkeys()['wallet_keys'][0]['public_key'])

        text = 'Some text to test'
        ro = nodes[1].smsgsend(address1, address0, text, True, 10, True)
        assert(ro['result'] == 'Not Sent.')
        assert(isclose(ro['fee'], 0.00157000))


        assert(nodes[0].smsggetfeerate() == 50000)
        assert(nodes[1].smsggetfeerate() == 50000)

        ro = nodes[0].walletsettings('stakingoptions', {'smsgfeeratetarget' : 0.001})
        assert(float(ro['stakingoptions']['smsgfeeratetarget']) == 0.001)

        self.stakeBlocks(49)
        assert(nodes[0].smsggetfeerate() == 50000)

        ro = nodes[1].smsgsend(address1, address0, text, True, 10)
        assert(ro['result'] == 'Sent.')
        assert('msgid' in ro)
        assert('txid' in ro)
        assert(isclose(ro['fee'], 0.00157000))

        self.stakeBlocks(1)
        assert(nodes[0].smsggetfeerate() == 61939)

        ro = nodes[1].smsgsend(address1, address0, text, True, 10, True)
        assert(ro['result'] == 'Not Sent.')
        assert(isclose(ro['fee'], 0.00186600))

        ro = nodes[1].getblock(nodes[1].getblockhash(50), 2)
        assert(ro['tx'][0]['vout'][0]['smsgfeerate'] * COIN == 61939)
        assert(ro['tx'][0]['vout'][0]['smsgdifficulty'] == '1f0fffff')

        ro = nodes[0].walletsettings('stakingoptions', {'smsgdifficultytarget' : '000000000000bfffffffffffffffffffffffffffffffffffffffffffffffffff', 'smsgfeeratetarget' : 0.001})
        assert(float(ro['stakingoptions']['smsgfeeratetarget']) == 0.001)
        assert(ro['stakingoptions']['smsgdifficultytarget'] == '000000000000bfffffffffffffffffffffffffffffffffffffffffffffffffff')

        self.sync_all()

        self.stakeBlocks(1)
        assert(nodes[0].smsggetfeerate() == 61939)

        ro = nodes[1].getrawtransaction(nodes[1].getblockreward(51)['coinstake'], True)
        block_51_smsgfeerate = ro['vout'][0]['smsgfeerate'] * COIN
        block_51_smsgdifficulty = int(ro['vout'][0]['smsgdifficulty'], 16)
        assert(block_51_smsgfeerate > 61939)
        assert(block_51_smsgdifficulty < 0x1f0fffff)

        self.waitForSmsgExchange(1, 1, 0)

        ro = nodes[0].smsginbox('all')
        assert(len(ro['messages']) == 1)
        assert(ro['messages'][0]['text'] == text)

        self.log.info('Verify node settings survive a restart')
        self.stop_node(0)
        self.start_node(0, self.extra_args[0])
        connect_nodes(self.nodes[0], 1)

        ro = nodes[0].walletsettings('stakingoptions')
        assert(float(ro['stakingoptions']['smsgfeeratetarget']) == 0.001)
        assert(ro['stakingoptions']['smsgdifficultytarget'] == '000000000000bfffffffffffffffffffffffffffffffffffffffffffffffffff')

        self.stakeBlocks(1)

        ro = nodes[1].getblock(nodes[1].getblockhash(52), 2)
        assert(ro['tx'][0]['vout'][0]['smsgfeerate'] * COIN > block_51_smsgfeerate)
        assert(int(ro['tx'][0]['vout'][0]['smsgdifficulty'], 16) < block_51_smsgdifficulty)
Beispiel #30
0
    def run_test(self):
        tmpdir = self.options.tmpdir
        nodes = self.nodes

        # Stop staking
        for i in range(len(nodes)):
            nodes[i].reservebalance(True, 10000000)

        nodes[0].extkeyimportmaster(nodes[0].mnemonic('new')['master'])
        nodes[1].extkeyimportmaster(
            'abandon baby cabbage dad eager fabric gadget habit ice kangaroo lab absorb'
        )

        address0 = nodes[0].getnewaddress()  # will be different each run
        address1 = nodes[1].getnewaddress()
        assert (address1 == 'pX9N6S76ZtA5BfsiJmqBbjaEgLMHpt58it')

        ro = nodes[0].smsglocalkeys()
        assert (len(ro['wallet_keys']) == 0)

        ro = nodes[0].smsgaddlocaladdress(address0)
        assert ('Receiving messages enabled for address' in ro['result'])

        ro = nodes[0].smsglocalkeys()
        assert (len(ro['wallet_keys']) == 1)

        ro = nodes[1].smsgaddaddress(address0,
                                     ro['wallet_keys'][0]['public_key'])
        assert (ro['result'] == 'Public key added to db.')

        text_1 = "['data':'test','value':1]"
        ro = nodes[1].smsgsend(address1, address0, text_1, True, 4, True)
        assert (ro['result'] == 'Not Sent.')
        assert (isclose(ro['fee'], 0.00085800))

        ro = nodes[1].smsgsend(address1, address0, text_1, True, 4)
        assert (ro['result'] == 'Sent.')

        self.stakeBlocks(1, nStakeNode=1)
        self.waitForSmsgExchange(1, 1, 0)

        ro = nodes[0].smsginbox()
        assert (len(ro['messages']) == 1)
        assert (ro['messages'][0]['text'] == text_1)

        ro = nodes[0].smsgimportprivkey(
            '7pHSJFY1tNwi6d68UttGzB8YnXq2wFWrBVoadLv4Y6ekJD3L1iKs',
            'smsg test key')

        address0_1 = 'pasdoMwEn35xQUXFvsChWAQjuG8rEKJQW9'
        text_2 = "['data':'test','value':2]"
        ro = nodes[0].smsglocalkeys()
        assert (len(ro['smsg_keys']) == 1)
        assert (ro['smsg_keys'][0]['address'] == address0_1)

        ro = nodes[1].smsgaddaddress(address0_1,
                                     ro['smsg_keys'][0]['public_key'])
        assert (ro['result'] == 'Public key added to db.')

        ro = nodes[1].smsgsend(address1, address0_1, text_2, True, 4)
        assert (ro['result'] == 'Sent.')

        self.stakeBlocks(1, nStakeNode=1)
        self.waitForSmsgExchange(2, 1, 0)

        ro = nodes[0].smsginbox()
        assert (len(ro['messages']) == 1)
        assert (ro['messages'][0]['text'] == text_2)

        ro = nodes[0].encryptwallet("qwerty234")
        assert ("wallet encrypted" in ro)

        nodes[0].wait_until_stopped(
        )  # wait until encryptwallet has shut down node
        self.start_node(0, self.extra_args[0])
        connect_nodes(self.nodes[0], 1)
        connect_nodes(self.nodes[0], 2)
        ro = nodes[0].getwalletinfo()
        assert (ro['encryptionstatus'] == 'Locked')

        localkeys0 = nodes[0].smsglocalkeys()
        assert (len(localkeys0['smsg_keys']) == 1)
        assert (len(localkeys0['wallet_keys']) == 1)
        assert (localkeys0['smsg_keys'][0]['address'] == address0_1)
        assert (localkeys0['wallet_keys'][0]['address'] == address0)

        text_3 = "['data':'test','value':3]"
        ro = nodes[0].smsglocalkeys()
        assert (len(ro['smsg_keys']) == 1)
        assert (ro['smsg_keys'][0]['address'] == address0_1)

        ro = nodes[1].smsgsend(address1, address0, 'Non paid msg')
        assert (ro['result'] == 'Sent.')

        ro = nodes[1].smsgsend(address1, address0_1, text_3, True, 4)
        assert (ro['result'] == 'Sent.')
        assert (len(ro['txid']) == 64)

        self.sync_all()
        self.stakeBlocks(1, nStakeNode=1)
        self.waitForSmsgExchange(4, 1, 0)

        ro = nodes[0].walletpassphrase("qwerty234", 300)
        ro = nodes[0].smsginbox()
        assert (len(ro['messages']) == 2)
        flat = json.dumps(ro, default=self.jsonDecimal)
        assert ('Non paid msg' in flat)
        assert (text_3 in flat)

        ro = nodes[0].walletlock()

        ro = nodes[0].smsginbox("all")
        assert (len(ro['messages']) == 4)
        flat = json.dumps(ro, default=self.jsonDecimal)
        assert (flat.count('Wallet is locked') == 2)