Compare commits

...

14 Commits

Author SHA1 Message Date
Michał Sałaban f2f0b8a62d Merge branch 'master' into viewtags
2 years ago
Michał Sałaban 26a85cdde5 Add test for viewtags-enabled transactions
2 years ago
Michał Sałaban 2e2c7b3bc1 Bump up version
2 years ago
Michał Sałaban a9cf78d294 Merge branch 'plowsof-master' into viewtags
2 years ago
plowsof 106d6f3bd4
pass original type stealth address
2 years ago
plowsof e8ba5dcdb4
Update __init__.py
2 years ago
plowsof 65c18787da
Update __init__.py
2 years ago
plowsof a431eb5af1
Update __init__.py
2 years ago
plowsof 4de5a3fc8f
stealth_address=stealth_address
2 years ago
plowsof cea6f6f6d1
Update __init__.py
2 years ago
plowsof 0d898467a9
Update __init__.py
2 years ago
plowsof c9848d45d1
updates from jberman
2 years ago
plowsof 11a89cc7ff
"view_tag"
2 years ago
plowsof 0cfdd52b68
Update __init__.py
2 years ago

@ -1,5 +1,5 @@
[bumpversion]
current_version = 1.0.2
current_version = 1.0.3
parse = (?P<major>\d+)\.(?P<minor>\d+)(?:\.(?P<patch>\d+))?
serialize =
{major}.{minor}.{patch}

@ -20,7 +20,7 @@ Python Monero module
A comprehensive Python module for handling Monero cryptocurrency.
* release 1.0.2
* release 1.0.3
* open source: https://github.com/monero-ecosystem/monero-python
* works with Monero 0.17.x and `the latest source`_ (at least we try to keep up)
* Python 2.x and 3.x compatible

@ -27,7 +27,7 @@ sys.path.insert(0, os.path.abspath("../.."))
# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0.2'
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
@ -56,9 +56,9 @@ author = "Michal Salaban"
# built documents.
#
# The short X.Y version.
version = "1.0.2"
version = "1.0.3"
# The full version, including alpha/beta/rc tags.
release = "1.0.2"
release = "1.0.3"
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.

@ -1,3 +1,3 @@
from . import address, account, const, daemon, wallet, numbers, wordlists, seed
__version__ = "1.0.2"
__version__ = "1.0.3"

@ -140,16 +140,30 @@ class Transaction(object):
already generated.
"""
def _scan_pubkeys(svk, psk, stealth_address, amount, encamount, commitment):
def _scan_pubkeys(
svk, psk, stealth_address, amount, encamount, commitment, on_chain_vt
):
for keyidx, tx_key in enumerate(self.pubkeys):
# precompute
svk_2 = ed25519.scalar_add(svk, svk)
svk_4 = ed25519.scalar_add(svk_2, svk_2)
svk_8 = ed25519.scalar_add(svk_4, svk_4)
#
shared_secret = ed25519.scalarmult(svk_8, tx_key)
if on_chain_vt:
vt_hsdata = b"".join(
[b"view_tag", shared_secret, varint.encode(idx)]
)
vt_full = keccak_256(vt_hsdata).digest()
vt = vt_full[0:1]
if vt != on_chain_vt:
# short-circuit so it doesn't have to do the rest of this for ~99.6% of outputs
# the view tag check yields false positives 1/256 times, because it's just 1 byte
continue
hsdata = b"".join(
[
ed25519.scalarmult(svk_8, tx_key),
shared_secret,
varint.encode(idx),
]
)
@ -207,9 +221,43 @@ class Transaction(object):
*map(operator.methodcaller("addresses"), wallet.accounts)
)
)
"""
pre hard fork:
{
"target": {
"key": "ea3f..."
}
}
post hard fork:
{
"target": {
"tagged_key": {
"key": "ea3f...",
"view_tag": "a1"
}
}
}
"""
outs = []
for idx, vout in enumerate(self.json["vout"]):
stealth_address = binascii.unhexlify(vout["target"]["key"])
# see if post hard fork json structure present:
try:
if vout["target"]["tagged_key"]:
# post fork transaction
stealth_address = binascii.unhexlify(
vout["target"]["tagged_key"]["key"]
)
orig_stealth_address = vout["target"]["tagged_key"]["key"]
on_chain_vt = binascii.unhexlify(
vout["target"]["tagged_key"]["view_tag"]
)
except:
# pre fork transaction
stealth_address = binascii.unhexlify(vout["target"]["key"])
orig_stealth_address = vout["target"]["key"]
on_chain_vt = False
pass
encamount = None
commitment = None
if self.version == 2 and not self.is_coinbase:
@ -229,13 +277,19 @@ class Transaction(object):
for addridx, addr in enumerate(addresses):
psk = binascii.unhexlify(addr.spend_key())
payment = _scan_pubkeys(
svk, psk, stealth_address, amount, encamount, commitment
svk,
psk,
stealth_address,
amount,
encamount,
commitment,
on_chain_vt,
)
if payment:
break
outs.append(
Output(
stealth_address=vout["target"]["key"],
stealth_address=orig_stealth_address,
amount=payment.amount if payment else amount,
index=self.output_indices[idx] if self.output_indices else None,
transaction=self,

@ -0,0 +1,88 @@
{
"credits": 0,
"status": "OK",
"top_hash": "",
"txs": [
{
"as_hex": "",
"as_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 2077732, 1099874, 72970, 155729, 16665, 1688, 19088, 1844, 278, 575, 601, 237, 62, 310, 42, 110\n ], \n \"k_image\": \"a9f22cb275c3d0623b30a408fcc3f3be2c8968a9a1fe31608612e4dc86030594\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"72cc46c83882ce16fe2c49213f0865fd1a292854968cdc1502c564f3c5acb482\", \n \"view_tag\": \"98\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"d8112626629d09187643679ea70f566af48966c0973bcb2ba670064fdffd920e\", \n \"view_tag\": \"c3\"\n }\n }\n }\n ], \n \"extra\": [ 1, 47, 120, 89, 162, 27, 74, 248, 52, 201, 227, 37, 35, 68, 139, 92, 232, 191, 16, 171, 21, 69, 175, 81, 194, 56, 179, 44, 229, 49, 43, 191, 159, 2, 9, 1, 143, 9, 86, 254, 61, 158, 216, 141\n ], \n \"rct_signatures\": {\n \"type\": 6, \n \"txnFee\": 71680000, \n \"ecdhInfo\": [ {\n \"amount\": \"81990250e7f25791\"\n }, {\n \"amount\": \"ff4eb9def40ad4c5\"\n }], \n \"outPk\": [ \"c05c88d8e386b59b37c295833f14660667b999b31e9dc4670bd09fe3aab68acb\", \"511432f8d675ff2c389f39729477494cc7cd785d3a13dda276dec624928e0a1c\"]\n }\n}",
"block_height": 1999138,
"block_timestamp": 1654766037,
"confirmations": 10726,
"double_spend_seen": false,
"in_pool": false,
"output_indices": [
3447882,
3447883
],
"prunable_as_hex": "",
"prunable_hash": "0f9c83c425e20519ba61d8f26ad4f5c681a95e439072c8b717baf50a21933662",
"pruned_as_hex": "020001020010a4e87ee290438aba04d1c009998201980d909501b40e9602bf04d904ed013eb6022a6ea9f22cb275c3d0623b30a408fcc3f3be2c8968a9a1fe31608612e4dc8603059402000372cc46c83882ce16fe2c49213f0865fd1a292854968cdc1502c564f3c5acb482980003d8112626629d09187643679ea70f566af48966c0973bcb2ba670064fdffd920ec32c012f7859a21b4af834c9e32523448b5ce8bf10ab1545af51c238b32ce5312bbf9f0209018f0956fe3d9ed88d068080972281990250e7f25791ff4eb9def40ad4c5c05c88d8e386b59b37c295833f14660667b999b31e9dc4670bd09fe3aab68acb511432f8d675ff2c389f39729477494cc7cd785d3a13dda276dec624928e0a1c",
"tx_hash": "e59f9d72780d4b4df0b0b776cffa39f50daf9cc9607c77ad6fa47e564c937b73"
},
{
"as_hex": "",
"as_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 3126379, 148577, 63690, 25377, 42379, 29781, 884, 1047, 2816, 4972, 254, 792, 36, 326, 245, 234\n ], \n \"k_image\": \"7117b29573e5267c133ea6714eb88cd4a2c1fb81c73608c5ae873ec0a0152fbd\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"7ea504c8efc3b1aaf6ece2c4ff8324eb7fd06586db6d76f6146e0c4384bda414\", \n \"view_tag\": \"97\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"72f76fd4aad444c8d6e3dca7d26c7a6f5757f51fd8fc9f04eee480e0f901c1e1\", \n \"view_tag\": \"c1\"\n }\n }\n }\n ], \n \"extra\": [ 1, 165, 108, 105, 178, 240, 39, 4, 148, 16, 228, 136, 231, 199, 15, 145, 233, 253, 26, 102, 212, 28, 199, 86, 203, 70, 112, 187, 94, 172, 122, 238, 175, 2, 9, 1, 140, 245, 9, 192, 8, 22, 51, 48\n ], \n \"rct_signatures\": {\n \"type\": 6, \n \"txnFee\": 71820000, \n \"ecdhInfo\": [ {\n \"amount\": \"9d413197a1c2253c\"\n }, {\n \"amount\": \"1b7f5373d95f0187\"\n }], \n \"outPk\": [ \"0c4cb09845aba910acb3ef2fdd4259ee6e768b60f3d0ab287ce389eda58527d8\", \"ba6df0b8f74c7d3c48bcb4c7499056623468573405bbd30529831c1ec116c5ed\"]\n }\n}",
"block_height": 1999138,
"block_timestamp": 1654766037,
"confirmations": 10726,
"double_spend_seen": false,
"in_pool": false,
"output_indices": [
3447884,
3447885
],
"prunable_as_hex": "",
"prunable_hash": "48e9cecb79ab9eaa50bd8390db82ad74a30ff75bf700cc38ec4e28ba0517dad0",
"pruned_as_hex": "020001020010ebe8be01e18809caf103a1c6018bcb02d5e801f40697088016ec26fe01980624c602f501ea017117b29573e5267c133ea6714eb88cd4a2c1fb81c73608c5ae873ec0a0152fbd0200037ea504c8efc3b1aaf6ece2c4ff8324eb7fd06586db6d76f6146e0c4384bda41497000372f76fd4aad444c8d6e3dca7d26c7a6f5757f51fd8fc9f04eee480e0f901c1e1c12c01a56c69b2f027049410e488e7c70f91e9fd1a66d41cc756cb4670bb5eac7aeeaf0209018cf509c00816333006e0c59f229d413197a1c2253c1b7f5373d95f01870c4cb09845aba910acb3ef2fdd4259ee6e768b60f3d0ab287ce389eda58527d8ba6df0b8f74c7d3c48bcb4c7499056623468573405bbd30529831c1ec116c5ed",
"tx_hash": "ac30f84fcb0b96f38cf789de04fb643fa6be45856546f57b6eb15a099b0feea1"
},
{
"as_hex": "",
"as_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 3059089, 173733, 131739, 8357, 14256, 11078, 16407, 25216, 1680, 665, 3575, 1371, 978, 262, 210, 31\n ], \n \"k_image\": \"bdcaa18744702a8a27ec41a0a611bb39269761b6b489b3a8a0ff0e709ed24bd9\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"2fdc2171121c91f613c73a1a2db6744570f50881d6abc47b686b25b525d438d7\", \n \"view_tag\": \"c7\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"2692a21c23855a9a1a6212dc76954742d13ca41afaa6e8619b979b2f062a8c4c\", \n \"view_tag\": \"fe\"\n }\n }\n }\n ], \n \"extra\": [ 1, 170, 102, 60, 91, 146, 32, 232, 227, 12, 138, 136, 49, 119, 161, 23, 154, 75, 189, 178, 206, 24, 219, 121, 150, 83, 43, 74, 86, 37, 217, 237, 100, 2, 9, 1, 55, 181, 21, 181, 85, 145, 70, 241\n ], \n \"rct_signatures\": {\n \"type\": 6, \n \"txnFee\": 71770000, \n \"ecdhInfo\": [ {\n \"amount\": \"0dc8c766e8de0bbe\"\n }, {\n \"amount\": \"5c674dd59d15c78e\"\n }], \n \"outPk\": [ \"71948a295394caa477f47e5c0414520fd3bd924885e3342fec0a93217e1beeff\", \"3f29d04d2bedb0dcc99fb4259398f82cf6c37e2c5518e7b149dbe6ed67cb9872\"]\n }\n}",
"block_height": 1999931,
"block_timestamp": 1654872829,
"confirmations": 9933,
"double_spend_seen": false,
"in_pool": false,
"output_indices": [
3448713,
3448714
],
"prunable_as_hex": "",
"prunable_hash": "04e6bc7b752f10a1e2254a188dcad224e8213b98b8b9fe985f97831f211366a8",
"pruned_as_hex": "02000102001091dbba01a5cd0a9b8508a541b06fc65697800180c501900d9905f71bdb0ad2078602d2011fbdcaa18744702a8a27ec41a0a611bb39269761b6b489b3a8a0ff0e709ed24bd90200032fdc2171121c91f613c73a1a2db6744570f50881d6abc47b686b25b525d438d7c700032692a21c23855a9a1a6212dc76954742d13ca41afaa6e8619b979b2f062a8c4cfe2c01aa663c5b9220e8e30c8a883177a1179a4bbdb2ce18db7996532b4a5625d9ed6402090137b515b5559146f10690bf9c220dc8c766e8de0bbe5c674dd59d15c78e71948a295394caa477f47e5c0414520fd3bd924885e3342fec0a93217e1beeff3f29d04d2bedb0dcc99fb4259398f82cf6c37e2c5518e7b149dbe6ed67cb9872",
"tx_hash": "701a1dd65581ad964b7c603025b251223c6e8e00c6fd9b63d0f4796613fc4d49"
},
{
"as_hex": "",
"as_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 2504987, 830578, 93982, 1616, 4194, 1871, 3787, 1979, 3451, 4015, 206, 759, 1627, 50, 233, 730\n ], \n \"k_image\": \"2edd3e21c43ee250e1a49acac02501f1320bce58f0d4a9b426298a73e11b864a\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"34e8533536817a21bfdca72f577b3bd3a373b7c844d222be6a0703ba186dd369\", \n \"view_tag\": \"af\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"4ec0e1c41663845413d5c68fa646c93b904f66c932f72dcc9c7bacaeb2c14e08\", \n \"view_tag\": \"fd\"\n }\n }\n }\n ], \n \"extra\": [ 1, 86, 167, 164, 194, 213, 67, 16, 44, 42, 122, 84, 125, 196, 92, 241, 58, 203, 216, 220, 64, 9, 184, 239, 11, 119, 27, 120, 95, 163, 146, 212, 197, 2, 9, 1, 254, 10, 110, 119, 25, 74, 229, 69\n ], \n \"rct_signatures\": {\n \"type\": 6, \n \"txnFee\": 71680000, \n \"ecdhInfo\": [ {\n \"amount\": \"e6a1c12fa9a17229\"\n }, {\n \"amount\": \"62d32c123e568b3b\"\n }], \n \"outPk\": [ \"b3e1fa823cd9eac432fc935b3d7cafdd1b212af9630dd04c28c5c5c6124fcc74\", \"e5213d4c17e6a3e20436dfcb83bd117b85c405fa3b108d2ffadf5a92aa0939bd\"]\n }\n}",
"block_height": 2005748,
"block_timestamp": 1655568203,
"confirmations": 4116,
"double_spend_seen": false,
"in_pool": false,
"output_indices": [
3454587,
3454588
],
"prunable_as_hex": "",
"prunable_hash": "9c46f1cce25275fe8aaf27d66c346897c5b40c2dc8da15f5a87edbebf6a0d54b",
"pruned_as_hex": "0200010200109bf29801f2d8329ede05d00ce220cf0ecb1dbb0ffb1aaf1fce01f705db0c32e901da052edd3e21c43ee250e1a49acac02501f1320bce58f0d4a9b426298a73e11b864a02000334e8533536817a21bfdca72f577b3bd3a373b7c844d222be6a0703ba186dd369af00034ec0e1c41663845413d5c68fa646c93b904f66c932f72dcc9c7bacaeb2c14e08fd2c0156a7a4c2d543102c2a7a547dc45cf13acbd8dc4009b8ef0b771b785fa392d4c5020901fe0a6e77194ae5450680809722e6a1c12fa9a1722962d32c123e568b3bb3e1fa823cd9eac432fc935b3d7cafdd1b212af9630dd04c28c5c5c6124fcc74e5213d4c17e6a3e20436dfcb83bd117b85c405fa3b108d2ffadf5a92aa0939bd",
"tx_hash": "27b6aa8380daaab5641e7318f9b7ba8e7a8097734e6e979fc0390056f6ec9546"
}
],
"txs_as_hex": [
"",
"",
"",
""
],
"txs_as_json": [
"{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 2077732, 1099874, 72970, 155729, 16665, 1688, 19088, 1844, 278, 575, 601, 237, 62, 310, 42, 110\n ], \n \"k_image\": \"a9f22cb275c3d0623b30a408fcc3f3be2c8968a9a1fe31608612e4dc86030594\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"72cc46c83882ce16fe2c49213f0865fd1a292854968cdc1502c564f3c5acb482\", \n \"view_tag\": \"98\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"d8112626629d09187643679ea70f566af48966c0973bcb2ba670064fdffd920e\", \n \"view_tag\": \"c3\"\n }\n }\n }\n ], \n \"extra\": [ 1, 47, 120, 89, 162, 27, 74, 248, 52, 201, 227, 37, 35, 68, 139, 92, 232, 191, 16, 171, 21, 69, 175, 81, 194, 56, 179, 44, 229, 49, 43, 191, 159, 2, 9, 1, 143, 9, 86, 254, 61, 158, 216, 141\n ], \n \"rct_signatures\": {\n \"type\": 6, \n \"txnFee\": 71680000, \n \"ecdhInfo\": [ {\n \"amount\": \"81990250e7f25791\"\n }, {\n \"amount\": \"ff4eb9def40ad4c5\"\n }], \n \"outPk\": [ \"c05c88d8e386b59b37c295833f14660667b999b31e9dc4670bd09fe3aab68acb\", \"511432f8d675ff2c389f39729477494cc7cd785d3a13dda276dec624928e0a1c\"]\n }\n}",
"{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 3126379, 148577, 63690, 25377, 42379, 29781, 884, 1047, 2816, 4972, 254, 792, 36, 326, 245, 234\n ], \n \"k_image\": \"7117b29573e5267c133ea6714eb88cd4a2c1fb81c73608c5ae873ec0a0152fbd\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"7ea504c8efc3b1aaf6ece2c4ff8324eb7fd06586db6d76f6146e0c4384bda414\", \n \"view_tag\": \"97\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"72f76fd4aad444c8d6e3dca7d26c7a6f5757f51fd8fc9f04eee480e0f901c1e1\", \n \"view_tag\": \"c1\"\n }\n }\n }\n ], \n \"extra\": [ 1, 165, 108, 105, 178, 240, 39, 4, 148, 16, 228, 136, 231, 199, 15, 145, 233, 253, 26, 102, 212, 28, 199, 86, 203, 70, 112, 187, 94, 172, 122, 238, 175, 2, 9, 1, 140, 245, 9, 192, 8, 22, 51, 48\n ], \n \"rct_signatures\": {\n \"type\": 6, \n \"txnFee\": 71820000, \n \"ecdhInfo\": [ {\n \"amount\": \"9d413197a1c2253c\"\n }, {\n \"amount\": \"1b7f5373d95f0187\"\n }], \n \"outPk\": [ \"0c4cb09845aba910acb3ef2fdd4259ee6e768b60f3d0ab287ce389eda58527d8\", \"ba6df0b8f74c7d3c48bcb4c7499056623468573405bbd30529831c1ec116c5ed\"]\n }\n}",
"{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 3059089, 173733, 131739, 8357, 14256, 11078, 16407, 25216, 1680, 665, 3575, 1371, 978, 262, 210, 31\n ], \n \"k_image\": \"bdcaa18744702a8a27ec41a0a611bb39269761b6b489b3a8a0ff0e709ed24bd9\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"2fdc2171121c91f613c73a1a2db6744570f50881d6abc47b686b25b525d438d7\", \n \"view_tag\": \"c7\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"2692a21c23855a9a1a6212dc76954742d13ca41afaa6e8619b979b2f062a8c4c\", \n \"view_tag\": \"fe\"\n }\n }\n }\n ], \n \"extra\": [ 1, 170, 102, 60, 91, 146, 32, 232, 227, 12, 138, 136, 49, 119, 161, 23, 154, 75, 189, 178, 206, 24, 219, 121, 150, 83, 43, 74, 86, 37, 217, 237, 100, 2, 9, 1, 55, 181, 21, 181, 85, 145, 70, 241\n ], \n \"rct_signatures\": {\n \"type\": 6, \n \"txnFee\": 71770000, \n \"ecdhInfo\": [ {\n \"amount\": \"0dc8c766e8de0bbe\"\n }, {\n \"amount\": \"5c674dd59d15c78e\"\n }], \n \"outPk\": [ \"71948a295394caa477f47e5c0414520fd3bd924885e3342fec0a93217e1beeff\", \"3f29d04d2bedb0dcc99fb4259398f82cf6c37e2c5518e7b149dbe6ed67cb9872\"]\n }\n}",
"{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 2504987, 830578, 93982, 1616, 4194, 1871, 3787, 1979, 3451, 4015, 206, 759, 1627, 50, 233, 730\n ], \n \"k_image\": \"2edd3e21c43ee250e1a49acac02501f1320bce58f0d4a9b426298a73e11b864a\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"34e8533536817a21bfdca72f577b3bd3a373b7c844d222be6a0703ba186dd369\", \n \"view_tag\": \"af\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"4ec0e1c41663845413d5c68fa646c93b904f66c932f72dcc9c7bacaeb2c14e08\", \n \"view_tag\": \"fd\"\n }\n }\n }\n ], \n \"extra\": [ 1, 86, 167, 164, 194, 213, 67, 16, 44, 42, 122, 84, 125, 196, 92, 241, 58, 203, 216, 220, 64, 9, 184, 239, 11, 119, 27, 120, 95, 163, 146, 212, 197, 2, 9, 1, 254, 10, 110, 119, 25, 74, 229, 69\n ], \n \"rct_signatures\": {\n \"type\": 6, \n \"txnFee\": 71680000, \n \"ecdhInfo\": [ {\n \"amount\": \"e6a1c12fa9a17229\"\n }, {\n \"amount\": \"62d32c123e568b3b\"\n }], \n \"outPk\": [ \"b3e1fa823cd9eac432fc935b3d7cafdd1b212af9630dd04c28c5c5c6124fcc74\", \"e5213d4c17e6a3e20436dfcb83bd117b85c405fa3b108d2ffadf5a92aa0939bd\"]\n }\n}"
],
"untrusted": false
}

@ -0,0 +1,18 @@
{
"id": 0,
"jsonrpc": "2.0",
"result": {
"subaddress_accounts": [
{
"account_index": 0,
"balance": 4000000000000,
"base_address": "9sotHmY781cAChddb8JRC9Yjuiifgq381b5nepg5FKyF3EYcQfhWLfScnSoYepu2WiCriBW7oqPkc3r9DJ8M9BE5JQeKAAp",
"label": "Primary account",
"tag": "",
"unlocked_balance": 4000000000000
}
],
"total_balance": 4000000000000,
"total_unlocked_balance": 4000000000000
}
}

@ -0,0 +1,7 @@
{
"id": 0,
"jsonrpc": "2.0",
"result": {
"key": "31c8c8582bffbbe823c431069cbf27e5b3d0d8c8062f8e909eafd71116840b09"
}
}

@ -0,0 +1,27 @@
{
"id": 0,
"jsonrpc": "2.0",
"result": {
"address": "9sotHmY781cAChddb8JRC9Yjuiifgq381b5nepg5FKyF3EYcQfhWLfScnSoYepu2WiCriBW7oqPkc3r9DJ8M9BE5JQeKAAp",
"addresses": [
{
"address": "9sotHmY781cAChddb8JRC9Yjuiifgq381b5nepg5FKyF3EYcQfhWLfScnSoYepu2WiCriBW7oqPkc3r9DJ8M9BE5JQeKAAp",
"address_index": 0,
"label": "Primary account",
"used": false
},
{
"address": "BgnjGyQMqyz8DTRxaAat7oVWBoncUG3PmY5rwf4VBLWY6giSVbEaZec6Ae8w6GK1ZhgfFZnCL4EfXMjL1T5mkRdKKEVqSfC",
"address_index": 1,
"label": "",
"used": true
},
{
"address": "BhS5oGvXMGqJLtQFea7ip3fJiYN9s23qr3nubeHLwGrf7RDPb5qm6m75VY29TCkjKF4ENANPXmkPt3opjV27t7eyDj5PmY1",
"address_index": 2,
"label": "",
"used": true
}
]
}
}

@ -10,18 +10,20 @@ import responses
from monero.backends.jsonrpc import JSONRPCDaemon, JSONRPCWallet
from monero.backends.offline import OfflineWallet
from monero.daemon import Daemon
from monero.transaction import Transaction
from monero.transaction import Transaction, Payment
from monero.transaction.extra import ExtraParser
from monero.wallet import Wallet
from .base import JSONTestCase
class OutputTestCase(JSONTestCase):
class OutputTestBase(JSONTestCase):
data_subdir = "test_outputs"
daemon_transactions_url = "http://127.0.0.1:38081/get_transactions"
wallet_jsonrpc_url = "http://127.0.0.1:38083/json_rpc"
class OutputTestCase(OutputTestBase):
@responses.activate
def test_v2_single_output(self):
responses.add(
@ -457,3 +459,87 @@ class OutputTestCase(JSONTestCase):
)
with self.assertRaises(ValueError):
pdata = ep.parse()
class ViewtagsTestCase(OutputTestBase):
@responses.activate
def test_viewtags(self):
responses.add(
responses.POST,
self.wallet_jsonrpc_url,
json=self._read("test_viewtags-wallet-00-get_accounts.json"),
status=200,
)
for _ in range(4):
responses.add(
responses.POST,
self.wallet_jsonrpc_url,
json=self._read("test_viewtags-wallet-20-query_key.json"),
status=200,
)
responses.add(
responses.POST,
self.wallet_jsonrpc_url,
json=self._read("test_viewtags-wallet-40-getaddress.json"),
status=200,
)
responses.add(
responses.POST,
self.daemon_transactions_url,
json=self._read("test_viewtags-daemon-00-get_transactions.json"),
status=200,
)
wallet = Wallet(JSONRPCWallet(host="127.0.0.1", port=38083))
daemon = Daemon(JSONRPCDaemon(host="127.0.0.1", port=38081))
txns = daemon.transactions(
[
"e59f9d72780d4b4df0b0b776cffa39f50daf9cc9607c77ad6fa47e564c937b73",
"ac30f84fcb0b96f38cf789de04fb643fa6be45856546f57b6eb15a099b0feea1",
"701a1dd65581ad964b7c603025b251223c6e8e00c6fd9b63d0f4796613fc4d49",
"27b6aa8380daaab5641e7318f9b7ba8e7a8097734e6e979fc0390056f6ec9546",
]
)
# e59f9d72780d4b4df0b0b776cffa39f50daf9cc9607c77ad6fa47e564c937b73
tx = txns[0]
outputs = tx.outputs(wallet)
self.assertEqual(len(outputs), 2)
self.assertIsInstance(outputs[0].payment, Payment)
self.assertIsNone(outputs[1].payment)
self.assertEqual(outputs[0].payment.amount, Decimal("1.0"))
self.assertEqual(
outputs[0].payment.local_address,
"BgnjGyQMqyz8DTRxaAat7oVWBoncUG3PmY5rwf4VBLWY6giSVbEaZec6Ae8w6GK1ZhgfFZnCL4EfXMjL1T5mkRdKKEVqSfC",
)
# ac30f84fcb0b96f38cf789de04fb643fa6be45856546f57b6eb15a099b0feea1
tx = txns[1]
outputs = tx.outputs(wallet)
self.assertEqual(len(outputs), 2)
self.assertIsInstance(outputs[0].payment, Payment)
self.assertIsNone(outputs[1].payment)
self.assertEqual(outputs[0].payment.amount, Decimal("1.0"))
self.assertEqual(
outputs[0].payment.local_address,
"BgnjGyQMqyz8DTRxaAat7oVWBoncUG3PmY5rwf4VBLWY6giSVbEaZec6Ae8w6GK1ZhgfFZnCL4EfXMjL1T5mkRdKKEVqSfC",
)
# 701a1dd65581ad964b7c603025b251223c6e8e00c6fd9b63d0f4796613fc4d49
tx = txns[2]
outputs = tx.outputs(wallet)
self.assertEqual(len(outputs), 2)
self.assertIsInstance(outputs[0].payment, Payment)
self.assertIsNone(outputs[1].payment)
self.assertEqual(outputs[0].payment.amount, Decimal("1.0"))
self.assertEqual(
outputs[0].payment.local_address,
"BhS5oGvXMGqJLtQFea7ip3fJiYN9s23qr3nubeHLwGrf7RDPb5qm6m75VY29TCkjKF4ENANPXmkPt3opjV27t7eyDj5PmY1",
)
# 27b6aa8380daaab5641e7318f9b7ba8e7a8097734e6e979fc0390056f6ec9546
tx = txns[3]
outputs = tx.outputs(wallet)
self.assertEqual(len(outputs), 2)
self.assertIsInstance(outputs[0].payment, Payment)
self.assertIsNone(outputs[1].payment)
self.assertEqual(outputs[0].payment.amount, Decimal("1.0"))
self.assertEqual(
outputs[0].payment.local_address,
"BgnjGyQMqyz8DTRxaAat7oVWBoncUG3PmY5rwf4VBLWY6giSVbEaZec6Ae8w6GK1ZhgfFZnCL4EfXMjL1T5mkRdKKEVqSfC",
)

Loading…
Cancel
Save