Hush Delayed Proof Of Work Dragon
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

642 lines
62 KiB

/******************************************************************************
* Copyright © 2018-2020 The Hush Developers *
* Copyright © 2014-2018 The SuperNET Developers. *
* *
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
* the top-level directory of this distribution for the individual copyright *
* holder information and the developer policies on copyright and licensing. *
* *
* Unless otherwise agreed in a custom licensing agreement, no part of the *
* SuperNET software, including this file may be copied, modified, propagated *
* or distributed except according to the terms contained in the LICENSE file *
* *
* Removal or modification of this copyright notice is prohibited. *
* *
******************************************************************************/
#ifndef H_DRAGONFUNCS_H
#define H_DRAGONFUNCS_H
#define SIGHASH_ALL 1
cJSON *SuperNET_helpjson();
// peers
int32_t dragon_verifypeer(struct dragon_info *coin,void *key,void *value,int32_t itemind,int32_t itemsize);
int32_t dragon_peermetrics(struct supernet_info *myinfo,struct dragon_info *coin);
void dragon_peersloop(void *arg);
int32_t dragon_queue_send(struct dragon_peer *addr,int32_t delay,uint8_t *serialized,char *cmd,int32_t len);
uint32_t dragon_rwiAddrind(struct dragon_info *coin,int32_t rwflag,struct dragon_iAddr *iA,uint32_t ind);
void dragon_connections(void *arg);
uint32_t dragon_possible_peer(struct dragon_info *coin,char *ip_port);
//int32_t dragon_set_iAddrheight(struct dragon_info *coin,uint32_t ipbits,int32_t height);
//struct dragon_peer *dragon_choosepeer(struct dragon_info *coin);
void dragon_initpeer(struct dragon_info *coin,struct dragon_peer *addr,uint64_t ipbits);
void dragon_startconnection(void *arg);
void dragon_shutdownpeers(struct dragon_info *coin,int32_t forceflag);
void dragon_acceptloop(void *args);
void dragon_recvloop(void *args);
int32_t dragon_send(struct dragon_info *coin,struct dragon_peer *addr,uint8_t *serialized,int32_t len);
uint32_t dragon_updatemetrics(struct supernet_info *myinfo,struct dragon_info *coin);
void *dragon_peeralloc(struct dragon_info *coin,struct dragon_peer *addr,int32_t datalen);
int64_t dragon_peerfree(struct dragon_info *coin,struct dragon_peer *addr,void *ptr,int32_t datalen);
int64_t dragon_peerallocated(struct dragon_info *coin,struct dragon_peer *addr);
// serdes
int32_t dragon_rwmem(int32_t rwflag,uint8_t *serialized,int32_t len,void *endianedp);
int32_t dragon_rwnum(int32_t rwflag,uint8_t *serialized,int32_t len,void *endianedp);
int32_t dragon_rwvarint32(int32_t rwflag,uint8_t *serialized,uint32_t *int32p);
int32_t dragon_rwbignum(int32_t rwflag,uint8_t *serialized,int32_t len,uint8_t *endianedp);
int32_t dragon_rwblock(struct supernet_info *myinfo,char *symbol,uint8_t zcash,uint8_t auxpow,int32_t (*hashalgo)(uint8_t *blockhashp,uint8_t *serialized,int32_t len),int32_t rwflag,bits256 *hash2p,uint8_t *serialized,struct dragon_msgzblock *zmsg,int32_t maxlen);
int32_t dragon_serialize_block(struct supernet_info *myinfo,struct dragon_chain *chain,bits256 *hash2p,uint8_t serialized[sizeof(struct dragon_msgblock)],struct dragon_block *block);
int32_t dragon_blockconv(uint8_t zcash,uint8_t auxpow,struct dragon_zblock *zdest,struct dragon_msgzblock *zmsg,bits256 hash2,int32_t height);
int32_t dragon_msgparser(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_peer *addr,struct OS_memspace *rawmem,struct OS_memspace *txmem,struct OS_memspace *hashmem,struct dragon_msghdr *H,uint8_t *data,int32_t datalen,int32_t fromcache);
// send message
int32_t dragon_validatehdr(char *symbol,struct dragon_msghdr *H);
int32_t dragon_sethdr(struct dragon_msghdr *H,const uint8_t netmagic[4],char *command,uint8_t *data,int32_t datalen);
int32_t dragon_send_version(struct dragon_info *coin,struct dragon_peer *addr,uint64_t myservices);
int32_t dragon_gentxarray(struct supernet_info *myinfo,struct dragon_info *coin,struct OS_memspace *mem,struct dragon_txblock *txblock,int32_t *lenp,uint8_t *data,int32_t datalen);
int32_t dragon_gethdrs(struct dragon_info *coin,uint8_t *serialized,char *cmd,char *hashstr);
int32_t dragon_getdata(struct dragon_info *coin,uint8_t *serialized,int32_t type,bits256 *hashes,int32_t n);
void dragon_blockunconv(uint8_t zcash,uint8_t auxpow,struct dragon_msgzblock *zmsg,struct dragon_zblock *zsrc,int32_t cleartxn_count);
int32_t dragon_peerblockrequest(struct supernet_info *myinfo,struct dragon_info *coin,uint8_t *blockspace,int32_t max,struct dragon_peer *addr,bits256 hash2,int32_t validatesigs);
int32_t dragon_validatesigs(struct supernet_info *myinfo,struct dragon_info *coin,uint8_t *serialized,int32_t datalen);
// ramchain
int64_t dragon_verifyaccount(struct dragon_info *coin,struct dragon_account *acct,uint32_t pkind);
int32_t dragon_initramchain(struct dragon_info *coin,int32_t initialheight,int32_t mapflags,int32_t fullverify);
void dragon_syncramchain(struct dragon_info *coin);
//int32_t dragon_validateramchain(struct dragon_info *coin,int64_t *netp,uint64_t *creditsp,uint64_t *debitsp,int32_t height,struct dragon_block *block,int32_t hwmheight,struct dragon_prevdep *lp);
int32_t dragon_calcrmd160(struct dragon_info *coin,char *asmstr,struct vin_info *vp,uint8_t *pk_script,int32_t pk_scriptlen,bits256 debugtxid,int32_t vout,uint32_t sequence);
uint32_t dragon_updatescript(struct dragon_info *coin,uint32_t blocknum,uint32_t txidind,uint32_t spendind,uint32_t unspentind,uint64_t value,uint8_t *script,int32_t scriptlen,uint32_t sequence);
void dragon_gotblockM(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_peer *addr,struct dragon_txblock *origtxdata,struct dragon_msgtx *txarray,struct dragon_msghdr *H,uint8_t *data,int32_t recvlen,int32_t fromcache,uint8_t zcash);
int32_t dragon_parseblock(struct dragon_info *coin,struct dragon_block *block,struct dragon_msgtx *tx,int32_t numtx);
uint32_t dragon_txidind(struct dragon_info *coin,uint32_t *firstvoutp,uint32_t *firstvinp,bits256 txid);
bits256 dragon_txidstr(struct dragon_info *coin,uint32_t *firstvoutp,uint32_t *firstvinp,char *txidstr,uint32_t txidind);
int32_t dragon_updateramchain(struct dragon_info *coin);
//void dragon_emittxarray(struct dragon_info *coin,FILE *fp,struct dragon_bundle *bundle,struct dragon_block *block,struct dragon_msgtx *txarray,int32_t numtx);
// blockchain
int32_t dragon_needhdrs(struct dragon_info *coin);
struct dragon_chain *dragon_chainfind(struct supernet_info *myinfo,char *name,cJSON *argjson,int32_t createflag);
int32_t dragon_chainextend(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_block *newblock);
uint64_t dragon_miningreward(struct dragon_info *coin,uint32_t blocknum);
// tx
int32_t dragon_rwtx(struct supernet_info *myinfo,uint8_t zcash,int32_t rwflag,struct dragon_info *coin,struct OS_memspace *mem,uint8_t *serialized,struct dragon_msgtx *msg,int32_t maxsize,bits256 *txidp,int32_t hastimestamp,int32_t isvpncoin);
void dragon_gottxidsM(struct dragon_info *coin,struct dragon_peer *addr,bits256 *txids,int32_t n);
void dragon_gotquotesM(struct dragon_info *coin,struct dragon_peer *addr,bits256 *quotes,int32_t n);
void dragon_gotunconfirmedM(struct dragon_info *coin,struct dragon_peer *addr,struct dragon_msgtx *tx,uint8_t *data,int32_t datalen);
void dragon_gotblockhashesM(struct dragon_info *coin,struct dragon_peer *addr,bits256 *blockhashes,int32_t n);
// blocks
bits256 dragon_blockhash(struct dragon_info *coin,int32_t height);
#define dragon_blockfind(str,coin,hash2) dragon_blockhashset(str,coin,-1,hash2,0)
struct dragon_block *dragon_blockhashset(char *debugstr,struct dragon_info *coin,int32_t height,bits256 hash2,int32_t createflag);
struct dragon_block *dragon_prevblock(struct dragon_info *coin,struct dragon_block *block,int32_t PoSflag);
uint32_t dragon_targetbits(struct dragon_info *coin,struct dragon_block *hwmchain,struct dragon_block *prev,struct dragon_block *prev2,int32_t PoSflag,int32_t targetspacing,int32_t targettimespan);
uint32_t dragon_syncs(struct dragon_info *coin);
void dragon_gotdata(struct dragon_info *coin,struct dragon_peer *addr,int32_t height);
//int64_t dragon_getbalance(struct dragon_info *coin,uint64_t *creditsp,uint64_t *debitsp,int32_t *nump,uint32_t *unspents,long max,struct dragon_pkhash *P,uint32_t pkind);
int32_t dragon_queueblock(struct dragon_info *coin,int32_t height,bits256 hash2,int32_t priority);
int32_t dragon_updatewaiting(struct dragon_info *coin,int32_t starti,int32_t max);
// recvbits
int32_t dragon_recvinit(struct dragon_info *coin,int32_t initialheight);
int32_t ramcoder_decompress(uint8_t *data,int32_t maxlen,uint8_t *bits,uint32_t numbits,bits256 seed);
int32_t ramcoder_compress(uint8_t *bits,int32_t maxlen,uint8_t *data,int32_t datalen,bits256 seed);
uint64_t hconv_bitlen(uint64_t bitlen);
struct dragon_block *dragon_blockptr(char *debugstr,struct dragon_info *coin,int32_t height);
int32_t dragon_processrecv(struct supernet_info *myinfo,struct dragon_info *coin); // single threaded
//void dragon_recvalloc(struct dragon_info *coin,int32_t numitems);
void dragon_coins(void *arg);
int32_t dragon_savehdrs(struct dragon_info *coin);
// hdrs
struct dragon_bundle *dragon_bundlecreate(struct dragon_info *coin,int32_t *bundleip,int32_t bundleheight,bits256 bundlehash2,bits256 allhash,int32_t issueflag);
struct dragon_block *dragon_updatehdrs(struct dragon_info *coin,int32_t *newhwmp,struct dragon_block *block,bits256 prevhash2,bits256 hash2);
void dragon_parseline(struct supernet_info *myinfo,struct dragon_info *coin,int32_t iter,FILE *fp);
int32_t dragon_gotheadersM(struct dragon_info *coin,struct dragon_peer *addr,struct dragon_zblock *zblocks,int32_t n);
void dragon_emittxdata(struct dragon_info *coin,struct dragon_bundle *bp);
int32_t dragon_pollQsPT(struct dragon_info *coin,struct dragon_peer *addr);
int32_t dragon_avail(struct dragon_info *coin,int32_t height,int32_t n);
int32_t dragon_updatebundles(struct dragon_info *coin);
uint64_t dragon_utxoaddrtablefind(struct dragon_info *coin,int16_t search_hdrsi,uint32_t search_pkind,uint8_t rmd160[20]);
void dragon_bundlestats(struct supernet_info *myinfo,struct dragon_info *coin,char *str,int32_t lag);
void dragon_chaininit(struct supernet_info *myinfo,struct dragon_chain *chain,int32_t hasheaders,cJSON *argjson);
void dragon_coinargs(char *symbol,int64_t *maxrecvcachep,int32_t *minconfirmsp,int32_t *maxpeersp,int32_t *initialheightp,uint64_t *servicesp,int32_t *maxrequestsp,int32_t *maxbundlesp,cJSON *json);
struct dragon_info *dragon_setcoin(char *symbol,void *launched,int32_t maxpeers,int64_t maxrecvcache,uint64_t services,int32_t initialheight,int32_t maphash,int32_t minconfirms,int32_t maxrequests,int32_t maxbundles,cJSON *json,int32_t virtcoin);
// init
struct dragon_info *dragon_coinstart(struct supernet_info *myinfo,struct dragon_info *coin,int32_t initialheight,int32_t mapflags);
void dragon_callcoinstart(struct supernet_info *myinfo,struct dragon_info *coin);
void dragon_initcoin(struct dragon_info *coin,cJSON *argjson);
void dragon_coinloop(void *arg);
// utils
double PoW_from_compact(uint32_t nBits,uint8_t unitval);
void calc_rmd160(char *hexstr,uint8_t buf[20],uint8_t *msg,int32_t len);
void calc_OP_HASH160(char *hexstr,uint8_t hash160[20],char *msg);
double dxblend(double *destp,double val,double decay);
double _xblend(float *destp,double val,double decay);
// json
int32_t dragon_processjsonQ(struct dragon_info *coin); // reentrant, can be called during any idletime
char *dragon_JSON(void *_myinfo,void *_coin,char *jsonstr,uint16_t port);
char *SuperNET_p2p(struct dragon_info *coin,struct dragon_peer *addr,int32_t *delaymillisp,char *ipaddr,uint8_t *data,int32_t datalen,int32_t compressed);
char *mbstr(char *str,double);
int init_hexbytes_noT(char *hexbytes,unsigned char *message,long len);
int32_t decode_hex(unsigned char *bytes,int32_t n,char *hex);
char hexbyte(int32_t c);
char *clonestr(char *str);
long _stripwhite(char *buf,int accept);
int32_t myatoi(char *str,int32_t range);
int32_t safecopy(char *dest,char *src,long len);
void escape_code(char *escaped,char *str);
int32_t is_zeroes(char *str);
int64_t conv_floatstr(char *numstr);
int32_t has_backslash(char *str);
struct dragon_thread *dragon_launch(struct dragon_info *coin,char *name,dragon_func funcp,void *arg,uint8_t type);
int32_t dragon_numthreads(struct dragon_info *coin,int32_t mask);
void dragon_terminator(void *arg);
int32_t is_hexstr(char *str,int32_t n);
void dragon_initQ(queue_t *Q,char *name);
void dragon_emitQ(struct dragon_info *coin,struct dragon_bundle *bp);
void dragon_txdataQ(struct dragon_info *coin,struct dragon_peer *addr,FILE *fp,long fpos,int32_t datalen);
void dragon_helper(void *arg);
struct dragon_helper { struct queueitem DL; void *coin,*addr,*bp,*nextbp,*fp; long fpos; int32_t allocsize,type,hdrsi,bundlei,datalen,timelimit; uint32_t starttime; };
int32_t dragon_helpertask(FILE *fp,struct OS_memspace *mem,struct OS_memspace *memB,struct dragon_helper *ptr);
void dragon_flushQ(struct dragon_info *coin,struct dragon_peer *addr);
//struct dragon_txdatabits dragon_peerfilePT(struct dragon_info *coin,struct dragon_peer *addr,bits256 hash2,struct dragon_txdatabits txdatabits,int32_t recvlen);
struct dragon_txdatabits dragon_calctxidbits(uint32_t addrind,uint32_t filecount,uint32_t fpos,uint32_t datalen);
int32_t dragon_bundlesaveHT(struct supernet_info *myinfo,struct dragon_info *coin,struct OS_memspace *mem,struct OS_memspace *memB,struct dragon_bundle *bp,uint32_t starttime); // helper thread
int32_t dragon_bundlemergeHT(struct supernet_info *myinfo,char *fname,struct dragon_info *coin,struct OS_memspace *mem,struct OS_memspace *memB,struct dragon_bundle *bp,struct dragon_bundle *nextbp,uint32_t starttime); // helper thread
void dragon_peerfilename(struct dragon_info *coin,char *fname,uint32_t addrind,uint32_t filecount);
struct dragon_txblock *dragon_ramchainptrs(struct dragon_txid **Tptrp,struct dragon_unspent20 **Uptrp,struct dragon_spend256 **Sptrp,struct dragon_pkhash **Pptrp,bits256 **externalTptrp,struct OS_memspace *mem,struct dragon_txblock *origtxdata);
int32_t dragon_ramchainsave(struct dragon_info *coin,struct dragon_ramchain *ramchain);
int32_t dragon_ramchainfree(struct dragon_info *coin,struct OS_memspace *mem,struct dragon_ramchain *ramchain);
struct dragon_ramchain *dragon_ramchainmergeHT(struct dragon_info *coin,struct OS_memspace *mem,struct dragon_ramchain *ramchains[],int32_t n,struct dragon_bundle *bp);
void dragon_ramchainmerge(struct dragon_info *coin);
int32_t dragon_blockQ(char *argstr,struct dragon_info *coin,struct dragon_bundle *bp,int32_t bundlei,bits256 hash2,int32_t priority);
void dragon_blockcopy(uint8_t zcash,uint8_t auxpow,struct dragon_info *coin,struct dragon_block *block,struct dragon_block *origblock);
int32_t dragon_rpctest(struct dragon_info *coin);
extern queue_t helperQ;
extern const char *Hardcoded_coins[][3];
void dragon_main(void *arg);
void dragon_exit(struct supernet_info *myinfo,struct dragon_bundle *bp);
int32_t dragon_peerfname(struct dragon_info *coin,int32_t *hdrsip,char *dirname,char *fname,uint32_t ipbits,bits256 hash2,bits256 prevhash2,int32_t numblocks,int32_t dispflag);
struct dragon_txblock *dragon_peertxdata(struct dragon_info *coin,int32_t *bundleip,char *fname,struct OS_memspace *mem,uint32_t ipbits,bits256 hash2);
int32_t dragon_peerfile_exists(struct dragon_info *coin,struct dragon_peer *addr,char *dirname,char *fname,bits256 hash2,bits256 prevhash2,int32_t numblocks);
struct dragon_ramchain *dragon_ramchainset(struct dragon_info *coin,struct dragon_ramchain *ramchain,struct dragon_txblock *txdata);
void *dragon_iAddriterator(struct dragon_info *coin,struct dragon_iAddr *iA,struct dragon_peer *addr);
long dragon_ramchain_data(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_peer *addr,struct dragon_txblock *origtxdata,struct dragon_msgtx *txarray,int32_t txn_count,uint8_t *data,int32_t recvlen,struct dragon_bundle *bp,struct dragon_block *block);
int32_t dragon_bundlehash2add(struct dragon_info *coin,struct dragon_block **blockp,struct dragon_bundle *bp,int32_t bundlei,bits256 hash2);
struct dragon_block *dragon_bundleblockadd(struct dragon_info *coin,struct dragon_bundle **bpp,int32_t *bundleip,struct dragon_block *origblock);
int32_t dragon_chainextend(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_block *newblock);
int32_t dragon_blockvalidate(struct supernet_info *myinfo,struct dragon_info *coin,int32_t *validp,struct dragon_block *block,int32_t dispflag);
char *dragon_bundledisp(struct dragon_info *coin,struct dragon_bundle *prevbp,struct dragon_bundle *bp,struct dragon_bundle *nextbp,int32_t m);
struct dragon_bundle *dragon_bundlefind(struct dragon_info *coin,struct dragon_bundle **bpp,int32_t *bundleip,bits256 hash2);
//int32_t dragon_chainheight(struct dragon_info *coin,struct dragon_block *origblock);
bits256 *dragon_blockhashptr(struct dragon_info *coin,int32_t height);
int32_t dragon_hash2set(struct dragon_info *coin,char *debugstr,struct dragon_bundle *bp,int32_t bundlei,bits256 newhash2);
struct dragon_block *_dragon_chainlink(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_block *newblock);
int32_t dragon_hashfree(struct dragon_kvitem *hashtable,int32_t freeitem);
int32_t dragon_processbundlesQ(struct dragon_info *coin,int32_t *newhwmp); // single threaded
int32_t dragon_ramchainverifyPT(struct dragon_info *coin,struct dragon_ramchain *ramchain);
void *map_file(char *fname,long *filesizep,int32_t enablewrite);
void dragon_rpcloop(void *args);
int32_t dragon_socket(int32_t bindflag,char *hostname,uint16_t port);
void dragon_mergeQ(struct dragon_info *coin,struct dragon_bundle *bp,struct dragon_bundle *nextbp);
#define bits256_nonz(a) (((a).ulongs[0] | (a).ulongs[1] | (a).ulongs[2] | (a).ulongs[3]) != 0)
//int32_t btc_addr2univ(uint8_t *addrtypep,uint8_t rmd160[20],char *coinaddr);
struct dragon_agent
{
char name[32],hostname[64]; void *methods; uint16_t port; int32_t sock,nummethods;
bits256 pubkey,privkey;
char *(*parsefunc)(struct dragon_agent *agent,char *method,void *json,char *remoteaddr);
};
int32_t dragon_txbytes(struct dragon_info *coin,uint8_t *serialized,int32_t maxlen,bits256 *txidp,struct dragon_txid *tx,int32_t height,struct dragon_msgvin *vins,struct dragon_msgvout *vouts);
int32_t dragon_vinset(struct dragon_info *coin,uint8_t *scriptspace,int32_t height,struct dragon_msgvin *vin,struct dragon_txid *tx,int32_t i);
int32_t dragon_voutset(struct dragon_info *coin,uint8_t *scriptspace,char *asmstr,int32_t height,struct dragon_msgvout *vout,struct dragon_txid *tx,int32_t i);
//int32_t btc_convrmd160(char *coinaddr,uint8_t addrtype,uint8_t rmd160[20]);
struct dragon_txid *dragon_bundletx(struct dragon_info *coin,struct dragon_bundle *bp,int32_t bundlei,struct dragon_txid *tx,int32_t txidind);
int32_t dragon_txidreq(struct dragon_info *coin,char **retstrp,bits256 txid);
void dragon_bundleiclear(struct dragon_info *coin,struct dragon_bundle *bp,int32_t bundlei);
int32_t hcalc_bitsize(uint64_t x);
struct dragon_txid *dragon_txidfind(struct dragon_info *coin,int32_t *heightp,struct dragon_txid *tx,bits256 txid,int32_t lasthdrsi);
int32_t dragon_scriptgen(struct dragon_info *coin,int32_t *Mp,int32_t *nump,char *coinaddr,uint8_t *script,char *asmstr,uint8_t rmd160[20],uint8_t type,const struct vin_info *vp,int32_t txi);
int32_t dragon_ramchain_spendtxid(struct dragon_info *coin,uint32_t *unspentindp,bits256 *txidp,struct dragon_txid *T,int32_t numtxids,bits256 *X,int32_t numexternaltxids,struct dragon_spend *s);
void dragon_dedicatedloop(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_peer *addr);
struct dragon_peer *dragon_peerslot(struct dragon_info *coin,uint64_t ipbits,int32_t forceflag);
void dragon_dedicatedglue(void *arg);
void SuperNET_remotepeer(struct supernet_info *myinfo,struct dragon_info *coin,char *symbol,char *ipaddr,int32_t supernetflag);
void dragon_peer_meminit(struct dragon_info *coin,struct dragon_peer *addr);
void SuperNET_yourip(struct supernet_info *myinfo,char *yourip);
void dragon_peerkill(struct dragon_info *coin);
int32_t blockhash_sha256(uint8_t *blockhashp,uint8_t *serialized,int32_t len);
void dragon_nameset(char name[64],char *symbol,cJSON *json);
cJSON *dragon_getinfo(struct supernet_info *myinfo,struct dragon_info *coin);
char *busdata_sync(uint32_t *noncep,char *jsonstr,char *broadcastmode,char *destNXTaddr);
void peggy();
int32_t opreturns_init(uint32_t blocknum,uint32_t blocktimestamp,char *path);
struct dragon_info *dragon_coinfind(char *symbol);
struct dragon_info *dragon_coinadd(char *symbol,char *nane,cJSON *json,int32_t virtcoin);
struct dragon_ramchain *dragon_bundleload(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_ramchain *ramchain,struct dragon_bundle *bp,int32_t extraflag);
int32_t dragon_sendblockreq(struct dragon_info *coin,struct dragon_peer *addr,struct dragon_bundle *bp,int32_t bundlei,bits256 hash2,int32_t iamthreadsafe);
int32_t dragon_send_supernet(struct dragon_peer *addr,char *jsonstr,int32_t delay);
struct dragon_waccount *dragon_waccountfind(struct supernet_info *myinfo,char *account);
struct dragon_waddress *dragon_waccountadd(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_waccount **wacctp,char *walletaccount,char *coinaddr);
struct dragon_waddress *dragon_waccountswitch(struct supernet_info *myinfo,struct dragon_info *coin,char *account,char *coinaddr,char *redeemScript);
struct dragon_waddress *dragon_waddresscalc(struct supernet_info *myinfo,uint8_t pubval,uint8_t wiftype,struct dragon_waddress *addr,bits256 privkey);
struct dragon_waddress *dragon_waddressfind(struct supernet_info *myinfo,struct dragon_waccount *wacct,char *coinaddr);
void dex_init(struct supernet_info *myinfo);
char *dragon_coinjson(struct dragon_info *coin,char *method,cJSON *json);
cJSON *dragon_peersjson(struct dragon_info *coin,int32_t addronly);
//int32_t btc_priv2wif(char *wifstr,uint8_t privkey[32],uint8_t addrtype);
//int32_t btc_pub2rmd(uint8_t rmd160[20],uint8_t pubkey[33]);
int32_t dragon_launchcoin(struct supernet_info *myinfo,char *symbol,cJSON *json,int32_t virtcoin);
int32_t dragon_bundleinitmap(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_bundle *bp,int32_t height,bits256 hash2,bits256 hash1);
int32_t dragon_jsonQ(struct supernet_info *myinfo,struct dragon_info *coin);
int32_t is_bitcoinrpc(struct supernet_info *myinfo,char *method,char *remoteaddr);
char *dragon_bitcoinRPC(struct supernet_info *myinfo,char *method,cJSON *json,char *remoteaddr,uint16_t port);
cJSON *dragon_pubkeyjson(struct dragon_info *coin,char *pubkeystr);
void dragon_bundleQ(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_bundle *bp,int32_t timelimit);
int32_t dragon_bundleiters(struct supernet_info *myinfo,struct dragon_info *coin,struct OS_memspace *mem,struct OS_memspace *memB,struct dragon_bundle *bp,int32_t timelimit,int32_t lag);
void ramcoder_test(void *data,int64_t len);
void dragon_exit(struct supernet_info *myinfo,struct dragon_bundle *bp);
int32_t dragon_pendingaccept(struct dragon_info *coin);
char *dragon_blockingjsonstr(struct supernet_info *myinfo,struct dragon_info *coin,char *jsonstr,uint64_t tag,int32_t maxmillis,char *remoteaddr,uint16_t port);
void dragon_iAkill(struct dragon_info *coin,struct dragon_peer *addr,int32_t markflag);
cJSON *SuperNET_bits2json(uint8_t *serialized,int32_t datalen);
int32_t SuperNET_sendmsg(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_peer *addr,bits256 destpub,bits256 mypriv,bits256 mypub,uint8_t *msg,int32_t len,uint8_t *data,int32_t delaymillis);
int32_t category_peer(struct supernet_info *myinfo,struct dragon_peer *addr,bits256 category,bits256 subhash);
int32_t bitcoin_wif2priv(uint8_t *addrtypep,bits256 *privkeyp,char *wifstr);
int32_t bitcoin_priv2wif(char *wifstr,bits256 privkey,uint8_t addrtype);
int32_t bitcoin_priv2wiflong(char *wifstr,bits256 privkey,uint8_t addrtype);
bits256 dragon_chaingenesis(struct supernet_info *myinfo,char *symbol,uint8_t zcash,uint8_t auxpow,int32_t (*hashalgo)(uint8_t *blockhashp,uint8_t *serialized,int32_t len),bits256 genesishash,char *genesisblock,char *hashalgostr,int32_t version,uint32_t timestamp,uint32_t bits,uint32_t nonce,bits256 merkle_root);
int32_t dragon_send_ConnectTo(struct dragon_info *coin,struct dragon_peer *addr);
cJSON *dragon_txjson(struct dragon_info *coin,struct dragon_txid *tx,int32_t height,struct vin_info *V);
char *dragon_txscan(struct supernet_info *myinfo,struct dragon_info *coin,cJSON *json,uint8_t *data,int32_t recvlen,bits256 txid);
char *dragon_rawtxbytes(struct dragon_info *coin,int32_t height,cJSON *json,struct dragon_msgtx *msgtx,int32_t suppress_pubkeys);
int32_t dragon_send_VPNversion(struct dragon_info *coin,struct dragon_peer *addr,uint64_t myservices);
void exchanges777_init(struct supernet_info *myinfo,cJSON *exchanges,int32_t sleepflag);
int32_t dragon_rwvout(int32_t rwflag,struct OS_memspace *mem,uint8_t *serialized,struct dragon_msgvout *msg);
int32_t dragon_rwvin(int32_t rwflag,struct dragon_info *coin,struct OS_memspace *mem,uint8_t *serialized,struct dragon_msgvin *msg,int32_t vini);
int32_t dragon_rwmsgtx(struct dragon_info *coin,int32_t height,int32_t rwflag,cJSON *json,uint8_t *serialized,int32_t maxsize,struct dragon_msgtx *msg,bits256 *txidp,char *vpnstr,uint8_t *extraspace,int32_t extralen,cJSON *vins,int32_t suppress_pubkeys);
int32_t dragon_ramtxbytes(struct dragon_info *coin,uint8_t *serialized,int32_t maxlen,bits256 *txidp,struct dragon_txid *tx,int32_t height,struct dragon_msgvin *vins,struct dragon_msgvout *vouts,int32_t validatesigs);
cJSON *bitcoin_txtest(struct dragon_info *coin,char *rawtxstr,bits256 txid);
cJSON *dragon_blockjson(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_block *block,int32_t txidsflag);
int32_t dragon_rwblockhdr(int32_t rwflag,uint8_t zcash,uint8_t *serialized,struct dragon_msgzblock *zmsg);
//int32_t dragon_sig(uint8_t *sig,int32_t maxsize,uint8_t *data,int32_t datalen,bits256 privkey);
//int32_t dragon_ver(uint8_t *sig,int32_t siglen,uint8_t *data,int32_t datalen,bits256 pubkey);
//int32_t dragon_ver(uint8_t *sig,int32_t siglen,uint8_t *data,int32_t datalen,uint8_t *pubkey);
void calc_rmd160_sha256(uint8_t rmd160[20],uint8_t *data,int32_t datalen);
int32_t bitcoin_checklocktimeverify(uint8_t *script,int32_t n,uint32_t locktime);
struct bitcoin_spend *dragon_spendset(struct supernet_info *myinfo,struct dragon_info *coin,int64_t amount,int64_t txfee,cJSON *addresses,int32_t minconf);
cJSON *bitcoin_hex2json(struct dragon_info *coin,int32_t height,bits256 *txidp,struct dragon_msgtx *msgtx,char *txbytes,uint8_t *extrapace,int32_t extralen,uint8_t *serialized,cJSON *vins,int32_t suppress_pubkeys);
cJSON *dragon_signtx(struct supernet_info *myinfo,struct dragon_info *coin,bits256 *txidp,char **signedtxp,struct bitcoin_spend *spend,cJSON *txobj,cJSON *vins);
void dragon_addscript(struct dragon_info *coin,cJSON *dest,uint8_t *script,int32_t scriptlen,char *fieldname);
bits256 dragon_genesis(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_chain *chain);
cJSON *bitcoin_txcreate(char *symbol,int32_t isPoS,int64_t locktime,uint32_t txversion,uint32_t timestamp);
cJSON *bitcoin_txoutput(cJSON *txobj,uint8_t *paymentscript,int32_t len,uint64_t satoshis);
cJSON *bitcoin_txinput(struct dragon_info *coin,cJSON *txobj,bits256 txid,int32_t vout,uint32_t sequenceid,uint8_t *spendscript,int32_t spendlen,uint8_t *redeemscript,int32_t p2shlen,uint8_t *pubkeys[],int32_t numpubkeys,uint8_t *sigscript,int32_t siglen);
int32_t bitcoin_changescript(struct dragon_info *coin,uint8_t *changescript,int32_t n,uint64_t *changep,char *changeaddr,uint64_t inputsatoshis,uint64_t satoshis,uint64_t txfee);
//cJSON *bitcoin_addinput(struct dragon_info *coin,cJSON *txobj,bits256 txid,int32_t vout,uint32_t sequenceid,uint8_t *spendscript,int32_t spendlen,uint8_t *redeemscript,int32_t p2shlen,uint8_t *pubkeys[],int32_t numpubkeys);
int32_t bitcoin_verifytx(struct dragon_info *coin,bits256 *signedtxidp,char **signedtx,char *rawtxstr,struct vin_info *V,int32_t numinputs);
int32_t bitcoin_verify(void *ctx,uint8_t *sig,int32_t siglen,bits256 txhash2,uint8_t *pubkey,int32_t plen);
cJSON *SuperNET_decryptedjson(char *destfname,char *passphrase,int32_t passsize,bits256 wallethash,char *fname2fa,int32_t fnamesize,bits256 wallet2priv);
int32_t bitcoin_txaddspend(struct dragon_info *coin,cJSON *txobj,char *destaddress,uint64_t satoshis);
char *_setVsigner(struct dragon_info *coin,struct vin_info *V,int32_t ind,char *pubstr,char *wifstr);
char *bitcoin_json2hex(struct supernet_info *myinfo,struct dragon_info *coin,bits256 *txidp,cJSON *txjson,struct vin_info *V);
int32_t bitcoin_addr2rmd160(uint8_t *addrtypep,uint8_t rmd160[20],char *coinaddr);
int32_t bitcoin_addr2rmd160_ex(char *symbol, uint8_t taddr, uint8_t *addrtypep, uint8_t rmd160[20], char *coinaddr);
char *issue_startForging(struct supernet_info *myinfo,char *secret);
struct bitcoin_unspent *dragon_unspentsget(struct supernet_info *myinfo,struct dragon_info *coin,char **retstrp,double *balancep,int32_t *numunspentsp,double minconfirms,char *address);
void dragon_chainparms(struct supernet_info *myinfo,struct dragon_chain *chain,cJSON *argjson);
int32_t dragon_RTpkhasharray(struct supernet_info *myinfo,struct dragon_info *coin,cJSON *array,int32_t minconf,int32_t maxconf,uint64_t *totalp,struct dragon_pkhash *P,int32_t max,uint8_t rmd160[20],char *coinaddr,uint8_t *pubkey33,int32_t lastheight,struct dragon_outpoint *unspents,int32_t *numunspentsp,int32_t maxunspents,char *remoteaddr,int32_t includespent);
long dragon_spentsfile(struct dragon_info *coin,int32_t n);
uint8_t *dragon_rmdarray(struct supernet_info *myinfo,struct dragon_info *coin,int32_t *numrmdsp,cJSON *array,int32_t firsti);
uint64_t dragon_RTunspents(struct supernet_info *myinfo,struct dragon_info *coin,cJSON *array,int32_t minconf,int32_t maxconf,uint8_t *rmdarray,int32_t numrmds,int32_t lastheight,struct dragon_outpoint *unspents,int32_t *numunspentsp,char *remoteaddr,int32_t includespent);
uint8_t *dragon_walletrmds(struct supernet_info *myinfo,struct dragon_info *coin,int32_t *numrmdsp);
void dragon_hhutxo_purge(struct dragon_info *coin);
char *dragon_bundleaddrs(struct dragon_info *coin,int32_t hdrsi);
uint32_t dragon_sparseaddpk(uint8_t *bits,int32_t width,uint32_t tablesize,uint8_t rmd160[20],struct dragon_pkhash *P,uint32_t pkind,struct dragon_ramchain *ramchain);
int32_t dragon_vinscriptparse(struct dragon_info *coin,struct vin_info *vp,uint32_t *sigsizep,uint32_t *pubkeysizep,uint32_t *p2shsizep,uint32_t *suffixp,uint8_t *vinscript,int32_t scriptlen);
void dragon_parsebuf(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_peer *addr,struct dragon_msghdr *H,uint8_t *buf,int32_t len,int32_t fromcache);
int32_t _dragon_calcrmd160(struct dragon_info *coin,struct vin_info *vp);
int32_t dragon_spendvectors(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_bundle *bp,struct dragon_ramchain *ramchain,int32_t starti,int32_t numblocks,int32_t convertflag,int32_t iterate);
int32_t dragon_balancegen(struct dragon_info *coin,int32_t incremental,struct dragon_bundle *bp,int32_t startheight,int32_t endheight,int32_t startemit);
struct dragon_utxoaddr *dragon_utxoaddrfind(int32_t createflag,struct dragon_info *coin,int16_t hdrsi,uint32_t pkind,uint8_t rmd160[20],struct dragon_utxoaddr **prevp,int32_t p2shflag);
int32_t dragon_bundlevalidate(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_bundle *bp,int32_t forceflag);
void dragon_validateQ(struct dragon_info *coin,struct dragon_bundle *bp);
struct dragon_bloominds dragon_calcbloom(bits256 hash2);
int32_t dragon_bloomfind(struct dragon_info *coin,struct dragon_bloom16 *bloom,int32_t incr,struct dragon_bloominds bit);
struct dragon_bloominds dragon_bloomset(struct dragon_info *coin,struct dragon_bloom16 *bloom,int32_t incr,struct dragon_bloominds bit);
int32_t dragon_Xspendmap(struct dragon_info *coin,struct dragon_ramchain *ramchain,struct dragon_bundle *bp);
//void dragon_balancesQ(struct dragon_info *coin,struct dragon_bundle *bp);
int32_t dragon_balanceflush(struct supernet_info *myinfo,struct dragon_info *coin,int32_t refhdrsi);
int32_t dragon_bundleissue(struct dragon_info *coin,struct dragon_bundle *bp,int32_t starti,int32_t max);
int32_t dragon_balancecalc(struct dragon_info *coin,struct dragon_bundle *bp,int32_t startheight,int32_t endheight);
int32_t dragon_sendblockreqPT(struct dragon_info *coin,struct dragon_peer *addr,struct dragon_bundle *bp,int32_t bundlei,bits256 hash2,int32_t iamthreadsafe);
int32_t dragon_blockreq(struct dragon_info *coin,int32_t height,int32_t priority);
int64_t dragon_bundlecalcs(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_bundle *bp,int32_t lag);
int32_t dragon_ramchain_prefetch(struct dragon_info *coin,struct dragon_ramchain *ramchain,int32_t txonly);
int32_t dragon_realtime_update(struct supernet_info *myinfo,struct dragon_info *coin);
int32_t dragon_volatilesmap(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_ramchain *ramchain);
void dragon_volatilespurge(struct dragon_info *coin,struct dragon_ramchain *ramchain);
int32_t dragon_volatilesinit(struct supernet_info *myinfo,struct dragon_info *coin);
void dragon_initfinal(struct supernet_info *myinfo,struct dragon_info *coin,bits256 lastbundle);
int64_t dragon_ramchainopen(struct supernet_info *myinfo,char *fname,struct dragon_info *coin,struct dragon_ramchain *ramchain,struct OS_memspace *mem,struct OS_memspace *hashmem,int32_t bundleheight,bits256 hash2);
int32_t dragon_ramchain_free(struct dragon_info *coin,struct dragon_ramchain *ramchain,int32_t deleteflag);
void dragon_blocksetcounters(struct dragon_info *coin,struct dragon_block *block,struct dragon_ramchain * ramchain);
int32_t dragon_ramchain_iterate(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_ramchain *dest,struct dragon_ramchain *ramchain,struct dragon_bundle *bp,int16_t bundlei);
void *dragon_bundlefile(struct dragon_info *coin,char *fname,long *filesizep,struct dragon_bundle *bp,int32_t bundlei,int32_t renameflag);
int32_t dragon_mapchaininit(char *fname,struct dragon_info *coin,struct dragon_ramchain *mapchain,struct dragon_bundle *bp,int32_t bundlei,struct dragon_block *block,void *ptr,long filesize);
void dragon_RTdataset_free(struct dragon_info *coin);
void dragon_autoextend(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_bundle *bp);
//void dragon_RTramchainfree(struct dragon_info *coin,struct dragon_bundle *bp);
void dragon_coinpurge(struct dragon_info *coin);
void tradebot_liquidity_command(struct supernet_info *myinfo,char *targetcoin,bits256 hash,cJSON *vals);
int32_t dragon_setmaxbundles(struct dragon_info *coin);
void dragon_bundlepurgefiles(struct dragon_info *coin,struct dragon_bundle *bp);
uint32_t dragon_sparseaddtx(uint8_t *bits,int32_t width,uint32_t tablesize,bits256 txid,struct dragon_txid *T,uint32_t txidind,struct dragon_ramchain *ramchain);
void dragon_launchpeer(struct dragon_info *coin,char *ipaddr,int32_t forceflag);
//void dragon_spendvectorsQ(struct dragon_info *coin,struct dragon_bundle *bp);
int8_t dragon_blockstatus(struct dragon_info *coin,struct dragon_block *block);
int32_t dragon_peerslotinit(struct dragon_info *coin,struct dragon_peer *addr,int32_t slotid,uint64_t ipbits);
void dragon_blockunmark(struct dragon_info *coin,struct dragon_block *block,struct dragon_bundle *bp,int32_t i,int32_t deletefile);
int32_t dragon_reqblocks(struct supernet_info *myinfo,struct dragon_info *coin);
void dragon_walletlock(struct supernet_info *myinfo,struct dragon_info *coin);
int32_t _SuperNET_encryptjson(struct supernet_info *myinfo,char *destfname,char *passphrase,int32_t passsize,char *fname2fa,int32_t fnamesize,cJSON *argjson);
int32_t bitcoin_pubkeylen(const uint8_t *pubkey);
struct dragon_block *dragon_bundleblock(struct dragon_info *coin,bits256 *hash2p,struct dragon_bundle *bp,int32_t i);
void *dragon_ramchainfile(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_ramchain *dest,struct dragon_ramchain *R,struct dragon_bundle *bp,int32_t bundlei,struct dragon_block *block);
int32_t dragon_bundlehashadd(struct dragon_info *coin,struct dragon_bundle *bp,int32_t bundlei,struct dragon_block *block);
int32_t dragon_convert(struct dragon_info *coin,int32_t helperid,struct dragon_bundle *bp,int32_t RTflag,int32_t starti);
int32_t dragon_bundleissuemissing(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_bundle *bp,int32_t priority,double mult);
FILE *myfopen(char *fname,char *mode);
int32_t myfclose(FILE *fp);
char *dragon_scriptaddress(struct dragon_info *coin,char *coinaddr,uint8_t *script,int32_t scriptlen);
int32_t dragon_walkchain(struct dragon_info *coin,int32_t skipflag);
struct dragon_block *dragon_fastlink(struct dragon_info *coin,int32_t hwmheight);
int32_t dragon_balancenormal(struct dragon_info *coin,struct dragon_bundle *bp,int32_t startheight,int32_t endheight);
int32_t dragon_spendvectorsaves(struct dragon_info *coin);
int32_t dragon_convertfinished(struct dragon_info *coin);
int32_t dragon_emitfinished(struct supernet_info *myinfo,struct dragon_info *coin,int32_t queueincomplete);
int32_t dragon_utxofinished(struct dragon_info *coin);
int32_t dragon_balancefinished(struct dragon_info *coin);
int32_t dragon_alloctxbits(struct dragon_info *coin,struct dragon_ramchain *ramchain);
void dragon_allocvolatile(struct dragon_info *coin,struct dragon_ramchain *ramchain);
int32_t dragon_rwaddr(int32_t rwflag,uint8_t *serialized,struct dragon_msgaddress *addr,int32_t protover);
struct dragon_bundle *dragon_bundleset(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_block **blockp,int32_t *bundleip,struct dragon_block *origblock);
struct dragon_waddress *dragon_waddresscreate(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_waccount *wacct,char *coinaddr,char *redeemScript);
int32_t dragon_peerhdrrequest(struct supernet_info *myinfo,struct dragon_info *coin,uint8_t *serialized,int32_t maxsize,struct dragon_peer *addr,bits256 hash2);
int32_t dragon_peeraddrrequest(struct dragon_info *coin,struct dragon_peer *addr,uint8_t *space,int32_t max);
int32_t dragon_peerdatarequest(struct dragon_info *coin,struct dragon_peer *addr,uint8_t *space,int32_t max);
int32_t dragon_peergetrequest(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_peer *addr,uint8_t *data,int32_t recvlen,int32_t getblock);
int32_t dragon_bundlefname(struct dragon_info *coin,struct dragon_bundle *bp,char *fname);
int32_t dragon_bundleremove(struct dragon_info *coin,int32_t hdrsi,int32_t tmpfiles);
int32_t dragon_voutsfname(struct dragon_info *coin,int32_t roflag,char *fname,int32_t slotid);
int32_t dragon_vinsfname(struct dragon_info *coin,int32_t roflag,char *fname,int32_t slotid);
bits256 dragon_merkle(char *symbol,bits256 *tree,int32_t txn_count);
int32_t dragon_bundleready(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_bundle *bp,int32_t requiredflag);
int32_t dragon_blast(struct dragon_info *coin,struct dragon_peer *addr);
int32_t dragon_validated(struct dragon_info *coin);
void dragon_volatilesalloc(struct dragon_info *coin,struct dragon_ramchain *ramchain,int32_t copyflag);
int32_t dragon_send_ping(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_peer *addr);
int32_t dragon_process_msgrequestQ(struct supernet_info *myinfo,struct dragon_info *coin);
uint32_t dragon_fastfindinit(struct dragon_info *coin);
int32_t dragon_outptset(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_outpoint *outpt,bits256 txid,int32_t vout,int64_t value,char *spendscriptstr);
int32_t dragon_unspentindfind(struct supernet_info *myinfo,struct dragon_info *coin,uint64_t *spentamountp,char *coinaddr,uint8_t *spendscript,int32_t *scriptlenp,uint64_t *valuep,int32_t *heightp,bits256 txid,int32_t vout,int32_t lasthdrsi,int32_t mempool);
int32_t dragon_RTunspentindfind(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_outpoint *outpt,char *coinaddr,uint8_t *spendscript,int32_t *scriptlenp,uint64_t *valuep,int32_t *heightp,bits256 txid,int32_t vout,int32_t lasthdrsi,int32_t mempool);
int32_t dragon_addressvalidate(struct dragon_info *coin,uint8_t *addrtypep,char *address);
int32_t bitcoin_sign(void *ctx,char *symbol,uint8_t *sig,bits256 txhash2,bits256 privkey,int32_t recoverflag);
void revcalc_rmd160_sha256(uint8_t rmd160[20],bits256 revhash);
struct dragon_utxo dragon_utxofind(struct dragon_info *coin,struct dragon_outpoint spentpt,int32_t *RTspendflagp,int32_t lockflag);
int32_t dragon_vinifind(struct supernet_info *myinfo,struct dragon_info *coin,bits256 *spentfrom,bits256 txid,int32_t vout);
int32_t dragon_scriptsigextract(struct supernet_info *myinfo,struct dragon_info *coin,uint8_t *script,int32_t maxsize,bits256 txid,int32_t vini);
void dragon_unspents_markinit(struct supernet_info *myinfo,struct dragon_info *coin);
bits256 dragon_str2priv(struct supernet_info *myinfo,struct dragon_info *coin,char *str);
int32_t dragon_RTspentflag(struct supernet_info *myinfo,struct dragon_info *coin,uint64_t *RTspendp,int32_t *spentheightp,struct dragon_ramchain *ramchain,struct dragon_outpoint spentpt,int32_t height,int32_t minconf,int32_t maxconf,uint64_t amount);
int32_t dragon_voutscript(struct dragon_info *coin,struct dragon_bundle *bp,uint8_t *scriptspace,char *asmstr,struct dragon_unspent *u,struct dragon_pkhash *p,int32_t txi);
struct dragon_RTaddr *dragon_RTaddrfind(struct dragon_info *coin,uint8_t *rmd160,char *coinaddr);
cJSON *dragon_RTunspentjson(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_outpoint outpt,bits256 txid,int32_t vout,uint64_t value,struct dragon_unspent *up,uint8_t rmd160[20],char *coinaddr,uint8_t *pubkey33,int32_t spentheight,char *remoteaddr);
int32_t bitcoin_standardspend(uint8_t *script,int32_t n,uint8_t rmd160[20]);
struct dragon_waddress *dragon_waddresssearch(struct supernet_info *myinfo,struct dragon_waccount **wacctp,char *coinaddr);
cJSON *dragon_RTlistunspent(struct supernet_info *myinfo,struct dragon_info *coin,cJSON *argarray,int32_t minconf,int32_t maxconf,char *remoteaddr,int32_t includespends);
uint64_t dragon_interest(struct supernet_info *myinfo,struct dragon_info *coin,bits256 txid,int32_t vout,uint64_t value);
void calc_shares(struct supernet_info *myinfo,uint8_t *shares,uint8_t *secret,int32_t size,int32_t width,int32_t M,int32_t N,uint8_t *sharenrs,uint8_t *space,int32_t spacesize);
//void dragon_wallet_Cclear(struct supernet_info *myinfo,char *symbol);
int64_t _RTgettxout(struct dragon_info *coin,struct dragon_RTtxid **ptrp,int32_t *heightp,int32_t *scriptlenp,uint8_t *script,uint8_t *rmd160,char *coinaddr,bits256 txid,int32_t vout,int32_t mempool);
int32_t _dragon_RTunspentfind(struct supernet_info *myinfo,struct dragon_info *coin,bits256 *txidp,int32_t *voutp,uint8_t *spendscript,struct dragon_outpoint outpt,int64_t value);
int64_t dragon_addressreceived(struct supernet_info *myinfo,struct dragon_info *coin,cJSON *json,char *remoteaddr,cJSON *txids,cJSON *vouts,cJSON *unspents,cJSON *spends,char *coinaddr,int32_t minconf,int32_t firstheight);
cJSON *dragon_walletjson(struct supernet_info *myinfo);
int32_t dragon_payloadupdate(struct supernet_info *myinfo,struct dragon_info *coin,char *retstr,struct dragon_waddress *waddr,char *account);
int32_t bitcoin_MofNspendscript(uint8_t p2sh_rmd160[20],uint8_t *script,int32_t n,const struct vin_info *vp);
struct dragon_txid *dragon_blocktx(struct dragon_info *coin,struct dragon_txid *tx,struct dragon_block *block,int32_t i);
cJSON *dragon_p2shjson(struct supernet_info *myinfo,struct dragon_info *coin,cJSON *retjson,struct dragon_waddress *waddr);
char *setaccount(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_waddress **waddrp,char *account,char *coinaddr,char *redeemScript);
char *dragon_APIrequest(struct dragon_info *coin,bits256 blockhash,bits256 txid,int32_t seconds);
int32_t bitcoin_verifyvins(struct dragon_info *coin,int32_t height,bits256 *signedtxidp,char **signedtx,struct dragon_msgtx *msgtx,uint8_t *serialized,int32_t maxsize,struct vin_info *V,uint32_t sighash,int32_t signtx,int32_t suppress_pubkeys);
char *dragon_validaterawtx(struct supernet_info *myinfo,struct dragon_info *coin,int32_t height,struct dragon_msgtx *msgtx,uint8_t *extraspace,int32_t extralen,char *rawtx,int32_t mempool,int32_t suppress_pubkeys);
int64_t dragon_fastfindcreate(struct dragon_info *coin);
int32_t bitcoin_validaddress(struct dragon_info *coin,char *coinaddr);
int32_t dragon_volatileupdate(struct dragon_info *coin,int32_t incremental,struct dragon_ramchain *spentchain,int16_t spent_hdrsi,uint32_t spent_unspentind,uint32_t spent_pkind,uint64_t spent_value,uint32_t spendind,uint32_t fromheight);
void dragon_utxoaddrs_purge(struct dragon_info *coin);
int32_t dragon_utxoupdate(struct dragon_info *coin,int16_t spent_hdrsi,uint32_t spent_unspentind,uint32_t spent_pkind,uint64_t spent_value,uint32_t spendind,uint32_t fromheight,uint8_t *rmd160);
int32_t dragon_RTunspentslists(struct supernet_info *myinfo,struct dragon_info *coin,uint64_t *totalp,struct dragon_outpoint *unspents,int32_t max,uint64_t required,int32_t minconf,cJSON *addresses,char *remoteaddr);
void dragon_unspents_mark(struct supernet_info *myinfo,struct dragon_info *coin,cJSON *vins);
int32_t dragon_immediate(struct dragon_info *coin,int32_t immedmillis);
int32_t dragon_fastfindreset(struct dragon_info *coin);
int64_t dragon_unspentset(struct supernet_info *myinfo,struct dragon_info *coin);
int32_t dragon_txidfastfind(struct dragon_info *coin,int32_t *heightp,bits256 txid,int32_t lasthdrsi);
uint8_t dragon_addrtype(struct dragon_info *coin,uint8_t script_type);
struct dragon_waddress *dragon_waddressadd(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_waccount *wacct,struct dragon_waddress *addwaddr,char *redeemScript);
cJSON *dragon_createvins(struct supernet_info *myinfo,struct dragon_info *coin,cJSON *txobj,cJSON *vins);
bits256 bitcoin_pubkey33(void *ctx,uint8_t *data,bits256 privkey);
bits256 bitcoin_randkey(void *ctx);
int32_t bitcoin_recoververify(void *ctx,char *symbol,uint8_t *sig64,bits256 messagehash2,uint8_t *pubkey,size_t plen);
int32_t bitcoin_assembler(struct dragon_info *coin,cJSON *logarray,uint8_t script[DRAGON_MAXSCRIPTSIZE],cJSON *scriptobj,int32_t interpret,int64_t nLockTime,struct vin_info *V);
cJSON *dragon_spendasm(struct dragon_info *coin,uint8_t *spendscript,int32_t spendlen);
uint64_t dragon_unspentavail(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_outpoint outpt,int32_t minconf,int32_t maxconf);
int32_t dragon_RTutxofunc(struct dragon_info *coin,int32_t *fromheightp,int32_t *lockedflagp,struct dragon_outpoint spentpt,int32_t *RTspendflagp,int32_t lockflag,int32_t spentheight);
int32_t dragon_signrawtransaction(struct supernet_info *myinfo,struct dragon_info *coin,int32_t height,struct dragon_msgtx *msgtx,char **signedtxp,bits256 *signedtxidp,struct vin_info *V,int32_t numinputs,char *rawtx,cJSON *vins,cJSON *privkeys);
cJSON *dragon_privkeysjson(struct supernet_info *myinfo,struct dragon_info *coin,cJSON *vins);
char *dragon_RTinputaddress(struct supernet_info *myinfo,struct dragon_info *coin,char *coinaddr,struct dragon_outpoint *spentptp,cJSON *vinobj);
struct dragon_waddress *dragon_getaccountaddress(struct supernet_info *myinfo,struct dragon_info *coin,cJSON *json,char *remoteaddr,char *coinaddr,char *account);
int32_t dragon_RTuvaltxid(struct supernet_info *myinfo,bits256 *txidp,struct dragon_info *coin,struct dragon_outpoint outpt);
struct instantdex_accept *instantdex_quotefind(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_peer *addr,bits256 encodedhash);
int32_t instantdex_quoterequest(struct supernet_info *myinfo,struct dragon_info *coin,uint8_t *serialized,int32_t maxlen,struct dragon_peer *addr,bits256 encodedhash);
int32_t instantdex_peerhas_clear(struct dragon_info *coin,struct dragon_peer *addr);
int32_t instantdex_quotep2p(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_peer *addr,uint8_t *serialized,int32_t recvlen);
void instantdex_update(struct supernet_info *myinfo);
cJSON *dragon_getaddressesbyaccount(struct supernet_info *myinfo,struct dragon_info *coin,char *account);
int32_t dragon_interpreter(struct dragon_info *coin,cJSON *logarray,int64_t nLockTime,struct vin_info *V,int32_t numvins);
int32_t dragon_parsevinobj(struct supernet_info *myinfo,struct dragon_info *coin,uint8_t *serialized,int32_t maxsize,struct dragon_msgvin *vin,cJSON *vinobj,struct vin_info *V);
//int64_t dragon_availunspents(struct supernet_info *myinfo,uint64_t **unspentsp,int32_t *nump,struct dragon_info *coin,int32_t minconf,char *account,void *ptr,int32_t maxsize);
char *dragon_signunspents(struct supernet_info *myinfo,struct dragon_info *coin,bits256 *signedtxidp,int32_t *completedp,cJSON *txobj,uint64_t satoshis,char *changeaddr,uint64_t txfee,struct dragon_outpoint *unspents,int32_t num);
bits256 dragon_sendrawtransaction(struct supernet_info *myinfo,struct dragon_info *coin,char *signedtx);
int32_t dragon_inv2packet(uint8_t *serialized,int32_t maxsize,int32_t type,bits256 *hashes,int32_t n);
int32_t instantdex_inv2data(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_peer *addr,struct exchange_info *exchange);
struct dragon_bundlereq *instantdex_recvquotes(struct dragon_info *coin,struct dragon_bundlereq *req,bits256 *encodedhash,int32_t n);
struct exchange_info *exchange_create(char *exchangestr,cJSON *argjson);
int32_t dragon_inv2poll(struct supernet_info *myinfo,struct dragon_info *coin);
struct dragon_bundlereq *dragon_bundlereq(struct dragon_info *coin,struct dragon_peer *addr,int32_t type,uint8_t *data,int32_t datalen);
void instantdex_FSMinit();
cJSON *dpow_listunspent(struct supernet_info *myinfo,struct dragon_info *coin,char *coinaddr);
void dragon_dPoWupdate(struct supernet_info *myinfo,struct dpow_info *dp);
char *dragon_utxoduplicates(struct supernet_info *myinfo,struct dragon_info *coin,uint8_t *pubkey33,uint64_t satoshis,int32_t duplicates,int32_t *completedp,bits256 *signedtxidp,int32_t sendflag,cJSON *addresses);
int32_t bitcoin_p2shspend(uint8_t *script,int32_t n,uint8_t rmd160[20]);
void dragon_RTunspentslock(struct supernet_info *myinfo,struct dragon_info *coin,cJSON *vins);
char *dragon_calcrawtx(struct supernet_info *myinfo,struct dragon_info *coin,cJSON **vinsp,cJSON *txobj,int64_t satoshis,char *changeaddr,int64_t txfee,cJSON *addresses,int32_t minconf,uint8_t *opreturn,int32_t oplen,int64_t burnamount,char *remoteaddr,struct vin_info *V,int32_t maxmode);
cJSON *bitcoin_data2json(struct dragon_info *coin,int32_t height,bits256 *txidp,struct dragon_msgtx *msgtx,uint8_t *extraspace,int32_t extralen,uint8_t *serialized,int32_t len,cJSON *vins,int32_t suppress_pubkeys);
int32_t dragon_unspentind2txid(struct supernet_info *myinfo,struct dragon_info *coin,int32_t *spentheightp,bits256 *txidp,int32_t *voutp,struct dragon_outpoint outpt);
int32_t dragon_RTunspent_check(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_outpoint outpt);
int32_t dragon_markedunspents_find(struct dragon_info *coin,int32_t *firstslotp,bits256 txid,int32_t vout);
char *dragon_signrawtx(struct supernet_info *myinfo,struct dragon_info *coin,int32_t height,bits256 *signedtxidp,int32_t *completedp,cJSON *vins,char *rawtx,cJSON *privkeys,struct vin_info *V);
bits256 scrypt_blockhash(const void *input);
bits256 dragon_calcblockhash(char *symbol,int32_t (*hashalgo)(uint8_t *blockhashp,uint8_t *serialized,int32_t len),uint8_t *serialized,int32_t len);
struct bitcoin_eventitem *instantdex_event(char *cmdstr,cJSON *argjson,cJSON *newjson,uint8_t *serdata,int32_t serdatalen);
void instantdex_eventfree(struct bitcoin_eventitem *ptr);
struct dragon_monitorinfo *dragon_txidmonitor(struct dragon_info *coin,bits256 txid);
struct dragon_monitorinfo *dragon_txidreport(struct dragon_info *coin,bits256 txid,struct dragon_peer *addr);
double dragon_txidstatus(struct supernet_info *myinfo,struct dragon_info *coin,bits256 txid);
char *bitcoind_passthru(char *coinstr,char *serverport,char *userpass,char *method,char *params);
char *bitcoin_calcrawtx(struct supernet_info *myinfo,struct dragon_info *coin,cJSON **vinsp,int64_t satoshis,char *paymentscriptstr,char *changeaddr,int64_t txfee,cJSON *addresses,int32_t minconf,uint32_t locktime);
char *bitcoin_blockhashstr(char *coinstr,char *serverport,char *userpass,int32_t height);
void calc_scrypthash(uint32_t *hash,void *data);
int32_t dragon_rwvarstr(int32_t rwflag,uint8_t *serialized,int32_t maxlen,char *endianedp);
bits256 bitcoin_sharedsecret(void *ctx,bits256 privkey,uint8_t *pubkey,int32_t plen);
int32_t dragon_blockhdrsize(char *symbol,uint8_t zcash,uint8_t auxpow);//,uint8_t *serialized,int32_t maxlen);
int32_t dragon_blockROsize(uint8_t zcash);
void *dragon_blockzcopyRO(uint8_t zcash,struct dragon_blockRO *dest,int32_t desti,struct dragon_blockRO *src,int32_t srci);
void dragon_blockzcopy(uint8_t zcash,struct dragon_block *dest,struct dragon_block *src);
int32_t dragon_blocksizecheck(char *debugstr,uint8_t zcash,struct dragon_block *block);
int32_t bitcoin_secret160verify(uint8_t *script,int32_t n,uint8_t secret160[20]);
int32_t bitcoin_secret256spend(uint8_t *script,int32_t n,bits256 secret);
int32_t bitcoin_pubkeyspend(uint8_t *script,int32_t n,uint8_t pubkey[66]);
struct supernet_info *SuperNET_MYINFO(char *passphrase);
bits256 calc_categoryhashes(bits256 *subhashp,char *category,char *subcategory);
struct gecko_chain *category_find(bits256 categoryhash,bits256 subhash);
void *category_subscribe(struct supernet_info *myinfo,bits256 category,bits256 keyhash);
char *bitcoin_address(char *coinaddr,uint8_t addrtype,uint8_t *pubkey_or_rmd160,int32_t len);
char *bitcoin_address_ex(char *symbol, char *coinaddr, uint8_t taddr, uint8_t addrtype, uint8_t *pubkey_or_rmd160, int32_t len);
char *SuperNET_JSON(struct supernet_info *myinfo,struct dragon_info *coin,cJSON *json,char *remoteaddr,uint16_t port);
int64_t dragon_txdetails(struct supernet_info *myinfo,struct dragon_info *coin,cJSON *item,bits256 txid,int32_t vout,int32_t height);
int32_t dragon_txidheight(struct supernet_info *myinfo,struct dragon_info *coin,bits256 txid);
int64_t dragon_txidamount(struct supernet_info *myinfo,struct dragon_info *coin,char *coinaddr,bits256 txid,int32_t vout);
char *dragon_txidcategory(struct supernet_info *myinfo,struct dragon_info *coin,char *account,char *coinaddr,bits256 txid,int32_t vout);
struct supernet_info *SuperNET_accountfind(cJSON *json);
cJSON *SuperNET_rosettajson(struct supernet_info *myinfo,bits256 privkey,int32_t showprivs);
double instantdex_aveprice(struct supernet_info *myinfo,struct exchange_quote *sortbuf,int32_t max,double *totalvolp,char *base,char *rel,double basevolume,cJSON *argjson);
char *SuperNET_keysinit(struct supernet_info *myinfo,char *argjsonstr);
char *SuperNET_parser(struct supernet_info *myinfo,char *agentstr,char *method,cJSON *json,char *remoteaddr);
char *SuperNET_htmlstr(char *fname,char *htmlstr,int32_t maxsize,char *agentstr);
void SuperNET_setkeys(struct supernet_info *myinfo,void *pass,int32_t passlen,int32_t dosha256);
int32_t dragon_headerget(struct supernet_info *myinfo,struct dragon_info *coin,uint8_t *serialized,int32_t maxsize,struct dragon_block *block);
int32_t dragon_bundlefinalize(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_bundle *bp,struct OS_memspace *mem,struct OS_memspace *memB);
bits256 dragon_parsetxobj(struct supernet_info *myinfo,struct dragon_info *coin,int32_t *txstartp,uint8_t *serialized,int32_t maxsize,struct dragon_msgtx *msg,cJSON *txobj,struct vin_info *V);
int32_t dragon_ROallocsize(struct dragon_info *virt);
uint64_t dragon_utxoaddr_gen(struct supernet_info *myinfo,struct dragon_info *coin,int32_t maxheight);
long dragon_bundlesload(struct supernet_info *myinfo,struct dragon_info *coin);
int32_t bitcoin_pubkey_combine(void *ctx,uint8_t *combined_pub,uint8_t *skipkey,bits256 *evenkeys,int32_t n,bits256 *oddkeys,int32_t m);
bits256 bitcoin_pub256(void *ctx,bits256 *privkeyp,uint8_t odd_even);
bits256 bitcoin_schnorr_noncepair(void *ctx,uint8_t *pubnonce,bits256 txhash2,bits256 privkey);
int32_t bitcoin_schnorr_combine(void *ctx,uint8_t *sig64,uint8_t *allpub,uint8_t **sigs,int32_t n,bits256 txhash2);
int32_t bitcoin_schnorr_verify(void *ctx,uint8_t *sig64,bits256 txhash2,uint8_t *pubkey,int32_t plen);
int32_t dragon_parsevoutobj(struct dragon_info *coin,uint8_t *serialized,int32_t maxsize,struct dragon_msgvout *vout,cJSON *voutobj);
struct gecko_memtx *gecko_unspentfind(struct gecko_memtx ***ptrpp,struct dragon_info *virt,bits256 txid);
int64_t *gecko_valueptr(struct gecko_memtx *memtx,int32_t vout);
struct dragon_peer *dragon_peerfindipaddr(struct dragon_info *coin,char *ipaddr,int32_t needalive);
struct dragon_peer *dragon_peerfindipbits(struct dragon_info *coin,uint32_t ipbits,int32_t needalive);
int32_t dragon_opreturn(struct supernet_info *myinfo,int32_t ordered,struct dragon_info *coin,uint32_t timestamp,struct dragon_bundle *bp,int64_t crypto555_payment,int32_t height,uint64_t hdrsi_unspentind,int64_t payment,uint32_t fileid,uint64_t scriptpos,uint32_t scriptlen);
/*
* because the address passed in a non-portable way we defined uint64_t as parameter to
* allow the pass of 64bit memory address in windows 64
* @author - fadedreamz@gmail.com
*/
#if defined(_M_X64)
int32_t dragon_scriptdata(struct dragon_info *coin, uint8_t *scriptspace, uint64_t fileptr[2], char *fname, uint64_t scriptpos, int32_t scriptlen);
#else
int32_t dragon_scriptdata(struct dragon_info *coin,uint8_t *scriptspace,long fileptr[2],char *fname,uint64_t scriptpos,int32_t scriptlen);
#endif
void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr);
void dpow_psockloop(void *_ptr);
int32_t smartaddress_add(struct supernet_info *myinfo,bits256 privkey,char *typestr,char *symbol,double maxbid,double minask);
int32_t smartaddress(struct supernet_info *myinfo,char *typestr,double *bidaskp,bits256 *privkeyp,char *symbol,char *coinaddr);
int32_t smartaddress_pubkey(struct supernet_info *myinfo,char *typestr,double *bidaskp,bits256 *privkeyp,char *symbol,bits256 pubkey);
int32_t smartaddress_pubkey33(struct supernet_info *myinfo,char *typestr,double *bidaskp,bits256 *privkeyp,char *symbol,uint8_t *pubkey33);
void dragon_RTreset(struct dragon_info *coin);
void dragon_RTpurge(struct dragon_info *coin,int32_t lastheight);
void dragon_RTnewblock(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_block *block);
cJSON *dragon_listunspents(struct supernet_info *myinfo,struct dragon_info *coin,cJSON *array,int32_t minconf,int32_t maxconf,char *remoteaddr);
void *dragon_RTrawdata(struct dragon_info *coin,bits256 hash2,uint8_t *data,int32_t *recvlenp,int32_t *numtxp,int32_t checkonly);
int32_t dragon_bundlehash2_check(struct dragon_info *coin,bits256 hash2);
void dragon_RTramchainalloc(char *fname,struct dragon_info *coin,struct dragon_bundle *bp);
void dragon_update_balances(struct supernet_info *myinfo,struct dragon_info *coin);
void dragon_RTspendvectors(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_bundle *bp);
int64_t dragon_RTbalance(struct dragon_info *coin,char *coinaddr);
double instantdex_avehbla(struct supernet_info *myinfo,double retvals[4],char *base,char *rel,double basevolume);
int32_t bitcoin_secret160verify(uint8_t *script,int32_t n,uint8_t secret160[20]);
int64_t dragon_lockval(int32_t finalized,int64_t locktime);
uint64_t *dragon_PoS_weights(struct supernet_info *myinfo,struct dragon_info *coin,struct dragon_pkhash **Ptrp,uint64_t *supplyp,int32_t *numacctsp,int32_t *nonzp,int32_t *errsp,int32_t lastheight);
int32_t dragon_staker_sort(struct dragon_info *coin,bits256 *hash2p,uint8_t *refrmd160,struct dragon_pkhash *refP,uint64_t *weights,int32_t numweights,bits256 *sortbuf);
bits256 mpz_div64(bits256 hash,uint64_t divval);
void dragon_walletinitcheck(struct supernet_info *myinfo,struct dragon_info *coin);
void smartaddress_update(struct supernet_info *myinfo,int32_t selector);
int64_t dragon_esttxfee(struct supernet_info *myinfo,struct dragon_info *coin,char *rawtx,char *signedtx,int32_t numvins);
// ------------------------------------------------------[ Preparation ]----
// Initialise a gfshare context for producing shares
gfshare_ctx *gfshare_ctx_initenc(uint8_t * /* sharenrs */,uint32_t /* sharecount */, uint8_t /* threshold */,uint32_t /* size */,void *,int32_t);
// Initialise a gfshare context for recombining shares
gfshare_ctx *gfshare_ctx_initdec(uint8_t * /* sharenrs */,uint32_t /* sharecount */,uint32_t /* size */,void *,int32_t);
// Free a share context's memory
void gfshare_ctx_free(gfshare_ctx * /* ctx */);
// --------------------------------------------------------[ Splitting ]----
// Provide a secret to the encoder. (this re-scrambles the coefficients)
void gfshare_ctx_enc_setsecret(gfshare_ctx * /* ctx */,uint8_t * /* secret */);
// Extract a share from the context. 'share' must be preallocated and at least 'size' bytes long. 'sharenr' is the index into the 'sharenrs' array of the share you want.
void gfshare_ctx_encgetshare(uint8_t *logs,uint8_t *exps,gfshare_ctx * /* ctx */,uint8_t /* sharenr */,uint8_t * /* share */);
// ----------------------------------------------------[ Recombination ]----
// Inform a recombination context of a change in share indexes
void gfshare_ctx_dec_newshares(gfshare_ctx * /* ctx */, uint8_t * /* sharenrs */);
// Provide a share context with one of the shares. The 'sharenr' is the index into the 'sharenrs' array
void gfshare_ctx_dec_giveshare(gfshare_ctx * /* ctx */,uint8_t /* sharenr */,uint8_t * /* share */);
// Extract the secret by interpolation of the shares. secretbuf must be allocated and at least 'size' bytes long
void gfshare_ctx_decextract(uint8_t *logs,uint8_t *exps,gfshare_ctx * /* ctx */,uint8_t * /* secretbuf */);
void libgfshare_init(struct supernet_info *myinfo,uint8_t _logs[256],uint8_t _exps[510]);
int32_t init_sharenrs(uint8_t sharenrs[255],uint8_t *orig,int32_t m,int32_t n);
void dragon_schnorr(struct supernet_info *myinfo);
void dragon_fixsecp(struct supernet_info *myinfo);
int32_t bitcoin_timelockspend(uint8_t *script,int32_t n,uint8_t rmd160[20],uint32_t timestamp);
char *dragon_calcutxorawtx(struct supernet_info *myinfo,struct dragon_info *coin,cJSON **vinsp,cJSON *txobj,int64_t *satoshis,int32_t numoutputs,char *changeaddr,int64_t txfee,cJSON *utxos,char *remoteaddr,struct vin_info *V,int32_t maxmode);
uint64_t _dragon_interest(uint32_t now,int32_t height,uint32_t txlocktime,uint64_t value);
#include "../includes/dragon_api.h"
#endif