/****************************************************************************** * Copyright © 2014-2016 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 PANGEA777_H #define PANGEA777_H #include "iguana777.h" #define TEST_TRANSPORT "http://" #define _PANGEA_MAXTHREADS 9 #define PANGEA_MINRAKE_MILLIS 5 #define PANGEA_USERTIMEOUT 60 #define PANGEA_MAX_HOSTRAKE 5 #define PANGEA_BTCMAXRAKE (SATOSHIDEN / 100) #define PANGEA_MAXRAKE (3 * SATOSHIDEN) #define PANGEA_HANDGAP 30 #define PANGEA_PAUSE 5 #define CARDS777_MAXCARDS 52 #define CARDS777_MAXPLAYERS 9 #define CARDS777_FOLD -1 #define CARDS777_START 1 #define CARDS777_ANTE 2 #define CARDS777_SMALLBLIND 3 #define CARDS777_BIGBLIND 4 #define CARDS777_CHECK 5 #define CARDS777_CALL 6 #define CARDS777_BET 7 #define CARDS777_RAISE 8 #define CARDS777_FULLRAISE 9 #define CARDS777_SENTCARDS 10 #define CARDS777_ALLIN 11 #define CARDS777_FACEUP 12 #define CARDS777_WINNINGS 13 #define CARDS777_RAKES 14 #define CARDS777_CHANGES 15 #define CARDS777_SNAPSHOT 16 struct cards777_handinfo { bits256 checkprod,*cardpubs,*final,community256[5],cards[CARDS777_MAXPLAYERS][2]; uint64_t othercardpubs[CARDS777_MAXPLAYERS]; int64_t havemasks[CARDS777_MAXPLAYERS],betsize,hostrake,pangearake,lastraise,bets[CARDS777_MAXPLAYERS],snapshot[CARDS777_MAXPLAYERS+1],won[CARDS777_MAXPLAYERS]; uint32_t starttime,handmask,lastbettor,startdecktime,betstarted,finished,encodestarted; uint32_t cardi,userinput_starttime,handranks[CARDS777_MAXPLAYERS]; int8_t betstatus[CARDS777_MAXPLAYERS],actions[CARDS777_MAXPLAYERS],turnis[CARDS777_MAXPLAYERS]; uint8_t numactions,undergun,community[5],sharenrs[CARDS777_MAXPLAYERS][255],hands[CARDS777_MAXPLAYERS][7]; }; struct cards777_pubdata { int64_t snapshot[CARDS777_MAXPLAYERS]; uint64_t maxrake,hostrake,bigblind,ante,pangearake,summaries,mismatches; uint32_t button,readymask,numhands,rakemillis,minbuyin,maxbuyin,summarysize; void *table; struct cards777_handinfo hand; char newhand[65536],coinstr[16]; uint8_t M,N,numcards,summary[65536]; bits256 data[]; }; struct cards777_privdata { bits256 holecards[2],*audits,*outcards,*xoverz; //,*reconstructed[CARDS777_MAXPLAYERS],*mofn[CARDS777_MAXPLAYERS][CARDS777_MAXPLAYERS]; uint8_t *myshares[CARDS777_MAXPLAYERS],*allshares,hole[2],cardis[2],automuck,autofold; bits256 data[]; }; extern int32_t Debuglevel; bits256 xoverz_donna(bits256 a); bits256 crecip_donna(bits256 a); bits256 fmul_donna(bits256 a,bits256 b); void calc_shares(unsigned char *shares,unsigned char *secret,int32_t size,int32_t width,int32_t M,int32_t N,unsigned char *sharenrs); int32_t init_sharenrs(unsigned char sharenrs[255],unsigned char *orig,int32_t m,int32_t n); struct pangea_info { uint32_t timestamp,numaddrs,minbuyin,maxbuyin; int64_t balances[CARDS777_MAXPLAYERS]; uint8_t isbot[CARDS777_MAXPLAYERS]; bits256 playerpubs[CARDS777_MAXPLAYERS]; uint64_t basebits,bigblind,ante,addrs[CARDS777_MAXPLAYERS],active[CARDS777_MAXPLAYERS],tableid; char btcpubkeystr[67],wipstr[64],coinstr[16],multisigaddr[64],scriptPubKey[128],redeemScript[4096]; uint8_t addrtype,p2shtype,wiftype,btcpub[33]; int32_t myslot,myind,numactive,buyinvouts[CARDS777_MAXPLAYERS]; uint64_t buyinamounts[CARDS777_MAXPLAYERS]; char buyintxids[CARDS777_MAXPLAYERS][128],coinaddrs[CARDS777_MAXPLAYERS][67],btcpubkeys[CARDS777_MAXPLAYERS][67]; struct pangea_thread *tp; struct cards777_privdata *priv; struct cards777_pubdata *dp; }; extern struct pangea_info *TABLES[100]; //./BitcoinDarkd SuperNET '{"agent":"InstantDEX","method":"orderbook","exchange":"active","base":"NXT","rel":"BTC"}' // ./SNapi "{\"agent\":\"InstantDEX\",\"method\":\"orderbook\",\"exchange\":\"pangea\",\"base\":\"NXT\"}" // ./SNapi "{\"agent\":\"InstantDEX\",\"method\":\"placebid\",\"exchange\":\"pangea\",\"base\":\"NXT\"}" struct pangeanet777_endpoint { char endpoint[128],transport[16],ipaddr[64]; uint16_t port; }; struct pangeanet777_id { bits256 pubkey; uint64_t nxt64bits; void *privdata,*pubdata; int32_t pmsock; uint32_t lastcontact; }; union pangeanet777 { struct pangeanet777_server *server; struct pangeanet777_client *client; }; struct pangeanet777_hdr { queue_t Q; bits256 privkey,pubkey; void *privdata,*pubdata; uint64_t nxt64bits;//,recvhashes[64]; void (*pollfunc)(union pangeanet777 *hn); uint32_t lastping; int32_t slot,done,state,ind; }; struct pangeanet777_client { struct pangeanet777_hdr H; int32_t subsock; struct pangeanet777_id my; uint64_t balance,tableid; }; struct pangeanet777_server { struct pangeanet777_hdr H; int32_t num,max,pubsock; struct pangeanet777_endpoint ep; //queue_t mailboxQ[CARDS777_MAXPLAYERS]; struct pangeanet777_id clients[]; }; struct pangea_thread { union pangeanet777 hn; uint64_t nxt64bits; int32_t threadid,ishost,M,N,numcards; }; extern struct pangea_thread *THREADS[_PANGEA_MAXTHREADS]; int32_t SuperNET_copybits(int32_t reverse,uint8_t *dest,uint8_t *src,int32_t len); int32_t cardstr(char *cardstr,uint8_t card); uint32_t set_handstr(char *handstr,uint8_t cards[7],int32_t verbose); struct cards777_pubdata *cards777_allocpub(int32_t M,int32_t numcards,int32_t N); struct cards777_privdata *cards777_allocpriv(int32_t numcards,int32_t N); bits256 cards777_initdeck(bits256 *cards,bits256 *cardpubs,int32_t numcards,int32_t N,bits256 *playerpubs,bits256 *playerprivs); bits256 cards777_pubkeys(bits256 *pubkeys,int32_t numcards,bits256 cmppubkey); int32_t cards777_checkcard(bits256 *cardprivp,int32_t cardi,int32_t slot,int32_t destplayer,bits256 playerpriv,bits256 *cardpubs,int32_t numcards,bits256 card); int32_t cards777_validate(bits256 cardpriv,bits256 final,bits256 *cardpubs,int32_t numcards,bits256 *audit,int32_t numplayers,bits256 playerpub); bits256 cards777_decode(bits256 *seedp,bits256 *xoverz,int32_t destplayer,bits256 cipher,bits256 *outcards,int32_t numcards,int32_t N); uint8_t *cards777_encode(bits256 *encoded,bits256 *xoverz,uint8_t *allshares,uint8_t *myshares[],uint8_t sharenrs[255],int32_t M,bits256 *ciphers,int32_t numcards,int32_t N); int32_t pangea_search(struct pangea_info *sp,uint64_t nxt64bits); int32_t pangea_tableaddr(struct cards777_pubdata *dp,uint64_t destbits); struct pangea_info *pangea_find64(uint64_t tableid,uint64_t nxt64bits); struct pangea_info *pangea_find(uint64_t tableid,int32_t threadid); int32_t pangea_neworder(struct cards777_pubdata *dp,struct pangea_info *sp,uint64_t *active,int32_t numactive); cJSON *pangea_tablestatus(struct pangea_info *sp); void pangea_summary(union pangeanet777 *hn,struct cards777_pubdata *dp,uint8_t type,void *arg0,int32_t size0,void *arg1,int32_t size1); void pangea_startbets(union pangeanet777 *hn,struct cards777_pubdata *dp,int32_t cardi); void pangea_checkantes(union pangeanet777 *hn,struct cards777_pubdata *dp); uint64_t pangea_bot(union pangeanet777 *hn,struct cards777_pubdata *dp,int32_t turni,int32_t cardi,uint64_t betsize); char *pangea_dispsummary(struct pangea_info *sp,int32_t verbose,uint8_t *summary,int32_t summarysize,uint64_t tableid,int32_t handid,int32_t numplayers); char *_pangea_input(uint64_t my64bits,uint64_t tableid,cJSON *json); void pangea_finish(union pangeanet777 *hn,struct cards777_pubdata *dp); void pangea_serverstate(union pangeanet777 *hn,struct cards777_pubdata *dp,struct cards777_privdata *priv); int32_t pangea_anotherhand(void *hn,struct cards777_pubdata *dp,int32_t sleepflag); void pangea_clearhand(struct cards777_pubdata *dp,struct cards777_handinfo *hand,struct cards777_privdata *priv); void pangea_create_newtable(char *retbuf,struct pangea_info *sp,struct cards777_pubdata *dp,uint64_t *isbot); void pangea_buyins(uint32_t *minbuyinp,uint32_t *maxbuyinp); int32_t pangea_sidepots(int32_t dispflag,uint64_t sidepots[CARDS777_MAXPLAYERS][CARDS777_MAXPLAYERS],struct cards777_pubdata *dp,int64_t *bets); int64_t pangea_splitpot(int64_t *won,uint64_t *pangearakep,uint64_t sidepot[CARDS777_MAXPLAYERS],union pangeanet777 *hn,int32_t rakemillis); int32_t pangea_actives(int32_t *activej,struct cards777_pubdata *dp); int32_t pangea_bet(union pangeanet777 *hn,struct cards777_pubdata *dp,int32_t player,int64_t bet,int32_t action); uint64_t pangea_winnings(int32_t player,uint64_t *pangearakep,uint64_t *hostrakep,uint64_t total,int32_t numwinners,int32_t rakemillis,uint64_t maxrake); int32_t _pangea_addfunds(union pangeanet777 *hn,cJSON *json,struct cards777_pubdata *dp,struct cards777_privdata *priv,uint8_t *data,int32_t datalen,int32_t senderind); void _pangea_chat(uint64_t senderbits,void *buf,int32_t len,int32_t senderind); void pangea_sendcmd(char *hex,union pangeanet777 *hn,char *cmdstr,int32_t destplayer,uint8_t *data,int32_t datalen,int32_t cardi,int32_t turni); int32_t pangea_slotA(struct pangea_info *sp); int32_t pangea_slotB(struct pangea_info *sp); int32_t pangea_slot(struct pangea_info *sp,int32_t ind); int32_t pangea_ind(struct pangea_info *sp,int32_t slot); int32_t pangea_slot(struct pangea_info *sp,int32_t ind); int32_t pangea_poll(uint64_t *senderbitsp,uint32_t *timestampp,union pangeanet777 *hn); int32_t pangeanet777_register(struct pangeanet777_server *srv,bits256 clientpub,int32_t slot); struct pangeanet777_client *pangeanet777_client(bits256 privkey,bits256 pubkey,char *srvendpoint,int32_t slot); struct pangeanet777_server *pangeanet777_server(bits256 srvprivkey,bits256 srvpubkey,char *transport,char *ipaddr,uint16_t port,int32_t maxclients); int32_t pangeanet777_idle(union pangeanet777 *hn); void pangeanet777_msg(uint64_t destbits,bits256 destpub,union pangeanet777 *src,int32_t blindflag,char *jsonstr,int32_t len); struct pangea_info *pangea_threadtables(int32_t *nump,int32_t threadid,uint64_t tableid); extern int32_t Debuglevel,PANGEA_MAXTHREADS,Showmode,Autofold; bits256 issue_getpubkey(int32_t *haspubkeyp,char *acct); #endif