Skip to content

Commit 049978e

Browse files
author
alex v
authored
Fix for verifychain (#634)
* fix coins view instead of coins tip * recount votes when verifying database * fix boolean * write instead of insert if it already exists * use mapState instead of fState and blockhash * add missing txblockhash to ser function * fix log * getstate string for paid state * update paidOnblock to stateChangedOnBlock from cfund tests * check statedb hash in verifychain * fix v452 fork * fix %d->%s * add log * use formatmoney * prevent undefined behavior * show cf supply in getblockheader * check for paid state * fix some tests * fix diff prequest * GetLastStateBlockIndexForState() * fix cfund-paymentrequest-hardfork-452.py * consider status changes from same block * fix heights for testnet * notRequestedYet * notRequestedYet * detect old db struct * add statehash to updatetip log * check old structure bootstrap * only do reindex-chainstate when rebuilding db struct * only calculate statehash if debug=statehash * include cfsupply and cflocked in statehash * add mine filter to listproposals * support multiple filters * remove duplicate declaration * add cfund test unit * fix call to old var * setup consistency * fix loop condition * assert statehash * remove old reference after master merge * remove old reference after master merge * fDirty * Revert "fDirty" This reverts commit 561339d. * add extra log
1 parent 5d59483 commit 049978e

36 files changed

+1499
-579
lines changed

qa/pull-tester/rpc-tests.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,8 @@
190190
'sendtoaddress.py',
191191
'stakeimmaturebalance.py',
192192
'rpc-help.py',
193-
'createrawscriptaddress.py'
193+
'createrawscriptaddress.py',
194+
'cfunddb-statehash.py'
194195
]
195196
#if ENABLE_ZMQ:
196197
# testScripts.append('zmq_test.py')

qa/rpc-tests/cfund-fork-reorg-preq.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ def __init__(self):
1717
self.num_nodes = 2
1818

1919
def setup_network(self, split=False):
20-
self.nodes = self.setup_nodes()
20+
self.nodes = []
21+
self.nodes.append(start_node(0, self.options.tmpdir, ["-debug=dao"]))
22+
self.nodes.append(start_node(1, self.options.tmpdir, ["-debug=dao"]))
2123
connect_nodes_bi(self.nodes, 0, 1)
2224
self.is_network_split = False
2325

@@ -83,7 +85,7 @@ def run_test(self):
8385
best_block = self.nodes[1].getbestblockhash()
8486

8587
self.stop_node(0)
86-
self.nodes[0] = start_node(0, self.options.tmpdir, [])
88+
self.nodes[0] = start_node(0, self.options.tmpdir, ["-debug=dao"])
8789

8890
# Reconnect the nodes
8991
connect_nodes_bi(self.nodes, 0, 1)
@@ -100,8 +102,8 @@ def run_test(self):
100102
slow_gen(self.nodes[0], self.nodes[0].cfundstats()["votingPeriod"]["ending"] - self.nodes[0].cfundstats()["votingPeriod"]["current"])
101103
sync_blocks(self.nodes)
102104

103-
assert_equal(self.nodes[0].getpaymentrequest(paymentHash0)["status"], "accepted")
104-
assert_equal(self.nodes[0].getblock(self.nodes[0].getpaymentrequest(paymentHash0)["paidOnBlock"]), self.nodes[1].getblock(self.nodes[1].getpaymentrequest(paymentHash0)["paidOnBlock"]))
105+
assert_equal(self.nodes[0].getpaymentrequest(paymentHash0)["status"], "paid")
106+
assert_equal(self.nodes[0].getblock(self.nodes[0].getpaymentrequest(paymentHash0)["stateChangedOnBlock"]), self.nodes[1].getblock(self.nodes[1].getpaymentrequest(paymentHash0)["stateChangedOnBlock"]))
105107
assert_equal(self.nodes[0].getbestblockhash(), self.nodes[1].getbestblockhash())
106108
assert_equal(self.nodes[0].getblock(self.nodes[0].getpaymentrequest(paymentHash0)["blockHash"]), self.nodes[1].getblock(self.nodes[1].getpaymentrequest(paymentHash0)["blockHash"]))
107109
assert_equal(self.nodes[0].getpaymentrequest(paymentHash0), self.nodes[1].getpaymentrequest(paymentHash0))
@@ -117,10 +119,10 @@ def create_raw_paymentrequest(self, amount, address, proposal_hash, description)
117119
[],
118120
{"6ac1": 1},
119121
json.dumps({
120-
"v": 2,
121-
"h": proposal_hash,
122-
"n": amount,
123-
"s": signature,
122+
"v": 2,
123+
"h": proposal_hash,
124+
"n": amount,
125+
"s": signature,
124126
"i": description,
125127
})
126128
)

qa/rpc-tests/cfund-fork-reorg-proposal.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ def __init__(self):
1919
self.num_nodes = 2
2020

2121
def setup_network(self, split=False):
22-
self.nodes = self.setup_nodes()
22+
self.nodes = []
23+
self.nodes.append(start_node(0, self.options.tmpdir, ["-debug=dao"]))
24+
self.nodes.append(start_node(1, self.options.tmpdir, ["-debug=dao"]))
2325
connect_nodes_bi(self.nodes, 0, 1)
2426
self.is_network_split = False
2527

@@ -59,19 +61,19 @@ def run_test(self):
5961
slow_gen(self.nodes[1], 1)
6062

6163
# Assert that both hashes for payment request are identical
62-
assert(proposalHash0 == proposalHash1)
64+
assert(proposalHash0 == proposalHash1)
6365

6466
# Assert that both payment requests have been included in different block hashes
6567
assert(self.nodes[0].getproposal(proposalHash0)["blockHash"] != self.nodes[1].getproposal(proposalHash1)["blockHash"])
66-
68+
6769
# Make the node vote yes
6870
self.nodes[1].proposalvote(proposalHash0, "yes")
6971

7072
# End cycle 0
7173
slow_gen(self.nodes[1], 1)
7274
end_cycle(self.nodes[1])
7375

74-
# End cycle 1
76+
# End cycle 1
7577
slow_gen(self.nodes[1], 1)
7678
end_cycle(self.nodes[1])
7779

@@ -96,7 +98,7 @@ def run_test(self):
9698
assert_equal(self.nodes[0].getblock(self.nodes[0].getproposal(proposalHash0)["blockHash"]), self.nodes[1].getblock(self.nodes[1].getproposal(proposalHash0)["blockHash"]))
9799
assert_equal(self.nodes[0].getproposal(proposalHash0), self.nodes[1].getproposal(proposalHash0))
98100

99-
# End cycle 2
101+
# End cycle 2
100102
slow_gen(self.nodes[1], 1)
101103
end_cycle(self.nodes[1])
102104
sync_blocks(self.nodes)
@@ -132,14 +134,14 @@ def run_test(self):
132134

133135
# Verify both nodes accpeted the payment
134136

135-
assert_equal(self.nodes[0].getpaymentrequest(preqHash)["status"], "accepted")
136-
assert_equal(self.nodes[0].getblock(self.nodes[0].getpaymentrequest(preqHash)["paidOnBlock"]), self.nodes[1].getblock(self.nodes[1].getpaymentrequest(preqHash)["paidOnBlock"]))
137+
assert_equal(self.nodes[0].getpaymentrequest(preqHash)["status"], "paid")
138+
assert_equal(self.nodes[0].getblock(self.nodes[0].getpaymentrequest(preqHash)["stateChangedOnBlock"]), self.nodes[1].getblock(self.nodes[1].getpaymentrequest(preqHash)["stateChangedOnBlock"]))
137139
assert_equal(self.nodes[0].getbestblockhash(), self.nodes[1].getbestblockhash())
138140
assert_equal(self.nodes[0].getblock(self.nodes[0].getpaymentrequest(preqHash)["blockHash"]), self.nodes[1].getblock(self.nodes[1].getpaymentrequest(preqHash)["blockHash"]))
139141
assert_equal(self.nodes[0].getpaymentrequest(preqHash), self.nodes[1].getpaymentrequest(preqHash))
140142

141143
# Verify the payment was actually received
142-
paidBlock = self.nodes[0].getblock(self.nodes[0].getpaymentrequest(preqHash)["paidOnBlock"])
144+
paidBlock = self.nodes[0].getblock(self.nodes[0].getpaymentrequest(preqHash)["stateChangedOnBlock"])
143145
unspent = self.nodes[0].listunspent(0, 80)
144146

145147
assert_equal(unspent[0]['address'], paymentAddress)

qa/rpc-tests/cfund-paymentrequest-duplicate.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ def __init__(self):
1717
super().__init__()
1818
self.setup_clean_chain = True
1919
self.num_nodes = 2
20+
self.node_args = [['-debug=dao'], ['-debug=dao']]
2021

2122
def setup_network(self, split=False):
2223
self.nodes = []
@@ -141,14 +142,11 @@ def run_test(self):
141142
for x in range(self.num_nodes):
142143
for proposal in proposals:
143144
for preq in proposal["preqs"]:
144-
assert(self.nodes[x].getpaymentrequest(preq["hash"])["state"] == 1)
145-
assert(self.nodes[x].getpaymentrequest(preq["hash"])["paidOnBlock"] == "0000000000000000000000000000000000000000000000000000000000000000")
146-
147-
145+
assert_equal(self.nodes[x].getpaymentrequest(preq["hash"])["state"], 1)
148146

149147
wallet_info1 = self.nodes[0].getwalletinfo()
150148

151-
while self.nodes[0].getpaymentrequest(proposals[0]["preqs"][0]["hash"])["paidOnBlock"] == "0000000000000000000000000000000000000000000000000000000000000000":
149+
while self.nodes[0].getpaymentrequest(proposals[0]["preqs"][0]["hash"])["state"] != 6:
152150
blocks = slow_gen(self.nodes[0], 1)
153151

154152
sync_blocks(self.nodes)
@@ -164,7 +162,7 @@ def run_test(self):
164162
for proposal in proposals:
165163
for preq in proposal["preqs"]:
166164
preqsFound += 1
167-
payoutBlockHash = self.nodes[x].getpaymentrequest(preq["hash"])["paidOnBlock"]
165+
payoutBlockHash = self.nodes[x].getpaymentrequest(preq["hash"])["stateChangedOnBlock"]
168166
payoutBlock = self.nodes[x].getblock(payoutBlockHash)
169167
payoutHex = self.nodes[x].getrawtransaction(payoutBlock["tx"][0])
170168
payoutTx = self.nodes[x].decoderawtransaction(payoutHex)

qa/rpc-tests/cfund-paymentrequest-extract-funds.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ def run_test(self):
112112
# the 5 payment requests should be accepted
113113
allAccepted = True
114114
for paymentReq in paymentRequests:
115-
if self.nodes[0].getpaymentrequest(paymentReq)["state"] != 1:
115+
if self.nodes[0].getpaymentrequest(paymentReq)["state"] != 6:
116116
allAccepted = False
117117

118118
# all the payment requests should have been validated

qa/rpc-tests/cfund-paymentrequest-hardfork-452.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def run_test(self):
2626

2727
payoutTxID_1 = self.create_double_preq_payout()
2828
print("Second payment request payout:\n"+str(self.nodes[0].gettxout(payoutTxID_1, 1)))
29-
29+
3030
# If the payment request is paid out again, the coinbase tx will have 2 vouts, so check txout at index 1
3131
assert(self.nodes[0].gettxout(payoutTxID_1, 1) != None)
3232

@@ -36,11 +36,11 @@ def run_test(self):
3636

3737
payoutTxID_2 = self.create_double_preq_payout()
3838
print("Second payment request payout:\n"+str(self.nodes[0].gettxout(payoutTxID_2, 1)))
39-
39+
4040

4141
# If the payment request is paid out again, the coinbase tx will have 2 vouts, so check txout at index 1
4242
assert(self.nodes[0].gettxout(payoutTxID_2, 1) == None)
43-
43+
4444

4545
def create_double_preq_payout(self):
4646
# Creates a proposal and payment request that is paid out twice
@@ -53,11 +53,11 @@ def create_double_preq_payout(self):
5353

5454
proposalid0 = self.nodes[0].createproposal(paymentAddress, proposalAmount, 36000, "test")["hash"]
5555
start_new_cycle(self.nodes[0])
56-
56+
5757
self.nodes[0].proposalvote(proposalid0, "yes")
58-
58+
5959
start_new_cycle(self.nodes[0])
60-
60+
6161
# Proposal should be accepted
6262
assert(self.nodes[0].getproposal(proposalid0)["state"] == 1)
6363
assert(self.nodes[0].getproposal(proposalid0)["status"] == "accepted")
@@ -74,9 +74,9 @@ def create_double_preq_payout(self):
7474

7575
start_new_cycle(self.nodes[0])
7676
assert(self.nodes[0].getpaymentrequest(paymentReq)["state"] == 1)
77-
assert(self.nodes[0].getpaymentrequest(paymentReq)["paidOnBlock"] == "0000000000000000000000000000000000000000000000000000000000000000")
77+
assert(self.nodes[0].getpaymentrequest(paymentReq)["stateChangedOnBlock"] != "0000000000000000000000000000000000000000000000000000000000000000")
7878

79-
while self.nodes[0].getpaymentrequest(paymentReq)["paidOnBlock"] == "0000000000000000000000000000000000000000000000000000000000000000":
79+
while self.nodes[0].getpaymentrequest(paymentReq)["state"] != 6:
8080
blocks = slow_gen(self.nodes[0], 1)
8181

8282
slow_gen(self.nodes[0], 1)
@@ -87,11 +87,11 @@ def create_double_preq_payout(self):
8787

8888
self.nodes[0].coinbaseoutputs([rawOutput])
8989
self.nodes[0].setcoinbasestrdzeel('[\"'+paymentReq+'\"]')
90-
90+
9191
payoutBlockHash = slow_gen(self.nodes[0], 1)[0]
9292

9393
payoutTxID = self.nodes[0].getblock(payoutBlockHash)["tx"][0]
94-
94+
9595
return payoutTxID
9696

9797

qa/rpc-tests/cfund-paymentrequest-payout.py

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,10 @@ def run_test(self):
103103

104104
for x in range(self.num_nodes):
105105
assert(self.nodes[x].getpaymentrequest(paymentReq)["state"] == 1)
106-
assert(self.nodes[x].getpaymentrequest(paymentReq)["paidOnBlock"] == "0000000000000000000000000000000000000000000000000000000000000000")
107106

108107
wallet_info1 = self.nodes[0].getwalletinfo()
109108

110-
while self.nodes[0].getpaymentrequest(paymentReq)["paidOnBlock"] == "0000000000000000000000000000000000000000000000000000000000000000":
109+
while self.nodes[0].getpaymentrequest(paymentReq)["state"] != 6:
111110
blocks = slow_gen(self.nodes[0], 1)
112111

113112
sync_blocks(self.nodes)
@@ -117,7 +116,7 @@ def run_test(self):
117116
# check all wallets see the payout
118117

119118
for x in range(self.num_nodes):
120-
payoutBlockHash = self.nodes[x].getpaymentrequest(paymentReq)["paidOnBlock"]
119+
payoutBlockHash = self.nodes[x].getpaymentrequest(paymentReq)["stateChangedOnBlock"]
121120
payoutBlock = self.nodes[x].getblock(payoutBlockHash)
122121
payoutHex = self.nodes[x].getrawtransaction(payoutBlock["tx"][0])
123122
payoutTx = self.nodes[x].decoderawtransaction(payoutHex)
@@ -143,15 +142,14 @@ def run_test(self):
143142
for x in range(self.num_nodes):
144143
assert(self.nodes[x].getbestblockhash() == bestBlockHash)
145144
assert(self.nodes[x].getpaymentrequest(paymentReq)["state"] == 1)
146-
assert(self.nodes[x].getpaymentrequest(paymentReq)["paidOnBlock"] == "0000000000000000000000000000000000000000000000000000000000000000")
147145

148-
while self.nodes[1].getpaymentrequest(paymentReq)["paidOnBlock"] == "0000000000000000000000000000000000000000000000000000000000000000":
146+
while self.nodes[1].getpaymentrequest(paymentReq)["state"] != 6:
149147
blocks = slow_gen(self.nodes[1], 1)
150148

151149
sync_blocks(self.nodes)
152150

153151
for x in range(self.num_nodes):
154-
payoutBlockHash = self.nodes[x].getpaymentrequest(paymentReq)["paidOnBlock"]
152+
payoutBlockHash = self.nodes[x].getpaymentrequest(paymentReq)["stateChangedOnBlock"]
155153
payoutBlock = self.nodes[x].getblock(payoutBlockHash)
156154
payoutHex = self.nodes[x].getrawtransaction(payoutBlock["tx"][0])
157155
payoutTx = self.nodes[x].decoderawtransaction(payoutHex)
@@ -169,36 +167,30 @@ def run_test(self):
169167
for x in range(self.num_nodes):
170168
assert(self.nodes[x].getbestblockhash() == bestBlockHash)
171169
assert(self.nodes[x].getpaymentrequest(paymentReq)["state"] == 1)
172-
assert(self.nodes[x].getpaymentrequest(paymentReq)["paidOnBlock"] == "0000000000000000000000000000000000000000000000000000000000000000")
170+
assert(self.nodes[x].getpaymentrequest(paymentReq)["stateChangedOnBlock"] != "0000000000000000000000000000000000000000000000000000000000000000")
173171

174172
# disconnect the nodes and generate the payout on each node
175173
url = urllib.parse.urlparse(self.nodes[1].url)
176174
self.nodes[0].disconnectnode(url.hostname+":"+str(p2p_port(1)))
177175

178176
time.sleep(1)
179177

180-
while self.nodes[0].getpaymentrequest(paymentReq)["paidOnBlock"] == "0000000000000000000000000000000000000000000000000000000000000000":
178+
while self.nodes[0].getpaymentrequest(paymentReq)["state"] != 6:
181179
slow_gen(self.nodes[0], 1)
182180

183-
while self.nodes[1].getpaymentrequest(paymentReq)["paidOnBlock"] == "0000000000000000000000000000000000000000000000000000000000000000":
181+
while self.nodes[1].getpaymentrequest(paymentReq)["state"] != 6:
184182
slow_gen(self.nodes[1], 1)
185183

186-
payoutBlockHash = self.nodes[0].getpaymentrequest(paymentReq)["paidOnBlock"]
187-
188-
# check both think they have paid out
189-
for x in range(self.num_nodes):
190-
assert(x == 0 or self.nodes[x].getpaymentrequest(paymentReq)["paidOnBlock"] != payoutBlockHash)
191-
192184
slow_gen(self.nodes[1], 1)
193185
connect_nodes_bi(self.nodes,0,1) #reconnect the node
194186

195187
sync_blocks(self.nodes)
196188

197-
payoutBlockHash = self.nodes[0].getpaymentrequest(paymentReq)["paidOnBlock"]
189+
payoutBlockHash = self.nodes[0].getpaymentrequest(paymentReq)["stateChangedOnBlock"]
198190

199191
# check both agree on the payout block
200192
for x in range(self.num_nodes):
201-
assert(self.nodes[x].getpaymentrequest(paymentReq)["paidOnBlock"] == payoutBlockHash)
193+
assert(self.nodes[x].getpaymentrequest(paymentReq)["stateChangedOnBlock"] == payoutBlockHash)
202194

203195

204196
if __name__ == '__main__':

qa/rpc-tests/cfund-paymentrequest-state-accept-expired-proposal.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ def __init__(self):
1717
self.num_nodes = 1
1818

1919
def setup_network(self, split=False):
20-
self.nodes = self.setup_nodes()
20+
self.nodes = []
21+
self.nodes.append(start_node(0, self.options.tmpdir, ["-debug=dao"]))
2122
self.is_network_split = split
2223

2324
def run_test(self):
@@ -29,7 +30,7 @@ def run_test(self):
2930
proposal_amount = 10
3031

3132
# Create a proposal and accept by voting
32-
proposalid0 = self.nodes[0].createproposal(self.nodes[0].getnewaddress(), proposal_amount, proposal_duration, "test")["hash"]
33+
proposalid0 = self.nodes[0].createproposal(self.nodes[0].getnewaddress(), proposal_amount, proposal_duration, "test")["hash"]
3334
locked_before = self.nodes[0].cfundstats()["funds"]["locked"]
3435
end_cycle(self.nodes[0])
3536

@@ -150,7 +151,7 @@ def run_test(self):
150151
self.nodes[0].paymentrequestvote(paymentrequestid0, "remove")
151152

152153
assert(self.nodes[0].getpaymentrequest(paymentrequestid0)["state"] == 0)
153-
assert(self.nodes[0].getpaymentrequest(paymentrequestid0)["status"] == "accepted waiting for end of voting period")
154+
assert_equal(self.nodes[0].getpaymentrequest(paymentrequestid0)["status"], "accepted waiting for end of voting period")
154155
assert(self.nodes[0].cfundstats()["funds"]["locked"] == locked_accepted)
155156

156157
time.sleep(0.2)
@@ -185,7 +186,6 @@ def run_test(self):
185186
end_cycle(self.nodes[0])
186187

187188
# Locked amount should be 0, as this was the only payment request and the proposal was expired
188-
print(self.nodes[0].cfundstats())
189189
assert(self.nodes[0].cfundstats()["funds"]["locked"] == 0)
190190
assert(self.nodes[0].getproposal(proposalid0)["status"] == "expired")
191191

qa/rpc-tests/cfund-paymentrequest-state-accept.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def run_test(self):
2626
self.nodes[0].donatefund(100)
2727

2828
# Create a proposal and accept by voting
29-
proposalid0 = self.nodes[0].createproposal(self.nodes[0].getnewaddress(), 10, 3600, "test")["hash"]
29+
proposalid0 = self.nodes[0].createproposal(self.nodes[0].getnewaddress(), 10, 3600, "test")["hash"]
3030
locked_before = self.nodes[0].cfundstats()["funds"]["locked"]
3131
end_cycle(self.nodes[0])
3232

@@ -151,15 +151,15 @@ def run_test(self):
151151
assert(self.nodes[0].getpaymentrequest(paymentrequestid0)["status"] == "accepted")
152152
assert(self.nodes[0].cfundstats()["funds"]["locked"] == locked_after_payment)
153153

154-
# Check that paymentrequest remains in accepted state after the max number of cycles
154+
# Check that paymentrequest moves to paid state
155155

156156
cycles_to_expire = self.nodes[0].cfundstats()["consensus"]["maxCountVotingCyclePaymentRequests"]
157157

158158
for idx in range(cycles_to_expire):
159159
end_cycle(self.nodes[0])
160160

161-
assert(self.nodes[0].getpaymentrequest(paymentrequestid0)["state"] == 1)
162-
assert(self.nodes[0].getpaymentrequest(paymentrequestid0)["status"] == "accepted")
161+
assert(self.nodes[0].getpaymentrequest(paymentrequestid0)["state"] == 6)
162+
assert(self.nodes[0].getpaymentrequest(paymentrequestid0)["status"] == "paid")
163163

164164
# Create multiple payment requests
165165

qa/rpc-tests/cfund-rawtx-paymentrequest-create.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def run_test(self):
105105
slow_gen(self.nodes[0], 10)
106106

107107
# Check the payment request is paid out
108-
assert (float(self.nodes[0].getproposal(self.goodProposalHash)["notPaidYet"]) == 9)
108+
assert_equal(float(self.nodes[0].getproposal(self.goodProposalHash)["notPaidYet"]), 9)
109109
assert (float(self.nodes[0].cfundstats()["funds"]["locked"]) == 9)
110110

111111

@@ -203,7 +203,7 @@ def check_good_paymentrequest(self, paymentRequest):
203203
assert (paymentRequest['votingCycle'] == 0)
204204
assert (paymentRequest['status'] == 'pending')
205205
assert (paymentRequest['state'] == 0)
206-
assert (paymentRequest['stateChangedOnBlock'] == '0000000000000000000000000000000000000000000000000000000000000000')
206+
assert('stateChangedOnBlock' not in paymentRequest.keys())
207207

208208
def send_raw_paymentrequest(self, amount, address, proposal_hash, description):
209209
amount = amount * 100000000

0 commit comments

Comments
 (0)