mirror of
https://github.com/ElementsProject/lightning.git
synced 2024-11-19 18:11:28 +01:00
Fix: fix the parameter prase of txprepare
The old prase process doesn't work!!
This commit is contained in:
parent
43e55fc8e4
commit
36bc624928
@ -157,15 +157,15 @@ static struct command_result *json_prepare_tx(struct command *cmd,
|
|||||||
struct unreleased_tx **utx,
|
struct unreleased_tx **utx,
|
||||||
bool for_withdraw)
|
bool for_withdraw)
|
||||||
{
|
{
|
||||||
u32 *feerate_per_kw;
|
u32 *feerate_per_kw = NULL;
|
||||||
struct command_result *res;
|
struct command_result *result;
|
||||||
u32 *minconf, maxheight;
|
u32 *minconf, maxheight;
|
||||||
struct pubkey *changekey;
|
struct pubkey *changekey;
|
||||||
struct bitcoin_tx_output **outputs;
|
struct bitcoin_tx_output **outputs;
|
||||||
const jsmntok_t *outputstok, *t;
|
const jsmntok_t *outputstok = NULL, *t;
|
||||||
const u8 *destination = NULL;
|
const u8 *destination = NULL;
|
||||||
size_t out_len, i;
|
size_t out_len, i;
|
||||||
const struct utxo **chosen_utxos;
|
const struct utxo **chosen_utxos = NULL;
|
||||||
|
|
||||||
*utx = tal(cmd, struct unreleased_tx);
|
*utx = tal(cmd, struct unreleased_tx);
|
||||||
(*utx)->wtx = tal(*utx, struct wallet_tx);
|
(*utx)->wtx = tal(*utx, struct wallet_tx);
|
||||||
@ -174,29 +174,123 @@ static struct command_result *json_prepare_tx(struct command *cmd,
|
|||||||
if (!for_withdraw) {
|
if (!for_withdraw) {
|
||||||
/* From v0.7.3, the new style for *txprepare* use array of outputs
|
/* From v0.7.3, the new style for *txprepare* use array of outputs
|
||||||
* to replace original 'destination' and 'satoshi' parameters.*/
|
* to replace original 'destination' and 'satoshi' parameters.*/
|
||||||
if (!param(cmd, buffer, params,
|
/* For generating help, give new-style. */
|
||||||
p_req("outputs", param_array, &outputstok),
|
if (!params || !deprecated_apis) {
|
||||||
p_opt("feerate", param_feerate, &feerate_per_kw),
|
|
||||||
p_opt_def("minconf", param_number, &minconf, 1),
|
|
||||||
p_opt("utxos", param_utxos, &chosen_utxos),
|
|
||||||
NULL)) {
|
|
||||||
|
|
||||||
/* For generating help, give new-style. */
|
|
||||||
if (!params || !deprecated_apis)
|
|
||||||
return command_param_failed();
|
|
||||||
|
|
||||||
/* For the old style:
|
|
||||||
* *txprepare* 'destination' 'satoshi' ['feerate'] ['minconf'] */
|
|
||||||
if (!param(cmd, buffer, params,
|
if (!param(cmd, buffer, params,
|
||||||
p_req("destination", param_bitcoin_address,
|
p_req("outputs", param_array, &outputstok),
|
||||||
&destination),
|
|
||||||
p_req("satoshi", param_wtx, (*utx)->wtx),
|
|
||||||
p_opt("feerate", param_feerate, &feerate_per_kw),
|
p_opt("feerate", param_feerate, &feerate_per_kw),
|
||||||
p_opt_def("minconf", param_number, &minconf, 1),
|
p_opt_def("minconf", param_number, &minconf, 1),
|
||||||
|
p_opt("utxos", param_utxos, &chosen_utxos),
|
||||||
|
NULL))
|
||||||
|
return command_param_failed();
|
||||||
|
} else if (params->type == JSMN_ARRAY) {
|
||||||
|
const jsmntok_t *firsttok, *secondtok, *thirdtok, *fourthtok;
|
||||||
|
|
||||||
|
/* FIXME: This change completely destroyes the support for `check`. */
|
||||||
|
if (!param(cmd, buffer, params,
|
||||||
|
p_req("outputs_or_destination", param_tok, &firsttok),
|
||||||
|
p_opt("feerate_or_sat", param_tok, &secondtok),
|
||||||
|
p_opt("minconf_or_feerate", param_tok, &thirdtok),
|
||||||
|
p_opt("utxos_or_minconf", param_tok, &fourthtok),
|
||||||
|
NULL))
|
||||||
|
return command_param_failed();
|
||||||
|
|
||||||
|
if (firsttok->type == JSMN_ARRAY) {
|
||||||
|
/* New style:
|
||||||
|
* *txprepare* 'outputs' ['feerate'] ['minconf'] ['utxos'] */
|
||||||
|
|
||||||
|
/* outputs (required) */
|
||||||
|
outputstok = firsttok;
|
||||||
|
|
||||||
|
/* feerate (optional) */
|
||||||
|
if (secondtok) {
|
||||||
|
result = param_feerate(cmd, "feerate", buffer,
|
||||||
|
secondtok, &feerate_per_kw);
|
||||||
|
if (result)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* minconf (optional) */
|
||||||
|
if (thirdtok) {
|
||||||
|
result = param_number(cmd, "minconf", buffer,
|
||||||
|
thirdtok, &minconf);
|
||||||
|
if (result)
|
||||||
|
return result;
|
||||||
|
} else {
|
||||||
|
minconf = tal(cmd, u32);
|
||||||
|
*minconf = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* utxos (optional) */
|
||||||
|
if (fourthtok) {
|
||||||
|
result = param_utxos(cmd, "utxos", buffer,
|
||||||
|
fourthtok, &chosen_utxos);
|
||||||
|
if (result)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* Old style:
|
||||||
|
* *txprepare* 'destination' 'satoshi' ['feerate'] ['minconf'] */
|
||||||
|
|
||||||
|
/* destination (required) */
|
||||||
|
result = param_bitcoin_address(cmd, "destination", buffer,
|
||||||
|
firsttok, &destination);
|
||||||
|
if (result)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
/* satoshi (required) */
|
||||||
|
if (!secondtok)
|
||||||
|
return command_fail(cmd, JSONRPC2_INVALID_PARAMS,
|
||||||
|
"Need set 'satoshi' field.");
|
||||||
|
result = param_wtx(cmd, "satoshi", buffer,
|
||||||
|
secondtok, (*utx)->wtx);
|
||||||
|
if (result)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
/* feerate (optional) */
|
||||||
|
if (thirdtok) {
|
||||||
|
result = param_feerate(cmd, "feerate", buffer,
|
||||||
|
thirdtok, &feerate_per_kw);
|
||||||
|
if (result)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* minconf (optional) */
|
||||||
|
if (fourthtok) {
|
||||||
|
result = param_number(cmd, "minconf", buffer,
|
||||||
|
fourthtok, &minconf);
|
||||||
|
if (result)
|
||||||
|
return result;
|
||||||
|
} else {
|
||||||
|
minconf = tal(cmd, u32);
|
||||||
|
*minconf = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const jsmntok_t *satoshitok = NULL;
|
||||||
|
if (!param(cmd, buffer, params,
|
||||||
|
p_opt("outputs", param_array, &outputstok),
|
||||||
|
p_opt("destination", param_bitcoin_address,
|
||||||
|
&destination),
|
||||||
|
p_opt("satoshi", param_tok, &satoshitok),
|
||||||
|
p_opt("feerate", param_feerate, &feerate_per_kw),
|
||||||
|
p_opt_def("minconf", param_number, &minconf, 1),
|
||||||
|
p_opt("utxos", param_utxos, &chosen_utxos),
|
||||||
NULL))
|
NULL))
|
||||||
/* If the parameters mixed the new style and the old style,
|
/* If the parameters mixed the new style and the old style,
|
||||||
* fail it. */
|
* fail it. */
|
||||||
return command_param_failed();
|
return command_param_failed();
|
||||||
|
|
||||||
|
if (!outputstok) {
|
||||||
|
if (!destination || !satoshitok)
|
||||||
|
return command_fail(cmd, JSONRPC2_INVALID_PARAMS,
|
||||||
|
"Need set 'outputs' field.");
|
||||||
|
|
||||||
|
result = param_wtx(cmd, "satoshi", buffer,
|
||||||
|
satoshitok, (*utx)->wtx);
|
||||||
|
if (result)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* *withdraw* command still use 'destination' and 'satoshi' as parameters. */
|
/* *withdraw* command still use 'destination' and 'satoshi' as parameters. */
|
||||||
@ -212,10 +306,10 @@ static struct command_result *json_prepare_tx(struct command *cmd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!feerate_per_kw) {
|
if (!feerate_per_kw) {
|
||||||
res = param_feerate_estimate(cmd, &feerate_per_kw,
|
result = param_feerate_estimate(cmd, &feerate_per_kw,
|
||||||
FEERATE_NORMAL);
|
FEERATE_NORMAL);
|
||||||
if (res)
|
if (result)
|
||||||
return res;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
maxheight = minconf_to_maxheight(*minconf, cmd->ld);
|
maxheight = minconf_to_maxheight(*minconf, cmd->ld);
|
||||||
@ -302,15 +396,15 @@ create_tx:
|
|||||||
(*utx)->outputs = tal_steal(*utx, outputs);
|
(*utx)->outputs = tal_steal(*utx, outputs);
|
||||||
|
|
||||||
if (chosen_utxos)
|
if (chosen_utxos)
|
||||||
res = wtx_from_utxos((*utx)->wtx, *feerate_per_kw,
|
result = wtx_from_utxos((*utx)->wtx, *feerate_per_kw,
|
||||||
out_len, maxheight,
|
out_len, maxheight,
|
||||||
chosen_utxos);
|
chosen_utxos);
|
||||||
else
|
else
|
||||||
res = wtx_select_utxos((*utx)->wtx, *feerate_per_kw,
|
result = wtx_select_utxos((*utx)->wtx, *feerate_per_kw,
|
||||||
out_len, maxheight);
|
out_len, maxheight);
|
||||||
|
|
||||||
if (res)
|
if (result)
|
||||||
return res;
|
return result;
|
||||||
|
|
||||||
/* Because of the max limit of AMOUNT_SAT(-1ULL),
|
/* Because of the max limit of AMOUNT_SAT(-1ULL),
|
||||||
* `(*utx)->wtx->all_funds` won't change in `wtx_select_utxos()` */
|
* `(*utx)->wtx->all_funds` won't change in `wtx_select_utxos()` */
|
||||||
|
Loading…
Reference in New Issue
Block a user