2
.gitignore
vendored
2
.gitignore
vendored
@@ -155,3 +155,5 @@ src/rogue.scr
|
|||||||
|
|
||||||
src/cc/rogue/confdefs.h
|
src/cc/rogue/confdefs.h
|
||||||
src/cc/rogue/x64
|
src/cc/rogue/x64
|
||||||
|
|
||||||
|
src/cc/dapps/a.out
|
||||||
|
|||||||
@@ -226,8 +226,11 @@ bool priv2addr(char *coinaddr,uint8_t buf33[33],uint8_t priv32[32]);
|
|||||||
CPubKey buf2pk(uint8_t *buf33);
|
CPubKey buf2pk(uint8_t *buf33);
|
||||||
void endiancpy(uint8_t *dest,uint8_t *src,int32_t len);
|
void endiancpy(uint8_t *dest,uint8_t *src,int32_t len);
|
||||||
uint256 DiceHashEntropy(uint256 &entropy,uint256 _txidpriv,int32_t entropyvout,int32_t usevout);
|
uint256 DiceHashEntropy(uint256 &entropy,uint256 _txidpriv,int32_t entropyvout,int32_t usevout);
|
||||||
CTxOut MakeCC1vout(uint8_t evalcode,CAmount nValue,CPubKey pk, const std::vector<std::vector<unsigned char>>* vData = NULL);
|
CTxOut MakeCC1vout(uint8_t evalcode,CAmount nValue,CPubKey pk, std::vector<std::vector<unsigned char>>* vData = NULL);
|
||||||
CTxOut MakeCC1of2vout(uint8_t evalcode,CAmount nValue,CPubKey pk,CPubKey pk2, const std::vector<std::vector<unsigned char>>* vData = NULL);
|
CTxOut MakeCC1of2vout(uint8_t evalcode,CAmount nValue,CPubKey pk,CPubKey pk2, std::vector<std::vector<unsigned char>>* vData = NULL);
|
||||||
|
int32_t has_opret(const CTransaction &tx, uint8_t evalcode);
|
||||||
|
CScript getCCopret(const CScript &scriptPubKey);
|
||||||
|
bool makeCCopret(CScript &opret, std::vector<std::vector<unsigned char>> &vData);
|
||||||
CC *MakeCCcond1(uint8_t evalcode,CPubKey pk);
|
CC *MakeCCcond1(uint8_t evalcode,CPubKey pk);
|
||||||
CC *MakeCCcond1of2(uint8_t evalcode,CPubKey pk1,CPubKey pk2);
|
CC *MakeCCcond1of2(uint8_t evalcode,CPubKey pk1,CPubKey pk2);
|
||||||
CC* GetCryptoCondition(CScript const& scriptSig);
|
CC* GetCryptoCondition(CScript const& scriptSig);
|
||||||
|
|||||||
@@ -58,35 +58,70 @@ CC *MakeCCcond1(uint8_t evalcode,CPubKey pk)
|
|||||||
return CCNewThreshold(2, {condCC, Sig});
|
return CCNewThreshold(2, {condCC, Sig});
|
||||||
}
|
}
|
||||||
|
|
||||||
CTxOut MakeCC1vout(uint8_t evalcode,CAmount nValue, CPubKey pk, const std::vector<std::vector<unsigned char>>* vData)
|
int32_t has_opret(const CTransaction &tx, uint8_t evalcode)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
for ( auto vout : tx.vout )
|
||||||
|
{
|
||||||
|
if ( vout.scriptPubKey[0] == OP_RETURN && vout.scriptPubKey[1] == evalcode )
|
||||||
|
return i;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
CScript getCCopret(const CScript &scriptPubKey)
|
||||||
|
{
|
||||||
|
std::vector<std::vector<unsigned char>> vParams = std::vector<std::vector<unsigned char>>();
|
||||||
|
CScript dummy; CScript opret;
|
||||||
|
if ( scriptPubKey.IsPayToCryptoCondition(&dummy, vParams) )
|
||||||
|
{
|
||||||
|
//opret << E_MARSHAL(ss << vParams[0]);
|
||||||
|
opret = CScript(vParams[0].begin()+6, vParams[0].end());
|
||||||
|
}
|
||||||
|
//fprintf(stderr, "params_size.%li parmas_hexstr.%s\n", vParams.size(), HexStr(vParams[0].begin(),vParams[0].end()).c_str());
|
||||||
|
//opret = CScript(vParams[0].begin(), vParams[0].end());
|
||||||
|
return opret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool makeCCopret(CScript &opret, std::vector<std::vector<unsigned char>> &vData)
|
||||||
|
{
|
||||||
|
if ( opret.empty() )
|
||||||
|
return false;
|
||||||
|
vData.push_back(std::vector<unsigned char>(opret.begin(), opret.end()));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
CTxOut MakeCC1vout(uint8_t evalcode,CAmount nValue, CPubKey pk, std::vector<std::vector<unsigned char>>* vData)
|
||||||
{
|
{
|
||||||
CTxOut vout;
|
CTxOut vout;
|
||||||
CC *payoutCond = MakeCCcond1(evalcode,pk);
|
CC *payoutCond = MakeCCcond1(evalcode,pk);
|
||||||
vout = CTxOut(nValue,CCPubKey(payoutCond));
|
vout = CTxOut(nValue,CCPubKey(payoutCond));
|
||||||
if ( vData )
|
if ( vData )
|
||||||
{
|
{
|
||||||
std::vector<std::vector<unsigned char>> vtmpData = std::vector<std::vector<unsigned char>>(vData->begin(), vData->end());
|
//std::vector<std::vector<unsigned char>> vtmpData = std::vector<std::vector<unsigned char>>(vData->begin(), vData->end());
|
||||||
std::vector<CPubKey> vPubKeys = std::vector<CPubKey>();
|
std::vector<CPubKey> vPubKeys = std::vector<CPubKey>();
|
||||||
vPubKeys.push_back(pk);
|
//vPubKeys.push_back(pk);
|
||||||
COptCCParams ccp = COptCCParams(COptCCParams::VERSION, evalcode, 1, 1, vPubKeys, vtmpData);
|
COptCCParams ccp = COptCCParams(COptCCParams::VERSION, evalcode, 1, 1, vPubKeys, ( * vData));
|
||||||
vout.scriptPubKey << ccp.AsVector() << OP_DROP;
|
vout.scriptPubKey << ccp.AsVector() << OP_DROP;
|
||||||
}
|
}
|
||||||
cc_free(payoutCond);
|
cc_free(payoutCond);
|
||||||
return(vout);
|
return(vout);
|
||||||
}
|
}
|
||||||
|
|
||||||
CTxOut MakeCC1of2vout(uint8_t evalcode,CAmount nValue,CPubKey pk1,CPubKey pk2, const std::vector<std::vector<unsigned char>>* vData)
|
CTxOut MakeCC1of2vout(uint8_t evalcode,CAmount nValue,CPubKey pk1,CPubKey pk2, std::vector<std::vector<unsigned char>>* vData)
|
||||||
{
|
{
|
||||||
CTxOut vout;
|
CTxOut vout;
|
||||||
CC *payoutCond = MakeCCcond1of2(evalcode,pk1,pk2);
|
CC *payoutCond = MakeCCcond1of2(evalcode,pk1,pk2);
|
||||||
vout = CTxOut(nValue,CCPubKey(payoutCond));
|
vout = CTxOut(nValue,CCPubKey(payoutCond));
|
||||||
if ( vData )
|
if ( vData )
|
||||||
{
|
{
|
||||||
std::vector<std::vector<unsigned char>> vtmpData = std::vector<std::vector<unsigned char>>(vData->begin(), vData->end());
|
//std::vector<std::vector<unsigned char>> vtmpData = std::vector<std::vector<unsigned char>>(vData->begin(), vData->end());
|
||||||
std::vector<CPubKey> vPubKeys = std::vector<CPubKey>();
|
std::vector<CPubKey> vPubKeys = std::vector<CPubKey>();
|
||||||
vPubKeys.push_back(pk1);
|
// skip pubkeys. These need to maybe be optional and we need some way to get them out that is easy!
|
||||||
vPubKeys.push_back(pk2);
|
//vPubKeys.push_back(pk1);
|
||||||
COptCCParams ccp = COptCCParams(COptCCParams::VERSION, evalcode, 1, 2, vPubKeys, vtmpData);
|
//vPubKeys.push_back(pk2);
|
||||||
|
COptCCParams ccp = COptCCParams(COptCCParams::VERSION, evalcode, 1, 2, vPubKeys, ( * vData));
|
||||||
vout.scriptPubKey << ccp.AsVector() << OP_DROP;
|
vout.scriptPubKey << ccp.AsVector() << OP_DROP;
|
||||||
}
|
}
|
||||||
cc_free(payoutCond);
|
cc_free(payoutCond);
|
||||||
@@ -114,8 +149,12 @@ bool IsCCInput(CScript const& scriptSig)
|
|||||||
|
|
||||||
bool CheckTxFee(const CTransaction &tx, uint64_t txfee, uint32_t height, uint64_t blocktime)
|
bool CheckTxFee(const CTransaction &tx, uint64_t txfee, uint32_t height, uint64_t blocktime)
|
||||||
{
|
{
|
||||||
|
LOCK(mempool.cs);
|
||||||
|
CCoinsView dummy;
|
||||||
|
CCoinsViewCache view(&dummy);
|
||||||
int64_t interest; uint64_t valuein;
|
int64_t interest; uint64_t valuein;
|
||||||
CCoinsViewCache &view = *pcoinsTip;
|
CCoinsViewMemPool viewMemPool(pcoinsTip, mempool);
|
||||||
|
view.SetBackend(viewMemPool);
|
||||||
valuein = view.GetValueIn(height,&interest,tx,blocktime);
|
valuein = view.GetValueIn(height,&interest,tx,blocktime);
|
||||||
if ( valuein-tx.GetValueOut() > txfee )
|
if ( valuein-tx.GetValueOut() > txfee )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -67,38 +67,26 @@ UniValue custom_func1(uint64_t txfee,struct CCcontract_info *cp,cJSON *params)
|
|||||||
// make op_return payload as normal.
|
// make op_return payload as normal.
|
||||||
CScript opret = custom_opret('1',mypk);
|
CScript opret = custom_opret('1',mypk);
|
||||||
std::vector<std::vector<unsigned char>> vData = std::vector<std::vector<unsigned char>>();
|
std::vector<std::vector<unsigned char>> vData = std::vector<std::vector<unsigned char>>();
|
||||||
vData.push_back(std::vector<unsigned char>(opret.begin(), opret.end()));
|
if ( makeCCopret(opret, vData) )
|
||||||
// make vout0 with op_return included as payload.
|
{
|
||||||
mtx.vout.push_back(MakeCC1vout(cp->evalcode,amount,mypk,&vData));
|
// make vout0 with op_return included as payload.
|
||||||
fprintf(stderr, "vout size2.%li\n", mtx.vout.size());
|
mtx.vout.push_back(MakeCC1vout(cp->evalcode,amount,mypk,&vData));
|
||||||
rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,CScript());
|
fprintf(stderr, "vout size2.%li\n", mtx.vout.size());
|
||||||
return(custom_rawtxresult(result,rawtx,broadcastflag));
|
rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,CScript());
|
||||||
|
return(custom_rawtxresult(result,rawtx,broadcastflag));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool has_opret(const CTransaction &tx, uint8_t evalcode)
|
|
||||||
{
|
|
||||||
for ( auto vout : tx.vout )
|
|
||||||
{
|
|
||||||
if ( vout.scriptPubKey[0] == OP_RETURN && vout.scriptPubKey[1] == evalcode )
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool custom_validate(struct CCcontract_info *cp,int32_t height,Eval *eval,const CTransaction tx)
|
bool custom_validate(struct CCcontract_info *cp,int32_t height,Eval *eval,const CTransaction tx)
|
||||||
{
|
{
|
||||||
char expectedaddress[64]; CPubKey pk;
|
char expectedaddress[64]; CPubKey pk;
|
||||||
CScript opret; int32_t numvout;
|
CScript opret; int32_t numvout;
|
||||||
if ( !has_opret(tx, EVAL_CUSTOM) )
|
if ( has_opret(tx, EVAL_CUSTOM) == 0 )
|
||||||
{
|
{
|
||||||
std::vector<std::vector<unsigned char>> vParams = std::vector<std::vector<unsigned char>>();
|
std::vector<std::vector<unsigned char>> vParams = std::vector<std::vector<unsigned char>>();
|
||||||
CScript dummy;
|
opret = getCCopret(tx.vout[0].scriptPubKey);
|
||||||
if ( tx.vout[0].scriptPubKey.IsPayToCryptoCondition(&dummy, vParams) && vParams.size() == 1 )
|
|
||||||
{
|
|
||||||
opret << E_MARSHAL(ss << vParams[0]);
|
|
||||||
}
|
|
||||||
numvout = 1;
|
numvout = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -664,6 +664,7 @@ int32_t z_exportkey(char *privkey,char *refcoin,char *acname,char *zaddr)
|
|||||||
free(retstr);
|
free(retstr);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t getnewaddress(char *coinaddr,char *refcoin,char *acname)
|
int32_t getnewaddress(char *coinaddr,char *refcoin,char *acname)
|
||||||
|
|||||||
@@ -16,6 +16,12 @@
|
|||||||
#include "CCPayments.h"
|
#include "CCPayments.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
|
-earlytxid is not an -ac_param, so it doesnt affect the chain magics
|
||||||
|
extra data after the normal CCvout is whatever data we want and can represent whatever we want
|
||||||
|
so -ac_script=<payments CC vout + useearlytxid>
|
||||||
|
in the validation if you see the useearlytxid in the opreturn data or extra data, you use the earlytxid as the txid that specifies the payment
|
||||||
|
|
||||||
0) txidopret <- allocation, scriptPubKey, opret
|
0) txidopret <- allocation, scriptPubKey, opret
|
||||||
1) create <- locked_blocks, minrelease, list of txidopret
|
1) create <- locked_blocks, minrelease, list of txidopret
|
||||||
|
|
||||||
@@ -193,11 +199,10 @@ bool PaymentsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &
|
|||||||
{
|
{
|
||||||
if ( lockedblocks < 0 || minrelease < 0 || totalallocations <= 0 || txidoprets.size() < 2 )
|
if ( lockedblocks < 0 || minrelease < 0 || totalallocations <= 0 || txidoprets.size() < 2 )
|
||||||
return(eval->Invalid("negative values"));
|
return(eval->Invalid("negative values"));
|
||||||
if ( !CheckTxFee(tx, PAYMENTS_TXFEE, chainActive.LastTip()->GetHeight(), chainActive.LastTip()->nTime) )
|
|
||||||
return eval->Invalid("txfee is too high");
|
|
||||||
Paymentspk = GetUnspendable(cp,0);
|
Paymentspk = GetUnspendable(cp,0);
|
||||||
//fprintf(stderr, "lockedblocks.%i minrelease.%i totalallocations.%i txidopret1.%s txidopret2.%s\n",lockedblocks, minrelease, totalallocations, txidoprets[0].ToString().c_str(), txidoprets[1].ToString().c_str() );
|
//fprintf(stderr, "lockedblocks.%i minrelease.%i totalallocations.%i txidopret1.%s txidopret2.%s\n",lockedblocks, minrelease, totalallocations, txidoprets[0].ToString().c_str(), txidoprets[1].ToString().c_str() );
|
||||||
|
if ( !CheckTxFee(tx, PAYMENTS_TXFEE+1, chainActive.LastTip()->GetHeight(), chainActive.LastTip()->nTime) )
|
||||||
|
return eval->Invalid("txfee is too high");
|
||||||
// Get all the script pubkeys and allocations
|
// Get all the script pubkeys and allocations
|
||||||
std::vector<int64_t> allocations;
|
std::vector<int64_t> allocations;
|
||||||
std::vector<CScript> scriptPubKeys;
|
std::vector<CScript> scriptPubKeys;
|
||||||
@@ -212,6 +217,20 @@ bool PaymentsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &
|
|||||||
allocations.push_back(allocation);
|
allocations.push_back(allocation);
|
||||||
//fprintf(stderr, "i.%i scriptpubkey.%s allocation.%li\n",i,scriptPubKeys[i].ToString().c_str(),allocation);
|
//fprintf(stderr, "i.%i scriptpubkey.%s allocation.%li\n",i,scriptPubKeys[i].ToString().c_str(),allocation);
|
||||||
checkallocations += allocation;
|
checkallocations += allocation;
|
||||||
|
// if we have an op_return to pay to need to check it exists and is paying the correct opret.
|
||||||
|
if ( !opret.empty() )
|
||||||
|
{
|
||||||
|
if ( !fHasOpret )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "missing opret.%s in payments release.\n",HexStr(opret.begin(), opret.end()).c_str());
|
||||||
|
return(eval->Invalid("missing opret in payments release"));
|
||||||
|
}
|
||||||
|
else if ( CScript(opret.begin(),opret.end()) != tx.vout[tx.vout.size()-1].scriptPubKey )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "opret.%s vs opret.%s\n",HexStr(opret.begin(), opret.end()).c_str(), HexStr(tx.vout[tx.vout.size()-1].scriptPubKey.begin(), tx.vout[tx.vout.size()-1].scriptPubKey.end()).c_str());
|
||||||
|
return(eval->Invalid("pays incorrect opret"));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
@@ -247,7 +266,7 @@ bool PaymentsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &
|
|||||||
int64_t test = allocations[n];
|
int64_t test = allocations[n];
|
||||||
test *= checkamount;
|
test *= checkamount;
|
||||||
test /= totalallocations;
|
test /= totalallocations;
|
||||||
if ( test != tx.vout[i].nValue )
|
if ( test != tx.vout[i].nValue && test != tx.vout[i].nValue-1 )
|
||||||
{
|
{
|
||||||
fprintf(stderr, "vout.%i test.%li vs nVlaue.%li\n",i, test, tx.vout[i].nValue);
|
fprintf(stderr, "vout.%i test.%li vs nVlaue.%li\n",i, test, tx.vout[i].nValue);
|
||||||
return(eval->Invalid("amounts do not match"));
|
return(eval->Invalid("amounts do not match"));
|
||||||
@@ -277,14 +296,24 @@ bool PaymentsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &
|
|||||||
Getscriptaddress(destaddr,txin.vout[vin.prevout.n].scriptPubKey);
|
Getscriptaddress(destaddr,txin.vout[vin.prevout.n].scriptPubKey);
|
||||||
if ( strcmp(destaddr,coinaddr) != 0 )
|
if ( strcmp(destaddr,coinaddr) != 0 )
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> scriptPubKey,opret; uint256 checktxid;
|
CScript opret; uint256 checktxid; int32_t opret_ind;
|
||||||
if ( txin.vout.size() < 2 || DecodePaymentsFundOpRet(txin.vout[txin.vout.size()-1].scriptPubKey,checktxid) != 'F' || checktxid != createtxid )
|
if ( (opret_ind= has_opret(txin, EVAL_PAYMENTS)) == 0 )
|
||||||
|
{
|
||||||
|
// get op_return from CCvout
|
||||||
|
opret = getCCopret(txin.vout[0].scriptPubKey);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// get op_return from the op_return
|
||||||
|
opret = txin.vout[opret_ind].scriptPubKey;
|
||||||
|
} // else return(eval->Invalid("vin has wrong amount of vouts")); // dont think this is needed?
|
||||||
|
if ( DecodePaymentsFundOpRet(opret,checktxid) != 'F' || checktxid != createtxid )
|
||||||
{
|
{
|
||||||
fprintf(stderr, "vin.%i is not a payments CC vout: txid.%s\n", i, txin.GetHash().ToString().c_str());
|
fprintf(stderr, "vin.%i is not a payments CC vout: txid.%s\n", i, txin.GetHash().ToString().c_str());
|
||||||
return(eval->Invalid("vin is not paymentsCC type"));
|
return(eval->Invalid("vin is not paymentsCC type"));
|
||||||
} //else fprintf(stderr, "vin.%i opret type txid.%s\n", i, txin.GetHash().ToString().c_str());
|
}
|
||||||
}
|
}
|
||||||
// check the chain depth vs locked blcoks requirement.
|
// check the chain depth vs locked blocks requirement.
|
||||||
CBlockIndex* pblockindex = mapBlockIndex[blockhash];
|
CBlockIndex* pblockindex = mapBlockIndex[blockhash];
|
||||||
if ( pblockindex->GetHeight() > ht-lockedblocks )
|
if ( pblockindex->GetHeight() > ht-lockedblocks )
|
||||||
{
|
{
|
||||||
@@ -340,8 +369,18 @@ int64_t AddPaymentsInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP
|
|||||||
}
|
}
|
||||||
if ( iter == 0 )
|
if ( iter == 0 )
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> scriptPubKey,opret;
|
CScript opret; uint256 checktxid; int32_t opret_ind;
|
||||||
if ( myGetTransaction(txid,tx,hashBlock) == 0 || tx.vout.size() < 2 || DecodePaymentsFundOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,checktxid) != 'F' || checktxid != createtxid )
|
if ( (opret_ind= has_opret(vintx, EVAL_PAYMENTS)) == 0 )
|
||||||
|
{
|
||||||
|
// get op_return from CCvout
|
||||||
|
opret = getCCopret(vintx.vout[0].scriptPubKey);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// get op_return from the op_return
|
||||||
|
opret = vintx.vout[opret_ind].scriptPubKey;
|
||||||
|
}
|
||||||
|
if ( myGetTransaction(txid,tx,hashBlock) == 0 || DecodePaymentsFundOpRet(opret,checktxid) != 'F' || checktxid != createtxid )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"bad opret %s vs %s\n",checktxid.GetHex().c_str(),createtxid.GetHex().c_str());
|
fprintf(stderr,"bad opret %s vs %s\n",checktxid.GetHex().c_str(),createtxid.GetHex().c_str());
|
||||||
continue;
|
continue;
|
||||||
@@ -524,7 +563,7 @@ UniValue PaymentsRelease(struct CCcontract_info *cp,char *jsonstr)
|
|||||||
newamount += (PAYMENTS_TXFEE - mtx.vout[i+1].nValue);
|
newamount += (PAYMENTS_TXFEE - mtx.vout[i+1].nValue);
|
||||||
mtx.vout[i+1].nValue = PAYMENTS_TXFEE;
|
mtx.vout[i+1].nValue = PAYMENTS_TXFEE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( (inputsum= AddPaymentsInputs(cp,mtx,txidpk,newamount+2*PAYMENTS_TXFEE,CC_MAXVINS/2,createtxid,latestheight)) >= newamount+2*PAYMENTS_TXFEE )
|
if ( (inputsum= AddPaymentsInputs(cp,mtx,txidpk,newamount+2*PAYMENTS_TXFEE,CC_MAXVINS/2,createtxid,latestheight)) >= newamount+2*PAYMENTS_TXFEE )
|
||||||
{
|
{
|
||||||
std::string rawtx;
|
std::string rawtx;
|
||||||
@@ -603,10 +642,16 @@ UniValue PaymentsFund(struct CCcontract_info *cp,char *jsonstr)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mtx.vout.push_back(MakeCC1vout(EVAL_PAYMENTS,amount,Paymentspk));
|
|
||||||
opret = EncodePaymentsFundOpRet(txid);
|
opret = EncodePaymentsFundOpRet(txid);
|
||||||
|
fprintf(stderr, "opret.%s\n", HexStr(opret.begin(), opret.end()).c_str());
|
||||||
|
std::vector<std::vector<unsigned char>> vData = std::vector<std::vector<unsigned char>>();
|
||||||
|
if ( makeCCopret(opret, vData) )
|
||||||
|
{
|
||||||
|
mtx.vout.push_back(MakeCC1vout(EVAL_PAYMENTS,amount,Paymentspk,&vData));
|
||||||
|
fprintf(stderr, "params_size.%li parmas_hexstr.%s\n", vData.size(), HexStr(vData[0].begin(),vData[0].end()).c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
rawtx = FinalizeCCTx(0,cp,mtx,mypk,PAYMENTS_TXFEE,opret);
|
rawtx = FinalizeCCTx(0,cp,mtx,mypk,PAYMENTS_TXFEE,CScript());
|
||||||
if ( params != 0 )
|
if ( params != 0 )
|
||||||
free_json(params);
|
free_json(params);
|
||||||
return(payments_rawtxresult(result,rawtx,1));
|
return(payments_rawtxresult(result,rawtx,1));
|
||||||
@@ -630,24 +675,34 @@ UniValue PaymentsFund(struct CCcontract_info *cp,char *jsonstr)
|
|||||||
UniValue PaymentsTxidopret(struct CCcontract_info *cp,char *jsonstr)
|
UniValue PaymentsTxidopret(struct CCcontract_info *cp,char *jsonstr)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight()); UniValue result(UniValue::VOBJ); CPubKey mypk; std::string rawtx;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight()); UniValue result(UniValue::VOBJ); CPubKey mypk; std::string rawtx;
|
||||||
std::vector<uint8_t> scriptPubKey,opret; int32_t allocation,n,retval0,retval1=0;
|
std::vector<uint8_t> scriptPubKey,opret; int32_t n,retval0,retval1=0; int64_t allocation;
|
||||||
cJSON *params = payments_reparse(&n,jsonstr);
|
cJSON *params = payments_reparse(&n,jsonstr);
|
||||||
mypk = pubkey2pk(Mypubkey());
|
mypk = pubkey2pk(Mypubkey());
|
||||||
if ( params != 0 && n > 1 && n <= 3 )
|
if ( params != 0 && n > 1 && n <= 3 )
|
||||||
{
|
{
|
||||||
allocation = juint(jitem(params,0),0);
|
allocation = (int64_t)jint(jitem(params,0),0);
|
||||||
retval0 = payments_parsehexdata(scriptPubKey,jitem(params,1),0);
|
retval0 = payments_parsehexdata(scriptPubKey,jitem(params,1),0);
|
||||||
if ( n == 3 )
|
CScript test = CScript(scriptPubKey.begin(),scriptPubKey.end());
|
||||||
retval1 = payments_parsehexdata(opret,jitem(params,2),0);
|
txnouttype whichType;
|
||||||
if ( allocation > 0 && retval0 == 0 && retval1 == 0 && AddNormalinputs(mtx,mypk,PAYMENTS_TXFEE,10) > 0 )
|
if (!::IsStandard(test, whichType))
|
||||||
{
|
{
|
||||||
rawtx = FinalizeCCTx(0,cp,mtx,mypk,PAYMENTS_TXFEE,EncodePaymentsTxidOpRet(allocation,scriptPubKey,opret));
|
result.push_back(Pair("result","error"));
|
||||||
if ( params != 0 )
|
result.push_back(Pair("error","scriptPubkey is not valid payment."));
|
||||||
free_json(params);
|
}
|
||||||
return(payments_rawtxresult(result,rawtx,1));
|
else
|
||||||
|
{
|
||||||
|
if ( n == 3 )
|
||||||
|
retval1 = payments_parsehexdata(opret,jitem(params,2),0);
|
||||||
|
if ( allocation > 0 && retval0 == 0 && retval1 == 0 && AddNormalinputs(mtx,mypk,PAYMENTS_TXFEE*2,10) > 0 )
|
||||||
|
{
|
||||||
|
rawtx = FinalizeCCTx(0,cp,mtx,mypk,PAYMENTS_TXFEE,EncodePaymentsTxidOpRet(allocation,scriptPubKey,opret));
|
||||||
|
if ( params != 0 )
|
||||||
|
free_json(params);
|
||||||
|
return(payments_rawtxresult(result,rawtx,1));
|
||||||
|
}
|
||||||
|
result.push_back(Pair("result","error"));
|
||||||
|
result.push_back(Pair("error","invalid params or cant find txfee"));
|
||||||
}
|
}
|
||||||
result.push_back(Pair("result","error"));
|
|
||||||
result.push_back(Pair("error","invalid params or cant find txfee"));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -867,7 +922,7 @@ UniValue PaymentsInfo(struct CCcontract_info *cp,char *jsonstr)
|
|||||||
funds = CCaddress_balance(fundsaddr,1);
|
funds = CCaddress_balance(fundsaddr,1);
|
||||||
result.push_back(Pair(fundsaddr,ValueFromAmount(funds)));
|
result.push_back(Pair(fundsaddr,ValueFromAmount(funds)));
|
||||||
GetCCaddress(cp,fundsopretaddr,Paymentspk);
|
GetCCaddress(cp,fundsopretaddr,Paymentspk);
|
||||||
fundsopret = CCaddress_balance(fundsopretaddr,1);
|
fundsopret = CCaddress_balance(fundsopretaddr,1); // Shows balance for ALL payments plans, not just the one asked for!
|
||||||
result.push_back(Pair(fundsopretaddr,ValueFromAmount(fundsopret)));
|
result.push_back(Pair(fundsopretaddr,ValueFromAmount(fundsopret)));
|
||||||
result.push_back(Pair("totalfunds",ValueFromAmount(funds+fundsopret)));
|
result.push_back(Pair("totalfunds",ValueFromAmount(funds+fundsopret)));
|
||||||
result.push_back(Pair("result","success"));
|
result.push_back(Pair("result","success"));
|
||||||
|
|||||||
@@ -289,6 +289,8 @@ void *chainparams_commandline(void *ptr)
|
|||||||
mainParams.SetNValue(ASSETCHAINS_NK[0]);
|
mainParams.SetNValue(ASSETCHAINS_NK[0]);
|
||||||
mainParams.SetKValue(ASSETCHAINS_NK[1]);
|
mainParams.SetKValue(ASSETCHAINS_NK[1]);
|
||||||
}
|
}
|
||||||
|
if ( KOMODO_TESTNODE != 0 )
|
||||||
|
mainParams.SetMiningRequiresPeers(false);
|
||||||
if ( ASSETCHAINS_RPCPORT == 0 )
|
if ( ASSETCHAINS_RPCPORT == 0 )
|
||||||
ASSETCHAINS_RPCPORT = ASSETCHAINS_P2PPORT + 1;
|
ASSETCHAINS_RPCPORT = ASSETCHAINS_P2PPORT + 1;
|
||||||
mainParams.pchMessageStart[0] = ASSETCHAINS_MAGIC & 0xff;
|
mainParams.pchMessageStart[0] = ASSETCHAINS_MAGIC & 0xff;
|
||||||
|
|||||||
@@ -121,6 +121,7 @@ public:
|
|||||||
void SetCheckpointData(CCheckpointData checkpointData);
|
void SetCheckpointData(CCheckpointData checkpointData);
|
||||||
void SetNValue(uint64_t n) { nEquihashN = n; }
|
void SetNValue(uint64_t n) { nEquihashN = n; }
|
||||||
void SetKValue(uint64_t k) { nEquihashK = k; }
|
void SetKValue(uint64_t k) { nEquihashK = k; }
|
||||||
|
void SetMiningRequiresPeers(bool flag) { fMiningRequiresPeers = flag; }
|
||||||
|
|
||||||
//void setnonce(uint32_t nonce) { memcpy(&genesis.nNonce,&nonce,sizeof(nonce)); }
|
//void setnonce(uint32_t nonce) { memcpy(&genesis.nNonce,&nonce,sizeof(nonce)); }
|
||||||
//void settimestamp(uint32_t timestamp) { genesis.nTime = timestamp; }
|
//void settimestamp(uint32_t timestamp) { genesis.nTime = timestamp; }
|
||||||
|
|||||||
@@ -1091,6 +1091,17 @@ int32_t komodo_blockheight(uint256 hash)
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t komodo_blocktime(uint256 hash)
|
||||||
|
{
|
||||||
|
BlockMap::const_iterator it; CBlockIndex *pindex = 0;
|
||||||
|
if ( (it = mapBlockIndex.find(hash)) != mapBlockIndex.end() )
|
||||||
|
{
|
||||||
|
if ( (pindex= it->second) != 0 )
|
||||||
|
return(pindex->nTime);
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t komodo_checkpoint(int32_t *notarized_heightp,int32_t nHeight,uint256 hash)
|
int32_t komodo_checkpoint(int32_t *notarized_heightp,int32_t nHeight,uint256 hash)
|
||||||
{
|
{
|
||||||
int32_t notarized_height,MoMdepth; uint256 MoM,notarized_hash,notarized_desttxid; CBlockIndex *notary,*pindex;
|
int32_t notarized_height,MoMdepth; uint256 MoM,notarized_hash,notarized_desttxid; CBlockIndex *notary,*pindex;
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ extern std::string DONATION_PUBKEY;
|
|||||||
extern uint8_t ASSETCHAINS_PRIVATE;
|
extern uint8_t ASSETCHAINS_PRIVATE;
|
||||||
extern int32_t USE_EXTERNAL_PUBKEY;
|
extern int32_t USE_EXTERNAL_PUBKEY;
|
||||||
extern char NOTARYADDRS[64][64];
|
extern char NOTARYADDRS[64][64];
|
||||||
|
extern int32_t KOMODO_TESTNODE;
|
||||||
int tx_height( const uint256 &hash );
|
int tx_height( const uint256 &hash );
|
||||||
extern std::vector<std::string> vWhiteListAddress;
|
extern std::vector<std::string> vWhiteListAddress;
|
||||||
void komodo_netevent(std::vector<uint8_t> payload);
|
void komodo_netevent(std::vector<uint8_t> payload);
|
||||||
@@ -94,6 +95,7 @@ char *bitcoin_address(char *coinaddr,uint8_t addrtype,uint8_t *pubkey_or_rmd160,
|
|||||||
int32_t komodo_minerids(uint8_t *minerids,int32_t height,int32_t width);
|
int32_t komodo_minerids(uint8_t *minerids,int32_t height,int32_t width);
|
||||||
int32_t komodo_kvsearch(uint256 *refpubkeyp,int32_t current_height,uint32_t *flagsp,int32_t *heightp,uint8_t value[IGUANA_MAXSCRIPTSIZE],uint8_t *key,int32_t keylen);
|
int32_t komodo_kvsearch(uint256 *refpubkeyp,int32_t current_height,uint32_t *flagsp,int32_t *heightp,uint8_t value[IGUANA_MAXSCRIPTSIZE],uint8_t *key,int32_t keylen);
|
||||||
|
|
||||||
|
uint32_t komodo_blocktime(uint256 hash);
|
||||||
int32_t komodo_longestchain();
|
int32_t komodo_longestchain();
|
||||||
int32_t komodo_dpowconfs(int32_t height,int32_t numconfs);
|
int32_t komodo_dpowconfs(int32_t height,int32_t numconfs);
|
||||||
int8_t komodo_segid(int32_t nocache,int32_t height);
|
int8_t komodo_segid(int32_t nocache,int32_t height);
|
||||||
|
|||||||
@@ -2017,7 +2017,7 @@ int32_t get_stockprices(uint32_t now,uint32_t *prices,std::vector<std::string> s
|
|||||||
{
|
{
|
||||||
char url[32768],*symbol,*timestr; cJSON *json,*obj; int32_t i,n=0,retval=-1; uint32_t uprice,timestamp;
|
char url[32768],*symbol,*timestr; cJSON *json,*obj; int32_t i,n=0,retval=-1; uint32_t uprice,timestamp;
|
||||||
sprintf(url,"https://api.iextrading.com/1.0/tops/last?symbols=%s",GetArg("-ac_stocks","").c_str());
|
sprintf(url,"https://api.iextrading.com/1.0/tops/last?symbols=%s",GetArg("-ac_stocks","").c_str());
|
||||||
if ( (json= send_curl(url,(char *)"iex")) != 0 ) //if ( (json= get_urljson(url)) != 0 )
|
if ( (json= get_urljson(url)) != 0 ) //if ( (json= send_curl(url,(char *)"iex")) != 0 ) //
|
||||||
{
|
{
|
||||||
if ( (n= cJSON_GetArraySize(json)) > 0 )
|
if ( (n= cJSON_GetArraySize(json)) > 0 )
|
||||||
{
|
{
|
||||||
@@ -2056,7 +2056,7 @@ uint32_t get_dailyfx(uint32_t *prices)
|
|||||||
//{"base":"USD","rates":{"BGN":1.74344803,"NZD":1.471652701,"ILS":3.6329113924,"RUB":65.1997682296,"CAD":1.3430201462,"USD":1.0,"PHP":52.8641469068,"CHF":0.9970582992,"AUD":1.4129078267,"JPY":110.6792654662,"TRY":5.6523444464,"HKD":7.8499732573,"MYR":4.0824567659,"HRK":6.6232840078,"CZK":22.9862720628,"IDR":14267.4986628633,"DKK":6.6551078624,"NOK":8.6806917454,"HUF":285.131039401,"GBP":0.7626582278,"MXN":19.4183455161,"THB":31.8702085933,"ISK":122.5708682475,"ZAR":14.7033339276,"BRL":3.9750401141,"SGD":1.3573720806,"PLN":3.8286682118,"INR":69.33187734,"KRW":1139.1602781244,"RON":4.2423783206,"CNY":6.7387234801,"SEK":9.3385630237,"EUR":0.8914244963},"date":"2019-03-28"}
|
//{"base":"USD","rates":{"BGN":1.74344803,"NZD":1.471652701,"ILS":3.6329113924,"RUB":65.1997682296,"CAD":1.3430201462,"USD":1.0,"PHP":52.8641469068,"CHF":0.9970582992,"AUD":1.4129078267,"JPY":110.6792654662,"TRY":5.6523444464,"HKD":7.8499732573,"MYR":4.0824567659,"HRK":6.6232840078,"CZK":22.9862720628,"IDR":14267.4986628633,"DKK":6.6551078624,"NOK":8.6806917454,"HUF":285.131039401,"GBP":0.7626582278,"MXN":19.4183455161,"THB":31.8702085933,"ISK":122.5708682475,"ZAR":14.7033339276,"BRL":3.9750401141,"SGD":1.3573720806,"PLN":3.8286682118,"INR":69.33187734,"KRW":1139.1602781244,"RON":4.2423783206,"CNY":6.7387234801,"SEK":9.3385630237,"EUR":0.8914244963},"date":"2019-03-28"}
|
||||||
char url[512],*datestr; cJSON *json,*rates; int32_t i; uint32_t datenum=0,price = 0;
|
char url[512],*datestr; cJSON *json,*rates; int32_t i; uint32_t datenum=0,price = 0;
|
||||||
sprintf(url,"https://api.openrates.io/latest?base=USD");
|
sprintf(url,"https://api.openrates.io/latest?base=USD");
|
||||||
if ( (json= send_curl(url,(char *)"dailyfx")) != 0 )
|
if ( (json= get_urljson(url)) != 0 ) //if ( (json= send_curl(url,(char *)"dailyfx")) != 0 )
|
||||||
{
|
{
|
||||||
if ( (rates= jobj(json,(char *)"rates")) != 0 )
|
if ( (rates= jobj(json,(char *)"rates")) != 0 )
|
||||||
{
|
{
|
||||||
@@ -2079,7 +2079,7 @@ uint32_t get_binanceprice(const char *symbol)
|
|||||||
{
|
{
|
||||||
char url[512]; cJSON *json; uint32_t price = 0;
|
char url[512]; cJSON *json; uint32_t price = 0;
|
||||||
sprintf(url,"https://api.binance.com/api/v1/ticker/price?symbol=%sBTC",symbol);
|
sprintf(url,"https://api.binance.com/api/v1/ticker/price?symbol=%sBTC",symbol);
|
||||||
if ( (json= send_curl(url,(char *)"bnbprice")) != 0 )
|
if ( (json= get_urljson(url)) != 0 ) //if ( (json= send_curl(url,(char *)"bnbprice")) != 0 )
|
||||||
{
|
{
|
||||||
price = jdouble(json,(char *)"price")*SATOSHIDEN + 0.0000000049;
|
price = jdouble(json,(char *)"price")*SATOSHIDEN + 0.0000000049;
|
||||||
free_json(json);
|
free_json(json);
|
||||||
|
|||||||
@@ -109,6 +109,8 @@ uint64_t PENDING_KOMODO_TX;
|
|||||||
extern int32_t KOMODO_LOADINGBLOCKS;
|
extern int32_t KOMODO_LOADINGBLOCKS;
|
||||||
unsigned int MAX_BLOCK_SIGOPS = 20000;
|
unsigned int MAX_BLOCK_SIGOPS = 20000;
|
||||||
|
|
||||||
|
int32_t KOMODO_TESTNODE;
|
||||||
|
|
||||||
struct komodo_kv *KOMODO_KV;
|
struct komodo_kv *KOMODO_KV;
|
||||||
pthread_mutex_t KOMODO_KV_mutex,KOMODO_CC_mutex;
|
pthread_mutex_t KOMODO_KV_mutex,KOMODO_CC_mutex;
|
||||||
|
|
||||||
|
|||||||
@@ -1710,6 +1710,7 @@ void komodo_args(char *argv0)
|
|||||||
DONATION_PUBKEY = GetArg("-donation", "");
|
DONATION_PUBKEY = GetArg("-donation", "");
|
||||||
NOTARY_PUBKEY = GetArg("-pubkey", "");
|
NOTARY_PUBKEY = GetArg("-pubkey", "");
|
||||||
KOMODO_DEALERNODE = GetArg("-dealer",0);
|
KOMODO_DEALERNODE = GetArg("-dealer",0);
|
||||||
|
KOMODO_TESTNODE = GetArg("-testnode",0);
|
||||||
if ( strlen(NOTARY_PUBKEY.c_str()) == 66 )
|
if ( strlen(NOTARY_PUBKEY.c_str()) == 66 )
|
||||||
{
|
{
|
||||||
decode_hex(NOTARY_PUBKEY33,33,(char *)NOTARY_PUBKEY.c_str());
|
decode_hex(NOTARY_PUBKEY33,33,(char *)NOTARY_PUBKEY.c_str());
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ int32_t ASSETCHAINS_LWMAPOS = 0;
|
|||||||
int32_t VERUS_BLOCK_POSUNITS = 1000;
|
int32_t VERUS_BLOCK_POSUNITS = 1000;
|
||||||
int32_t ASSETCHAINS_OVERWINTER = 227520;
|
int32_t ASSETCHAINS_OVERWINTER = 227520;
|
||||||
int32_t ASSETCHAINS_SAPLING = 227520;
|
int32_t ASSETCHAINS_SAPLING = 227520;
|
||||||
|
int32_t KOMODO_TESTNODE = 0;
|
||||||
|
|
||||||
unsigned int MAX_BLOCK_SIGOPS = 20000;
|
unsigned int MAX_BLOCK_SIGOPS = 20000;
|
||||||
|
|
||||||
|
|||||||
@@ -677,7 +677,7 @@ bool AsyncRPCOperation_mergetoaddress::main_impl()
|
|||||||
if (mapBlockIndex.find(wtx.hashBlock) == mapBlockIndex.end()) {
|
if (mapBlockIndex.find(wtx.hashBlock) == mapBlockIndex.end()) {
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, strprintf("mapBlockIndex does not contain block hash %s", wtx.hashBlock.ToString()));
|
throw JSONRPCError(RPC_WALLET_ERROR, strprintf("mapBlockIndex does not contain block hash %s", wtx.hashBlock.ToString()));
|
||||||
}
|
}
|
||||||
wtxHeight = mapBlockIndex[wtx.hashBlock]->GetHeight();
|
wtxHeight = komodo_blockheight(wtx.hashBlock);
|
||||||
wtxDepth = wtx.GetDepthInMainChain();
|
wtxDepth = wtx.GetDepthInMainChain();
|
||||||
}
|
}
|
||||||
LogPrint("zrpcunsafe", "%s: spending note (txid=%s, vjoinsplit=%d, ciphertext=%d, amount=%s, height=%d, confirmations=%d)\n",
|
LogPrint("zrpcunsafe", "%s: spending note (txid=%s, vjoinsplit=%d, ciphertext=%d, amount=%s, height=%d, confirmations=%d)\n",
|
||||||
|
|||||||
@@ -836,7 +836,7 @@ bool AsyncRPCOperation_sendmany::main_impl() {
|
|||||||
if (mapBlockIndex.find(wtx.hashBlock) == mapBlockIndex.end()) {
|
if (mapBlockIndex.find(wtx.hashBlock) == mapBlockIndex.end()) {
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, strprintf("mapBlockIndex does not contain block hash %s", wtx.hashBlock.ToString()));
|
throw JSONRPCError(RPC_WALLET_ERROR, strprintf("mapBlockIndex does not contain block hash %s", wtx.hashBlock.ToString()));
|
||||||
}
|
}
|
||||||
wtxHeight = mapBlockIndex[wtx.hashBlock]->GetHeight();
|
wtxHeight = komodo_blockheight(wtx.hashBlock);
|
||||||
wtxDepth = wtx.GetDepthInMainChain();
|
wtxDepth = wtx.GetDepthInMainChain();
|
||||||
}
|
}
|
||||||
LogPrint("zrpcunsafe", "%s: spending note (txid=%s, vjoinsplit=%d, ciphertext=%d, amount=%s, height=%d, confirmations=%d)\n",
|
LogPrint("zrpcunsafe", "%s: spending note (txid=%s, vjoinsplit=%d, ciphertext=%d, amount=%s, height=%d, confirmations=%d)\n",
|
||||||
|
|||||||
@@ -122,10 +122,10 @@ void WalletTxToJSON(const CWalletTx& wtx, UniValue& entry)
|
|||||||
entry.push_back(Pair("generated", true));
|
entry.push_back(Pair("generated", true));
|
||||||
if (confirms > 0)
|
if (confirms > 0)
|
||||||
{
|
{
|
||||||
entry.push_back(Pair("confirmations", komodo_dpowconfs((int32_t)mapBlockIndex[wtx.hashBlock]->GetHeight(),confirms)));
|
entry.push_back(Pair("confirmations", komodo_dpowconfs((int32_t)komodo_blockheight(wtx.hashBlock),confirms)));
|
||||||
entry.push_back(Pair("blockhash", wtx.hashBlock.GetHex()));
|
entry.push_back(Pair("blockhash", wtx.hashBlock.GetHex()));
|
||||||
entry.push_back(Pair("blockindex", wtx.nIndex));
|
entry.push_back(Pair("blockindex", wtx.nIndex));
|
||||||
entry.push_back(Pair("blocktime", mapBlockIndex[wtx.hashBlock]->GetBlockTime()));
|
entry.push_back(Pair("blocktime", komodo_blocktime(wtx.hashBlock)));
|
||||||
entry.push_back(Pair("expiryheight", (int64_t)wtx.nExpiryHeight));
|
entry.push_back(Pair("expiryheight", (int64_t)wtx.nExpiryHeight));
|
||||||
} else entry.push_back(Pair("confirmations", confirms));
|
} else entry.push_back(Pair("confirmations", confirms));
|
||||||
uint256 hash = wtx.GetHash();
|
uint256 hash = wtx.GetHash();
|
||||||
@@ -1624,7 +1624,7 @@ UniValue ListReceived(const UniValue& params, bool fByAccounts)
|
|||||||
tallyitem& item = mapTally[address];
|
tallyitem& item = mapTally[address];
|
||||||
item.nAmount += txout.nValue; // komodo_interest?
|
item.nAmount += txout.nValue; // komodo_interest?
|
||||||
item.nConf = min(item.nConf, nDepth);
|
item.nConf = min(item.nConf, nDepth);
|
||||||
item.nHeight = mapBlockIndex[wtx.hashBlock]->GetHeight();
|
item.nHeight = komodo_blockheight(wtx.hashBlock);
|
||||||
item.txids.push_back(wtx.GetHash());
|
item.txids.push_back(wtx.GetHash());
|
||||||
if (mine & ISMINE_WATCH_ONLY)
|
if (mine & ISMINE_WATCH_ONLY)
|
||||||
item.fIsWatchonly = true;
|
item.fIsWatchonly = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user