class OfflineTest(unittest.TestCase): addr = "47ewoP19TN7JEEnFKUJHAYhGxkeTRH82sf36giEp9AcNfDBfkAtRLX7A6rZz18bbNHPNV7ex6WYbMN3aKisFRJZ8Ebsmgef" svk = "6d9056aa2c096bfcd2f272759555e5764ba204dd362604a983fa3e0aafd35901" def setUp(self): self.wallet = Wallet(OfflineWallet(self.addr, view_key=self.svk)) def test_offline_exception(self): self.assertRaises(WalletIsOffline, self.wallet.height) self.assertRaises(WalletIsOffline, self.wallet.new_account) self.assertRaises(WalletIsOffline, self.wallet.new_address) self.assertRaises(WalletIsOffline, self.wallet.export_outputs) self.assertRaises(WalletIsOffline, self.wallet.import_outputs, "") self.assertRaises(WalletIsOffline, self.wallet.export_key_images) self.assertRaises(WalletIsOffline, self.wallet.import_key_images, "") self.assertRaises(WalletIsOffline, self.wallet.balances) self.assertRaises(WalletIsOffline, self.wallet.balance) self.assertRaises(WalletIsOffline, self.wallet.incoming) self.assertRaises(WalletIsOffline, self.wallet.outgoing) self.assertRaises(WalletIsOffline, self.wallet.transfer, self.wallet.get_address(1, 0), 1) self.assertRaises( WalletIsOffline, self.wallet.transfer_multiple, [(self.wallet.get_address(1, 0), 1), (self.wallet.get_address(1, 1), 2)], )
def test_1(): InitLoggingSetting() logging.info("trx scanner starting ...") rpc = JSONRPCWalletEx(protocol='http', host='192.168.10.160', port=38089, verify_ssl_certs=False, timeout=60) wallet = Wallet(backend=rpc) print(wallet.view_key()) # watch-only 不能获取, 否则抛异常 # print(wallet.seed()) #如果是观察钱包, 需要导入 key-image 才能确定哪些余额是可用的 print(wallet.balances()) # pprint(rpc.incoming_transfers( account_index=2 )) # # filter = { # 'tx_ids' : None, # 'unconfirmed': None, # 'payment_ids': None, # 'min_height': 0, # 'max_height': None # } # # filter = PaymentFilter( **filter ) # # # filter = object.__dict__.update(filter) # # # ret = wallet._backend.transfers_in(0, filter) res = rpc.get_deposit_txs() #获取子地址 print(wallet.get_address(0, 1)) pass
class SubaddrTest(object): data_subdir = 'test_offline' def setUp(self): self.wallet = Wallet( OfflineWallet(self.addr, view_key=self.svk, spend_key=self.ssk)) def test_keys(self): self.assertEqual(self.wallet.spend_key(), self.ssk) self.assertEqual(self.wallet.view_key(), self.svk) self.assertEqual(25, len(self.wallet.seed().phrase.split(' '))) def test_subaddresses(self): major = 0 for acc in self._read('{}-subaddrs.json'.format(self.net)): minor = 0 for subaddr in acc: self.assertEqual(self.wallet.get_address(major, minor), subaddr, msg='major={}, minor={}'.format(major, minor)) minor += 1 major += 1
class Tests(object): @classproperty def __test__(cls): return issubclass(cls, unittest.TestCase) def setUp(self): self.subaddresses = json.load( open( os.path.join(os.path.dirname(__file__), 'data', '{}-subaddrs.json'.format(self.net)))) self.wallet = Wallet(OfflineWallet(self.addr, view_key=self.svk)) def test_subaddresses(self): major = 0 for acc in self.subaddresses: minor = 0 for subaddr in acc: self.assertEqual(self.wallet.get_address(major, minor), subaddr, msg='major={}, minor={}'.format(major, minor)) minor += 1 major += 1
class SubaddrWalletTestCase(unittest.TestCase): get_accounts_result = { 'id': 0, 'jsonrpc': '2.0', 'result': { 'subaddress_accounts': [{ 'account_index': 0, 'balance': 224916129245183, 'base_address': '9vgV48wWAPTWik5QSUSoGYicdvvsbSNHrT9Arsx1XBTz6VrWPSgfmnUKSPZDMyX4Ms8R9TkhB4uFqK9s5LUBbV6YQN2Q9ag', 'label': 'Primary account', 'unlocked_balance': 224916129245183 }, { 'account_index': 1, 'balance': 3981420960933, 'base_address': 'BaCBwYSK9BGSuKxb2msXEj4mmpvZYJexYHfqx7kNPDrXDePVXSfoofxGquhXxpA4uxawcnVnouusMDgP74CACa7e9siimpj', 'label': 'Untitled account', 'unlocked_balance': 3981420960933 }, { 'account_index': 2, 'balance': 7256159239955, 'base_address': 'BgCseuY3jFJAZS7kt9mrNg7fEG3bo5BV91CTyKbYu9GFiU6hUZhvdNWCTUdQNPNcA4PyFApsFr3EsQDEDfT3tQSY1mVZeP2', 'label': 'Untitled account', 'unlocked_balance': 7256159239955 }], 'total_balance': 236153709446071, 'total_unlocked_balance': 236153709446071 } } @patch('monero.backends.jsonrpc.requests.post') def test_get_balance(self, mock_post): mock_post.return_value.status_code = 200 mock_post.return_value.json.return_value = self.get_accounts_result self.wallet = Wallet(JSONRPC()) mock_post.return_value.json.return_value = { 'id': 0, 'jsonrpc': '2.0', 'result': { 'balance': 224916129245183, 'per_subaddress': [{ 'address': '9vgV48wWAPTWik5QSUSoGYicdvvsbSNHrT9Arsx1XBTz6VrWPSgfmnUKSPZDMyX4Ms8R9TkhB4uFqK9s5LUBbV6YQN2Q9ag', 'address_index': 0, 'balance': 189656129245183, 'label': 'Primary account', 'num_unspent_outputs': 2, 'unlocked_balance': 189656129245183 }, { 'address': 'BfJ5W7dZGaYih6J63YvhiDSKpVUUZbVrEhLRCY6L6TdnEfzJmwP6aUJZQQnzLQ2NMTKMAC8hiJsoiNC7jbEUZ8tmBoJcnN1', 'address_index': 5, 'balance': 260000000000, 'label': '(Untitled address)', 'num_unspent_outputs': 1, 'unlocked_balance': 260000000000 }, { 'address': 'BbkS4mn6gcgUidn2znLa2J6eSBkbGjGX4doeDCKAzT2A3t1cjbquQGjhYgiMHiKTrY8ojk6Zjqi1ufvfuPwyKv4hNnMruro', 'address_index': 7, 'balance': 35000000000000, 'label': '(Untitled address)', 'num_unspent_outputs': 5, 'unlocked_balance': 35000000000000 }], 'unlocked_balance': 224916129245183 } } locked = self.wallet.get_balance() unlocked = self.wallet.get_balance(unlocked=True) balances = self.wallet.get_balances() self.assertEqual(balances[0], locked) self.assertEqual(balances[1], unlocked) self.assertIsInstance(locked, Decimal) self.assertIsInstance(unlocked, Decimal) self.assertIsInstance(balances[0], Decimal) self.assertIsInstance(balances[1], Decimal) self.assertEqual(locked, Decimal('224.916129245183')) @patch('monero.backends.jsonrpc.requests.post') def test_get_address(self, mock_post): mock_post.return_value.status_code = 200 mock_post.return_value.json.return_value = self.get_accounts_result self.wallet = Wallet(JSONRPC()) mock_post.return_value.json.return_value = { 'id': 0, 'jsonrpc': '2.0', 'result': { 'address': '9vgV48wWAPTWik5QSUSoGYicdvvsbSNHrT9Arsx1XBTz6VrWPSgfmnUKSPZDMyX4Ms8R9TkhB4uFqK9s5LUBbV6YQN2Q9ag', 'addresses': [{ 'address': '9vgV48wWAPTWik5QSUSoGYicdvvsbSNHrT9Arsx1XBTz6VrWPSgfmnUKSPZDMyX4Ms8R9TkhB4uFqK9s5LUBbV6YQN2Q9ag', 'address_index': 0, 'label': 'Primary account', 'used': True }, { 'address': 'BbBjyYoYNNwFfL8RRVRTMiZUofBLpjRxdNnd5E4LyGcAK5CEsnL3gmE5QkrDRta7RPficGHcFdR6rUwWcjnwZVvCE3tLxhJ', 'address_index': 1, 'label': '', 'used': True }, { 'address': 'BgzZVoJP6Vx5WP87r7NRCCRcFwiUha8uTgnjGGitHYTJEmRuz6Jq2oE9icDCGYMHXZcnR8T35Z8NoVXkfMnF9ikJNfcwwsy', 'address_index': 2, 'label': '(Untitled address)', 'used': False }, { 'address': 'Bck7sYz1vvUghNNTR6rrpxfRDegswezggB9mWQkXgjwxKRTo1feiJopStdJAHtMJoSEdsYppWvQ6vbGbArWxP32xCG2TsVZ', 'address_index': 3, 'label': '(Untitled address)', 'used': True }, { 'address': 'BYCcWM1gZHdCnh3Cb1KfWrAU1SjBWMV3KhUoeRy7V2Lw2F2hHeuzouP2NECBaTUgnyYAzEe8s5vpA7qmWYfjVfxeHoHWPnb', 'address_index': 4, 'label': '(Untitled address)', 'used': False }, { 'address': 'BfJ5W7dZGaYih6J63YvhiDSKpVUUZbVrEhLRCY6L6TdnEfzJmwP6aUJZQQnzLQ2NMTKMAC8hiJsoiNC7jbEUZ8tmBoJcnN1', 'address_index': 5, 'label': '(Untitled address)', 'used': True }, { 'address': 'BaJwiPYwnN6DV8yBeh4FjjCqRoPfdkWppSzVXTPBJo35fDyU8caxLchATGJg7TKB24Q8nM8P1iWSt4DMwec8Pg7bSbFDAir', 'address_index': 6, 'label': '(Untitled address)', 'used': False }, { 'address': 'BbkS4mn6gcgUidn2znLa2J6eSBkbGjGX4doeDCKAzT2A3t1cjbquQGjhYgiMHiKTrY8ojk6Zjqi1ufvfuPwyKv4hNnMruro', 'address_index': 7, 'label': '(Untitled address)', 'used': True }] } } waddr = self.wallet.get_address() a0addr = self.wallet.accounts[0].get_address() self.assertEqual(waddr, a0addr) self.assertEqual( waddr, '9vgV48wWAPTWik5QSUSoGYicdvvsbSNHrT9Arsx1XBTz6VrWPSgfmnUKSPZDMyX4Ms8R9TkhB4uFqK9s5LUBbV6YQN2Q9ag' ) self.assertEqual(len(self.wallet.accounts[0].get_addresses()), 8) @patch('monero.backends.jsonrpc.requests.post') def test_get_payments_in(self, mock_post): mock_post.return_value.status_code = 200 mock_post.return_value.json.return_value = self.get_accounts_result self.wallet = Wallet(JSONRPC()) mock_post.return_value.status_code = 200 mock_post.return_value.json.return_value = { 'id': 0, 'jsonrpc': '2.0', 'result': { 'in': [{ 'amount': 2470000000000, 'double_spend_seen': False, 'fee': 0, 'height': 1049947, 'note': '', 'payment_id': '0000000000000000', 'subaddr_index': { 'major': 0, 'minor': 0 }, 'timestamp': 1511926250, 'txid': '0cdde0eb934c44b523f6e966a5e19b131ed68c3c08600bc087f48ae13015b704', 'type': 'in', 'unlock_time': 0 }, { 'amount': 6123000000000, 'double_spend_seen': False, 'fee': 0, 'height': 1049947, 'note': '', 'payment_id': '0000000000000000', 'subaddr_index': { 'major': 0, 'minor': 0 }, 'timestamp': 1511926250, 'txid': '8b4154681c48a873550818ecaa6408a7c987a882b80917d6c902befd6ee57109', 'type': 'in', 'unlock_time': 0 }, { 'amount': 9767000000000, 'double_spend_seen': False, 'fee': 0, 'height': 1049947, 'note': '', 'payment_id': '0000000000000000', 'subaddr_index': { 'major': 0, 'minor': 0 }, 'timestamp': 1511926250, 'txid': 'd23a7d086e70df7aa0ca002361c4b35e35a272345b0a513ece4f21b773941f5e', 'type': 'in', 'unlock_time': 0 }] } } pay_in = self.wallet.get_payments_in() self.assertEqual(len(list(pay_in)), 3) for payment in pay_in: self.assertIsInstance(payment['amount'], Decimal) self.assertIsInstance(payment['fee'], Decimal) @patch('monero.backends.jsonrpc.requests.post') def test_get_payments_out(self, mock_post): mock_post.return_value.status_code = 200 mock_post.return_value.json.return_value = self.get_accounts_result self.wallet = Wallet(JSONRPC()) mock_post.return_value.status_code = 200 mock_post.return_value.json.return_value = { 'id': 0, 'jsonrpc': '2.0', 'result': { 'out': [{ 'amount': 484257334653, 'destinations': [{ 'address': 'BeUtm39sgTWfehPwwdrWWCAyUVfRQ512TTU5R1cm4SVmPVFxcqDz2zo5YGiyHtdav2RnDFdNvVnTANgsKtYTqo7kUCPvkqK', 'amount': 484257334653 }], 'double_spend_seen': False, 'fee': 19254480000, 'height': 1051266, 'note': '', 'payment_id': '0000000000000000', 'subaddr_index': { 'major': 2, 'minor': 0 }, 'timestamp': 1512095241, 'txid': 'eadca0f956a2a60cb3497a7dff1bd80153140a111d2f7db257a264bd9b76f0b3', 'type': 'out', 'unlock_time': 0 }, { 'amount': 791221885761, 'destinations': [{ 'address': 'Bd2RQrySgNaBghRZimDu54iTeJPQFZqPKc36Mb8gWiiU3ripWBv7zZZYkGDBCd5uC1efzh88V3PhyeRhMEYiMSLPN2KLFAj', 'amount': 791221885761 }], 'double_spend_seen': False, 'fee': 19304320000, 'height': 1049917, 'note': '', 'payment_id': '0000000000000000', 'subaddr_index': { 'major': 2, 'minor': 0 }, 'timestamp': 1511922110, 'txid': '5486ae9e6867ceb6e5aa478b32cba5c11d28e6d905c8479565c78e3933163ab6', 'type': 'out', 'unlock_time': 0 }, { 'amount': 98047029154, 'destinations': [{ 'address': '9xJAXRqfKJVgFcqAQPk6bThkjAhAdJ18tSTcpfpiSD634t74RqhzC3kAtHMNbScqkJCDhnvv5iCeuATuNS3r5y51RktPsoZ', 'amount': 98047029154 }], 'double_spend_seen': False, 'fee': 19253920000, 'height': 1051282, 'note': '', 'payment_id': '0000000000000000', 'subaddr_index': { 'major': 2, 'minor': 0 }, 'timestamp': 1512098498, 'txid': '9591c8f6832cc3b7908c2447b2feef58c44e7774a5c05cea617ad2f3b3866c18', 'type': 'out', 'unlock_time': 0 }, { 'amount': 536269959084, 'destinations': [{ 'address': 'Bfiu2Zm5uoV8RkjGJVWtp2Wkzct15mdKcdM6P6CZsLkPfttjPqvXWR2GkdkG2ai91KNvyro8zKygygMcTf6feyUA8nJmyNT', 'amount': 536269959084 }], 'double_spend_seen': False, 'fee': 19303200000, 'height': 1049947, 'note': '', 'payment_id': '0000000000000000', 'subaddr_index': { 'major': 2, 'minor': 0 }, 'timestamp': 1511926250, 'txid': 'af669b99162d9b514a0e8d3bd1d905e3b8778e6fcb88d172e5e049e909c4cc87', 'type': 'out', 'unlock_time': 0 }, { 'amount': 179693868346, 'destinations': [{ 'address': '9wFuzNoQDck1pnS9ZhG47kDdLD1BUszSbWpGfWcSRy9m6Npq9NoHWd141KvGag8hu2gajEwzRXJ4iJwmxruv9ofc2CwnYCE', 'amount': 179693868346 }], 'double_spend_seen': False, 'fee': 17927000000, 'height': 1049870, 'note': '', 'payment_id': '0000000000000000', 'subaddr_index': { 'major': 2, 'minor': 0 }, 'timestamp': 1511914391, 'txid': '2fa2de7fbf009093c5319d0421d3e8c684b8351a066c48d51369aedbbfd1d9af', 'type': 'out', 'unlock_time': 0 }, { 'amount': 540005123047, 'destinations': [{ 'address': 'BYo9Bf1FXxBdM655QkQsxs25HZ78EehDmJWZfLAts8LFcym4k8LbEywJcWnoCBHVXQb5ZJ6JXrF2MFtNrVnswGXsAxWNBgh', 'amount': 540005123047 }], 'double_spend_seen': False, 'fee': 19302640000, 'height': 1049963, 'note': '', 'payment_id': '0000000000000000', 'subaddr_index': { 'major': 2, 'minor': 0 }, 'timestamp': 1511928624, 'txid': '7e3db6c59c02d870f18b37a37cfc5857eeb5412df4ea00bb1971f3095f72b0d8', 'type': 'out', 'unlock_time': 0 }] } } pay_out = self.wallet.get_payments_out() self.assertEqual(len(list(pay_out)), 6) for payment in pay_out: self.assertIsInstance(payment['amount'], Decimal) self.assertIsInstance(payment['fee'], Decimal) self.assertIsInstance(payment['timestamp'], datetime)