@@ -11,6 +11,7 @@ export BITCOIND=${REAL_BITCOIND}
|
|||||||
#Run the tests
|
#Run the tests
|
||||||
|
|
||||||
testScripts=(
|
testScripts=(
|
||||||
|
'ac_private.py'
|
||||||
'verushash.py'
|
'verushash.py'
|
||||||
'cryptoconditions.py'
|
'cryptoconditions.py'
|
||||||
'paymentdisclosure.py'
|
'paymentdisclosure.py'
|
||||||
|
|||||||
@@ -118,7 +118,8 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ac_name": "EQL",
|
"ac_name": "EQL",
|
||||||
"ac_supply": "500000000"
|
"ac_supply": "500000000",
|
||||||
|
"ac_ccactivate": "205000"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ac_name": "ZILLA",
|
"ac_name": "ZILLA",
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ echo $pubkey
|
|||||||
./komodod -pubkey=$pubkey -ac_name=PRLPAY -ac_supply=500000000 -addnode=13.250.226.125 &
|
./komodod -pubkey=$pubkey -ac_name=PRLPAY -ac_supply=500000000 -addnode=13.250.226.125 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=DSEC -ac_supply=7000000 -addnode=185.148.147.30 &
|
./komodod -pubkey=$pubkey -ac_name=DSEC -ac_supply=7000000 -addnode=185.148.147.30 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=GLXT -ac_supply=10000000000 -addnode=13.230.224.15 &
|
./komodod -pubkey=$pubkey -ac_name=GLXT -ac_supply=10000000000 -addnode=13.230.224.15 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=EQL -ac_supply=500000000 -addnode=46.101.124.153 &
|
./komodod -pubkey=$pubkey -ac_name=EQL -ac_supply=500000000 -ac_ccactivate=205000 -addnode=46.101.124.153 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=ZILLA -ac_supply=11000000 -addnode=54.39.23.248 &
|
./komodod -pubkey=$pubkey -ac_name=ZILLA -ac_supply=11000000 -addnode=54.39.23.248 &
|
||||||
./komodod -pubkey=$pubkey -ac_name=RFOX -ac_supply=1000000000 -ac_reward=100000000 -addnode=78.47.196.146 &
|
./komodod -pubkey=$pubkey -ac_name=RFOX -ac_supply=1000000000 -ac_reward=100000000 -addnode=78.47.196.146 &
|
||||||
~/VerusCoin/src/komodod -pubkey=$pubkey -ac_name=VRSC -ac_algo=verushash -ac_cc=1 -ac_veruspos=50 -ac_supply=0 -ac_eras=3 -ac_reward=0,38400000000,2400000000 -ac_halving=1,43200,1051920 -ac_decay=100000000,0,0 -ac_end=10080,226080,0 -ac_timelockgte=19200000000 -ac_timeunlockfrom=129600 -ac_timeunlockto=1180800 -addnode=185.25.48.236 -addnode=185.64.105.111 &
|
~/VerusCoin/src/komodod -pubkey=$pubkey -ac_name=VRSC -ac_algo=verushash -ac_cc=1 -ac_veruspos=50 -ac_supply=0 -ac_eras=3 -ac_reward=0,38400000000,2400000000 -ac_halving=1,43200,1051920 -ac_decay=100000000,0,0 -ac_end=10080,226080,0 -ac_timelockgte=19200000000 -ac_timeunlockfrom=129600 -ac_timeunlockto=1180800 -addnode=185.25.48.236 -addnode=185.64.105.111 &
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
#include <event2/buffer.h>
|
#include <event2/buffer.h>
|
||||||
#include <event2/keyvalq_struct.h>
|
#include <event2/keyvalq_struct.h>
|
||||||
#include "support/events.h"
|
#include "support/events.h"
|
||||||
|
uint16_t BITCOIND_RPCPORT = 7771;
|
||||||
|
char ASSETCHAINS_SYMBOL[65];
|
||||||
|
|
||||||
#include <univalue.h>
|
#include <univalue.h>
|
||||||
|
|
||||||
@@ -64,27 +66,6 @@ public:
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define FROM_CLI
|
|
||||||
#include "uint256.h"
|
|
||||||
#include "arith_uint256.h"
|
|
||||||
|
|
||||||
#include "komodo_structs.h"
|
|
||||||
|
|
||||||
#include "komodo_globals.h"
|
|
||||||
#include "komodo_utils.h"
|
|
||||||
#include "komodo_cJSON.c"
|
|
||||||
#include "komodo_notary.h"
|
|
||||||
|
|
||||||
void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t KMDheight,uint32_t KMDtimestamp,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout,uint256 MoM,int32_t MoMdepth)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t komodo_heightstamp(int32_t height)
|
|
||||||
{
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// This function returns either one of EXIT_ codes when it's expected to stop the process or
|
// This function returns either one of EXIT_ codes when it's expected to stop the process or
|
||||||
// CONTINUE_EXECUTION when it's expected to continue further.
|
// CONTINUE_EXECUTION when it's expected to continue further.
|
||||||
@@ -99,7 +80,11 @@ static int AppInitRPC(int argc, char* argv[])
|
|||||||
// Parameters
|
// Parameters
|
||||||
//
|
//
|
||||||
ParseParameters(argc, argv);
|
ParseParameters(argc, argv);
|
||||||
komodo_args(argv[0]);
|
std:string name;
|
||||||
|
name = GetArg("-ac_name","");
|
||||||
|
if ( !name.empty() )
|
||||||
|
strncpy(ASSETCHAINS_SYMBOL,name.c_str(),sizeof(ASSETCHAINS_SYMBOL)-1);
|
||||||
|
|
||||||
if (argc<2 || mapArgs.count("-?") || mapArgs.count("-h") || mapArgs.count("-help") || mapArgs.count("-version")) {
|
if (argc<2 || mapArgs.count("-?") || mapArgs.count("-h") || mapArgs.count("-help") || mapArgs.count("-version")) {
|
||||||
std::string strUsage = _("Komodo RPC client version") + " " + FormatFullVersion() + "\n" + PrivacyInfo();
|
std::string strUsage = _("Komodo RPC client version") + " " + FormatFullVersion() + "\n" + PrivacyInfo();
|
||||||
if (!mapArgs.count("-version")) {
|
if (!mapArgs.count("-version")) {
|
||||||
|
|||||||
@@ -25,10 +25,13 @@ std::string GatewaysBind(uint64_t txfee,std::string coin,uint256 tokenid,int64_t
|
|||||||
std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vector<uint8_t>proof,CPubKey destpub,int64_t amount);
|
std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vector<uint8_t>proof,CPubKey destpub,int64_t amount);
|
||||||
std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,CPubKey destpub,int64_t amount);
|
std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,CPubKey destpub,int64_t amount);
|
||||||
std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,CPubKey withdrawpub,int64_t amount);
|
std::string GatewaysWithdraw(uint64_t txfee,uint256 bindtxid,std::string refcoin,CPubKey withdrawpub,int64_t amount);
|
||||||
|
std::string GatewaysPartialSign(uint64_t txfee,uint256 txidaddr,std::string refcoin,std::string hex);
|
||||||
|
std::string GatewaysCompleteSigning(uint64_t txfee,uint256 txidaddr,std::string refcoin,std::string hex);
|
||||||
|
std::string GatewaysMarkDone(uint64_t txfee,uint256 withdrawtxid,std::string refcoin);
|
||||||
UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin);
|
UniValue GatewaysPendingWithdraws(uint256 bindtxid,std::string refcoin);
|
||||||
std::string GatewaysMarkdone(uint64_t txfee,uint256 withdrawtxid,std::string refcoin,uint256 cointxid);
|
UniValue GatewaysProcessedWithdraws(uint256 bindtxid,std::string refcoin);
|
||||||
UniValue GatewaysMultisig(char *txidaddr);
|
UniValue GatewaysMultisig(char *txidaddr);
|
||||||
std::string GatewaysPartialSign(uint64_t txfee,uint256 txidaddr,std::string refcoin, std::string hex);
|
|
||||||
|
|
||||||
// CCcustom
|
// CCcustom
|
||||||
UniValue GatewaysInfo(uint256 bindtxid);
|
UniValue GatewaysInfo(uint256 bindtxid);
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ CScript EncodeAssetOpRet(uint8_t funcid,uint256 assetid,uint256 assetid2,int64_t
|
|||||||
bool DecodeAssetCreateOpRet(const CScript &scriptPubKey,std::vector<uint8_t> &origpubkey,std::string &name,std::string &description);
|
bool DecodeAssetCreateOpRet(const CScript &scriptPubKey,std::vector<uint8_t> &origpubkey,std::string &name,std::string &description);
|
||||||
uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &assetid2,int64_t &price,std::vector<uint8_t> &origpubkey);
|
uint8_t DecodeAssetOpRet(const CScript &scriptPubKey,uint256 &assetid,uint256 &assetid2,int64_t &price,std::vector<uint8_t> &origpubkey);
|
||||||
bool SetAssetOrigpubkey(std::vector<uint8_t> &origpubkey,int64_t &price,const CTransaction &tx);
|
bool SetAssetOrigpubkey(std::vector<uint8_t> &origpubkey,int64_t &price,const CTransaction &tx);
|
||||||
int64_t IsAssetvout(int64_t &price,std::vector<uint8_t> &origpubkey,const CTransaction& tx,int32_t v,uint256 refassetid);
|
int64_t IsAssetvout(int32_t maxAssetExactAmountDepth, struct CCcontract_info *cp, Eval* eval, int64_t &price,std::vector<uint8_t> &origpubkey,const CTransaction& tx,int32_t v,uint256 refassetid);
|
||||||
bool ValidateBidRemainder(int64_t remaining_price,int64_t remaining_nValue,int64_t orig_nValue,int64_t received_nValue,int64_t paidprice,int64_t totalprice);
|
bool ValidateBidRemainder(int64_t remaining_price,int64_t remaining_nValue,int64_t orig_nValue,int64_t received_nValue,int64_t paidprice,int64_t totalprice);
|
||||||
bool ValidateAskRemainder(int64_t remaining_price,int64_t remaining_nValue,int64_t orig_nValue,int64_t received_nValue,int64_t paidprice,int64_t totalprice);
|
bool ValidateAskRemainder(int64_t remaining_price,int64_t remaining_nValue,int64_t orig_nValue,int64_t received_nValue,int64_t paidprice,int64_t totalprice);
|
||||||
bool ValidateSwapRemainder(int64_t remaining_price,int64_t remaining_nValue,int64_t orig_nValue,int64_t received_nValue,int64_t paidprice,int64_t totalprice);
|
bool ValidateSwapRemainder(int64_t remaining_price,int64_t remaining_nValue,int64_t orig_nValue,int64_t received_nValue,int64_t paidprice,int64_t totalprice);
|
||||||
@@ -44,7 +44,8 @@ bool SetAskFillamounts(int64_t &paid,int64_t &remaining_price,int64_t orig_nValu
|
|||||||
bool SetSwapFillamounts(int64_t &paid,int64_t &remaining_price,int64_t orig_nValue,int64_t &received,int64_t totalprice);
|
bool SetSwapFillamounts(int64_t &paid,int64_t &remaining_price,int64_t orig_nValue,int64_t &received,int64_t totalprice);
|
||||||
int64_t AssetValidateBuyvin(struct CCcontract_info *cp,Eval* eval,int64_t &tmpprice,std::vector<uint8_t> &tmporigpubkey,char *CCaddr,char *origaddr,const CTransaction &tx,uint256 refassetid);
|
int64_t AssetValidateBuyvin(struct CCcontract_info *cp,Eval* eval,int64_t &tmpprice,std::vector<uint8_t> &tmporigpubkey,char *CCaddr,char *origaddr,const CTransaction &tx,uint256 refassetid);
|
||||||
int64_t AssetValidateSellvin(struct CCcontract_info *cp,Eval* eval,int64_t &tmpprice,std::vector<uint8_t> &tmporigpubkey,char *CCaddr,char *origaddr,const CTransaction &tx,uint256 assetid);
|
int64_t AssetValidateSellvin(struct CCcontract_info *cp,Eval* eval,int64_t &tmpprice,std::vector<uint8_t> &tmporigpubkey,char *CCaddr,char *origaddr,const CTransaction &tx,uint256 assetid);
|
||||||
bool AssetExactAmounts(struct CCcontract_info *cp,int64_t &inputs,int32_t starti,int64_t &outputs,Eval* eval,const CTransaction &tx,uint256 assetid);
|
bool AssetExactAmounts(int32_t maxDepth, struct CCcontract_info *cp,int64_t &inputs,int32_t starti,int64_t &outputs,Eval* eval,const CTransaction &tx,uint256 assetid);
|
||||||
|
//bool AssetExactAmounts(bool doValidateTx, struct CCcontract_info *cp, int64_t &inputs, int32_t starti, int64_t &outputs, Eval* eval, const CTransaction &tx, uint256 assetid, std::vector<CTransaction> &ccVinsTxs);
|
||||||
|
|
||||||
// CCassetstx
|
// CCassetstx
|
||||||
int64_t GetAssetBalance(CPubKey pk,uint256 tokenid);
|
int64_t GetAssetBalance(CPubKey pk,uint256 tokenid);
|
||||||
|
|||||||
@@ -342,25 +342,54 @@ bool GetAssetorigaddrs(struct CCcontract_info *cp,char *CCaddr,char *destaddr,co
|
|||||||
else return(false);
|
else return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t IsAssetvout(int64_t &price,std::vector<uint8_t> &origpubkey,const CTransaction& tx,int32_t v,uint256 refassetid)
|
|
||||||
|
// Checks if the vout is a really Asset CC vout
|
||||||
|
// if maxAssetExactAmountDepth > 0, it also validates the vin transaction itself:
|
||||||
|
// it should be either sum(cc vins) == sum(cc vouts) or the transaction is the 'tokenbase' ('c') tx
|
||||||
|
int64_t IsAssetvout(int32_t maxAssetExactAmountDepth, struct CCcontract_info *cp, Eval* eval, int64_t &price,std::vector<uint8_t> &origpubkey,const CTransaction& tx,int32_t v,uint256 refassetid)
|
||||||
{
|
{
|
||||||
uint256 assetid,assetid2; int64_t nValue=0; int32_t n; uint8_t funcid;
|
uint256 assetid,assetid2; int64_t nValue=0; int32_t n; uint8_t funcid;
|
||||||
|
|
||||||
if ( tx.vout[v].scriptPubKey.IsPayToCryptoCondition() != 0 ) // maybe check address too?
|
if ( tx.vout[v].scriptPubKey.IsPayToCryptoCondition() != 0 ) // maybe check address too?
|
||||||
{
|
{
|
||||||
n = tx.vout.size();
|
|
||||||
|
if (maxAssetExactAmountDepth > 0) {
|
||||||
|
//validate all tx
|
||||||
|
int64_t myCCVinsAmount = 0, myCCVoutsAmount = 0;
|
||||||
|
std::vector<CTransaction> ccVinsTxs;
|
||||||
|
|
||||||
|
//std::cerr << "IsAssetvout() validate=yes" << std::endl;
|
||||||
|
const bool validateVinTxs = false;
|
||||||
|
bool isEqualAmounts = AssetExactAmounts(maxAssetExactAmountDepth, cp, myCCVinsAmount, 0, myCCVoutsAmount, eval, tx, refassetid);
|
||||||
|
|
||||||
|
// if ccInputs != ccOutputs and it is not the tokenbase tx means it is possibly fake tx (dimxy):
|
||||||
|
if (!isEqualAmounts && refassetid != tx.GetHash()) { // checking that this is the true tokenbase tx, by verifying that funcid=c, is done further in this function (dimxy)
|
||||||
|
std::cerr << "IsAssetvout() detected bad tx=" << tx.GetHash().GetHex() << ": cc inputs != cc outputs and not the 'tokenbase' tx" << std::endl;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
n = tx.vout.size();
|
||||||
|
if (v >= n - 1) { // just moved this up (dimxy)
|
||||||
|
std::cerr << "isAssetVout() internal err: (v >= n - 1), returning 0" << std::endl;
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
nValue = tx.vout[v].nValue;
|
nValue = tx.vout[v].nValue;
|
||||||
//fprintf(stderr,"CC vout v.%d of n.%d %.8f\n",v,n,(double)nValue/COIN);
|
|
||||||
if ( v >= n-1 )
|
// fprintf(stderr,"IsAssetvout() CC vout v.%d of n=%d amount=%.8f\n",v,n,(double)nValue/COIN);
|
||||||
return(0);
|
|
||||||
if ( (funcid= DecodeAssetOpRet(tx.vout[n-1].scriptPubKey,assetid,assetid2,price,origpubkey)) == 0 )
|
if ( (funcid= DecodeAssetOpRet(tx.vout[n-1].scriptPubKey,assetid,assetid2,price,origpubkey)) == 0 )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"null decodeopret v.%d\n",v);
|
fprintf(stderr,"IsAssetvout() null decodeopret v.%d\n",v);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
else if ( funcid == 'c' )
|
else if ( funcid == 'c' )
|
||||||
{
|
{
|
||||||
if ( refassetid == tx.GetHash() && v == 0 )
|
if (refassetid == tx.GetHash() && v == 0) {
|
||||||
return(nValue);
|
std::cerr << "isAssetVout() this is the tokenbase 'c' tx, txid=" << tx.GetHash().GetHex() << " returning nValue=" << nValue << std::endl;
|
||||||
|
return(nValue);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if ( (funcid == 'b' || funcid == 'B') && v == 0 ) // critical! 'b'/'B' vout0 is NOT asset
|
else if ( (funcid == 'b' || funcid == 'B') && v == 0 ) // critical! 'b'/'B' vout0 is NOT asset
|
||||||
return(0);
|
return(0);
|
||||||
@@ -368,7 +397,7 @@ int64_t IsAssetvout(int64_t &price,std::vector<uint8_t> &origpubkey,const CTrans
|
|||||||
{
|
{
|
||||||
if ( assetid == refassetid )
|
if ( assetid == refassetid )
|
||||||
{
|
{
|
||||||
//fprintf(stderr,"returning %.8f\n",(double)nValue/COIN);
|
fprintf(stderr,"IsAssetvout() returning %.8f\n",(double)nValue/COIN);
|
||||||
return(nValue);
|
return(nValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -443,29 +472,37 @@ int64_t AssetValidateSellvin(struct CCcontract_info *cp,Eval* eval,int64_t &tmpp
|
|||||||
fprintf(stderr,"AssetValidateSellvin\n");
|
fprintf(stderr,"AssetValidateSellvin\n");
|
||||||
if ( (nValue= AssetValidateCCvin(cp,eval,CCaddr,origaddr,tx,1,vinTx)) == 0 )
|
if ( (nValue= AssetValidateCCvin(cp,eval,CCaddr,origaddr,tx,1,vinTx)) == 0 )
|
||||||
return(0);
|
return(0);
|
||||||
if ( (assetoshis= IsAssetvout(tmpprice,tmporigpubkey,vinTx,0,assetid)) == 0 )
|
if ( (assetoshis= IsAssetvout(1, cp, NULL, tmpprice,tmporigpubkey,vinTx,0,assetid)) == 0 )
|
||||||
return eval->Invalid("invalid missing CC vout0 for sellvin");
|
return eval->Invalid("invalid missing CC vout0 for sellvin");
|
||||||
else return(assetoshis);
|
else return(assetoshis);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AssetExactAmounts(struct CCcontract_info *cp,int64_t &inputs,int32_t starti,int64_t &outputs,Eval* eval,const CTransaction &tx,uint256 assetid)
|
|
||||||
|
// overload with additional params for deep tx validation (dimxy)
|
||||||
|
bool AssetExactAmounts(int maxDepth, struct CCcontract_info *cp, int64_t &inputs, int32_t starti, int64_t &outputs, Eval* eval, const CTransaction &tx, uint256 assetid)
|
||||||
{
|
{
|
||||||
CTransaction vinTx; uint256 hashBlock,id,id2; int32_t i,flag,numvins,numvouts; int64_t assetoshis; std::vector<uint8_t> tmporigpubkey; int64_t tmpprice;
|
CTransaction vinTx; uint256 hashBlock,id,id2; int32_t i,flag,numvins,numvouts; int64_t assetoshis; std::vector<uint8_t> tmporigpubkey; int64_t tmpprice;
|
||||||
numvins = tx.vin.size();
|
numvins = tx.vin.size();
|
||||||
numvouts = tx.vout.size();
|
numvouts = tx.vout.size();
|
||||||
inputs = outputs = 0;
|
inputs = outputs = 0;
|
||||||
|
|
||||||
|
maxDepth--;
|
||||||
|
|
||||||
for (i=starti; i<numvins; i++)
|
for (i=starti; i<numvins; i++)
|
||||||
{
|
{
|
||||||
if ( (*cp->ismyvin)(tx.vin[i].scriptSig) != 0 )
|
if ( (*cp->ismyvin)(tx.vin[i].scriptSig) != 0 )
|
||||||
{
|
{
|
||||||
if ( eval->GetTxUnconfirmed(tx.vin[i].prevout.hash,vinTx,hashBlock) == 0 )
|
//std::cerr << "AssetExactAmounts() eval is true=" << (eval != NULL) << " ismyvin=ok for_i=" << i << std::endl;
|
||||||
|
// we are really not inside validation! -- dimxy
|
||||||
|
if ( (eval && eval->GetTxUnconfirmed(tx.vin[i].prevout.hash,vinTx,hashBlock) == 0) || (!eval && !myGetTransaction(tx.vin[i].prevout.hash, vinTx, hashBlock)) )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"i.%d starti.%d numvins.%d\n",i,starti,numvins);
|
fprintf(stderr,"AssetExactAmounts() cannot read vintx i.%d starti.%d numvins.%d\n", i,starti,numvins);
|
||||||
return eval->Invalid("always should find vin, but didnt");
|
return (!eval) ? false : eval->Invalid("always should find vin, but didnt");
|
||||||
}
|
|
||||||
else if ( (assetoshis= IsAssetvout(tmpprice,tmporigpubkey,vinTx,tx.vin[i].prevout.n,assetid)) != 0 )
|
} // false means 'don't go deeper' -- dimxy
|
||||||
|
else if ( (assetoshis= IsAssetvout( maxDepth, cp, eval, tmpprice,tmporigpubkey,vinTx,tx.vin[i].prevout.n,assetid)) != 0 )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"vin%d %llu, ",i,(long long)assetoshis);
|
fprintf(stderr,"AssetExactAmounts() vin%d %llu, ",i,(long long)assetoshis);
|
||||||
inputs += assetoshis;
|
inputs += assetoshis;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -473,33 +510,47 @@ bool AssetExactAmounts(struct CCcontract_info *cp,int64_t &inputs,int32_t starti
|
|||||||
if ( vinTx.vout[i].scriptPubKey.IsPayToCryptoCondition() != 0 && DecodeAssetOpRet(vinTx.vout[vinTx.vout.size()-1].scriptPubKey,id,id2,tmpprice,tmporigpubkey) == 't' && id == assetid )
|
if ( vinTx.vout[i].scriptPubKey.IsPayToCryptoCondition() != 0 && DecodeAssetOpRet(vinTx.vout[vinTx.vout.size()-1].scriptPubKey,id,id2,tmpprice,tmporigpubkey) == 't' && id == assetid )
|
||||||
{
|
{
|
||||||
assetoshis = vinTx.vout[i].nValue;
|
assetoshis = vinTx.vout[i].nValue;
|
||||||
fprintf(stderr,"vin%d %llu special case, ",i,(long long)assetoshis);
|
fprintf(stderr,"AssetExactAmounts() vin%d assetoshis=%llu special case, ",i,(long long)assetoshis);
|
||||||
inputs += assetoshis;
|
inputs += assetoshis;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ( DecodeAssetOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,id,id2,tmpprice,tmporigpubkey) == 't' && id == assetid )
|
if ( DecodeAssetOpRet(tx.vout[tx.vout.size()-1].scriptPubKey,id,id2,tmpprice,tmporigpubkey) == 't' && id == assetid )
|
||||||
flag = 1;
|
flag = 1;
|
||||||
else flag = 0;
|
else flag = 0;
|
||||||
|
|
||||||
for (i=0; i<numvouts; i++)
|
for (i=0; i<numvouts; i++)
|
||||||
{
|
{ // 'false' means 'dont go deep' -- dimxy
|
||||||
if ( (assetoshis= IsAssetvout(tmpprice,tmporigpubkey,tx,i,assetid)) != 0 )
|
if ( (assetoshis= IsAssetvout(maxDepth, cp, eval, tmpprice,tmporigpubkey,tx,i,assetid)) != 0 )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"vout%d %llu, ",i,(long long)assetoshis);
|
fprintf(stderr,"AssetExactAmounts() vout%d assetoshis=%llu, ",i,(long long)assetoshis);
|
||||||
outputs += assetoshis;
|
outputs += assetoshis;
|
||||||
}
|
}
|
||||||
|
// Note: account it only if this is 'transfer' tx -- dimxy
|
||||||
else if ( flag != 0 && tx.vout[i].scriptPubKey.IsPayToCryptoCondition() != 0 )
|
else if ( flag != 0 && tx.vout[i].scriptPubKey.IsPayToCryptoCondition() != 0 )
|
||||||
{
|
{
|
||||||
assetoshis = tx.vout[i].nValue;
|
assetoshis = tx.vout[i].nValue;
|
||||||
fprintf(stderr,"vout%d %llu special case, ",i,(long long)assetoshis);
|
fprintf(stderr,"AssetExactAmounts() vout%d assetoshis=%llu special case, ",i,(long long)assetoshis);
|
||||||
outputs += assetoshis;
|
outputs += assetoshis;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//std::cerr << "AssetExactAmounts() inputs=" << inputs << " outputs=" << outputs << " for txid=" << tx.GetHash().GetHex() << std::endl;
|
||||||
|
|
||||||
if ( inputs != outputs )
|
if ( inputs != outputs )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"inputs %.8f vs %.8f outputs\n",(double)inputs/COIN,(double)outputs/COIN);
|
std::cerr << "AssetExactAmounts() incorrect inputs=" << (double)inputs / COIN << " vs outputs=" << (double)outputs/COIN << " for txid=" << tx.GetHash().GetHex() << std::endl;
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
else return(true);
|
else return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// overload for existing calls of this function (dimxy)
|
||||||
|
/*bool AssetExactAmounts(struct CCcontract_info *cp, int64_t &inputs, int32_t starti, int64_t &outputs, Eval* eval, const CTransaction &tx, uint256 assetid) {
|
||||||
|
std::vector<CTransaction> ccVinsTxs;
|
||||||
|
|
||||||
|
return AssetExactAmounts(true, cp, inputs, starti, outputs, eval, tx, assetid);
|
||||||
|
}*/
|
||||||
@@ -38,25 +38,29 @@ int64_t AddAssetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubK
|
|||||||
Getscriptaddress(destaddr,vintx.vout[vout].scriptPubKey);
|
Getscriptaddress(destaddr,vintx.vout[vout].scriptPubKey);
|
||||||
if ( strcmp(destaddr,coinaddr) != 0 && strcmp(destaddr,cp->unspendableCCaddr) != 0 && strcmp(destaddr,cp->unspendableaddr2) != 0 )
|
if ( strcmp(destaddr,coinaddr) != 0 && strcmp(destaddr,cp->unspendableCCaddr) != 0 && strcmp(destaddr,cp->unspendableaddr2) != 0 )
|
||||||
continue;
|
continue;
|
||||||
fprintf(stderr,"check %s %.8f\n",destaddr,(double)vintx.vout[vout].nValue/COIN);
|
fprintf(stderr,"AddAssetInputs() check destaddress=%s vout amount=%.8f\n",destaddr,(double)vintx.vout[vout].nValue/COIN);
|
||||||
if ( (nValue= IsAssetvout(price,origpubkey,vintx,vout,assetid)) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 )
|
if ( (nValue= IsAssetvout(1, cp, NULL, price,origpubkey,vintx,vout,assetid)) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 )
|
||||||
{
|
{
|
||||||
if ( total != 0 && maxinputs != 0 )
|
if ( total != 0 && maxinputs != 0 )
|
||||||
mtx.vin.push_back(CTxIn(txid,vout,CScript()));
|
mtx.vin.push_back(CTxIn(txid,vout,CScript()));
|
||||||
nValue = it->second.satoshis;
|
nValue = it->second.satoshis;
|
||||||
totalinputs += nValue;
|
totalinputs += nValue;
|
||||||
|
//std::cerr << "AddAssetInputs() adding input nValue=" << nValue << std::endl;
|
||||||
n++;
|
n++;
|
||||||
if ( (total > 0 && totalinputs >= total) || (maxinputs > 0 && n >= maxinputs) )
|
if ( (total > 0 && totalinputs >= total) || (maxinputs > 0 && n >= maxinputs) )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//std::cerr << "AddAssetInputs() found totalinputs=" << totalinputs << std::endl;
|
||||||
return(totalinputs);
|
return(totalinputs);
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t GetAssetBalance(CPubKey pk,uint256 tokenid)
|
int64_t GetAssetBalance(CPubKey pk,uint256 tokenid)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
struct CCcontract_info *cp,C;
|
||||||
cp = CCinit(&C,EVAL_ASSETS);
|
cp = CCinit(&C,EVAL_ASSETS);
|
||||||
return(AddAssetInputs(cp,mtx,pk,tokenid,0,0));
|
return(AddAssetInputs(cp,mtx,pk,tokenid,0,0));
|
||||||
}
|
}
|
||||||
@@ -186,7 +190,8 @@ UniValue AssetOrders(uint256 refassetid)
|
|||||||
|
|
||||||
std::string CreateAsset(int64_t txfee,int64_t assetsupply,std::string name,std::string description)
|
std::string CreateAsset(int64_t txfee,int64_t assetsupply,std::string name,std::string description)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk; struct CCcontract_info *cp,C;
|
||||||
if ( assetsupply < 0 )
|
if ( assetsupply < 0 )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"negative assetsupply %lld\n",(long long)assetsupply);
|
fprintf(stderr,"negative assetsupply %lld\n",(long long)assetsupply);
|
||||||
@@ -212,7 +217,8 @@ std::string CreateAsset(int64_t txfee,int64_t assetsupply,std::string name,std::
|
|||||||
|
|
||||||
std::string AssetTransfer(int64_t txfee,uint256 assetid,std::vector<uint8_t> destpubkey,int64_t total)
|
std::string AssetTransfer(int64_t txfee,uint256 assetid,std::vector<uint8_t> destpubkey,int64_t total)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk; uint64_t mask; int64_t CCchange=0,inputs=0; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk; uint64_t mask; int64_t CCchange=0,inputs=0; struct CCcontract_info *cp,C;
|
||||||
if ( total < 0 )
|
if ( total < 0 )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"negative total %lld\n",(long long)total);
|
fprintf(stderr,"negative total %lld\n",(long long)total);
|
||||||
@@ -222,7 +228,7 @@ std::string AssetTransfer(int64_t txfee,uint256 assetid,std::vector<uint8_t> des
|
|||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
mypk = pubkey2pk(Mypubkey());
|
mypk = pubkey2pk(Mypubkey());
|
||||||
if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 )
|
if ( AddNormalinputs(mtx,mypk,txfee,3) > 0 )
|
||||||
{
|
{
|
||||||
/*n = outputs.size();
|
/*n = outputs.size();
|
||||||
if ( n == amounts.size() )
|
if ( n == amounts.size() )
|
||||||
@@ -232,6 +238,11 @@ std::string AssetTransfer(int64_t txfee,uint256 assetid,std::vector<uint8_t> des
|
|||||||
mask = ~((1LL << mtx.vin.size()) - 1);
|
mask = ~((1LL << mtx.vin.size()) - 1);
|
||||||
if ( (inputs= AddAssetInputs(cp,mtx,mypk,assetid,total,60)) > 0 )
|
if ( (inputs= AddAssetInputs(cp,mtx,mypk,assetid,total,60)) > 0 )
|
||||||
{
|
{
|
||||||
|
|
||||||
|
if (inputs < total) { //added dimxy
|
||||||
|
std::cerr << "AssetTransfer(): insufficient funds" << std::endl;
|
||||||
|
return ("");
|
||||||
|
}
|
||||||
if ( inputs > total )
|
if ( inputs > total )
|
||||||
CCchange = (inputs - total);
|
CCchange = (inputs - total);
|
||||||
//for (i=0; i<n; i++)
|
//for (i=0; i<n; i++)
|
||||||
@@ -247,7 +258,8 @@ std::string AssetTransfer(int64_t txfee,uint256 assetid,std::vector<uint8_t> des
|
|||||||
|
|
||||||
std::string AssetConvert(int64_t txfee,uint256 assetid,std::vector<uint8_t> destpubkey,int64_t total,int32_t evalcode)
|
std::string AssetConvert(int64_t txfee,uint256 assetid,std::vector<uint8_t> destpubkey,int64_t total,int32_t evalcode)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk; int64_t CCchange=0,inputs=0; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk; int64_t CCchange=0,inputs=0; struct CCcontract_info *cp,C;
|
||||||
if ( total < 0 )
|
if ( total < 0 )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"negative total %lld\n",(long long)total);
|
fprintf(stderr,"negative total %lld\n",(long long)total);
|
||||||
@@ -257,7 +269,7 @@ std::string AssetConvert(int64_t txfee,uint256 assetid,std::vector<uint8_t> dest
|
|||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
mypk = pubkey2pk(Mypubkey());
|
mypk = pubkey2pk(Mypubkey());
|
||||||
if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 )
|
if ( AddNormalinputs(mtx,mypk,txfee,3) > 0 )
|
||||||
{
|
{
|
||||||
if ( (inputs= AddAssetInputs(cp,mtx,mypk,assetid,total,60)) > 0 )
|
if ( (inputs= AddAssetInputs(cp,mtx,mypk,assetid,total,60)) > 0 )
|
||||||
{
|
{
|
||||||
@@ -273,7 +285,8 @@ std::string AssetConvert(int64_t txfee,uint256 assetid,std::vector<uint8_t> dest
|
|||||||
|
|
||||||
std::string CreateBuyOffer(int64_t txfee,int64_t bidamount,uint256 assetid,int64_t pricetotal)
|
std::string CreateBuyOffer(int64_t txfee,int64_t bidamount,uint256 assetid,int64_t pricetotal)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk; struct CCcontract_info *cp,C; uint256 hashBlock; CTransaction vintx; std::vector<uint8_t> origpubkey; std::string name,description;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk; struct CCcontract_info *cp,C; uint256 hashBlock; CTransaction vintx; std::vector<uint8_t> origpubkey; std::string name,description;
|
||||||
if ( bidamount < 0 || pricetotal < 0 )
|
if ( bidamount < 0 || pricetotal < 0 )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"negative bidamount %lld, pricetotal %lld\n",(long long)bidamount,(long long)pricetotal);
|
fprintf(stderr,"negative bidamount %lld, pricetotal %lld\n",(long long)bidamount,(long long)pricetotal);
|
||||||
@@ -303,7 +316,11 @@ std::string CreateBuyOffer(int64_t txfee,int64_t bidamount,uint256 assetid,int64
|
|||||||
|
|
||||||
std::string CreateSell(int64_t txfee,int64_t askamount,uint256 assetid,int64_t pricetotal)
|
std::string CreateSell(int64_t txfee,int64_t askamount,uint256 assetid,int64_t pricetotal)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk; uint64_t mask; int64_t inputs,CCchange; CScript opret; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk; uint64_t mask; int64_t inputs,CCchange; CScript opret; struct CCcontract_info *cp,C;
|
||||||
|
|
||||||
|
//std::cerr << "CreateSell() askamount=" << askamount << " pricetotal=" << pricetotal << std::endl;
|
||||||
|
|
||||||
if ( askamount < 0 || pricetotal < 0 )
|
if ( askamount < 0 || pricetotal < 0 )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"negative askamount %lld, askamount %lld\n",(long long)pricetotal,(long long)askamount);
|
fprintf(stderr,"negative askamount %lld, askamount %lld\n",(long long)pricetotal,(long long)askamount);
|
||||||
@@ -313,13 +330,17 @@ std::string CreateSell(int64_t txfee,int64_t askamount,uint256 assetid,int64_t p
|
|||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
mypk = pubkey2pk(Mypubkey());
|
mypk = pubkey2pk(Mypubkey());
|
||||||
if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 )
|
if ( AddNormalinputs(mtx,mypk,txfee,3) > 0 )
|
||||||
{
|
{
|
||||||
mask = ~((1LL << mtx.vin.size()) - 1);
|
mask = ~((1LL << mtx.vin.size()) - 1);
|
||||||
if ( (inputs= AddAssetInputs(cp,mtx,mypk,assetid,askamount,60)) > 0 )
|
if ( (inputs= AddAssetInputs(cp,mtx,mypk,assetid,askamount,60)) > 0 )
|
||||||
{
|
{
|
||||||
if ( inputs < askamount )
|
if (inputs < askamount) {
|
||||||
askamount = inputs;
|
//askamount = inputs;
|
||||||
|
std::cerr << "CreateSell(): insufficient tokens for ask" << std::endl;
|
||||||
|
return ("");
|
||||||
|
}
|
||||||
|
|
||||||
mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,askamount,GetUnspendable(cp,0)));
|
mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,askamount,GetUnspendable(cp,0)));
|
||||||
if ( inputs > askamount )
|
if ( inputs > askamount )
|
||||||
CCchange = (inputs - askamount);
|
CCchange = (inputs - askamount);
|
||||||
@@ -327,15 +348,21 @@ std::string CreateSell(int64_t txfee,int64_t askamount,uint256 assetid,int64_t p
|
|||||||
mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,mypk));
|
mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,mypk));
|
||||||
opret = EncodeAssetOpRet('s',assetid,zeroid,pricetotal,Mypubkey());
|
opret = EncodeAssetOpRet('s',assetid,zeroid,pricetotal,Mypubkey());
|
||||||
return(FinalizeCCTx(mask,cp,mtx,mypk,txfee,opret));
|
return(FinalizeCCTx(mask,cp,mtx,mypk,txfee,opret));
|
||||||
} else fprintf(stderr,"need some assets to place ask\n");
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "need some assets to place ask\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fprintf(stderr,"need some native coins to place ask\n");
|
else { // dimxy added 'else', because it was misleading message before
|
||||||
|
fprintf(stderr, "need some native coins to place ask\n");
|
||||||
|
}
|
||||||
return("");
|
return("");
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string CreateSwap(int64_t txfee,int64_t askamount,uint256 assetid,uint256 assetid2,int64_t pricetotal)
|
std::string CreateSwap(int64_t txfee,int64_t askamount,uint256 assetid,uint256 assetid2,int64_t pricetotal)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk; uint64_t mask; int64_t inputs,CCchange; CScript opret; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk; uint64_t mask; int64_t inputs,CCchange; CScript opret; struct CCcontract_info *cp,C;
|
||||||
fprintf(stderr,"asset swaps disabled\n");
|
fprintf(stderr,"asset swaps disabled\n");
|
||||||
return("");
|
return("");
|
||||||
if ( askamount < 0 || pricetotal < 0 )
|
if ( askamount < 0 || pricetotal < 0 )
|
||||||
@@ -347,7 +374,7 @@ std::string CreateSwap(int64_t txfee,int64_t askamount,uint256 assetid,uint256 a
|
|||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
mypk = pubkey2pk(Mypubkey());
|
mypk = pubkey2pk(Mypubkey());
|
||||||
if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 )
|
if ( AddNormalinputs(mtx,mypk,txfee,3) > 0 )
|
||||||
{
|
{
|
||||||
mask = ~((1LL << mtx.vin.size()) - 1);
|
mask = ~((1LL << mtx.vin.size()) - 1);
|
||||||
if ( (inputs= AddAssetInputs(cp,mtx,mypk,assetid,askamount,60)) > 0 )
|
if ( (inputs= AddAssetInputs(cp,mtx,mypk,assetid,askamount,60)) > 0 )
|
||||||
@@ -366,20 +393,27 @@ std::string CreateSwap(int64_t txfee,int64_t askamount,uint256 assetid,uint256 a
|
|||||||
opret = EncodeAssetOpRet('e',assetid,assetid2,pricetotal,Mypubkey());
|
opret = EncodeAssetOpRet('e',assetid,assetid2,pricetotal,Mypubkey());
|
||||||
}
|
}
|
||||||
return(FinalizeCCTx(mask,cp,mtx,mypk,txfee,opret));
|
return(FinalizeCCTx(mask,cp,mtx,mypk,txfee,opret));
|
||||||
} else fprintf(stderr,"need some assets to place ask\n");
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "need some assets to place ask\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fprintf(stderr,"need some native coins to place ask\n");
|
else { // dimxy added 'else', because it was misleading message before
|
||||||
|
fprintf(stderr,"need some native coins to place ask\n");
|
||||||
|
}
|
||||||
|
|
||||||
return("");
|
return("");
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string CancelBuyOffer(int64_t txfee,uint256 assetid,uint256 bidtxid)
|
std::string CancelBuyOffer(int64_t txfee,uint256 assetid,uint256 bidtxid)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CTransaction vintx; uint64_t mask; uint256 hashBlock; int64_t bidamount; CPubKey mypk; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CTransaction vintx; uint64_t mask; uint256 hashBlock; int64_t bidamount; CPubKey mypk; struct CCcontract_info *cp,C;
|
||||||
cp = CCinit(&C,EVAL_ASSETS);
|
cp = CCinit(&C,EVAL_ASSETS);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
mypk = pubkey2pk(Mypubkey());
|
mypk = pubkey2pk(Mypubkey());
|
||||||
if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 )
|
if ( AddNormalinputs(mtx,mypk,txfee,3) > 0 )
|
||||||
{
|
{
|
||||||
mask = ~((1LL << mtx.vin.size()) - 1);
|
mask = ~((1LL << mtx.vin.size()) - 1);
|
||||||
if ( GetTransaction(bidtxid,vintx,hashBlock,false) != 0 )
|
if ( GetTransaction(bidtxid,vintx,hashBlock,false) != 0 )
|
||||||
@@ -395,12 +429,13 @@ std::string CancelBuyOffer(int64_t txfee,uint256 assetid,uint256 bidtxid)
|
|||||||
|
|
||||||
std::string CancelSell(int64_t txfee,uint256 assetid,uint256 asktxid)
|
std::string CancelSell(int64_t txfee,uint256 assetid,uint256 asktxid)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CTransaction vintx; uint64_t mask; uint256 hashBlock; int64_t askamount; CPubKey mypk; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CTransaction vintx; uint64_t mask; uint256 hashBlock; int64_t askamount; CPubKey mypk; struct CCcontract_info *cp,C;
|
||||||
cp = CCinit(&C,EVAL_ASSETS);
|
cp = CCinit(&C,EVAL_ASSETS);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
mypk = pubkey2pk(Mypubkey());
|
mypk = pubkey2pk(Mypubkey());
|
||||||
if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 )
|
if ( AddNormalinputs(mtx,mypk,txfee,3) > 0 )
|
||||||
{
|
{
|
||||||
mask = ~((1LL << mtx.vin.size()) - 1);
|
mask = ~((1LL << mtx.vin.size()) - 1);
|
||||||
if ( GetTransaction(asktxid,vintx,hashBlock,false) != 0 )
|
if ( GetTransaction(asktxid,vintx,hashBlock,false) != 0 )
|
||||||
@@ -416,7 +451,8 @@ std::string CancelSell(int64_t txfee,uint256 assetid,uint256 asktxid)
|
|||||||
|
|
||||||
std::string FillBuyOffer(int64_t txfee,uint256 assetid,uint256 bidtxid,int64_t fillamount)
|
std::string FillBuyOffer(int64_t txfee,uint256 assetid,uint256 bidtxid,int64_t fillamount)
|
||||||
{
|
{
|
||||||
CTransaction vintx; uint256 hashBlock; CMutableTransaction mtx; CPubKey mypk; std::vector<uint8_t> origpubkey; int32_t bidvout=0; uint64_t mask; int64_t origprice,bidamount,paid_amount,remaining_required,inputs,CCchange=0; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CTransaction vintx; uint256 hashBlock; CPubKey mypk; std::vector<uint8_t> origpubkey; int32_t bidvout=0; uint64_t mask; int64_t origprice,bidamount,paid_amount,remaining_required,inputs,CCchange=0; struct CCcontract_info *cp,C;
|
||||||
if ( fillamount < 0 )
|
if ( fillamount < 0 )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"negative fillamount %lld\n",(long long)fillamount);
|
fprintf(stderr,"negative fillamount %lld\n",(long long)fillamount);
|
||||||
@@ -426,7 +462,7 @@ std::string FillBuyOffer(int64_t txfee,uint256 assetid,uint256 bidtxid,int64_t f
|
|||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
mypk = pubkey2pk(Mypubkey());
|
mypk = pubkey2pk(Mypubkey());
|
||||||
if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 )
|
if ( AddNormalinputs(mtx,mypk,txfee,3) > 0 )
|
||||||
{
|
{
|
||||||
mask = ~((1LL << mtx.vin.size()) - 1);
|
mask = ~((1LL << mtx.vin.size()) - 1);
|
||||||
if ( GetTransaction(bidtxid,vintx,hashBlock,false) != 0 )
|
if ( GetTransaction(bidtxid,vintx,hashBlock,false) != 0 )
|
||||||
@@ -456,7 +492,8 @@ std::string FillBuyOffer(int64_t txfee,uint256 assetid,uint256 bidtxid,int64_t f
|
|||||||
|
|
||||||
std::string FillSell(int64_t txfee,uint256 assetid,uint256 assetid2,uint256 asktxid,int64_t fillunits)
|
std::string FillSell(int64_t txfee,uint256 assetid,uint256 assetid2,uint256 asktxid,int64_t fillunits)
|
||||||
{
|
{
|
||||||
CTransaction vintx,filltx; uint256 hashBlock; CMutableTransaction mtx; CPubKey mypk; std::vector<uint8_t> origpubkey; double dprice; uint64_t mask; int32_t askvout=0; int64_t received_assetoshis,total_nValue,orig_assetoshis,paid_nValue,remaining_nValue,inputs,CCchange=0; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CTransaction vintx,filltx; uint256 hashBlock; CPubKey mypk; std::vector<uint8_t> origpubkey; double dprice; uint64_t mask; int32_t askvout=0; int64_t received_assetoshis,total_nValue,orig_assetoshis,paid_nValue,remaining_nValue,inputs,CCchange=0; struct CCcontract_info *cp,C;
|
||||||
if ( fillunits < 0 )
|
if ( fillunits < 0 )
|
||||||
{
|
{
|
||||||
CCerror = strprintf("negative fillunits %lld\n",(long long)fillunits);
|
CCerror = strprintf("negative fillunits %lld\n",(long long)fillunits);
|
||||||
@@ -474,7 +511,7 @@ std::string FillSell(int64_t txfee,uint256 assetid,uint256 assetid2,uint256 askt
|
|||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
mypk = pubkey2pk(Mypubkey());
|
mypk = pubkey2pk(Mypubkey());
|
||||||
if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 )
|
if ( AddNormalinputs(mtx,mypk,txfee,3) > 0 )
|
||||||
{
|
{
|
||||||
mask = ~((1LL << mtx.vin.size()) - 1);
|
mask = ~((1LL << mtx.vin.size()) - 1);
|
||||||
if ( GetTransaction(asktxid,vintx,hashBlock,false) != 0 )
|
if ( GetTransaction(asktxid,vintx,hashBlock,false) != 0 )
|
||||||
|
|||||||
@@ -57,9 +57,12 @@ extern char ASSETCHAINS_SYMBOL[];
|
|||||||
extern std::string CCerror;
|
extern std::string CCerror;
|
||||||
|
|
||||||
#define SMALLVAL 0.000000000000001
|
#define SMALLVAL 0.000000000000001
|
||||||
#define MIN_NOTARIZATION_CONFIRMS 2
|
#ifndef _BITS256
|
||||||
union _bits256 { uint8_t bytes[32]; uint16_t ushorts[16]; uint32_t uints[8]; uint64_t ulongs[4]; uint64_t txid; };
|
#define _BITS256
|
||||||
typedef union _bits256 bits256;
|
union _bits256 { uint8_t bytes[32]; uint16_t ushorts[16]; uint32_t uints[8]; uint64_t ulongs[4]; uint64_t txid; };
|
||||||
|
typedef union _bits256 bits256;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
struct CC_utxo
|
struct CC_utxo
|
||||||
{
|
{
|
||||||
@@ -102,6 +105,7 @@ extern CWallet* pwalletMain;
|
|||||||
#endif
|
#endif
|
||||||
bool GetAddressUnspent(uint160 addressHash, int type,std::vector<std::pair<CAddressUnspentKey,CAddressUnspentValue> > &unspentOutputs);
|
bool GetAddressUnspent(uint160 addressHash, int type,std::vector<std::pair<CAddressUnspentKey,CAddressUnspentValue> > &unspentOutputs);
|
||||||
CBlockIndex *komodo_getblockindex(uint256 hash);
|
CBlockIndex *komodo_getblockindex(uint256 hash);
|
||||||
|
int32_t komodo_nextheight();
|
||||||
|
|
||||||
static const uint256 zeroid;
|
static const uint256 zeroid;
|
||||||
bool myGetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock);
|
bool myGetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock);
|
||||||
@@ -167,13 +171,14 @@ bool Getscriptaddress(char *destaddr,const CScript &scriptPubKey);
|
|||||||
std::vector<uint8_t> Mypubkey();
|
std::vector<uint8_t> Mypubkey();
|
||||||
bool Myprivkey(uint8_t myprivkey[]);
|
bool Myprivkey(uint8_t myprivkey[]);
|
||||||
int64_t CCduration(int32_t &numblocks,uint256 txid);
|
int64_t CCduration(int32_t &numblocks,uint256 txid);
|
||||||
bool isCCTxNotarizedConfirmed(uint256 txid);
|
bool komodo_txnotarizedconfirmed(uint256 txid);
|
||||||
// CCtx
|
// CCtx
|
||||||
bool SignTx(CMutableTransaction &mtx,int32_t vini,int64_t utxovalue,const CScript scriptPubKey);
|
bool SignTx(CMutableTransaction &mtx,int32_t vini,int64_t utxovalue,const CScript scriptPubKey);
|
||||||
std::string FinalizeCCTx(uint64_t skipmask,struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey mypk,uint64_t txfee,CScript opret);
|
std::string FinalizeCCTx(uint64_t skipmask,struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey mypk,uint64_t txfee,CScript opret);
|
||||||
void SetCCunspents(std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > &unspentOutputs,char *coinaddr);
|
void SetCCunspents(std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > &unspentOutputs,char *coinaddr);
|
||||||
void SetCCtxids(std::vector<std::pair<CAddressIndexKey, CAmount> > &addressIndex,char *coinaddr);
|
void SetCCtxids(std::vector<std::pair<CAddressIndexKey, CAmount> > &addressIndex,char *coinaddr);
|
||||||
int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int32_t maxinputs);
|
int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int32_t maxinputs);
|
||||||
|
int64_t AddNormalinputs2(CMutableTransaction &mtx,int64_t total,int32_t maxinputs);
|
||||||
int64_t CCutxovalue(char *coinaddr,uint256 utxotxid,int32_t utxovout);
|
int64_t CCutxovalue(char *coinaddr,uint256 utxotxid,int32_t utxovout);
|
||||||
|
|
||||||
// curve25519 and sha256
|
// curve25519 and sha256
|
||||||
|
|||||||
@@ -431,3 +431,92 @@ int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int3
|
|||||||
#endif
|
#endif
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int64_t AddNormalinputs2(CMutableTransaction &mtx,int64_t total,int32_t maxinputs)
|
||||||
|
{
|
||||||
|
int32_t abovei,belowi,ind,vout,i,n = 0,maxutxos=64; int64_t sum,threshold,above,below; int64_t remains,nValue,totalinputs = 0; char coinaddr[64]; uint256 txid,hashBlock; CTransaction tx; struct CC_utxo *utxos,*up;
|
||||||
|
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs;
|
||||||
|
utxos = (struct CC_utxo *)calloc(maxutxos,sizeof(*utxos));
|
||||||
|
threshold = total/(maxinputs+1);
|
||||||
|
if ( maxinputs > maxutxos )
|
||||||
|
maxutxos = maxinputs;
|
||||||
|
sum = 0;
|
||||||
|
Getscriptaddress(coinaddr,CScript() << Mypubkey() << OP_CHECKSIG);
|
||||||
|
SetCCunspents(unspentOutputs,coinaddr);
|
||||||
|
for (std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++)
|
||||||
|
{
|
||||||
|
txid = it->first.txhash;
|
||||||
|
vout = (int32_t)it->first.index;
|
||||||
|
if ( it->second.satoshis < threshold )
|
||||||
|
continue;
|
||||||
|
if ( myGetTransaction(txid,tx,hashBlock) != 0 && tx.vout.size() > 0 && vout < tx.vout.size() && tx.vout[vout].scriptPubKey.IsPayToCryptoCondition() == 0 )
|
||||||
|
{
|
||||||
|
//fprintf(stderr,"check %.8f to vins array.%d of %d %s/v%d\n",(double)out.tx->vout[out.i].nValue/COIN,n,maxutxos,txid.GetHex().c_str(),(int32_t)vout);
|
||||||
|
if ( mtx.vin.size() > 0 )
|
||||||
|
{
|
||||||
|
for (i=0; i<mtx.vin.size(); i++)
|
||||||
|
if ( txid == mtx.vin[i].prevout.hash && vout == mtx.vin[i].prevout.n )
|
||||||
|
break;
|
||||||
|
if ( i != mtx.vin.size() )
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ( n > 0 )
|
||||||
|
{
|
||||||
|
for (i=0; i<n; i++)
|
||||||
|
if ( txid == utxos[i].txid && vout == utxos[i].vout )
|
||||||
|
break;
|
||||||
|
if ( i != n )
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ( myIsutxo_spentinmempool(txid,vout) == 0 )
|
||||||
|
{
|
||||||
|
up = &utxos[n++];
|
||||||
|
up->txid = txid;
|
||||||
|
up->nValue = it->second.satoshis;
|
||||||
|
up->vout = vout;
|
||||||
|
sum += up->nValue;
|
||||||
|
//fprintf(stderr,"add %.8f to vins array.%d of %d\n",(double)up->nValue/COIN,n,maxutxos);
|
||||||
|
if ( n >= maxutxos || sum >= total )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
remains = total;
|
||||||
|
for (i=0; i<maxinputs && n>0; i++)
|
||||||
|
{
|
||||||
|
below = above = 0;
|
||||||
|
abovei = belowi = -1;
|
||||||
|
if ( CC_vinselect(&abovei,&above,&belowi,&below,utxos,n,remains) < 0 )
|
||||||
|
{
|
||||||
|
printf("error finding unspent i.%d of %d, %.8f vs %.8f\n",i,n,(double)remains/COIN,(double)total/COIN);
|
||||||
|
free(utxos);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
if ( belowi < 0 || abovei >= 0 )
|
||||||
|
ind = abovei;
|
||||||
|
else ind = belowi;
|
||||||
|
if ( ind < 0 )
|
||||||
|
{
|
||||||
|
printf("error finding unspent i.%d of %d, %.8f vs %.8f, abovei.%d belowi.%d ind.%d\n",i,n,(double)remains/COIN,(double)total/COIN,abovei,belowi,ind);
|
||||||
|
free(utxos);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
up = &utxos[ind];
|
||||||
|
mtx.vin.push_back(CTxIn(up->txid,up->vout,CScript()));
|
||||||
|
totalinputs += up->nValue;
|
||||||
|
remains -= up->nValue;
|
||||||
|
utxos[ind] = utxos[--n];
|
||||||
|
memset(&utxos[n],0,sizeof(utxos[n]));
|
||||||
|
//fprintf(stderr,"totalinputs %.8f vs total %.8f i.%d vs max.%d\n",(double)totalinputs/COIN,(double)total/COIN,i,maxinputs);
|
||||||
|
if ( totalinputs >= total || (i+1) >= maxinputs )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
free(utxos);
|
||||||
|
if ( totalinputs >= total )
|
||||||
|
{
|
||||||
|
//fprintf(stderr,"return totalinputs %.8f\n",(double)totalinputs/COIN);
|
||||||
|
return(totalinputs);
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|||||||
@@ -13,11 +13,20 @@
|
|||||||
* *
|
* *
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
#include "CCinclude.h"
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
CCutils has low level functions that are universally useful for all contracts.
|
CCutils has low level functions that are universally useful for all contracts.
|
||||||
*/
|
*/
|
||||||
|
#include "CCinclude.h"
|
||||||
|
#include "komodo_structs.h"
|
||||||
|
|
||||||
|
#ifdef TESTMODE
|
||||||
|
#define MIN_NON_NOTARIZED_CONFIRMS 2
|
||||||
|
#else
|
||||||
|
#define MIN_NON_NOTARIZED_CONFIRMS 101
|
||||||
|
#endif // TESTMODE
|
||||||
|
int32_t komodo_dpowconfs(int32_t height,int32_t numconfs);
|
||||||
|
struct komodo_state *komodo_stateptr(char *symbol,char *dest);
|
||||||
|
extern uint32_t KOMODO_DPOWCONFS;
|
||||||
|
|
||||||
void endiancpy(uint8_t *dest,uint8_t *src,int32_t len)
|
void endiancpy(uint8_t *dest,uint8_t *src,int32_t len)
|
||||||
{
|
{
|
||||||
@@ -453,12 +462,43 @@ int64_t CCduration(int32_t &numblocks,uint256 txid)
|
|||||||
return(duration);
|
return(duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isCCTxNotarizedConfirmed(uint256 txid)
|
bool komodo_txnotarizedconfirmed(uint256 txid)
|
||||||
{
|
{
|
||||||
int32_t confirms;
|
char str[65];
|
||||||
|
uint32_t confirms,notarized=0,txheight;
|
||||||
|
CTransaction tx;
|
||||||
|
uint256 hashBlock;
|
||||||
|
CBlockIndex *pindex;
|
||||||
|
char symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; struct komodo_state *sp;
|
||||||
|
|
||||||
CCduration(confirms,txid);
|
if ( myGetTransaction(txid,tx,hashBlock) == 0 )
|
||||||
if (confirms >= MIN_NOTARIZATION_CONFIRMS)
|
{
|
||||||
|
fprintf(stderr,"komodo_txnotarizedconfirmed cant find txid %s\n",txid.ToString().c_str());
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
else if ( hashBlock == zeroid )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"komodo_txnotarizedconfirmed no hashBlock for txid %s\n",txid.ToString().c_str());
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
else if ( (pindex= mapBlockIndex[hashBlock]) == 0 || (txheight= pindex->GetHeight()) <= 0 )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"komodo_txnotarizedconfirmed no txheight.%d %p for txid %s\n",txheight,pindex,txid.ToString().c_str());
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
else if ( (pindex= chainActive.LastTip()) == 0 || pindex->GetHeight() < txheight )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"komodo_txnotarizedconfirmed backwards heights for txid %s hts.(%d %d)\n",txid.ToString().c_str(),txheight,(int32_t)pindex->GetHeight());
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
confirms=1 + pindex->GetHeight() - txheight;
|
||||||
|
if ((sp= komodo_stateptr(symbol,dest)) != 0 && (notarized=sp->NOTARIZED_HEIGHT) > 0 && txheight > sp->NOTARIZED_HEIGHT) notarized=0;
|
||||||
|
#ifdef TESTMODE
|
||||||
|
notarized=0;
|
||||||
|
#endif //TESTMODE
|
||||||
|
if (notarized>0 && confirms > 1)
|
||||||
|
return (true);
|
||||||
|
else if (notarized==0 && confirms >= MIN_NON_NOTARIZED_CONFIRMS)
|
||||||
return (true);
|
return (true);
|
||||||
return (false);
|
return (false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -129,6 +129,10 @@
|
|||||||
vout.n-1: opreturn [EVAL_ASSETS] ['E'] [assetid vin0+1] [assetid vin2] [remaining asset2 required] [origpubkey]
|
vout.n-1: opreturn [EVAL_ASSETS] ['E'] [assetid vin0+1] [assetid vin2] [remaining asset2 required] [origpubkey]
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// tx validation
|
||||||
bool AssetsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn)
|
bool AssetsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx, uint32_t nIn)
|
||||||
{
|
{
|
||||||
static uint256 zero;
|
static uint256 zero;
|
||||||
@@ -155,9 +159,11 @@ bool AssetsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx
|
|||||||
else starti = 1;
|
else starti = 1;
|
||||||
if ( assetid == zero )
|
if ( assetid == zero )
|
||||||
return eval->Invalid("illegal assetid");
|
return eval->Invalid("illegal assetid");
|
||||||
else if ( AssetExactAmounts(cp,inputs,starti,outputs,eval,tx,assetid) == false )
|
else if ( AssetExactAmounts(2, cp,inputs,starti,outputs,eval,tx,assetid) == false )
|
||||||
return eval->Invalid("asset inputs != outputs");
|
return eval->Invalid("asset inputs != outputs");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
switch ( funcid )
|
switch ( funcid )
|
||||||
{
|
{
|
||||||
case 'c': // create wont be called to be verified as it has no CC inputs
|
case 'c': // create wont be called to be verified as it has no CC inputs
|
||||||
@@ -321,7 +327,7 @@ bool AssetsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx
|
|||||||
}
|
}
|
||||||
fprintf(stderr,"fill validated\n");
|
fprintf(stderr,"fill validated\n");
|
||||||
break;
|
break;
|
||||||
case 'E': // fillexchange
|
case 'E': // fillexchange
|
||||||
return eval->Invalid("unexpected assets fillexchange funcid");
|
return eval->Invalid("unexpected assets fillexchange funcid");
|
||||||
break; // disable asset swaps
|
break; // disable asset swaps
|
||||||
//vin.0: normal input
|
//vin.0: normal input
|
||||||
@@ -333,7 +339,7 @@ bool AssetsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx
|
|||||||
//vout.3: CC output for asset2 change (if any)
|
//vout.3: CC output for asset2 change (if any)
|
||||||
//vout.3/4: normal output for change (if any)
|
//vout.3/4: normal output for change (if any)
|
||||||
//vout.n-1: opreturn [EVAL_ASSETS] ['E'] [assetid vin0+1] [assetid vin2] [remaining asset2 required] [origpubkey]
|
//vout.n-1: opreturn [EVAL_ASSETS] ['E'] [assetid vin0+1] [assetid vin2] [remaining asset2 required] [origpubkey]
|
||||||
if ( AssetExactAmounts(cp,inputs,1,outputs,eval,tx,assetid2) == false )
|
if ( AssetExactAmounts(1, cp,inputs,1,outputs,eval,tx,assetid2) == false )
|
||||||
eval->Invalid("asset2 inputs != outputs");
|
eval->Invalid("asset2 inputs != outputs");
|
||||||
if ( (assetoshis= AssetValidateSellvin(cp,eval,totalunits,tmporigpubkey,CCaddr,origaddr,tx,assetid)) == 0 )
|
if ( (assetoshis= AssetValidateSellvin(cp,eval,totalunits,tmporigpubkey,CCaddr,origaddr,tx,assetid)) == 0 )
|
||||||
return(false);
|
return(false);
|
||||||
|
|||||||
@@ -150,7 +150,8 @@ int64_t AddAuctionInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPu
|
|||||||
|
|
||||||
std::string AuctionBid(uint64_t txfee,uint256 itemhash,int64_t amount)
|
std::string AuctionBid(uint64_t txfee,uint256 itemhash,int64_t amount)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,Auctionpk; CScript opret; int64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,Auctionpk; CScript opret; int64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C;
|
||||||
cp = CCinit(&C,EVAL_AUCTION);
|
cp = CCinit(&C,EVAL_AUCTION);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
@@ -170,7 +171,8 @@ std::string AuctionBid(uint64_t txfee,uint256 itemhash,int64_t amount)
|
|||||||
|
|
||||||
std::string AuctionDeliver(uint64_t txfee,uint256 itemhash,uint256 bidtxid)
|
std::string AuctionDeliver(uint64_t txfee,uint256 itemhash,uint256 bidtxid)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,Auctionpk; CScript opret; int64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,Auctionpk; CScript opret; int64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C;
|
||||||
cp = CCinit(&C,EVAL_AUCTION);
|
cp = CCinit(&C,EVAL_AUCTION);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
@@ -190,7 +192,8 @@ std::string AuctionDeliver(uint64_t txfee,uint256 itemhash,uint256 bidtxid)
|
|||||||
|
|
||||||
std::string AuctionPost(uint64_t txfee,uint256 itemhash,int64_t minbid,char *title,char *description)
|
std::string AuctionPost(uint64_t txfee,uint256 itemhash,int64_t minbid,char *title,char *description)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,Auctionpk; int64_t funds = 0; CScript opret; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,Auctionpk; int64_t funds = 0; CScript opret; struct CCcontract_info *cp,C;
|
||||||
cp = CCinit(&C,EVAL_AUCTION);
|
cp = CCinit(&C,EVAL_AUCTION);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
#include "cc/utils.h"
|
#include "cc/utils.h"
|
||||||
#include "primitives/transaction.h"
|
#include "primitives/transaction.h"
|
||||||
|
|
||||||
|
int32_t komodo_nextheight();
|
||||||
|
|
||||||
std::vector<CC*> BetProtocol::PlayerConditions()
|
std::vector<CC*> BetProtocol::PlayerConditions()
|
||||||
{
|
{
|
||||||
@@ -53,7 +54,7 @@ CC* BetProtocol::MakeDisputeCond()
|
|||||||
*/
|
*/
|
||||||
CMutableTransaction BetProtocol::MakeSessionTx(CAmount spendFee)
|
CMutableTransaction BetProtocol::MakeSessionTx(CAmount spendFee)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
|
||||||
CC *disputeCond = MakeDisputeCond();
|
CC *disputeCond = MakeDisputeCond();
|
||||||
mtx.vout.push_back(CTxOut(spendFee, CCPubKey(disputeCond)));
|
mtx.vout.push_back(CTxOut(spendFee, CCPubKey(disputeCond)));
|
||||||
@@ -70,7 +71,7 @@ CMutableTransaction BetProtocol::MakeSessionTx(CAmount spendFee)
|
|||||||
|
|
||||||
CMutableTransaction BetProtocol::MakeDisputeTx(uint256 signedSessionTxHash, uint256 vmResultHash)
|
CMutableTransaction BetProtocol::MakeDisputeTx(uint256 signedSessionTxHash, uint256 vmResultHash)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
|
||||||
CC *disputeCond = MakeDisputeCond();
|
CC *disputeCond = MakeDisputeCond();
|
||||||
mtx.vin.push_back(CTxIn(signedSessionTxHash, 0, CScript()));
|
mtx.vin.push_back(CTxIn(signedSessionTxHash, 0, CScript()));
|
||||||
@@ -84,7 +85,7 @@ CMutableTransaction BetProtocol::MakeDisputeTx(uint256 signedSessionTxHash, uint
|
|||||||
CMutableTransaction BetProtocol::MakePostEvidenceTx(uint256 signedSessionTxHash,
|
CMutableTransaction BetProtocol::MakePostEvidenceTx(uint256 signedSessionTxHash,
|
||||||
int playerIdx, std::vector<unsigned char> state)
|
int playerIdx, std::vector<unsigned char> state)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
|
||||||
mtx.vin.push_back(CTxIn(signedSessionTxHash, playerIdx+1, CScript()));
|
mtx.vin.push_back(CTxIn(signedSessionTxHash, playerIdx+1, CScript()));
|
||||||
mtx.vout.push_back(CTxOut(0, CScript() << OP_RETURN << state));
|
mtx.vout.push_back(CTxOut(0, CScript() << OP_RETURN << state));
|
||||||
@@ -115,7 +116,7 @@ CC* BetProtocol::MakePayoutCond(uint256 signedSessionTxHash)
|
|||||||
|
|
||||||
CMutableTransaction BetProtocol::MakeStakeTx(CAmount totalPayout, uint256 signedSessionTxHash)
|
CMutableTransaction BetProtocol::MakeStakeTx(CAmount totalPayout, uint256 signedSessionTxHash)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
|
||||||
CC *payoutCond = MakePayoutCond(signedSessionTxHash);
|
CC *payoutCond = MakePayoutCond(signedSessionTxHash);
|
||||||
mtx.vout.push_back(CTxOut(totalPayout, CCPubKey(payoutCond)));
|
mtx.vout.push_back(CTxOut(totalPayout, CCPubKey(payoutCond)));
|
||||||
@@ -128,7 +129,7 @@ CMutableTransaction BetProtocol::MakeStakeTx(CAmount totalPayout, uint256 signed
|
|||||||
CMutableTransaction BetProtocol::MakeAgreePayoutTx(std::vector<CTxOut> payouts,
|
CMutableTransaction BetProtocol::MakeAgreePayoutTx(std::vector<CTxOut> payouts,
|
||||||
uint256 signedStakeTxHash)
|
uint256 signedStakeTxHash)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
mtx.vin.push_back(CTxIn(signedStakeTxHash, 0, CScript()));
|
mtx.vin.push_back(CTxIn(signedStakeTxHash, 0, CScript()));
|
||||||
mtx.vout = payouts;
|
mtx.vout = payouts;
|
||||||
return mtx;
|
return mtx;
|
||||||
@@ -138,7 +139,7 @@ CMutableTransaction BetProtocol::MakeAgreePayoutTx(std::vector<CTxOut> payouts,
|
|||||||
CMutableTransaction BetProtocol::MakeImportPayoutTx(std::vector<CTxOut> payouts,
|
CMutableTransaction BetProtocol::MakeImportPayoutTx(std::vector<CTxOut> payouts,
|
||||||
CTransaction signedDisputeTx, uint256 signedStakeTxHash, MoMProof momProof)
|
CTransaction signedDisputeTx, uint256 signedStakeTxHash, MoMProof momProof)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
mtx.vin.push_back(CTxIn(signedStakeTxHash, 0, CScript()));
|
mtx.vin.push_back(CTxIn(signedStakeTxHash, 0, CScript()));
|
||||||
mtx.vout = payouts;
|
mtx.vout = payouts;
|
||||||
CScript proofData;
|
CScript proofData;
|
||||||
|
|||||||
@@ -199,7 +199,7 @@ bool ChannelsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &
|
|||||||
//vout.3: normal output of payment amount to receiver pubkey
|
//vout.3: normal output of payment amount to receiver pubkey
|
||||||
//vout.n-2: normal change
|
//vout.n-2: normal change
|
||||||
//vout.n-1: opreturn - 'P' opentxid senderspubkey receiverspubkey depth numpayments secret
|
//vout.n-1: opreturn - 'P' opentxid senderspubkey receiverspubkey depth numpayments secret
|
||||||
if (isCCTxNotarizedConfirmed(opentxid) == 0)
|
if (komodo_txnotarizedconfirmed(opentxid) == 0)
|
||||||
return eval->Invalid("channelOpen is not yet confirmed(notarised)!");
|
return eval->Invalid("channelOpen is not yet confirmed(notarised)!");
|
||||||
else if ( IsCCInput(tx.vin[0].scriptSig) != 0 )
|
else if ( IsCCInput(tx.vin[0].scriptSig) != 0 )
|
||||||
return eval->Invalid("vin.0 is normal for channelPayment!");
|
return eval->Invalid("vin.0 is normal for channelPayment!");
|
||||||
@@ -261,7 +261,7 @@ bool ChannelsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &
|
|||||||
//vout.2: CC vout marker to receiver pubkey
|
//vout.2: CC vout marker to receiver pubkey
|
||||||
//vout.n-2: normal change
|
//vout.n-2: normal change
|
||||||
//vout.n-1: opreturn - 'C' opentxid senderspubkey receiverspubkey 0 0 0
|
//vout.n-1: opreturn - 'C' opentxid senderspubkey receiverspubkey 0 0 0
|
||||||
if (isCCTxNotarizedConfirmed(opentxid) == 0)
|
if (komodo_txnotarizedconfirmed(opentxid) == 0)
|
||||||
return eval->Invalid("channelOpen is not yet confirmed(notarised)!");
|
return eval->Invalid("channelOpen is not yet confirmed(notarised)!");
|
||||||
else if ( IsCCInput(tx.vin[0].scriptSig) != 0 )
|
else if ( IsCCInput(tx.vin[0].scriptSig) != 0 )
|
||||||
return eval->Invalid("vin.0 is normal for channelClose!");
|
return eval->Invalid("vin.0 is normal for channelClose!");
|
||||||
@@ -304,9 +304,9 @@ bool ChannelsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &
|
|||||||
//vout.2: normal output of CC input to senders pubkey
|
//vout.2: normal output of CC input to senders pubkey
|
||||||
//vout.n-2: normal change
|
//vout.n-2: normal change
|
||||||
//vout.n-1: opreturn - 'R' opentxid senderspubkey receiverspubkey numpayments payment closetxid
|
//vout.n-1: opreturn - 'R' opentxid senderspubkey receiverspubkey numpayments payment closetxid
|
||||||
if (isCCTxNotarizedConfirmed(opentxid) == 0)
|
if (komodo_txnotarizedconfirmed(opentxid) == 0)
|
||||||
return eval->Invalid("channelOpen is not yet confirmed(notarised)!");
|
return eval->Invalid("channelOpen is not yet confirmed(notarised)!");
|
||||||
else if (isCCTxNotarizedConfirmed(param3) == 0)
|
else if (komodo_txnotarizedconfirmed(param3) == 0)
|
||||||
return eval->Invalid("channelClose is not yet confirmed(notarised)!");
|
return eval->Invalid("channelClose is not yet confirmed(notarised)!");
|
||||||
else if ( IsCCInput(tx.vin[0].scriptSig) != 0 )
|
else if ( IsCCInput(tx.vin[0].scriptSig) != 0 )
|
||||||
return eval->Invalid("vin.0 is normal for channelRefund!");
|
return eval->Invalid("vin.0 is normal for channelRefund!");
|
||||||
@@ -430,7 +430,8 @@ int64_t AddChannelsInputs(struct CCcontract_info *cp,CMutableTransaction &mtx, C
|
|||||||
|
|
||||||
std::string ChannelOpen(uint64_t txfee,CPubKey destpub,int32_t numpayments,int64_t payment)
|
std::string ChannelOpen(uint64_t txfee,CPubKey destpub,int32_t numpayments,int64_t payment)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; uint8_t hash[32],hashdest[32]; uint64_t funds; int32_t i; uint256 hashchain,entropy,hentropy;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
uint8_t hash[32],hashdest[32]; uint64_t funds; int32_t i; uint256 hashchain,entropy,hentropy;
|
||||||
CPubKey mypk; struct CCcontract_info *cp,C;
|
CPubKey mypk; struct CCcontract_info *cp,C;
|
||||||
|
|
||||||
if ( numpayments <= 0 || payment <= 0 || numpayments > CHANNELS_MAXPAYMENTS )
|
if ( numpayments <= 0 || payment <= 0 || numpayments > CHANNELS_MAXPAYMENTS )
|
||||||
@@ -464,7 +465,8 @@ std::string ChannelOpen(uint64_t txfee,CPubKey destpub,int32_t numpayments,int64
|
|||||||
|
|
||||||
std::string ChannelPayment(uint64_t txfee,uint256 opentxid,int64_t amount, uint256 secret)
|
std::string ChannelPayment(uint64_t txfee,uint256 opentxid,int64_t amount, uint256 secret)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,srcpub,destpub; uint256 txid,hashchain,gensecret,hashblock,entropy,hentropy,prevtxid,param3;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,srcpub,destpub; uint256 txid,hashchain,gensecret,hashblock,entropy,hentropy,prevtxid,param3;
|
||||||
struct CCcontract_info *cp,C; int32_t i,funcid,prevdepth,numvouts,numpayments,totalnumpayments;
|
struct CCcontract_info *cp,C; int32_t i,funcid,prevdepth,numvouts,numpayments,totalnumpayments;
|
||||||
int64_t payment,change,funds,param2;
|
int64_t payment,change,funds,param2;
|
||||||
uint8_t hash[32],hashdest[32];
|
uint8_t hash[32],hashdest[32];
|
||||||
@@ -479,7 +481,7 @@ std::string ChannelPayment(uint64_t txfee,uint256 opentxid,int64_t amount, uint2
|
|||||||
fprintf(stderr, "invalid channel open txid\n");
|
fprintf(stderr, "invalid channel open txid\n");
|
||||||
return ("");
|
return ("");
|
||||||
}
|
}
|
||||||
if (AddNormalinputs(mtx,mypk,2*txfee,1) > 0)
|
if (AddNormalinputs(mtx,mypk,2*txfee,3) > 0)
|
||||||
{
|
{
|
||||||
if ((funds=AddChannelsInputs(cp,mtx,channelOpenTx,prevtxid)) !=0 && (change=funds-amount-txfee)>=0)
|
if ((funds=AddChannelsInputs(cp,mtx,channelOpenTx,prevtxid)) !=0 && (change=funds-amount-txfee)>=0)
|
||||||
{
|
{
|
||||||
@@ -569,7 +571,8 @@ std::string ChannelPayment(uint64_t txfee,uint256 opentxid,int64_t amount, uint2
|
|||||||
|
|
||||||
std::string ChannelClose(uint64_t txfee,uint256 opentxid)
|
std::string ChannelClose(uint64_t txfee,uint256 opentxid)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,srcpub,destpub; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,srcpub,destpub; struct CCcontract_info *cp,C;
|
||||||
CTransaction channelOpenTx;
|
CTransaction channelOpenTx;
|
||||||
uint256 hashblock,tmp_txid,prevtxid,hashchain;
|
uint256 hashblock,tmp_txid,prevtxid,hashchain;
|
||||||
int32_t numvouts,numpayments;
|
int32_t numvouts,numpayments;
|
||||||
@@ -595,7 +598,7 @@ std::string ChannelClose(uint64_t txfee,uint256 opentxid)
|
|||||||
fprintf(stderr,"cannot close, you are not channel owner\n");
|
fprintf(stderr,"cannot close, you are not channel owner\n");
|
||||||
return("");
|
return("");
|
||||||
}
|
}
|
||||||
if ( AddNormalinputs(mtx,mypk,2*txfee,1) > 0 )
|
if ( AddNormalinputs(mtx,mypk,2*txfee,3) > 0 )
|
||||||
{
|
{
|
||||||
if ((funds=AddChannelsInputs(cp,mtx,channelOpenTx,prevtxid)) !=0 && funds-txfee>0)
|
if ((funds=AddChannelsInputs(cp,mtx,channelOpenTx,prevtxid)) !=0 && funds-txfee>0)
|
||||||
{
|
{
|
||||||
@@ -616,7 +619,8 @@ std::string ChannelClose(uint64_t txfee,uint256 opentxid)
|
|||||||
|
|
||||||
std::string ChannelRefund(uint64_t txfee,uint256 opentxid,uint256 closetxid)
|
std::string ChannelRefund(uint64_t txfee,uint256 opentxid,uint256 closetxid)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk; struct CCcontract_info *cp,C; int64_t funds,payment,param2;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk; struct CCcontract_info *cp,C; int64_t funds,payment,param2;
|
||||||
int32_t i,numpayments,numvouts,param1;
|
int32_t i,numpayments,numvouts,param1;
|
||||||
uint256 hashchain,hashblock,txid,prevtxid,param3,entropy,hentropy,secret;
|
uint256 hashchain,hashblock,txid,prevtxid,param3,entropy,hentropy,secret;
|
||||||
CTransaction channelOpenTx,channelCloseTx,prevTx;
|
CTransaction channelOpenTx,channelCloseTx,prevTx;
|
||||||
@@ -658,7 +662,7 @@ std::string ChannelRefund(uint64_t txfee,uint256 opentxid,uint256 closetxid)
|
|||||||
fprintf(stderr,"cannot refund, you are not the channel owenr\n");
|
fprintf(stderr,"cannot refund, you are not the channel owenr\n");
|
||||||
return("");
|
return("");
|
||||||
}
|
}
|
||||||
if ( AddNormalinputs(mtx,mypk,2*txfee,1) > 0 )
|
if ( AddNormalinputs(mtx,mypk,2*txfee,3) > 0 )
|
||||||
{
|
{
|
||||||
if ((funds=AddChannelsInputs(cp,mtx,channelOpenTx,prevtxid)) !=0 && funds-txfee>0)
|
if ((funds=AddChannelsInputs(cp,mtx,channelOpenTx,prevtxid)) !=0 && funds-txfee>0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -328,13 +328,18 @@ cJSON *get_komodocli(char *refcoin,char **retstrp,char *acname,char *method,char
|
|||||||
{
|
{
|
||||||
sprintf(cmdstr,"%s %s %s %s %s %s > %s\n",REFCOIN_CLI,method,arg0,arg1,arg2,arg3,fname);
|
sprintf(cmdstr,"%s %s %s %s %s %s > %s\n",REFCOIN_CLI,method,arg0,arg1,arg2,arg3,fname);
|
||||||
printf("ref.(%s) REFCOIN_CLI (%s)\n",refcoin,cmdstr);
|
printf("ref.(%s) REFCOIN_CLI (%s)\n",refcoin,cmdstr);
|
||||||
}
|
}
|
||||||
|
#ifdef TESTMODE
|
||||||
|
fprintf(stderr,"cmd: %s\n",cmdstr);
|
||||||
|
#endif // TESTMODE
|
||||||
system(cmdstr);
|
system(cmdstr);
|
||||||
*retstrp = 0;
|
*retstrp = 0;
|
||||||
if ( (jsonstr= filestr(&fsize,fname)) != 0 )
|
if ( (jsonstr= filestr(&fsize,fname)) != 0 )
|
||||||
{
|
{
|
||||||
jsonstr[strlen(jsonstr)-1]='\0';
|
jsonstr[strlen(jsonstr)-1]='\0';
|
||||||
//fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr);
|
#ifdef TESTMODE
|
||||||
|
fprintf(stderr,"jsonstr.(%s)\n",jsonstr);
|
||||||
|
#endif // TESTMODE
|
||||||
if ( (jsonstr[0] != '{' && jsonstr[0] != '[') || (retjson= cJSON_Parse(jsonstr)) == 0 )
|
if ( (jsonstr[0] != '{' && jsonstr[0] != '[') || (retjson= cJSON_Parse(jsonstr)) == 0 )
|
||||||
*retstrp = jsonstr;
|
*retstrp = jsonstr;
|
||||||
else free(jsonstr);
|
else free(jsonstr);
|
||||||
@@ -483,6 +488,22 @@ cJSON *get_gatewayspending(char *refcoin,char *acname,char *bindtxidstr)
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cJSON *get_gatewaysprocessed(char *refcoin,char *acname,char *bindtxidstr)
|
||||||
|
{
|
||||||
|
cJSON *retjson; char *retstr;
|
||||||
|
if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewaysprocessed",bindtxidstr,refcoin,"","")) != 0 )
|
||||||
|
{
|
||||||
|
//printf("pending.(%s)\n",jprint(retjson,0));
|
||||||
|
return(retjson);
|
||||||
|
}
|
||||||
|
else if ( retstr != 0 )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"%s get_gatewaysprocessed.(%s) error.(%s)\n",refcoin,acname,retstr);
|
||||||
|
free(retstr);
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
cJSON *get_rawmempool(char *refcoin,char *acname)
|
cJSON *get_rawmempool(char *refcoin,char *acname)
|
||||||
{
|
{
|
||||||
cJSON *retjson; char *retstr;
|
cJSON *retjson; char *retstr;
|
||||||
@@ -550,10 +571,12 @@ int32_t validateaddress(char *refcoin,char *acname,char *depositaddr, char* comp
|
|||||||
return (res);
|
return (res);
|
||||||
}
|
}
|
||||||
|
|
||||||
void importaddress(char *refcoin,char *acname,char *depositaddr)
|
void importaddress(char *refcoin,char *acname,char *depositaddr, char *label,int rescan)
|
||||||
{
|
{
|
||||||
cJSON *retjson; char *retstr;
|
cJSON *retjson; char *retstr; char rescanstr[10];
|
||||||
if ( (retjson= get_komodocli(refcoin,&retstr,acname,"importaddress",depositaddr,"","true","")) != 0 )
|
if (rescan) strcpy(rescanstr,"true");
|
||||||
|
else strcpy(rescanstr,"false");
|
||||||
|
if ( (retjson= get_komodocli(refcoin,&retstr,acname,"importaddress",depositaddr,label,rescanstr,"")) != 0 )
|
||||||
{
|
{
|
||||||
printf("importaddress.(%s)\n",jprint(retjson,0));
|
printf("importaddress.(%s)\n",jprint(retjson,0));
|
||||||
free_json(retjson);
|
free_json(retjson);
|
||||||
@@ -610,7 +633,7 @@ cJSON *getinputarray(int64_t *totalp,cJSON *unspents,int64_t required)
|
|||||||
return(vins);
|
return(vins);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *createmultisig(char *refcoin,char *acname,char *depositaddr,char *signeraddr,char *withdrawaddr,int64_t satoshis)
|
char *createrawtx(char *refcoin,char *acname,char *depositaddr,char *withdrawaddr,char *txidaddr,int64_t satoshis)
|
||||||
{
|
{
|
||||||
char *retstr,*retstr2,array[128],*txstr = 0; cJSON *retjson2,*retjson,*vins,*vouts; int64_t txfee,total,change = 0;
|
char *retstr,*retstr2,array[128],*txstr = 0; cJSON *retjson2,*retjson,*vins,*vouts; int64_t txfee,total,change = 0;
|
||||||
if ( strcmp(refcoin,"BTC") == 0 )
|
if ( strcmp(refcoin,"BTC") == 0 )
|
||||||
@@ -618,7 +641,7 @@ char *createmultisig(char *refcoin,char *acname,char *depositaddr,char *signerad
|
|||||||
else txfee = 10000;
|
else txfee = 10000;
|
||||||
if ( satoshis < txfee )
|
if ( satoshis < txfee )
|
||||||
{
|
{
|
||||||
printf("createmultisig satoshis %.8f < txfee %.8f\n",(double)satoshis/SATOSHIDEN,(double)txfee/SATOSHIDEN);
|
printf("createrawtx satoshis %.8f < txfee %.8f\n",(double)satoshis/SATOSHIDEN,(double)txfee/SATOSHIDEN);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
satoshis -= txfee;
|
satoshis -= txfee;
|
||||||
@@ -631,8 +654,9 @@ char *createmultisig(char *refcoin,char *acname,char *depositaddr,char *signerad
|
|||||||
if ( total >= satoshis )
|
if ( total >= satoshis )
|
||||||
{
|
{
|
||||||
vouts = cJSON_CreateObject();
|
vouts = cJSON_CreateObject();
|
||||||
jaddnum(vouts,withdrawaddr,(double)satoshis/SATOSHIDEN);
|
jaddnum(vouts,withdrawaddr,(double)(satoshis-2*txfee)/SATOSHIDEN);
|
||||||
if ( total > satoshis+txfee )
|
jaddnum(vouts,txidaddr,(double)txfee/SATOSHIDEN);
|
||||||
|
if ( total > satoshis)
|
||||||
{
|
{
|
||||||
change = (total - satoshis);
|
change = (total - satoshis);
|
||||||
jaddnum(vouts,depositaddr,(double)change/SATOSHIDEN);
|
jaddnum(vouts,depositaddr,(double)change/SATOSHIDEN);
|
||||||
@@ -645,29 +669,30 @@ char *createmultisig(char *refcoin,char *acname,char *depositaddr,char *signerad
|
|||||||
sprintf(argB,"\'%s\'",tmpB);
|
sprintf(argB,"\'%s\'",tmpB);
|
||||||
if ( (retjson2= get_komodocli(refcoin,&txstr,acname,"createrawtransaction",argA,argB,"","")) != 0 )
|
if ( (retjson2= get_komodocli(refcoin,&txstr,acname,"createrawtransaction",argA,argB,"","")) != 0 )
|
||||||
{
|
{
|
||||||
printf("createmultisig: unexpected JSON2.(%s)\n",jprint(retjson2,0));
|
printf("createrawtx: unexpected JSON2.(%s)\n",jprint(retjson2,0));
|
||||||
free_json(retjson2);
|
free_json(retjson2);
|
||||||
}
|
}
|
||||||
else if ( txstr == 0 )
|
else if ( txstr == 0 )
|
||||||
printf("createmultisig: null txstr and JSON2\n");
|
printf("createrawtx: null txstr and JSON2\n");
|
||||||
free(tmpA);
|
free(tmpA);
|
||||||
free(tmpB);
|
free(tmpB);
|
||||||
free(argA);
|
free(argA);
|
||||||
free(argB);
|
free(argB);
|
||||||
}
|
}
|
||||||
|
else printf("not enough funds to create withdraw tx\n");
|
||||||
}
|
}
|
||||||
free_json(retjson);
|
free_json(retjson);
|
||||||
}
|
}
|
||||||
else if ( retstr != 0 )
|
else if ( retstr != 0 )
|
||||||
{
|
{
|
||||||
printf("createmultisig: unexpected null JSON, retstr.(%s)\n",retstr);
|
printf("createrawtx: unexpected null JSON, retstr.(%s)\n",retstr);
|
||||||
free(retstr);
|
free(retstr);
|
||||||
}
|
}
|
||||||
else printf("createmultisig: null retstr and JSON\n");
|
else printf("createrawtx: null retstr and JSON\n");
|
||||||
return(txstr);
|
return(txstr);
|
||||||
}
|
}
|
||||||
|
|
||||||
cJSON *addmultisignature(char *refcoin,char *acname,char *signeraddr,char *rawtx)
|
cJSON *addsignature(char *refcoin,char *acname,char *rawtx)
|
||||||
{
|
{
|
||||||
char *retstr,*hexstr; cJSON *retjson;
|
char *retstr,*hexstr; cJSON *retjson;
|
||||||
if ( (retjson= get_komodocli(refcoin,&retstr,acname,"signrawtransaction",rawtx,"","","")) != 0 )
|
if ( (retjson= get_komodocli(refcoin,&retstr,acname,"signrawtransaction",rawtx,"","","")) != 0 )
|
||||||
@@ -681,6 +706,11 @@ cJSON *addmultisignature(char *refcoin,char *acname,char *signeraddr,char *rawtx
|
|||||||
}
|
}
|
||||||
free_json(retjson);
|
free_json(retjson);
|
||||||
}
|
}
|
||||||
|
else if ( retstr != 0 )
|
||||||
|
{
|
||||||
|
printf("error parsing signrawtransaction.(%s)\n",retstr);
|
||||||
|
free(retstr);
|
||||||
|
}
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -696,6 +726,11 @@ char *get_gatewaysmultisig(char *refcoin,char *acname,char *txidaddr,int32_t *K)
|
|||||||
*K=jint(retjson,"number_of_signs");
|
*K=jint(retjson,"number_of_signs");
|
||||||
free_json(retjson);
|
free_json(retjson);
|
||||||
}
|
}
|
||||||
|
else if ( retstr != 0 )
|
||||||
|
{
|
||||||
|
printf("error parsing gatewaysmultisig.(%s)\n",retstr);
|
||||||
|
free(retstr);
|
||||||
|
}
|
||||||
return(hex);
|
return(hex);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -714,11 +749,27 @@ bits256 gatewayspartialsign(char *refcoin,char *acname,bits256 txid,char *hex)
|
|||||||
return (zeroid);
|
return (zeroid);
|
||||||
}
|
}
|
||||||
|
|
||||||
void gatewaysmarkdone(char *refcoin,char *acname,bits256 withtxid,char *coin,bits256 cointxid)
|
void gatewayscompletesigning(char *refcoin,char *acname,bits256 withtxid,char *coin,char *hex)
|
||||||
{
|
{
|
||||||
char str[65],str2[65],*retstr; cJSON *retjson;
|
char str[65],str2[65],*retstr; cJSON *retjson;
|
||||||
printf("spend %s %s/v2 as marker\n",acname,bits256_str(str,withtxid));
|
printf("spend %s %s/v2 as marker\n",acname,bits256_str(str,withtxid));
|
||||||
if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewaysmarkdone",bits256_str(str,withtxid),coin,bits256_str(str2,cointxid),"")) != 0 )
|
if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewayscompletesigning",bits256_str(str,withtxid),coin,hex,"")) != 0 )
|
||||||
|
{
|
||||||
|
komodobroadcast(refcoin,acname,retjson);
|
||||||
|
free_json(retjson);
|
||||||
|
}
|
||||||
|
else if ( retstr != 0 )
|
||||||
|
{
|
||||||
|
printf("error parsing gatewayscompletesigning.(%s)\n",retstr);
|
||||||
|
free(retstr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void gatewaysmarkdone(char *refcoin,char *acname,bits256 withtxid,char *coin)
|
||||||
|
{
|
||||||
|
char str[65],str2[65],*retstr; cJSON *retjson;
|
||||||
|
printf("spend %s %s/v2 as marker\n",acname,bits256_str(str,withtxid));
|
||||||
|
if ( (retjson= get_komodocli(refcoin,&retstr,acname,"gatewaysmarkdone",bits256_str(str,withtxid),coin,"","")) != 0 )
|
||||||
{
|
{
|
||||||
komodobroadcast(refcoin,acname,retjson);
|
komodobroadcast(refcoin,acname,retjson);
|
||||||
free_json(retjson);
|
free_json(retjson);
|
||||||
@@ -771,6 +822,22 @@ int32_t get_gatewaysinfo(char *refcoin,char *acname,char *depositaddr,int32_t *M
|
|||||||
else return(0);
|
else return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t tx_notarizedconfirmed(char *refcoin,char *acname,bits256 txid)
|
||||||
|
{
|
||||||
|
char *retstr,str[65]; cJSON *retjson; int32_t result;
|
||||||
|
if ( (retjson= get_komodocli(refcoin,&retstr,acname,"txnotarizedconfirmed",bits256_str(str,txid),"","","")) != 0 )
|
||||||
|
{
|
||||||
|
if (is_cJSON_True(jobj(retjson,"result")) != 0 ) result=1;
|
||||||
|
else result=0;
|
||||||
|
free_json(retjson);
|
||||||
|
}
|
||||||
|
else if ( retstr != 0 )
|
||||||
|
{
|
||||||
|
printf("error parsing txnotarizedconfirmed.(%s)\n",retstr);
|
||||||
|
free(retstr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int32_t tx_has_voutaddress(char *refcoin,char *acname,bits256 txid,char *coinaddr)
|
int32_t tx_has_voutaddress(char *refcoin,char *acname,bits256 txid,char *coinaddr)
|
||||||
{
|
{
|
||||||
cJSON *txobj,*vouts,*vout,*vins,*vin,*sobj,*addresses; char *addr,str[65]; int32_t i,j,n,numarray,retval = 0, hasvout=0;
|
cJSON *txobj,*vouts,*vout,*vins,*vin,*sobj,*addresses; char *addr,str[65]; int32_t i,j,n,numarray,retval = 0, hasvout=0;
|
||||||
@@ -788,8 +855,7 @@ int32_t tx_has_voutaddress(char *refcoin,char *acname,bits256 txid,char *coinadd
|
|||||||
{
|
{
|
||||||
addr = jstri(addresses,j);
|
addr = jstri(addresses,j);
|
||||||
if ( strcmp(addr,coinaddr) == 0 )
|
if ( strcmp(addr,coinaddr) == 0 )
|
||||||
{
|
{
|
||||||
//fprintf(stderr,"found %s in %s v%d\n",coinaddr,bits256_str(str,txid),i);
|
|
||||||
hasvout = 1;
|
hasvout = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -798,23 +864,44 @@ int32_t tx_has_voutaddress(char *refcoin,char *acname,bits256 txid,char *coinadd
|
|||||||
}
|
}
|
||||||
if (hasvout==1) break;
|
if (hasvout==1) break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// if (hasvout==1 && (vins=jarray(&numarray,txobj,"vin"))!=0)
|
|
||||||
// {
|
|
||||||
// for (int i=0;i<numarray;i++)
|
|
||||||
// {
|
|
||||||
// if ((vin=jitem(vins,i))!=0 && validateaddress(refcoin,acname,jstr(vin,"address"),"ismine")!=0)
|
|
||||||
// {
|
|
||||||
// retval=1;
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
free_json(txobj);
|
free_json(txobj);
|
||||||
}
|
}
|
||||||
return(hasvout);
|
return(hasvout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t markerexists(char *refcoin,char *acname,char *coinaddr)
|
||||||
|
{
|
||||||
|
cJSON *array; int32_t i,n,num=0; bits256 txid;
|
||||||
|
if ( (array= get_addressutxos(refcoin,acname,coinaddr)) != 0 )
|
||||||
|
{
|
||||||
|
num=cJSON_GetArraySize(array);
|
||||||
|
free_json(array);
|
||||||
|
}
|
||||||
|
if ( num == 0 )
|
||||||
|
{
|
||||||
|
if ( (array= get_rawmempool(refcoin,acname)) != 0 )
|
||||||
|
{
|
||||||
|
if ( (n= cJSON_GetArraySize(array)) != 0 )
|
||||||
|
{
|
||||||
|
for (i=0; i<n; i++)
|
||||||
|
{
|
||||||
|
txid = jbits256i(array,i);
|
||||||
|
if ( tx_has_voutaddress(refcoin,acname,txid,coinaddr) > 0 )
|
||||||
|
{
|
||||||
|
num = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free_json(array);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fprintf(stderr,"Num=%d\n",num);
|
||||||
|
return(num);
|
||||||
|
|
||||||
|
}
|
||||||
int32_t markerfromthisnodeorunconfirmed(char *refcoin,char *acname,char *coinaddr)
|
int32_t markerfromthisnodeorunconfirmed(char *refcoin,char *acname,char *coinaddr)
|
||||||
{
|
{
|
||||||
cJSON *array,*item,*rawtx,*vins,*vin; bits256 txid,tmptxid; int32_t i,n,m,num=0; char *retstr;
|
cJSON *array,*item,*rawtx,*vins,*vin; bits256 txid,tmptxid; int32_t i,n,m,num=0; char *retstr;
|
||||||
@@ -887,54 +974,42 @@ void update_gatewayspending(char *refcoin,char *acname,char *bindtxidstr,int32_t
|
|||||||
//process item.0 {"txid":"10ec8f4dad6903df6b249b361b879ac77b0617caad7629b97e10f29fa7e99a9b","txidaddr":"RMbite4TGugVmkGmu76ytPHDEQZQGSUjxz","withdrawaddr":"RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc","amount":"1.00000000","depositaddr":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj","signeraddr":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj"}
|
//process item.0 {"txid":"10ec8f4dad6903df6b249b361b879ac77b0617caad7629b97e10f29fa7e99a9b","txidaddr":"RMbite4TGugVmkGmu76ytPHDEQZQGSUjxz","withdrawaddr":"RNJmgYaFF5DbnrNUX6pMYz9rcnDKC2tuAc","amount":"1.00000000","depositaddr":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj","signeraddr":"RHV2As4rox97BuE3LK96vMeNY8VsGRTmBj"}
|
||||||
if ( (txidaddr= jstr(item,"txidaddr")) != 0 && (withdrawaddr= jstr(item,"withdrawaddr")) != 0 && (depositaddr= jstr(item,"depositaddr")) != 0 && (signeraddr= jstr(item,"signeraddr")) != 0 )
|
if ( (txidaddr= jstr(item,"txidaddr")) != 0 && (withdrawaddr= jstr(item,"withdrawaddr")) != 0 && (depositaddr= jstr(item,"depositaddr")) != 0 && (signeraddr= jstr(item,"signeraddr")) != 0 )
|
||||||
{
|
{
|
||||||
if ( (satoshis= jdouble(item,"amount")*SATOSHIDEN) != 0 && markerfromthisnodeorunconfirmed("KMD",acname,txidaddr) == 0)
|
if ( (satoshis= jdouble(item,"amount")*SATOSHIDEN) != 0 && is_cJSON_True(jobj(item,"confirmed_or_notarized")) != 0 && markerfromthisnodeorunconfirmed("KMD",acname,txidaddr) == 0)
|
||||||
{
|
{
|
||||||
// the actual withdraw
|
|
||||||
if ( strcmp(depositaddr,signeraddr) == 0 )
|
if ( strcmp(depositaddr,signeraddr) == 0 )
|
||||||
{
|
{
|
||||||
txid= sendtoaddress("KMD",acname,txidaddr,10000);
|
rawtx = createrawtx(refcoin,"",depositaddr,withdrawaddr,txidaddr,satoshis);
|
||||||
if (bits256_nonz(txid) != 0)
|
if ( rawtx != 0 )
|
||||||
{
|
{
|
||||||
cointxid = sendtoaddress(refcoin,"",withdrawaddr,satoshis);
|
if ( (clijson= addsignature(refcoin,"",rawtx)) != 0 && is_cJSON_True(jobj(clijson,"complete")) != 0)
|
||||||
if ( bits256_nonz(cointxid) != 0)
|
{
|
||||||
{
|
gatewayscompletesigning("KMD",acname,origtxid,refcoin,jstr(clijson,"hex"));
|
||||||
fprintf(stderr,"withdraw %s %s %s %.8f processed\n",refcoin,bits256_str(str,cointxid),withdrawaddr,(double)satoshis/SATOSHIDEN);
|
fprintf(stderr,"withdraw %.8f %s to %s processed\n",(double)satoshis/SATOSHIDEN,refcoin,withdrawaddr);
|
||||||
gatewaysmarkdone("KMD",acname,origtxid,refcoin,cointxid);
|
free_json(clijson);
|
||||||
processed++;
|
|
||||||
}
|
}
|
||||||
else
|
processed++;
|
||||||
{
|
free(rawtx);
|
||||||
fprintf(stderr,"ERROR withdraw %s %s %s %.8f processed\n",refcoin,bits256_str(str,cointxid),withdrawaddr,(double)satoshis/SATOSHIDEN);
|
} else fprintf(stderr,"couldnt create rawtx\n");
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
fprintf(stderr,"ERROR sending withdraw marker %s %s to %s %.8f processed\n",refcoin,bits256_str(str,cointxid),txidaddr,(double)10000/SATOSHIDEN);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ( (rawtx= get_gatewaysmultisig(refcoin,acname,txidaddr,&K)) == 0)
|
if ( (rawtx= get_gatewaysmultisig(refcoin,acname,txidaddr,&K)) == 0)
|
||||||
{
|
{
|
||||||
rawtx = createmultisig(refcoin,"",depositaddr,signeraddr,withdrawaddr,satoshis);
|
rawtx = createrawtx(refcoin,"",depositaddr,withdrawaddr,txidaddr,satoshis);
|
||||||
}
|
}
|
||||||
if ( rawtx != 0 )
|
if ( rawtx != 0 )
|
||||||
{
|
{
|
||||||
if ( (clijson= addmultisignature(refcoin,"",signeraddr,rawtx)) != 0 )
|
if ( (clijson= addsignature(refcoin,"",rawtx)) != 0 )
|
||||||
{
|
{
|
||||||
if ( is_cJSON_True(jobj(clijson,"complete")) != 0 )
|
if ( is_cJSON_True(jobj(clijson,"complete")) != 0 )
|
||||||
{
|
{
|
||||||
cointxid = komodobroadcast(refcoin,"",clijson);
|
gatewayscompletesigning("KMD",acname,origtxid,refcoin,jstr(clijson,"hex"));
|
||||||
if ( bits256_nonz(cointxid) != 0 )
|
fprintf(stderr,"withdraw %.8f %s M.%d N.%d to %s processed\n",(double)satoshis/SATOSHIDEN,refcoin,M,N,withdrawaddr);
|
||||||
{
|
|
||||||
fprintf(stderr,"withdraw %s M.%d N.%d %s %s %.8f processed\n",refcoin,M,N,bits256_str(str,cointxid),withdrawaddr,(double)satoshis/SATOSHIDEN);
|
|
||||||
gatewaysmarkdone("KMD",acname,origtxid,refcoin,cointxid);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if ( jint(clijson,"partialtx") != 0 )
|
else if ( jint(clijson,"partialtx") != 0 )
|
||||||
{
|
{
|
||||||
txid=gatewayspartialsign(refcoin,acname,origtxid,jstr(clijson,"hex"));
|
txid=gatewayspartialsign(refcoin,acname,origtxid,jstr(clijson,"hex"));
|
||||||
fprintf(stderr,"%d of %d partialtx %s sent\n",K+1,N,bits256_str(str,txid));
|
fprintf(stderr,"%d sign(s) %dof%d partialtx %s sent\n",K+1,M,N,bits256_str(str,txid));
|
||||||
}
|
}
|
||||||
free_json(clijson);
|
free_json(clijson);
|
||||||
}
|
}
|
||||||
@@ -949,6 +1024,33 @@ void update_gatewayspending(char *refcoin,char *acname,char *bindtxidstr,int32_t
|
|||||||
}
|
}
|
||||||
free_json(retjson);
|
free_json(retjson);
|
||||||
}
|
}
|
||||||
|
if ( (retjson= get_gatewaysprocessed("KMD",acname,bindtxidstr)) != 0 )
|
||||||
|
{
|
||||||
|
if ( jint(retjson,"queueflag") != 0 && (coinstr= jstr(retjson,"coin")) != 0 && strcmp(coinstr,refcoin) == 0 )
|
||||||
|
{
|
||||||
|
if ( (pending=jarray(&n,retjson,"processed")) != 0 )
|
||||||
|
{
|
||||||
|
for (i=0; i<n; i++)
|
||||||
|
{
|
||||||
|
item = jitem(pending,i);
|
||||||
|
origtxid = jbits256(item,"txid");
|
||||||
|
txidaddr = jstr(item,"withdrawtxidaddr");
|
||||||
|
if (validateaddress(refcoin,"",txidaddr,"iswatchonly")==0 && validateaddress(refcoin,"",txidaddr,"ismine")==0)
|
||||||
|
importaddress(refcoin,"",txidaddr,jstr(item,"txid"),0);
|
||||||
|
if ( txidaddr != 0 && markerexists(refcoin,"",txidaddr)==0)
|
||||||
|
{
|
||||||
|
cointxid = komodobroadcast(refcoin,"",item);
|
||||||
|
if ( bits256_nonz(cointxid) != 0 )
|
||||||
|
{
|
||||||
|
withdrawaddr = jstr(item,"withdrawaddr");
|
||||||
|
fprintf(stderr,"withdraw %.8f %s to %s - %s broadcasted on %s\n",(double)satoshis/SATOSHIDEN,refcoin,withdrawaddr,bits256_str(str,cointxid),refcoin);
|
||||||
|
gatewaysmarkdone("KMD",acname,origtxid,refcoin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t get_oracledata(char *refcoin,char *acname,int32_t prevheight,char *hexstr,int32_t maxsize,char *format)
|
int32_t get_oracledata(char *refcoin,char *acname,int32_t prevheight,char *hexstr,int32_t maxsize,char *format)
|
||||||
@@ -1050,9 +1152,9 @@ int32_t main(int32_t argc,char **argv)
|
|||||||
printf("cant find bindtxid.(%s)\n",bindtxidstr);
|
printf("cant find bindtxid.(%s)\n",bindtxidstr);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
if (validateaddress(refcoin,"",depositaddr,"iswatchonly")==0)
|
if (validateaddress(refcoin,"",depositaddr,"iswatchonly")==0 && validateaddress(refcoin,"",depositaddr,"ismine")==0)
|
||||||
{
|
{
|
||||||
if (M==N==1) importaddress(refcoin,"",depositaddr);
|
if (M==N==1) importaddress(refcoin,"",depositaddr,bindtxidstr,0);
|
||||||
else addmultisigaddress(refcoin,"",M,pubkeys,bindtxidstr);
|
else addmultisigaddress(refcoin,"",M,pubkeys,bindtxidstr);
|
||||||
}
|
}
|
||||||
if (pubkeys!=0) free(pubkeys);
|
if (pubkeys!=0) free(pubkeys);
|
||||||
@@ -1075,9 +1177,9 @@ int32_t main(int32_t argc,char **argv)
|
|||||||
{
|
{
|
||||||
prevheight = height;
|
prevheight = height;
|
||||||
acheight = get_coinheight(refcoin,"");
|
acheight = get_coinheight(refcoin,"");
|
||||||
printf("%s ht.%d <- %s\n",refcoin,height,hexstr);
|
printf("%s ht.%d <- %s\n",refcoin,height,hexstr);
|
||||||
update_gatewayspending(refcoin,acname,bindtxidstr,M,N);
|
update_gatewayspending(refcoin,acname,bindtxidstr,M,N);
|
||||||
}
|
}
|
||||||
free_json(clijson2);
|
free_json(clijson2);
|
||||||
}
|
}
|
||||||
else if ( retstr2 != 0 )
|
else if ( retstr2 != 0 )
|
||||||
@@ -1085,7 +1187,7 @@ int32_t main(int32_t argc,char **argv)
|
|||||||
printf("error parsing oraclesdata.(%s)\n",retstr2);
|
printf("error parsing oraclesdata.(%s)\n",retstr2);
|
||||||
free(retstr2);
|
free(retstr2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,20 @@
|
|||||||
#include <memory.h>
|
#include <memory.h>
|
||||||
#include "cJSON.c"
|
#include "cJSON.c"
|
||||||
|
|
||||||
|
/*
|
||||||
|
z_migrate: the purpose of z_migrate is to make converting of all sprout outputs into sapling. the usage would be for the user to specify a sapling address and call z_migrate zsaddr, until it returns that there is nothing left to be done.
|
||||||
|
|
||||||
|
its main functionality is quite similar to a z_mergetoaddress ANY_ZADDR -> onetime_taddr followed by a z_sendmany onetime_taddr -> zsaddr
|
||||||
|
|
||||||
|
since the z_mergetoaddress will take time, it would just queue up an async operation. When it starts, it should see if there are any onetime_taddr with 10000.0001 funds in it, that is a signal for it to do the sapling tx and it can just do that without async as it is fast enough, especially with a taddr input. Maybe it limits itself to one, or it does all possible taddr -> sapling as fast as it can. either is fine as it will be called over and over anyway.
|
||||||
|
|
||||||
|
It might be that there is nothing to do, but some operations are pending. in that case it would return such a status. as soon as the operation finishes, there would be more work to do.
|
||||||
|
|
||||||
|
the amount sent to the taddr, should be 10000.0001
|
||||||
|
|
||||||
|
The GUI or user would be expected to generate a sapling address and then call z_migrate saplingaddr in a loop, until it returns that it is all done. this loop should pause for 10 seconds or so, if z_migrate is just waiting for opid to complete.
|
||||||
|
*/
|
||||||
|
|
||||||
bits256 zeroid;
|
bits256 zeroid;
|
||||||
|
|
||||||
char hexbyte(int32_t c)
|
char hexbyte(int32_t c)
|
||||||
@@ -891,28 +905,29 @@ int32_t main(int32_t argc,char **argv)
|
|||||||
}
|
}
|
||||||
zsaddr = clonestr(argv[2]);
|
zsaddr = clonestr(argv[2]);
|
||||||
printf("%s: %s %s\n",REFCOIN_CLI,coinstr,zsaddr);
|
printf("%s: %s %s\n",REFCOIN_CLI,coinstr,zsaddr);
|
||||||
char coinaddr[64],zcaddr[128],opidstr[128]; int32_t alldone,finished; int64_t amount,stdamount,txfee;
|
uint32_t lastopid; char coinaddr[64],zcaddr[128],opidstr[128]; int32_t finished; int64_t amount,stdamount,txfee;
|
||||||
stdamount = 1000 * SATOSHIDEN;
|
stdamount = 10000 * SATOSHIDEN;
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
again:
|
again:
|
||||||
printf("start processing zmigrate\n");
|
printf("start processing zmigrate\n");
|
||||||
|
lastopid = (uint32_t)time(NULL);
|
||||||
finished = 0;
|
finished = 0;
|
||||||
while ( 1 )
|
while ( 1 )
|
||||||
{
|
{
|
||||||
if ( have_pending_opid(coinstr,0) != 0 )
|
if ( have_pending_opid(coinstr,0) != 0 )
|
||||||
{
|
{
|
||||||
sleep(3);
|
sleep(60);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
alldone = 1;
|
|
||||||
if ( (amount= find_onetime_amount(coinstr,coinaddr)) > txfee )
|
if ( (amount= find_onetime_amount(coinstr,coinaddr)) > txfee )
|
||||||
{
|
{
|
||||||
// find taddr with funds and send all to zsaddr
|
// find taddr with funds and send all to zsaddr
|
||||||
z_sendmany(opidstr,coinstr,"",coinaddr,zsaddr,amount-txfee);
|
z_sendmany(opidstr,coinstr,"",coinaddr,zsaddr,amount-txfee);
|
||||||
alldone = 0;
|
lastopid = (uint32_t)time(NULL);
|
||||||
sleep(1);
|
sleep(1);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
if ( alldone != 0 && (amount= find_sprout_amount(coinstr,zcaddr)) > txfee )
|
if ( (amount= find_sprout_amount(coinstr,zcaddr)) > txfee )
|
||||||
{
|
{
|
||||||
// generate taddr, send max of 10000.0001
|
// generate taddr, send max of 10000.0001
|
||||||
if ( amount > stdamount+txfee )
|
if ( amount > stdamount+txfee )
|
||||||
@@ -920,15 +935,13 @@ again:
|
|||||||
if ( getnewaddress(coinaddr,coinstr,"") == 0 )
|
if ( getnewaddress(coinaddr,coinstr,"") == 0 )
|
||||||
{
|
{
|
||||||
z_sendmany(opidstr,coinstr,"",zcaddr,coinaddr,amount-txfee);
|
z_sendmany(opidstr,coinstr,"",zcaddr,coinaddr,amount-txfee);
|
||||||
|
lastopid = (uint32_t)time(NULL);
|
||||||
} else printf("couldnt getnewaddress!\n");
|
} else printf("couldnt getnewaddress!\n");
|
||||||
alldone = 0;
|
sleep(30);
|
||||||
sleep(10);
|
continue;
|
||||||
}
|
}
|
||||||
if ( alldone != 0 && find_onetime_amount(coinstr,coinaddr) == 0 && find_sprout_amount(coinstr,zcaddr) == 0 )
|
if ( time(NULL) > lastopid+600 )
|
||||||
{
|
break;
|
||||||
if ( finished++ > 10 )
|
|
||||||
break;
|
|
||||||
} else finished = 0 ;
|
|
||||||
}
|
}
|
||||||
sleep(3);
|
sleep(3);
|
||||||
printf("%s %s ALLDONE! taddr %.8f sprout %.8f mempool empty.%d\n",coinstr,zsaddr,dstr(find_onetime_amount(coinstr,coinaddr)),dstr(find_sprout_amount(coinstr,zcaddr)),empty_mempool(coinstr,""));
|
printf("%s %s ALLDONE! taddr %.8f sprout %.8f mempool empty.%d\n",coinstr,zsaddr,dstr(find_onetime_amount(coinstr,coinaddr)),dstr(find_sprout_amount(coinstr,zcaddr)),empty_mempool(coinstr,""));
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ What is needed is for the dealer node to track the entropy tx that was already b
|
|||||||
#include "../compat/endian.h"
|
#include "../compat/endian.h"
|
||||||
|
|
||||||
#define MAX_ENTROPYUSED 8192
|
#define MAX_ENTROPYUSED 8192
|
||||||
#define DICE_MINUTXOS 10000
|
#define DICE_MINUTXOS 15000
|
||||||
extern int32_t KOMODO_INSYNC;
|
extern int32_t KOMODO_INSYNC;
|
||||||
|
|
||||||
pthread_mutex_t DICE_MUTEX,DICEREVEALED_MUTEX;
|
pthread_mutex_t DICE_MUTEX,DICEREVEALED_MUTEX;
|
||||||
@@ -245,9 +245,12 @@ bool mySenddicetransaction(std::string res,uint256 entropyused,int32_t entropyvo
|
|||||||
{
|
{
|
||||||
RelayTransaction(tx);
|
RelayTransaction(tx);
|
||||||
fprintf(stderr,"rebroadcast.%c and clear [%d] and broadcast entropyused.%s bettxid.%s -> %s\n",funcid,i,entropyused.GetHex().c_str(),bettxid.GetHex().c_str(),tx.GetHash().GetHex().c_str());
|
fprintf(stderr,"rebroadcast.%c and clear [%d] and broadcast entropyused.%s bettxid.%s -> %s\n",funcid,i,entropyused.GetHex().c_str(),bettxid.GetHex().c_str(),tx.GetHash().GetHex().c_str());
|
||||||
if ( ptr->rawtx.empty() == 0 )
|
if ( ptr != 0 )
|
||||||
ptr->rawtx.clear();
|
{
|
||||||
ptr->txid = zeroid;
|
if ( ptr->rawtx.empty() == 0 )
|
||||||
|
ptr->rawtx.clear();
|
||||||
|
ptr->txid = zeroid;
|
||||||
|
}
|
||||||
//fprintf(stderr,"error adding funcid.%c E.%s bet.%s -> %s to mempool, probably Disable replacement feature size.%d\n",funcid,entropyused.GetHex().c_str(),bettxid.GetHex().c_str(),tx.GetHash().GetHex().c_str(),(int32_t)ptr->rawtx.size());
|
//fprintf(stderr,"error adding funcid.%c E.%s bet.%s -> %s to mempool, probably Disable replacement feature size.%d\n",funcid,entropyused.GetHex().c_str(),bettxid.GetHex().c_str(),tx.GetHash().GetHex().c_str(),(int32_t)ptr->rawtx.size());
|
||||||
}
|
}
|
||||||
} else fprintf(stderr,"error duplicate entropyused different bettxid\n");
|
} else fprintf(stderr,"error duplicate entropyused different bettxid\n");
|
||||||
@@ -1329,7 +1332,8 @@ UniValue DiceList()
|
|||||||
|
|
||||||
std::string DiceCreateFunding(uint64_t txfee,char *planstr,int64_t funds,int64_t minbet,int64_t maxbet,int64_t maxodds,int64_t timeoutblocks)
|
std::string DiceCreateFunding(uint64_t txfee,char *planstr,int64_t funds,int64_t minbet,int64_t maxbet,int64_t maxodds,int64_t timeoutblocks)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; uint256 zero; CScript fundingPubKey; CPubKey mypk,dicepk; int64_t a,b,c,d; uint64_t sbits; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
uint256 zero; CScript fundingPubKey; CPubKey mypk,dicepk; int64_t a,b,c,d; uint64_t sbits; struct CCcontract_info *cp,C;
|
||||||
if ( funds < 0 || minbet < 0 || maxbet < 0 || maxodds < 1 || maxodds > 9999 || timeoutblocks < 0 || timeoutblocks > 1440 )
|
if ( funds < 0 || minbet < 0 || maxbet < 0 || maxodds < 1 || maxodds > 9999 || timeoutblocks < 0 || timeoutblocks > 1440 )
|
||||||
{
|
{
|
||||||
CCerror = "invalid parameter error";
|
CCerror = "invalid parameter error";
|
||||||
@@ -1363,7 +1367,8 @@ std::string DiceCreateFunding(uint64_t txfee,char *planstr,int64_t funds,int64_t
|
|||||||
|
|
||||||
std::string DiceAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t amount)
|
std::string DiceAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t amount)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CScript fundingPubKey,scriptPubKey; uint256 entropy,hentropy; CPubKey mypk,dicepk; uint64_t sbits; struct CCcontract_info *cp,C; int64_t minbet,maxbet,maxodds,timeoutblocks;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CScript fundingPubKey,scriptPubKey; uint256 entropy,hentropy; CPubKey mypk,dicepk; uint64_t sbits; struct CCcontract_info *cp,C; int64_t minbet,maxbet,maxodds,timeoutblocks;
|
||||||
if ( amount < 0 )
|
if ( amount < 0 )
|
||||||
{
|
{
|
||||||
CCerror = "amount must be positive";
|
CCerror = "amount must be positive";
|
||||||
@@ -1387,7 +1392,7 @@ std::string DiceAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,int6
|
|||||||
}
|
}
|
||||||
if ( scriptPubKey == fundingPubKey )
|
if ( scriptPubKey == fundingPubKey )
|
||||||
{
|
{
|
||||||
if ( AddNormalinputs(mtx,mypk,amount+2*txfee,1) > 0 )
|
if ( AddNormalinputs2(mtx,amount+2*txfee,60) > 0 )
|
||||||
{
|
{
|
||||||
hentropy = DiceHashEntropy(entropy,mtx.vin[0].prevout.hash,mtx.vin[0].prevout.n,1);
|
hentropy = DiceHashEntropy(entropy,mtx.vin[0].prevout.hash,mtx.vin[0].prevout.n,1);
|
||||||
mtx.vout.push_back(MakeCC1vout(cp->evalcode,amount,dicepk));
|
mtx.vout.push_back(MakeCC1vout(cp->evalcode,amount,dicepk));
|
||||||
@@ -1406,7 +1411,8 @@ std::string DiceAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,int6
|
|||||||
|
|
||||||
std::string DiceBet(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t bet,int32_t odds)
|
std::string DiceBet(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t bet,int32_t odds)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CScript fundingPubKey; CPubKey mypk,dicepk; uint64_t sbits,entropyval,entropyval2; int64_t funding,minbet,maxbet,maxodds,timeoutblocks; uint256 entropytxid,entropytxid2,entropy,hentropy; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CScript fundingPubKey; CPubKey mypk,dicepk; uint64_t sbits,entropyval,entropyval2; int64_t funding,minbet,maxbet,maxodds,timeoutblocks; uint256 entropytxid,entropytxid2,entropy,hentropy; struct CCcontract_info *cp,C;
|
||||||
if ( bet < 0 )
|
if ( bet < 0 )
|
||||||
{
|
{
|
||||||
CCerror = "bet must be positive";
|
CCerror = "bet must be positive";
|
||||||
@@ -1464,7 +1470,8 @@ std::string DiceBet(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t bet
|
|||||||
|
|
||||||
std::string DiceBetFinish(uint8_t &funcid,uint256 &entropyused,int32_t &entropyvout,int32_t *resultp,uint64_t txfee,char *planstr,uint256 fundingtxid,uint256 bettxid,int32_t winlosetimeout,uint256 vin0txid,int32_t vin0vout)
|
std::string DiceBetFinish(uint8_t &funcid,uint256 &entropyused,int32_t &entropyvout,int32_t *resultp,uint64_t txfee,char *planstr,uint256 fundingtxid,uint256 bettxid,int32_t winlosetimeout,uint256 vin0txid,int32_t vin0vout)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx,savemtx; CScript scriptPubKey,fundingPubKey; CTransaction oldbetTx,betTx,entropyTx; uint256 hentropyproof,entropytxid,hashBlock,bettorentropy,entropy,hentropy,oldbettxid; CPubKey mypk,dicepk,fundingpk; struct CCcontract_info *cp,C; int64_t inputs=0,CCchange=0,odds,fundsneeded,minbet,maxbet,maxodds,timeoutblocks; int32_t oldentropyvout,retval=0,iswin=0; uint64_t entropyval,sbits;
|
CMutableTransaction savemtx,mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CScript scriptPubKey,fundingPubKey; CTransaction oldbetTx,betTx,entropyTx; uint256 hentropyproof,entropytxid,hashBlock,bettorentropy,entropy,hentropy,oldbettxid; CPubKey mypk,dicepk,fundingpk; struct CCcontract_info *cp,C; int64_t inputs=0,CCchange=0,odds,fundsneeded,minbet,maxbet,maxodds,timeoutblocks; int32_t oldentropyvout,retval=0,iswin=0; uint64_t entropyval,sbits;
|
||||||
entropyused = zeroid;
|
entropyused = zeroid;
|
||||||
*resultp = 0;
|
*resultp = 0;
|
||||||
funcid = 0;
|
funcid = 0;
|
||||||
@@ -1475,9 +1482,9 @@ std::string DiceBetFinish(uint8_t &funcid,uint256 &entropyused,int32_t &entropyv
|
|||||||
return("");
|
return("");
|
||||||
}
|
}
|
||||||
fundingpk = DiceFundingPk(fundingPubKey);
|
fundingpk = DiceFundingPk(fundingPubKey);
|
||||||
|
scriptPubKey = CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG;
|
||||||
if ( winlosetimeout != 0 ) // must be dealernode
|
if ( winlosetimeout != 0 ) // must be dealernode
|
||||||
{
|
{
|
||||||
scriptPubKey = CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG;
|
|
||||||
if ( scriptPubKey != fundingPubKey )
|
if ( scriptPubKey != fundingPubKey )
|
||||||
{
|
{
|
||||||
//fprintf(stderr,"only dice fund creator can submit winner or loser\n");
|
//fprintf(stderr,"only dice fund creator can submit winner or loser\n");
|
||||||
@@ -1498,7 +1505,7 @@ std::string DiceBetFinish(uint8_t &funcid,uint256 &entropyused,int32_t &entropyv
|
|||||||
{
|
{
|
||||||
if ( vin0txid == zeroid || vin0vout < 0 )
|
if ( vin0txid == zeroid || vin0vout < 0 )
|
||||||
{
|
{
|
||||||
if ( AddNormalinputs(mtx,mypk,2*txfee,1) == 0 ) // must be a single vin!!
|
if ( AddNormalinputs2(mtx,2*txfee,3) == 0 ) // must be a single vin!!
|
||||||
{
|
{
|
||||||
CCerror = "no txfee inputs for win/lose";
|
CCerror = "no txfee inputs for win/lose";
|
||||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||||
@@ -1615,6 +1622,15 @@ std::string DiceBetFinish(uint8_t &funcid,uint256 &entropyused,int32_t &entropyv
|
|||||||
//fprintf(stderr,"make tx.%c\n",funcid);
|
//fprintf(stderr,"make tx.%c\n",funcid);
|
||||||
if ( funcid == 'L' || funcid == 'W' ) // dealernode only
|
if ( funcid == 'L' || funcid == 'W' ) // dealernode only
|
||||||
hentropy = DiceHashEntropy(entropy,mtx.vin[0].prevout.hash,mtx.vin[0].prevout.n,1);
|
hentropy = DiceHashEntropy(entropy,mtx.vin[0].prevout.hash,mtx.vin[0].prevout.n,1);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( scriptPubKey != betTx.vout[2].scriptPubKey )
|
||||||
|
{
|
||||||
|
CCerror = strprintf("can only finish your own bettxid\n");
|
||||||
|
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||||
|
return("");
|
||||||
|
}
|
||||||
|
}
|
||||||
*resultp = 1;
|
*resultp = 1;
|
||||||
//char str[65],str2[65];
|
//char str[65],str2[65];
|
||||||
//fprintf(stderr,"iswin.%d house entropy %s vs bettor %s\n",iswin,uint256_str(str,hentropyproof),uint256_str(str2,bettorentropy));
|
//fprintf(stderr,"iswin.%d house entropy %s vs bettor %s\n",iswin,uint256_str(str,hentropyproof),uint256_str(str2,bettorentropy));
|
||||||
@@ -1636,22 +1652,32 @@ static uint256 dealer0_fundingtxid;
|
|||||||
void *dealer0_loop(void *_arg)
|
void *dealer0_loop(void *_arg)
|
||||||
{
|
{
|
||||||
char *planstr = (char *)_arg;
|
char *planstr = (char *)_arg;
|
||||||
CTransaction tx; CPubKey mypk,dicepk; uint64_t entropyval; uint256 entropytxid; int32_t entropytxs,i,n,num; CScript fundingPubKey; struct CCcontract_info *cp,C; char coinaddr[64]; std::string res; int64_t minbet,maxbet,maxodds,timeoutblocks; uint64_t refsbits,txfee = 10000;
|
CTransaction tx,*entropytxs,entropytx; CPubKey mypk,dicepk; uint64_t entropyval; uint256 hashBlock,entropytxid,txid; int32_t height,lastht,numentropytxs,i,n,m,num; CScript fundingPubKey; struct CCcontract_info *cp,C; char coinaddr[64]; std::string res; int64_t minbet,maxbet,maxodds,timeoutblocks; uint64_t refsbits,txfee = 10000;
|
||||||
if ( (cp= Diceinit(fundingPubKey,dealer0_fundingtxid,&C,planstr,txfee,mypk,dicepk,refsbits,minbet,maxbet,maxodds,timeoutblocks)) == 0 )
|
if ( (cp= Diceinit(fundingPubKey,dealer0_fundingtxid,&C,planstr,txfee,mypk,dicepk,refsbits,minbet,maxbet,maxodds,timeoutblocks)) == 0 )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"error initializing dealer0_loop\n");
|
fprintf(stderr,"error initializing dealer0_loop\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
fprintf(stderr,"dealer0 node running\n");
|
fprintf(stderr,"dealer0 node running\n");
|
||||||
|
height = lastht = 0;
|
||||||
|
entropytxs = (CTransaction *)calloc(sizeof(*entropytxs),DICE_MINUTXOS);
|
||||||
while ( 1 )
|
while ( 1 )
|
||||||
{
|
{
|
||||||
DicePlanFunds(entropyval,entropytxid,refsbits,cp,dicepk,dealer0_fundingtxid,entropytxs,false);
|
while ( KOMODO_INSYNC == 0 || (height= KOMODO_INSYNC) == lastht )
|
||||||
if ( entropytxs < DICE_MINUTXOS )
|
|
||||||
{
|
{
|
||||||
n = sqrt(DICE_MINUTXOS - entropytxs) + 10;
|
sleep(3);
|
||||||
for (i=0; i<DICE_MINUTXOS - entropytxs && i<n; i++)
|
}
|
||||||
|
lastht = height;
|
||||||
|
fprintf(stderr,"New height.%d\n",height);
|
||||||
|
DicePlanFunds(entropyval,entropytxid,refsbits,cp,dicepk,dealer0_fundingtxid,numentropytxs,false);
|
||||||
|
if ( numentropytxs < DICE_MINUTXOS )
|
||||||
|
{
|
||||||
|
n = sqrt(DICE_MINUTXOS - numentropytxs);
|
||||||
|
//if ( n > 10 )
|
||||||
|
// n = 10;
|
||||||
|
for (i=m=0; i<DICE_MINUTXOS - numentropytxs && i<n; i++)
|
||||||
{
|
{
|
||||||
res = DiceAddfunding(txfee,planstr,dealer0_fundingtxid,COIN/100);
|
res = DiceAddfunding(txfee,planstr,dealer0_fundingtxid,COIN);
|
||||||
if ( res.empty() == 0 && res.size() > 64 && is_hexstr((char *)res.c_str(),0) > 64 )
|
if ( res.empty() == 0 && res.size() > 64 && is_hexstr((char *)res.c_str(),0) > 64 )
|
||||||
{
|
{
|
||||||
if ( DecodeHexTx(tx,res) != 0 )
|
if ( DecodeHexTx(tx,res) != 0 )
|
||||||
@@ -1659,12 +1685,37 @@ void *dealer0_loop(void *_arg)
|
|||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
if ( myAddtomempool(tx) != 0 )
|
if ( myAddtomempool(tx) != 0 )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"ENTROPY %s: %d of %d, %d\n",tx.GetHash().GetHex().c_str(),i,n,DICE_MINUTXOS - entropytxs);
|
fprintf(stderr,"ENTROPY %s: %d of %d, %d\n",tx.GetHash().GetHex().c_str(),i,n,DICE_MINUTXOS - numentropytxs);
|
||||||
RelayTransaction(tx);
|
RelayTransaction(tx);
|
||||||
|
entropytxs[m++] = tx;
|
||||||
} else break;
|
} else break;
|
||||||
} else break;
|
} else break;
|
||||||
} else break;
|
} else break;
|
||||||
}
|
}
|
||||||
|
for (i=0; i<m; i++)
|
||||||
|
{
|
||||||
|
tx = entropytxs[i];
|
||||||
|
txid = tx.GetHash();
|
||||||
|
fprintf(stderr,"check %d of %d: %s\n",i,m,txid.GetHex().c_str());
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
if ( myGetTransaction(txid,entropytx,hashBlock) == 0 || hashBlock == zeroid )
|
||||||
|
{
|
||||||
|
LOCK(cs_main);
|
||||||
|
if ( myAddtomempool(tx) != 0 )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"resend ENTROPY %s: %d of %d\n",txid.GetHex().c_str(),i,m);
|
||||||
|
RelayTransaction(tx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr,"found %s in %s\n",txid.GetHex().c_str(),hashBlock.GetHex().c_str());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sleep(10);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
pubkey2addr(coinaddr,Mypubkey().data());
|
pubkey2addr(coinaddr,Mypubkey().data());
|
||||||
dicefinish_utxosget(num,0,0,coinaddr);
|
dicefinish_utxosget(num,0,0,coinaddr);
|
||||||
@@ -1710,6 +1761,12 @@ double DiceStatus(uint64_t txfee,char *planstr,uint256 fundingtxid,uint256 bettx
|
|||||||
GetCCaddress(cp,coinaddr,dicepk);
|
GetCCaddress(cp,coinaddr,dicepk);
|
||||||
if ( bettxid == zeroid ) // scan
|
if ( bettxid == zeroid ) // scan
|
||||||
{
|
{
|
||||||
|
if ( fundingpk != mypk )
|
||||||
|
{
|
||||||
|
CCerror = "Diceinit error in status, non-dealer must provide bettxid";
|
||||||
|
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||||
|
return(0.);
|
||||||
|
}
|
||||||
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs;
|
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs;
|
||||||
SetCCunspents(unspentOutputs,coinaddr);
|
SetCCunspents(unspentOutputs,coinaddr);
|
||||||
for (std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++)
|
for (std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++)
|
||||||
|
|||||||
@@ -174,7 +174,8 @@ int64_t AddFaucetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPub
|
|||||||
|
|
||||||
std::string FaucetGet(uint64_t txfee)
|
std::string FaucetGet(uint64_t txfee)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx,tmpmtx; CPubKey mypk,faucetpk; int64_t inputs,CCchange=0,nValue=FAUCETSIZE; struct CCcontract_info *cp,C; std::string rawhex; uint32_t j; int32_t i,len; uint8_t buf[32768]; bits256 hash;
|
CMutableTransaction tmpmtx,mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,faucetpk; int64_t inputs,CCchange=0,nValue=FAUCETSIZE; struct CCcontract_info *cp,C; std::string rawhex; uint32_t j; int32_t i,len; uint8_t buf[32768]; bits256 hash;
|
||||||
cp = CCinit(&C,EVAL_FAUCET);
|
cp = CCinit(&C,EVAL_FAUCET);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
@@ -214,7 +215,8 @@ std::string FaucetGet(uint64_t txfee)
|
|||||||
|
|
||||||
std::string FaucetFund(uint64_t txfee,int64_t funds)
|
std::string FaucetFund(uint64_t txfee,int64_t funds)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,faucetpk; CScript opret; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,faucetpk; CScript opret; struct CCcontract_info *cp,C;
|
||||||
cp = CCinit(&C,EVAL_FAUCET);
|
cp = CCinit(&C,EVAL_FAUCET);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
@@ -231,7 +233,8 @@ std::string FaucetFund(uint64_t txfee,int64_t funds)
|
|||||||
UniValue FaucetInfo()
|
UniValue FaucetInfo()
|
||||||
{
|
{
|
||||||
UniValue result(UniValue::VOBJ); char numstr[64];
|
UniValue result(UniValue::VOBJ); char numstr[64];
|
||||||
CMutableTransaction mtx; CPubKey faucetpk; struct CCcontract_info *cp,C; int64_t funding;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey faucetpk; struct CCcontract_info *cp,C; int64_t funding;
|
||||||
result.push_back(Pair("result","success"));
|
result.push_back(Pair("result","success"));
|
||||||
result.push_back(Pair("name","Faucet"));
|
result.push_back(Pair("name","Faucet"));
|
||||||
cp = CCinit(&C,EVAL_FAUCET);
|
cp = CCinit(&C,EVAL_FAUCET);
|
||||||
|
|||||||
@@ -157,7 +157,8 @@ std::string FSMList()
|
|||||||
|
|
||||||
std::string FSMCreate(uint64_t txfee,std::string name,std::string states)
|
std::string FSMCreate(uint64_t txfee,std::string name,std::string states)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,fsmpk; CScript opret; int64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,fsmpk; CScript opret; int64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C;
|
||||||
cp = CCinit(&C,EVAL_FSM);
|
cp = CCinit(&C,EVAL_FSM);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
@@ -177,7 +178,8 @@ std::string FSMCreate(uint64_t txfee,std::string name,std::string states)
|
|||||||
|
|
||||||
std::string FSMInfo(uint256 fsmtxid)
|
std::string FSMInfo(uint256 fsmtxid)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,fsmpk; int64_t funds = 0; CScript opret; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,fsmpk; int64_t funds = 0; CScript opret; struct CCcontract_info *cp,C;
|
||||||
cp = CCinit(&C,EVAL_FSM);
|
cp = CCinit(&C,EVAL_FSM);
|
||||||
mypk = pubkey2pk(Mypubkey());
|
mypk = pubkey2pk(Mypubkey());
|
||||||
fsmpk = GetUnspendable(cp,0);
|
fsmpk = GetUnspendable(cp,0);
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -143,7 +143,8 @@ int64_t AddHeirInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKe
|
|||||||
|
|
||||||
std::string HeirGet(uint64_t txfee,int64_t nValue)
|
std::string HeirGet(uint64_t txfee,int64_t nValue)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx,tmpmtx; CPubKey mypk,Heirpk; int64_t inputs,CCchange=0; struct CCcontract_info *cp,C; std::string rawhex; uint32_t j; int32_t i,len; uint8_t buf[32768]; bits256 hash;
|
CMutableTransaction tmpmtx,mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,Heirpk; int64_t inputs,CCchange=0; struct CCcontract_info *cp,C; std::string rawhex; uint32_t j; int32_t i,len; uint8_t buf[32768]; bits256 hash;
|
||||||
cp = CCinit(&C,EVAL_HEIR);
|
cp = CCinit(&C,EVAL_HEIR);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
@@ -183,7 +184,8 @@ std::string HeirGet(uint64_t txfee,int64_t nValue)
|
|||||||
|
|
||||||
std::string HeirFund(uint64_t txfee,int64_t funds)
|
std::string HeirFund(uint64_t txfee,int64_t funds)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,Heirpk; CScript opret; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,Heirpk; CScript opret; struct CCcontract_info *cp,C;
|
||||||
cp = CCinit(&C,EVAL_HEIR);
|
cp = CCinit(&C,EVAL_HEIR);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
@@ -199,8 +201,9 @@ std::string HeirFund(uint64_t txfee,int64_t funds)
|
|||||||
|
|
||||||
UniValue HeirInfo()
|
UniValue HeirInfo()
|
||||||
{
|
{
|
||||||
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
UniValue result(UniValue::VOBJ); char numstr[64];
|
UniValue result(UniValue::VOBJ); char numstr[64];
|
||||||
CMutableTransaction mtx; CPubKey Heirpk; struct CCcontract_info *cp,C; int64_t funding;
|
CPubKey Heirpk; struct CCcontract_info *cp,C; int64_t funding;
|
||||||
result.push_back(Pair("result","success"));
|
result.push_back(Pair("result","success"));
|
||||||
result.push_back(Pair("name","Heir"));
|
result.push_back(Pair("name","Heir"));
|
||||||
cp = CCinit(&C,EVAL_HEIR);
|
cp = CCinit(&C,EVAL_HEIR);
|
||||||
|
|||||||
@@ -283,7 +283,8 @@ UniValue LottoList()
|
|||||||
|
|
||||||
std::string LottoCreate(uint64_t txfee,char *planstr,int64_t funding,int32_t ticketsize,int32_t odds,int32_t firstheight,int32_t period)
|
std::string LottoCreate(uint64_t txfee,char *planstr,int64_t funding,int32_t ticketsize,int32_t odds,int32_t firstheight,int32_t period)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; uint256 entropy,hentropy; CPubKey mypk,lottopk; uint64_t sbits; int64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
uint256 entropy,hentropy; CPubKey mypk,lottopk; uint64_t sbits; int64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C;
|
||||||
cp = CCinit(&C,EVAL_LOTTO);
|
cp = CCinit(&C,EVAL_LOTTO);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
@@ -301,7 +302,8 @@ std::string LottoCreate(uint64_t txfee,char *planstr,int64_t funding,int32_t tic
|
|||||||
|
|
||||||
std::string LottoTicket(uint64_t txfee,uint256 lottoid,int64_t numtickets)
|
std::string LottoTicket(uint64_t txfee,uint256 lottoid,int64_t numtickets)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,lottopk; CScript opret; int64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,lottopk; CScript opret; int64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C;
|
||||||
cp = CCinit(&C,EVAL_LOTTO);
|
cp = CCinit(&C,EVAL_LOTTO);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
@@ -321,7 +323,8 @@ std::string LottoTicket(uint64_t txfee,uint256 lottoid,int64_t numtickets)
|
|||||||
|
|
||||||
std::string LottoWinner(uint64_t txfee)
|
std::string LottoWinner(uint64_t txfee)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,lottopk; int64_t winnings = 0; CScript opret; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,lottopk; int64_t winnings = 0; CScript opret; struct CCcontract_info *cp,C;
|
||||||
cp = CCinit(&C,EVAL_LOTTO);
|
cp = CCinit(&C,EVAL_LOTTO);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
|
|||||||
@@ -728,7 +728,8 @@ int64_t LifetimeOraclesFunds(struct CCcontract_info *cp,uint256 oracletxid,CPubK
|
|||||||
|
|
||||||
std::string OracleCreate(int64_t txfee,std::string name,std::string description,std::string format)
|
std::string OracleCreate(int64_t txfee,std::string name,std::string description,std::string format)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,Oraclespk; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,Oraclespk; struct CCcontract_info *cp,C;
|
||||||
cp = CCinit(&C,EVAL_ORACLES);
|
cp = CCinit(&C,EVAL_ORACLES);
|
||||||
if ( name.size() > 32 || description.size() > 4096 || format.size() > 4096 )
|
if ( name.size() > 32 || description.size() > 4096 || format.size() > 4096 )
|
||||||
{
|
{
|
||||||
@@ -739,7 +740,7 @@ std::string OracleCreate(int64_t txfee,std::string name,std::string description,
|
|||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
mypk = pubkey2pk(Mypubkey());
|
mypk = pubkey2pk(Mypubkey());
|
||||||
Oraclespk = GetUnspendable(cp,0);
|
Oraclespk = GetUnspendable(cp,0);
|
||||||
if ( AddNormalinputs(mtx,mypk,2*txfee,1) > 0 )
|
if ( AddNormalinputs(mtx,mypk,2*txfee,3) > 0 )
|
||||||
{
|
{
|
||||||
mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(Oraclespk)) << OP_CHECKSIG));
|
mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(Oraclespk)) << OP_CHECKSIG));
|
||||||
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeOraclesCreateOpRet('C',name,description,format)));
|
return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeOraclesCreateOpRet('C',name,description,format)));
|
||||||
@@ -749,7 +750,8 @@ std::string OracleCreate(int64_t txfee,std::string name,std::string description,
|
|||||||
|
|
||||||
std::string OracleRegister(int64_t txfee,uint256 oracletxid,int64_t datafee)
|
std::string OracleRegister(int64_t txfee,uint256 oracletxid,int64_t datafee)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,markerpubkey,batonpk; struct CCcontract_info *cp,C; char markeraddr[64],batonaddr[64];
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,markerpubkey,batonpk; struct CCcontract_info *cp,C; char markeraddr[64],batonaddr[64];
|
||||||
cp = CCinit(&C,EVAL_ORACLES);
|
cp = CCinit(&C,EVAL_ORACLES);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
@@ -772,13 +774,14 @@ std::string OracleRegister(int64_t txfee,uint256 oracletxid,int64_t datafee)
|
|||||||
|
|
||||||
std::string OracleSubscribe(int64_t txfee,uint256 oracletxid,CPubKey publisher,int64_t amount)
|
std::string OracleSubscribe(int64_t txfee,uint256 oracletxid,CPubKey publisher,int64_t amount)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,markerpubkey; struct CCcontract_info *cp,C; char markeraddr[64];
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,markerpubkey; struct CCcontract_info *cp,C; char markeraddr[64];
|
||||||
cp = CCinit(&C,EVAL_ORACLES);
|
cp = CCinit(&C,EVAL_ORACLES);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
mypk = pubkey2pk(Mypubkey());
|
mypk = pubkey2pk(Mypubkey());
|
||||||
markerpubkey = CCtxidaddr(markeraddr,oracletxid);
|
markerpubkey = CCtxidaddr(markeraddr,oracletxid);
|
||||||
if ( AddNormalinputs(mtx,mypk,amount + 2*txfee,1) > 0 )
|
if ( AddNormalinputs(mtx,mypk,amount + 2*txfee,64) > 0 )
|
||||||
{
|
{
|
||||||
mtx.vout.push_back(MakeCC1vout(cp->evalcode,amount,publisher));
|
mtx.vout.push_back(MakeCC1vout(cp->evalcode,amount,publisher));
|
||||||
mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(markerpubkey)) << OP_CHECKSIG));
|
mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(markerpubkey)) << OP_CHECKSIG));
|
||||||
@@ -789,7 +792,8 @@ std::string OracleSubscribe(int64_t txfee,uint256 oracletxid,CPubKey publisher,i
|
|||||||
|
|
||||||
std::string OracleData(int64_t txfee,uint256 oracletxid,std::vector <uint8_t> data)
|
std::string OracleData(int64_t txfee,uint256 oracletxid,std::vector <uint8_t> data)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CScript pubKey; CPubKey mypk,batonpk; int64_t datafee,inputs,CCchange = 0; struct CCcontract_info *cp,C; uint256 batontxid; char coinaddr[64],batonaddr[64]; std::vector <uint8_t> prevdata;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CScript pubKey; CPubKey mypk,batonpk; int64_t datafee,inputs,CCchange = 0; struct CCcontract_info *cp,C; uint256 batontxid; char coinaddr[64],batonaddr[64]; std::vector <uint8_t> prevdata;
|
||||||
cp = CCinit(&C,EVAL_ORACLES);
|
cp = CCinit(&C,EVAL_ORACLES);
|
||||||
mypk = pubkey2pk(Mypubkey());
|
mypk = pubkey2pk(Mypubkey());
|
||||||
if ( data.size() > 8192 )
|
if ( data.size() > 8192 )
|
||||||
@@ -879,7 +883,8 @@ UniValue OracleInfo(uint256 origtxid)
|
|||||||
{
|
{
|
||||||
UniValue result(UniValue::VOBJ),a(UniValue::VARR);
|
UniValue result(UniValue::VOBJ),a(UniValue::VARR);
|
||||||
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs;
|
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > unspentOutputs;
|
||||||
CMutableTransaction mtx; CTransaction regtx,tx; std::string name,description,format; uint256 hashBlock,txid,oracletxid,batontxid; CPubKey pk; struct CCcontract_info *cp,C; int64_t datafee,funding; char str[67],markeraddr[64],numstr[64],batonaddr[64]; std::vector <uint8_t> data;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CTransaction regtx,tx; std::string name,description,format; uint256 hashBlock,txid,oracletxid,batontxid; CPubKey pk; struct CCcontract_info *cp,C; int64_t datafee,funding; char str[67],markeraddr[64],numstr[64],batonaddr[64]; std::vector <uint8_t> data;
|
||||||
cp = CCinit(&C,EVAL_ORACLES);
|
cp = CCinit(&C,EVAL_ORACLES);
|
||||||
CCtxidaddr(markeraddr,origtxid);
|
CCtxidaddr(markeraddr,origtxid);
|
||||||
if ( GetTransaction(origtxid,tx,hashBlock,false) == 0 )
|
if ( GetTransaction(origtxid,tx,hashBlock,false) == 0 )
|
||||||
|
|||||||
@@ -144,7 +144,8 @@ int64_t AddPaymentsInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP
|
|||||||
|
|
||||||
std::string PaymentsGet(uint64_t txfee,int64_t nValue)
|
std::string PaymentsGet(uint64_t txfee,int64_t nValue)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx,tmpmtx; CPubKey mypk,Paymentspk; int64_t inputs,CCchange=0; struct CCcontract_info *cp,C; std::string rawhex; uint32_t j; int32_t i,len; uint8_t buf[32768]; bits256 hash;
|
CMutableTransaction tmpmtx,mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,Paymentspk; int64_t inputs,CCchange=0; struct CCcontract_info *cp,C; std::string rawhex; uint32_t j; int32_t i,len; uint8_t buf[32768]; bits256 hash;
|
||||||
cp = CCinit(&C,EVAL_PAYMENTS);
|
cp = CCinit(&C,EVAL_PAYMENTS);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
@@ -184,7 +185,8 @@ std::string PaymentsGet(uint64_t txfee,int64_t nValue)
|
|||||||
|
|
||||||
std::string PaymentsFund(uint64_t txfee,int64_t funds)
|
std::string PaymentsFund(uint64_t txfee,int64_t funds)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,Paymentspk; CScript opret; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,Paymentspk; CScript opret; struct CCcontract_info *cp,C;
|
||||||
cp = CCinit(&C,EVAL_PAYMENTS);
|
cp = CCinit(&C,EVAL_PAYMENTS);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
@@ -201,7 +203,8 @@ std::string PaymentsFund(uint64_t txfee,int64_t funds)
|
|||||||
UniValue PaymentsInfo()
|
UniValue PaymentsInfo()
|
||||||
{
|
{
|
||||||
UniValue result(UniValue::VOBJ); char numstr[64];
|
UniValue result(UniValue::VOBJ); char numstr[64];
|
||||||
CMutableTransaction mtx; CPubKey Paymentspk; struct CCcontract_info *cp,C; int64_t funding;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey Paymentspk; struct CCcontract_info *cp,C; int64_t funding;
|
||||||
result.push_back(Pair("result","success"));
|
result.push_back(Pair("result","success"));
|
||||||
result.push_back(Pair("name","Payments"));
|
result.push_back(Pair("name","Payments"));
|
||||||
cp = CCinit(&C,EVAL_PAYMENTS);
|
cp = CCinit(&C,EVAL_PAYMENTS);
|
||||||
|
|||||||
@@ -151,7 +151,8 @@ int64_t AddPegsInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKe
|
|||||||
|
|
||||||
std::string PegsGet(uint64_t txfee,int64_t nValue)
|
std::string PegsGet(uint64_t txfee,int64_t nValue)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx,tmpmtx; CPubKey mypk,Pegspk; int64_t inputs,CCchange=0; struct CCcontract_info *cp,C; std::string rawhex; uint32_t j; int32_t i,len; uint8_t buf[32768]; bits256 hash;
|
CMutableTransaction tmpmtx,mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,Pegspk; int64_t inputs,CCchange=0; struct CCcontract_info *cp,C; std::string rawhex; uint32_t j; int32_t i,len; uint8_t buf[32768]; bits256 hash;
|
||||||
cp = CCinit(&C,EVAL_PEGS);
|
cp = CCinit(&C,EVAL_PEGS);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
@@ -191,7 +192,8 @@ std::string PegsGet(uint64_t txfee,int64_t nValue)
|
|||||||
|
|
||||||
std::string PegsFund(uint64_t txfee,int64_t funds)
|
std::string PegsFund(uint64_t txfee,int64_t funds)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,Pegspk; CScript opret; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,Pegspk; CScript opret; struct CCcontract_info *cp,C;
|
||||||
cp = CCinit(&C,EVAL_PEGS);
|
cp = CCinit(&C,EVAL_PEGS);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
@@ -208,7 +210,8 @@ std::string PegsFund(uint64_t txfee,int64_t funds)
|
|||||||
UniValue PegsInfo()
|
UniValue PegsInfo()
|
||||||
{
|
{
|
||||||
UniValue result(UniValue::VOBJ); char numstr[64];
|
UniValue result(UniValue::VOBJ); char numstr[64];
|
||||||
CMutableTransaction mtx; CPubKey Pegspk; struct CCcontract_info *cp,C; int64_t funding;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey Pegspk; struct CCcontract_info *cp,C; int64_t funding;
|
||||||
result.push_back(Pair("result","success"));
|
result.push_back(Pair("result","success"));
|
||||||
result.push_back(Pair("name","Pegs"));
|
result.push_back(Pair("name","Pegs"));
|
||||||
cp = CCinit(&C,EVAL_PEGS);
|
cp = CCinit(&C,EVAL_PEGS);
|
||||||
|
|||||||
@@ -182,7 +182,8 @@ UniValue PricesList()
|
|||||||
// bettoken
|
// bettoken
|
||||||
std::string PricesCreateFunding(uint64_t txfee,uint256 bettoken,uint256 oracletxid,uint64_t margin,uint64_t mode,uint256 longtoken,uint256 shorttoken,int32_t maxleverage,int64_t funding,std::vector<CPubKey> pubkeys)
|
std::string PricesCreateFunding(uint64_t txfee,uint256 bettoken,uint256 oracletxid,uint64_t margin,uint64_t mode,uint256 longtoken,uint256 shorttoken,int32_t maxleverage,int64_t funding,std::vector<CPubKey> pubkeys)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CTransaction oracletx; int64_t fullsupply,inputs,CCchange=0; uint256 hashBlock; char str[65],coinaddr[64],houseaddr[64]; CPubKey mypk,pricespk; int32_t i,N,numvouts; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CTransaction oracletx; int64_t fullsupply,inputs,CCchange=0; uint256 hashBlock; char str[65],coinaddr[64],houseaddr[64]; CPubKey mypk,pricespk; int32_t i,N,numvouts; struct CCcontract_info *cp,C;
|
||||||
if ( funding < 100*COIN || maxleverage <= 0 || maxleverage > 10000 )
|
if ( funding < 100*COIN || maxleverage <= 0 || maxleverage > 10000 )
|
||||||
{
|
{
|
||||||
CCerror = "invalid parameter error";
|
CCerror = "invalid parameter error";
|
||||||
@@ -229,7 +230,7 @@ std::string PricesCreateFunding(uint64_t txfee,uint256 bettoken,uint256 oracletx
|
|||||||
return("");
|
return("");
|
||||||
}
|
}
|
||||||
fprintf(stderr,"error check bettoken\n");
|
fprintf(stderr,"error check bettoken\n");
|
||||||
if ( AddNormalinputs(mtx,mypk,3*txfee,3) > 0 )
|
if ( AddNormalinputs(mtx,mypk,3*txfee,4) > 0 )
|
||||||
{
|
{
|
||||||
mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG));
|
mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG));
|
||||||
mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(pricespk)) << OP_CHECKSIG));
|
mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(pricespk)) << OP_CHECKSIG));
|
||||||
@@ -293,7 +294,8 @@ UniValue PricesInfo(uint256 fundingtxid)
|
|||||||
|
|
||||||
std::string PricesAddFunding(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,int64_t amount)
|
std::string PricesAddFunding(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,int64_t amount)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; struct CCcontract_info *cp,C; CPubKey pricespk,planpk,mypk; uint256 hashBlock,oracletxid,longtoken,shorttoken,bettoken; CTransaction tx; int64_t balance,supply,exposure,inputs,CCchange = 0; uint64_t funding,mode; int32_t margin,maxleverage; char houseaddr[64],myaddr[64]; std::vector<CPubKey>pubkeys;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
struct CCcontract_info *cp,C; CPubKey pricespk,planpk,mypk; uint256 hashBlock,oracletxid,longtoken,shorttoken,bettoken; CTransaction tx; int64_t balance,supply,exposure,inputs,CCchange = 0; uint64_t funding,mode; int32_t margin,maxleverage; char houseaddr[64],myaddr[64]; std::vector<CPubKey>pubkeys;
|
||||||
if ( amount < 10000 )
|
if ( amount < 10000 )
|
||||||
{
|
{
|
||||||
CCerror = "amount must be positive";
|
CCerror = "amount must be positive";
|
||||||
@@ -343,7 +345,8 @@ std::string PricesAddFunding(uint64_t txfee,uint256 refbettoken,uint256 fundingt
|
|||||||
|
|
||||||
std::string PricesBet(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,int64_t amount,int32_t leverage)
|
std::string PricesBet(uint64_t txfee,uint256 refbettoken,uint256 fundingtxid,int64_t amount,int32_t leverage)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; struct CCcontract_info *cp,C; CPubKey pricespk,planpk,mypk; uint256 hashBlock,oracletxid,longtoken,shorttoken,tokenid,bettoken; CTransaction tx; int64_t balance,supply,exposure,inputs,inputs2,longexposure,netexposure,shortexposure,CCchange = 0,CCchange2 = 0; uint64_t funding,mode; int32_t dir,margin,maxleverage; char houseaddr[64],myaddr[64],exposureaddr[64]; std::vector<CPubKey>pubkeys;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
struct CCcontract_info *cp,C; CPubKey pricespk,planpk,mypk; uint256 hashBlock,oracletxid,longtoken,shorttoken,tokenid,bettoken; CTransaction tx; int64_t balance,supply,exposure,inputs,inputs2,longexposure,netexposure,shortexposure,CCchange = 0,CCchange2 = 0; uint64_t funding,mode; int32_t dir,margin,maxleverage; char houseaddr[64],myaddr[64],exposureaddr[64]; std::vector<CPubKey>pubkeys;
|
||||||
if ( amount < 0 )
|
if ( amount < 0 )
|
||||||
{
|
{
|
||||||
amount = -amount;
|
amount = -amount;
|
||||||
|
|||||||
@@ -500,7 +500,8 @@ UniValue RewardsList()
|
|||||||
|
|
||||||
std::string RewardsCreateFunding(uint64_t txfee,char *planstr,int64_t funds,int64_t APR,int64_t minseconds,int64_t maxseconds,int64_t mindeposit)
|
std::string RewardsCreateFunding(uint64_t txfee,char *planstr,int64_t funds,int64_t APR,int64_t minseconds,int64_t maxseconds,int64_t mindeposit)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,rewardspk; CScript opret; uint64_t sbits,a,b,c,d; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,rewardspk; CScript opret; uint64_t sbits,a,b,c,d; struct CCcontract_info *cp,C;
|
||||||
if ( funds < COIN || mindeposit < 0 || minseconds < 0 || maxseconds < 0 )
|
if ( funds < COIN || mindeposit < 0 || minseconds < 0 || maxseconds < 0 )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"negative parameter error\n");
|
fprintf(stderr,"negative parameter error\n");
|
||||||
@@ -534,7 +535,8 @@ std::string RewardsCreateFunding(uint64_t txfee,char *planstr,int64_t funds,int6
|
|||||||
|
|
||||||
std::string RewardsAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t amount)
|
std::string RewardsAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t amount)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,rewardspk; CScript opret; uint64_t sbits,a,b,c,d; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,rewardspk; CScript opret; uint64_t sbits,a,b,c,d; struct CCcontract_info *cp,C;
|
||||||
if ( amount < 0 )
|
if ( amount < 0 )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"negative parameter error\n");
|
fprintf(stderr,"negative parameter error\n");
|
||||||
@@ -568,7 +570,8 @@ std::string RewardsAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,i
|
|||||||
|
|
||||||
std::string RewardsLock(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t deposit)
|
std::string RewardsLock(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t deposit)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,rewardspk; CScript opret; uint64_t lockedfunds,sbits,funding,APR,minseconds,maxseconds,mindeposit; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,rewardspk; CScript opret; uint64_t lockedfunds,sbits,funding,APR,minseconds,maxseconds,mindeposit; struct CCcontract_info *cp,C;
|
||||||
if ( deposit < txfee )
|
if ( deposit < txfee )
|
||||||
{
|
{
|
||||||
CCerror = "deposit amount less than txfee";
|
CCerror = "deposit amount less than txfee";
|
||||||
@@ -611,7 +614,8 @@ std::string RewardsLock(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t
|
|||||||
|
|
||||||
std::string RewardsUnlock(uint64_t txfee,char *planstr,uint256 fundingtxid,uint256 locktxid)
|
std::string RewardsUnlock(uint64_t txfee,char *planstr,uint256 fundingtxid,uint256 locktxid)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx,firstmtx; CTransaction tx; char coinaddr[64]; CPubKey mypk,rewardspk; CScript scriptPubKey,ignore; uint256 hashBlock; uint64_t sbits,APR,minseconds,maxseconds,mindeposit; int64_t funding,reward=0,amount=0,inputs,CCchange=0; struct CCcontract_info *cp,C;
|
CMutableTransaction firstmtx,mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CTransaction tx; char coinaddr[64]; CPubKey mypk,rewardspk; CScript scriptPubKey,ignore; uint256 hashBlock; uint64_t sbits,APR,minseconds,maxseconds,mindeposit; int64_t funding,reward=0,amount=0,inputs,CCchange=0; struct CCcontract_info *cp,C;
|
||||||
cp = CCinit(&C,EVAL_REWARDS);
|
cp = CCinit(&C,EVAL_REWARDS);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
|
|||||||
@@ -143,7 +143,8 @@ int64_t AddTriggersInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP
|
|||||||
|
|
||||||
std::string TriggersGet(uint64_t txfee,int64_t nValue)
|
std::string TriggersGet(uint64_t txfee,int64_t nValue)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx,tmpmtx; CPubKey mypk,Triggerspk; int64_t inputs,CCchange=0; struct CCcontract_info *cp,C; std::string rawhex; uint32_t j; int32_t i,len; uint8_t buf[32768]; bits256 hash;
|
CMutableTransaction tmpmtx,mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,Triggerspk; int64_t inputs,CCchange=0; struct CCcontract_info *cp,C; std::string rawhex; uint32_t j; int32_t i,len; uint8_t buf[32768]; bits256 hash;
|
||||||
cp = CCinit(&C,EVAL_TRIGGERS);
|
cp = CCinit(&C,EVAL_TRIGGERS);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
@@ -183,7 +184,8 @@ std::string TriggersGet(uint64_t txfee,int64_t nValue)
|
|||||||
|
|
||||||
std::string TriggersFund(uint64_t txfee,int64_t funds)
|
std::string TriggersFund(uint64_t txfee,int64_t funds)
|
||||||
{
|
{
|
||||||
CMutableTransaction mtx; CPubKey mypk,Triggerspk; CScript opret; struct CCcontract_info *cp,C;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey mypk,Triggerspk; CScript opret; struct CCcontract_info *cp,C;
|
||||||
cp = CCinit(&C,EVAL_TRIGGERS);
|
cp = CCinit(&C,EVAL_TRIGGERS);
|
||||||
if ( txfee == 0 )
|
if ( txfee == 0 )
|
||||||
txfee = 10000;
|
txfee = 10000;
|
||||||
@@ -200,7 +202,8 @@ std::string TriggersFund(uint64_t txfee,int64_t funds)
|
|||||||
UniValue TriggersInfo()
|
UniValue TriggersInfo()
|
||||||
{
|
{
|
||||||
UniValue result(UniValue::VOBJ); char numstr[64];
|
UniValue result(UniValue::VOBJ); char numstr[64];
|
||||||
CMutableTransaction mtx; CPubKey Triggerspk; struct CCcontract_info *cp,C; int64_t funding;
|
CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight());
|
||||||
|
CPubKey Triggerspk; struct CCcontract_info *cp,C; int64_t funding;
|
||||||
result.push_back(Pair("result","success"));
|
result.push_back(Pair("result","success"));
|
||||||
result.push_back(Pair("name","Triggers"));
|
result.push_back(Pair("name","Triggers"));
|
||||||
cp = CCinit(&C,EVAL_TRIGGERS);
|
cp = CCinit(&C,EVAL_TRIGGERS);
|
||||||
|
|||||||
@@ -1486,7 +1486,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
|||||||
pblocktree = new CBlockTreeDB(nBlockTreeDBCache, false, fReindex, dbCompression, dbMaxOpenFiles);
|
pblocktree = new CBlockTreeDB(nBlockTreeDBCache, false, fReindex, dbCompression, dbMaxOpenFiles);
|
||||||
fAddressIndex = GetBoolArg("-addressindex", DEFAULT_ADDRESSINDEX);
|
fAddressIndex = GetBoolArg("-addressindex", DEFAULT_ADDRESSINDEX);
|
||||||
pblocktree->ReadFlag("addressindex", checkval);
|
pblocktree->ReadFlag("addressindex", checkval);
|
||||||
if ( checkval != fAddressIndex )
|
if ( checkval != fAddressIndex && fAddressIndex != 0 )
|
||||||
{
|
{
|
||||||
pblocktree->WriteFlag("addressindex", fAddressIndex);
|
pblocktree->WriteFlag("addressindex", fAddressIndex);
|
||||||
fprintf(stderr,"set addressindex, will reindex. could take a while.\n");
|
fprintf(stderr,"set addressindex, will reindex. could take a while.\n");
|
||||||
@@ -1494,7 +1494,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
|||||||
}
|
}
|
||||||
fSpentIndex = GetBoolArg("-spentindex", DEFAULT_SPENTINDEX);
|
fSpentIndex = GetBoolArg("-spentindex", DEFAULT_SPENTINDEX);
|
||||||
pblocktree->ReadFlag("spentindex", checkval);
|
pblocktree->ReadFlag("spentindex", checkval);
|
||||||
if ( checkval != fSpentIndex )
|
if ( checkval != fSpentIndex && fSpentIndex != 0 )
|
||||||
{
|
{
|
||||||
pblocktree->WriteFlag("spentindex", fSpentIndex);
|
pblocktree->WriteFlag("spentindex", fSpentIndex);
|
||||||
fprintf(stderr,"set spentindex, will reindex. could take a while.\n");
|
fprintf(stderr,"set spentindex, will reindex. could take a while.\n");
|
||||||
|
|||||||
@@ -1062,6 +1062,14 @@ uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t komodo_nextheight()
|
||||||
|
{
|
||||||
|
CBlockIndex *pindex; int32_t ht,longest = komodo_longestchain();
|
||||||
|
if ( (pindex= chainActive.LastTip()) != 0 && (ht= pindex->GetHeight()) >= longest )
|
||||||
|
return(ht+1);
|
||||||
|
else return(longest + 1);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t komodo_isrealtime(int32_t *kmdheightp)
|
int32_t komodo_isrealtime(int32_t *kmdheightp)
|
||||||
{
|
{
|
||||||
struct komodo_state *sp; CBlockIndex *pindex;
|
struct komodo_state *sp; CBlockIndex *pindex;
|
||||||
@@ -1763,12 +1771,12 @@ int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height)
|
|||||||
{
|
{
|
||||||
if ( (is_PoSblock= komodo_is_PoSblock(slowflag,height,pblock,bnTarget,bhash)) == 0 )
|
if ( (is_PoSblock= komodo_is_PoSblock(slowflag,height,pblock,bnTarget,bhash)) == 0 )
|
||||||
{
|
{
|
||||||
|
if ( slowflag == 0 ) // need all past 100 blocks to calculate PoW target
|
||||||
|
return(0);
|
||||||
if ( ASSETCHAINS_STAKED == 100 && height > 100 ) // only PoS allowed! POSTEST64
|
if ( ASSETCHAINS_STAKED == 100 && height > 100 ) // only PoS allowed! POSTEST64
|
||||||
return(-1);
|
return(-1);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ( slowflag == 0 ) // need all past 100 blocks to calculate PoW target
|
|
||||||
return(0);
|
|
||||||
if ( slowflag != 0 )
|
if ( slowflag != 0 )
|
||||||
bnTarget = komodo_PoWtarget(&PoSperc,bnTarget,height,ASSETCHAINS_STAKED);
|
bnTarget = komodo_PoWtarget(&PoSperc,bnTarget,height,ASSETCHAINS_STAKED);
|
||||||
if ( bhash > bnTarget )
|
if ( bhash > bnTarget )
|
||||||
@@ -1788,6 +1796,8 @@ int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height)
|
|||||||
fprintf(stderr,"unexpected negative is_PoSblock.%d\n",is_PoSblock);
|
fprintf(stderr,"unexpected negative is_PoSblock.%d\n",is_PoSblock);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
else if ( ASSETCHAINS_STAKED != 0 )
|
||||||
|
failed = 0;
|
||||||
}
|
}
|
||||||
if ( failed == 0 && ASSETCHAINS_COMMISSION != 0 ) //ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 )
|
if ( failed == 0 && ASSETCHAINS_COMMISSION != 0 ) //ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 )
|
||||||
{
|
{
|
||||||
@@ -1816,7 +1826,7 @@ int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height)
|
|||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//fprintf(stderr,"komodo_checkPOW possible.%d slowflag.%d ht.%d notaryid.%d failed.%d\n",possible,slowflag,height,notaryid,failed);
|
//fprintf(stderr,"komodo_checkPOW possible.%d slowflag.%d ht.%d notaryid.%d failed.%d\n",possible,slowflag,height,notaryid,failed);
|
||||||
if ( failed != 0 && possible == 0 && notaryid < 0 )
|
if ( failed != 0 && possible == 0 && notaryid < 0 )
|
||||||
return(-1);
|
return(-1);
|
||||||
else return(0);
|
else return(0);
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
#define KOMODO_FIRSTFUNGIBLEID 100
|
#define KOMODO_FIRSTFUNGIBLEID 100
|
||||||
#define KOMODO_SAPLING_ACTIVATION 1544832000 // Dec 15th, 2018
|
#define KOMODO_SAPLING_ACTIVATION 1544832000 // Dec 15th, 2018
|
||||||
#define KOMODO_SAPLING_DEADLINE 1550188800 // Feb 15th, 2019
|
#define KOMODO_SAPLING_DEADLINE 1550188800 // Feb 15th, 2019
|
||||||
|
|
||||||
extern uint8_t ASSETCHAINS_TXPOW,ASSETCHAINS_PUBLIC;
|
extern uint8_t ASSETCHAINS_TXPOW,ASSETCHAINS_PUBLIC;
|
||||||
int32_t MAX_BLOCK_SIZE(int32_t height);
|
int32_t MAX_BLOCK_SIZE(int32_t height);
|
||||||
|
|
||||||
|
|||||||
@@ -48,8 +48,11 @@
|
|||||||
#define KOMODO_KVDURATION 1440
|
#define KOMODO_KVDURATION 1440
|
||||||
#define KOMODO_ASSETCHAIN_MAXLEN 65
|
#define KOMODO_ASSETCHAIN_MAXLEN 65
|
||||||
|
|
||||||
union _bits256 { uint8_t bytes[32]; uint16_t ushorts[16]; uint32_t uints[8]; uint64_t ulongs[4]; uint64_t txid; };
|
#ifndef _BITS256
|
||||||
typedef union _bits256 bits256;
|
#define _BITS256
|
||||||
|
union _bits256 { uint8_t bytes[32]; uint16_t ushorts[16]; uint32_t uints[8]; uint64_t ulongs[4]; uint64_t txid; };
|
||||||
|
typedef union _bits256 bits256;
|
||||||
|
#endif
|
||||||
|
|
||||||
union _bits320 { uint8_t bytes[40]; uint16_t ushorts[20]; uint32_t uints[10]; uint64_t ulongs[5]; uint64_t txid; };
|
union _bits320 { uint8_t bytes[40]; uint16_t ushorts[20]; uint32_t uints[10]; uint64_t ulongs[5]; uint64_t txid; };
|
||||||
typedef union _bits320 bits320;
|
typedef union _bits320 bits320;
|
||||||
|
|||||||
@@ -1778,7 +1778,7 @@ void komodo_args(char *argv0)
|
|||||||
if ( (ASSETCHAINS_LWMAPOS = GetArg("-ac_veruspos",0)) != 0 )
|
if ( (ASSETCHAINS_LWMAPOS = GetArg("-ac_veruspos",0)) != 0 )
|
||||||
ASSETCHAINS_LWMAPOS = 50;
|
ASSETCHAINS_LWMAPOS = 50;
|
||||||
|
|
||||||
/*ASSETCHAINS_SAPLING = GetArg("-ac_sapling", -1);
|
ASSETCHAINS_SAPLING = GetArg("-ac_sapling", -1);
|
||||||
if (ASSETCHAINS_SAPLING == -1)
|
if (ASSETCHAINS_SAPLING == -1)
|
||||||
{
|
{
|
||||||
ASSETCHAINS_OVERWINTER = GetArg("-ac_overwinter", -1);
|
ASSETCHAINS_OVERWINTER = GetArg("-ac_overwinter", -1);
|
||||||
@@ -1786,7 +1786,7 @@ void komodo_args(char *argv0)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
ASSETCHAINS_OVERWINTER = GetArg("-ac_overwinter", ASSETCHAINS_SAPLING);
|
ASSETCHAINS_OVERWINTER = GetArg("-ac_overwinter", ASSETCHAINS_SAPLING);
|
||||||
}*/
|
}
|
||||||
if ( strlen(ASSETCHAINS_OVERRIDE_PUBKEY.c_str()) == 66 || ASSETCHAINS_SCRIPTPUB.size() > 1 )
|
if ( strlen(ASSETCHAINS_OVERRIDE_PUBKEY.c_str()) == 66 || ASSETCHAINS_SCRIPTPUB.size() > 1 )
|
||||||
{
|
{
|
||||||
if ( strlen(ASSETCHAINS_OVERRIDE_PUBKEY.c_str()) == 66 )
|
if ( strlen(ASSETCHAINS_OVERRIDE_PUBKEY.c_str()) == 66 )
|
||||||
|
|||||||
20
src/main.cpp
20
src/main.cpp
@@ -1979,6 +1979,7 @@ bool myAddtomempool(CTransaction &tx, CValidationState *pstate)
|
|||||||
|
|
||||||
bool myGetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock)
|
bool myGetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock)
|
||||||
{
|
{
|
||||||
|
memset(&hashBlock,0,sizeof(hashBlock));
|
||||||
// need a GetTransaction without lock so the validation code for assets can run without deadlock
|
// need a GetTransaction without lock so the validation code for assets can run without deadlock
|
||||||
{
|
{
|
||||||
//fprintf(stderr,"check mempool\n");
|
//fprintf(stderr,"check mempool\n");
|
||||||
@@ -2022,6 +2023,7 @@ bool myGetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlo
|
|||||||
bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock, bool fAllowSlow)
|
bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock, bool fAllowSlow)
|
||||||
{
|
{
|
||||||
CBlockIndex *pindexSlow = NULL;
|
CBlockIndex *pindexSlow = NULL;
|
||||||
|
memset(&hashBlock,0,sizeof(hashBlock));
|
||||||
|
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
|
|
||||||
@@ -3824,7 +3826,7 @@ int32_t komodo_activate_sapling(CBlockIndex *pindex)
|
|||||||
}
|
}
|
||||||
height = pindex->GetHeight();
|
height = pindex->GetHeight();
|
||||||
blocktime = (uint32_t)pindex->nTime;
|
blocktime = (uint32_t)pindex->nTime;
|
||||||
fprintf(stderr,"komodo_activate_sapling.%d starting blocktime %u cmp.%d\n",height,blocktime,blocktime > KOMODO_SAPLING_ACTIVATION);
|
//fprintf(stderr,"komodo_activate_sapling.%d starting blocktime %u cmp.%d\n",height,blocktime,blocktime > KOMODO_SAPLING_ACTIVATION);
|
||||||
|
|
||||||
// avoid trying unless we have at least 30 blocks
|
// avoid trying unless we have at least 30 blocks
|
||||||
if (height < 30)
|
if (height < 30)
|
||||||
@@ -3901,7 +3903,7 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock *
|
|||||||
pblock = █
|
pblock = █
|
||||||
}
|
}
|
||||||
KOMODO_CONNECTING = (int32_t)pindexNew->GetHeight();
|
KOMODO_CONNECTING = (int32_t)pindexNew->GetHeight();
|
||||||
fprintf(stderr,"%s connecting ht.%d maxsize.%d vs %d\n",ASSETCHAINS_SYMBOL,(int32_t)pindexNew->GetHeight(),MAX_BLOCK_SIZE(pindexNew->GetHeight()),(int32_t)::GetSerializeSize(*pblock, SER_NETWORK, PROTOCOL_VERSION));
|
//fprintf(stderr,"%s connecting ht.%d maxsize.%d vs %d\n",ASSETCHAINS_SYMBOL,(int32_t)pindexNew->GetHeight(),MAX_BLOCK_SIZE(pindexNew->GetHeight()),(int32_t)::GetSerializeSize(*pblock, SER_NETWORK, PROTOCOL_VERSION));
|
||||||
// Get the current commitment tree
|
// Get the current commitment tree
|
||||||
SproutMerkleTree oldSproutTree;
|
SproutMerkleTree oldSproutTree;
|
||||||
SaplingMerkleTree oldSaplingTree;
|
SaplingMerkleTree oldSaplingTree;
|
||||||
@@ -4678,7 +4680,7 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C
|
|||||||
const uint256 &hash = tx.GetHash();
|
const uint256 &hash = tx.GetHash();
|
||||||
if ( tx.vjoinsplit.size() == 0 ) {
|
if ( tx.vjoinsplit.size() == 0 ) {
|
||||||
transactionsToRemove.push_back(tx);
|
transactionsToRemove.push_back(tx);
|
||||||
tmpmempool.addUnchecked(hash,e,!IsInitialBlockDownload());
|
tmpmempool.addUnchecked(hash,e,true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BOOST_FOREACH(const CTransaction& tx, transactionsToRemove) {
|
BOOST_FOREACH(const CTransaction& tx, transactionsToRemove) {
|
||||||
@@ -4756,6 +4758,7 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C
|
|||||||
// here we add back all txs from the temp mempool to the main mempool.
|
// here we add back all txs from the temp mempool to the main mempool.
|
||||||
// which removes any tx locally that were invalid after the block arrives.
|
// which removes any tx locally that were invalid after the block arrives.
|
||||||
int invalidtxs = 0;
|
int invalidtxs = 0;
|
||||||
|
LOCK(mempool.cs);
|
||||||
BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx) {
|
BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx) {
|
||||||
CTransaction tx = e.GetTx();
|
CTransaction tx = e.GetTx();
|
||||||
CValidationState state; bool fMissingInputs,fOverrideFees = false;
|
CValidationState state; bool fMissingInputs,fOverrideFees = false;
|
||||||
@@ -5201,11 +5204,11 @@ bool ProcessNewBlock(bool from_miner,int32_t height,CValidationState &state, CNo
|
|||||||
CheckBlockIndex();
|
CheckBlockIndex();
|
||||||
if (!ret && futureblock == 0)
|
if (!ret && futureblock == 0)
|
||||||
{
|
{
|
||||||
if ( ASSETCHAINS_SYMBOL[0] == 0 )
|
/*if ( ASSETCHAINS_SYMBOL[0] == 0 )
|
||||||
{
|
{
|
||||||
//fprintf(stderr,"request headers from failed process block peer\n");
|
//fprintf(stderr,"request headers from failed process block peer\n");
|
||||||
pfrom->PushMessage("getheaders", chainActive.GetLocator(chainActive.LastTip()), uint256());
|
pfrom->PushMessage("getheaders", chainActive.GetLocator(chainActive.LastTip()), uint256());
|
||||||
}
|
}*/
|
||||||
komodo_longestchain();
|
komodo_longestchain();
|
||||||
return error("%s: AcceptBlock FAILED", __func__);
|
return error("%s: AcceptBlock FAILED", __func__);
|
||||||
}
|
}
|
||||||
@@ -5623,8 +5626,11 @@ bool static LoadBlockIndexDB()
|
|||||||
CBlockIndex *pindex;
|
CBlockIndex *pindex;
|
||||||
if ( (pindex= chainActive.LastTip()) != 0 )
|
if ( (pindex= chainActive.LastTip()) != 0 )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"set sapling height, if possible from ht.%d %u\n",(int32_t)pindex->GetHeight(),(uint32_t)pindex->nTime);
|
if ( ASSETCHAINS_SAPLING <= 0 )
|
||||||
komodo_activate_sapling(pindex);
|
{
|
||||||
|
fprintf(stderr,"set sapling height, if possible from ht.%d %u\n",(int32_t)pindex->GetHeight(),(uint32_t)pindex->nTime);
|
||||||
|
komodo_activate_sapling(pindex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -463,8 +463,6 @@ CBlockTemplate* CreateNewBlock(const CScript& _scriptPubKeyIn, int32_t gpucount,
|
|||||||
uint64_t txfees,utxovalue; uint32_t txtime; uint256 utxotxid; int32_t i,siglen,numsigs,utxovout; uint8_t utxosig[128],*ptr;
|
uint64_t txfees,utxovalue; uint32_t txtime; uint256 utxotxid; int32_t i,siglen,numsigs,utxovout; uint8_t utxosig[128],*ptr;
|
||||||
CMutableTransaction txStaked = CreateNewContextualCMutableTransaction(Params().GetConsensus(), stakeHeight);
|
CMutableTransaction txStaked = CreateNewContextualCMutableTransaction(Params().GetConsensus(), stakeHeight);
|
||||||
|
|
||||||
//if ( blocktime > pindexPrev->GetMedianTimePast()+60 )
|
|
||||||
// blocktime = pindexPrev->GetMedianTimePast() + 60;
|
|
||||||
if (ASSETCHAINS_LWMAPOS != 0)
|
if (ASSETCHAINS_LWMAPOS != 0)
|
||||||
{
|
{
|
||||||
uint32_t nBitsPOS;
|
uint32_t nBitsPOS;
|
||||||
@@ -479,6 +477,9 @@ CBlockTemplate* CreateNewBlock(const CScript& _scriptPubKeyIn, int32_t gpucount,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
blocktime = GetAdjustedTime();
|
||||||
|
//if ( blocktime > pindexPrev->GetMedianTimePast()+60 )
|
||||||
|
// blocktime = pindexPrev->GetMedianTimePast() + 60;
|
||||||
siglen = komodo_staked(txStaked, pblock->nBits, &blocktime, &txtime, &utxotxid, &utxovout, &utxovalue, utxosig);
|
siglen = komodo_staked(txStaked, pblock->nBits, &blocktime, &txtime, &utxotxid, &utxovout, &utxovalue, utxosig);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -606,9 +606,10 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp)
|
|||||||
return BIP22ValidationResult(state);
|
return BIP22ValidationResult(state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
if (strMode != "template")
|
{
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid mode");
|
strMode = "template";
|
||||||
|
}
|
||||||
|
|
||||||
bool fvNodesEmpty;
|
bool fvNodesEmpty;
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ int32_t Jumblr_secretaddradd(char *secretaddr);
|
|||||||
uint64_t komodo_interestsum();
|
uint64_t komodo_interestsum();
|
||||||
int32_t komodo_longestchain();
|
int32_t komodo_longestchain();
|
||||||
int32_t komodo_notarized_height(int32_t *prevhtp,uint256 *hashp,uint256 *txidp);
|
int32_t komodo_notarized_height(int32_t *prevhtp,uint256 *hashp,uint256 *txidp);
|
||||||
|
bool komodo_txnotarizedconfirmed(uint256 txid);
|
||||||
uint32_t komodo_chainactive_timestamp();
|
uint32_t komodo_chainactive_timestamp();
|
||||||
int32_t komodo_whoami(char *pubkeystr,int32_t height,uint32_t timestamp);
|
int32_t komodo_whoami(char *pubkeystr,int32_t height,uint32_t timestamp);
|
||||||
extern uint64_t KOMODO_INTERESTSUM,KOMODO_WALLETBALANCE;
|
extern uint64_t KOMODO_INTERESTSUM,KOMODO_WALLETBALANCE;
|
||||||
@@ -55,7 +56,7 @@ extern char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN];
|
|||||||
uint32_t komodo_segid32(char *coinaddr);
|
uint32_t komodo_segid32(char *coinaddr);
|
||||||
int64_t komodo_coinsupply(int64_t *zfundsp,int32_t height);
|
int64_t komodo_coinsupply(int64_t *zfundsp,int32_t height);
|
||||||
int32_t notarizedtxid_height(char *dest,char *txidstr,int32_t *kmdnotarized_heightp);
|
int32_t notarizedtxid_height(char *dest,char *txidstr,int32_t *kmdnotarized_heightp);
|
||||||
#define KOMODO_VERSION "0.3.1"
|
#define KOMODO_VERSION "0.3.2"
|
||||||
#define VERUS_VERSION "0.4.0g"
|
#define VERUS_VERSION "0.4.0g"
|
||||||
extern uint16_t ASSETCHAINS_P2PPORT,ASSETCHAINS_RPCPORT;
|
extern uint16_t ASSETCHAINS_P2PPORT,ASSETCHAINS_RPCPORT;
|
||||||
extern uint32_t ASSETCHAINS_CC;
|
extern uint32_t ASSETCHAINS_CC;
|
||||||
@@ -1295,6 +1296,32 @@ UniValue getspentinfo(const UniValue& params, bool fHelp)
|
|||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UniValue txnotarizedconfirmed(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
bool notarizedconfirmed; uint256 txid;
|
||||||
|
|
||||||
|
if (fHelp || params.size() < 1 || params.size() > 1)
|
||||||
|
{
|
||||||
|
string msg = "txnotarizedconfirmed txid\n"
|
||||||
|
"\nReturns true if transaction is notarized on chain that has dPoW or if confirmation number is greater than 60 on chain taht does not have dPoW.\n"
|
||||||
|
|
||||||
|
"\nArguments:\n"
|
||||||
|
"1. txid (string, required) Transaction id.\n"
|
||||||
|
|
||||||
|
"\nResult:\n"
|
||||||
|
"{\n"
|
||||||
|
" true, (bool) The value the check.\n"
|
||||||
|
"}\n"
|
||||||
|
;
|
||||||
|
throw runtime_error(msg);
|
||||||
|
}
|
||||||
|
txid = uint256S((char *)params[0].get_str().c_str());
|
||||||
|
notarizedconfirmed=komodo_txnotarizedconfirmed(txid);
|
||||||
|
UniValue result(UniValue::VOBJ);
|
||||||
|
result.push_back(Pair("result", notarizedconfirmed));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static const CRPCCommand commands[] =
|
static const CRPCCommand commands[] =
|
||||||
{ // category name actor (function) okSafeMode
|
{ // category name actor (function) okSafeMode
|
||||||
// --------------------- ------------------------ ----------------------- ----------
|
// --------------------- ------------------------ ----------------------- ----------
|
||||||
|
|||||||
@@ -437,10 +437,12 @@ static const CRPCCommand vRPCCommands[] =
|
|||||||
{ "gateways", "gatewaysdeposit", &gatewaysdeposit, true },
|
{ "gateways", "gatewaysdeposit", &gatewaysdeposit, true },
|
||||||
{ "gateways", "gatewaysclaim", &gatewaysclaim, true },
|
{ "gateways", "gatewaysclaim", &gatewaysclaim, true },
|
||||||
{ "gateways", "gatewayswithdraw", &gatewayswithdraw, true },
|
{ "gateways", "gatewayswithdraw", &gatewayswithdraw, true },
|
||||||
{ "gateways", "gatewayspending", &gatewayspending, true },
|
|
||||||
{ "gateways", "gatewaysmultisig", &gatewaysmultisig, true },
|
|
||||||
{ "gateways", "gatewaysmarkdone", &gatewaysmarkdone, true },
|
|
||||||
{ "gateways", "gatewayspartialsign", &gatewayspartialsign, true },
|
{ "gateways", "gatewayspartialsign", &gatewayspartialsign, true },
|
||||||
|
{ "gateways", "gatewayscompletesigning", &gatewayscompletesigning, true },
|
||||||
|
{ "gateways", "gatewaysmarkdone", &gatewaysmarkdone, true },
|
||||||
|
{ "gateways", "gatewayspending", &gatewayspending, true },
|
||||||
|
{ "gateways", "gatewaysprocessed", &gatewaysprocessed, true },
|
||||||
|
{ "gateways", "gatewaysmultisig", &gatewaysmultisig, true },
|
||||||
|
|
||||||
// dice
|
// dice
|
||||||
{ "dice", "dicelist", &dicelist, true },
|
{ "dice", "dicelist", &dicelist, true },
|
||||||
@@ -468,6 +470,7 @@ static const CRPCCommand vRPCCommands[] =
|
|||||||
{ "tokens", "tokencancelask", &tokencancelask, true },
|
{ "tokens", "tokencancelask", &tokencancelask, true },
|
||||||
{ "tokens", "tokenfillask", &tokenfillask, true },
|
{ "tokens", "tokenfillask", &tokenfillask, true },
|
||||||
//{ "tokens", "tokenfillswap", &tokenfillswap, true },
|
//{ "tokens", "tokenfillswap", &tokenfillswap, true },
|
||||||
|
{ "tokens", "tokenconvert", &tokenconvert, true },
|
||||||
|
|
||||||
/* Address index */
|
/* Address index */
|
||||||
{ "addressindex", "getaddressmempool", &getaddressmempool, true },
|
{ "addressindex", "getaddressmempool", &getaddressmempool, true },
|
||||||
@@ -481,6 +484,7 @@ static const CRPCCommand vRPCCommands[] =
|
|||||||
{ "util", "createmultisig", &createmultisig, true },
|
{ "util", "createmultisig", &createmultisig, true },
|
||||||
{ "util", "validateaddress", &validateaddress, true }, /* uses wallet if enabled */
|
{ "util", "validateaddress", &validateaddress, true }, /* uses wallet if enabled */
|
||||||
{ "util", "verifymessage", &verifymessage, true },
|
{ "util", "verifymessage", &verifymessage, true },
|
||||||
|
{ "util", "txnotarizedconfirmed", &txnotarizedconfirmed, true },
|
||||||
{ "util", "estimatefee", &estimatefee, true },
|
{ "util", "estimatefee", &estimatefee, true },
|
||||||
{ "util", "estimatepriority", &estimatepriority, true },
|
{ "util", "estimatepriority", &estimatepriority, true },
|
||||||
{ "util", "z_validateaddress", &z_validateaddress, true }, /* uses wallet if enabled */
|
{ "util", "z_validateaddress", &z_validateaddress, true }, /* uses wallet if enabled */
|
||||||
|
|||||||
@@ -265,10 +265,12 @@ extern UniValue gatewaysbind(const UniValue& params, bool fHelp);
|
|||||||
extern UniValue gatewaysdeposit(const UniValue& params, bool fHelp);
|
extern UniValue gatewaysdeposit(const UniValue& params, bool fHelp);
|
||||||
extern UniValue gatewaysclaim(const UniValue& params, bool fHelp);
|
extern UniValue gatewaysclaim(const UniValue& params, bool fHelp);
|
||||||
extern UniValue gatewayswithdraw(const UniValue& params, bool fHelp);
|
extern UniValue gatewayswithdraw(const UniValue& params, bool fHelp);
|
||||||
extern UniValue gatewayspending(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue gatewaysmarkdone(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue gatewaysmultisig(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue gatewayspartialsign(const UniValue& params, bool fHelp);
|
extern UniValue gatewayspartialsign(const UniValue& params, bool fHelp);
|
||||||
|
extern UniValue gatewayscompletesigning(const UniValue& params, bool fHelp);
|
||||||
|
extern UniValue gatewaysmarkdone(const UniValue& params, bool fHelp);
|
||||||
|
extern UniValue gatewayspending(const UniValue& params, bool fHelp);
|
||||||
|
extern UniValue gatewaysprocessed(const UniValue& params, bool fHelp);
|
||||||
|
extern UniValue gatewaysmultisig(const UniValue& params, bool fHelp);
|
||||||
extern UniValue channelsinfo(const UniValue& params, bool fHelp);
|
extern UniValue channelsinfo(const UniValue& params, bool fHelp);
|
||||||
extern UniValue channelsopen(const UniValue& params, bool fHelp);
|
extern UniValue channelsopen(const UniValue& params, bool fHelp);
|
||||||
extern UniValue channelspayment(const UniValue& params, bool fHelp);
|
extern UniValue channelspayment(const UniValue& params, bool fHelp);
|
||||||
@@ -337,6 +339,7 @@ extern UniValue walletpassphrasechange(const UniValue& params, bool fHelp);
|
|||||||
extern UniValue walletlock(const UniValue& params, bool fHelp);
|
extern UniValue walletlock(const UniValue& params, bool fHelp);
|
||||||
extern UniValue encryptwallet(const UniValue& params, bool fHelp);
|
extern UniValue encryptwallet(const UniValue& params, bool fHelp);
|
||||||
extern UniValue validateaddress(const UniValue& params, bool fHelp);
|
extern UniValue validateaddress(const UniValue& params, bool fHelp);
|
||||||
|
extern UniValue txnotarizedconfirmed(const UniValue& params, bool fHelp);
|
||||||
extern UniValue getinfo(const UniValue& params, bool fHelp);
|
extern UniValue getinfo(const UniValue& params, bool fHelp);
|
||||||
extern UniValue setpubkey(const UniValue& params, bool fHelp);
|
extern UniValue setpubkey(const UniValue& params, bool fHelp);
|
||||||
extern UniValue getwalletinfo(const UniValue& params, bool fHelp);
|
extern UniValue getwalletinfo(const UniValue& params, bool fHelp);
|
||||||
|
|||||||
16
src/txdb.cpp
16
src/txdb.cpp
@@ -424,7 +424,7 @@ bool getAddressFromIndex(const int &type, const uint160 &hash, std::string &addr
|
|||||||
|
|
||||||
UniValue CBlockTreeDB::Snapshot(int top)
|
UniValue CBlockTreeDB::Snapshot(int top)
|
||||||
{
|
{
|
||||||
char chType; int64_t total = 0; int64_t totalAddresses = 0; std::string address;
|
int64_t total = 0; int64_t totalAddresses = 0; std::string address;
|
||||||
int64_t utxos = 0; int64_t ignoredAddresses;
|
int64_t utxos = 0; int64_t ignoredAddresses;
|
||||||
boost::scoped_ptr<CDBIterator> iter(NewIterator());
|
boost::scoped_ptr<CDBIterator> iter(NewIterator());
|
||||||
std::map <std::string, CAmount> addressAmounts;
|
std::map <std::string, CAmount> addressAmounts;
|
||||||
@@ -460,22 +460,18 @@ UniValue CBlockTreeDB::Snapshot(int top)
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
std::vector<unsigned char> slKey = std::vector<unsigned char>();
|
std::vector<unsigned char> slKey = std::vector<unsigned char>();
|
||||||
iter->GetKey(slKey);
|
pair<char, CAddressIndexIteratorKey> keyObj;
|
||||||
CDataStream ssKey(slKey, SER_DISK, CLIENT_VERSION);
|
iter->GetKey(keyObj);
|
||||||
CAddressIndexIteratorKey indexKey;
|
|
||||||
|
|
||||||
ssKey >> chType;
|
char chType = keyObj.first;
|
||||||
ssKey >> indexKey;
|
CAddressIndexIteratorKey indexKey = keyObj.second;
|
||||||
|
|
||||||
//fprintf(stderr, "chType=%d\n", chType);
|
//fprintf(stderr, "chType=%d\n", chType);
|
||||||
if (chType == DB_ADDRESSUNSPENTINDEX)
|
if (chType == DB_ADDRESSUNSPENTINDEX)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
std::vector<unsigned char> slValue = std::vector<unsigned char>();
|
|
||||||
iter->GetValue(slValue);
|
|
||||||
CDataStream ssValue(slValue, SER_DISK, CLIENT_VERSION);
|
|
||||||
CAmount nValue;
|
CAmount nValue;
|
||||||
ssValue >> nValue;
|
iter->GetValue(nValue);
|
||||||
|
|
||||||
getAddressFromIndex(indexKey.type, indexKey.hashBytes, address);
|
getAddressFromIndex(indexKey.type, indexKey.hashBytes, address);
|
||||||
|
|
||||||
|
|||||||
@@ -1319,9 +1319,9 @@ UniValue sendmany(const UniValue& params, bool fHelp)
|
|||||||
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, std::string("Invalid Zcash address: ") + name_);
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, std::string("Invalid Zcash address: ") + name_);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (destinations.count(dest)) {
|
/*if (destinations.count(dest)) {
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, std::string("Invalid parameter, duplicated address: ") + name_);
|
throw JSONRPCError(RPC_INVALID_PARAMETER, std::string("Invalid parameter, duplicated address: ") + name_);
|
||||||
}
|
}*/
|
||||||
destinations.insert(dest);
|
destinations.insert(dest);
|
||||||
|
|
||||||
CScript scriptPubKey = GetScriptForDestination(dest);
|
CScript scriptPubKey = GetScriptForDestination(dest);
|
||||||
@@ -5059,8 +5059,10 @@ struct komodo_staking *komodo_addutxo(struct komodo_staking *array,int32_t *numk
|
|||||||
{
|
{
|
||||||
*maxkp += 1000;
|
*maxkp += 1000;
|
||||||
array = (struct komodo_staking *)realloc(array,sizeof(*array) * (*maxkp));
|
array = (struct komodo_staking *)realloc(array,sizeof(*array) * (*maxkp));
|
||||||
|
//fprintf(stderr,"realloc max.%d array.%p\n",*maxkp,array);
|
||||||
}
|
}
|
||||||
kp = &array[(*numkp)++];
|
kp = &array[(*numkp)++];
|
||||||
|
//fprintf(stderr,"kp.%p num.%d\n",kp,*numkp);
|
||||||
memset(kp,0,sizeof(*kp));
|
memset(kp,0,sizeof(*kp));
|
||||||
strcpy(kp->address,address);
|
strcpy(kp->address,address);
|
||||||
kp->txid = txid;
|
kp->txid = txid;
|
||||||
@@ -5083,15 +5085,11 @@ arith_uint256 _komodo_eligible(struct komodo_staking *kp,arith_uint256 ratio,uin
|
|||||||
diff = 3600*24*30;
|
diff = 3600*24*30;
|
||||||
if ( iter > 0 )
|
if ( iter > 0 )
|
||||||
diff += segid*2;
|
diff += segid*2;
|
||||||
coinage = ((uint64_t)kp->nValue/COIN * diff);
|
coinage = ((uint64_t)kp->nValue * diff);
|
||||||
if ( blocktime+iter+segid*2 > prevtime+480 )
|
if ( blocktime+iter+segid*2 > prevtime+480 )
|
||||||
coinage *= ((blocktime+iter+segid*2) - (prevtime+400));
|
coinage *= ((blocktime+iter+segid*2) - (prevtime+400));
|
||||||
//if ( nHeight >= 2500 && blocktime+iter+segid*2 > prevtime+180 )
|
|
||||||
// coinage *= ((blocktime+iter+segid*2) - (prevtime+60));
|
|
||||||
coinage256 = arith_uint256(coinage+1);
|
coinage256 = arith_uint256(coinage+1);
|
||||||
hashval = ratio * (kp->hashval / coinage256);
|
hashval = ratio * (kp->hashval / coinage256);
|
||||||
//if ( nHeight >= 900 && nHeight < 916 )
|
|
||||||
// hashval = (hashval / coinage256);
|
|
||||||
return(hashval);
|
return(hashval);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5121,7 +5119,7 @@ uint32_t komodo_eligible(arith_uint256 bnTarget,arith_uint256 ratio,struct komod
|
|||||||
return(blocktime);
|
return(blocktime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else fprintf(stderr,"maxiters is not good enough\n");
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5148,10 +5146,10 @@ int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blockt
|
|||||||
if ( (minage= nHeight*3) > 6000 ) // about 100 blocks
|
if ( (minage= nHeight*3) > 6000 ) // about 100 blocks
|
||||||
minage = 6000;
|
minage = 6000;
|
||||||
komodo_segids(hashbuf,nHeight-101,100);
|
komodo_segids(hashbuf,nHeight-101,100);
|
||||||
if ( *blocktimep > tipindex->nTime+60 )
|
if ( *blocktimep < tipindex->nTime+60 )
|
||||||
*blocktimep = tipindex->nTime+60;
|
*blocktimep = tipindex->nTime+60;
|
||||||
//fprintf(stderr,"Start scan of utxo for staking %u ht.%d\n",(uint32_t)time(NULL),nHeight);
|
//fprintf(stderr,"Start scan of utxo for staking %u ht.%d\n",(uint32_t)time(NULL),nHeight);
|
||||||
if ( time(NULL) > lasttime+600 )
|
if ( time(NULL) > lasttime+600 || array == 0 )
|
||||||
{
|
{
|
||||||
if ( array != 0 )
|
if ( array != 0 )
|
||||||
{
|
{
|
||||||
@@ -5170,7 +5168,7 @@ int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blockt
|
|||||||
counter++;
|
counter++;
|
||||||
if ( out.nDepth < nMinDepth || out.nDepth > nMaxDepth )
|
if ( out.nDepth < nMinDepth || out.nDepth > nMaxDepth )
|
||||||
{
|
{
|
||||||
//fprintf(stderr,"komodo_staked invalid depth %d\n",(int32_t)out.nDepth);
|
fprintf(stderr,"komodo_staked invalid depth %d\n",(int32_t)out.nDepth);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
CAmount nValue = out.tx->vout[out.i].nValue;
|
CAmount nValue = out.tx->vout[out.i].nValue;
|
||||||
@@ -5184,12 +5182,14 @@ int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blockt
|
|||||||
if ( GetTransaction(out.tx->GetHash(),tx,hashBlock,true) != 0 && (pindex= komodo_getblockindex(hashBlock)) != 0 )
|
if ( GetTransaction(out.tx->GetHash(),tx,hashBlock,true) != 0 && (pindex= komodo_getblockindex(hashBlock)) != 0 )
|
||||||
{
|
{
|
||||||
array = komodo_addutxo(array,&numkp,&maxkp,(uint32_t)pindex->nTime,(uint64_t)nValue,out.tx->GetHash(),out.i,(char *)CBitcoinAddress(address).ToString().c_str(),hashbuf,(CScript)pk);
|
array = komodo_addutxo(array,&numkp,&maxkp,(uint32_t)pindex->nTime,(uint64_t)nValue,out.tx->GetHash(),out.i,(char *)CBitcoinAddress(address).ToString().c_str(),hashbuf,(CScript)pk);
|
||||||
|
//fprintf(stderr,"addutxo numkp.%d vs max.%d\n",numkp,maxkp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lasttime = (uint32_t)time(NULL);
|
lasttime = (uint32_t)time(NULL);
|
||||||
//fprintf(stderr,"finished kp data of utxo for staking %u ht.%d numkp.%d maxkp.%d\n",(uint32_t)time(NULL),nHeight,numkp,maxkp);
|
//fprintf(stderr,"finished kp data of utxo for staking %u ht.%d numkp.%d maxkp.%d\n",(uint32_t)time(NULL),nHeight,numkp,maxkp);
|
||||||
}
|
}
|
||||||
|
//fprintf(stderr,"numkp.%d blocktime.%u\n",numkp,*blocktimep);
|
||||||
block_from_future_rejecttime = (uint32_t)GetAdjustedTime() + 57;
|
block_from_future_rejecttime = (uint32_t)GetAdjustedTime() + 57;
|
||||||
for (i=winners=0; i<numkp; i++)
|
for (i=winners=0; i<numkp; i++)
|
||||||
{
|
{
|
||||||
@@ -5202,7 +5202,7 @@ int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blockt
|
|||||||
if ( (eligible2= komodo_eligible(bnTarget,ratio,kp,nHeight,*blocktimep,(uint32_t)tipindex->nTime+27,minage,hashbuf)) == 0 )
|
if ( (eligible2= komodo_eligible(bnTarget,ratio,kp,nHeight,*blocktimep,(uint32_t)tipindex->nTime+27,minage,hashbuf)) == 0 )
|
||||||
continue;
|
continue;
|
||||||
eligible = komodo_stake(0,bnTarget,nHeight,kp->txid,kp->vout,0,(uint32_t)tipindex->nTime+27,kp->address);
|
eligible = komodo_stake(0,bnTarget,nHeight,kp->txid,kp->vout,0,(uint32_t)tipindex->nTime+27,kp->address);
|
||||||
//fprintf(stderr,"i.%d %u vs %u\n",i,eligible2,eligible);
|
//fprintf(stderr,"i.%d %u vs %u\n",i,eligible2,eligible);
|
||||||
if ( eligible > 0 )
|
if ( eligible > 0 )
|
||||||
{
|
{
|
||||||
besttime = m = 0;
|
besttime = m = 0;
|
||||||
@@ -5215,7 +5215,7 @@ int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blockt
|
|||||||
if ( eligible < block_from_future_rejecttime ) // nothing gained by going earlier
|
if ( eligible < block_from_future_rejecttime ) // nothing gained by going earlier
|
||||||
break;
|
break;
|
||||||
m++;
|
m++;
|
||||||
//fprintf(stderr,"m.%d ht.%d validated winning blocktime %u -> %.8f eligible.%u test prior\n",m,nHeight,*blocktimep,(double)kp->nValue/COIN,eligible);
|
//fprintf(stderr,"m.%d ht.%d validated winning blocktime %u -> %.8f eligible.%u test prior\n",m,nHeight,*blocktimep,(double)kp->nValue/COIN,eligible);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -5225,7 +5225,7 @@ int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blockt
|
|||||||
}
|
}
|
||||||
eligible = besttime;
|
eligible = besttime;
|
||||||
winners++;
|
winners++;
|
||||||
//fprintf(stderr,"ht.%d validated winning [%d] -> %.8f eligible.%u test prior\n",nHeight,(int32_t)(eligible - tipindex->nTime),(double)kp->nValue/COIN,eligible);
|
//fprintf(stderr,"ht.%d validated winning [%d] -> %.8f eligible.%u test prior\n",nHeight,(int32_t)(eligible - tipindex->nTime),(double)kp->nValue/COIN,eligible);
|
||||||
if ( earliest == 0 || eligible < earliest || (eligible == earliest && (*utxovaluep == 0 || kp->nValue < *utxovaluep)) )
|
if ( earliest == 0 || eligible < earliest || (eligible == earliest && (*utxovaluep == 0 || kp->nValue < *utxovaluep)) )
|
||||||
{
|
{
|
||||||
earliest = eligible;
|
earliest = eligible;
|
||||||
@@ -5238,7 +5238,7 @@ int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blockt
|
|||||||
fprintf(stderr,"ht.%d earliest.%u [%d].%d (%s) nValue %.8f locktime.%u counter.%d winners.%d\n",nHeight,earliest,(int32_t)(earliest - tipindex->nTime),m,kp->address,(double)kp->nValue/COIN,*txtimep,counter,winners);
|
fprintf(stderr,"ht.%d earliest.%u [%d].%d (%s) nValue %.8f locktime.%u counter.%d winners.%d\n",nHeight,earliest,(int32_t)(earliest - tipindex->nTime),m,kp->address,(double)kp->nValue/COIN,*txtimep,counter,winners);
|
||||||
}
|
}
|
||||||
} //else fprintf(stderr,"utxo not eligible\n");
|
} //else fprintf(stderr,"utxo not eligible\n");
|
||||||
} //else fprintf(stderr,"no tipindex\n");
|
}
|
||||||
if ( numkp < 10000 && array != 0 )
|
if ( numkp < 10000 && array != 0 )
|
||||||
{
|
{
|
||||||
free(array);
|
free(array);
|
||||||
@@ -5273,7 +5273,7 @@ int32_t komodo_staked(CMutableTransaction &txNew,uint32_t nBits,uint32_t *blockt
|
|||||||
for (i=0; i<siglen; i++)
|
for (i=0; i<siglen; i++)
|
||||||
utxosig[i] = ptr[i];//, fprintf(stderr,"%02x",ptr[i]);
|
utxosig[i] = ptr[i];//, fprintf(stderr,"%02x",ptr[i]);
|
||||||
//fprintf(stderr," siglen.%d\n",siglen);
|
//fprintf(stderr," siglen.%d\n",siglen);
|
||||||
//fprintf(stderr,"best %u from %u, gap %d lag.%d\n",earliest,*blocktimep,(int32_t)(earliest - *blocktimep),(int32_t)(time(NULL) - *blocktimep));
|
//fprintf(stderr,"best %u from %u, gap %d lag.%d\n",earliest,*blocktimep,(int32_t)(earliest - *blocktimep),(int32_t)(time(NULL) - *blocktimep));
|
||||||
*blocktimep = earliest;
|
*blocktimep = earliest;
|
||||||
}
|
}
|
||||||
} //else fprintf(stderr,"no earliest utxo for staking\n");
|
} //else fprintf(stderr,"no earliest utxo for staking\n");
|
||||||
@@ -5310,6 +5310,7 @@ int32_t ensure_CCrequirements()
|
|||||||
#include "../cc/CCOracles.h"
|
#include "../cc/CCOracles.h"
|
||||||
#include "../cc/CCGateways.h"
|
#include "../cc/CCGateways.h"
|
||||||
#include "../cc/CCPrices.h"
|
#include "../cc/CCPrices.h"
|
||||||
|
#include "../cc/CCHeir.h"
|
||||||
|
|
||||||
UniValue CCaddress(struct CCcontract_info *cp,char *name,std::vector<unsigned char> &pubkey)
|
UniValue CCaddress(struct CCcontract_info *cp,char *name,std::vector<unsigned char> &pubkey)
|
||||||
{
|
{
|
||||||
@@ -5531,15 +5532,25 @@ UniValue gatewaysaddress(const UniValue& params, bool fHelp)
|
|||||||
|
|
||||||
UniValue heiraddress(const UniValue& params, bool fHelp)
|
UniValue heiraddress(const UniValue& params, bool fHelp)
|
||||||
{
|
{
|
||||||
struct CCcontract_info *cp,C; std::vector<unsigned char> pubkey;
|
struct CCcontract_info *cp,C; std::vector<unsigned char> destPubkey;
|
||||||
|
|
||||||
cp = CCinit(&C,EVAL_HEIR);
|
cp = CCinit(&C,EVAL_HEIR);
|
||||||
if ( fHelp || params.size() > 1 )
|
if ( fHelp || (params.size() != 4 && params.size() != 3))
|
||||||
throw runtime_error("heiraddress [pubkey]\n");
|
throw runtime_error("heiraddress func txid amount [destpubkey]\n");
|
||||||
if ( ensure_CCrequirements() < 0 )
|
if ( ensure_CCrequirements() < 0 )
|
||||||
throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n");
|
throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n");
|
||||||
if ( params.size() == 1 )
|
//if ( params.size() == 1 )
|
||||||
pubkey = ParseHex(params[0].get_str().c_str());
|
// pubkey = ParseHex(params[0].get_str().c_str());
|
||||||
return(CCaddress(cp,(char *)"Heir",pubkey));
|
|
||||||
|
char funcid = ((char *)params[0].get_str().c_str())[0];
|
||||||
|
uint256 assetid = Parseuint256((char *)params[1].get_str().c_str());
|
||||||
|
int64_t funds = atof(params[2].get_str().c_str()) * COIN ;
|
||||||
|
if(params.size() == 4)
|
||||||
|
destPubkey = ParseHex(params[3].get_str().c_str());
|
||||||
|
|
||||||
|
//return HeirFundBad(funcid, assetid, funds, destPubkey);
|
||||||
|
|
||||||
|
return(CCaddress(cp,(char *)"Heir",destPubkey));
|
||||||
}
|
}
|
||||||
|
|
||||||
UniValue lottoaddress(const UniValue& params, bool fHelp)
|
UniValue lottoaddress(const UniValue& params, bool fHelp)
|
||||||
@@ -5981,6 +5992,8 @@ UniValue gatewaysbind(const UniValue& params, bool fHelp)
|
|||||||
if ( params.size() < 6+i+1 )
|
if ( params.size() < 6+i+1 )
|
||||||
throw runtime_error("not enough parameters for N pubkeys\n");
|
throw runtime_error("not enough parameters for N pubkeys\n");
|
||||||
pubkey = ParseHex(params[6+i].get_str().c_str());
|
pubkey = ParseHex(params[6+i].get_str().c_str());
|
||||||
|
if (pubkey.size()!= 33)
|
||||||
|
throw runtime_error("invalid destination pubkey");
|
||||||
pubkeys.push_back(pubkey2pk(pubkey));
|
pubkeys.push_back(pubkey2pk(pubkey));
|
||||||
}
|
}
|
||||||
hex = GatewaysBind(0,coin,tokenid,totalsupply,oracletxid,M,N,pubkeys);
|
hex = GatewaysBind(0,coin,tokenid,totalsupply,oracletxid,M,N,pubkeys);
|
||||||
@@ -6013,6 +6026,8 @@ UniValue gatewaysdeposit(const UniValue& params, bool fHelp)
|
|||||||
amount = atof((char *)params[8].get_str().c_str()) * COIN + 0.00000000499999;
|
amount = atof((char *)params[8].get_str().c_str()) * COIN + 0.00000000499999;
|
||||||
if ( amount <= 0 || claimvout < 0 )
|
if ( amount <= 0 || claimvout < 0 )
|
||||||
throw runtime_error("invalid param: amount, numpks or claimvout\n");
|
throw runtime_error("invalid param: amount, numpks or claimvout\n");
|
||||||
|
if (destpub.size()!= 33)
|
||||||
|
throw runtime_error("invalid destination pubkey");
|
||||||
hex = GatewaysDeposit(0,bindtxid,height,coin,cointxid,claimvout,deposithex,proof,pubkey2pk(destpub),amount);
|
hex = GatewaysDeposit(0,bindtxid,height,coin,cointxid,claimvout,deposithex,proof,pubkey2pk(destpub),amount);
|
||||||
|
|
||||||
RETURN_IF_ERROR(CCerror);
|
RETURN_IF_ERROR(CCerror);
|
||||||
@@ -6037,7 +6052,9 @@ UniValue gatewaysclaim(const UniValue& params, bool fHelp)
|
|||||||
coin = params[1].get_str();
|
coin = params[1].get_str();
|
||||||
deposittxid = Parseuint256((char *)params[2].get_str().c_str());
|
deposittxid = Parseuint256((char *)params[2].get_str().c_str());
|
||||||
destpub = ParseHex(params[3].get_str());
|
destpub = ParseHex(params[3].get_str());
|
||||||
amount = atof((char *)params[4].get_str().c_str()) * COIN + 0.00000000499999;
|
amount = atof((char *)params[4].get_str().c_str()) * COIN + 0.00000000499999;
|
||||||
|
if (destpub.size()!= 33)
|
||||||
|
throw runtime_error("invalid destination pubkey");
|
||||||
hex = GatewaysClaim(0,bindtxid,coin,deposittxid,pubkey2pk(destpub),amount);
|
hex = GatewaysClaim(0,bindtxid,coin,deposittxid,pubkey2pk(destpub),amount);
|
||||||
RETURN_IF_ERROR(CCerror);
|
RETURN_IF_ERROR(CCerror);
|
||||||
if ( hex.size() > 0 )
|
if ( hex.size() > 0 )
|
||||||
@@ -6060,7 +6077,9 @@ UniValue gatewayswithdraw(const UniValue& params, bool fHelp)
|
|||||||
bindtxid = Parseuint256((char *)params[0].get_str().c_str());
|
bindtxid = Parseuint256((char *)params[0].get_str().c_str());
|
||||||
coin = params[1].get_str();
|
coin = params[1].get_str();
|
||||||
withdrawpub = ParseHex(params[2].get_str());
|
withdrawpub = ParseHex(params[2].get_str());
|
||||||
amount = atof((char *)params[3].get_str().c_str()) * COIN + 0.00000000499999;
|
amount = atof((char *)params[3].get_str().c_str()) * COIN + 0.00000000499999;
|
||||||
|
if (withdrawpub.size()!= 33)
|
||||||
|
throw runtime_error("invalid destination pubkey");
|
||||||
hex = GatewaysWithdraw(0,bindtxid,coin,pubkey2pk(withdrawpub),amount);
|
hex = GatewaysWithdraw(0,bindtxid,coin,pubkey2pk(withdrawpub),amount);
|
||||||
RETURN_IF_ERROR(CCerror);
|
RETURN_IF_ERROR(CCerror);
|
||||||
if ( hex.size() > 0 )
|
if ( hex.size() > 0 )
|
||||||
@@ -6071,19 +6090,61 @@ UniValue gatewayswithdraw(const UniValue& params, bool fHelp)
|
|||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
UniValue gatewaysmarkdone(const UniValue& params, bool fHelp)
|
UniValue gatewayspartialsign(const UniValue& params, bool fHelp)
|
||||||
{
|
{
|
||||||
UniValue result(UniValue::VOBJ); uint256 withdrawtxid,cointxid; std::string hex,coin;
|
UniValue result(UniValue::VOBJ); std::string coin,parthex,hex; uint256 txid;
|
||||||
if ( fHelp || params.size() != 3 )
|
if ( fHelp || params.size() != 3 )
|
||||||
throw runtime_error("gatewaysmarkdone withdrawtxid coin cointxid\n");
|
throw runtime_error("gatewayspartialsign txidaddr refcoin hex\n");
|
||||||
|
if ( ensure_CCrequirements() < 0 )
|
||||||
|
throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n");
|
||||||
|
const CKeyStore& keystore = *pwalletMain;
|
||||||
|
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||||
|
txid = Parseuint256((char *)params[0].get_str().c_str());
|
||||||
|
coin = params[1].get_str();
|
||||||
|
parthex = params[2].get_str();
|
||||||
|
hex = GatewaysPartialSign(0,txid,coin,parthex);
|
||||||
|
if ( hex.size() > 0 )
|
||||||
|
{
|
||||||
|
result.push_back(Pair("result", "success"));
|
||||||
|
result.push_back(Pair("hex",hex));
|
||||||
|
} else ERR_RESULT("couldnt gatewayspartialsign");
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
UniValue gatewayscompletesigning(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
UniValue result(UniValue::VOBJ); uint256 withdrawtxid; std::string txhex,hex,coin;
|
||||||
|
if ( fHelp || params.size() != 3 )
|
||||||
|
throw runtime_error("gatewayscompletesigning withdrawtxid coin hex\n");
|
||||||
if ( ensure_CCrequirements() < 0 )
|
if ( ensure_CCrequirements() < 0 )
|
||||||
throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n");
|
throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n");
|
||||||
const CKeyStore& keystore = *pwalletMain;
|
const CKeyStore& keystore = *pwalletMain;
|
||||||
LOCK2(cs_main, pwalletMain->cs_wallet);
|
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||||
withdrawtxid = Parseuint256((char *)params[0].get_str().c_str());
|
withdrawtxid = Parseuint256((char *)params[0].get_str().c_str());
|
||||||
coin = params[1].get_str();
|
coin = params[1].get_str();
|
||||||
cointxid = Parseuint256((char *)params[2].get_str().c_str());
|
txhex = params[2].get_str();
|
||||||
hex = GatewaysMarkdone(0,withdrawtxid,coin,cointxid);
|
hex = GatewaysCompleteSigning(0,withdrawtxid,coin,txhex);
|
||||||
|
RETURN_IF_ERROR(CCerror);
|
||||||
|
if ( hex.size() > 0 )
|
||||||
|
{
|
||||||
|
result.push_back(Pair("result", "success"));
|
||||||
|
result.push_back(Pair("hex", hex));
|
||||||
|
} else ERR_RESULT("couldnt gatewayscompletesigning");
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
UniValue gatewaysmarkdone(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
UniValue result(UniValue::VOBJ); uint256 completetxid; std::string hex,coin;
|
||||||
|
if ( fHelp || params.size() != 2 )
|
||||||
|
throw runtime_error("gatewaysmarkdone completesigningtx coin\n");
|
||||||
|
if ( ensure_CCrequirements() < 0 )
|
||||||
|
throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n");
|
||||||
|
const CKeyStore& keystore = *pwalletMain;
|
||||||
|
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||||
|
completetxid = Parseuint256((char *)params[0].get_str().c_str());
|
||||||
|
coin = params[1].get_str();
|
||||||
|
hex = GatewaysMarkDone(0,completetxid,coin);
|
||||||
RETURN_IF_ERROR(CCerror);
|
RETURN_IF_ERROR(CCerror);
|
||||||
if ( hex.size() > 0 )
|
if ( hex.size() > 0 )
|
||||||
{
|
{
|
||||||
@@ -6105,6 +6166,18 @@ UniValue gatewayspending(const UniValue& params, bool fHelp)
|
|||||||
return(GatewaysPendingWithdraws(bindtxid,coin));
|
return(GatewaysPendingWithdraws(bindtxid,coin));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UniValue gatewaysprocessed(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
uint256 bindtxid; std::string coin;
|
||||||
|
if ( fHelp || params.size() != 2 )
|
||||||
|
throw runtime_error("gatewaysprocessed bindtxid coin\n");
|
||||||
|
if ( ensure_CCrequirements() < 0 )
|
||||||
|
throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n");
|
||||||
|
bindtxid = Parseuint256((char *)params[0].get_str().c_str());
|
||||||
|
coin = params[1].get_str();
|
||||||
|
return(GatewaysProcessedWithdraws(bindtxid,coin));
|
||||||
|
}
|
||||||
|
|
||||||
UniValue gatewaysmultisig(const UniValue& params, bool fHelp)
|
UniValue gatewaysmultisig(const UniValue& params, bool fHelp)
|
||||||
{
|
{
|
||||||
UniValue result(UniValue::VOBJ); std::string hex; char *txidaddr;
|
UniValue result(UniValue::VOBJ); std::string hex; char *txidaddr;
|
||||||
@@ -6118,28 +6191,6 @@ UniValue gatewaysmultisig(const UniValue& params, bool fHelp)
|
|||||||
return(GatewaysMultisig(txidaddr));
|
return(GatewaysMultisig(txidaddr));
|
||||||
}
|
}
|
||||||
|
|
||||||
UniValue gatewayspartialsign(const UniValue& params, bool fHelp)
|
|
||||||
{
|
|
||||||
UniValue result(UniValue::VOBJ); std::string coin,parthex,hex; uint256 txid;
|
|
||||||
if ( fHelp || params.size() != 3 )
|
|
||||||
throw runtime_error("gatewayspartialsign txidaddr refcoin hex\n");
|
|
||||||
if ( ensure_CCrequirements() < 0 )
|
|
||||||
throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n");
|
|
||||||
const CKeyStore& keystore = *pwalletMain;
|
|
||||||
LOCK2(cs_main, pwalletMain->cs_wallet);
|
|
||||||
txid = Parseuint256((char *)params[0].get_str().c_str());
|
|
||||||
coin = params[1].get_str();
|
|
||||||
parthex = params[2].get_str();
|
|
||||||
hex = GatewaysPartialSign(0,txid,coin,parthex);
|
|
||||||
RETURN_IF_ERROR(CCerror);
|
|
||||||
if ( hex.size() > 0 )
|
|
||||||
{
|
|
||||||
result.push_back(Pair("result", "success"));
|
|
||||||
result.push_back(Pair("hex",hex));
|
|
||||||
} else ERR_RESULT("couldnt gatewaysmultisig");
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
UniValue oracleslist(const UniValue& params, bool fHelp)
|
UniValue oracleslist(const UniValue& params, bool fHelp)
|
||||||
{
|
{
|
||||||
if ( fHelp || params.size() > 0 )
|
if ( fHelp || params.size() > 0 )
|
||||||
@@ -6797,7 +6848,7 @@ UniValue tokencreate(const UniValue& params, bool fHelp)
|
|||||||
const CKeyStore& keystore = *pwalletMain;
|
const CKeyStore& keystore = *pwalletMain;
|
||||||
LOCK2(cs_main, pwalletMain->cs_wallet);
|
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||||
name = params[0].get_str();
|
name = params[0].get_str();
|
||||||
supply = atof(params[1].get_str().c_str()) * COIN + 0.00000000499999;
|
supply = atof(params[1].get_str().c_str()) * COIN + 0.00000000499999; // what for is this '+0.00000000499999'? it will be lost while converting double to int64_t (dimxy)
|
||||||
if ( name.size() == 0 || name.size() > 32)
|
if ( name.size() == 0 || name.size() > 32)
|
||||||
{
|
{
|
||||||
ERR_RESULT("Token name must not be empty and up to 32 characters");
|
ERR_RESULT("Token name must not be empty and up to 32 characters");
|
||||||
@@ -6837,7 +6888,8 @@ UniValue tokentransfer(const UniValue& params, bool fHelp)
|
|||||||
LOCK2(cs_main, pwalletMain->cs_wallet);
|
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||||
tokenid = Parseuint256((char *)params[0].get_str().c_str());
|
tokenid = Parseuint256((char *)params[0].get_str().c_str());
|
||||||
std::vector<unsigned char> pubkey(ParseHex(params[1].get_str().c_str()));
|
std::vector<unsigned char> pubkey(ParseHex(params[1].get_str().c_str()));
|
||||||
amount = atol(params[2].get_str().c_str());
|
//amount = atol(params[2].get_str().c_str());
|
||||||
|
amount = atoll(params[2].get_str().c_str()); // dimxy changed to prevent loss of significance
|
||||||
if ( tokenid == zeroid )
|
if ( tokenid == zeroid )
|
||||||
{
|
{
|
||||||
ERR_RESULT("invalid tokenid");
|
ERR_RESULT("invalid tokenid");
|
||||||
@@ -6873,7 +6925,8 @@ UniValue tokenconvert(const UniValue& params, bool fHelp)
|
|||||||
evalcode = atoi(params[0].get_str().c_str());
|
evalcode = atoi(params[0].get_str().c_str());
|
||||||
tokenid = Parseuint256((char *)params[1].get_str().c_str());
|
tokenid = Parseuint256((char *)params[1].get_str().c_str());
|
||||||
std::vector<unsigned char> pubkey(ParseHex(params[2].get_str().c_str()));
|
std::vector<unsigned char> pubkey(ParseHex(params[2].get_str().c_str()));
|
||||||
amount = atol(params[3].get_str().c_str());
|
//amount = atol(params[3].get_str().c_str());
|
||||||
|
amount = atoll(params[3].get_str().c_str()); // dimxy changed to prevent loss of significance
|
||||||
if ( tokenid == zeroid )
|
if ( tokenid == zeroid )
|
||||||
{
|
{
|
||||||
ERR_RESULT("invalid tokenid");
|
ERR_RESULT("invalid tokenid");
|
||||||
@@ -6906,7 +6959,8 @@ UniValue tokenbid(const UniValue& params, bool fHelp)
|
|||||||
throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n");
|
throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n");
|
||||||
const CKeyStore& keystore = *pwalletMain;
|
const CKeyStore& keystore = *pwalletMain;
|
||||||
LOCK2(cs_main, pwalletMain->cs_wallet);
|
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||||
numtokens = atoi(params[0].get_str().c_str());
|
//numtokens = atoi(params[0].get_str().c_str());
|
||||||
|
numtokens = atoll(params[0].get_str().c_str()); // dimxy changed to prevent loss of significance
|
||||||
tokenid = Parseuint256((char *)params[1].get_str().c_str());
|
tokenid = Parseuint256((char *)params[1].get_str().c_str());
|
||||||
price = atof(params[2].get_str().c_str());
|
price = atof(params[2].get_str().c_str());
|
||||||
bidamount = (price * numtokens) * COIN + 0.0000000049999;
|
bidamount = (price * numtokens) * COIN + 0.0000000049999;
|
||||||
@@ -6974,7 +7028,8 @@ UniValue tokenfillbid(const UniValue& params, bool fHelp)
|
|||||||
LOCK2(cs_main, pwalletMain->cs_wallet);
|
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||||
tokenid = Parseuint256((char *)params[0].get_str().c_str());
|
tokenid = Parseuint256((char *)params[0].get_str().c_str());
|
||||||
bidtxid = Parseuint256((char *)params[1].get_str().c_str());
|
bidtxid = Parseuint256((char *)params[1].get_str().c_str());
|
||||||
fillamount = atol(params[2].get_str().c_str());
|
// fillamount = atol(params[2].get_str().c_str());
|
||||||
|
fillamount = atoll(params[2].get_str().c_str()); // dimxy changed to prevent loss of significance
|
||||||
if ( fillamount <= 0 )
|
if ( fillamount <= 0 )
|
||||||
{
|
{
|
||||||
ERR_RESULT("fillamount must be positive");
|
ERR_RESULT("fillamount must be positive");
|
||||||
@@ -7003,10 +7058,12 @@ UniValue tokenask(const UniValue& params, bool fHelp)
|
|||||||
throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n");
|
throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n");
|
||||||
const CKeyStore& keystore = *pwalletMain;
|
const CKeyStore& keystore = *pwalletMain;
|
||||||
LOCK2(cs_main, pwalletMain->cs_wallet);
|
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||||
numtokens = atoi(params[0].get_str().c_str());
|
//numtokens = atoi(params[0].get_str().c_str());
|
||||||
|
numtokens = atoll(params[0].get_str().c_str()); // dimxy changed to prevent loss of significance
|
||||||
tokenid = Parseuint256((char *)params[1].get_str().c_str());
|
tokenid = Parseuint256((char *)params[1].get_str().c_str());
|
||||||
price = atof(params[2].get_str().c_str());
|
price = atof(params[2].get_str().c_str());
|
||||||
askamount = (price * numtokens) * COIN + 0.0000000049999;
|
askamount = (price * numtokens) * COIN + 0.0000000049999;
|
||||||
|
//std::cerr << std::boolalpha << "tokenask(): (tokenid == zeroid) is " << (tokenid == zeroid) << " (numtokens <= 0) is " << (numtokens <= 0) << " (price <= 0) is " << (price <= 0) << " (askamount <= 0) is " << (askamount <= 0) << std::endl;
|
||||||
if ( tokenid == zeroid || numtokens <= 0 || price <= 0 || askamount <= 0 )
|
if ( tokenid == zeroid || numtokens <= 0 || price <= 0 || askamount <= 0 )
|
||||||
{
|
{
|
||||||
ERR_RESULT("invalid parameter");
|
ERR_RESULT("invalid parameter");
|
||||||
@@ -7035,7 +7092,8 @@ UniValue tokenswapask(const UniValue& params, bool fHelp)
|
|||||||
throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n");
|
throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n");
|
||||||
const CKeyStore& keystore = *pwalletMain;
|
const CKeyStore& keystore = *pwalletMain;
|
||||||
LOCK2(cs_main, pwalletMain->cs_wallet);
|
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||||
numtokens = atoi(params[0].get_str().c_str());
|
//numtokens = atoi(params[0].get_str().c_str());
|
||||||
|
numtokens = atoll(params[0].get_str().c_str()); // dimxy changed to prevent loss of significance
|
||||||
tokenid = Parseuint256((char *)params[1].get_str().c_str());
|
tokenid = Parseuint256((char *)params[1].get_str().c_str());
|
||||||
otherid = Parseuint256((char *)params[2].get_str().c_str());
|
otherid = Parseuint256((char *)params[2].get_str().c_str());
|
||||||
price = atof(params[3].get_str().c_str());
|
price = atof(params[3].get_str().c_str());
|
||||||
@@ -7089,7 +7147,8 @@ UniValue tokenfillask(const UniValue& params, bool fHelp)
|
|||||||
LOCK2(cs_main, pwalletMain->cs_wallet);
|
LOCK2(cs_main, pwalletMain->cs_wallet);
|
||||||
tokenid = Parseuint256((char *)params[0].get_str().c_str());
|
tokenid = Parseuint256((char *)params[0].get_str().c_str());
|
||||||
asktxid = Parseuint256((char *)params[1].get_str().c_str());
|
asktxid = Parseuint256((char *)params[1].get_str().c_str());
|
||||||
fillunits = atol(params[2].get_str().c_str());
|
//fillunits = atol(params[2].get_str().c_str());
|
||||||
|
fillunits = atoll(params[2].get_str().c_str()); // dimxy changed to prevent loss of significance
|
||||||
if ( fillunits <= 0 )
|
if ( fillunits <= 0 )
|
||||||
{
|
{
|
||||||
ERR_RESULT("fillunits must be positive");
|
ERR_RESULT("fillunits must be positive");
|
||||||
@@ -7129,7 +7188,8 @@ UniValue tokenfillswap(const UniValue& params, bool fHelp)
|
|||||||
tokenid = Parseuint256((char *)params[0].get_str().c_str());
|
tokenid = Parseuint256((char *)params[0].get_str().c_str());
|
||||||
otherid = Parseuint256((char *)params[1].get_str().c_str());
|
otherid = Parseuint256((char *)params[1].get_str().c_str());
|
||||||
asktxid = Parseuint256((char *)params[2].get_str().c_str());
|
asktxid = Parseuint256((char *)params[2].get_str().c_str());
|
||||||
fillunits = atol(params[3].get_str().c_str());
|
//fillunits = atol(params[3].get_str().c_str());
|
||||||
|
fillunits = atoll(params[3].get_str().c_str()); // dimxy changed to prevent loss of significance
|
||||||
hex = FillSell(0,tokenid,otherid,asktxid,fillunits);
|
hex = FillSell(0,tokenid,otherid,asktxid,fillunits);
|
||||||
if (fillunits > 0) {
|
if (fillunits > 0) {
|
||||||
if ( hex.size() > 0 ) {
|
if ( hex.size() > 0 ) {
|
||||||
|
|||||||
Reference in New Issue
Block a user