|
|
@ -70,6 +70,7 @@ static bool AppInitRawTx(int argc, char* argv[]) |
|
|
|
strUsage += HelpMessageOpt("locktime=N", _("Set TX lock time to N")); |
|
|
|
strUsage += HelpMessageOpt("locktime=N", _("Set TX lock time to N")); |
|
|
|
strUsage += HelpMessageOpt("nversion=N", _("Set TX version to N")); |
|
|
|
strUsage += HelpMessageOpt("nversion=N", _("Set TX version to N")); |
|
|
|
strUsage += HelpMessageOpt("outaddr=VALUE:ADDRESS", _("Add address-based output to TX")); |
|
|
|
strUsage += HelpMessageOpt("outaddr=VALUE:ADDRESS", _("Add address-based output to TX")); |
|
|
|
|
|
|
|
strUsage += HelpMessageOpt("outdata=[VALUE:]DATA", _("Add data-based output to TX")); |
|
|
|
strUsage += HelpMessageOpt("outscript=VALUE:SCRIPT", _("Add raw script output to TX")); |
|
|
|
strUsage += HelpMessageOpt("outscript=VALUE:SCRIPT", _("Add raw script output to TX")); |
|
|
|
strUsage += HelpMessageOpt("sign=SIGHASH-FLAGS", _("Add zero or more signatures to transaction") + ". " + |
|
|
|
strUsage += HelpMessageOpt("sign=SIGHASH-FLAGS", _("Add zero or more signatures to transaction") + ". " + |
|
|
|
_("This command requires JSON registers:") + |
|
|
|
_("This command requires JSON registers:") + |
|
|
@ -231,6 +232,35 @@ static void MutateTxAddOutAddr(CMutableTransaction& tx, const string& strInput) |
|
|
|
tx.vout.push_back(txout); |
|
|
|
tx.vout.push_back(txout); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void MutateTxAddOutData(CMutableTransaction& tx, const string& strInput) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
CAmount value = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// separate [VALUE:]DATA in string
|
|
|
|
|
|
|
|
size_t pos = strInput.find(':'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (pos==0) |
|
|
|
|
|
|
|
throw runtime_error("TX output value not specified"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (pos != string::npos) { |
|
|
|
|
|
|
|
// extract and validate VALUE
|
|
|
|
|
|
|
|
string strValue = strInput.substr(0, pos); |
|
|
|
|
|
|
|
if (!ParseMoney(strValue, value)) |
|
|
|
|
|
|
|
throw runtime_error("invalid TX output value"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// extract and validate DATA
|
|
|
|
|
|
|
|
string strData = strInput.substr(pos + 1, string::npos); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!IsHex(strData)) |
|
|
|
|
|
|
|
throw runtime_error("invalid TX output data"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<unsigned char> data = ParseHex(strData); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CTxOut txout(value, CScript() << OP_RETURN << data); |
|
|
|
|
|
|
|
tx.vout.push_back(txout); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void MutateTxAddOutScript(CMutableTransaction& tx, const string& strInput) |
|
|
|
static void MutateTxAddOutScript(CMutableTransaction& tx, const string& strInput) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// separate VALUE:SCRIPT in string
|
|
|
|
// separate VALUE:SCRIPT in string
|
|
|
@ -470,6 +500,8 @@ static void MutateTx(CMutableTransaction& tx, const string& command, |
|
|
|
MutateTxDelOutput(tx, commandVal); |
|
|
|
MutateTxDelOutput(tx, commandVal); |
|
|
|
else if (command == "outaddr") |
|
|
|
else if (command == "outaddr") |
|
|
|
MutateTxAddOutAddr(tx, commandVal); |
|
|
|
MutateTxAddOutAddr(tx, commandVal); |
|
|
|
|
|
|
|
else if (command == "outdata") |
|
|
|
|
|
|
|
MutateTxAddOutData(tx, commandVal); |
|
|
|
else if (command == "outscript") |
|
|
|
else if (command == "outscript") |
|
|
|
MutateTxAddOutScript(tx, commandVal); |
|
|
|
MutateTxAddOutScript(tx, commandVal); |
|
|
|
|
|
|
|
|
|
|
|