@ -26,10 +26,8 @@
# include <boost/algorithm/string.hpp>
# include <boost/algorithm/string.hpp>
# include <boost/assign/list_of.hpp>
# include <boost/assign/list_of.hpp>
using namespace std ;
static bool fCreateBlank ;
static bool fCreateBlank ;
static map < string , UniValue > registers ;
static std : : map < std : : string , UniValue > registers ;
static const int CONTINUE_EXECUTION = - 1 ;
static const int CONTINUE_EXECUTION = - 1 ;
//
//
@ -103,52 +101,52 @@ static int AppInitRawTx(int argc, char* argv[])
return CONTINUE_EXECUTION ;
return CONTINUE_EXECUTION ;
}
}
static void RegisterSetJson ( const string & key , const string & rawJson )
static void RegisterSetJson ( const std : : st ring & key , const std : : string & rawJson )
{
{
UniValue val ;
UniValue val ;
if ( ! val . read ( rawJson ) ) {
if ( ! val . read ( rawJson ) ) {
string strErr = " Cannot parse JSON for key " + key ;
std : : st ring strErr = " Cannot parse JSON for key " + key ;
throw runtime_error ( strErr ) ;
throw std : : runtime_error ( strErr ) ;
}
}
registers [ key ] = val ;
registers [ key ] = val ;
}
}
static void RegisterSet ( const string & strInput )
static void RegisterSet ( const std : : st ring & strInput )
{
{
// separate NAME:VALUE in string
// separate NAME:VALUE in string
size_t pos = strInput . find ( ' : ' ) ;
size_t pos = strInput . find ( ' : ' ) ;
if ( ( pos = = string : : npos ) | |
if ( ( pos = = std : : st ring : : npos ) | |
( pos = = 0 ) | |
( pos = = 0 ) | |
( pos = = ( strInput . size ( ) - 1 ) ) )
( pos = = ( strInput . size ( ) - 1 ) ) )
throw runtime_error ( " Register input requires NAME:VALUE " ) ;
throw std : : runtime_error ( " Register input requires NAME:VALUE " ) ;
string key = strInput . substr ( 0 , pos ) ;
std : : st ring key = strInput . substr ( 0 , pos ) ;
string valStr = strInput . substr ( pos + 1 , string : : npos ) ;
std : : st ring valStr = strInput . substr ( pos + 1 , std : : string : : npos ) ;
RegisterSetJson ( key , valStr ) ;
RegisterSetJson ( key , valStr ) ;
}
}
static void RegisterLoad ( const string & strInput )
static void RegisterLoad ( const std : : st ring & strInput )
{
{
// separate NAME:FILENAME in string
// separate NAME:FILENAME in string
size_t pos = strInput . find ( ' : ' ) ;
size_t pos = strInput . find ( ' : ' ) ;
if ( ( pos = = string : : npos ) | |
if ( ( pos = = std : : st ring : : npos ) | |
( pos = = 0 ) | |
( pos = = 0 ) | |
( pos = = ( strInput . size ( ) - 1 ) ) )
( pos = = ( strInput . size ( ) - 1 ) ) )
throw runtime_error ( " Register load requires NAME:FILENAME " ) ;
throw std : : runtime_error ( " Register load requires NAME:FILENAME " ) ;
string key = strInput . substr ( 0 , pos ) ;
std : : st ring key = strInput . substr ( 0 , pos ) ;
string filename = strInput . substr ( pos + 1 , string : : npos ) ;
std : : st ring filename = strInput . substr ( pos + 1 , std : : string : : npos ) ;
FILE * f = fopen ( filename . c_str ( ) , " r " ) ;
FILE * f = fopen ( filename . c_str ( ) , " r " ) ;
if ( ! f ) {
if ( ! f ) {
string strErr = " Cannot open file " + filename ;
std : : st ring strErr = " Cannot open file " + filename ;
throw runtime_error ( strErr ) ;
throw std : : runtime_error ( strErr ) ;
}
}
// load file chunks into one big buffer
// load file chunks into one big buffer
string valStr ;
std : : st ring valStr ;
while ( ( ! feof ( f ) ) & & ( ! ferror ( f ) ) ) {
while ( ( ! feof ( f ) ) & & ( ! ferror ( f ) ) ) {
char buf [ 4096 ] ;
char buf [ 4096 ] ;
int bread = fread ( buf , 1 , sizeof ( buf ) , f ) ;
int bread = fread ( buf , 1 , sizeof ( buf ) , f ) ;
@ -162,55 +160,55 @@ static void RegisterLoad(const string& strInput)
fclose ( f ) ;
fclose ( f ) ;
if ( error ) {
if ( error ) {
string strErr = " Error reading file " + filename ;
std : : st ring strErr = " Error reading file " + filename ;
throw runtime_error ( strErr ) ;
throw std : : runtime_error ( strErr ) ;
}
}
// evaluate as JSON buffer register
// evaluate as JSON buffer register
RegisterSetJson ( key , valStr ) ;
RegisterSetJson ( key , valStr ) ;
}
}
static void MutateTxVersion ( CMutableTransaction & tx , const string & cmdVal )
static void MutateTxVersion ( CMutableTransaction & tx , const std : : st ring & cmdVal )
{
{
int64_t newVersion = atoi64 ( cmdVal ) ;
int64_t newVersion = atoi64 ( cmdVal ) ;
if ( newVersion < 1 | | newVersion > CTransaction : : MAX_STANDARD_VERSION )
if ( newVersion < 1 | | newVersion > CTransaction : : MAX_STANDARD_VERSION )
throw runtime_error ( " Invalid TX version requested " ) ;
throw std : : runtime_error ( " Invalid TX version requested " ) ;
tx . nVersion = ( int ) newVersion ;
tx . nVersion = ( int ) newVersion ;
}
}
static void MutateTxLocktime ( CMutableTransaction & tx , const string & cmdVal )
static void MutateTxLocktime ( CMutableTransaction & tx , const std : : st ring & cmdVal )
{
{
int64_t newLocktime = atoi64 ( cmdVal ) ;
int64_t newLocktime = atoi64 ( cmdVal ) ;
if ( newLocktime < 0LL | | newLocktime > 0xffffffffLL )
if ( newLocktime < 0LL | | newLocktime > 0xffffffffLL )
throw runtime_error ( " Invalid TX locktime requested " ) ;
throw std : : runtime_error ( " Invalid TX locktime requested " ) ;
tx . nLockTime = ( unsigned int ) newLocktime ;
tx . nLockTime = ( unsigned int ) newLocktime ;
}
}
static void MutateTxAddInput ( CMutableTransaction & tx , const string & strInput )
static void MutateTxAddInput ( CMutableTransaction & tx , const std : : st ring & strInput )
{
{
std : : vector < std : : string > vStrInputParts ;
std : : vector < std : : string > vStrInputParts ;
boost : : split ( vStrInputParts , strInput , boost : : is_any_of ( " : " ) ) ;
boost : : split ( vStrInputParts , strInput , boost : : is_any_of ( " : " ) ) ;
// separate TXID:VOUT in string
// separate TXID:VOUT in string
if ( vStrInputParts . size ( ) < 2 )
if ( vStrInputParts . size ( ) < 2 )
throw runtime_error ( " TX input missing separator " ) ;
throw std : : runtime_error ( " TX input missing separator " ) ;
// extract and validate TXID
// extract and validate TXID
string strTxid = vStrInputParts [ 0 ] ;
std : : st ring strTxid = vStrInputParts [ 0 ] ;
if ( ( strTxid . size ( ) ! = 64 ) | | ! IsHex ( strTxid ) )
if ( ( strTxid . size ( ) ! = 64 ) | | ! IsHex ( strTxid ) )
throw runtime_error ( " invalid TX input txid " ) ;
throw std : : runtime_error ( " invalid TX input txid " ) ;
uint256 txid ( uint256S ( strTxid ) ) ;
uint256 txid ( uint256S ( strTxid ) ) ;
static const unsigned int minTxOutSz = 9 ;
static const unsigned int minTxOutSz = 9 ;
static const unsigned int maxVout = MAX_BLOCK_BASE_SIZE / minTxOutSz ;
static const unsigned int maxVout = MAX_BLOCK_BASE_SIZE / minTxOutSz ;
// extract and validate vout
// extract and validate vout
string strVout = vStrInputParts [ 1 ] ;
std : : st ring strVout = vStrInputParts [ 1 ] ;
int vout = atoi ( strVout ) ;
int vout = atoi ( strVout ) ;
if ( ( vout < 0 ) | | ( vout > ( int ) maxVout ) )
if ( ( vout < 0 ) | | ( vout > ( int ) maxVout ) )
throw runtime_error ( " invalid TX input vout " ) ;
throw std : : runtime_error ( " invalid TX input vout " ) ;
// extract the optional sequence number
// extract the optional sequence number
uint32_t nSequenceIn = std : : numeric_limits < unsigned int > : : max ( ) ;
uint32_t nSequenceIn = std : : numeric_limits < unsigned int > : : max ( ) ;
@ -222,26 +220,26 @@ static void MutateTxAddInput(CMutableTransaction& tx, const string& strInput)
tx . vin . push_back ( txin ) ;
tx . vin . push_back ( txin ) ;
}
}
static void MutateTxAddOutAddr ( CMutableTransaction & tx , const string & strInput )
static void MutateTxAddOutAddr ( CMutableTransaction & tx , const std : : st ring & strInput )
{
{
// separate VALUE:ADDRESS in string
// separate VALUE:ADDRESS in string
size_t pos = strInput . find ( ' : ' ) ;
size_t pos = strInput . find ( ' : ' ) ;
if ( ( pos = = string : : npos ) | |
if ( ( pos = = std : : st ring : : npos ) | |
( pos = = 0 ) | |
( pos = = 0 ) | |
( pos = = ( strInput . size ( ) - 1 ) ) )
( pos = = ( strInput . size ( ) - 1 ) ) )
throw runtime_error ( " TX output missing separator " ) ;
throw std : : runtime_error ( " TX output missing separator " ) ;
// extract and validate VALUE
// extract and validate VALUE
string strValue = strInput . substr ( 0 , pos ) ;
std : : st ring strValue = strInput . substr ( 0 , pos ) ;
CAmount value ;
CAmount value ;
if ( ! ParseMoney ( strValue , value ) )
if ( ! ParseMoney ( strValue , value ) )
throw runtime_error ( " invalid TX output value " ) ;
throw std : : runtime_error ( " invalid TX output value " ) ;
// extract and validate ADDRESS
// extract and validate ADDRESS
string strAddr = strInput . substr ( pos + 1 , string : : npos ) ;
std : : st ring strAddr = strInput . substr ( pos + 1 , std : : string : : npos ) ;
CBitcoinAddress addr ( strAddr ) ;
CBitcoinAddress addr ( strAddr ) ;
if ( ! addr . IsValid ( ) )
if ( ! addr . IsValid ( ) )
throw runtime_error ( " invalid TX output address " ) ;
throw std : : runtime_error ( " invalid TX output address " ) ;
// build standard output script via GetScriptForDestination()
// build standard output script via GetScriptForDestination()
CScript scriptPubKey = GetScriptForDestination ( addr . Get ( ) ) ;
CScript scriptPubKey = GetScriptForDestination ( addr . Get ( ) ) ;
@ -251,7 +249,7 @@ 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 )
static void MutateTxAddOutData ( CMutableTransaction & tx , const std : : st ring & strInput )
{
{
CAmount value = 0 ;
CAmount value = 0 ;
@ -259,20 +257,20 @@ static void MutateTxAddOutData(CMutableTransaction& tx, const string& strInput)
size_t pos = strInput . find ( ' : ' ) ;
size_t pos = strInput . find ( ' : ' ) ;
if ( pos = = 0 )
if ( pos = = 0 )
throw runtime_error ( " TX output value not specified " ) ;
throw std : : runtime_error ( " TX output value not specified " ) ;
if ( pos ! = string : : npos ) {
if ( pos ! = std : : st ring : : npos ) {
// extract and validate VALUE
// extract and validate VALUE
string strValue = strInput . substr ( 0 , pos ) ;
std : : st ring strValue = strInput . substr ( 0 , pos ) ;
if ( ! ParseMoney ( strValue , value ) )
if ( ! ParseMoney ( strValue , value ) )
throw runtime_error ( " invalid TX output value " ) ;
throw std : : runtime_error ( " invalid TX output value " ) ;
}
}
// extract and validate DATA
// extract and validate DATA
string strData = strInput . substr ( pos + 1 , string : : npos ) ;
std : : st ring strData = strInput . substr ( pos + 1 , std : : string : : npos ) ;
if ( ! IsHex ( strData ) )
if ( ! IsHex ( strData ) )
throw runtime_error ( " invalid TX output data " ) ;
throw std : : runtime_error ( " invalid TX output data " ) ;
std : : vector < unsigned char > data = ParseHex ( strData ) ;
std : : vector < unsigned char > data = ParseHex ( strData ) ;
@ -280,22 +278,22 @@ static void MutateTxAddOutData(CMutableTransaction& tx, const string& strInput)
tx . vout . push_back ( txout ) ;
tx . vout . push_back ( txout ) ;
}
}
static void MutateTxAddOutScript ( CMutableTransaction & tx , const string & strInput )
static void MutateTxAddOutScript ( CMutableTransaction & tx , const std : : st ring & strInput )
{
{
// separate VALUE:SCRIPT in string
// separate VALUE:SCRIPT in string
size_t pos = strInput . find ( ' : ' ) ;
size_t pos = strInput . find ( ' : ' ) ;
if ( ( pos = = string : : npos ) | |
if ( ( pos = = std : : st ring : : npos ) | |
( pos = = 0 ) )
( pos = = 0 ) )
throw runtime_error ( " TX output missing separator " ) ;
throw std : : runtime_error ( " TX output missing separator " ) ;
// extract and validate VALUE
// extract and validate VALUE
string strValue = strInput . substr ( 0 , pos ) ;
std : : st ring strValue = strInput . substr ( 0 , pos ) ;
CAmount value ;
CAmount value ;
if ( ! ParseMoney ( strValue , value ) )
if ( ! ParseMoney ( strValue , value ) )
throw runtime_error ( " invalid TX output value " ) ;
throw std : : runtime_error ( " invalid TX output value " ) ;
// extract and validate script
// extract and validate script
string strScript = strInput . substr ( pos + 1 , string : : npos ) ;
std : : st ring strScript = strInput . substr ( pos + 1 , std : : string : : npos ) ;
CScript scriptPubKey = ParseScript ( strScript ) ; // throws on err
CScript scriptPubKey = ParseScript ( strScript ) ; // throws on err
// construct TxOut, append to transaction output list
// construct TxOut, append to transaction output list
@ -303,26 +301,26 @@ static void MutateTxAddOutScript(CMutableTransaction& tx, const string& strInput
tx . vout . push_back ( txout ) ;
tx . vout . push_back ( txout ) ;
}
}
static void MutateTxDelInput ( CMutableTransaction & tx , const string & strInIdx )
static void MutateTxDelInput ( CMutableTransaction & tx , const std : : st ring & strInIdx )
{
{
// parse requested deletion index
// parse requested deletion index
int inIdx = atoi ( strInIdx ) ;
int inIdx = atoi ( strInIdx ) ;
if ( inIdx < 0 | | inIdx > = ( int ) tx . vin . size ( ) ) {
if ( inIdx < 0 | | inIdx > = ( int ) tx . vin . size ( ) ) {
string strErr = " Invalid TX input index ' " + strInIdx + " ' " ;
std : : st ring strErr = " Invalid TX input index ' " + strInIdx + " ' " ;
throw runtime_error ( strErr . c_str ( ) ) ;
throw std : : runtime_error ( strErr . c_str ( ) ) ;
}
}
// delete input from transaction
// delete input from transaction
tx . vin . erase ( tx . vin . begin ( ) + inIdx ) ;
tx . vin . erase ( tx . vin . begin ( ) + inIdx ) ;
}
}
static void MutateTxDelOutput ( CMutableTransaction & tx , const string & strOutIdx )
static void MutateTxDelOutput ( CMutableTransaction & tx , const std : : st ring & strOutIdx )
{
{
// parse requested deletion index
// parse requested deletion index
int outIdx = atoi ( strOutIdx ) ;
int outIdx = atoi ( strOutIdx ) ;
if ( outIdx < 0 | | outIdx > = ( int ) tx . vout . size ( ) ) {
if ( outIdx < 0 | | outIdx > = ( int ) tx . vout . size ( ) ) {
string strErr = " Invalid TX output index ' " + strOutIdx + " ' " ;
std : : st ring strErr = " Invalid TX output index ' " + strOutIdx + " ' " ;
throw runtime_error ( strErr . c_str ( ) ) ;
throw std : : runtime_error ( strErr . c_str ( ) ) ;
}
}
// delete output from transaction
// delete output from transaction
@ -342,7 +340,7 @@ static const struct {
{ " SINGLE|ANYONECANPAY " , SIGHASH_SINGLE | SIGHASH_ANYONECANPAY } ,
{ " SINGLE|ANYONECANPAY " , SIGHASH_SINGLE | SIGHASH_ANYONECANPAY } ,
} ;
} ;
static bool findSighashFlags ( int & flags , const string & flagStr )
static bool findSighashFlags ( int & flags , const std : : st ring & flagStr )
{
{
flags = 0 ;
flags = 0 ;
@ -356,17 +354,17 @@ static bool findSighashFlags(int& flags, const string& flagStr)
return false ;
return false ;
}
}
uint256 ParseHashUO ( map < string , UniValue > & o , string strKey )
uint256 ParseHashUO ( std : : map < std : : st ring , UniValue > & o , std : : string strKey )
{
{
if ( ! o . count ( strKey ) )
if ( ! o . count ( strKey ) )
return uint256 ( ) ;
return uint256 ( ) ;
return ParseHashUV ( o [ strKey ] , strKey ) ;
return ParseHashUV ( o [ strKey ] , strKey ) ;
}
}
vector < unsigned char > ParseHexUO ( map < string , UniValue > & o , string strKey )
std : : vector < unsigned char > ParseHexUO ( std : : map < std : : st ring , UniValue > & o , std : : string strKey )
{
{
if ( ! o . count ( strKey ) ) {
if ( ! o . count ( strKey ) ) {
vector < unsigned char > emptyVec ;
std : : vector < unsigned char > emptyVec ;
return emptyVec ;
return emptyVec ;
}
}
return ParseHexUV ( o [ strKey ] , strKey ) ;
return ParseHexUV ( o [ strKey ] , strKey ) ;
@ -375,24 +373,24 @@ vector<unsigned char> ParseHexUO(map<string,UniValue>& o, string strKey)
static CAmount AmountFromValue ( const UniValue & value )
static CAmount AmountFromValue ( const UniValue & value )
{
{
if ( ! value . isNum ( ) & & ! value . isStr ( ) )
if ( ! value . isNum ( ) & & ! value . isStr ( ) )
throw runtime_error ( " Amount is not a number or string " ) ;
throw std : : runtime_error ( " Amount is not a number or string " ) ;
CAmount amount ;
CAmount amount ;
if ( ! ParseFixedPoint ( value . getValStr ( ) , 8 , & amount ) )
if ( ! ParseFixedPoint ( value . getValStr ( ) , 8 , & amount ) )
throw runtime_error ( " Invalid amount " ) ;
throw std : : runtime_error ( " Invalid amount " ) ;
if ( ! MoneyRange ( amount ) )
if ( ! MoneyRange ( amount ) )
throw runtime_error ( " Amount out of range " ) ;
throw std : : runtime_error ( " Amount out of range " ) ;
return amount ;
return amount ;
}
}
static void MutateTxSign ( CMutableTransaction & tx , const string & flagStr )
static void MutateTxSign ( CMutableTransaction & tx , const std : : st ring & flagStr )
{
{
int nHashType = SIGHASH_ALL ;
int nHashType = SIGHASH_ALL ;
if ( flagStr . size ( ) > 0 )
if ( flagStr . size ( ) > 0 )
if ( ! findSighashFlags ( nHashType , flagStr ) )
if ( ! findSighashFlags ( nHashType , flagStr ) )
throw runtime_error ( " unknown sighash flag/sign option " ) ;
throw std : : runtime_error ( " unknown sighash flag/sign option " ) ;
vector < CTransaction > txVariants ;
std : : vector < CTransaction > txVariants ;
txVariants . push_back ( tx ) ;
txVariants . push_back ( tx ) ;
// mergedTx will end up with all the signatures; it
// mergedTx will end up with all the signatures; it
@ -403,17 +401,17 @@ static void MutateTxSign(CMutableTransaction& tx, const string& flagStr)
CCoinsViewCache view ( & viewDummy ) ;
CCoinsViewCache view ( & viewDummy ) ;
if ( ! registers . count ( " privatekeys " ) )
if ( ! registers . count ( " privatekeys " ) )
throw runtime_error ( " privatekeys register variable must be set. " ) ;
throw std : : runtime_error ( " privatekeys register variable must be set. " ) ;
CBasicKeyStore tempKeystore ;
CBasicKeyStore tempKeystore ;
UniValue keysObj = registers [ " privatekeys " ] ;
UniValue keysObj = registers [ " privatekeys " ] ;
for ( unsigned int kidx = 0 ; kidx < keysObj . size ( ) ; kidx + + ) {
for ( unsigned int kidx = 0 ; kidx < keysObj . size ( ) ; kidx + + ) {
if ( ! keysObj [ kidx ] . isStr ( ) )
if ( ! keysObj [ kidx ] . isStr ( ) )
throw runtime_error ( " privatekey not a string " ) ;
throw std : : runtime_error ( " privatekey not a std:: string " ) ;
CBitcoinSecret vchSecret ;
CBitcoinSecret vchSecret ;
bool fGood = vchSecret . SetString ( keysObj [ kidx ] . getValStr ( ) ) ;
bool fGood = vchSecret . SetString ( keysObj [ kidx ] . getValStr ( ) ) ;
if ( ! fGood )
if ( ! fGood )
throw runtime_error ( " privatekey not valid " ) ;
throw std : : runtime_error ( " privatekey not valid " ) ;
CKey key = vchSecret . GetKey ( ) ;
CKey key = vchSecret . GetKey ( ) ;
tempKeystore . AddKey ( key ) ;
tempKeystore . AddKey ( key ) ;
@ -421,34 +419,34 @@ static void MutateTxSign(CMutableTransaction& tx, const string& flagStr)
// Add previous txouts given in the RPC call:
// Add previous txouts given in the RPC call:
if ( ! registers . count ( " prevtxs " ) )
if ( ! registers . count ( " prevtxs " ) )
throw runtime_error ( " prevtxs register variable must be set. " ) ;
throw std : : runtime_error ( " prevtxs register variable must be set. " ) ;
UniValue prevtxsObj = registers [ " prevtxs " ] ;
UniValue prevtxsObj = registers [ " prevtxs " ] ;
{
{
for ( unsigned int previdx = 0 ; previdx < prevtxsObj . size ( ) ; previdx + + ) {
for ( unsigned int previdx = 0 ; previdx < prevtxsObj . size ( ) ; previdx + + ) {
UniValue prevOut = prevtxsObj [ previdx ] ;
UniValue prevOut = prevtxsObj [ previdx ] ;
if ( ! prevOut . isObject ( ) )
if ( ! prevOut . isObject ( ) )
throw runtime_error ( " expected prevtxs internal object " ) ;
throw std : : runtime_error ( " expected prevtxs internal object " ) ;
map < string , UniValue : : VType > types = boost : : assign : : map_list_of ( " txid " , UniValue : : VSTR ) ( " vout " , UniValue : : VNUM ) ( " scriptPubKey " , UniValue : : VSTR ) ;
std : : map < std : : string , UniValue : : VType > types = boost : : assign : : map_list_of ( " txid " , UniValue : : VSTR ) ( " vout " , UniValue : : VNUM ) ( " scriptPubKey " , UniValue : : VSTR ) ;
if ( ! prevOut . checkObject ( types ) )
if ( ! prevOut . checkObject ( types ) )
throw runtime_error ( " prevtxs internal object typecheck fail " ) ;
throw std : : runtime_error ( " prevtxs internal object typecheck fail " ) ;
uint256 txid = ParseHashUV ( prevOut [ " txid " ] , " txid " ) ;
uint256 txid = ParseHashUV ( prevOut [ " txid " ] , " txid " ) ;
int nOut = atoi ( prevOut [ " vout " ] . getValStr ( ) ) ;
int nOut = atoi ( prevOut [ " vout " ] . getValStr ( ) ) ;
if ( nOut < 0 )
if ( nOut < 0 )
throw runtime_error ( " vout must be positive " ) ;
throw std : : runtime_error ( " vout must be positive " ) ;
vector < unsigned char > pkData ( ParseHexUV ( prevOut [ " scriptPubKey " ] , " scriptPubKey " ) ) ;
std : : vector < unsigned char > pkData ( ParseHexUV ( prevOut [ " scriptPubKey " ] , " scriptPubKey " ) ) ;
CScript scriptPubKey ( pkData . begin ( ) , pkData . end ( ) ) ;
CScript scriptPubKey ( pkData . begin ( ) , pkData . end ( ) ) ;
{
{
CCoinsModifier coins = view . ModifyCoins ( txid ) ;
CCoinsModifier coins = view . ModifyCoins ( txid ) ;
if ( coins - > IsAvailable ( nOut ) & & coins - > vout [ nOut ] . scriptPubKey ! = scriptPubKey ) {
if ( coins - > IsAvailable ( nOut ) & & coins - > vout [ nOut ] . scriptPubKey ! = scriptPubKey ) {
string err ( " Previous output scriptPubKey mismatch: \n " ) ;
std : : st ring err ( " Previous output scriptPubKey mismatch: \n " ) ;
err = err + ScriptToAsmStr ( coins - > vout [ nOut ] . scriptPubKey ) + " \n vs: \n " +
err = err + ScriptToAsmStr ( coins - > vout [ nOut ] . scriptPubKey ) + " \n vs: \n " +
ScriptToAsmStr ( scriptPubKey ) ;
ScriptToAsmStr ( scriptPubKey ) ;
throw runtime_error ( err ) ;
throw std : : runtime_error ( err ) ;
}
}
if ( ( unsigned int ) nOut > = coins - > vout . size ( ) )
if ( ( unsigned int ) nOut > = coins - > vout . size ( ) )
coins - > vout . resize ( nOut + 1 ) ;
coins - > vout . resize ( nOut + 1 ) ;
@ -464,7 +462,7 @@ static void MutateTxSign(CMutableTransaction& tx, const string& flagStr)
if ( ( scriptPubKey . IsPayToScriptHash ( ) | | scriptPubKey . IsPayToWitnessScriptHash ( ) ) & &
if ( ( scriptPubKey . IsPayToScriptHash ( ) | | scriptPubKey . IsPayToWitnessScriptHash ( ) ) & &
prevOut . exists ( " redeemScript " ) ) {
prevOut . exists ( " redeemScript " ) ) {
UniValue v = prevOut [ " redeemScript " ] ;
UniValue v = prevOut [ " redeemScript " ] ;
vector < unsigned char > rsData ( ParseHexUV ( v , " redeemScript " ) ) ;
std : : vector < unsigned char > rsData ( ParseHexUV ( v , " redeemScript " ) ) ;
CScript redeemScript ( rsData . begin ( ) , rsData . end ( ) ) ;
CScript redeemScript ( rsData . begin ( ) , rsData . end ( ) ) ;
tempKeystore . AddCScript ( redeemScript ) ;
tempKeystore . AddCScript ( redeemScript ) ;
}
}
@ -521,8 +519,8 @@ public:
}
}
} ;
} ;
static void MutateTx ( CMutableTransaction & tx , const string & command ,
static void MutateTx ( CMutableTransaction & tx , const std : : st ring & command ,
const string & commandVal )
const std : : st ring & commandVal )
{
{
std : : unique_ptr < Secp256k1Init > ecc ;
std : : unique_ptr < Secp256k1Init > ecc ;
@ -557,7 +555,7 @@ static void MutateTx(CMutableTransaction& tx, const string& command,
RegisterSet ( commandVal ) ;
RegisterSet ( commandVal ) ;
else
else
throw runtime_error ( " unknown command " ) ;
throw std : : runtime_error ( " unknown command " ) ;
}
}
static void OutputTxJSON ( const CTransaction & tx )
static void OutputTxJSON ( const CTransaction & tx )
@ -565,20 +563,20 @@ static void OutputTxJSON(const CTransaction& tx)
UniValue entry ( UniValue : : VOBJ ) ;
UniValue entry ( UniValue : : VOBJ ) ;
TxToUniv ( tx , uint256 ( ) , entry ) ;
TxToUniv ( tx , uint256 ( ) , entry ) ;
string jsonOutput = entry . write ( 4 ) ;
std : : st ring jsonOutput = entry . write ( 4 ) ;
fprintf ( stdout , " %s \n " , jsonOutput . c_str ( ) ) ;
fprintf ( stdout , " %s \n " , jsonOutput . c_str ( ) ) ;
}
}
static void OutputTxHash ( const CTransaction & tx )
static void OutputTxHash ( const CTransaction & tx )
{
{
string strHexHash = tx . GetHash ( ) . GetHex ( ) ; // the hex-encoded transaction hash (aka the transaction id)
std : : st ring strHexHash = tx . GetHash ( ) . GetHex ( ) ; // the hex-encoded transaction hash (aka the transaction id)
fprintf ( stdout , " %s \n " , strHexHash . c_str ( ) ) ;
fprintf ( stdout , " %s \n " , strHexHash . c_str ( ) ) ;
}
}
static void OutputTxHex ( const CTransaction & tx )
static void OutputTxHex ( const CTransaction & tx )
{
{
string strHex = EncodeHexTx ( tx ) ;
std : : st ring strHex = EncodeHexTx ( tx ) ;
fprintf ( stdout , " %s \n " , strHex . c_str ( ) ) ;
fprintf ( stdout , " %s \n " , strHex . c_str ( ) ) ;
}
}
@ -593,10 +591,10 @@ static void OutputTx(const CTransaction& tx)
OutputTxHex ( tx ) ;
OutputTxHex ( tx ) ;
}
}
static string readStdin ( )
static std : : st ring readStdin ( )
{
{
char buf [ 4096 ] ;
char buf [ 4096 ] ;
string ret ;
std : : st ring ret ;
while ( ! feof ( stdin ) ) {
while ( ! feof ( stdin ) ) {
size_t bread = fread ( buf , 1 , sizeof ( buf ) , stdin ) ;
size_t bread = fread ( buf , 1 , sizeof ( buf ) , stdin ) ;
@ -606,7 +604,7 @@ static string readStdin()
}
}
if ( ferror ( stdin ) )
if ( ferror ( stdin ) )
throw runtime_error ( " error reading stdin " ) ;
throw std : : runtime_error ( " error reading stdin " ) ;
boost : : algorithm : : trim_right ( ret ) ;
boost : : algorithm : : trim_right ( ret ) ;
@ -615,7 +613,7 @@ static string readStdin()
static int CommandLineRawTx ( int argc , char * argv [ ] )
static int CommandLineRawTx ( int argc , char * argv [ ] )
{
{
string strPrint ;
std : : st ring strPrint ;
int nRet = 0 ;
int nRet = 0 ;
try {
try {
// Skip switches; Permit common stdin convention "-"
// Skip switches; Permit common stdin convention "-"
@ -631,15 +629,15 @@ static int CommandLineRawTx(int argc, char* argv[])
if ( ! fCreateBlank ) {
if ( ! fCreateBlank ) {
// require at least one param
// require at least one param
if ( argc < 2 )
if ( argc < 2 )
throw runtime_error ( " too few parameters " ) ;
throw std : : runtime_error ( " too few parameters " ) ;
// param: hex-encoded bitcoin transaction
// param: hex-encoded bitcoin transaction
string strHexTx ( argv [ 1 ] ) ;
std : : st ring strHexTx ( argv [ 1 ] ) ;
if ( strHexTx = = " - " ) // "-" implies standard input
if ( strHexTx = = " - " ) // "-" implies standard input
strHexTx = readStdin ( ) ;
strHexTx = readStdin ( ) ;
if ( ! DecodeHexTx ( txDecodeTmp , strHexTx , true ) )
if ( ! DecodeHexTx ( txDecodeTmp , strHexTx , true ) )
throw runtime_error ( " invalid transaction encoding " ) ;
throw std : : runtime_error ( " invalid transaction encoding " ) ;
startArg = 2 ;
startArg = 2 ;
} else
} else
@ -648,10 +646,10 @@ static int CommandLineRawTx(int argc, char* argv[])
CMutableTransaction tx ( txDecodeTmp ) ;
CMutableTransaction tx ( txDecodeTmp ) ;
for ( int i = startArg ; i < argc ; i + + ) {
for ( int i = startArg ; i < argc ; i + + ) {
string arg = argv [ i ] ;
std : : st ring arg = argv [ i ] ;
string key , value ;
std : : st ring key , value ;
size_t eqpos = arg . find ( ' = ' ) ;
size_t eqpos = arg . find ( ' = ' ) ;
if ( eqpos = = string : : npos )
if ( eqpos = = std : : st ring : : npos )
key = arg ;
key = arg ;
else {
else {
key = arg . substr ( 0 , eqpos ) ;
key = arg . substr ( 0 , eqpos ) ;
@ -668,7 +666,7 @@ static int CommandLineRawTx(int argc, char* argv[])
throw ;
throw ;
}
}
catch ( const std : : exception & e ) {
catch ( const std : : exception & e ) {
strPrint = string ( " error: " ) + e . what ( ) ;
strPrint = std : : st ring ( " error: " ) + e . what ( ) ;
nRet = EXIT_FAILURE ;
nRet = EXIT_FAILURE ;
}
}
catch ( . . . ) {
catch ( . . . ) {