diff --git a/iguana/exchanges/LP_commands.c b/iguana/exchanges/LP_commands.c index af6960311..216a902d8 100644 --- a/iguana/exchanges/LP_commands.c +++ b/iguana/exchanges/LP_commands.c @@ -472,6 +472,18 @@ stop()\n\ return(LP_peers()); else if ( strcmp(method,"getcoins") == 0 ) return(jprint(LP_coinsjson(0),1)); + else if ( strcmp(method,"wantnotify") == 0 ) + { + bits256 pub; + pub = jbits256(argjson,"pub"); + //char str[65]; printf("got wantnotify.(%s) vs %s\n",jprint(argjson,0),bits256_str(str,G.LP_mypub25519)); + if ( bits256_cmp(pub,G.LP_mypub25519) == 0 ) + { + printf("wantnotify for me!\n"); + LP_notify_pubkeys(ctx,LP_mypubsock); + } + retstr = clonestr("{\"result\":\"success\"}"); + } else if ( strcmp(method,"listunspent") == 0 ) { if ( (ptr= LP_coinsearch(jstr(argjson,"coin"))) != 0 ) @@ -526,7 +538,7 @@ stop()\n\ // retstr = clonestr("{\"result\":\"coin is disabled\"}"); else if ( strcmp(method,"encrypted") == 0 ) retstr = clonestr("{\"result\":\"success\"}"); - else // special handling requests + else // psock requests/response { if ( IAMLP != 0 ) { diff --git a/iguana/exchanges/LP_nativeDEX.c b/iguana/exchanges/LP_nativeDEX.c index 19f42f918..7bb32a06a 100644 --- a/iguana/exchanges/LP_nativeDEX.c +++ b/iguana/exchanges/LP_nativeDEX.c @@ -18,12 +18,10 @@ // LP_nativeDEX.c // marketmaker // -// sign critical api calls (pubkey reg, listunspent, orders?) - // process stats.log local file -> map of realtime activity! // handles <-> pubkeys, deal with offline pubkeys, reputations, bonds etc. // -// verify portfolio, pricearray, interest to KMD withdraw +// verify portfolio, pricearray, interest to KMD withdraw, reliable networking // dPoW security -> 4: KMD notarized, 5: BTC notarized, after next notary elections diff --git a/iguana/exchanges/LP_prices.c b/iguana/exchanges/LP_prices.c index 2fd10dd8b..7fb1cac2c 100644 --- a/iguana/exchanges/LP_prices.c +++ b/iguana/exchanges/LP_prices.c @@ -670,6 +670,24 @@ struct LP_orderbookentry *LP_orderbookentry(char *address,char *base,char *rel,d return(op); } +void LP_pubkeys_query() +{ + uint8_t zeroes[20]; bits256 zero; cJSON *reqjson; struct LP_pubkeyinfo *pubp=0,*tmp; + memset(zero.bytes,0,sizeof(zero)); + memset(zeroes,0,sizeof(zeroes)); + HASH_ITER(hh,LP_pubkeyinfos,pubp,tmp) + { + if ( memcmp(zeroes,pubp->rmd160,sizeof(pubp->rmd160)) == 0 ) + { + reqjson = cJSON_CreateObject(); + jaddstr(reqjson,"method","wantnotify"); + jaddbits256(reqjson,"pub",pubp->pubkey); + //printf("%s\n",jprint(reqjson,0)); + LP_reserved_msg("","",zero,jprint(reqjson,1)); + } + } +} + int32_t LP_orderbook_utxoentries(uint32_t now,int32_t polarity,char *base,char *rel,struct LP_orderbookentry *(**arrayp),int32_t num,int32_t cachednum,int32_t duration) { char coinaddr[64]; uint8_t zeroes[20]; struct LP_pubkeyinfo *pubp=0,*tmp; struct LP_priceinfo *basepp; struct LP_orderbookentry *op; struct LP_address *ap; struct iguana_info *basecoin; uint32_t oldest; double price; int32_t baseid,relid,n; uint64_t minsatoshis,maxsatoshis; @@ -731,6 +749,7 @@ char *LP_orderbook(char *base,char *rel,int32_t duration) suppress_prefetch = 1; duration = LP_ORDERBOOK_DURATION; } + LP_pubkeys_query(); baseid = basepp->ind; relid = relpp->ind; now = (uint32_t)time(NULL); diff --git a/iguana/exchanges/LP_signatures.c b/iguana/exchanges/LP_signatures.c index 88476c59f..9626aba6b 100644 --- a/iguana/exchanges/LP_signatures.c +++ b/iguana/exchanges/LP_signatures.c @@ -181,64 +181,6 @@ char *LP_quotereceived(cJSON *argjson) } else return(clonestr("{\"error\":\"nullptr\"}")); } -void LP_smartutxos_push(struct iguana_info *coin) -{ - struct LP_peerinfo *peer,*tmp; uint64_t value; bits256 zero,txid; int32_t i,vout,height,n; char *retstr; cJSON *array,*item,*req; - if ( coin->smartaddr[0] == 0 ) - return; - if ( (array= LP_address_utxos(coin,coin->smartaddr,1)) != 0 ) - { - memset(zero.bytes,0,sizeof(zero)); - if ( (n= cJSON_GetArraySize(array)) > 0 ) - { - //printf("PUSH %s %s\n",coin->symbol,coin->smartaddr); - for (i=0; iipaddr,peer->port,coin->symbol,coin->smartaddr,txid,vout,height,value)) != 0 ) - free(retstr); - } - } - req = cJSON_CreateObject(); - jaddstr(req,"method","uitem"); - jaddstr(req,"coin",coin->symbol); - jaddstr(req,"coinaddr",coin->smartaddr); - jaddbits256(req,"txid",txid); - jaddnum(req,"vout",vout); - jaddnum(req,"ht",height); - jadd64bits(req,"value",value); - //printf("ADDR_UNSPENTS[] <- %s\n",jprint(req,0)); - LP_reserved_msg("","",zero,jprint(req,1)); - } - } - free_json(array); - } -} - -char *LP_uitem_recv(cJSON *argjson) -{ - bits256 txid; int32_t vout,height; uint64_t value; char *coinaddr,*symbol; - txid = jbits256(argjson,"txid"); - vout = jint(argjson,"vout"); - height = jint(argjson,"ht"); - value = j64bits(argjson,"value"); - coinaddr = jstr(argjson,"coinaddr"); - if ( (symbol= jstr(argjson,"coin")) != 0 && coinaddr != 0 ) - { - //char str[65]; printf("uitem %s %s %s/v%d %.8f ht.%d\n",coin,coinaddr,bits256_str(str,txid),vout,dstr(value),height); - LP_address_utxoadd(LP_coinfind(symbol),coinaddr,txid,vout,value,height,-1); - } - return(clonestr("{\"result\":\"success\"}")); -} - void LP_postutxos(char *symbol,char *coinaddr) { bits256 zero; struct iguana_info *coin; cJSON *array,*reqjson = cJSON_CreateObject(); @@ -457,6 +399,65 @@ char *LP_notify_recv(cJSON *argjson) return(clonestr("{\"result\":\"success\",\"notify\":\"received\"}")); } +void LP_smartutxos_push(struct iguana_info *coin) +{ + struct LP_peerinfo *peer,*tmp; uint64_t value; bits256 zero,txid; int32_t i,vout,height,n; char *retstr; cJSON *array,*item,*req; + if ( coin->smartaddr[0] == 0 ) + return; + LP_notify_pubkeys(coin->ctx,LP_mypubsock); + if ( (array= LP_address_utxos(coin,coin->smartaddr,1)) != 0 ) + { + memset(zero.bytes,0,sizeof(zero)); + if ( (n= cJSON_GetArraySize(array)) > 0 ) + { + //printf("PUSH %s %s\n",coin->symbol,coin->smartaddr); + for (i=0; iipaddr,peer->port,coin->symbol,coin->smartaddr,txid,vout,height,value)) != 0 ) + free(retstr); + } + } + req = cJSON_CreateObject(); + jaddstr(req,"method","uitem"); + jaddstr(req,"coin",coin->symbol); + jaddstr(req,"coinaddr",coin->smartaddr); + jaddbits256(req,"txid",txid); + jaddnum(req,"vout",vout); + jaddnum(req,"ht",height); + jadd64bits(req,"value",value); + //printf("ADDR_UNSPENTS[] <- %s\n",jprint(req,0)); + LP_reserved_msg("","",zero,jprint(req,1)); + } + } + free_json(array); + } +} + +char *LP_uitem_recv(cJSON *argjson) +{ + bits256 txid; int32_t vout,height; uint64_t value; char *coinaddr,*symbol; + txid = jbits256(argjson,"txid"); + vout = jint(argjson,"vout"); + height = jint(argjson,"ht"); + value = j64bits(argjson,"value"); + coinaddr = jstr(argjson,"coinaddr"); + if ( (symbol= jstr(argjson,"coin")) != 0 && coinaddr != 0 ) + { + //char str[65]; printf("uitem %s %s %s/v%d %.8f ht.%d\n",coin,coinaddr,bits256_str(str,txid),vout,dstr(value),height); + LP_address_utxoadd(LP_coinfind(symbol),coinaddr,txid,vout,value,height,-1); + } + return(clonestr("{\"result\":\"success\"}")); +} + void LP_listunspent_query(char *symbol,char *coinaddr) { bits256 zero; cJSON *reqjson = cJSON_CreateObject();