Skip to content

Commit bb96df4

Browse files
Merge #6336: fix: rpc getblock and getblockstats for blocks with withdrawal transactions (asset unlock)
b9a46f6 refactor: use IsPlatformTransfer in core_write and rpc/blockchain (Konstantin Akimov) f6169fa fix: make composite rpc 'masternode payments' to work with withdrawals (Konstantin Akimov) e498378 feat: add test for fee in getmempoolentry (Konstantin Akimov) b0d06f0 feat: add regression test for `getblock` and `getblockstats` for withdrawal fee calculation failure (Konstantin Akimov) ab7172b fix: getblockstats rpc to work with withdrawal transactions (Konstantin Akimov) 96c9b46 fix: getblock for withdrawal transaction if verbosity level is 2 (Konstantin Akimov) Pull request description: ## Issue being fixed or feature implemented #6335 ## What was done? Applied fixes for `getblock` rpc and `getblockstats` rpc to make them work with withdrawal transactions (asset unlock). ## How Has This Been Tested? Run updated functional test `feature_asset_locks.py` without the fix causes a failure: ``` 2024-10-22T12:01:35.902000Z TestFramework (ERROR): JSONRPC error Traceback (most recent call last): File "/home/knst/projects/dash-reviews/test/functional/test_framework/test_framework.py", line 160, in main self.run_test() File "/home/knst/projects/dash-reviews/test/functional/feature_asset_locks.py", line 273, in run_test self.test_asset_unlocks(node_wallet, node, pubkey) File "/home/knst/projects/dash-reviews/test/functional/feature_asset_locks.py", line 410, in test_asset_unlocks self.log.info(f"block info: {node.getblock(block_asset_unlock, 2)}") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/knst/projects/dash-reviews/test/functional/test_framework/coverage.py", line 49, in __call__ return_val = self.auth_service_proxy_instance.__call__(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/knst/projects/dash-reviews/test/functional/test_framework/authproxy.py", line 148, in __call__ raise JSONRPCException(response['error'], status) test_framework.authproxy.JSONRPCException: Internal bug detected: "MoneyRange(fee)" core_write.cpp:338 (TxToUniv) Please report this issue here: https://github.com/dashpay/dash/issues (-1) ``` With patch functional test `feature_asset_locks.py` succeed. ## Breaking Changes N/A ## Checklist: - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [x] I have added or updated relevant unit/integration/functional/e2e tests - [x] I have made corresponding changes to the documentation - [x] I have assigned this pull request to a milestone ACKs for top commit: PastaPastaPasta: utACK b9a46f6 kwvg: utACK b9a46f6 UdjinM6: utACK b9a46f6 ogabrielides: utACK b9a46f6 Tree-SHA512: e49cf73bff5fabc9463ae538c6c556d02b3f9e396e0353f5ea0661afa015259409cdada406d05b77bf0414761c76a013cd428ffc283cbdefbefe3384c9d6ccc5
1 parent 8e70262 commit bb96df4

File tree

4 files changed

+20
-1
lines changed

4 files changed

+20
-1
lines changed

src/core_write.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,10 @@ void TxToUniv(const CTransaction& tx, const uint256& hashBlock, bool include_add
334334
}
335335

336336
if (calculate_fee) {
337-
const CAmount fee = amt_total_in - amt_total_out;
337+
CAmount fee = amt_total_in - amt_total_out;
338+
if (tx.IsPlatformTransfer()) {
339+
fee = CHECK_NONFATAL(GetTxPayload<CAssetUnlockPayload>(tx))->getFee();
340+
}
338341
CHECK_NONFATAL(MoneyRange(fee));
339342
entry.pushKV("fee", ValueFromAmount(fee));
340343
}

src/rpc/blockchain.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
#include <versionbits.h>
4848
#include <warnings.h>
4949

50+
#include <evo/assetlocktx.h>
5051
#include <evo/cbtx.h>
5152
#include <evo/evodb.h>
5253
#include <evo/mnhftx.h>
@@ -2423,6 +2424,11 @@ static RPCHelpMan getblockstats()
24232424
}
24242425

24252426
CAmount txfee = tx_total_in - tx_total_out;
2427+
2428+
if (tx->IsPlatformTransfer()) {
2429+
txfee = CHECK_NONFATAL(GetTxPayload<CAssetUnlockPayload>(*tx))->getFee();
2430+
}
2431+
24262432
CHECK_NONFATAL(MoneyRange(txfee));
24272433
if (do_medianfee) {
24282434
fee_array.push_back(txfee);

src/rpc/masternode.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
44

55
#include <chainparams.h>
6+
#include <evo/assetlocktx.h>
67
#include <evo/chainhelper.h>
78
#include <evo/deterministicmns.h>
89
#include <governance/classes.h>
@@ -409,6 +410,11 @@ static RPCHelpMan masternode_payments()
409410
if (tx->IsCoinBase()) {
410411
continue;
411412
}
413+
if (tx->IsPlatformTransfer()) {
414+
nBlockFees += CHECK_NONFATAL(GetTxPayload<CAssetUnlockPayload>(*tx))->getFee();
415+
continue;
416+
}
417+
412418
CAmount nValueIn{0};
413419
for (const auto& txin : tx->vin) {
414420
uint256 blockHashTmp;

test/functional/feature_asset_locks.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@ def test_asset_unlocks(self, node_wallet, node, pubkey):
365365
self.wait_for_sporks_same()
366366

367367
txid = self.send_tx(asset_unlock_tx)
368+
assert_equal(node.getmempoolentry(txid)['fee'], Decimal("0.0007"))
368369
is_id = node_wallet.sendtoaddress(node_wallet.getnewaddress(), 1)
369370
for node in self.nodes:
370371
self.wait_for_instantlock(is_id, node)
@@ -403,6 +404,9 @@ def test_asset_unlocks(self, node_wallet, node, pubkey):
403404
self.mempool_size -= 2
404405
self.check_mempool_size()
405406
block_asset_unlock = node.getrawtransaction(asset_unlock_tx.rehash(), 1)['blockhash']
407+
self.log.info("Checking rpc `getblock` and `getblockstats` succeeds as they use own fee calculation mechanism")
408+
assert_equal(node.getblockstats(node.getblockcount())['maxfee'], tiny_amount)
409+
node.getblock(block_asset_unlock, 2)
406410

407411
self.send_tx(asset_unlock_tx,
408412
expected_error = "Transaction already in block chain",

0 commit comments

Comments
 (0)