@@ -78,6 +78,12 @@ class CryptoConditionsTest (BitcoinTestFramework):
|
|||||||
for x in ['myCCaddress', 'FaucetCCaddress', 'Faucetmarker', 'myaddress']:
|
for x in ['myCCaddress', 'FaucetCCaddress', 'Faucetmarker', 'myaddress']:
|
||||||
assert_equal(faucet[x][0], 'R')
|
assert_equal(faucet[x][0], 'R')
|
||||||
|
|
||||||
|
result = rpc.faucetaddress(self.pubkey)
|
||||||
|
assert_success(result)
|
||||||
|
# test that additional CCaddress key is returned
|
||||||
|
for x in ['myCCaddress', 'FaucetCCaddress', 'Faucetmarker', 'myaddress', 'CCaddress']:
|
||||||
|
assert_equal(result[x][0], 'R')
|
||||||
|
|
||||||
# no funds in the faucet yet
|
# no funds in the faucet yet
|
||||||
result = rpc.faucetget()
|
result = rpc.faucetget()
|
||||||
assert_error(result)
|
assert_error(result)
|
||||||
@@ -134,12 +140,20 @@ class CryptoConditionsTest (BitcoinTestFramework):
|
|||||||
for x in ['myCCaddress', 'DiceCCaddress', 'Dicemarker', 'myaddress']:
|
for x in ['myCCaddress', 'DiceCCaddress', 'Dicemarker', 'myaddress']:
|
||||||
assert_equal(dice[x][0], 'R')
|
assert_equal(dice[x][0], 'R')
|
||||||
|
|
||||||
|
dice = rpc.diceaddress(self.pubkey)
|
||||||
|
assert_equal(dice['result'], 'success')
|
||||||
|
for x in ['myCCaddress', 'DiceCCaddress', 'Dicemarker', 'myaddress', 'CCaddress']:
|
||||||
|
assert_equal(dice[x][0], 'R')
|
||||||
|
|
||||||
# no dice created yet
|
# no dice created yet
|
||||||
result = rpc.dicelist()
|
result = rpc.dicelist()
|
||||||
assert_equal(result, [])
|
assert_equal(result, [])
|
||||||
|
|
||||||
#result = rpc.dicefund("LUCKY",10000,1,10000,10,5)
|
result = rpc.diceinfo("invalid")
|
||||||
#assert_equal(result, [])
|
assert_error(result)
|
||||||
|
|
||||||
|
result = rpc.dicefund("THISISTOOLONG", "10000", "10", "10000", "10", "5")
|
||||||
|
assert_error(result)
|
||||||
|
|
||||||
def run_token_tests(self):
|
def run_token_tests(self):
|
||||||
rpc = self.nodes[0]
|
rpc = self.nodes[0]
|
||||||
@@ -156,8 +170,15 @@ class CryptoConditionsTest (BitcoinTestFramework):
|
|||||||
result = rpc.tokenlist()
|
result = rpc.tokenlist()
|
||||||
assert_equal(result, [])
|
assert_equal(result, [])
|
||||||
|
|
||||||
result = rpc.tokencreate("DUKE", "1987.420", "duke")
|
result = rpc.tokencreate("NUKE", "-1987420", "no bueno supply")
|
||||||
|
assert_error(result)
|
||||||
|
|
||||||
|
result = rpc.tokencreate("NUKE123456789012345678901234567890", "1987420", "name too long")
|
||||||
|
assert_error(result)
|
||||||
|
|
||||||
|
result = rpc.tokencreate("DUKE", "1987.420", "Duke's custom token")
|
||||||
assert_success(result)
|
assert_success(result)
|
||||||
|
|
||||||
tokenid = self.send_and_mine(result['hex'])
|
tokenid = self.send_and_mine(result['hex'])
|
||||||
|
|
||||||
result = rpc.tokenlist()
|
result = rpc.tokenlist()
|
||||||
@@ -197,7 +218,7 @@ class CryptoConditionsTest (BitcoinTestFramework):
|
|||||||
assert_equal(result['owner'], self.pubkey)
|
assert_equal(result['owner'], self.pubkey)
|
||||||
assert_equal(result['name'], "DUKE")
|
assert_equal(result['name'], "DUKE")
|
||||||
assert_equal(result['supply'], 198742000000)
|
assert_equal(result['supply'], 198742000000)
|
||||||
assert_equal(result['description'], "duke")
|
assert_equal(result['description'], "Duke's custom token")
|
||||||
|
|
||||||
# invalid numtokens ask
|
# invalid numtokens ask
|
||||||
result = rpc.tokenask("-1", tokenid, "1")
|
result = rpc.tokenask("-1", tokenid, "1")
|
||||||
@@ -253,25 +274,25 @@ class CryptoConditionsTest (BitcoinTestFramework):
|
|||||||
result = rpc.tokenorders()
|
result = rpc.tokenorders()
|
||||||
assert_equal(result, [])
|
assert_equal(result, [])
|
||||||
|
|
||||||
# invalid numtokens bid (have to add status to CC code!)
|
# invalid numtokens bid
|
||||||
result = rpc.tokenbid("-1", tokenid, "1")
|
result = rpc.tokenbid("-1", tokenid, "1")
|
||||||
assert_equal(result['error'], 'invalid parameter')
|
assert_error(result);
|
||||||
|
|
||||||
# invalid numtokens bid (have to add status to CC code!)
|
# invalid numtokens bid
|
||||||
result = rpc.tokenbid("0", tokenid, "1")
|
result = rpc.tokenbid("0", tokenid, "1")
|
||||||
assert_equal(result['error'], 'invalid parameter')
|
assert_error(result);
|
||||||
|
|
||||||
# invalid price bid (have to add status to CC code!)
|
# invalid price bid
|
||||||
result = rpc.tokenbid("1", tokenid, "-1")
|
result = rpc.tokenbid("1", tokenid, "-1")
|
||||||
assert_equal(result['error'], 'invalid parameter')
|
assert_error(result);
|
||||||
|
|
||||||
# invalid price bid (have to add status to CC code!)
|
# invalid price bid
|
||||||
result = rpc.tokenbid("1", tokenid, "0")
|
result = rpc.tokenbid("1", tokenid, "0")
|
||||||
assert_equal(result['error'], 'invalid parameter')
|
assert_error(result);
|
||||||
|
|
||||||
# invalid tokenid bid (have to add status to CC code!)
|
# invalid tokenid bid
|
||||||
result = rpc.tokenbid("100", "deadbeef", "1")
|
result = rpc.tokenbid("100", "deadbeef", "1")
|
||||||
assert_equal(result['error'], 'invalid parameter')
|
assert_error(result);
|
||||||
|
|
||||||
tokenbid = rpc.tokenbid("100", tokenid, "10")
|
tokenbid = rpc.tokenbid("100", tokenid, "10")
|
||||||
tokenbidhex = tokenbid['hex']
|
tokenbidhex = tokenbid['hex']
|
||||||
@@ -309,11 +330,11 @@ class CryptoConditionsTest (BitcoinTestFramework):
|
|||||||
# invalid token transfer amount (have to add status to CC code!)
|
# invalid token transfer amount (have to add status to CC code!)
|
||||||
randompubkey = "021a559101e355c907d9c553671044d619769a6e71d624f68bfec7d0afa6bd6a96"
|
randompubkey = "021a559101e355c907d9c553671044d619769a6e71d624f68bfec7d0afa6bd6a96"
|
||||||
result = rpc.tokentransfer(tokenid,randompubkey,"0")
|
result = rpc.tokentransfer(tokenid,randompubkey,"0")
|
||||||
assert_equal(result['error'], 'invalid parameter')
|
assert_error(result);
|
||||||
|
|
||||||
# invalid token transfer amount (have to add status to CC code!)
|
# invalid token transfer amount (have to add status to CC code!)
|
||||||
result = rpc.tokentransfer(tokenid,randompubkey,"-1")
|
result = rpc.tokentransfer(tokenid,randompubkey,"-1")
|
||||||
assert_equal(result['error'], 'invalid parameter')
|
assert_error(result);
|
||||||
|
|
||||||
# valid token transfer
|
# valid token transfer
|
||||||
sendtokens = rpc.tokentransfer(tokenid,randompubkey,"1")
|
sendtokens = rpc.tokentransfer(tokenid,randompubkey,"1")
|
||||||
|
|||||||
@@ -259,14 +259,14 @@ bool ProcessCC(struct CCcontract_info *cp,Eval* eval, std::vector<uint8_t> param
|
|||||||
height = KOMODO_CONNECTING;
|
height = KOMODO_CONNECTING;
|
||||||
if ( KOMODO_CONNECTING < 0 ) // always comes back with > 0 for final confirmation
|
if ( KOMODO_CONNECTING < 0 ) // always comes back with > 0 for final confirmation
|
||||||
return(true);
|
return(true);
|
||||||
if ( ASSETCHAINS_CC == 0 || height < KOMODO_CCACTIVATE )
|
if ( ASSETCHAINS_CC == 0 || (height & ~(1<<30)) < KOMODO_CCACTIVATE )
|
||||||
return eval->Invalid("CC are disabled or not active yet");
|
return eval->Invalid("CC are disabled or not active yet");
|
||||||
if ( (KOMODO_CONNECTING & (1<<30)) != 0 )
|
if ( (KOMODO_CONNECTING & (1<<30)) != 0 )
|
||||||
{
|
{
|
||||||
from_mempool = 1;
|
from_mempool = 1;
|
||||||
height &= ((1<<30) - 1);
|
height &= ((1<<30) - 1);
|
||||||
}
|
}
|
||||||
fprintf(stderr,"KOMODO_CONNECTING.%d mempool.%d\n",height,from_mempool);
|
fprintf(stderr,"KOMODO_CONNECTING.%d mempool.%d vs CCactive.%d\n",height,from_mempool,KOMODO_CCACTIVATE);
|
||||||
// there is a chance CC tx is valid in mempool, but invalid when in block, so we cant filter duplicate requests. if any of the vins are spent, for example
|
// there is a chance CC tx is valid in mempool, but invalid when in block, so we cant filter duplicate requests. if any of the vins are spent, for example
|
||||||
//txid = ctx.GetHash();
|
//txid = ctx.GetHash();
|
||||||
//if ( txid == cp->prevtxid )
|
//if ( txid == cp->prevtxid )
|
||||||
|
|||||||
@@ -882,7 +882,7 @@ std::string DiceCreateFunding(uint64_t txfee,char *planstr,int64_t funds,int64_t
|
|||||||
memset(&zero,0,sizeof(zero));
|
memset(&zero,0,sizeof(zero));
|
||||||
if ( (cp= Diceinit(fundingPubKey,zero,&C,planstr,txfee,mypk,dicepk,sbits,a,b,c,d)) == 0 )
|
if ( (cp= Diceinit(fundingPubKey,zero,&C,planstr,txfee,mypk,dicepk,sbits,a,b,c,d)) == 0 )
|
||||||
{
|
{
|
||||||
CCerror = "Diceinit error in create funding";
|
CCerror = "Diceinit error in create funding, is your transaction confirmed?";
|
||||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||||
return("");
|
return("");
|
||||||
}
|
}
|
||||||
@@ -907,8 +907,10 @@ std::string DiceAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,int6
|
|||||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||||
return("");
|
return("");
|
||||||
}
|
}
|
||||||
if ( (cp= Diceinit(fundingPubKey,fundingtxid,&C,planstr,txfee,mypk,dicepk,sbits,minbet,maxbet,maxodds,timeoutblocks)) == 0 )
|
if ( (cp= Diceinit(fundingPubKey,fundingtxid,&C,planstr,txfee,mypk,dicepk,sbits,minbet,maxbet,maxodds,timeoutblocks)) == 0 ) {
|
||||||
|
CCerror = "Diceinit error in add funding, is your transaction confirmed?";
|
||||||
return("");
|
return("");
|
||||||
|
}
|
||||||
scriptPubKey = CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG;
|
scriptPubKey = CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG;
|
||||||
if ( 0 )
|
if ( 0 )
|
||||||
{
|
{
|
||||||
@@ -956,8 +958,10 @@ std::string DiceBet(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t bet
|
|||||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||||
return("");
|
return("");
|
||||||
}
|
}
|
||||||
if ( (cp= Diceinit(fundingPubKey,fundingtxid,&C,planstr,txfee,mypk,dicepk,sbits,minbet,maxbet,maxodds,timeoutblocks)) == 0 )
|
if ( (cp= Diceinit(fundingPubKey,fundingtxid,&C,planstr,txfee,mypk,dicepk,sbits,minbet,maxbet,maxodds,timeoutblocks)) == 0 ) {
|
||||||
|
CCerror = "Diceinit error in bet, is your transaction confirmed?";
|
||||||
return("");
|
return("");
|
||||||
|
}
|
||||||
if ( bet < minbet || bet > maxbet || odds > maxodds )
|
if ( bet < minbet || bet > maxbet || odds > maxodds )
|
||||||
{
|
{
|
||||||
CCerror = strprintf("Dice plan %s illegal bet %.8f: minbet %.8f maxbet %.8f or odds %d vs max.%d\n",planstr,(double)bet/COIN,(double)minbet/COIN,(double)maxbet/COIN,(int32_t)odds,(int32_t)maxodds);
|
CCerror = strprintf("Dice plan %s illegal bet %.8f: minbet %.8f maxbet %.8f or odds %d vs max.%d\n",planstr,(double)bet/COIN,(double)minbet/COIN,(double)maxbet/COIN,(int32_t)odds,(int32_t)maxodds);
|
||||||
@@ -997,7 +1001,7 @@ std::string DiceBetFinish(int32_t *resultp,uint64_t txfee,char *planstr,uint256
|
|||||||
//char str[65]; fprintf(stderr,"DiceBetFinish.%s %s\n",planstr,uint256_str(str,bettxid));
|
//char str[65]; fprintf(stderr,"DiceBetFinish.%s %s\n",planstr,uint256_str(str,bettxid));
|
||||||
if ( (cp= Diceinit(fundingPubKey,fundingtxid,&C,planstr,txfee,mypk,dicepk,sbits,minbet,maxbet,maxodds,timeoutblocks)) == 0 )
|
if ( (cp= Diceinit(fundingPubKey,fundingtxid,&C,planstr,txfee,mypk,dicepk,sbits,minbet,maxbet,maxodds,timeoutblocks)) == 0 )
|
||||||
{
|
{
|
||||||
CCerror = "Diceinit error in finish";
|
CCerror = "Diceinit error in finish, is your transaction confirmed?";
|
||||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||||
return("");
|
return("");
|
||||||
}
|
}
|
||||||
@@ -1110,7 +1114,7 @@ double DiceStatus(uint64_t txfee,char *planstr,uint256 fundingtxid,uint256 bettx
|
|||||||
CScript fundingPubKey,scriptPubKey; CTransaction spenttx,betTx; uint256 hash,proof,txid,hashBlock,spenttxid; CPubKey mypk,dicepk,fundingpk; struct CCcontract_info *cp,C; int32_t i,result,vout,n=0; int64_t minbet,maxbet,maxodds,timeoutblocks; uint64_t sbits; char coinaddr[64]; std::string res;
|
CScript fundingPubKey,scriptPubKey; CTransaction spenttx,betTx; uint256 hash,proof,txid,hashBlock,spenttxid; CPubKey mypk,dicepk,fundingpk; struct CCcontract_info *cp,C; int32_t i,result,vout,n=0; int64_t minbet,maxbet,maxodds,timeoutblocks; uint64_t sbits; char coinaddr[64]; std::string res;
|
||||||
if ( (cp= Diceinit(fundingPubKey,fundingtxid,&C,planstr,txfee,mypk,dicepk,sbits,minbet,maxbet,maxodds,timeoutblocks)) == 0 )
|
if ( (cp= Diceinit(fundingPubKey,fundingtxid,&C,planstr,txfee,mypk,dicepk,sbits,minbet,maxbet,maxodds,timeoutblocks)) == 0 )
|
||||||
{
|
{
|
||||||
CCerror = "Diceinit error in status";
|
CCerror = "Diceinit error in status, is your transaction confirmed?";
|
||||||
fprintf(stderr,"%s\n", CCerror.c_str() );
|
fprintf(stderr,"%s\n", CCerror.c_str() );
|
||||||
return(0.);
|
return(0.);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#include "notarisationdb.h"
|
#include "notarisationdb.h"
|
||||||
#include "uint256.h"
|
#include "uint256.h"
|
||||||
#include "cc/eval.h"
|
#include "cc/eval.h"
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
|
|
||||||
@@ -82,3 +83,29 @@ void EraseBackNotarisations(const NotarisationsInBlock notarisations, CLevelDBBa
|
|||||||
batch.Erase(n.second.txHash);
|
batch.Erase(n.second.txHash);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Scan notarisationsdb backwards for blocks containing a notarisation
|
||||||
|
* for given symbol. Return height of matched notarisation or 0.
|
||||||
|
*/
|
||||||
|
int ScanNotarisationsDB(int height, std::string symbol, int scanLimitBlocks, Notarisation& out)
|
||||||
|
{
|
||||||
|
if (height < 0 || height > chainActive.Height())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (int i=0; i<scanLimitBlocks; i++) {
|
||||||
|
if (i > height) break;
|
||||||
|
NotarisationsInBlock notarisations;
|
||||||
|
uint256 blockHash = *chainActive[height-i]->phashBlock;
|
||||||
|
if (!GetBlockNotarisations(blockHash, notarisations))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
BOOST_FOREACH(Notarisation& nota, notarisations) {
|
||||||
|
if (strcmp(nota.second.symbol, symbol.data()) == 0) {
|
||||||
|
out = nota;
|
||||||
|
return height-i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
@@ -23,5 +23,6 @@ bool GetBlockNotarisations(uint256 blockHash, NotarisationsInBlock &nibs);
|
|||||||
bool GetBackNotarisation(uint256 notarisationHash, Notarisation &n);
|
bool GetBackNotarisation(uint256 notarisationHash, Notarisation &n);
|
||||||
void WriteBackNotarisations(const NotarisationsInBlock notarisations, CLevelDBBatch &batch);
|
void WriteBackNotarisations(const NotarisationsInBlock notarisations, CLevelDBBatch &batch);
|
||||||
void EraseBackNotarisations(const NotarisationsInBlock notarisations, CLevelDBBatch &batch);
|
void EraseBackNotarisations(const NotarisationsInBlock notarisations, CLevelDBBatch &batch);
|
||||||
|
int ScanNotarisationsDB(int height, std::string symbol, int scanLimitBlocks, Notarisation& out);
|
||||||
|
|
||||||
#endif /* NOTARISATIONDB_H */
|
#endif /* NOTARISATIONDB_H */
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include "chainparams.h"
|
#include "chainparams.h"
|
||||||
#include "checkpoints.h"
|
#include "checkpoints.h"
|
||||||
#include "crosschain.h"
|
#include "crosschain.h"
|
||||||
|
#include "notarisationdb.h"
|
||||||
#include "importcoin.h"
|
#include "importcoin.h"
|
||||||
#include "base58.h"
|
#include "base58.h"
|
||||||
#include "consensus/validation.h"
|
#include "consensus/validation.h"
|
||||||
@@ -251,3 +252,55 @@ UniValue migrate_completeimporttransaction(const UniValue& params, bool fHelp)
|
|||||||
|
|
||||||
return HexStr(E_MARSHAL(ss << importTx));
|
return HexStr(E_MARSHAL(ss << importTx));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
UniValue getNotarisationsForBlock(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() != 1)
|
||||||
|
throw runtime_error("getNotarisationsForBlock blockHash\n\n"
|
||||||
|
"Takes a block hash and returns notarisation transactions "
|
||||||
|
"within the block");
|
||||||
|
|
||||||
|
uint256 blockHash = uint256S(params[0].get_str());
|
||||||
|
|
||||||
|
NotarisationsInBlock nibs;
|
||||||
|
GetBlockNotarisations(blockHash, nibs);
|
||||||
|
UniValue out(UniValue::VARR);
|
||||||
|
BOOST_FOREACH(const Notarisation& n, nibs)
|
||||||
|
{
|
||||||
|
UniValue item(UniValue::VARR);
|
||||||
|
item.push_back(n.first.GetHex());
|
||||||
|
item.push_back(HexStr(E_MARSHAL(ss << n.second)));
|
||||||
|
out.push_back(item);
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
UniValue scanNotarisationsDB(const UniValue& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() < 2 || params.size() > 3)
|
||||||
|
throw runtime_error("scanNotarisationsDB blockHeight symbol [blocksLimit=1440]\n\n"
|
||||||
|
"Scans notarisationsdb backwards from height for a notarisation"
|
||||||
|
" of given symbol");
|
||||||
|
int height = atoi(params[0].get_str().c_str());
|
||||||
|
std::string symbol = params[1].get_str().c_str();
|
||||||
|
|
||||||
|
int limit = 1440;
|
||||||
|
if (params.size() > 2) {
|
||||||
|
limit = atoi(params[2].get_str().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (height == 0) {
|
||||||
|
height = chainActive.Height();
|
||||||
|
}
|
||||||
|
|
||||||
|
Notarisation nota;
|
||||||
|
int matchedHeight = ScanNotarisationsDB(height, symbol, limit, nota);
|
||||||
|
if (!matchedHeight) return NullUniValue;
|
||||||
|
UniValue out(UniValue::VOBJ);
|
||||||
|
out.pushKV("height", matchedHeight);
|
||||||
|
out.pushKV("hash", nota.first.GetHex());
|
||||||
|
out.pushKV("opreturn", HexStr(E_MARSHAL(ss << nota.second)));
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|||||||
@@ -55,7 +55,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.2.0"
|
#define KOMODO_VERSION "0.2.1"
|
||||||
extern uint16_t ASSETCHAINS_P2PPORT,ASSETCHAINS_RPCPORT;
|
extern uint16_t ASSETCHAINS_P2PPORT,ASSETCHAINS_RPCPORT;
|
||||||
extern uint32_t ASSETCHAINS_CC;
|
extern uint32_t ASSETCHAINS_CC;
|
||||||
extern uint32_t ASSETCHAINS_MAGIC;
|
extern uint32_t ASSETCHAINS_MAGIC;
|
||||||
|
|||||||
@@ -315,6 +315,8 @@ static const CRPCCommand vRPCCommands[] =
|
|||||||
{ "crosschain", "height_MoM", &height_MoM, true },
|
{ "crosschain", "height_MoM", &height_MoM, true },
|
||||||
{ "crosschain", "assetchainproof", &assetchainproof, true },
|
{ "crosschain", "assetchainproof", &assetchainproof, true },
|
||||||
{ "crosschain", "crosschainproof", &crosschainproof, true },
|
{ "crosschain", "crosschainproof", &crosschainproof, true },
|
||||||
|
{ "crosschain", "getNotarisationsForBlock", &getNotarisationsForBlock, true },
|
||||||
|
{ "crosschain", "scanNotarisationsDB", &scanNotarisationsDB, true },
|
||||||
{ "crosschain", "migrate_converttoexport", &migrate_converttoexport, true },
|
{ "crosschain", "migrate_converttoexport", &migrate_converttoexport, true },
|
||||||
{ "crosschain", "migrate_createimporttransaction", &migrate_createimporttransaction, true },
|
{ "crosschain", "migrate_createimporttransaction", &migrate_createimporttransaction, true },
|
||||||
{ "crosschain", "migrate_completeimporttransaction", &migrate_completeimporttransaction, true },
|
{ "crosschain", "migrate_completeimporttransaction", &migrate_completeimporttransaction, true },
|
||||||
|
|||||||
@@ -361,6 +361,8 @@ extern UniValue calc_MoM(const UniValue& params, bool fHelp);
|
|||||||
extern UniValue height_MoM(const UniValue& params, bool fHelp);
|
extern UniValue height_MoM(const UniValue& params, bool fHelp);
|
||||||
extern UniValue assetchainproof(const UniValue& params, bool fHelp);
|
extern UniValue assetchainproof(const UniValue& params, bool fHelp);
|
||||||
extern UniValue crosschainproof(const UniValue& params, bool fHelp);
|
extern UniValue crosschainproof(const UniValue& params, bool fHelp);
|
||||||
|
extern UniValue getNotarisationsForBlock(const UniValue& params, bool fHelp);
|
||||||
|
extern UniValue scanNotarisationsDB(const UniValue& params, bool fHelp);
|
||||||
extern UniValue migrate_converttoexport(const UniValue& params, bool fHelp);
|
extern UniValue migrate_converttoexport(const UniValue& params, bool fHelp);
|
||||||
extern UniValue migrate_createimporttransaction(const UniValue& params, bool fHelp);
|
extern UniValue migrate_createimporttransaction(const UniValue& params, bool fHelp);
|
||||||
extern UniValue migrate_completeimporttransaction(const UniValue& params, bool fHelp);
|
extern UniValue migrate_completeimporttransaction(const UniValue& params, bool fHelp);
|
||||||
|
|||||||
@@ -55,6 +55,9 @@ std::string CCerror;
|
|||||||
// Private method:
|
// Private method:
|
||||||
UniValue z_getoperationstatus_IMPL(const UniValue&, bool);
|
UniValue z_getoperationstatus_IMPL(const UniValue&, bool);
|
||||||
|
|
||||||
|
#define PLAN_NAME_MAX 8
|
||||||
|
#define VALID_PLAN_NAME(x) (strlen(x) <= PLAN_NAME_MAX)
|
||||||
|
|
||||||
std::string HelpRequiringPassphrase()
|
std::string HelpRequiringPassphrase()
|
||||||
{
|
{
|
||||||
return pwalletMain && pwalletMain->IsCrypted()
|
return pwalletMain && pwalletMain->IsCrypted()
|
||||||
@@ -5234,6 +5237,12 @@ UniValue dicefund(const UniValue& params, bool fHelp)
|
|||||||
maxbet = atof(params[3].get_str().c_str()) * COIN;
|
maxbet = atof(params[3].get_str().c_str()) * COIN;
|
||||||
maxodds = atol(params[4].get_str().c_str());
|
maxodds = atol(params[4].get_str().c_str());
|
||||||
timeoutblocks = atol(params[5].get_str().c_str());
|
timeoutblocks = atol(params[5].get_str().c_str());
|
||||||
|
|
||||||
|
if (!VALID_PLAN_NAME(name)) {
|
||||||
|
ERR_RESULT(strprintf("Plan name can be at most %d ASCII characters",PLAN_NAME_MAX));
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
hex = DiceCreateFunding(0,name,funds,minbet,maxbet,maxodds,timeoutblocks);
|
hex = DiceCreateFunding(0,name,funds,minbet,maxbet,maxodds,timeoutblocks);
|
||||||
if (CCerror != "") {
|
if (CCerror != "") {
|
||||||
ERR_RESULT(CCerror);
|
ERR_RESULT(CCerror);
|
||||||
@@ -5258,6 +5267,10 @@ UniValue diceaddfunds(const UniValue& params, bool fHelp)
|
|||||||
name = (char *)params[0].get_str().c_str();
|
name = (char *)params[0].get_str().c_str();
|
||||||
fundingtxid = Parseuint256((char *)params[1].get_str().c_str());
|
fundingtxid = Parseuint256((char *)params[1].get_str().c_str());
|
||||||
amount = atof(params[2].get_str().c_str()) * COIN;
|
amount = atof(params[2].get_str().c_str()) * COIN;
|
||||||
|
if (!VALID_PLAN_NAME(name)) {
|
||||||
|
ERR_RESULT(strprintf("Plan name can be at most %d ASCII characters",PLAN_NAME_MAX));
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
if ( amount > 0 ) {
|
if ( amount > 0 ) {
|
||||||
hex = DiceAddfunding(0,name,fundingtxid,amount);
|
hex = DiceAddfunding(0,name,fundingtxid,amount);
|
||||||
if (CCerror != "") {
|
if (CCerror != "") {
|
||||||
@@ -5283,9 +5296,17 @@ UniValue dicebet(const UniValue& params, bool fHelp)
|
|||||||
fundingtxid = Parseuint256((char *)params[1].get_str().c_str());
|
fundingtxid = Parseuint256((char *)params[1].get_str().c_str());
|
||||||
amount = atof(params[2].get_str().c_str()) * COIN;
|
amount = atof(params[2].get_str().c_str()) * COIN;
|
||||||
odds = atol(params[3].get_str().c_str());
|
odds = atol(params[3].get_str().c_str());
|
||||||
|
|
||||||
|
if (!VALID_PLAN_NAME(name)) {
|
||||||
|
ERR_RESULT(strprintf("Plan name can be at most %d ASCII characters",PLAN_NAME_MAX));
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
if (amount > 0 && odds > 0) {
|
if (amount > 0 && odds > 0) {
|
||||||
hex = DiceBet(0,name,fundingtxid,amount,odds);
|
hex = DiceBet(0,name,fundingtxid,amount,odds);
|
||||||
if ( hex.size() > 0 )
|
if ( CCerror != "" )
|
||||||
|
{
|
||||||
|
ERR_RESULT(CCerror);
|
||||||
|
} else if ( hex.size() > 0 )
|
||||||
{
|
{
|
||||||
result.push_back(Pair("result", "success"));
|
result.push_back(Pair("result", "success"));
|
||||||
result.push_back(Pair("hex", hex));
|
result.push_back(Pair("hex", hex));
|
||||||
@@ -5306,6 +5327,10 @@ UniValue dicefinish(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 = (char *)params[0].get_str().c_str();
|
name = (char *)params[0].get_str().c_str();
|
||||||
|
if (!VALID_PLAN_NAME(name)) {
|
||||||
|
ERR_RESULT(strprintf("Plan name can be at most %d ASCII characters",PLAN_NAME_MAX));
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
fundingtxid = Parseuint256((char *)params[1].get_str().c_str());
|
fundingtxid = Parseuint256((char *)params[1].get_str().c_str());
|
||||||
bettxid = Parseuint256((char *)params[2].get_str().c_str());
|
bettxid = Parseuint256((char *)params[2].get_str().c_str());
|
||||||
hex = DiceBetFinish(&r,0,name,fundingtxid,bettxid,1);
|
hex = DiceBetFinish(&r,0,name,fundingtxid,bettxid,1);
|
||||||
@@ -5330,6 +5355,10 @@ UniValue dicestatus(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 = (char *)params[0].get_str().c_str();
|
name = (char *)params[0].get_str().c_str();
|
||||||
|
if (!VALID_PLAN_NAME(name)) {
|
||||||
|
ERR_RESULT(strprintf("Plan name can be at most %d ASCII characters",PLAN_NAME_MAX));
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
fundingtxid = Parseuint256((char *)params[1].get_str().c_str());
|
fundingtxid = Parseuint256((char *)params[1].get_str().c_str());
|
||||||
memset(&bettxid,0,sizeof(bettxid));
|
memset(&bettxid,0,sizeof(bettxid));
|
||||||
if ( params.size() == 3 )
|
if ( params.size() == 3 )
|
||||||
@@ -5453,9 +5482,14 @@ UniValue tokencreate(const UniValue& params, bool fHelp)
|
|||||||
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;
|
supply = atof(params[1].get_str().c_str()) * COIN;
|
||||||
if ( name.size() == 0 || supply <= 0 )
|
if ( name.size() == 0 || name.size() > 32)
|
||||||
{
|
{
|
||||||
result.push_back(Pair("error", "invalid parameter"));
|
ERR_RESULT("Token name must not be empty and up to 32 characters");
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
if ( supply <= 0 )
|
||||||
|
{
|
||||||
|
ERR_RESULT("Token supply must be positive");
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
if ( params.size() == 3 )
|
if ( params.size() == 3 )
|
||||||
@@ -5463,7 +5497,7 @@ UniValue tokencreate(const UniValue& params, bool fHelp)
|
|||||||
description = params[2].get_str();
|
description = params[2].get_str();
|
||||||
if ( description.size() > 4096 )
|
if ( description.size() > 4096 )
|
||||||
{
|
{
|
||||||
result.push_back(Pair("error", "token description longer than 4096"));
|
ERR_RESULT("Token description must be <= 4096 characters");
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5488,9 +5522,14 @@ UniValue tokentransfer(const UniValue& params, bool fHelp)
|
|||||||
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());
|
||||||
if ( tokenid == zeroid || amount <= 0 )
|
if ( tokenid == zeroid )
|
||||||
{
|
{
|
||||||
result.push_back(Pair("error", "invalid parameter"));
|
ERR_RESULT("invalid tokenid");
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
if ( amount <= 0 )
|
||||||
|
{
|
||||||
|
ERR_RESULT("amount must be positive");
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
hex = AssetTransfer(0,tokenid,pubkey,amount);
|
hex = AssetTransfer(0,tokenid,pubkey,amount);
|
||||||
@@ -5519,9 +5558,19 @@ UniValue tokenbid(const UniValue& params, bool fHelp)
|
|||||||
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;
|
||||||
if ( tokenid == zeroid || tokenid == zeroid || price <= 0 || bidamount <= 0 )
|
if ( price <= 0 )
|
||||||
{
|
{
|
||||||
result.push_back(Pair("error", "invalid parameter"));
|
ERR_RESULT("price must be positive");
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
if ( tokenid == zeroid )
|
||||||
|
{
|
||||||
|
ERR_RESULT("invalid tokenid");
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
if ( bidamount <= 0 )
|
||||||
|
{
|
||||||
|
ERR_RESULT("bid amount must be positive");
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
hex = CreateBuyOffer(0,bidamount,tokenid,numtokens);
|
hex = CreateBuyOffer(0,bidamount,tokenid,numtokens);
|
||||||
@@ -5530,7 +5579,7 @@ UniValue tokenbid(const UniValue& params, bool fHelp)
|
|||||||
{
|
{
|
||||||
result.push_back(Pair("result", "success"));
|
result.push_back(Pair("result", "success"));
|
||||||
result.push_back(Pair("hex", hex));
|
result.push_back(Pair("hex", hex));
|
||||||
} else result.push_back(Pair("error", "couldnt create bid"));
|
} else ERR_RESULT("couldnt create bid");
|
||||||
} else {
|
} else {
|
||||||
ERR_RESULT("price and numtokens must be positive");
|
ERR_RESULT("price and numtokens must be positive");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user