forked from digibyte/digibyte
-
Notifications
You must be signed in to change notification settings - Fork 96
Expand file tree
/
Copy pathdigidollar_listunspent.py
More file actions
executable file
·114 lines (97 loc) · 5.33 KB
/
Copy pathdigidollar_listunspent.py
File metadata and controls
executable file
·114 lines (97 loc) · 5.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#!/usr/bin/env python3
# Copyright (c) 2026 The DigiByte Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""Test DigiDollar list-unspent RPC semantics."""
from test_framework.test_framework import DigiByteTestFramework
from test_framework.util import assert_equal, assert_raises_rpc_error
ORACLE_PRICE_MICRO_USD = 500000
class DigiDollarListUnspentTest(DigiByteTestFramework):
def set_test_params(self):
self.num_nodes = 2
self.setup_clean_chain = True
self.extra_args = [[
"-digidollar=1",
"-txindex=1",
"-dandelion=0",
"-debug=digidollar",
]] * self.num_nodes
def add_options(self, parser):
self.add_wallet_options(parser, descriptors=True, legacy=False)
def skip_test_if_missing_module(self):
self.skip_if_no_wallet()
self.skip_if_no_sqlite()
def assert_single_utxo(self, utxos, txid, amount, confirmations):
assert_equal(len(utxos), 1)
utxo = utxos[0]
assert_equal(utxo["txid"], txid)
assert_equal(utxo["vout"], 1)
assert_equal(utxo["amount"], amount)
assert_equal(utxo["confirmations"], confirmations)
assert_equal(utxo["spendable"], True)
assert_equal(utxo["safe"], True)
assert "scriptPubKey" in utxo
assert "address" in utxo
return utxo
def run_test(self):
node, receiver = self.nodes
self.generate(node, 650)
self.sync_all()
for n in self.nodes:
n.setmockoracleprice(ORACLE_PRICE_MICRO_USD)
self.log.info("Fresh wallet has no DigiDollar unspent outputs")
assert_equal(node.listdigidollarunspent(), [])
assert_equal(node.listdigidollarutxos(), [])
assert_raises_rpc_error(-8, "Minimum confirmations must be non-negative", node.listdigidollarunspent, -1)
assert_raises_rpc_error(-8, "Maximum confirmations must be greater or equal", node.listdigidollarunspent, 2, 1)
self.log.info("Unconfirmed DD outputs require minconf=0 and are omitted by default")
mint_amount = 10000
mint = node.mintdigidollar(mint_amount, 0)
mint_txid = mint["txid"]
assert_equal(node.listdigidollarunspent(), [])
unconfirmed = self.assert_single_utxo(node.listdigidollarunspent(0), mint_txid, mint_amount, 0)
assert_equal(node.listdigidollarutxos(0), node.listdigidollarunspent(0))
assert_equal(node.listdigidollarunspent(1), [])
assert_equal(node.listdigidollarunspent(0, 0), [unconfirmed])
for field in ["txid", "vout", "address", "scriptPubKey", "amount", "confirmations", "spendable", "safe"]:
assert field in unconfirmed
assert isinstance(unconfirmed["amount"], int)
self.log.info("Address filter matches normal listunspent behavior")
dd_address = unconfirmed["address"]
assert_equal(node.listdigidollarunspent(0, 9999999, [dd_address]), [unconfirmed])
assert_equal(node.listdigidollarunspent(0, 9999999, [node.getdigidollaraddress()]), [])
assert_raises_rpc_error(-8, "duplicated address", node.listdigidollarunspent, 0, 9999999, [dd_address, dd_address])
assert_raises_rpc_error(-5, "Invalid DigiDollar address", node.listdigidollarunspent, 0, 9999999, ["not-an-address"])
self.log.info("Confirmed DD outputs obey minconf/maxconf")
node.generate(1)
self.sync_all()
confirmed = self.assert_single_utxo(node.listdigidollarunspent(), mint_txid, mint_amount, 1)
assert_equal(confirmed["address"], dd_address)
assert_equal(node.listdigidollarunspent(2), [])
assert_equal(node.listdigidollarunspent(0, 0), [])
node.generate(1)
self.sync_all()
assert_equal(node.listdigidollarunspent(1, 1), [])
assert_equal(node.listdigidollarunspent(2, 2)[0]["txid"], mint_txid)
assert_equal(node.listdigidollarutxos(2, 2), node.listdigidollarunspent(2, 2))
self.log.info("Unconfirmed incoming DD outputs are unsafe and obey include_unsafe")
receiver_address = receiver.getdigidollaraddress()
send = node.senddigidollar(receiver_address, 2500)
self.sync_mempools()
receiver_unconfirmed = [u for u in receiver.listdigidollarunspent(0) if u["txid"] == send["txid"]]
assert_equal(len(receiver_unconfirmed), 1)
assert_equal(receiver_unconfirmed[0]["amount"], 2500)
assert_equal(receiver_unconfirmed[0]["confirmations"], 0)
assert_equal(receiver_unconfirmed[0]["safe"], False)
assert_equal([u for u in receiver.listdigidollarunspent(0, 9999999, [], False) if u["txid"] == send["txid"]], [])
assert_equal(receiver.listdigidollarutxos(0, 9999999, [], False), receiver.listdigidollarunspent(0, 9999999, [], False))
self.log.info("Spent DD outputs disappear from listdigidollarunspent")
assert_equal([u for u in node.listdigidollarunspent(0) if u["txid"] == mint_txid], [])
node.generate(1)
self.sync_all()
post_spend = node.listdigidollarunspent()
assert_equal([u for u in post_spend if u["txid"] == mint_txid], [])
assert send["txid"] in [u["txid"] for u in post_spend]
assert_equal(node.listdigidollarutxos(), post_spend)
if __name__ == "__main__":
DigiDollarListUnspentTest().main()