Add fundrawtransaction RPC method
This commit is contained in:
parent
1e0d1a2ff0
commit
21bbd920e5
5 changed files with 65 additions and 0 deletions
|
@ -78,6 +78,7 @@ static const CRPCConvertParam vRPCConvertParams[] =
|
||||||
{ "signrawtransaction", 1 },
|
{ "signrawtransaction", 1 },
|
||||||
{ "signrawtransaction", 2 },
|
{ "signrawtransaction", 2 },
|
||||||
{ "sendrawtransaction", 1 },
|
{ "sendrawtransaction", 1 },
|
||||||
|
{ "fundrawtransaction", 1 },
|
||||||
{ "gettxout", 1 },
|
{ "gettxout", 1 },
|
||||||
{ "gettxout", 2 },
|
{ "gettxout", 2 },
|
||||||
{ "gettxoutproof", 0 },
|
{ "gettxoutproof", 0 },
|
||||||
|
|
|
@ -316,6 +316,9 @@ static const CRPCCommand vRPCCommands[] =
|
||||||
{ "rawtransactions", "getrawtransaction", &getrawtransaction, true },
|
{ "rawtransactions", "getrawtransaction", &getrawtransaction, true },
|
||||||
{ "rawtransactions", "sendrawtransaction", &sendrawtransaction, false },
|
{ "rawtransactions", "sendrawtransaction", &sendrawtransaction, false },
|
||||||
{ "rawtransactions", "signrawtransaction", &signrawtransaction, false }, /* uses wallet if enabled */
|
{ "rawtransactions", "signrawtransaction", &signrawtransaction, false }, /* uses wallet if enabled */
|
||||||
|
#ifdef ENABLE_WALLET
|
||||||
|
{ "rawtransactions", "fundrawtransaction", &fundrawtransaction, false },
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Utility functions */
|
/* Utility functions */
|
||||||
{ "util", "createmultisig", &createmultisig, true },
|
{ "util", "createmultisig", &createmultisig, true },
|
||||||
|
|
|
@ -217,6 +217,7 @@ extern UniValue listlockunspent(const UniValue& params, bool fHelp);
|
||||||
extern UniValue createrawtransaction(const UniValue& params, bool fHelp);
|
extern UniValue createrawtransaction(const UniValue& params, bool fHelp);
|
||||||
extern UniValue decoderawtransaction(const UniValue& params, bool fHelp);
|
extern UniValue decoderawtransaction(const UniValue& params, bool fHelp);
|
||||||
extern UniValue decodescript(const UniValue& params, bool fHelp);
|
extern UniValue decodescript(const UniValue& params, bool fHelp);
|
||||||
|
extern UniValue fundrawtransaction(const UniValue& params, bool fHelp);
|
||||||
extern UniValue signrawtransaction(const UniValue& params, bool fHelp);
|
extern UniValue signrawtransaction(const UniValue& params, bool fHelp);
|
||||||
extern UniValue sendrawtransaction(const UniValue& params, bool fHelp);
|
extern UniValue sendrawtransaction(const UniValue& params, bool fHelp);
|
||||||
extern UniValue gettxoutproof(const UniValue& params, bool fHelp);
|
extern UniValue gettxoutproof(const UniValue& params, bool fHelp);
|
||||||
|
|
|
@ -217,6 +217,12 @@ BOOST_AUTO_TEST_CASE(rpc_wallet)
|
||||||
UniValue arr = retValue.get_array();
|
UniValue arr = retValue.get_array();
|
||||||
BOOST_CHECK(arr.size() > 0);
|
BOOST_CHECK(arr.size() > 0);
|
||||||
BOOST_CHECK(CBitcoinAddress(arr[0].get_str()).Get() == demoAddress.Get());
|
BOOST_CHECK(CBitcoinAddress(arr[0].get_str()).Get() == demoAddress.Get());
|
||||||
|
|
||||||
|
/*********************************
|
||||||
|
* fundrawtransaction
|
||||||
|
*********************************/
|
||||||
|
BOOST_CHECK_THROW(CallRPC("fundrawtransaction 28z"), runtime_error);
|
||||||
|
BOOST_CHECK_THROW(CallRPC("fundrawtransaction 01000000000180969800000000001976a91450ce0a4b0ee0ddeb633da85199728b940ac3fe9488ac00000000"), runtime_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
|
@ -2359,3 +2359,57 @@ UniValue listunspent(const UniValue& params, bool fHelp)
|
||||||
|
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UniValue fundrawtransaction(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (!EnsureWalletIsAvailable(fHelp))
|
||||||
|
return NullUniValue;
|
||||||
|
|
||||||
|
if (fHelp || params.size() != 1)
|
||||||
|
throw runtime_error(
|
||||||
|
"fundrawtransaction \"hexstring\"\n"
|
||||||
|
"\nAdd inputs to a transaction until it has enough in value to meet its out value.\n"
|
||||||
|
"This will not modify existing inputs, and will add one change output to the outputs.\n"
|
||||||
|
"Note that inputs which were signed may need to be resigned after completion since in/outputs have been added.\n"
|
||||||
|
"The inputs added will not be signed, use signrawtransaction for that.\n"
|
||||||
|
"\nArguments:\n"
|
||||||
|
"1. \"hexstring\" (string, required) The hex string of the raw transaction\n"
|
||||||
|
"\nResult:\n"
|
||||||
|
"{\n"
|
||||||
|
" \"hex\": \"value\", (string) The resulting raw transaction (hex-encoded string)\n"
|
||||||
|
" \"fee\": n, (numeric) The fee added to the transaction\n"
|
||||||
|
" \"changepos\": n (numeric) The position of the added change output, or -1\n"
|
||||||
|
"}\n"
|
||||||
|
"\"hex\" \n"
|
||||||
|
"\nExamples:\n"
|
||||||
|
"\nCreate a transaction with no inputs\n"
|
||||||
|
+ HelpExampleCli("createrawtransaction", "\"[]\" \"{\\\"myaddress\\\":0.01}\"") +
|
||||||
|
"\nAdd sufficient unsigned inputs to meet the output value\n"
|
||||||
|
+ HelpExampleCli("fundrawtransaction", "\"rawtransactionhex\"") +
|
||||||
|
"\nSign the transaction\n"
|
||||||
|
+ HelpExampleCli("signrawtransaction", "\"fundedtransactionhex\"") +
|
||||||
|
"\nSend the transaction\n"
|
||||||
|
+ HelpExampleCli("sendrawtransaction", "\"signedtransactionhex\"")
|
||||||
|
);
|
||||||
|
|
||||||
|
RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR));
|
||||||
|
|
||||||
|
// parse hex string from parameter
|
||||||
|
CTransaction origTx;
|
||||||
|
if (!DecodeHexTx(origTx, params[0].get_str()))
|
||||||
|
throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed");
|
||||||
|
|
||||||
|
CMutableTransaction tx(origTx);
|
||||||
|
CAmount nFee;
|
||||||
|
string strFailReason;
|
||||||
|
int nChangePos = -1;
|
||||||
|
if(!pwalletMain->FundTransaction(tx, nFee, nChangePos, strFailReason))
|
||||||
|
throw JSONRPCError(RPC_INTERNAL_ERROR, strFailReason);
|
||||||
|
|
||||||
|
UniValue result(UniValue::VOBJ);
|
||||||
|
result.push_back(Pair("hex", EncodeHexTx(tx)));
|
||||||
|
result.push_back(Pair("changepos", nChangePos));
|
||||||
|
result.push_back(Pair("fee", ValueFromAmount(nFee)));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue