rpc: Validate maxfeerate with AmountFromValue

This commit is contained in:
João Barbosa 2019-04-08 15:40:57 +01:00
parent 327d2746fb
commit aa410c2b17
2 changed files with 4 additions and 8 deletions

View file

@ -1090,15 +1090,13 @@ static UniValue sendrawtransaction(const JSONRPCRequest& request)
// TODO: temporary migration code for old clients. Remove in v0.20 // TODO: temporary migration code for old clients. Remove in v0.20
if (request.params[1].isBool()) { if (request.params[1].isBool()) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Second argument must be numeric (maxfeerate) and no longer supports a boolean. To allow a transaction with high fees, set maxfeerate to 0."); throw JSONRPCError(RPC_INVALID_PARAMETER, "Second argument must be numeric (maxfeerate) and no longer supports a boolean. To allow a transaction with high fees, set maxfeerate to 0.");
} else if (request.params[1].isNum()) { } else if (!request.params[1].isNull()) {
size_t weight = GetTransactionWeight(*tx); size_t weight = GetTransactionWeight(*tx);
CFeeRate fr(AmountFromValue(request.params[1])); CFeeRate fr(AmountFromValue(request.params[1]));
// the +3/4 part rounds the value up, and is the same formula used when // the +3/4 part rounds the value up, and is the same formula used when
// calculating the fee for a transaction // calculating the fee for a transaction
// (see GetVirtualTransactionSize) // (see GetVirtualTransactionSize)
max_raw_tx_fee = fr.GetFee((weight+3)/4); max_raw_tx_fee = fr.GetFee((weight+3)/4);
} else if (!request.params[1].isNull()) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "second argument (maxfeerate) must be numeric");
} }
uint256 txid; uint256 txid;
@ -1172,15 +1170,13 @@ static UniValue testmempoolaccept(const JSONRPCRequest& request)
// TODO: temporary migration code for old clients. Remove in v0.20 // TODO: temporary migration code for old clients. Remove in v0.20
if (request.params[1].isBool()) { if (request.params[1].isBool()) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Second argument must be numeric (maxfeerate) and no longer supports a boolean. To allow a transaction with high fees, set maxfeerate to 0."); throw JSONRPCError(RPC_INVALID_PARAMETER, "Second argument must be numeric (maxfeerate) and no longer supports a boolean. To allow a transaction with high fees, set maxfeerate to 0.");
} else if (request.params[1].isNum()) { } else if (!request.params[1].isNull()) {
size_t weight = GetTransactionWeight(*tx); size_t weight = GetTransactionWeight(*tx);
CFeeRate fr(AmountFromValue(request.params[1])); CFeeRate fr(AmountFromValue(request.params[1]));
// the +3/4 part rounds the value up, and is the same formula used when // the +3/4 part rounds the value up, and is the same formula used when
// calculating the fee for a transaction // calculating the fee for a transaction
// (see GetVirtualTransactionSize) // (see GetVirtualTransactionSize)
max_raw_tx_fee = fr.GetFee((weight+3)/4); max_raw_tx_fee = fr.GetFee((weight+3)/4);
} else if (!request.params[1].isNull()) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "second argument (maxfeerate) must be numeric");
} }
UniValue result(UniValue::VARR); UniValue result(UniValue::VARR);

View file

@ -446,9 +446,9 @@ class RawTransactionsTest(BitcoinTestFramework):
# and sendrawtransaction should throw # and sendrawtransaction should throw
assert_raises_rpc_error(-26, "absurdly-high-fee", self.nodes[2].sendrawtransaction, rawTxSigned['hex'], 0.00001000) assert_raises_rpc_error(-26, "absurdly-high-fee", self.nodes[2].sendrawtransaction, rawTxSigned['hex'], 0.00001000)
# And below calls should both succeed # And below calls should both succeed
testres = self.nodes[2].testmempoolaccept(rawtxs=[rawTxSigned['hex']], maxfeerate=0.00007000)[0] testres = self.nodes[2].testmempoolaccept(rawtxs=[rawTxSigned['hex']], maxfeerate='0.00007000')[0]
assert_equal(testres['allowed'], True) assert_equal(testres['allowed'], True)
self.nodes[2].sendrawtransaction(hexstring=rawTxSigned['hex'], maxfeerate=0.00007000) self.nodes[2].sendrawtransaction(hexstring=rawTxSigned['hex'], maxfeerate='0.00007000')
if __name__ == '__main__': if __name__ == '__main__':