Browse Source

Merge remote-tracking branch 'jl777/master'

dev
Satinder Grewal 9 years ago
parent
commit
f5335c55c6
  1. 3
      crypto777/Makefile
  2. 2
      crypto777/cJSON.c
  3. 19
      crypto777/tools/common.mk
  4. 227
      deprecated/obsolete.h
  5. 7
      iguana/Makefile
  6. 34
      iguana/SuperNET.c
  7. 5
      iguana/SuperNET.h
  8. 52
      iguana/app/startup.js
  9. 45
      iguana/example.js
  10. 866
      iguana/exchanges/bitcoin.c
  11. 24
      iguana/exchanges/bitcoin.h
  12. 182
      iguana/exchanges/nxtae.c
  13. 37
      iguana/exchanges777.h
  14. 8
      iguana/help/header.html
  15. 1
      iguana/help/header.md
  16. 19
      iguana/iguana777.h
  17. 12
      iguana/iguana_chains.c
  18. 26
      iguana/iguana_exchanges.c
  19. 353
      iguana/iguana_instantdex.c
  20. 31
      iguana/iguana_json.c
  21. 2
      iguana/iguana_msg.c
  22. 2
      iguana/iguana_peers.c
  23. 5
      iguana/iguana_pubkeys.c
  24. 4
      iguana/iguana_recv.c
  25. 5
      iguana/iguana_rpc.c
  26. 2
      iguana/iguana_tx.c
  27. 69
      iguana/index.html
  28. 11
      iguana/js/api.js
  29. 6
      iguana/js/common.js
  30. 115
      iguana/js/instantdex.js
  31. 2
      iguana/js/widget.js
  32. 6
      iguana/main.c
  33. BIN
      iguana/pnacl/Release/iguana.pexe
  34. 19
      iguana/tools/common.mk
  35. 141
      iguana/ugly.html
  36. 2
      iguana/widget-demo.html
  37. 19
      includes/iguana_apideclares.h
  38. 4
      includes/iguana_apidefs.h
  39. 2
      includes/iguana_apiundefs.h
  40. 10
      pnacl_main.h
  41. 19
      tools/common.mk

3
crypto777/Makefile

@ -13,7 +13,8 @@ TARGET = crypto777
EXTRA= -D__PNACL -O2
include $(NACL_SDK_ROOT)/tools/common.mk
#include $(NACL_SDK_ROOT)/tools/common.mk
include tools/common.mk
CHROME_ARGS += --allow-nacl-socket-api=127.0.0.1
DEPS = nacl_io

2
crypto777/cJSON.c

@ -1075,6 +1075,8 @@ uint64_t calc_nxt64bits(const char *NXTaddr)
printf("calc_nxt64bits: warning: 64bit overflow %llx < %llx\n",(long long)nxt64bits,(long long)lastval);
lastval = nxt64bits;
}
while ( *NXTaddr == '0' && *NXTaddr != 0 )
NXTaddr++;
if ( cmp_nxt64bits(NXTaddr,nxt64bits) != 0 )
printf("error calculating nxt64bits: %s -> %llx -> %s\n",NXTaddr,(long long)nxt64bits,nxt64str(nxt64bits));
if ( polarity < 0 )

19
crypto777/tools/common.mk

@ -32,9 +32,12 @@ TOP_MAKE := $(word 1,$(MAKEFILE_LIST))
#
# Figure out which OS we are running on.
#
GETOS := python $(NACL_SDK_ROOT)/tools/getos.py
NACL_CONFIG := python $(NACL_SDK_ROOT)/tools/nacl_config.py
FIXDEPS := python $(NACL_SDK_ROOT)/tools/fix_deps.py -c
#GETOS := python $(NACL_SDK_ROOT)/tools/getos.py
#NACL_CONFIG := python $(NACL_SDK_ROOT)/tools/nacl_config.py
#FIXDEPS := python $(NACL_SDK_ROOT)/tools/fix_deps.py -c
GETOS := python tools/getos.py
NACL_CONFIG := python tools/nacl_config.py
FIXDEPS := python tools/fix_deps.py -c
OSNAME := $(shell $(GETOS))
@ -203,7 +206,7 @@ endif
#
# Compute path to requested NaCl Toolchain
#
TC_PATH := $(abspath $(NACL_SDK_ROOT)/../toolchain)
TC_PATH := $(abspath $(NACL_SDK_ROOT)/toolchain)
#
@ -260,8 +263,6 @@ clean:
$(RM) -f $(TARGET).nmf
$(RM) -rf $(OUTDIR)
$(RM) -rf user-data-dir
mkdir pnacl; mkdir pnacl/Release
cp Release/* nacl_io.stamp pnacl/Release;
#
@ -294,7 +295,6 @@ ifeq (,$(2))
else
+$(MAKE) -C $(2) STAMPDIR=$(abspath $(STAMPDIR)) $(abspath $(STAMPDIR)/$(1).stamp) $(3)
endif
cp pnacl/Release/*.pexe pnacl/Release/*.bc pnacl/Release/SuperNET_API.nmf Release
all: rebuild_$(1)
$(STAMPDIR)/$(1).stamp: rebuild_$(1)
@ -443,8 +443,7 @@ endif
# Variables for running examples with Chrome.
#
RUN_PY := python $(NACL_SDK_ROOT)/tools/run.py
#HTTPD_PY := python $(NACL_SDK_ROOT)/tools/httpd.py
HTTPD_PY := python tools/httpd.py
HTTPD_PY := python $(NACL_SDK_ROOT)/tools/httpd.py
# Add this to launch Chrome with additional environment variables defined.
# Each element should be specified as KEY=VALUE, with whitespace separating
@ -532,7 +531,7 @@ debug: check_for_chrome all $(PAGE)
.PHONY: serve
serve: all
echo run tools/httpd.py
$(HTTPD_PY) -C $(CURDIR)
endif
# uppercase aliases (for backward compatibility)

227
deprecated/obsolete.h

@ -13092,4 +13092,231 @@ len = 0;
return(clonestr("{\"error\":\"need pubkey\"}"));
}*/
int32_t bitcoin_outputscript(struct iguana_info *coin,char *pubkeys[],int32_t *scriptlenp,uint8_t *scriptspace,bits256 txid,int32_t vout)
{
struct iguana_txid T,*tx; int32_t height,numpubs = 1; char asmstr[8192]; struct iguana_msgvout v;
if ( 0 )
{
*scriptlenp = 0;
if ( (tx= iguana_txidfind(coin,&height,&T,txid)) != 0 )
{
*scriptlenp = iguana_voutset(coin,scriptspace,asmstr,height,&v,tx,vout);
return(numpubs);
}
}
//char *str = "2103506a52e95cdfbb9d17d702af6259ba7de8b7a604007999e0266edbf6e4bb6974ac";
char *str = "76a914010966776006953d5567439e5e39f86a0d273bee88ac";
*scriptlenp = (int32_t)strlen(str) >> 1;
decode_hex(scriptspace,*scriptlenp,str);
//pubkeys[0] = clonestr("03506a52e95cdfbb9d17d702af6259ba7de8b7a604007999e0266edbf6e4bb6974");
pubkeys[0] = clonestr("0450863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b23522cd470243453a299fa9e77237716103abc11a1df38855ed6f2ee187e9c582ba6");
return(numpubs);
}
cJSON *bitcoin_txjson(struct iguana_info *coin,struct iguana_msgtx *msgtx,struct vin_info *V)
{
char vpnstr[2]; int32_t n; uint8_t *serialized; bits256 txid; cJSON *json = cJSON_CreateObject();
vpnstr[0] = 0;
serialized = malloc(IGUANA_MAXPACKETSIZE);
if ( (n= iguana_rwmsgtx(coin,1,json,serialized,IGUANA_MAXPACKETSIZE,msgtx,&txid,vpnstr,V)) < 0 )
{
printf("bitcoin_txtest: n.%d\n",n);
}
free(serialized);
return(json);
}
/*{
for (i=0; i<T->numinputs; i++)
strcpy(T->inputs[i].sigs,"00");
strcpy(vin->sigs,redeemscript);
vin->sequence = (uint32_t)-1;
T->nlocktime = 0;
//disp_cointx(&T);
emit_cointx(&hash2,data,sizeof(data),T,oldtx_format,SIGHASH_ALL);
//printf("HASH2.(%llx)\n",(long long)hash2.txid);
if ( bp_sign(&key,hash2.bytes,sizeof(hash2),&sig,&siglen) != 0 )
{
memcpy(sigbuf,sig,siglen);
sigbuf[siglen++] = SIGHASH_ALL;
init_hexbytes_noT(sigs[privkeyind],sigbuf,(int32_t)siglen);
strcpy(vin->sigs,"00");
for (i=0; i<n; i++)
{
if ( sigs[i][0] != 0 )
{
sprintf(vin->sigs + strlen(vin->sigs),"%02x%s",(int32_t)strlen(sigs[i])>>1,sigs[i]);
//printf("(%s).%ld ",sigs[i],strlen(sigs[i]));
}
}
len = (int32_t)(strlen(redeemscript)/2);
if ( len >= 0xfd )
sprintf(&vin->sigs[strlen(vin->sigs)],"4d%02x%02x",len & 0xff,(len >> 8) & 0xff);
else sprintf(&vin->sigs[strlen(vin->sigs)],"4c%02x",len);
sprintf(&vin->sigs[strlen(vin->sigs)],"%s",redeemscript);
//printf("after A.(%s) othersig.(%s) siglen.%02lx -> (%s)\n",hexstr,othersig != 0 ? othersig : "",siglen,vin->sigs);
//printf("vinsigs.(%s) %ld\n",vin->sigs,strlen(vin->sigs));
_emit_cointx(hexstr,sizeof(hexstr),T,oldtx_format);
//disp_cointx(&T);
free(T);
return(clonestr(hexstr));
}
else printf("error signing\n");
free(T);
}*/
/*cJSON *iguana_txjson(struct iguana_info *coin,struct iguana_txid *tx,int32_t height,struct vin_info *V)
{
struct iguana_msgvin vin; struct iguana_msgvout vout; int32_t i; char asmstr[512],str[65]; uint8_t space[8192];
cJSON *vouts,*vins,*json;
json = cJSON_CreateObject();
jaddstr(json,"txid",bits256_str(str,tx->txid));
if ( height >= 0 )
jaddnum(json,"height",height);
jaddnum(json,"version",tx->version);
jaddnum(json,"timestamp",tx->timestamp);
jaddnum(json,"locktime",tx->locktime);
vins = cJSON_CreateArray();
vouts = cJSON_CreateArray();
for (i=0; i<tx->numvouts; i++)
{
iguana_voutset(coin,space,asmstr,height,&vout,tx,i);
jaddi(vouts,iguana_voutjson(coin,&vout,i,tx->txid));
}
jadd(json,"vout",vouts);
for (i=0; i<tx->numvins; i++)
{
iguana_vinset(coin,height,&vin,tx,i);
jaddi(vins,iguana_vinjson(coin,&vin,V != 0 ? &V[i] : 0));
}
jadd(json,"vin",vins);
return(json);
}*/
/*
if ( strcmp(cmdstr+3,"offer") == 0 )
{
}
if ( (price= instantdex_acceptable(myinfo,0,refstr,base,rel,volume)) > 0. )
{
// sends NXT assetid, volume and desired
if ( strcmp(base,"NXT") == 0 || strcmp(base,"nxt") == 0 )
assetbits = NXT_ASSETID;
else if ( is_decimalstr(base) > 0 )
assetbits = calc_nxt64bits(base);
if ( assetbits != 0 )
{
nextcmd = INSTANTDEX_REQUEST;
nextcmdstr = "request";
}
}
}
else if ( strncmp(cmdstr,"ALT",3) == 0 )
{
if ( (price= instantdex_acceptable(myinfo,0,refstr,base,rel,volume)) > 0. )
{
// sends NXT assetid, volume and desired
if ( strcmp(base,"NXT") == 0 || strcmp(base,"nxt") == 0 )
assetbits = NXT_ASSETID;
else if ( is_decimalstr(base) > 0 )
assetbits = calc_nxt64bits(base);
if ( assetbits != 0 )
{
nextcmd = INSTANTDEX_REQUEST;
nextcmdstr = "request";
}
}
}
else if ( strncmp(cmdstr,"NXT",3) == 0 )
{
if ( (price= instantdex_acceptable(myinfo,0,refstr,base,rel,volume)) > 0. )
{
// sends NXT assetid, volume and desired
if ( strcmp(base,"NXT") == 0 || strcmp(base,"nxt") == 0 )
assetbits = NXT_ASSETID;
else if ( is_decimalstr(base) > 0 )
assetbits = calc_nxt64bits(base);
if ( assetbits != 0 )
{
nextcmd = INSTANTDEX_REQUEST;
nextcmdstr = "request";
}
}
}
{
}
if ( strcmp(cmdstr,"request") == 0 )
{
// request:
// other node sends (othercoin, othercoinaddr, otherNXT and reftx that expires before phasedtx)
if ( (strcmp(rel,"BTC") == 0 || strcmp(base,"BTC") == 0) && (price= instantdex_acceptable(myinfo,0,refstr,base,rel,volume)) > 0. )
{
//aveprice = instantdex_aveprice(myinfo,sortbuf,(int32_t)(sizeof(sortbuf)/sizeof(*sortbuf)),&totalvol,base,rel,volume,argjson);
set_NXTtx(myinfo,&feeT,assetbits,SATOSHIDEN*3,calc_nxt64bits(INSTANTDEX_ACCT),-1);
if ( (feejson= gen_NXT_tx_json(myinfo,fullhash,&feeT,0,1.)) != 0 )
free_json(feejson);
nextcmd = INSTANTDEX_PROPOSE;
nextcmdstr = "proposal";
othercoinaddr = myinfo->myaddr.BTC;
otherNXTaddr = myinfo->myaddr.NXTADDR;
}
}
else
{
if ( strcmp(cmdstr,"proposal") == 0 )
{
// proposal:
// NXT node submits phasedtx that refers to it, but it wont confirm
nextcmd = INSTANTDEX_ACCEPT;
nextcmdstr = "accept";
message = "";
//instantdex_phasetxsubmit(refstr);
}
else if ( strcmp(cmdstr,"accept") == 0 )
{
// accept:
// other node verifies unconfirmed has phasedtx and broadcasts cltv, also to NXT node, releases trigger
nextcmd = INSTANTDEX_CONFIRM;
nextcmdstr = "confirm";
message = "";
//instantdex_phasedtxverify();
//instantdex_cltvbroadcast();
//instantdex_releasetrigger();
}
else if ( strcmp(cmdstr,"confirm") == 0 )
{
// confirm:
// NXT node verifies bitcoin txbytes has proper payment and cashes in with onetimepubkey
// BTC* node approves phased tx with onetimepubkey
//instantdex_cltvverify();
//instantdex_phasetxapprove();
return(clonestr("{\"error\":\"trade confirmed\"}"));
}
}
if ( nextcmd != 0 && (newjson= InstantDEX_argjson(refstr,message,othercoinaddr,otherNXTaddr,nextcmd,duration,flags)) != 0 )
{
jaddnum(newjson,"price",price);
jaddnum(newjson,"volume",volume);
return(instantdex_sendcmd(myinfo,newjson,nextcmdstr,myinfo->ipaddr,INSTANTDEX_HOPS));
}
}
return(clonestr("{\"error\":\"request needs argjson\"}"));
}
num = 0;
depth = 30;
request = jstr(argjson,"request");
base = jstr(argjson,"base");
rel = jstr(argjson,"rel");
refstr = jstr(argjson,"refstr");
volume = jdouble(argjson,"volume");
duration = juint(argjson,"duration");
flags = juint(argjson,"flags");
nextcmd = 0;
nextcmdstr = message = "";
*/
#endif

7
iguana/Makefile

@ -13,7 +13,8 @@ TARGET = iguana
EXTRA= -D__PNACL -DNN_DISABLE_GETADDRINFO_A=1 -DNN_USE_LITERAL_IFADDR=1 -DNN_HAVE_STDINT=1 -DNN_HAVE_MSG_CONTROL=0 -DNN_HAVE_SEMAPHORE=1 -DNN_HAVE_POLL=1 -DNN_HAVE_SOCKETPAIR=1 -DNN_USE_POLL=1
include $(NACL_SDK_ROOT)/tools/common.mk
#include $(NACL_SDK_ROOT)/tools/common.mk
include tools/common.mk
include iguana.sources
include ../crypto777/crypto777.sources
@ -21,7 +22,9 @@ CHROME_ARGS += --allow-nacl-socket-api=127.0.0.1
DEPS = nacl_io
#LIBS = curl ssl crypto z glibc-compat nacl_spawn ppapi nacl_io ppapi_cpp ppapi_simple # cli_main
LIBS = crypto777 curl ssl crypto z pthread ppapi nacl_io
#LIBS = crypto777 curl ssl crypto z pthread ppapi nacl_io
#DEPS = nacl_io
LIBS = crypto777 curl ssl crypto z glibc-compat nacl_spawn ppapi nacl_io ppapi_simple # cli_main ppapi_cpp ppapi_simple
CFLAGS = -Wall -O2 -fno-strict-aliasing $(EXTRA)
LFLAGS = libs

34
iguana/SuperNET.c

@ -91,7 +91,7 @@ int32_t SuperNET_confirmip(struct supernet_info *myinfo,uint32_t ipbits)
return(total);
}
void SuperNET_myipaddr(struct supernet_info *myinfo,struct iguana_info *coin,struct iguana_peer *addr,char *myipaddr,char *remoteaddr)
void SuperNET_checkipaddr(struct supernet_info *myinfo,struct iguana_info *coin,struct iguana_peer *addr,char *myipaddr,char *remoteaddr)
{
uint32_t myipbits = (uint32_t)calc_ipbits(myipaddr);
if ( addr->myipbits == 0 )
@ -773,7 +773,7 @@ char *SuperNET_p2p(struct iguana_info *coin,struct iguana_peer *addr,int32_t *de
if ( 0 && jstr(json,"method") != 0 && strcmp(jstr(json,"method"),"getpeers") != 0 )
printf("GOT >>>>>>>> SUPERNET P2P.(%s) from.%s %s valid.%d:%d\n",jprint(json,0),coin->symbol,addr->ipaddr,addr->validpub,addr->othervalid);
if ( (myipaddr= jstr(json,"yourip")) != 0 )
SuperNET_myipaddr(SuperNET_MYINFO(0),coin,addr,myipaddr,ipaddr);
SuperNET_checkipaddr(SuperNET_MYINFO(0),coin,addr,myipaddr,ipaddr);
jaddstr(json,"fromp2p",coin->symbol);
method = jstr(json,"method");
if ( method != 0 && strcmp(method,"stop") == 0 )
@ -919,14 +919,18 @@ cJSON *SuperNET_rosettajson(bits256 privkey,int32_t showprivs)
#include "../includes/iguana_apidefs.h"
HASH_ARG(SuperNET,priv2pub,privkey)
HASH_AND_INT(SuperNET,priv2pub,privkey,addrtype)
{
cJSON *retjson; bits256 pubkey;
cJSON *retjson; bits256 pub; uint8_t pubkey[33]; char coinaddr[64];
if ( remoteaddr != 0 )
return(clonestr("{\"error\":\"no remote\"}"));
retjson = cJSON_CreateObject();
crypto_box_priv2pub(pubkey.bytes,privkey.bytes);
jaddbits256(retjson,"result",pubkey);
crypto_box_priv2pub(pub.bytes,privkey.bytes);
jaddbits256(retjson,"curve25519",pub);
pub = bitcoin_pubkey33(pubkey,privkey);
jaddbits256(retjson,"secp256k1",pub);
bitcoin_address(coinaddr,addrtype,pubkey,33);
jaddstr(retjson,"result",coinaddr);
return(jprint(retjson,1));
}
@ -1241,6 +1245,24 @@ STRING_ARG(SuperNET,wif2priv,wif)
return(jprint(retjson,1));
}
ZERO_ARGS(SuperNET,myipaddr)
{
cJSON *retjson = cJSON_CreateObject();
jaddstr(retjson,"result",myinfo->ipaddr);
return(jprint(retjson,1));
}
STRING_ARG(SuperNET,setmyipaddr,ipaddr)
{
cJSON *retjson = cJSON_CreateObject();
if ( is_ipaddr(ipaddr) != 0 )
{
strcpy(myinfo->ipaddr,ipaddr);
jaddstr(retjson,"result",myinfo->ipaddr);
} else jaddstr(retjson,"error","illegal ipaddr");
return(jprint(retjson,1));
}
STRING_ARG(SuperNET,utime2utc,utime)
{
uint32_t utc = 0; cJSON *retjson = cJSON_CreateObject();

5
iguana/SuperNET.h

@ -84,7 +84,8 @@ struct supernet_info
int32_t LBsock,PUBsock,reqsock,subsock,networktimeout,maxdelay;
uint16_t LBport,PUBport,reqport,subport;
struct nn_pollfd pfd[SUPERNET_MAXAGENTS]; //struct relay_info active;
struct supernet_agent agents[SUPERNET_MAXAGENTS]; queue_t acceptQ; int32_t numagents,numexchanges;
struct supernet_agent agents[SUPERNET_MAXAGENTS]; queue_t acceptQ;
int32_t numagents,numexchanges;
struct exchange_info *tradingexchanges[SUPERNET_MAXEXCHANGES];
char handle[1024];
};
@ -165,6 +166,8 @@ char *SuperNET_keysinit(struct supernet_info *myinfo,char *jsonstr);
double instantdex_aveprice(struct supernet_info *myinfo,struct exchange_quote *sortbuf,int32_t max,double *totalvolp,char *base,char *rel,double volume,cJSON *argjson);
void SuperNET_setkeys(struct supernet_info *myinfo,void *pass,int32_t passlen,int32_t dosha256);
char *InstantDEX_hexmsg(struct supernet_info *myinfo,void *data,int32_t len,char *remoteaddr);
bits256 bitcoin_pubkey33(uint8_t data[33],bits256 privkey);
char *bitcoin_address(char *coinaddr,uint8_t addrtype,uint8_t *pubkey,int32_t len);
#endif

52
iguana/app/startup.js

@ -94,7 +94,57 @@ $(function () {
else if(e.className && e.className.indexOf('clear-response-coin') != -1){
$(".coin_result").text("JSON response");
}
///clear-response-coin
else if(e.className && e.className.indexOf('instantdex_set_userid') != -1){
InstantDEX_setuserid();
}
else if(e.className && e.className.indexOf('Tradebot_set_method_table') != -1){
tradebot_set_method_table(e.getAttribute("data-method"));
}
else if(e.className && e.className.indexOf('Tradebot_monitorall') != -1){
Tradebot_monitorall_api();
}
else if(e.className && e.className.indexOf('Tradebot_monitor') != -1){
Tradebot_monitor_api();
}
else if(e.className && e.className.indexOf('Tradebot_unmonitor_api') != -1){
Tradebot_unmonitor_api();
}
else if(e.className && e.className.indexOf('Tradebot_accumulate') != -1){
Tradebot_accumulate_api();
}
else if(e.className && e.className.indexOf('Tradebot_divest') != -1){
Tradebot_divest_api();
}
else if(e.className && e.className.indexOf('Tradebot_activebots') != -1){
Tradebot_activebots_api();
}
else if(e.className && e.className.indexOf('Tradebot_status') != -1){
Tradebot_status_api();
}
else if(e.className && e.className.indexOf('Tradebot_pause') != -1){
Tradebot_pause_api();
}
else if(e.className && e.className.indexOf('Tradebot_stop') != -1){
Tradebot_stop_api();
}
else if(e.className && e.className.indexOf('Tradebot_resume') != -1){
Tradebot_resume_api();
}
else if(e.className && e.className.indexOf('instantdex_allpairs') != -1){
InstantDEX_allpairs();
}
//
};
$("div .btn-primary").on("click",function(){
$("div .btn-primary").each(function(){
$(this).removeClass('btn-raised');
});
$(this).addClass("btn-raised");
});
});

45
iguana/example.js

@ -244,6 +244,7 @@ function ArrayBufferToString(buf) { return String.fromCharCode.apply(null, new U
function handleMessage(message_event) {
var data = message_event.data;
if ((typeof(data) === 'string' || data instanceof String)) {
check_if_pexe_7778_working(data);
common.logMessage(data);
}
else if (data instanceof Object)
@ -279,3 +280,47 @@ function handleMessage(message_event) {
common.logMessage('Error: Unknow message `' + data + '` received from NaCl module.');
}
}
var APPLICATION={pexe:"not loaded",port7778:"Not binded"};
var check_if_pexe_7778_working=function(string){
var if_changed=0;
if(string.indexOf("iguana_rpcloop")>-1 && string.indexOf("bind sock")>-1 ){
APPLICATION.port7778="successfully binded";
if_changed=1;
}else if(string.indexOf("finished DidCreate iguana")>-1){
APPLICATION.pexe="Loaded";
if_changed=1;
}else if(string.indexOf("ERROR BINDING PORT.7778")>-1){
//APPLICATION.state="Loading..";
APPLICATION.port7778="Retrying";
/*if(APPLICATION.pexe.indexOf("not loaded")>-1 || APPLICATION.pexe.indexOf("crashed")>-1){
APPLICATION.state="not working";
}*/
if_changed=1;
}else if(string.indexOf("NaCl module crashed")>-1){
APPLICATION.pexe="crashed";
if_changed=1;
}else if(string.indexOf("try again: Address already in use")>-1){
APPLICATION.port7778="bind failed";
if_changed=1;
}
if(if_changed){change_app_status();}
//finished DidCreate iguana
// ERROR BINDING PORT.7778. will exit. wait up to a minute and try again. dont worry, this is normal
// NativeClient: NaCl module crashed
//string.indexOf(substring) > -1
//bind(127.0.0.1) port.7778 try again: Address already in use sock.4. errno.98
};
var change_app_status=function(){
var html="<tr><td>Parameter</td><td>Status</td></tr>";
//html=html+"<tr><td>Application state:</td><td>"+APPLICATION.state+"</td></tr>";
html=html+"<tr><td>Pexe state:</td><td>"+APPLICATION.pexe+"</td></tr>";
html=html+"<tr><td>Port 7778 state:</td><td>"+APPLICATION.port7778+"</td></tr>";
$("#appstatus").html(html);
};

866
iguana/exchanges/bitcoin.c

File diff suppressed because it is too large

24
iguana/exchanges/bitcoin.h

@ -13,6 +13,9 @@
* *
******************************************************************************/
#ifndef H_BITCOIN_H
#define H_BITCOIN_H
#include "../../includes/openssl/ec.h"
#include "../../includes/openssl/ecdsa.h"
#include "../../includes/openssl/obj_mac.h"
@ -22,6 +25,7 @@
#define SIGHASH_SINGLE 3
#define SIGHASH_ANYONECANPAY 0x80
#define SCRIPT_OP_NOP 0x00
#define SCRIPT_OP_TRUE 0x51
#define SCRIPT_OP_2 0x52
#define SCRIPT_OP_3 0x53
@ -40,3 +44,23 @@
#define OP_CHECKLOCKTIMEVERIFY 0xb1
struct bp_key { EC_KEY *k; };
int32_t bitcoin_validaddress(struct iguana_info *coin,char *coinaddr);
int32_t bitcoin_cltvscript(uint8_t p2shtype,char *ps2h_coinaddr,uint8_t p2sh_rmd160[20],uint8_t *script,int32_t n,char *senderaddr,char *otheraddr,uint8_t secret160[20],uint32_t locktime);
int32_t bitcoin_addr2rmd160(uint8_t *addrtypep,uint8_t rmd160[20],char *coinaddr);
char *bitcoin_cltvtx(struct iguana_info *coin,char *changeaddr,char *senderaddr,char *senders_otheraddr,char *otheraddr,uint32_t locktime,uint64_t satoshis,bits256 txid,int32_t vout,uint64_t inputsatoshis,bits256 privkey);
int32_t bitcoin_MofNspendscript(uint8_t p2sh_rmd160[20],uint8_t *script,int32_t n,const struct vin_info *vp);
cJSON *bitcoin_createtx(struct iguana_info *coin,int32_t locktime);
cJSON *bitcoin_addoutput(struct iguana_info *coin,cJSON *txobj,uint8_t *paymentscript,int32_t len,uint64_t satoshis);
int32_t bitcoin_changescript(struct iguana_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 iguana_info *coin,cJSON *txobj,bits256 txid,int32_t vout,uint32_t sequence);
int32_t bitcoin_verifytx(struct iguana_info *coin,bits256 *signedtxidp,char **signedtx,char *rawtxstr,struct vin_info *V);
char *bitcoin_json2hex(struct iguana_info *coin,bits256 *txidp,cJSON *txjson);
int32_t bitcoin_pubkeyspend(uint8_t *script,int32_t n,uint8_t pubkey[66]);
int32_t bitcoin_p2shspend(uint8_t *script,int32_t n,uint8_t rmd160[20]);
int32_t bitcoin_revealsecret160(uint8_t *script,int32_t n,uint8_t secret160[20]);
int32_t bitcoin_standardspend(uint8_t *script,int32_t n,uint8_t rmd160[20]);
#endif

182
iguana/exchanges/nxtae.c

@ -13,13 +13,13 @@
* *
******************************************************************************/
#define NXT_ASSETID ('N' + ((uint64_t)'X'<<8) + ((uint64_t)'T'<<16)) // 5527630
#define DEFAULT_NXT_DEADLINE 720
#define issue_NXTPOST(cmdstr) bitcoind_RPC(0,"curl",myinfo->NXTAPIURL,0,0,cmdstr)
#define NXT_MSTYPE 5
#define NXT_ASSETTYPE 2
#define NXT_GENESISTIME 1385294400
cJSON *_issue_NXTjson(struct supernet_info *myinfo,char *extra)
{
char cmd[4096],*jsonstr; cJSON *json = 0;
@ -101,6 +101,48 @@ uint32_t get_blockutime(struct supernet_info *myinfo,uint32_t blocknum)
return(timestamp);
}
uint32_t get_NXTheight(struct supernet_info *myinfo,uint32_t *firsttimep)
{
static uint32_t last,lastheight,lastNXTtime;
cJSON *json; uint32_t height = 0; char cmd[256],*jsonstr;
if ( time(NULL) > last+10 )
{
sprintf(cmd,"requestType=getState");
if ( (jsonstr= issue_NXTPOST(cmd)) != 0 )
{
//printf("(%s) -> (%s)\n",cmd,jsonstr);
if ( (json= cJSON_Parse(jsonstr)) != 0 )
{
if ( firsttimep != 0 )
lastNXTtime = *firsttimep = (uint32_t)get_cJSON_int(json,"time");
height = (int32_t)get_cJSON_int(json,"numberOfBlocks");
if ( height > 0 )
height--;
lastheight = height;
free_json(json);
}
free(jsonstr);
}
last = (uint32_t)time(NULL);
}
else
{
height = lastheight;
if ( firsttimep != 0 )
*firsttimep = lastNXTtime;
}
return(height);
}
char *issue_approveTransaction(struct supernet_info *myinfo,char *fullhash,char *revealed,bits256 msghash,char *NXTACCTSECRET)
{
char cmd[4096],secret[8192],str[65];
escape_code(secret,NXTACCTSECRET);
sprintf(cmd,"requestType=approveTransaction&secretPhrase=%s&transactionFullHash=%s&revealedSecret=%s&revealedSecretIsText=false&messageIsText=false&feeNQT=%d&deadline=%d&message=%s",secret,fullhash,revealed,0,DEFAULT_NXT_DEADLINE,bits256_str(str,msghash));
printf("submit approve.(%s)\n",cmd);
return(issue_NXTPOST(cmd));
}
char *MGWassets[][3] =
{
{ "12659653638116877017", "BTC", "8" },
@ -404,6 +446,101 @@ int32_t NXT_assetpolarity(struct supernet_info *myinfo,char *name)
else return(0);
}
uint64_t set_NXTtx(struct supernet_info *myinfo,struct NXT_tx *tx,uint64_t assetidbits,int64_t amount,uint64_t other64bits,int32_t feebits)
{
char assetidstr[64]; int32_t decimals; uint64_t fee = 0; struct NXT_tx U;
memset(&U,0,sizeof(U));
U.senderbits = myinfo->myaddr.nxt64bits;
U.recipientbits = other64bits;
U.assetidbits = assetidbits;
if ( feebits >= 0 )
{
fee = (amount >> feebits);
if ( fee == 0 )
fee = 1;
}
if ( assetidbits != NXT_ASSETID )
{
expand_nxt64bits(assetidstr,assetidbits);
U.type = get_assettype(myinfo,&decimals,assetidstr);
//U.subtype = ap->subtype;
U.U.quantityQNT = amount - fee;
} else U.U.amountNQT = amount - fee;
U.feeNQT = 0;
U.deadline = DEFAULT_NXT_DEADLINE;
printf("set_NXTtx(%llu -> %llu) %.8f of %llu\n",(long long)U.senderbits,(long long)U.recipientbits,dstr(amount),(long long)assetidbits);
*tx = U;
return(fee);
}
cJSON *gen_NXT_tx_json(struct supernet_info *myinfo,char *fullhash,struct NXT_tx *utx,char *reftxid,double myshare)
{
cJSON *json = 0; char secret[8192],cmd[MAX_JSON_FIELD],destNXTaddr[64],assetidstr[64],*retstr;
if ( utx->senderbits == myinfo->myaddr.nxt64bits )
{
expand_nxt64bits(destNXTaddr,utx->recipientbits);
cmd[0] = 0;
if ( utx->type == 0 && utx->subtype == 0 )
sprintf(cmd,"requestType=sendMoney&amountNQT=%lld",(long long)(utx->U.amountNQT*myshare));
else
{
expand_nxt64bits(assetidstr,utx->assetidbits);
if ( utx->type == 2 && utx->subtype == 1 )
sprintf(cmd,"requestType=transferAsset&asset=%s&quantityQNT=%lld",assetidstr,(long long)(utx->U.quantityQNT*myshare));
else if ( utx->type == 5 && utx->subtype == 3 )
sprintf(cmd,"requestType=transferCurrency&currency=%s&units=%lld",assetidstr,(long long)(utx->U.quantityQNT*myshare));
else
{
printf("unsupported type.%d subtype.%d\n",utx->type,utx->subtype);
return(0);
}
}
if ( utx->comment[0] != 0 )
strcat(cmd,"&messageIsText=true&message="),strcat(cmd,utx->comment);
if ( reftxid != 0 && reftxid[0] != 0 && cmd[0] != 0 )
strcat(cmd,"&referencedTransactionFullHash="),strcat(cmd,reftxid);
if ( cmd[0] != 0 )
{
escape_code(secret,myinfo->secret);
sprintf(cmd+strlen(cmd),"&deadline=%u&feeNQT=%lld&secretPhrase=%s&recipient=%s&broadcast=false",utx->deadline,(long long)utx->feeNQT,secret,destNXTaddr);
if ( reftxid != 0 && reftxid[0] != 0 )
sprintf(cmd+strlen(cmd),"&referencedTransactionFullHash=%s",reftxid);
//printf("generated cmd.(%s) reftxid.(%s)\n",cmd,reftxid);
retstr = issue_NXTPOST(cmd);
if ( retstr != 0 )
{
json = cJSON_Parse(retstr);
if ( (json= cJSON_Parse(retstr)) != 0 )
{
if ( jstr(json,"fullHash") != 0 )
strcpy(fullhash,jstr(json,"fullHash"));
// printf("Parsed.(%s)\n",cJSON_Print(json));
}
free(retstr);
}
}
} else printf("cant gen_NXT_txjson when sender.%llu is not me.%llu\n",(long long)utx->senderbits,(long long)myinfo->myaddr.nxt64bits);
return(json);
}
int32_t calc_raw_NXTtx(struct supernet_info *myinfo,char *fullhash,char *utxbytes,char *sighash,uint64_t assetidbits,int64_t amount,uint64_t other64bits)
{
int32_t retval = -1; struct NXT_tx U; cJSON *json;
utxbytes[0] = sighash[0] = 0;
set_NXTtx(myinfo,&U,assetidbits,amount,other64bits,0);
json = gen_NXT_tx_json(myinfo,fullhash,&U,0,1.);
if ( json != 0 )
{
if ( extract_cJSON_str(utxbytes,1024,json,"transactionBytes") > 0 && extract_cJSON_str(sighash,1024,json,"signatureHash") > 0 )
{
retval = 0;
printf("generated utx.(%s) sighash.(%s)\n",utxbytes,sighash);
}
free_json(json);
}
return(retval);
}
#define EXCHANGE_NAME "nxtae"
#define UPDATE nxtae ## _price
#define SUPPORTS nxtae ## _supports
@ -544,7 +681,7 @@ double UPDATE(struct exchange_info *exchange,char *base,char *rel,struct exchang
return(hbla);
}
uint64_t submit_triggered_nxtae(struct supernet_info *myinfo,int32_t dotrade,char **retjsonstrp,int32_t is_MS,char *bidask,uint64_t assetid,uint64_t qty,uint64_t NXTprice,char *triggerhash,char *comment,uint64_t otherNXT,uint32_t triggerheight)
uint64_t submit_triggered_nxtae(struct supernet_info *myinfo,int32_t dotrade,char **retjsonstrp,int32_t is_MS,char *bidask,uint64_t assetid,uint64_t qty,uint64_t NXTprice,char *triggerhash,char *comment,char *otherNXT,uint32_t triggerheight,char *refhash)
{
int32_t deadline = 1 + 20; uint64_t txid = 0; struct destbuf errstr; char cmd[4096],secret[8192],*jsonstr; cJSON *json;
if ( retjsonstrp != 0 )
@ -563,22 +700,19 @@ uint64_t submit_triggered_nxtae(struct supernet_info *myinfo,int32_t dotrade,cha
else sprintf(cmd+strlen(cmd),"&priceNQT=%llu",(long long)NXTprice);
}
if ( otherNXT != 0 )
sprintf(cmd+strlen(cmd),"&recipient=%llu",(long long)otherNXT);
sprintf(cmd+strlen(cmd),"&recipient=%s",otherNXT);
if ( refhash != 0 )
sprintf(cmd+strlen(cmd),"&referencedTransactionFullHash=%s",refhash);
if ( triggerhash != 0 && triggerhash[0] != 0 )
{
if ( triggerheight == 0 )
sprintf(cmd+strlen(cmd),"&referencedTransactionFullHash=%s",triggerhash);
else sprintf(cmd+strlen(cmd),"&referencedTransactionFullHash=%s&phased=true&phasingFinishHeight=%u&phasingVotingModel=4&phasingQuorum=1&phasingLinkedFullHash=%s",triggerhash,triggerheight,triggerhash);
}
sprintf(cmd+strlen(cmd),"&phased=true&phasingFinishHeight=%u&phasingVotingModel=4&phasingQuorum=1&phasingLinkedFullHash=%s",triggerheight,triggerhash);
if ( comment != 0 && comment[0] != 0 )
sprintf(cmd+strlen(cmd),"&message=%s",comment);
if ( dotrade == 0 )
{
if ( retjsonstrp != 0 )
{
json = cJSON_CreateObject();
jaddstr(json,"submit",cmd);
*retjsonstrp = jprint(json,1);
strcat(cmd,"&broadcast=false");
*retjsonstrp = issue_NXTPOST(cmd);
}
return(0);
}
@ -603,6 +737,30 @@ uint64_t submit_triggered_nxtae(struct supernet_info *myinfo,int32_t dotrade,cha
return(txid);
}
char *NXT_phasedxfer(struct supernet_info *myinfo,char *othercoin,char *othercoinaddr,char *otherNXT,uint64_t assetid,double volume,char *comment)
{
uint8_t NXT_rmd160[20],addrtype; int32_t is_MS,triggerheight,dotrade = 0;
char onetimecoinaddr[64],triggerhash[41],*cmd,*signedtx = 0; uint64_t ap_mult;
if ( (triggerheight= get_NXTheight(myinfo,0)) != 0 )
{
bitcoin_addr2rmd160(&addrtype,NXT_rmd160,onetimecoinaddr);
init_hexbytes_noT(triggerhash,NXT_rmd160,20);
triggerheight += DEFAULT_NXT_DEADLINE;
if ( (ap_mult= get_assetmult(myinfo,&is_MS,assetid)) == 0 )
return(0);
else
{
if ( assetid == 0 || assetid == NXT_ASSETID )
cmd = "sendMoney";
else if ( is_MS == 0 )
cmd = "transferAsset";
else cmd = "transferCurrency";
submit_triggered_nxtae(myinfo,dotrade,&signedtx,is_MS,cmd,assetid,(volume * SATOSHIDEN) / ap_mult,0,triggerhash,comment,otherNXT,triggerheight,0);
return(signedtx);
}
} else return(0);
}
char *fill_nxtae(struct supernet_info *myinfo,int32_t dotrade,uint64_t *txidp,int32_t dir,double price,double volume,uint64_t baseid,uint64_t relid)
{
uint64_t txid,assetid,avail,qty,priceNQT,ap_mult; int32_t is_MS; char retbuf[512],*errstr,*cmdstr;
@ -617,7 +775,7 @@ char *fill_nxtae(struct supernet_info *myinfo,int32_t dotrade,uint64_t *txidp,in
if ( is_MS == 0 )
cmdstr = dir > 0 ? "placeBidOrder" : "placeAskOrder";
else cmdstr = dir > 0 ? "currencyBuy" : "currencySell";
txid = submit_triggered_nxtae(myinfo,dotrade,&errstr,is_MS,cmdstr,assetid,qty,priceNQT,0,0,0,0);
txid = submit_triggered_nxtae(myinfo,dotrade,&errstr,is_MS,cmdstr,assetid,qty,priceNQT,0,0,0,0,0);
if ( errstr != 0 )
sprintf(retbuf,"{\"error\":\"%s\"}",errstr), free(errstr);
else sprintf(retbuf,"{\"result\":\"success\",\"txid\":\"%llu\"}",(long long)txid);

37
iguana/exchanges777.h

@ -19,6 +19,7 @@
#include <curl/curl.h>
#include <curl/easy.h>
#define INSTANTDEX_OFFERDURATION 3600
#define EXCHANGES777_MINPOLLGAP 3
#define EXCHANGES777_MAXDEPTH 200
@ -50,7 +51,7 @@ struct exchange_info
uint32_t exchangeid,pollgap,lastpoll;
uint64_t lastnonce,exchangebits; double commission;
void *privatedata;
CURL *cHandle; queue_t requestQ,pricesQ,pendingQ[2],tradebotsQ;
CURL *cHandle; queue_t requestQ,pricesQ,pendingQ[2],tradebotsQ,acceptableQ;
};
struct instantdex_msghdr
@ -60,6 +61,23 @@ struct instantdex_msghdr
uint8_t serialized[];
} __attribute__((packed));
#define NXT_ASSETID ('N' + ((uint64_t)'X'<<8) + ((uint64_t)'T'<<16)) // 5527630
#define INSTANTDEX_ACCT "4383817337783094122"
union _NXT_tx_num { int64_t amountNQT; int64_t quantityQNT; };
struct NXT_tx
{
bits256 refhash,sighash,fullhash;
uint64_t senderbits,recipientbits,assetidbits,txid,priceNQT,quoteid;
int64_t feeNQT;
union _NXT_tx_num U;
int32_t deadline,type,subtype,verify,number;
uint32_t timestamp;
char comment[4096];
};
uint64_t set_NXTtx(struct supernet_info *myinfo,struct NXT_tx *tx,uint64_t assetidbits,int64_t amount,uint64_t other64bits,int32_t feebits);
cJSON *gen_NXT_tx_json(struct supernet_info *myinfo,char *fullhash,struct NXT_tx *utx,char *reftxid,double myshare);
int32_t calc_raw_NXTtx(struct supernet_info *myinfo,char *fullhash,char *utxbytes,char *sighash,uint64_t assetidbits,int64_t amount,uint64_t other64bits);
struct exchange_request
{
struct queueitem DL;
@ -71,6 +89,22 @@ struct exchange_request
struct exchange_quote bidasks[];
};
struct bitcoin_unspent { bits256 txid,privkey; uint64_t value; int32_t vout; };
struct bitcoin_spend
{
char changeaddr[64];
int32_t numinputs;
uint64_t txfee,input_satoshis,satoshis;
struct bitcoin_unspent inputs[];
};
struct instantdex_entry { char base[24],rel[24]; uint64_t price64,basevolume64,offer64; uint32_t expiration,nonce; char myside,acceptdir; };
struct instantdex_accept { struct queueitem DL; uint64_t pendingvolume64,orderid; uint32_t dead; struct instantdex_entry A; };
struct instantdex_accept *instantdex_acceptablefind(struct exchange_info *exchange,cJSON *bids,cJSON *asks,uint64_t orderid,char *base,char *rel);
cJSON *instantdex_acceptjson(struct instantdex_accept *ap);
struct instantdex_accept *instantdex_acceptable(struct exchange_info *exchange,struct instantdex_accept *A,uint64_t offerbits);
void *curl_post(void **cHandlep,char *url,char *userpass,char *postfields,char *hdr0,char *hdr1,char *hdr2,char *hdr3);
char *instantdex_sendcmd(struct supernet_info *myinfo,cJSON *argjson,char *cmdstr,char *ipaddr,int32_t hops);
char *exchanges777_Qprices(struct exchange_info *exchange,char *base,char *rel,int32_t maxseconds,int32_t allfields,int32_t depth,cJSON *argjson,int32_t monitor,double commission);
@ -87,5 +121,6 @@ double truefx_price(struct exchange_info *exchange,char *base,char *rel,struct e
double fxcm_price(struct exchange_info *exchange,char *base,char *rel,struct exchange_quote *bidasks,int32_t maxdepth,double commission,cJSON *argjson,int32_t invert);
double instaforex_price(struct exchange_info *exchange,char *base,char *rel,struct exchange_quote *bidasks,int32_t maxdepth,double commission,cJSON *argjson,int32_t invert);
char *instantdex_queueaccept(struct exchange_info *exchange,char *base,char *rel,double price,double basevolume,int32_t acceptdir,char *myside,int32_t duration);
#endif

8
iguana/help/header.html

@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<title>SuperNET API></title>
<title>SuperNET API Page></title>
<!-- Bootstrap -->
@ -15,8 +15,8 @@
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<script src="help/html5shiv.min.js"></script>
<script src="help/respond.min.js"></script>
<![endif]-->
<!-- Optional theme -->
@ -30,7 +30,7 @@
<div class="navbar navbar-default" role="navigation">
<div class="container" style="min-width: 90%;">
<div class="navbar-header">
<a class="navbar-brand" href="#">SuperNET API</a>
<a class="navbar-brand" href="index.html">SuperNET 7777 GUI</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">

1
iguana/help/header.md

@ -0,0 +1 @@

19
iguana/iguana777.h

@ -65,7 +65,7 @@ struct iguana_txdatabits { uint64_t addrind:IGUANA_LOG2MAXPEERS,filecount:10,fpo
#define IGUANA_DEDICATED_THREADS
#ifdef IGUANA_DEDICATED_THREADS
#define IGUANA_MAXCONNTHREADS 16
#define IGUANA_MAXCONNTHREADS 3
#define IGUANA_MAXSENDTHREADS IGUANA_MAXPEERS
#define IGUANA_MAXRECVTHREADS IGUANA_MAXPEERS
#else
@ -470,10 +470,10 @@ struct vin_signer { bits256 privkey; char coinaddr[64]; uint8_t siglen,sig[80],r
struct vin_info
{
struct iguana_msgvin vin;
int32_t M,N,validmask,spendlen,type;
int32_t M,N,validmask,spendlen,type,p2shlen;
struct vin_signer signers[16];
char coinaddr[65];
uint8_t rmd160[20],spendscript[IGUANA_MAXSCRIPTSIZE];
uint8_t rmd160[20],spendscript[IGUANA_MAXSCRIPTSIZE],p2shscript[IGUANA_MAXSCRIPTSIZE];
};
// peers
@ -588,7 +588,7 @@ double dxblend(double *destp,double val,double decay);
// json
int32_t iguana_processjsonQ(struct iguana_info *coin); // reentrant, can be called during any idletime
char *iguana_JSON(char *jsonstr);
char *iguana_JSON(char *);
char *SuperNET_p2p(struct iguana_info *coin,struct iguana_peer *addr,int32_t *delaymillisp,char *ipaddr,uint8_t *data,int32_t datalen,int32_t compressed);
char *mbstr(char *str,double);
@ -682,7 +682,7 @@ void iguana_bundleiclear(struct iguana_info *coin,struct iguana_bundle *bp,int32
int32_t hcalc_bitsize(uint64_t x);
struct iguana_pkhash *iguana_pkhashfind(struct iguana_info *coin,struct iguana_pkhash *p,uint8_t rmd160[20]);
struct iguana_txid *iguana_txidfind(struct iguana_info *coin,int32_t *heightp,struct iguana_txid *tx,bits256 txid);
int32_t iguana_scriptgen(struct iguana_info *coin,char *coinaddr,uint8_t *script,char *asmstr,uint8_t rmd160[20],uint8_t type,int32_t txi,struct vin_info *vp);
int32_t iguana_scriptgen(struct iguana_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 iguana_ramchain_spendtxid(struct iguana_info *coin,bits256 *txidp,struct iguana_txid *T,int32_t numtxids,bits256 *X,int32_t numexternaltxids,struct iguana_spend *s);
struct iguana_info *iguana_coinselect();
void iguana_dedicatedloop(struct iguana_info *coin,struct iguana_peer *addr);
@ -728,9 +728,9 @@ int32_t category_peer(struct supernet_info *myinfo,struct iguana_peer *addr,bits
int32_t btc_wif2priv(uint8_t *addrtypep,uint8_t privkey[32],char *wifstr);
bits256 iguana_chaingenesis(int32_t version,uint32_t timestamp,uint32_t nBits,uint32_t nonce,bits256 merkle_root);
int32_t iguana_send_ConnectTo(struct iguana_info *coin,struct iguana_peer *addr);
cJSON *iguana_txjson(struct iguana_info *coin,struct iguana_txid *tx,int32_t height);
cJSON *iguana_txjson(struct iguana_info *coin,struct iguana_txid *tx,int32_t height,struct vin_info *V);
char *iguana_txscan(struct iguana_info *coin,cJSON *json,uint8_t *data,int32_t recvlen,bits256 txid);
char *iguana_rawtxbytes(struct iguana_info *coin,uint8_t *serialized,int32_t datalen,cJSON *json,struct iguana_msgtx *msgtx);
char *iguana_rawtxbytes(struct iguana_info *coin,cJSON *json,struct iguana_msgtx *msgtx);
int32_t iguana_send_VPNversion(struct iguana_info *coin,struct iguana_peer *addr,uint64_t myservices);
void exchanges777_init(struct supernet_info *myinfo,cJSON *exchanges,int32_t sleepflag);
int32_t iguana_rwvout(int32_t rwflag,struct OS_memspace *mem,uint8_t *serialized,struct iguana_msgvout *msg);
@ -739,11 +739,10 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t rwflag,cJSON *json,uint8
int32_t iguana_ramtxbytes(struct iguana_info *coin,uint8_t *serialized,int32_t maxlen,bits256 *txidp,struct iguana_txid *tx,int32_t height,struct iguana_msgvin *vins,struct iguana_msgvout *vouts);
cJSON *bitcoin_txtest(struct iguana_info *coin,char *rawtxstr,bits256 txid);
cJSON *iguana_blockjson(struct iguana_info *coin,struct iguana_block *block,int32_t txidsflag);
int32_t iguana_sig(uint8_t *sig,int32_t maxsize,uint8_t *data,int32_t datalen,bits256 privkey);
int32_t iguana_ver(uint8_t *sig,int32_t siglen,uint8_t *data,int32_t datalen,bits256 pubkey);
//int32_t iguana_sig(uint8_t *sig,int32_t maxsize,uint8_t *data,int32_t datalen,bits256 privkey);
//int32_t iguana_ver(uint8_t *sig,int32_t siglen,uint8_t *data,int32_t datalen,bits256 pubkey);
//int32_t iguana_ver(uint8_t *sig,int32_t siglen,uint8_t *data,int32_t datalen,uint8_t *pubkey);
extern queue_t bundlesQ;
#include "../includes/iguana_api.h"

12
iguana/iguana_chains.c

@ -82,6 +82,18 @@ static struct iguana_chain Chains[] =
},
};
/*
// PUBKEY_ADDRESS + SCRIPT_ADDRESS addrman.h
// PRIVKEY_ADDRESS use wif2priv API on any valid wif
// networkmagic pchMessageStart main.cpp
// genesis block from any blockexplorer, calendar strings can be converted by utime2utc
{
"name":"BitcoinDark","symbol":"BTCD",
"PUBKEY_ADDRESS":60,"SCRIPT_ADDRESS":85,"PRIVKEY_ADDRESS":188,
"networkmagic":"e4c2d8e6","portp2p:14631,"portrpc":14632,"txhastimestamp":1,
"genesis":{"version":1,"timestamp":1403138561,"nBits":"1e0fffff","nonce":8359109,"hash":"0000044966f40703b516c5af180582d53f783bfd319bb045e2dc3e05ea695d46","merkle":"fd1751cc6963d88feca94c0d01da8883852647a37a0a67ce254d62dd8c9d5b2b"}
}*/
bits256 iguana_chaingenesis(int32_t version,uint32_t timestamp,uint32_t bits,uint32_t nonce,bits256 merkle_root)
{
struct iguana_msgblock msg; int32_t len; bits256 hash2; uint8_t serialized[1024]; char hexstr[2049];

26
iguana/iguana_exchanges.c

@ -239,7 +239,15 @@ void exchanges777_json_quotes(struct exchange_info *exchange,double commission,c
timestamp = juint(jitem(item,2),0);
else orderid = j64bits(jitem(item,2),0);
}
else continue;
else
{
price = jdouble(item,"price");
volume = jdouble(item,"volume");
timestamp = juint(item,"timestamp");
orderid = j64bits(item,"orderid");
}
if ( price == 0. || volume == 0. )
continue;
if ( price > SMALLVAL && volume > SMALLVAL )
{
price = exchange_setquote(bidasks,&numbids,&numasks,bidask,invert,price,volume,commission,orderid,timestamp,offerNXT);
@ -585,10 +593,12 @@ void exchanges777_loop(void *ptr)
_crypto_update(PEGS,PEGS->cryptovols,&PEGS->data,1,peggyflag);
PEGS->lastupdate = (uint32_t)time(NULL);
}
printf("exchanges loop.(%s) %p\n",exchange->name,&exchange->requestQ);
while ( 1 )
{
if ( peggyflag != 0 )
{
printf("nonz peggy\n");
PAX_idle(PEGS,peggyflag,3);
if ( time(NULL) > PEGS->lastupdate+100 )
{
@ -713,18 +723,20 @@ char *exchanges777_submit(struct exchange_info *exchange,struct exchange_request
if ( maxseconds == 0 )
maxseconds = EXCHANGES777_DEFAULT_TIMEOUT;
retstrp = req->retstrp;
//printf("submit to %p\n",&exchange->requestQ);
queue_enqueue("exchangeQ",&exchange->requestQ,&req->DL,0);
for (i=0; i<maxseconds; i++)
{
if ( retstrp != 0 && (retstr= *retstrp) != 0 )
{
//printf("GOT.(%s)\n",retstr);
//printf("exchanges777_submit GOT.(%s)\n",retstr);
free(retstrp);
return(retstr);
}
sleep(1);
}
req->timedout = (uint32_t)time(NULL);
printf("exchanges777_submit timed out.(%c)\n",func);
return(clonestr("{\"error\":\"request timed out\"}"));
}
@ -790,6 +802,7 @@ char *exchanges777_Qrequest(struct exchange_info *exchange,int32_t func,char *ba
safecopy(req->rel,rel,sizeof(req->rel));
req->retstrp = calloc(1,sizeof(void *));
req->orderid = orderid;
//printf("Qrequest\n");
return(exchanges777_submit(exchange,req,func,maxseconds));
}
@ -866,6 +879,7 @@ struct exchange_info *exchange_create(char *exchangestr,cJSON *argjson)
exchange->issue = *Exchange_funcs[i];
iguana_initQ(&exchange->pricesQ,"prices");
iguana_initQ(&exchange->requestQ,"request");
iguana_initQ(&exchange->acceptableQ,"acceptable");
iguana_initQ(&exchange->tradebotsQ,"tradebots");
iguana_initQ(&exchange->pendingQ[0],"pending0");
iguana_initQ(&exchange->pendingQ[1],"pending1");
@ -886,6 +900,7 @@ struct exchange_info *exchange_create(char *exchangestr,cJSON *argjson)
exchange->commission *= .01;
printf("ADDEXCHANGE.(%s) [%s, %s, %s] commission %.3f%%\n",exchangestr,exchange->apikey,exchange->userid,exchange->apisecret,exchange->commission * 100.);
Exchanges[exchangeid] = exchange;
iguana_launch(iguana_coinadd("BTCD"),"exchangeloop",(void *)exchanges777_loop,exchange,IGUANA_EXCHANGETHREAD);
return(exchange);
}
@ -898,7 +913,6 @@ struct exchange_info *exchanges777_info(char *exchangestr,int32_t sleepflag,cJSO
{
if ( (exchange= exchange_create(exchangestr,json)) != 0 )
{
iguana_launch(iguana_coinadd("BTCD"),"exchangeloop",(void *)exchanges777_loop,exchange,IGUANA_EXCHANGETHREAD);
if ( sleepflag > 0 )
sleep(sleepflag);
}
@ -911,13 +925,15 @@ struct exchange_info *exchanges777_info(char *exchangestr,int32_t sleepflag,cJSO
void exchanges777_init(struct supernet_info *myinfo,cJSON *exchanges,int32_t sleepflag)
{
int32_t i,n; cJSON *argjson,*item; bits256 instantdexhash; struct exchange_info *exchange;
if ( (exchange= exchanges777_find("bitcoin")) == 0 && (exchange= exchange_create("bitcoin",0)) != 0 )
myinfo->tradingexchanges[myinfo->numexchanges++] = exchange;
if ( 0 && exchanges != 0 )
{
n = cJSON_GetArraySize(exchanges);
for (i=0; i<n; i++)
{
item = jitem(exchanges,i);
if ( (exchange= exchange_create(jstr(item,"name"),item)) != 0 )
if ( (exchange= exchanges777_find(jstr(item,"name"))) == 0 && (exchange= exchange_create(jstr(item,"name"),item)) != 0 )
myinfo->tradingexchanges[myinfo->numexchanges++] = exchange;
}
}
@ -925,7 +941,7 @@ void exchanges777_init(struct supernet_info *myinfo,cJSON *exchanges,int32_t sle
{
argjson = cJSON_CreateObject();
for (i=0; i<sizeof(Exchange_funcs)/sizeof(*Exchange_funcs); i++)
if ( (exchange= exchanges777_info(Exchange_funcs[i]->name,sleepflag,argjson,0)) != 0 )
if ( (exchange= exchanges777_find(Exchange_funcs[i]->name)) == 0 && (exchange= exchanges777_info(Exchange_funcs[i]->name,sleepflag,argjson,0)) != 0 )
myinfo->tradingexchanges[myinfo->numexchanges++] = exchange;
free_json(argjson);
}

353
iguana/iguana_instantdex.c

@ -20,19 +20,19 @@
#define INSTANTDEX_HOPS 3
#define INSTANTDEX_DURATION 60
#define INSTANTDEX_PROPOSE 1
#define INSTANTDEX_ACCEPT 2
#define INSTANTDEX_CONFIRM 3
cJSON *InstantDEX_argjson(char *reference,char *message,bits256 basetxid,bits256 reltxid,int32_t iter,int32_t val,int32_t val2)
cJSON *InstantDEX_argjson(char *reference,char *message,char *othercoinaddr,char *otherNXTaddr,int32_t iter,int32_t val,int32_t val2)
{
cJSON *argjson = cJSON_CreateObject();
if ( reference != 0 )
jaddstr(argjson,"refstr",reference);
if ( message != 0 && message[0] != 0 )
jaddstr(argjson,"message",message);
jaddbits256(argjson,"basetxid",basetxid);
jaddbits256(argjson,"reltxid",reltxid);
if ( othercoinaddr != 0 && othercoinaddr[0] != 0 )
jaddstr(argjson,"othercoinaddr",othercoinaddr);
if ( otherNXTaddr != 0 && otherNXTaddr[0] != 0 )
jaddstr(argjson,"otherNXTaddr",otherNXTaddr);
//jaddbits256(argjson,"basetxid",basetxid);
//jaddbits256(argjson,"reltxid",reltxid);
if ( iter != 3 )
{
if ( val == 0 )
@ -88,8 +88,8 @@ char *instantdex_sendcmd(struct supernet_info *myinfo,cJSON *argjson,char *cmdst
memset(msg,0,sizeof(*msg));
instantdexhash = calc_categoryhashes(0,"InstantDEX",0);
category_subscribe(myinfo,instantdexhash,GENESIS_PUBKEY);
if ( ipaddr == 0 || ipaddr[0] == 0 || strncmp(ipaddr,"127.0.0.1",strlen("127.0.0.1")) == 0 )
return(clonestr("{\"error\":\"no ipaddr, need to send your ipaddr for now\"}"));
//if ( ipaddr == 0 || ipaddr[0] == 0 || strncmp(ipaddr,"127.0.0.1",strlen("127.0.0.1")) == 0 )
// return(clonestr("{\"error\":\"no ipaddr, need to send your ipaddr for now\"}"));
jaddstr(argjson,"cmd",cmdstr);
for (i=0; i<sizeof(msg->cmd); i++)
if ( (msg->cmd[i]= cmdstr[i]) == 0 )
@ -204,96 +204,211 @@ double instantdex_aveprice(struct supernet_info *myinfo,struct exchange_quote *s
return(0);
}
char *instantdex_request(struct supernet_info *myinfo,char *cmdstr,struct instantdex_msghdr *msg,cJSON *argjson,char *remoteaddr,uint64_t signerbits,uint8_t *data,int32_t datalen)
{
char *base,*rel,*request,*refstr,*nextcmdstr,*message,*traderip;
double volume,price,aveprice,totalvol; cJSON *newjson; int32_t duration,flags,nextcmd;
int32_t num,depth; struct exchange_quote sortbuf[1000]; bits256 basetxid,reltxid;
if ( argjson != 0 )
{
num = 0;
depth = 30;
request = jstr(argjson,"request");
base = jstr(argjson,"base");
rel = jstr(argjson,"rel");
refstr = jstr(argjson,"refstr");
volume = jdouble(argjson,"volume");
duration = juint(argjson,"duration");
flags = juint(argjson,"flags");
nextcmd = 0;
nextcmdstr = message = "";
if ( (traderip= jstr(argjson,"traderip")) != 0 && strcmp(traderip,myinfo->ipaddr) == 0 )
int32_t instantdex_bidaskdir(struct instantdex_accept *ap)
{
printf("got my own request\n");
return(clonestr("{\"result\":\"got my own request\"}"));
if ( ap->A.myside == 0 && ap->A.acceptdir > 0 ) // base
return(-1);
else if ( ap->A.myside == 1 && ap->A.acceptdir < 0 ) // rel
return(1);
else return(0);
}
if ( strcmp(cmdstr,"request") == 0 )
cJSON *instantdex_acceptjson(struct instantdex_accept *ap)
{
int32_t dir;
cJSON *item = cJSON_CreateObject();
jadd64bits(item,"orderid",ap->orderid);
jadd64bits(item,"offerer",ap->A.offer64);
if ( ap->dead != 0 )
jadd64bits(item,"dead",ap->dead);
if ( (dir= instantdex_bidaskdir(ap)) > 0 )
jaddstr(item,"type","bid");
else if ( dir < 0 )
jaddstr(item,"type","ask");
else
{
aveprice = instantdex_aveprice(myinfo,sortbuf,(int32_t)(sizeof(sortbuf)/sizeof(*sortbuf)),&totalvol,base,rel,volume,argjson);
OS_randombytes(basetxid.bytes,sizeof(basetxid));
OS_randombytes(reltxid.bytes,sizeof(reltxid));
char str[65]; printf("GENERATE txid.%s aveprice %.8f vol %f\n",bits256_str(str,basetxid),aveprice,totalvol);
nextcmd = INSTANTDEX_PROPOSE;
nextcmdstr = "proposal";
message = "hello";
price = aveprice;
volume = totalvol;
jaddstr(item,"type","strange");
jaddnum(item,"acceptdir",ap->A.acceptdir);
jaddnum(item,"myside",ap->A.myside);
}
else
jaddstr(item,"base",ap->A.base);
jaddstr(item,"rel",ap->A.rel);
jaddnum(item,"timestamp",ap->A.expiration);
jaddnum(item,"price",dstr(ap->A.price64));
jaddnum(item,"volume",dstr(ap->A.basevolume64));
jaddnum(item,"nonce",ap->A.nonce);
jaddnum(item,"pendingvolume",dstr(ap->pendingvolume64));
jaddnum(item,"expiresin",ap->A.expiration - time(NULL));
return(item);
}
struct instantdex_accept *instantdex_acceptablefind(struct exchange_info *exchange,cJSON *bids,cJSON *asks,uint64_t orderid,char *base,char *rel)
{
basetxid = jbits256(argjson,"basetxid");
reltxid = jbits256(argjson,"reltxid");
if ( strcmp(cmdstr,"proposal") == 0 )
struct instantdex_accept PAD,*ap,*retap = 0; uint32_t now; cJSON *item; char *type;
now = (uint32_t)time(NULL);
memset(&PAD,0,sizeof(PAD));
queue_enqueue("acceptableQ",&exchange->acceptableQ,&PAD.DL,0);
while ( (ap= queue_dequeue(&exchange->acceptableQ,0)) != 0 && ap != &PAD )
{
nextcmd = INSTANTDEX_ACCEPT;
nextcmdstr = "accept";
message = "world";
}
else if ( strcmp(cmdstr,"accept") == 0 )
if ( now < ap->A.expiration && ap->dead == 0 )
{
nextcmd = INSTANTDEX_CONFIRM;
nextcmdstr = "confirm";
message = "confirmed";
}
else if ( strcmp(cmdstr,"confirm") == 0 )
if ( (strcmp(base,"*") == 0 || strcmp(base,ap->A.base) == 0) && (strcmp(rel,"*") == 0 || strcmp(rel,ap->A.rel) == 0) && (orderid == 0 || orderid == ap->orderid) )
{
return(clonestr("{\"error\":\"trade confirmed\"}"));
}
retap = ap;
}
if ( (newjson= InstantDEX_argjson(refstr,message,basetxid,reltxid,nextcmd,duration,flags)) != 0 )
if ( (item= instantdex_acceptjson(ap)) != 0 )
{
jaddnum(newjson,"price",price);
jaddnum(newjson,"volume",volume);
return(instantdex_sendcmd(myinfo,newjson,nextcmdstr,myinfo->ipaddr,INSTANTDEX_HOPS));
//printf("item.(%s)\n",jprint(item,0));
if ( (type= jstr(item,"type")) != 0 )
{
if ( strcmp(type,"bid") == 0 && bids != 0 )
jaddi(bids,item);
else if ( strcmp(type,"ask") == 0 && asks != 0 )
jaddi(asks,item);
}
}
return(clonestr("{\"error\":\"request needs argjson\"}"));
queue_enqueue("acceptableQ",&exchange->acceptableQ,&ap->DL,0);
} else free(ap);
}
return(retap);
}
char *instantdex_parse(struct supernet_info *myinfo,struct instantdex_msghdr *msg,cJSON *argjson,char *remoteaddr,uint64_t signerbits,uint8_t *data,int32_t datalen)
struct instantdex_accept *instantdex_acceptable(struct exchange_info *exchange,struct instantdex_accept *A,uint64_t offerbits)
{
struct instantdex_accept PAD,*ap,*retap = 0; uint64_t bestprice64 = 0;
uint32_t now; int32_t offerdir;
now = (uint32_t)time(NULL);
memset(&PAD,0,sizeof(PAD));
queue_enqueue("acceptableQ",&exchange->acceptableQ,&PAD.DL,0);
offerdir = instantdex_bidaskdir(A);
while ( (ap= queue_dequeue(&exchange->acceptableQ,0)) != 0 && ap != &PAD )
{
if ( now < ap->A.expiration && ap->dead == 0 )
{
static struct { char *cmdstr; char *(*func)(struct supernet_info *myinfo,char *cmdstr,struct instantdex_msghdr *msg,cJSON *argjson,char *remoteaddr,uint64_t signerbits,uint8_t *data,int32_t datalen); uint64_t cmdbits; } cmds[] =
if ( (offerbits == 0 || offerbits != A->A.offer64) && A->A.basevolume64 > 0. && (strcmp(A->A.base,"*") == 0 || strcmp(A->A.base,ap->A.base) == 0) && (strcmp(A->A.rel,"*") == 0 || strcmp(A->A.rel,ap->A.rel) == 0) && A->A.basevolume64 <= (ap->A.basevolume64 - ap->pendingvolume64) && offerdir*instantdex_bidaskdir(ap) < 0 )
{
{ "request", instantdex_request }, { "proposal", instantdex_request },
{ "accept", instantdex_request }, { "confirm", instantdex_request },
};
char *retstr = 0; int32_t i; uint64_t cmdbits;
if ( cmds[0].cmdbits == 0 )
if ( offerdir == 0 || A->A.price64 == 0 || ((offerdir > 0 && ap->A.price64 > A->A.price64) || (offerdir < 0 && ap->A.price64 < A->A.price64)) )
{
for (i=0; i<sizeof(cmds)/sizeof(*cmds); i++)
cmds[i].cmdbits = stringbits(cmds[i].cmdstr);
if ( bestprice64 == 0 || (offerdir < 0 && ap->A.price64 < bestprice64) || (offerdir > 0 && ap->A.price64 > bestprice64) )
{
printf("found better price %f vs %f\n",dstr(ap->A.price64),dstr(bestprice64));
bestprice64 = ap->A.price64;
retap = ap;
}
}
}
queue_enqueue("acceptableQ",&exchange->acceptableQ,&ap->DL,0);
} else free(ap);
}
return(retap);
}
// NXTrequest:
// sends NXT assetid, volume and desired
// request:
// other node sends (othercoin, othercoinaddr, otherNXT and reftx that expires well before phasedtx)
// proposal:
// NXT node submits phasedtx that refers to it, but it wont confirm
// approve:
// other node verifies unconfirmed has phasedtx and broadcasts cltv, also to NXT node, releases trigger
// confirm:
// NXT node verifies bitcoin txbytes has proper payment and cashes in with onetimepubkey
// BTC* node approves phased tx with onetimepubkey
int32_t instantdex_acceptextract(struct instantdex_accept *ap,cJSON *argjson)
{
char *base,*rel; bits256 hash;
memset(ap,0,sizeof(*ap));
if ( (base= jstr(argjson,"b")) != 0 )
safecopy(ap->A.base,base,sizeof(ap->A.base));
if ( (rel= jstr(argjson,"r")) != 0 )
safecopy(ap->A.rel,rel,sizeof(ap->A.rel));
ap->A.nonce = juint(argjson,"n");
ap->A.expiration = juint(argjson,"e");
ap->A.myside = juint(argjson,"s");
ap->A.acceptdir = jint(argjson,"d");
ap->A.offer64 = j64bits(argjson,"o");
ap->A.price64 = j64bits(argjson,"p");
ap->A.basevolume64 = j64bits(argjson,"v");
vcalc_sha256(0,hash.bytes,(void *)&ap->A,sizeof(ap->A));
ap->orderid = j64bits(argjson,"i");
if ( hash.txid != ap->orderid )
{
printf("instantdex_acceptset warning %llu != %llu\n",(long long)hash.txid,(long long)ap->orderid);
return(-1);
}
return(0);
}
bits256 instantdex_acceptset(struct instantdex_accept *ap,char *base,char *rel,int32_t duration,int32_t myside,int32_t acceptdir,double price,double volume,uint64_t offerbits)
{
bits256 hash;
memset(ap,0,sizeof(*ap));
safecopy(ap->A.base,base,sizeof(ap->A.base));
safecopy(ap->A.rel,base,sizeof(ap->A.rel));
OS_randombytes((uint8_t *)&ap->A.nonce,sizeof(ap->A.nonce));
ap->A.expiration = (uint32_t)time(NULL) + duration;
ap->A.offer64 = offerbits;
ap->A.myside = myside;
ap->A.acceptdir = acceptdir;
ap->A.price64 = price * SATOSHIDEN;
ap->A.basevolume64 = volume * SATOSHIDEN;
vcalc_sha256(0,hash.bytes,(void *)&ap->A,sizeof(ap->A));
ap->orderid = hash.txid;
return(hash);
}
cmdbits = stringbits(msg->cmd);
for (i=0; i<sizeof(cmds)/sizeof(*cmds); i++)
cJSON *instantdex_acceptsendjson(struct instantdex_accept *ap)
{
cJSON *json = cJSON_CreateObject();
jaddstr(json,"b",ap->A.base);
jaddstr(json,"r",ap->A.rel);
jaddnum(json,"n",ap->A.nonce);
jaddnum(json,"e",ap->A.expiration);
jaddnum(json,"s",ap->A.myside);
jaddnum(json,"d",ap->A.acceptdir);
jadd64bits(json,"p",ap->A.price64);
jadd64bits(json,"v",ap->A.basevolume64);
jadd64bits(json,"i",ap->orderid);
return(json);
}
#include "swaps/iguana_BTCswap.c"
#include "swaps/iguana_ALTswap.c"
#include "swaps/iguana_NXTswap.c"
#include "swaps/iguana_PAXswap.c"
char *instantdex_parse(struct supernet_info *myinfo,struct instantdex_msghdr *msg,cJSON *argjson,char *remoteaddr,uint64_t signerbits,uint8_t *data,int32_t datalen)
{
if ( cmds[i].cmdbits == cmdbits )
char cmdstr[16],*traderip,*orderidstr; struct exchange_info *exchange; uint64_t orderid;
struct instantdex_accept A,*ap;
exchange = exchanges777_find("bitcoin");
memset(cmdstr,0,sizeof(cmdstr)), memcpy(cmdstr,msg->cmd,sizeof(msg->cmd));
if ( argjson != 0 )
{
printf("parsed.(%s)\n",cmds[i].cmdstr);
retstr = (*cmds[i].func)(myinfo,cmds[i].cmdstr,msg,argjson,remoteaddr,signerbits,data,datalen);
break;
memset(&A,0,sizeof(A));
if ( (traderip= jstr(argjson,"traderip")) != 0 && strcmp(traderip,myinfo->ipaddr) == 0 )
{
printf("got my own request\n");
return(clonestr("{\"result\":\"got my own request\"}"));
}
if ( (orderidstr= jstr(argjson,"id")) != 0 )
{
orderid = calc_nxt64bits(orderidstr);
if ( (ap= instantdex_acceptablefind(exchange,0,0,orderid,"*","*")) != 0 )
A = *ap;
} else instantdex_acceptextract(&A,argjson);
if ( strncmp(cmdstr,"BTC",3) == 0 )
return(instantdex_BTCswap(myinfo,exchange,&A,cmdstr+3,msg,argjson,remoteaddr,signerbits,data,datalen));
else if ( strncmp(cmdstr,"NXT",3) == 0 )
return(instantdex_NXTswap(myinfo,exchange,&A,cmdstr+3,msg,argjson,remoteaddr,signerbits,data,datalen));
else if ( strncmp(cmdstr,"ALT",3) == 0 )
return(instantdex_ALTswap(myinfo,exchange,&A,cmdstr+3,msg,argjson,remoteaddr,signerbits,data,datalen));
else if ( strncmp(cmdstr,"PAX",3) == 0 )
return(instantdex_PAXswap(myinfo,exchanges777_find("PAX"),&A,cmdstr+3,msg,argjson,remoteaddr,signerbits,data,datalen));
else return(clonestr("{\"error\":\"unrecognized atomic swap family\"}"));
}
return(retstr);
return(clonestr("{\"error\":\"request needs argjson\"}"));
}
char *InstantDEX_hexmsg(struct supernet_info *myinfo,void *ptr,int32_t len,char *remoteaddr)
@ -343,50 +458,84 @@ char *InstantDEX_hexmsg(struct supernet_info *myinfo,void *ptr,int32_t len,char
return(retstr);
}
char *instantdex_queueaccept(struct exchange_info *exchange,char *base,char *rel,double price,double basevolume,int32_t acceptdir,char *mysidestr,int32_t duration)
{
struct instantdex_accept *ap; int32_t myside; struct supernet_info *myinfo = SuperNET_MYINFO(0);
if ( exchange != 0 )
{
ap = calloc(1,sizeof(*ap));
if ( strcmp(mysidestr,base) == 0 )
myside = 0;
else if ( strcmp(mysidestr,rel) == 0 )
myside = 1;
else myside = -1;
instantdex_acceptset(ap,base,rel,duration,myside,acceptdir,price,basevolume,myinfo->myaddr.nxt64bits);
queue_enqueue("acceptableQ",&exchange->acceptableQ,&ap->DL,0);
return(jprint(instantdex_acceptjson(ap),1));
}
else return(clonestr("{\"error\":\"invalid exchange\"}"));
}
#include "../includes/iguana_apidefs.h"
THREE_STRINGS_AND_DOUBLE(InstantDEX,request,reference,base,rel,volume)
TWO_STRINGS_AND_TWO_DOUBLES(InstantDEX,maxaccept,base,rel,maxprice,basevolume)
{
int32_t hops = INSTANTDEX_HOPS; cJSON *argjson;
if ( remoteaddr == 0 )
{
argjson = cJSON_CreateObject();
jaddstr(argjson,"refstr",reference);
jaddstr(argjson,"base",base);
jaddstr(argjson,"rel",rel);
jaddnum(argjson,"volume",volume);
return(instantdex_sendcmd(myinfo,argjson,"request",myinfo->ipaddr,hops));
} else return(clonestr("{\"error\":\"InstantDEX API request only local usage!\"}"));
return(instantdex_queueaccept(exchanges777_find("bitcoin"),base,rel,maxprice,basevolume,-1,rel,INSTANTDEX_OFFERDURATION));
else return(clonestr("{\"error\":\"InstantDEX API request only local usage!\"}"));
}
TWOSTRINGS_AND_TWOHASHES_AND_TWOINTS(InstantDEX,proposal,reference,message,basetxid,reltxid,duration,flags)
TWO_STRINGS_AND_TWO_DOUBLES(InstantDEX,minaccept,base,rel,minprice,basevolume)
{
int32_t hops = INSTANTDEX_HOPS; cJSON *argjson;
if ( remoteaddr == 0 )
return(instantdex_queueaccept(exchanges777_find("bitcoin"),base,rel,minprice,basevolume,1,base,INSTANTDEX_OFFERDURATION));
else return(clonestr("{\"error\":\"InstantDEX API request only local usage!\"}"));
}
TWO_STRINGS_AND_TWO_DOUBLES(InstantDEX,BTCoffer,othercoin,otherassetid,maxprice,othervolume)
{
argjson = InstantDEX_argjson(reference,message,basetxid,reltxid,INSTANTDEX_PROPOSE,duration,flags);
return(instantdex_sendcmd(myinfo,argjson,"proposal",myinfo->ipaddr,hops));
} else return(clonestr("{\"error\":\"InstantDEX API proposal only local usage!\"}"));
if ( remoteaddr == 0 )
return(instantdex_btcoffer(myinfo,exchanges777_find("bitcoin"),othercoin[0] != 0 ? othercoin : otherassetid,othervolume,maxprice));
else return(clonestr("{\"error\":\"InstantDEX API request only local usage!\"}"));
}
TWOSTRINGS_AND_TWOHASHES_AND_TWOINTS(InstantDEX,accept,reference,message,basetxid,reltxid,duration,flags)
STRING_AND_TWO_DOUBLES(InstantDEX,ALToffer,basecoin,minprice,basevolume)
{
int32_t hops = INSTANTDEX_HOPS; cJSON *argjson;
int32_t hops = INSTANTDEX_HOPS; cJSON *argjson; char *str; struct instantdex_accept A;
if ( remoteaddr == 0 )
{
argjson = InstantDEX_argjson(reference,message,basetxid,reltxid,INSTANTDEX_ACCEPT,duration,flags);
return(instantdex_sendcmd(myinfo,argjson,"accept",myinfo->ipaddr,hops));
} else return(clonestr("{\"error\":\"InstantDEX API accept only local usage!\"}"));
if ( iguana_coinfind(basecoin) == 0 )
return(clonestr("{\"error\":\"InstantDEX basecoin is not active, need to addcoin\"}"));
instantdex_acceptset(&A,basecoin,"BTC",INSTANTDEX_OFFERDURATION,0,1,minprice,basevolume,myinfo->myaddr.nxt64bits);
argjson = instantdex_acceptsendjson(&A);
if ( minprice > 0. )
{
if ( (str= InstantDEX_minaccept(IGUANA_CALLARGS,basecoin,"BTC",minprice,basevolume)) != 0 )
free(str);
}
return(instantdex_sendcmd(myinfo,argjson,"ALToffer",myinfo->ipaddr,hops));
} else return(clonestr("{\"error\":\"InstantDEX API request only local usage!\"}"));
}
TWOSTRINGS_AND_TWOHASHES_AND_TWOINTS(InstantDEX,confirm,reference,message,basetxid,reltxid,baseheight,relheight)
STRING_AND_TWO_DOUBLES(InstantDEX,NXToffer,assetid,minprice,basevolume)
{
int32_t hops = INSTANTDEX_HOPS; cJSON *argjson;
int32_t hops = INSTANTDEX_HOPS; cJSON *argjson; char *base,*str; struct instantdex_accept A;
if ( remoteaddr == 0 )
{
argjson = InstantDEX_argjson(reference,message,basetxid,reltxid,INSTANTDEX_CONFIRM,baseheight,relheight);
return(instantdex_sendcmd(myinfo,argjson,"confirm",myinfo->ipaddr,hops));
} else return(clonestr("{\"error\":\"InstantDEX API confirm only local usage!\"}"));
if ( assetid == 0 || assetid[0] == 0 || strcmp(assetid,"0") == 0 || strcmp(assetid,"NXT") == 0 || strcmp(assetid,"nxt") == 0 )
base = "NXT";
else if ( is_decimalstr(assetid) <= 0 )
return(clonestr("{\"error\":\"InstantDEX NXToffer illegal assetid\"}"));
else base = assetid;
instantdex_acceptset(&A,base,"BTC",INSTANTDEX_OFFERDURATION,0,1,minprice,basevolume,myinfo->myaddr.nxt64bits);
argjson = instantdex_acceptsendjson(&A);
if ( minprice > 0. )
{
if ( (str= InstantDEX_minaccept(IGUANA_CALLARGS,base,"BTC",minprice,basevolume)) != 0 )
free(str);
}
return(instantdex_sendcmd(myinfo,argjson,"NXToffer",myinfo->ipaddr,hops));
} else return(clonestr("{\"error\":\"InstantDEX API request only local usage!\"}"));
}
#include "../includes/iguana_apiundefs.h"

31
iguana/iguana_json.c

@ -82,6 +82,7 @@ cJSON *SuperNET_helpjson()
#define IGUANA_HELP_S(agent,name,str) array = helpjson(IGUANA_ARGS,#agent,#name,helparray(cJSON_CreateArray(),helpitem(#str,"string")))
#define IGUANA_HELP_SS(agent,name,str,str2) array = helpjson(IGUANA_ARGS,#agent,#name,helparray2(cJSON_CreateArray(),helpitem(#str,"string"),helpitem(#str2,"string")))
#define IGUANA_HELP_SSS(agent,name,str,str2,str3) array = helpjson(IGUANA_ARGS,#agent,#name,helparray3(cJSON_CreateArray(),helpitem(#str,"string"),helpitem(#str2,"string"),helpitem(#str3,"string")))
#define IGUANA_HELP_SDD(agent,name,str,val,val2) array = helpjson(IGUANA_ARGS,#agent,#name,helparray3(cJSON_CreateArray(),helpitem(#str,"string"),helpitem(#val,"float"),helpitem(#val2,"float")))
#define IGUANA_HELP_SSSS(agent,name,str,str2,str3,str4) array = helpjson(IGUANA_ARGS,#agent,#name,helparray4(cJSON_CreateArray(),helpitem(#str,"string"),helpitem(#str2,"string"),helpitem(#str3,"string"),helpitem(#str4,"string")))
#define IGUANA_HELP_SSSD(agent,name,str,str2,str3,amount) array = helpjson(IGUANA_ARGS,#agent,#name,helparray4(cJSON_CreateArray(),helpitem(#str,"string"),helpitem(#str2,"string"),helpitem(#str3,"string"),helpitem(#amount,"float")))
#define IGUANA_HELP_SSSDDD(agent,name,str,str2,str3,amount,val2,val3) array = helpjson(IGUANA_ARGS,#agent,#name,helparray6(cJSON_CreateArray(),helpitem(#str,"string"),helpitem(#str2,"string"),helpitem(#str3,"string"),helpitem(#amount,"float"),helpitem(#val2,"float"),helpitem(#val3,"float")))
@ -89,6 +90,7 @@ cJSON *SuperNET_helpjson()
#define IGUANA_HELP_SSH(agent,name,str,str2,hash) array = helpjson(IGUANA_ARGS,#agent,#name,helparray3(cJSON_CreateArray(),helpitem(#str,"string"),helpitem(#str2,"string"),helpitem(#hash,"hash")))
#define IGUANA_HELP_SSHI(agent,name,str,str2,hash,val) array = helpjson(IGUANA_ARGS,#agent,#name,helparray4(cJSON_CreateArray(),helpitem(#str,"string"),helpitem(#str2,"string"),helpitem(#hash,"hash"),helpitem(#val,"int")))
#define IGUANA_HELP_SSDD(agent,name,str,str2,val,val2) array = helpjson(IGUANA_ARGS,#agent,#name,helparray4(cJSON_CreateArray(),helpitem(#str,"string"),helpitem(#str2,"string"),helpitem(#val,"float"),helpitem(#val2,"float")))
#define IGUANA_HELP_SSHII(agent,name,str,str2,hash,val,val2) array = helpjson(IGUANA_ARGS,#agent,#name,helparray5(cJSON_CreateArray(),helpitem(#str,"string"),helpitem(#str2,"string"),helpitem(#hash,"hash"),helpitem(#val,"int"),helpitem(#val2,"int")))
#define IGUANA_HELP_SSHHII(agent,name,str,str2,hash,hash2,val,val2) array = helpjson(IGUANA_ARGS,#agent,#name,helparray6(cJSON_CreateArray(),helpitem(#str,"string"),helpitem(#str2,"string"),helpitem(#hash,"hash"),helpitem(#hash2,"hash"),helpitem(#val,"int"),helpitem(#val2,"int")))
#define IGUANA_HELP_SI(agent,name,str,val) array = helpjson(IGUANA_ARGS,#agent,#name,helparray2(cJSON_CreateArray(),helpitem(#str,"string"),helpitem(#val,"int")))
@ -164,6 +166,8 @@ cJSON *SuperNET_helpjson()
#define THREE_STRINGS_AND_THREE_DOUBLES IGUANA_HELP_SSSDDD
#define THREE_STRINGS_AND_DOUBLE IGUANA_HELP_SSSD
#define STRING_AND_DOUBLE IGUANA_HELP_SD
#define TWO_STRINGS_AND_TWO_DOUBLES IGUANA_HELP_SSDD
#define STRING_AND_TWO_DOUBLES IGUANA_HELP_SDD
#include "../includes/iguana_apideclares.h"
@ -453,9 +457,9 @@ char *SuperNET_htmlstr(char *fname,char *htmlstr,int32_t maxsize,char *agentstr)
{
int32_t i,n,len,size = 0; long filesize; cJSON *helpjson,*item,*array; char *str; FILE *fp = 0;
htmlstr[0] = 0;
pretty_forms("_API.md",0,"md");
printf("autocreate %s\n","_API.md");
pretty_forms(fname,agentstr,"html");
printf("autocreate %s\n","_API.md");
pretty_forms("_API.md",0,"md");
return(OS_filestr(&filesize,"index7778.html"));
sprintf(htmlstr,"<!DOCTYPE HTML><html> <head><title>SuperUGLY GUI></title></head> <body> ");
size = (int32_t)strlen(htmlstr);
@ -486,6 +490,9 @@ cJSON *iguana_peerjson(struct iguana_info *coin,struct iguana_peer *addr)
{
cJSON *array,*json = cJSON_CreateObject();
jaddstr(json,"ipaddr",addr->ipaddr);
if ( addr->supernet != 0 )
jaddstr(json,"ipaddr",addr->ipaddr);
jaddstr(json,"supernet","yes");
jaddnum(json,"protover",addr->protover);
jaddnum(json,"relay",addr->relayflag);
jaddnum(json,"height",addr->height);
@ -613,10 +620,22 @@ STRING_ARG(iguana,pausecoin,activecoin)
TWO_STRINGS(iguana,addnode,activecoin,ipaddr)
{
if ( coin != 0 && ipaddr != 0 )
struct iguana_peer *addr;
if ( coin == 0 )
coin = iguana_coinfind(activecoin);
printf("coin.%p.[%s] addnode.%s -> %s\n",coin,coin!=0?coin->symbol:"",activecoin,ipaddr);
if ( coin != 0 && ipaddr != 0 && is_ipaddr(ipaddr) != 0 )
{
iguana_possible_peer(coin,ipaddr);
//iguana_possible_peer(coin,ipaddr);
if ( (addr= iguana_peerslot(coin,(uint32_t)calc_ipbits(ipaddr),0)) != 0 )
{
if ( addr->pending == 0 )
{
addr->pending = (uint32_t)time(NULL);
iguana_launch(coin,"connection",iguana_startconnection,addr,IGUANA_CONNTHREAD);
return(clonestr("{\"result\":\"addnode submitted\"}"));
} else return(clonestr("{\"result\":\"addnode connection was already pending\"}"));
} else return(clonestr("{\"result\":\"addnode cant find peer slot\"}"));
}
else if ( coin == 0 )
return(clonestr("{\"error\":\"addnode needs active coin, do an addcoin first\"}"));
@ -840,6 +859,7 @@ char *SuperNET_parser(struct supernet_info *myinfo,char *agentstr,char *method,c
#define IGUANA_DISPATCH_SSS(agent,name,str,str2,str3) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jstr(json,#str),jstr(json,#str2),jstr(json,#str3)))
#define IGUANA_DISPATCH_SSSS(agent,name,str,str2,str3,str4) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jstr(json,#str),jstr(json,#str2),jstr(json,#str3),jstr(json,#str4)))
#define IGUANA_DISPATCH_SSSD(agent,name,str,str2,str3,amount) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jstr(json,#str),jstr(json,#str2),jstr(json,#str3),jdouble(json,#amount)))
#define IGUANA_DISPATCH_SSDD(agent,name,str,str2,val,val2) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jstr(json,#str),jstr(json,#str2),jdouble(json,#val),jdouble(json,#val2)))
#define IGUANA_DISPATCH_SSSDDD(agent,name,str,str2,str3,val,val2,val3) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jstr(json,#str),jstr(json,#str2),jstr(json,#str3),jdouble(json,#val),jdouble(json,#val2),jdouble(json,#val3)))
#define IGUANA_DISPATCH_SSSIII(agent,name,str,str2,str3,val,val2,val3) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jstr(json,#str),jstr(json,#str2),jstr(json,#str3),jint(json,#val),jint(json,#val2),jint(json,#val3)))
@ -850,6 +870,7 @@ char *SuperNET_parser(struct supernet_info *myinfo,char *agentstr,char *method,c
#define IGUANA_DISPATCH_SI(agent,name,str,val) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jstr(json,#str),juint(json,#val)))
#define IGUANA_DISPATCH_SII(agent,name,str,val,val2) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jstr(json,#str),juint(json,#val),juint(json,#val2)))
#define IGUANA_DISPATCH_SSI(agent,name,str,str2,val) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jstr(json,#str),jstr(json,#str2),juint(json,#val)))
#define IGUANA_DISPATCH_SDD(agent,name,str,val,val2) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jstr(json,#str),jdouble(json,#val),jdouble(json,#val2)))
#define IGUANA_DISPATCH_SA(agent,name,str,array) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jstr(json,#str),jobj(json,#array)))
#define IGUANA_DISPATCH_SAA(agent,name,str,array,array2) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jstr(json,#str),jobj(json,#array),jobj(json,#array2)))
#define IGUANA_DISPATCH_SIII(agent,name,str,val,val2,val3) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jstr(json,#str),juint(json,#val),juint(json,#val2),juint(json,#val3)))
@ -920,6 +941,8 @@ char *SuperNET_parser(struct supernet_info *myinfo,char *agentstr,char *method,c
#define THREE_STRINGS_AND_THREE_DOUBLES IGUANA_DISPATCH_SSSDDD
#define THREE_STRINGS_AND_DOUBLE IGUANA_DISPATCH_SSSD
#define STRING_AND_DOUBLE IGUANA_DISPATCH_SD
#define TWO_STRINGS_AND_TWO_DOUBLES IGUANA_DISPATCH_SSDD
#define STRING_AND_TWO_DOUBLES IGUANA_DISPATCH_SDD
#include "../includes/iguana_apideclares.h"
//#undef IGUANA_ARGS

2
iguana/iguana_msg.c

@ -557,7 +557,7 @@ int32_t iguana_msgparser(struct iguana_info *coin,struct iguana_peer *addr,struc
addr->lastgotaddr = (uint32_t)time(NULL);
addr->msgcounts.addr++;
}
printf("%s -> addr recvlen.%d num.%d\n",addr->ipaddr,recvlen,(int32_t)x);
//printf("%s -> addr recvlen.%d num.%d\n",addr->ipaddr,recvlen,(int32_t)x);
}
else if ( strcmp(H->command,"headers") == 0 )
{

2
iguana/iguana_peers.c

@ -443,9 +443,9 @@ int32_t iguana_recv(char *ipaddr,int32_t usock,uint8_t *recvbuf,int32_t len)
{
if ( (recvlen= (int32_t)recv(usock,recvbuf,remains,0)) < 0 )
{
printf("%s recv errno.%d %s\n",ipaddr,errno,strerror(errno));
if ( errno == EAGAIN )
{
//printf("%s recv errno.%d %s\n",ipaddr,errno,strerror(errno));
//printf("EAGAIN for len %d, remains.%d\n",len,remains);
sleep(1);
} else return(-errno);

5
iguana/iguana_pubkeys.c

@ -345,7 +345,10 @@ cstring *base58_decode_check(uint8_t *addrtype,const char *s_in)
}
else
{
char str[65]; printf("checkhash mismatch %02x %02x %02x %02x vs %02x %02x %02x %02x (%s)\n",s->str[s->len - 4]&0xff,s->str[s->len - 3]&0xff,s->str[s->len - 2]&0xff,s->str[s->len - 1]&0xff,hash.bytes[31],hash.bytes[30],hash.bytes[29],hash.bytes[28],bits256_str(str,hash));
int32_t i;
for (i=0; i<s->len; i++)
printf("%02x ",s->str[i]&0xff);
char str[65]; printf(" s->len.%ld\n>>>>>>>> matched %02x %02x %02x %02x vs %02x %02x %02x %02x (%s) (%s)\n",s->len,s->str[s->len - 4]&0xff,s->str[s->len - 3]&0xff,s->str[s->len - 2]&0xff,s->str[s->len - 1]&0xff,hash.bytes[31],hash.bytes[30],hash.bytes[29],hash.bytes[28],bits256_str(str,hash),s_in);
}
}
cstr_free(s,true);

4
iguana/iguana_recv.c

@ -53,7 +53,7 @@ int32_t iguana_sendblockreqPT(struct iguana_info *coin,struct iguana_peer *addr,
coin->numreqsent++;
addr->pendblocks++;
addr->pendtime = (uint32_t)time(NULL);
printf("REQ.%s bundlei.%d hdrsi.%d\n",bits256_str(hexstr,hash2),bundlei,bp!=0?bp->hdrsi:-1);
//printf("REQ.%s bundlei.%d hdrsi.%d\n",bits256_str(hexstr,hash2),bundlei,bp!=0?bp->hdrsi:-1);
} else printf("MSG_BLOCK null datalen.%d\n",len);
return(len);
}
@ -568,7 +568,7 @@ struct iguana_bundlereq *iguana_recvblockhashes(struct iguana_info *coin,struct
}
}
}
printf("issue block1\n");
//printf("issue block1\n");
struct iguana_block *block;
if ( num == coin->chain->bundlesize+1 && (block= iguana_blockhashset(coin,-1,blockhashes[1],1)) != 0 )
block->blockhashes = blockhashes, req->hashes = 0;

5
iguana/iguana_rpc.c

@ -721,13 +721,16 @@ char *SuperNET_rpcparse(struct supernet_info *myinfo,char *retbuf,int32_t bufsiz
//printf("url.(%s) method.(%s) helpfname.(%s)\n",&url[i],urlmethod,helpfname);
if ( strcmp(&url[i],"/") == 0 && strcmp(urlmethod,"GET") == 0 )
{
static int counter;
*jsonflagp = 1;
if ( (filestr= OS_filestr(&filesize,"index7778.html")) == 0 )
if ( counter++ == 0 || (filestr= OS_filestr(&filesize,"index7778.html")) == 0 )
{
if ( (filestr= SuperNET_htmlstr("index7778.html",retbuf,bufsize,0)) != 0 )
printf("created index7778.html size %ld\n",strlen(filestr));
}
if ( filestr != 0 )
return(filestr);
else return(clonestr("{\"error\":\"cant find index7778\"}"));
}
else if ( (filestr= OS_filestr(&filesize,url+1)) != 0 )
return(filestr);

2
iguana/iguana_tx.c

@ -58,7 +58,7 @@ int32_t iguana_voutset(struct iguana_info *coin,uint8_t *scriptspace,char *asmst
vout->value = u->value;
vout->pk_script = scriptspace;
memset(&V,0,sizeof(V));
scriptlen = iguana_scriptgen(coin,coinaddr,scriptspace,asmstr,p->rmd160,u->type,i,&V);
scriptlen = iguana_scriptgen(coin,&V.M,&V.N,coinaddr,scriptspace,asmstr,p->rmd160,u->type,(const struct vin_info *)&V,i);
}
vout->pk_scriptlen = scriptlen;
return(scriptlen);

69
iguana/index.html

@ -47,7 +47,7 @@ data-path="{tc}/{config}">
<!--<a class="navbar-brand" href="#">
<img alt="Brand" style="z-index:-1;" src="logo.png" width="25" height="25">
</a>-->
<a href="javascript:void(0)" class="navbar-brand">Iguana</a>
<a href="#" class="navbar-brand">Iguana</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse">
@ -281,6 +281,45 @@ data-path="{tc}/{config}">
</div>
</div>
<div id="Tradebot_page" class="page">
<div class="row">
<div class="panel panel-default">
<div class="panel-heading">
<h3>
<span>Tradebot</span>
</h3>
</div>
<div class="panel-body center button_div">
<button class="btn btn-primary Tradebot_set_method_table" data-method="monitor" >monitor</button>
<button class="btn btn-primary Tradebot_set_method_table" data-method="monitorall" >monitorall</button>
<button class="btn btn-primary Tradebot_set_method_table" data-method="unmonitor" >unmonitor</button>
<button class="btn btn-primary Tradebot_set_method_table" data-method="accumulate" >accumulate</button>
<button class="btn btn-primary Tradebot_set_method_table" data-method="divest" >divest</button>
<button class="btn btn-primary Tradebot_set_method_table" data-method="activebots" >activebots</button>
<button class="btn btn-primary Tradebot_set_method_table" data-method="status" >status</button>
<button class="btn btn-primary Tradebot_set_method_table" data-method="pause" >pause</button>
<button class="btn btn-primary Tradebot_set_method_table" data-method="stop" >stop</button>
<button class="btn btn-primary Tradebot_set_method_table" data-method="resume" >resume</button>
</div>
<div class="panel-body">
<table id="tradebot_input" class="table table-hover table-bordered">
</table>
<table id="trade_output" class="table table-hover table-bordered">
</table>
</div>
</div>
</div>
</div>
<div id="Settings_page" class="page">
<div class="panel panel-default">
@ -402,9 +441,10 @@ data-path="{tc}/{config}">
</table>
</div>
<p>
** Awaiting specific requirements **
</p>
<table id="appstatus" class="table table-hover table-bordered">
</table>
</div>
</div>
<style type="text/css">
@ -422,10 +462,13 @@ data-path="{tc}/{config}">
<h3>Instandex tab</h3>
</div>
<div class="panel-body center">
<button class="btn btn-primary instantdex_set_method_table" data-method="orderbook" >orderbook</button>
<button class="btn btn-primary instantdex_set_method_table" data-method="apikeypair" >API Keypair</button>
<button class="btn xyz_button_click btn-primary instantdex_set_method_table" data-method="orderbook" >orderbook</button>
<button class="btn xyz_button_click btn-primary instantdex_set_method_table" data-method="apikeypair" >API Keypair</button>
<button class="btn btn-primary instantdex_set_method_table" data-method="setuserid" >Set Userid</button>
<button class="btn btn-primary instantdex_set_method_table" data-method="allpairs" >Allpairs</button>
<button class="btn btn-primary instantdex_set_method_table" data-method="balance" >Balance</button>
<button class="btn btn-primary instantdex_set_method_table" data-method="support" >Support</button>
<button class="btn btn-primary instantdex_set_method_table" data-method="support" >Supports</button>
<button class="btn btn-primary instantdex_set_method_table" data-method="sell" >Sell</button>
<button class="btn btn-primary instantdex_set_method_table" data-method="buy" >Buy</button>
@ -441,15 +484,12 @@ data-path="{tc}/{config}">
</div>
<div class="panel-body center">
<table id="Instandex_form_table">
<table id="Instandex_form_table" class="table table-hover table-bordered">
</table>
</div>
<div class="panel-body center">
<table id="Instandex_output_table" class="table table-hover table-bordered" >
<table >
<tr>
<td id="Instandex_output_table">
</td>
</tr>
</table>
</div>
</div>
@ -496,6 +536,7 @@ data-path="{tc}/{config}">
<script type="text/javascript " src="js/pangea.js" ></script>
<script type="text/javascript " src="js/blockexplorer.js" ></script>
<script type="text/javascript " src="js/instantdex.js" ></script>
<script type="text/javascript " src="js/tradebot.js" ></script>
<script type="text/javascript " src="js/storage.js" ></script>
</body>

11
iguana/js/api.js

@ -11,7 +11,7 @@ function tagGen(len)
var SPNAPI = (function(SPNAPI, $, undefined) {
SPNAPI.methods = {};
SPNAPI.pages = ["Settings","Instandex", "Pangea", "Peers","Debug", "Coins", "Blockexplorer"];
SPNAPI.pages = ["Settings","Tradebot","Instandex", "Pangea", "Peers","Debug", "Coins", "Blockexplorer"];
SPNAPI.pageContent = {};
SPNAPI.page = "Blockexplorer";
/*
@ -42,8 +42,13 @@ var SPNAPI = (function(SPNAPI, $, undefined) {
}else if(page==="Coins"){
addInitCoins();
}else if(page==="Instandex"){
ListAllExchanges();
}else if(page==="Blockexplorer"){
if(!saved_exchanges){
ListAllExchanges();}
}else if(page==="Tradebot"){
if(!saved_exchanges){
ListAllExchanges();}
}
else if(page==="Blockexplorer"){
filesystem_show_file_name();
}

6
iguana/js/common.js

@ -207,6 +207,8 @@ var common = (function() {
// loaded.
var moduleEl = document.getElementById('nacl_module');
updateStatus('ERROR [' + moduleEl.lastError + ']');
APPLICATION.pexe="Error encountered";
change_app_status();
}
/**
@ -223,6 +225,8 @@ var common = (function() {
if (typeof window.handleCrash !== 'undefined') {
window.handleCrash(common.naclModule.lastError);
}
APPLICATION.pexe="crashed";
change_app_status();
}
/**
@ -237,6 +241,8 @@ var common = (function() {
if (typeof window.moduleDidLoad !== 'undefined') {
window.moduleDidLoad();
}
APPLICATION.pexe="loaded";
change_app_status();
}
/**

115
iguana/js/instantdex.js

@ -6,10 +6,19 @@
var exchanges="";
var saved_exchanges=false;
var show_resposnse=function(response){
$('#Instandex_output_table').html("");
response=JSON.parse(response);
for(var i in response){
if(i==='tag') continue;
$('#Instandex_output_table').append("<tr><td align='center'>"+i+"</td><td align='center'>"+response[i]+"</td></tr>");
}
};
var setUeseridandAPIkeyPair=function(){
InstantDEX_setuserid();
setAPIkeyPair();
};
@ -21,9 +30,7 @@ var setAPIkeyPair=function(){
var request='{"agent":"InstantDEX","method":"apikeypair","exchange":"'+exchange+'","apikey":"'+apikey+'","apisecret":"'+passphrase+'"}';
SPNAPI.makeRequest(request, function(request,response){
//response=JSON.parse(response);
$('#Instandex_output_table').append(response);
show_resposnse(response);
}
);
@ -42,8 +49,8 @@ var InstantDEX_setuserid=function(){
var request='{"agent":"InstantDEX","method":"setuserid","exchange":"'+exchange+'","userid":"'+userid+'","tradepassword":"'+tradepassword+'"}';
SPNAPI.makeRequest(request, function(request,response){
$('#Instandex_output_table').html(response);
setAPIkeyPair();
show_resposnse(response);
});
};
@ -56,7 +63,7 @@ var ListAllExchanges=function(){
response=JSON.parse(response);
if(response.result && response.result instanceof Array ){
for(var i in response.result){
$('#Instandex_exchange').append('<option value="'+response.result[i]+'">'+response.result[i]+'</option>');
//$('#Instandex_exchange').append('<option value="'+response.result[i]+'">'+response.result[i]+'</option>');
exchanges=exchanges+'<option value="'+response.result[i]+'">'+response.result[i]+'</option>';
}
@ -71,6 +78,21 @@ var ListAllExchanges=function(){
};
var InstantDEX_allpairs=function(){
var exchange=$('#Instandex_exchange').val();
var request='{"agent":"InstantDEX","method":"allpairs","exchange":"'+exchange+'"}';
SPNAPI.makeRequest(request, function(request,response){
response=JSON.parse(response);
//show_resposnse(response);
if(response.result){
for(var i in response.result){
$('#Instandex_output_table').append("<tr><td align='center'>"+response.result[i][0]+"</td><td align='center'>"+response.result[i][1]+"</td></tr>");
}}
});
};
//THREE_STRINGS_AND_THREE_INTS(InstantDEX,orderbook,exchange,base,rel,depth,allfields,invert);
var orderbook=function(){
var exchange=$('#Instandex_exchange').val();
@ -87,7 +109,7 @@ var orderbook=function(){
$('#Instandex_output_table').append("<tr class='row history-row'><th width='100px'>Bid price</th><th width='100px'>Ask price</th></tr>");
response=JSON.parse(response);
for(var i=0;i<response.numbids;i++){
$('#Instandex_output_table').append("<tr class='row history-row'><td>"+response.bids[i]+"</td><td>"+response.asks[i]+"</td></tr>");
$('#Instandex_output_table').append("<tr class='row history-row'><td align='center' >"+response.bids[i]+"</td><td align='center' >"+response.asks[i]+"</td></tr>");
}
});
@ -106,11 +128,12 @@ var exchange=$('#Instandex_exchange').val();
var base=$('#Instandex_base').val();
var rel=$('#Instandex_rel').val();
var price=$('#Instandex_price').val();
var volume=$('#Instandex_volume').val();
var request='{"agent":"InstantDEX","method":"buy","exchange":"'+exchange+'","base":"'+base+'","rel":"'+rel+'","price":'+price+',"volume":0,"dotrade":0}';
var request='{"agent":"InstantDEX","method":"buy","exchange":"'+exchange+'","base":"'+base+'","rel":"'+rel+'","price":'+price+',"volume":'+volume+',"dotrade":1}';
SPNAPI.makeRequest(request, function(request,response){
$('#Instandex_output_table').html(response);
show_resposnse(response);
});
};
@ -121,11 +144,12 @@ var InstantDEXSell=function(){
var base=$('#Instandex_base').val();
var rel=$('#Instandex_rel').val();
var price=$('#Instandex_price').val();
var volume=$('#Instandex_volume').val();
var request='{"agent":"InstantDEX","method":"sell","exchange":"'+exchange+'","base":"'+base+'","rel":"'+rel+'","price":'+price+',"volume":0,"dotrade":0}';
var request='{"agent":"InstantDEX","method":"sell","exchange":"'+exchange+'","base":"'+base+'","rel":"'+rel+'","price":'+price+',"volume":'+volume+',"dotrade":1}';
SPNAPI.makeRequest(request, function(request,response){
$('#Instandex_output_table').html(response);
show_resposnse(response);
});
@ -141,7 +165,7 @@ var InstantDEXWithdaw=function(){
console.log(request);
SPNAPI.makeRequest(request, function(request,response){
$('#Instandex_output_table').html(response);
show_resposnse(response);
});
};
@ -157,7 +181,8 @@ var InstantDEX_supports=function(){
var request='{"agent":"InstantDEX","method":"supports","exchange":"'+exchange+'","userid":"'+base+'","rel":"'+rel+'"}';
SPNAPI.makeRequest(request, function(request,response){
$('#Instandex_output_table').html(response);
show_resposnse(response);
});
};
@ -173,12 +198,7 @@ var InstantDEX_balance=function(){
var request='{"agent":"InstantDEX","method":"balance","exchange":"'+exchange+'","base":"'+base+'"}';
SPNAPI.makeRequest(request, function(request,response){
$('#Instandex_output_table').html("");
response=JSON.parse(response);
for(var i in response){
if(i==='tag') continue;
$('#Instandex_output_table').append("<tr><th width='100px'>"+i+"</th><td width='200px'>"+response[i]+"</td></tr>");
}
show_resposnse(response);
});
};
@ -192,7 +212,7 @@ var InstantDEX_orderstatus=function(){
var request='{"agent":"InstantDEX","method":"orderstatus","exchange":"'+exchange+'","orderid":"'+orderid+'"}';
SPNAPI.makeRequest(request, function(request,response){
$('#Instandex_output_table').html(response);
show_resposnse(response);
});
};
@ -208,7 +228,7 @@ var InstantDEX_cancelorder=function(){
var request='{"agent":"InstantDEX","method":"cancelorder","exchange":"'+exchange+'","orderid":"'+orderid+'"}';
SPNAPI.makeRequest(request, function(request,response){
$('#Instandex_output_table').html(response);
show_resposnse(response);
});
};
@ -221,7 +241,7 @@ var InstantDEX_openorders=function(){
var request='{"agent":"InstantDEX","method":"openorders","exchange":"'+exchange+'"}';
SPNAPI.makeRequest(request, function(request,response){
$('#Instandex_output_table').html(response);
show_resposnse(response);
});
};
@ -235,7 +255,7 @@ var InstantDEX_tradehistory=function(){
var request='{"agent":"InstantDEX","method":"tradehistory","exchange":"'+exchange+'"}';
SPNAPI.makeRequest(request, function(request,response){
$('#Instandex_output_table').html(response);
show_resposnse(response);
});
};
@ -249,41 +269,48 @@ var InstantDEX_pollgap=function(){
var request='{"agent":"InstantDEX","method":"pollgap","exchange":"'+exchange+'","pollgap":'+pollgap+'}';
SPNAPI.makeRequest(request, function(request,response){
$('#Instandex_output_table').html(response);
show_resposnse(response);
});
};
var set_setuserid_table=function (){
var html='<tr><td align="center" > UserID:</td><td align="center" ><input type="text" id="Instandex_userid"/></td></tr><tr><td align="center" > Password:</td><td align="center" ><input type="text" id="Instandex_tradepassword"/></td></tr><tr><td align="center" > Exchange:</td><td align="center" ><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td colspan="2" align="center"> <button class="btn btn-primary instantdex_set_userid" >Set Userid</button></td></tr>';
$('#Instandex_form_table').html(html);
if(exchanges!==""){
$('#Instandex_exchange').html(exchanges);}
};
var set_apikeypass_table=function (){
var html='<tr><td> UserID:</td><td><input type="text" id="Instandex_userid"/></td></tr><tr><td> Password:</td><td><input type="text" id="Instandex_tradepassword"/></td></tr><tr><td> Apikey:</td><td><input type="text" id="Instandex_apikey"/></td></tr><tr><td> Passphrase:</td><td><input type="text" id="Instandex_apipassphrase"/></td></tr><tr><td> Exchange:</td><td><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td> <button class="btn btn-primary instantdex_set_keypair" >Set keypair</button></td><td></td></tr>';
var html='<tr><td align="center" > Apikey:</td><td align="center" ><input size="40" type="text" id="Instandex_apikey"/></td></tr><tr><td align="center" > Passphrase:</td><td align="center" ><input size="40" type="text" id="Instandex_apipassphrase"/></td></tr><tr><td align="center" > Exchange:</td><td align="center" ><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td colspan="2" align="center"> <button class="btn btn-primary instantdex_set_keypair" >Set keypair</button></td></tr>';
$('#Instandex_form_table').html(html);
if(exchanges!==""){
$('#Instandex_exchange').html(exchanges);}
};
var set_orderbook_table=function (){
var html='<tr><td> Base:</td><td><input type="text" id="Instandex_base"/></td></tr><tr><td>Rel:</td><td><input type="text" id="Instandex_rel"/></td></tr><tr><td>Depth:</td><td><input type="text" id="Instandex_orderbook_depth"/></td></tr><tr><td> Exchange:</td><td><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td> <button class="btn btn-primary instantdex_orderbook" >orderbook</button></td><td></td></tr>';
var html='<tr><td align="center" > Base:</td><td align="center" ><input type="text" id="Instandex_base"/></td></tr><tr><td align="center" >Rel:</td><td align="center" ><input type="text" id="Instandex_rel"/></td></tr><tr><td align="center" >Depth:</td><td align="center" ><input type="text" id="Instandex_orderbook_depth"/></td></tr><tr><td align="center" > Exchange:</td><td align="center" ><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td colspan="2" align="center"> <button class="btn btn-primary instantdex_orderbook" >orderbook</button></td></tr>';
$('#Instandex_form_table').html(html);
if(exchanges!==""){
$('#Instandex_exchange').html(exchanges);}
};
var set_sell_table=function (){
var html='<tr><td> Base:</td><td><input type="text" id="Instandex_base"/></td></tr><tr><td>Rel:</td><td><input type="text" id="Instandex_rel"/></td></tr><tr><td>Price:</td><td><input type="text" id="Instandex_price"/></td></tr><tr><td> Exchange:</td><td><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td> <button class="btn btn-primary instantdex_sell" >Sell</button></td><td></td></tr>';
var html='<tr><td align="center" > Base:</td><td align="center" ><input type="text" id="Instandex_base"/></td></tr><tr><td align="center" >Rel:</td><td align="center" ><input type="text" id="Instandex_rel"/></td></tr><tr><td align="center" >Price:</td><td align="center" ><input type="text" id="Instandex_price"/></td></tr><tr><td align="center" >Volume:</td><td align="center" ><input type="text" id="Instandex_volume"/></td></tr><tr><td align="center" > Exchange:</td><td align="center" ><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td colspan="2" align="center"> <button class="btn btn-primary instantdex_sell" >Sell</button></td></tr>';
$('#Instandex_form_table').html(html);
if(exchanges!==""){
$('#Instandex_exchange').html(exchanges);}
};
var set_buy_table=function (){
var html='<tr><td> Base:</td><td><input type="text" id="Instandex_base"/></td></tr><tr><td>Rel:</td><td><input type="text" id="Instandex_rel"/></td></tr><tr><td>Price:</td><td><input type="text" id="Instandex_price"/></td></tr><tr><td> Exchange:</td><td><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td> <button class="btn btn-primary instantdex_buy" >Buy</button></td><td></td></tr>';
var html='<tr><td align="center" > Base:</td><td align="center" ><input type="text" id="Instandex_base"/></td></tr><tr><td align="center" >Rel:</td><td align="center" ><input type="text" id="Instandex_rel"/></td></tr><tr><td align="center" >Price:</td><td align="center" ><input type="text" id="Instandex_price"/></td></tr><tr><td align="center" >Volume:</td><td align="center" ><input type="text" id="Instandex_volume"/></td></tr><tr><td align="center" > Exchange:</td><td align="center" ><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td colspan="2" align="center"> <button class="btn btn-primary instantdex_buy" >Buy</button></td></tr>';
$('#Instandex_form_table').html(html);
if(exchanges!==""){
$('#Instandex_exchange').html(exchanges);}
};
var set_balance_table=function (){
var html='<tr><td> Base:</td><td><input type="text" id="Instandex_base"/></td></tr><tr><td> Exchange:</td><td><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td> <button class="btn btn-primary instantdex_balance" >Check balance</button></td><td></td></tr>';
var html='<tr><td align="center" > Base:</td><td align="center" ><input type="text" id="Instandex_base"/></td></tr><tr><td align="center" > Exchange:</td><td align="center" ><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td colspan="2" align="center" > <button class="btn btn-primary instantdex_balance" >Check balance</button></td></tr>';
$('#Instandex_form_table').html(html);
if(exchanges!==""){
$('#Instandex_exchange').html(exchanges);}
@ -291,7 +318,7 @@ var html='<tr><td> Base:</td><td><input type="text" id="Instandex_base"/></td><
var set_support_table=function (){
var html='<tr><td> Base:</td><td><input type="text" id="Instandex_base"/></td></tr><tr><td>Rel:</td><td><input type="text" id="Instandex_rel"/></td></tr><tr><td> Exchange:</td><td><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td> <button class="btn btn-primary instantdex_support" >Check Support</button></td><td></td></tr>';
var html='<tr><td align="center" > Base:</td><td align="center" ><input type="text" id="Instandex_base"/></td></tr><tr><td align="center" >Rel:</td><td align="center" ><input type="text" id="Instandex_rel"/></td></tr><tr><td align="center" > Exchange:</td><td align="center" ><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td colspan="2" align="center"> <button class="btn btn-primary instantdex_support" >Check Support</button></td></tr>';
$('#Instandex_form_table').html(html);
if(exchanges!==""){
$('#Instandex_exchange').html(exchanges);}
@ -299,14 +326,14 @@ var html='<tr><td> Base:</td><td><input type="text" id="Instandex_base"/></td><
var set_withdraw_table=function (){
var html='<tr><td> Base:</td><td><input type="text" id="Instandex_base"/></td></tr><tr><td>Destination address:</td><td><input type="text" id="Instandex_destaddr"/></td></tr><tr><td>Amount:</td><td><input type="text" id="Instandex_amount"/></td></tr><tr><td> Exchange:</td><td><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td> <button class="btn btn-primary instantdex_withdraw" >Withdraw</button></td><td></td></tr>';
var html='<tr><td align="center" > Base:</td><td align="center" ><input type="text" id="Instandex_base"/></td></tr><tr><td align="center" >Destination address:</td><td align="center" ><input type="text" id="Instandex_destaddr"/></td></tr><tr><td align="center" >Amount:</td><td align="center" ><input type="text" id="Instandex_amount"/></td></tr><tr><td align="center" > Exchange:</td><td align="center" ><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td colspan="2" align="center"> <button class="btn btn-primary instantdex_withdraw" >Withdraw</button></td></tr>';
$('#Instandex_form_table').html(html);
if(exchanges!==""){
$('#Instandex_exchange').html(exchanges);}
};
var set_order_status_table=function (){
var html='<tr><td> Order ID:</td><td><input type="text" id="Instandex_orderid"/></td></tr><tr><td> Exchange:</td><td><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td> <button class="btn btn-primary instantdex_order_status" >Check order status</button></td><td></td></tr>';
var html='<tr><td align="center" > Order ID:</td><td align="center" ><input type="text" id="Instandex_orderid"/></td></tr><tr><td align="center" > Exchange:</td><td align="center" ><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td colspan="2" align="center"> <button class="btn btn-primary instantdex_order_status" >Check order status</button></td></tr>';
$('#Instandex_form_table').html(html);
if(exchanges!==""){
$('#Instandex_exchange').html(exchanges);}
@ -314,7 +341,7 @@ var html='<tr><td> Order ID:</td><td><input type="text" id="Instandex_orderid"/
var set_open_order_table=function (){
var html='<tr><td> Exchange:</td><td><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td> <button class="btn btn-primary instantdex_open_orders" >Open orders</button></td><td></td></tr>';
var html='<tr><td align="center" > Exchange:</td><td align="center" ><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td colspan="2" align="center"> <button class="btn btn-primary instantdex_open_orders" >Open orders</button></td></tr>';
$('#Instandex_form_table').html(html);
if(exchanges!==""){
$('#Instandex_exchange').html(exchanges);}
@ -322,26 +349,34 @@ var html='<tr><td> Exchange:</td><td><select name="Instandex_exchange" id="Inst
var set_trade_history_table=function (){
var html='<tr><td> Exchange:</td><td><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td> <button class="btn btn-primary instantdex_trade_history" >See Trade History</button></td><td></td></tr>';
var html='<tr><td align="center" > Exchange:</td><td align="center" ><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td colspan="2" align="center"> <button class="btn btn-primary instantdex_trade_history" >See Trade History</button></td></tr>';
$('#Instandex_form_table').html(html);
if(exchanges!==""){
$('#Instandex_exchange').html(exchanges);}
};
var set_order_cancel_table=function (){
var html='<tr><td> Order ID:</td><td><input type="text" id="Instandex_orderid"/></td></tr><tr><td> Exchange:</td><td><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td> <button class="btn btn-primary instantdex_order_cancel" >Cancel order</button></td><td></td></tr>';
var html='<tr><td align="center" > Order ID:</td><td align="center" ><input type="text" id="Instandex_orderid"/></td></tr><tr><td align="center" > Exchange:</td><td align="center" ><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td colspan="2" align="center"> <button class="btn btn-primary instantdex_order_cancel" >Cancel order</button></td></tr>';
$('#Instandex_form_table').html(html);
if(exchanges!==""){
$('#Instandex_exchange').html(exchanges);}
};
var set_pollgap_table=function (){
var html='<tr><td> Pollgap:</td><td><input type="text" id="Instandex_pollgap"/></td></tr><tr><td> Exchange:</td><td><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td> <button class="btn btn-primary instantdex_pollgap" >Pollgap</button></td><td></td></tr>';
var html='<tr><td align="center" > Pollgap:</td><td align="center" ><input type="text" id="Instandex_pollgap"/></td></tr><tr><td align="center" > Exchange:</td><td align="center" ><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td colspan="2" align="center"> <button class="btn btn-primary instantdex_pollgap" >Pollgap</button></td></tr>';
$('#Instandex_form_table').html(html);
if(exchanges!==""){
$('#Instandex_exchange').html(exchanges);}
};
var set_allpair_table=function (){
var html='<tr><td align="center" > Exchange:</td><td align="center" ><select name="Instandex_exchange" id="Instandex_exchange"></select></td></tr><tr><td colspan="2" align="center"> <button class="btn btn-primary instantdex_allpairs" >Get allpairs</button></td></tr>';
$('#Instandex_form_table').html(html);
if(exchanges!==""){
$('#Instandex_exchange').html(exchanges);
}
};
var instantdex_set_method_table=function (method){
if(method==="apikeypair"){
@ -376,6 +411,12 @@ var instantdex_set_method_table=function (method){
else if(method==="pollgap"){
set_pollgap_table();
}
else if(method==="setuserid"){
set_setuserid_table();
}
else if(method==="allpairs"){
set_allpair_table();
}
else{
console.log("wrong method value");

2
iguana/js/widget.js

@ -10,7 +10,7 @@ widgetsManagement.createWidgets = function() {
var widget = widgets[key];
widget.innerHTML="";
widget.appendChild(iframeEL);
iframeEL.src="//127.0.0.1:7777/widgets?id="+widget.getAttribute("data-ref");
iframeEL.src="//127.0.0.1:7778/js/widgets?id="+widget.getAttribute("data-ref");
iframeEL.style.width="100%";
iframeEL.style.height="100%";
iframeEL.style.border="0";

6
iguana/main.c

@ -346,15 +346,15 @@ void iguana_main(void *arg)
category_init(&MYINFO);
if ( (coinargs= SuperNET_keysinit(&MYINFO,arg)) != 0 )
iguana_launch(iguana_coinadd("BTCD"),"iguana_coins",iguana_coins,coinargs,IGUANA_PERMTHREAD);
else if ( 0 )
else if ( 1 )
{
#ifdef __APPLE__
sleep(1);
char *str;
strcpy(MYINFO.rpcsymbol,"BTC");
strcpy(MYINFO.rpcsymbol,"BTCD");
iguana_launchcoin(MYINFO.rpcsymbol,cJSON_Parse("{}"));
if ( 0 && (str= SuperNET_JSON(&MYINFO,cJSON_Parse("{\"wallet\":\"password\",\"agent\":\"iguana\",\"method\":\"addcoin\",\"services\":128,\"maxpeers\":3,\"newcoin\":\"BTC\",\"active\":0}"),0)) != 0 )
if ( 0 && (str= SuperNET_JSON(&MYINFO,cJSON_Parse("{\"wallet\":\"password\",\"agent\":\"iguana\",\"method\":\"addcoin\",\"services\":128,\"maxpeers\":3,\"newcoin\":\"BTCD\",\"active\":0}"),0)) != 0 )
{
printf("got.(%s)\n",str);
free(str);

BIN
iguana/pnacl/Release/iguana.pexe

Binary file not shown.

19
iguana/tools/common.mk

@ -32,9 +32,12 @@ TOP_MAKE := $(word 1,$(MAKEFILE_LIST))
#
# Figure out which OS we are running on.
#
GETOS := python $(NACL_SDK_ROOT)/tools/getos.py
NACL_CONFIG := python $(NACL_SDK_ROOT)/tools/nacl_config.py
FIXDEPS := python $(NACL_SDK_ROOT)/tools/fix_deps.py -c
#GETOS := python $(NACL_SDK_ROOT)/tools/getos.py
#NACL_CONFIG := python $(NACL_SDK_ROOT)/tools/nacl_config.py
#FIXDEPS := python $(NACL_SDK_ROOT)/tools/fix_deps.py -c
GETOS := python tools/getos.py
NACL_CONFIG := python tools/nacl_config.py
FIXDEPS := python tools/fix_deps.py -c
OSNAME := $(shell $(GETOS))
@ -203,7 +206,7 @@ endif
#
# Compute path to requested NaCl Toolchain
#
TC_PATH := $(abspath $(NACL_SDK_ROOT)/../toolchain)
TC_PATH := $(abspath $(NACL_SDK_ROOT)/toolchain)
#
@ -260,8 +263,6 @@ clean:
$(RM) -f $(TARGET).nmf
$(RM) -rf $(OUTDIR)
$(RM) -rf user-data-dir
mkdir pnacl; mkdir pnacl/Release
cp Release/* nacl_io.stamp pnacl/Release;
#
@ -294,7 +295,6 @@ ifeq (,$(2))
else
+$(MAKE) -C $(2) STAMPDIR=$(abspath $(STAMPDIR)) $(abspath $(STAMPDIR)/$(1).stamp) $(3)
endif
cp pnacl/Release/*.pexe pnacl/Release/*.bc pnacl/Release/SuperNET_API.nmf Release
all: rebuild_$(1)
$(STAMPDIR)/$(1).stamp: rebuild_$(1)
@ -443,8 +443,7 @@ endif
# Variables for running examples with Chrome.
#
RUN_PY := python $(NACL_SDK_ROOT)/tools/run.py
#HTTPD_PY := python $(NACL_SDK_ROOT)/tools/httpd.py
HTTPD_PY := python tools/httpd.py
HTTPD_PY := python $(NACL_SDK_ROOT)/tools/httpd.py
# Add this to launch Chrome with additional environment variables defined.
# Each element should be specified as KEY=VALUE, with whitespace separating
@ -532,7 +531,7 @@ debug: check_for_chrome all $(PAGE)
.PHONY: serve
serve: all
echo run tools/httpd.py
$(HTTPD_PY) -C $(CURDIR)
endif
# uppercase aliases (for backward compatibility)

141
iguana/ugly.html

@ -1,141 +0,0 @@
<!DOCTYPE HTML><html> <head><title>SuperUGLY GUI></title></head> <body>
<form action="http://127.0.0.1:7778/api/SuperNET/help" oninput=""><b>SuperNET help</b> <textarea rows="0" cols="0"></textarea><output for=""></output><input type="submit" value="help"></form>
<form action="http://127.0.0.1:7778/api/SuperNET/html" oninput="agentform+htmlfile"><b>SuperNET html</b> agentform <textarea name="agentform" rows="1" cols="44" agentform></textarea><b></b> htmlfile <textarea name="htmlfile" rows="1" cols="44" htmlfile></textarea><output for="agentform htmlfile"></output><input type="submit" value="html"></form>
<form action="http://127.0.0.1:7778/api/SuperNET/bitcoinrpc" oninput="setcoin"><b>SuperNET bitcoinrpc</b> setcoin <textarea name="setcoin" rows="1" cols="44" setcoin></textarea><output for="setcoin"></output><input type="submit" value="bitcoinrpc"></form>
<form action="http://127.0.0.1:7778/api/SuperNET/DHT" oninput="hexmsg+destip+destpub+maxdelay+broadcast"><b>SuperNET DHT</b> hexmsg <textarea name="hexmsg" rows="1" cols="44" hexmsg></textarea><b></b> destip <textarea name="destip" rows="1" cols="44" destip></textarea><b></b> destpub <textarea name="destpub" rows="1" cols="65" destpub></textarea><b></b> maxdelay <textarea name="maxdelay" rows="1" cols="12" maxdelay></textarea><b></b> broadcast <textarea name="broadcast" rows="1" cols="12" broadcast></textarea><output for="hexmsg destip destpub maxdelay broadcast"></output><input type="submit" value="DHT"></form>
<form action="http://127.0.0.1:7778/api/SuperNET/rosetta" oninput="passphrase+pin+showprivkey"><b>SuperNET rosetta</b> passphrase <textarea name="passphrase" rows="1" cols="44" passphrase></textarea><b></b> pin <textarea name="pin" rows="1" cols="44" pin></textarea><b></b> showprivkey <textarea name="showprivkey" rows="1" cols="44" showprivkey></textarea><output for="passphrase pin showprivkey"></output><input type="submit" value="rosetta"></form>
<form action="http://127.0.0.1:7778/api/SuperNET/keypair" oninput=""><b>SuperNET keypair</b> <textarea rows="0" cols="0"></textarea><output for=""></output><input type="submit" value="keypair"></form>
<form action="http://127.0.0.1:7778/api/SuperNET/priv2pub" oninput="privkey"><b>SuperNET priv2pub</b> privkey <textarea name="privkey" rows="1" cols="65" privkey></textarea><output for="privkey"></output><input type="submit" value="priv2pub"></form>
<form action="http://127.0.0.1:7778/api/SuperNET/cipher" oninput="privkey+destpubkey+message"><b>SuperNET cipher</b> privkey <textarea name="privkey" rows="1" cols="65" privkey></textarea><b></b> destpubkey <textarea name="destpubkey" rows="1" cols="65" destpubkey></textarea><b></b> message <textarea name="message" rows="1" cols="0" message></textarea><output for="privkey destpubkey message"></output><input type="submit" value="cipher"></form>
<form action="http://127.0.0.1:7778/api/SuperNET/decipher" oninput="privkey+srcpubkey+cipherstr"><b>SuperNET decipher</b> privkey <textarea name="privkey" rows="1" cols="65" privkey></textarea><b></b> srcpubkey <textarea name="srcpubkey" rows="1" cols="65" srcpubkey></textarea><b></b> cipherstr <textarea name="cipherstr" rows="1" cols="0" cipherstr></textarea><output for="privkey srcpubkey cipherstr"></output><input type="submit" value="decipher"></form>
<form action="http://127.0.0.1:7778/api/SuperNET/broadcastcipher" oninput="message"><b>SuperNET broadcastcipher</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="broadcastcipher"></form>
<form action="http://127.0.0.1:7778/api/SuperNET/broadcastdecipher" oninput="message"><b>SuperNET broadcastdecipher</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="broadcastdecipher"></form>
<form action="http://127.0.0.1:7778/api/SuperNET/multicastcipher" oninput="pubkey+message"><b>SuperNET multicastcipher</b> pubkey <textarea name="pubkey" rows="1" cols="65" pubkey></textarea><b></b> message <textarea name="message" rows="1" cols="0" message></textarea><output for="pubkey message"></output><input type="submit" value="multicastcipher"></form>
<form action="http://127.0.0.1:7778/api/SuperNET/multicastdecipher" oninput="privkey+cipherstr"><b>SuperNET multicastdecipher</b> privkey <textarea name="privkey" rows="1" cols="65" privkey></textarea><b></b> cipherstr <textarea name="cipherstr" rows="1" cols="0" cipherstr></textarea><output for="privkey cipherstr"></output><input type="submit" value="multicastdecipher"></form>
<form action="http://127.0.0.1:7778/api/SuperNET/announce" oninput="category+subcategory+message"><b>SuperNET announce</b> category <textarea name="category" rows="1" cols="44" category></textarea><b></b> subcategory <textarea name="subcategory" rows="1" cols="44" subcategory></textarea><b></b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="category subcategory message"></output><input type="submit" value="announce"></form>
<form action="http://127.0.0.1:7778/api/SuperNET/survey" oninput="category+subcategory+message"><b>SuperNET survey</b> category <textarea name="category" rows="1" cols="44" category></textarea><b></b> subcategory <textarea name="subcategory" rows="1" cols="44" subcategory></textarea><b></b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="category subcategory message"></output><input type="submit" value="survey"></form>
<form action="http://127.0.0.1:7778/api/SuperNET/getpeers" oninput="activecoin"><b>SuperNET getpeers</b> activecoin <textarea name="activecoin" rows="1" cols="44" activecoin></textarea><output for="activecoin"></output><input type="submit" value="getpeers"></form>
<form action="http://127.0.0.1:7778/api/SuperNET/mypeers" oninput="supernet+rawpeers"><b>SuperNET mypeers</b> supernet <textarea name="supernet" rows="1" cols="0" supernet></textarea><b></b> rawpeers <textarea name="rawpeers" rows="1" cols="0" rawpeers></textarea><output for="supernet rawpeers"></output><input type="submit" value="mypeers"></form>
<form action="http://127.0.0.1:7778/api/SuperNET/stop" oninput=""><b>SuperNET stop</b> <textarea rows="0" cols="0"></textarea><output for=""></output><input type="submit" value="stop"></form>
<form action="http://127.0.0.1:7778/api/SuperNET/saveconf" oninput="wallethash+confjsonstr"><b>SuperNET saveconf</b> wallethash <textarea name="wallethash" rows="1" cols="65" wallethash></textarea><b></b> confjsonstr <textarea name="confjsonstr" rows="1" cols="0" confjsonstr></textarea><output for="wallethash confjsonstr"></output><input type="submit" value="saveconf"></form>
<form action="http://127.0.0.1:7778/api/SuperNET/layer" oninput="mypriv+otherpubs+str"><b>SuperNET layer</b> mypriv <textarea name="mypriv" rows="1" cols="65" mypriv></textarea><b></b> otherpubs <textarea name="otherpubs" rows="1" cols="0" otherpubs></textarea><b></b> str <textarea name="str" rows="1" cols="0" str></textarea><output for="mypriv otherpubs str"></output><input type="submit" value="layer"></form>
<form action="http://127.0.0.1:7778/api/pangea/newhand" oninput="senderind+args"><b>pangea newhand</b> senderind <textarea name="senderind" rows="1" cols="12" senderind></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="senderind args"></output><input type="submit" value="newhand"></form>
<form action="http://127.0.0.1:7778/api/pangea/ping" oninput="senderind+args"><b>pangea ping</b> senderind <textarea name="senderind" rows="1" cols="12" senderind></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="senderind args"></output><input type="submit" value="ping"></form>
<form action="http://127.0.0.1:7778/api/pangea/gotdeck" oninput="senderind+args"><b>pangea gotdeck</b> senderind <textarea name="senderind" rows="1" cols="12" senderind></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="senderind args"></output><input type="submit" value="gotdeck"></form>
<form action="http://127.0.0.1:7778/api/pangea/ready" oninput="senderind+args"><b>pangea ready</b> senderind <textarea name="senderind" rows="1" cols="12" senderind></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="senderind args"></output><input type="submit" value="ready"></form>
<form action="http://127.0.0.1:7778/api/pangea/encoded" oninput="senderind+args"><b>pangea encoded</b> senderind <textarea name="senderind" rows="1" cols="12" senderind></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="senderind args"></output><input type="submit" value="encoded"></form>
<form action="http://127.0.0.1:7778/api/pangea/final" oninput="senderind+args"><b>pangea final</b> senderind <textarea name="senderind" rows="1" cols="12" senderind></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="senderind args"></output><input type="submit" value="final"></form>
<form action="http://127.0.0.1:7778/api/pangea/addedfunds" oninput="senderind+args"><b>pangea addedfunds</b> senderind <textarea name="senderind" rows="1" cols="12" senderind></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="senderind args"></output><input type="submit" value="addedfunds"></form>
<form action="http://127.0.0.1:7778/api/pangea/preflop" oninput="senderind+args"><b>pangea preflop</b> senderind <textarea name="senderind" rows="1" cols="12" senderind></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="senderind args"></output><input type="submit" value="preflop"></form>
<form action="http://127.0.0.1:7778/api/pangea/decoded" oninput="senderind+args"><b>pangea decoded</b> senderind <textarea name="senderind" rows="1" cols="12" senderind></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="senderind args"></output><input type="submit" value="decoded"></form>
<form action="http://127.0.0.1:7778/api/pangea/card" oninput="senderind+args"><b>pangea card</b> senderind <textarea name="senderind" rows="1" cols="12" senderind></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="senderind args"></output><input type="submit" value="card"></form>
<form action="http://127.0.0.1:7778/api/pangea/facedown" oninput="senderind+args"><b>pangea facedown</b> senderind <textarea name="senderind" rows="1" cols="12" senderind></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="senderind args"></output><input type="submit" value="facedown"></form>
<form action="http://127.0.0.1:7778/api/pangea/faceup" oninput="senderind+args"><b>pangea faceup</b> senderind <textarea name="senderind" rows="1" cols="12" senderind></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="senderind args"></output><input type="submit" value="faceup"></form>
<form action="http://127.0.0.1:7778/api/pangea/turn" oninput="senderind+args"><b>pangea turn</b> senderind <textarea name="senderind" rows="1" cols="12" senderind></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="senderind args"></output><input type="submit" value="turn"></form>
<form action="http://127.0.0.1:7778/api/pangea/confirmturn" oninput="senderind+args"><b>pangea confirmturn</b> senderind <textarea name="senderind" rows="1" cols="12" senderind></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="senderind args"></output><input type="submit" value="confirmturn"></form>
<form action="http://127.0.0.1:7778/api/pangea/chat" oninput="senderind+args"><b>pangea chat</b> senderind <textarea name="senderind" rows="1" cols="12" senderind></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="senderind args"></output><input type="submit" value="chat"></form>
<form action="http://127.0.0.1:7778/api/pangea/action" oninput="senderind+args"><b>pangea action</b> senderind <textarea name="senderind" rows="1" cols="12" senderind></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="senderind args"></output><input type="submit" value="action"></form>
<form action="http://127.0.0.1:7778/api/pangea/showdown" oninput="senderind+args"><b>pangea showdown</b> senderind <textarea name="senderind" rows="1" cols="12" senderind></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="senderind args"></output><input type="submit" value="showdown"></form>
<form action="http://127.0.0.1:7778/api/pangea/handsummary" oninput="senderind+args"><b>pangea handsummary</b> senderind <textarea name="senderind" rows="1" cols="12" senderind></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="senderind args"></output><input type="submit" value="handsummary"></form>
<form action="http://127.0.0.1:7778/api/pangea/status" oninput="tableid+args"><b>pangea status</b> tableid <textarea name="tableid" rows="1" cols="24" tableid></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="tableid args"></output><input type="submit" value="status"></form>
<form action="http://127.0.0.1:7778/api/pangea/mode" oninput="tableid+args"><b>pangea mode</b> tableid <textarea name="tableid" rows="1" cols="24" tableid></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="tableid args"></output><input type="submit" value="mode"></form>
<form action="http://127.0.0.1:7778/api/pangea/buyin" oninput="tableid+args"><b>pangea buyin</b> tableid <textarea name="tableid" rows="1" cols="24" tableid></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="tableid args"></output><input type="submit" value="buyin"></form>
<form action="http://127.0.0.1:7778/api/pangea/history" oninput="tableid+args"><b>pangea history</b> tableid <textarea name="tableid" rows="1" cols="24" tableid></textarea><b></b> args <textarea name="args" rows="1" cols="0" args></textarea><output for="tableid args"></output><input type="submit" value="history"></form>
<form action="http://127.0.0.1:7778/api/iguana/peers" oninput="activecoin"><b>iguana peers</b> activecoin <textarea name="activecoin" rows="1" cols="44" activecoin></textarea><output for="activecoin"></output><input type="submit" value="peers"></form>
<form action="http://127.0.0.1:7778/api/iguana/maxpeers" oninput="activecoin+max"><b>iguana maxpeers</b> activecoin <textarea name="activecoin" rows="1" cols="44" activecoin></textarea><b></b> max <textarea name="max" rows="1" cols="12" max></textarea><output for="activecoin max"></output><input type="submit" value="maxpeers"></form>
<form action="http://127.0.0.1:7778/api/iguana/getconnectioncount" oninput="activecoin"><b>iguana getconnectioncount</b> activecoin <textarea name="activecoin" rows="1" cols="44" activecoin></textarea><output for="activecoin"></output><input type="submit" value="getconnectioncount"></form>
<form action="http://127.0.0.1:7778/api/iguana/addcoin" oninput="activecoin"><b>iguana addcoin</b> activecoin <textarea name="activecoin" rows="1" cols="44" activecoin></textarea><output for="activecoin"></output><input type="submit" value="addcoin"></form>
<form action="http://127.0.0.1:7778/api/iguana/startcoin" oninput="activecoin"><b>iguana startcoin</b> activecoin <textarea name="activecoin" rows="1" cols="44" activecoin></textarea><output for="activecoin"></output><input type="submit" value="startcoin"></form>
<form action="http://127.0.0.1:7778/api/iguana/pausecoin" oninput="activecoin"><b>iguana pausecoin</b> activecoin <textarea name="activecoin" rows="1" cols="44" activecoin></textarea><output for="activecoin"></output><input type="submit" value="pausecoin"></form>
<form action="http://127.0.0.1:7778/api/iguana/addnode" oninput="activecoin+ipaddr"><b>iguana addnode</b> activecoin <textarea name="activecoin" rows="1" cols="44" activecoin></textarea><b></b> ipaddr <textarea name="ipaddr" rows="1" cols="44" ipaddr></textarea><output for="activecoin ipaddr"></output><input type="submit" value="addnode"></form>
<form action="http://127.0.0.1:7778/api/iguana/removenode" oninput="activecoin+ipaddr"><b>iguana removenode</b> activecoin <textarea name="activecoin" rows="1" cols="44" activecoin></textarea><b></b> ipaddr <textarea name="ipaddr" rows="1" cols="44" ipaddr></textarea><output for="activecoin ipaddr"></output><input type="submit" value="removenode"></form>
<form action="http://127.0.0.1:7778/api/iguana/oneshot" oninput="activecoin+ipaddr"><b>iguana oneshot</b> activecoin <textarea name="activecoin" rows="1" cols="44" activecoin></textarea><b></b> ipaddr <textarea name="ipaddr" rows="1" cols="44" ipaddr></textarea><output for="activecoin ipaddr"></output><input type="submit" value="oneshot"></form>
<form action="http://127.0.0.1:7778/api/iguana/nodestatus" oninput="activecoin+ipaddr"><b>iguana nodestatus</b> activecoin <textarea name="activecoin" rows="1" cols="44" activecoin></textarea><b></b> ipaddr <textarea name="ipaddr" rows="1" cols="44" ipaddr></textarea><output for="activecoin ipaddr"></output><input type="submit" value="nodestatus"></form>
<form action="http://127.0.0.1:7778/api/ramchain/getinfo" oninput=""><b>ramchain getinfo</b> <textarea rows="0" cols="0"></textarea><output for=""></output><input type="submit" value="getinfo"></form>
<form action="http://127.0.0.1:7778/api/ramchain/getbestblockhash" oninput=""><b>ramchain getbestblockhash</b> <textarea rows="0" cols="0"></textarea><output for=""></output><input type="submit" value="getbestblockhash"></form>
<form action="http://127.0.0.1:7778/api/ramchain/getblockcount" oninput=""><b>ramchain getblockcount</b> <textarea rows="0" cols="0"></textarea><output for=""></output><input type="submit" value="getblockcount"></form>
<form action="http://127.0.0.1:7778/api/ramchain/listaddressgroupings" oninput=""><b>ramchain listaddressgroupings</b> <textarea rows="0" cols="0"></textarea><output for=""></output><input type="submit" value="listaddressgroupings"></form>
<form action="http://127.0.0.1:7778/api/ramchain/walletlock" oninput=""><b>ramchain walletlock</b> <textarea rows="0" cols="0"></textarea><output for=""></output><input type="submit" value="walletlock"></form>
<form action="http://127.0.0.1:7778/api/ramchain/checkwallet" oninput=""><b>ramchain checkwallet</b> <textarea rows="0" cols="0"></textarea><output for=""></output><input type="submit" value="checkwallet"></form>
<form action="http://127.0.0.1:7778/api/ramchain/repairwallet" oninput=""><b>ramchain repairwallet</b> <textarea rows="0" cols="0"></textarea><output for=""></output><input type="submit" value="repairwallet"></form>
<form action="http://127.0.0.1:7778/api/ramchain/makekeypair" oninput=""><b>ramchain makekeypair</b> <textarea rows="0" cols="0"></textarea><output for=""></output><input type="submit" value="makekeypair"></form>
<form action="http://127.0.0.1:7778/api/ramchain/gettxoutsetinfo" oninput=""><b>ramchain gettxoutsetinfo</b> <textarea rows="0" cols="0"></textarea><output for=""></output><input type="submit" value="gettxoutsetinfo"></form>
<form action="http://127.0.0.1:7778/api/ramchain/listlockunspent" oninput=""><b>ramchain listlockunspent</b> <textarea rows="0" cols="0"></textarea><output for=""></output><input type="submit" value="listlockunspent"></form>
<form action="http://127.0.0.1:7778/api/ramchain/getrawchangeaddress" oninput=""><b>ramchain getrawchangeaddress</b> <textarea rows="0" cols="0"></textarea><output for=""></output><input type="submit" value="getrawchangeaddress"></form>
<form action="http://127.0.0.1:7778/api/ramchain/listaccounts" oninput="minconf+includewatchonly"><b>ramchain listaccounts</b> minconf <textarea name="minconf" rows="1" cols="12" minconf></textarea><b></b> includewatchonly <textarea name="includewatchonly" rows="1" cols="12" includewatchonly></textarea><output for="minconf includewatchonly"></output><input type="submit" value="listaccounts"></form>
<form action="http://127.0.0.1:7778/api/ramchain/listreceivedbyaddress" oninput="minconf+includeempty+flag"><b>ramchain listreceivedbyaddress</b> minconf <textarea name="minconf" rows="1" cols="12" minconf></textarea><b></b> includeempty <textarea name="includeempty" rows="1" cols="12" includeempty></textarea><b></b> flag <textarea name="flag" rows="1" cols="12" flag></textarea><output for="minconf includeempty flag"></output><input type="submit" value="listreceivedbyaddress"></form>
<form action="http://127.0.0.1:7778/api/ramchain/listunspent" oninput="minconf+maxconf+array"><b>ramchain listunspent</b> minconf <textarea name="minconf" rows="1" cols="12" minconf></textarea><b></b> maxconf <textarea name="maxconf" rows="1" cols="12" maxconf></textarea><b></b> array <textarea name="array" rows="1" cols="0" array></textarea><output for="minconf maxconf array"></output><input type="submit" value="listunspent"></form>
<form action="http://127.0.0.1:7778/api/ramchain/dumpwallet" oninput="filename"><b>ramchain dumpwallet</b> filename <textarea name="filename" rows="1" cols="44" filename></textarea><output for="filename"></output><input type="submit" value="dumpwallet"></form>
<form action="http://127.0.0.1:7778/api/ramchain/backupwallet" oninput="filename"><b>ramchain backupwallet</b> filename <textarea name="filename" rows="1" cols="44" filename></textarea><output for="filename"></output><input type="submit" value="backupwallet"></form>
<form action="http://127.0.0.1:7778/api/ramchain/encryptwallet" oninput="passphrase"><b>ramchain encryptwallet</b> passphrase <textarea name="passphrase" rows="1" cols="44" passphrase></textarea><output for="passphrase"></output><input type="submit" value="encryptwallet"></form>
<form action="http://127.0.0.1:7778/api/ramchain/validatepubkey" oninput="pubkey"><b>ramchain validatepubkey</b> pubkey <textarea name="pubkey" rows="1" cols="44" pubkey></textarea><output for="pubkey"></output><input type="submit" value="validatepubkey"></form>
<form action="http://127.0.0.1:7778/api/ramchain/getnewaddress" oninput="account"><b>ramchain getnewaddress</b> account <textarea name="account" rows="1" cols="44" account></textarea><output for="account"></output><input type="submit" value="getnewaddress"></form>
<form action="http://127.0.0.1:7778/api/ramchain/vanitygen" oninput="vanity"><b>ramchain vanitygen</b> vanity <textarea name="vanity" rows="1" cols="44" vanity></textarea><output for="vanity"></output><input type="submit" value="vanitygen"></form>
<form action="http://127.0.0.1:7778/api/ramchain/getaddressesbyaccount" oninput="account"><b>ramchain getaddressesbyaccount</b> account <textarea name="account" rows="1" cols="44" account></textarea><output for="account"></output><input type="submit" value="getaddressesbyaccount"></form>
<form action="http://127.0.0.1:7778/api/ramchain/getaccount" oninput="address"><b>ramchain getaccount</b> address <textarea name="address" rows="1" cols="44" address></textarea><output for="address"></output><input type="submit" value="getaccount"></form>
<form action="http://127.0.0.1:7778/api/ramchain/getaccountaddress" oninput="account"><b>ramchain getaccountaddress</b> account <textarea name="account" rows="1" cols="44" account></textarea><output for="account"></output><input type="submit" value="getaccountaddress"></form>
<form action="http://127.0.0.1:7778/api/ramchain/dumpprivkey" oninput="address"><b>ramchain dumpprivkey</b> address <textarea name="address" rows="1" cols="44" address></textarea><output for="address"></output><input type="submit" value="dumpprivkey"></form>
<form action="http://127.0.0.1:7778/api/ramchain/importwallet" oninput="filename"><b>ramchain importwallet</b> filename <textarea name="filename" rows="1" cols="44" filename></textarea><output for="filename"></output><input type="submit" value="importwallet"></form>
<form action="http://127.0.0.1:7778/api/ramchain/decoderawtransaction" oninput="rawtx"><b>ramchain decoderawtransaction</b> rawtx <textarea name="rawtx" rows="1" cols="44" rawtx></textarea><output for="rawtx"></output><input type="submit" value="decoderawtransaction"></form>
<form action="http://127.0.0.1:7778/api/ramchain/decodescript" oninput="script"><b>ramchain decodescript</b> script <textarea name="script" rows="1" cols="44" script></textarea><output for="script"></output><input type="submit" value="decodescript"></form>
<form action="http://127.0.0.1:7778/api/ramchain/setaccount" oninput="address+account"><b>ramchain setaccount</b> address <textarea name="address" rows="1" cols="44" address></textarea><b></b> account <textarea name="account" rows="1" cols="44" account></textarea><output for="address account"></output><input type="submit" value="setaccount"></form>
<form action="http://127.0.0.1:7778/api/ramchain/walletpassphrasechange" oninput="oldpassphrase+newpassphrase"><b>ramchain walletpassphrasechange</b> oldpassphrase <textarea name="oldpassphrase" rows="1" cols="44" oldpassphrase></textarea><b></b> newpassphrase <textarea name="newpassphrase" rows="1" cols="44" newpassphrase></textarea><output for="oldpassphrase newpassphrase"></output><input type="submit" value="walletpassphrasechange"></form>
<form action="http://127.0.0.1:7778/api/ramchain/signmessage" oninput="address+message"><b>ramchain signmessage</b> address <textarea name="address" rows="1" cols="44" address></textarea><b></b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="address message"></output><input type="submit" value="signmessage"></form>
<form action="http://127.0.0.1:7778/api/ramchain/verifymessage" oninput="address+sig+message"><b>ramchain verifymessage</b> address <textarea name="address" rows="1" cols="44" address></textarea><b></b> sig <textarea name="sig" rows="1" cols="44" sig></textarea><b></b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="address sig message"></output><input type="submit" value="verifymessage"></form>
<form action="http://127.0.0.1:7778/api/ramchain/listreceivedbyaccount" oninput="confirmations+includeempty+watchonly"><b>ramchain listreceivedbyaccount</b> confirmations <textarea name="confirmations" rows="1" cols="12" confirmations></textarea><b></b> includeempty <textarea name="includeempty" rows="1" cols="12" includeempty></textarea><b></b> watchonly <textarea name="watchonly" rows="1" cols="12" watchonly></textarea><output for="confirmations includeempty watchonly"></output><input type="submit" value="listreceivedbyaccount"></form>
<form action="http://127.0.0.1:7778/api/ramchain/getbalance" oninput="confirmations+includeempty+watchonly"><b>ramchain getbalance</b> confirmations <textarea name="confirmations" rows="1" cols="12" confirmations></textarea><b></b> includeempty <textarea name="includeempty" rows="1" cols="12" includeempty></textarea><b></b> watchonly <textarea name="watchonly" rows="1" cols="12" watchonly></textarea><output for="confirmations includeempty watchonly"></output><input type="submit" value="getbalance"></form>
<form action="http://127.0.0.1:7778/api/ramchain/importprivkey" oninput="wif+account+rescan"><b>ramchain importprivkey</b> wif <textarea name="wif" rows="1" cols="44" wif></textarea><b></b> account <textarea name="account" rows="1" cols="44" account></textarea><b></b> rescan <textarea name="rescan" rows="1" cols="12" rescan></textarea><output for="wif account rescan"></output><input type="submit" value="importprivkey"></form>
<form action="http://127.0.0.1:7778/api/ramchain/getreceivedbyaccount" oninput="account+includeempty"><b>ramchain getreceivedbyaccount</b> account <textarea name="account" rows="1" cols="44" account></textarea><b></b> includeempty <textarea name="includeempty" rows="1" cols="12" includeempty></textarea><output for="account includeempty"></output><input type="submit" value="getreceivedbyaccount"></form>
<form action="http://127.0.0.1:7778/api/ramchain/walletpassphrase" oninput="passphrase+timeout"><b>ramchain walletpassphrase</b> passphrase <textarea name="passphrase" rows="1" cols="44" passphrase></textarea><b></b> timeout <textarea name="timeout" rows="1" cols="12" timeout></textarea><output for="passphrase timeout"></output><input type="submit" value="walletpassphrase"></form>
<form action="http://127.0.0.1:7778/api/ramchain/getreceivedbyaddress" oninput="address+minconf"><b>ramchain getreceivedbyaddress</b> address <textarea name="address" rows="1" cols="44" address></textarea><b></b> minconf <textarea name="minconf" rows="1" cols="12" minconf></textarea><output for="address minconf"></output><input type="submit" value="getreceivedbyaddress"></form>
<form action="http://127.0.0.1:7778/api/ramchain/sendrawtransaction" oninput="rawtx+allowhighfees"><b>ramchain sendrawtransaction</b> rawtx <textarea name="rawtx" rows="1" cols="44" rawtx></textarea><b></b> allowhighfees <textarea name="allowhighfees" rows="1" cols="12" allowhighfees></textarea><output for="rawtx allowhighfees"></output><input type="submit" value="sendrawtransaction"></form>
<form action="http://127.0.0.1:7778/api/ramchain/listsinceblock" oninput="blockhash+target+flag"><b>ramchain listsinceblock</b> blockhash <textarea name="blockhash" rows="1" cols="65" blockhash></textarea><b></b> target <textarea name="target" rows="1" cols="12" target></textarea><b></b> flag <textarea name="flag" rows="1" cols="12" flag></textarea><output for="blockhash target flag"></output><input type="submit" value="listsinceblock"></form>
<form action="http://127.0.0.1:7778/api/ramchain/getrawtransaction" oninput="txid+verbose"><b>ramchain getrawtransaction</b> txid <textarea name="txid" rows="1" cols="65" txid></textarea><b></b> verbose <textarea name="verbose" rows="1" cols="12" verbose></textarea><output for="txid verbose"></output><input type="submit" value="getrawtransaction"></form>
<form action="http://127.0.0.1:7778/api/ramchain/listtransactions" oninput="account+count+skip+includewatchonly"><b>ramchain listtransactions</b> account <textarea name="account" rows="1" cols="44" account></textarea><b></b> count <textarea name="count" rows="1" cols="12" count></textarea><b></b> skip <textarea name="skip" rows="1" cols="12" skip></textarea><b></b> includewatchonly <textarea name="includewatchonly" rows="1" cols="12" includewatchonly></textarea><output for="account count skip includewatchonly"></output><input type="submit" value="listtransactions"></form>
<form action="http://127.0.0.1:7778/api/ramchain/gettxout" oninput="txid+vout+mempool"><b>ramchain gettxout</b> txid <textarea name="txid" rows="1" cols="65" txid></textarea><b></b> vout <textarea name="vout" rows="1" cols="12" vout></textarea><b></b> mempool <textarea name="mempool" rows="1" cols="12" mempool></textarea><output for="txid vout mempool"></output><input type="submit" value="gettxout"></form>
<form action="http://127.0.0.1:7778/api/ramchain/settxfee" oninput="amount"><b>ramchain settxfee</b> amount <textarea name="amount" rows="1" cols="24" amount></textarea><output for="amount"></output><input type="submit" value="settxfee"></form>
<form action="http://127.0.0.1:7778/api/ramchain/lockunspent" oninput="flag+array"><b>ramchain lockunspent</b> flag <textarea name="flag" rows="1" cols="12" flag></textarea><b></b> array <textarea name="array" rows="1" cols="0" array></textarea><output for="flag array"></output><input type="submit" value="lockunspent"></form>
<form action="http://127.0.0.1:7778/api/ramchain/createmultisig" oninput="M+array+account"><b>ramchain createmultisig</b> M <textarea name="M" rows="1" cols="12" M></textarea><b></b> array <textarea name="array" rows="1" cols="0" array></textarea><b></b> account <textarea name="account" rows="1" cols="44" account></textarea><output for="M array account"></output><input type="submit" value="createmultisig"></form>
<form action="http://127.0.0.1:7778/api/ramchain/createrawtransaction" oninput="vins+vouts"><b>ramchain createrawtransaction</b> vins <textarea name="vins" rows="1" cols="0" vins></textarea><b></b> vouts <textarea name="vouts" rows="1" cols="0" vouts></textarea><output for="vins vouts"></output><input type="submit" value="createrawtransaction"></form>
<form action="http://127.0.0.1:7778/api/ramchain/signrawtransaction" oninput="rawtx+vins+privkeys"><b>ramchain signrawtransaction</b> rawtx <textarea name="rawtx" rows="1" cols="44" rawtx></textarea><b></b> vins <textarea name="vins" rows="1" cols="0" vins></textarea><b></b> privkeys <textarea name="privkeys" rows="1" cols="0" privkeys></textarea><output for="rawtx vins privkeys"></output><input type="submit" value="signrawtransaction"></form>
<form action="http://127.0.0.1:7778/api/ramchain/move" oninput="fromaccount+toaccount+amount+minconf+comment"><b>ramchain move</b> fromaccount <textarea name="fromaccount" rows="1" cols="44" fromaccount></textarea><b></b> toaccount <textarea name="toaccount" rows="1" cols="44" toaccount></textarea><b></b> amount <textarea name="amount" rows="1" cols="24" amount></textarea><b></b> minconf <textarea name="minconf" rows="1" cols="12" minconf></textarea><b></b> comment <textarea name="comment" rows="1" cols="44" comment></textarea><output for="fromaccount toaccount amount minconf comment"></output><input type="submit" value="move"></form>
<form action="http://127.0.0.1:7778/api/ramchain/sendfrom" oninput="fromaccount+toaddress+amount+minconf+comment+comment2"><b>ramchain sendfrom</b> fromaccount <textarea name="fromaccount" rows="1" cols="44" fromaccount></textarea><b></b> toaddress <textarea name="toaddress" rows="1" cols="44" toaddress></textarea><b></b> amount <textarea name="amount" rows="1" cols="24" amount></textarea><b></b> minconf <textarea name="minconf" rows="1" cols="12" minconf></textarea><b></b> comment <textarea name="comment" rows="1" cols="44" comment></textarea><b></b> comment2 <textarea name="comment2" rows="1" cols="44" comment2></textarea><output for="fromaccount toaddress amount minconf comment comment2"></output><input type="submit" value="sendfrom"></form>
<form action="http://127.0.0.1:7778/api/ramchain/sendmany" oninput="fromaccount+array+minconf+comment"><b>ramchain sendmany</b> fromaccount <textarea name="fromaccount" rows="1" cols="44" fromaccount></textarea><b></b> array <textarea name="array" rows="1" cols="0" array></textarea><b></b> minconf <textarea name="minconf" rows="1" cols="12" minconf></textarea><b></b> comment <textarea name="comment" rows="1" cols="44" comment></textarea><output for="fromaccount array minconf comment"></output><input type="submit" value="sendmany"></form>
<form action="http://127.0.0.1:7778/api/ramchain/sendtoaddress" oninput="address+amount+comment+comment2"><b>ramchain sendtoaddress</b> address <textarea name="address" rows="1" cols="44" address></textarea><b></b> amount <textarea name="amount" rows="1" cols="24" amount></textarea><b></b> comment <textarea name="comment" rows="1" cols="44" comment></textarea><b></b> comment2 <textarea name="comment2" rows="1" cols="44" comment2></textarea><output for="address amount comment comment2"></output><input type="submit" value="sendtoaddress"></form>
<form action="http://127.0.0.1:7778/api/hash/curve25519_pair" oninput="element+scalar"><b>hash curve25519_pair</b> element <textarea name="element" rows="1" cols="65" element></textarea><b></b> scalar <textarea name="scalar" rows="1" cols="65" scalar></textarea><output for="element scalar"></output><input type="submit" value="curve25519_pair"></form>
<form action="http://127.0.0.1:7778/api/hash/NXT" oninput="passphrase"><b>hash NXT</b> passphrase <textarea name="passphrase" rows="1" cols="44" passphrase></textarea><output for="passphrase"></output><input type="submit" value="NXT"></form>
<form action="http://127.0.0.1:7778/api/hash/curve25519" oninput="pubkey"><b>hash curve25519</b> pubkey <textarea name="pubkey" rows="1" cols="44" pubkey></textarea><output for="pubkey"></output><input type="submit" value="curve25519"></form>
<form action="http://127.0.0.1:7778/api/hash/crc32" oninput="message"><b>hash crc32</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="crc32"></form>
<form action="http://127.0.0.1:7778/api/hash/base64_encode" oninput="message"><b>hash base64_encode</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="base64_encode"></form>
<form action="http://127.0.0.1:7778/api/hash/base64_decode" oninput="message"><b>hash base64_decode</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="base64_decode"></form>
<form action="http://127.0.0.1:7778/api/hash/rmd160_sha256" oninput="message"><b>hash rmd160_sha256</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="rmd160_sha256"></form>
<form action="http://127.0.0.1:7778/api/hash/sha256_sha256" oninput="message"><b>hash sha256_sha256</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="sha256_sha256"></form>
<form action="http://127.0.0.1:7778/api/hash/sha224" oninput="message"><b>hash sha224</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="sha224"></form>
<form action="http://127.0.0.1:7778/api/hash/sha256" oninput="message"><b>hash sha256</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="sha256"></form>
<form action="http://127.0.0.1:7778/api/hash/sha384" oninput="message"><b>hash sha384</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="sha384"></form>
<form action="http://127.0.0.1:7778/api/hash/sha512" oninput="message"><b>hash sha512</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="sha512"></form>
<form action="http://127.0.0.1:7778/api/hash/rmd128" oninput="message"><b>hash rmd128</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="rmd128"></form>
<form action="http://127.0.0.1:7778/api/hash/rmd160" oninput="message"><b>hash rmd160</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="rmd160"></form>
<form action="http://127.0.0.1:7778/api/hash/rmd256" oninput="message"><b>hash rmd256</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="rmd256"></form>
<form action="http://127.0.0.1:7778/api/hash/rmd320" oninput="message"><b>hash rmd320</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="rmd320"></form>
<form action="http://127.0.0.1:7778/api/hash/sha1" oninput="message"><b>hash sha1</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="sha1"></form>
<form action="http://127.0.0.1:7778/api/hash/md2" oninput="message"><b>hash md2</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="md2"></form>
<form action="http://127.0.0.1:7778/api/hash/md4" oninput="message"><b>hash md4</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="md4"></form>
<form action="http://127.0.0.1:7778/api/hash/md5" oninput="message"><b>hash md5</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="md5"></form>
<form action="http://127.0.0.1:7778/api/hash/tiger" oninput="message"><b>hash tiger</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="tiger"></form>
<form action="http://127.0.0.1:7778/api/hash/whirlpool" oninput="message"><b>hash whirlpool</b> message <textarea name="message" rows="1" cols="44" message></textarea><output for="message"></output><input type="submit" value="whirlpool"></form>
<form action="http://127.0.0.1:7778/api/hmac/sha224" oninput="message+passphrase"><b>hmac sha224</b> message <textarea name="message" rows="1" cols="44" message></textarea><b></b> passphrase <textarea name="passphrase" rows="1" cols="44" passphrase></textarea><output for="message passphrase"></output><input type="submit" value="sha224"></form>
<form action="http://127.0.0.1:7778/api/hmac/sha256" oninput="message+passphrase"><b>hmac sha256</b> message <textarea name="message" rows="1" cols="44" message></textarea><b></b> passphrase <textarea name="passphrase" rows="1" cols="44" passphrase></textarea><output for="message passphrase"></output><input type="submit" value="sha256"></form>
<form action="http://127.0.0.1:7778/api/hmac/sha384" oninput="message+passphrase"><b>hmac sha384</b> message <textarea name="message" rows="1" cols="44" message></textarea><b></b> passphrase <textarea name="passphrase" rows="1" cols="44" passphrase></textarea><output for="message passphrase"></output><input type="submit" value="sha384"></form>
<form action="http://127.0.0.1:7778/api/hmac/sha512" oninput="message+passphrase"><b>hmac sha512</b> message <textarea name="message" rows="1" cols="44" message></textarea><b></b> passphrase <textarea name="passphrase" rows="1" cols="44" passphrase></textarea><output for="message passphrase"></output><input type="submit" value="sha512"></form>
<form action="http://127.0.0.1:7778/api/hmac/rmd128" oninput="message+passphrase"><b>hmac rmd128</b> message <textarea name="message" rows="1" cols="44" message></textarea><b></b> passphrase <textarea name="passphrase" rows="1" cols="44" passphrase></textarea><output for="message passphrase"></output><input type="submit" value="rmd128"></form>
<form action="http://127.0.0.1:7778/api/hmac/rmd160" oninput="message+passphrase"><b>hmac rmd160</b> message <textarea name="message" rows="1" cols="44" message></textarea><b></b> passphrase <textarea name="passphrase" rows="1" cols="44" passphrase></textarea><output for="message passphrase"></output><input type="submit" value="rmd160"></form>
<form action="http://127.0.0.1:7778/api/hmac/rmd256" oninput="message+passphrase"><b>hmac rmd256</b> message <textarea name="message" rows="1" cols="44" message></textarea><b></b> passphrase <textarea name="passphrase" rows="1" cols="44" passphrase></textarea><output for="message passphrase"></output><input type="submit" value="rmd256"></form>
<form action="http://127.0.0.1:7778/api/hmac/rmd320" oninput="message+passphrase"><b>hmac rmd320</b> message <textarea name="message" rows="1" cols="44" message></textarea><b></b> passphrase <textarea name="passphrase" rows="1" cols="44" passphrase></textarea><output for="message passphrase"></output><input type="submit" value="rmd320"></form>
<form action="http://127.0.0.1:7778/api/hmac/sha1" oninput="message+passphrase"><b>hmac sha1</b> message <textarea name="message" rows="1" cols="44" message></textarea><b></b> passphrase <textarea name="passphrase" rows="1" cols="44" passphrase></textarea><output for="message passphrase"></output><input type="submit" value="sha1"></form>
<form action="http://127.0.0.1:7778/api/hmac/md2" oninput="message+passphrase"><b>hmac md2</b> message <textarea name="message" rows="1" cols="44" message></textarea><b></b> passphrase <textarea name="passphrase" rows="1" cols="44" passphrase></textarea><output for="message passphrase"></output><input type="submit" value="md2"></form>
<form action="http://127.0.0.1:7778/api/hmac/md4" oninput="message+passphrase"><b>hmac md4</b> message <textarea name="message" rows="1" cols="44" message></textarea><b></b> passphrase <textarea name="passphrase" rows="1" cols="44" passphrase></textarea><output for="message passphrase"></output><input type="submit" value="md4"></form>
<form action="http://127.0.0.1:7778/api/hmac/md5" oninput="message+passphrase"><b>hmac md5</b> message <textarea name="message" rows="1" cols="44" message></textarea><b></b> passphrase <textarea name="passphrase" rows="1" cols="44" passphrase></textarea><output for="message passphrase"></output><input type="submit" value="md5"></form>
<form action="http://127.0.0.1:7778/api/hmac/tiger" oninput="message+passphrase"><b>hmac tiger</b> message <textarea name="message" rows="1" cols="44" message></textarea><b></b> passphrase <textarea name="passphrase" rows="1" cols="44" passphrase></textarea><output for="message passphrase"></output><input type="submit" value="tiger"></form>
<form action="http://127.0.0.1:7778/api/hmac/whirlpool" oninput="message+passphrase"><b>hmac whirlpool</b> message <textarea name="message" rows="1" cols="44" message></textarea><b></b> passphrase <textarea name="passphrase" rows="1" cols="44" passphrase></textarea><output for="message passphrase"></output><input type="submit" value="whirlpool"></form>
<br><br/></body></html><br><br/>

2
iguana/widget-demo.html

@ -2,6 +2,6 @@
<head><title>Widget Example</title></head>
<body>
<div class="iguana-widget" style="width: 1000px; height:1000px;" data-ref="123456">iguana widget is loading...</div>
<script type="text/javascript" src="http://127.0.0.1:7777/js/widget.js"></script>
<script type="text/javascript" src="http://127.0.0.1:7778/js/widget.js"></script>
</body>
</html>

19
includes/iguana_apideclares.h

@ -14,8 +14,16 @@
******************************************************************************/
STRING_ARG(SuperNET,bitcoinrpc,setcoin);
HASH_AND_STRING(ramchain,verifytx,txid,txbytes);
ZERO_ARGS(SuperNET,myipaddr);
STRING_ARG(SuperNET,setmyipaddr,ipaddr);
TWO_STRINGS_AND_TWO_DOUBLES(InstantDEX,BTCoffer,othercoin,otherassetid,maxprice,othervolume);
TWO_STRINGS_AND_TWO_DOUBLES(InstantDEX,minaccept,base,rel,minprice,basevolume);
TWO_STRINGS_AND_TWO_DOUBLES(InstantDEX,maxaccept,base,rel,maxprice,basevolume);
STRING_AND_TWO_DOUBLES(InstantDEX,ALToffer,basecoin,minprice,basevolume);
STRING_AND_TWO_DOUBLES(InstantDEX,NXToffer,assetid,minprice,basevolume);
HASH_AND_STRING(ramchain,verifytx,txid,txbytes);
INT_ARG(ramchain,getblockhash,height);
HASH_AND_INT(ramchain,getblock,blockhash,remoteonly);
HASH_AND_INT(ramchain,getrawtransaction,txid,verbose);
@ -44,10 +52,9 @@ STRING_AND_INT(InstantDEX,pollgap,exchange,pollgap);
ZERO_ARGS(InstantDEX,allexchanges);
STRING_ARG(InstantDEX,allpairs,exchange);
THREE_STRINGS_AND_DOUBLE(InstantDEX,request,reference,base,rel,volume);
TWOSTRINGS_AND_TWOHASHES_AND_TWOINTS(InstantDEX,proposal,reference,message,basetxid,reltxid,duration,flags);
TWOSTRINGS_AND_TWOHASHES_AND_TWOINTS(InstantDEX,accept,reference,message,basetxid,reltxid,duration,flags);
TWOSTRINGS_AND_TWOHASHES_AND_TWOINTS(InstantDEX,confirm,reference,message,basetxid,reltxid,baseheight,relheight);
//TWOSTRINGS_AND_TWOHASHES_AND_TWOINTS(InstantDEX,proposal,reference,message,basetxid,reltxid,duration,flags);
//TWOSTRINGS_AND_TWOHASHES_AND_TWOINTS(InstantDEX,accept,reference,message,basetxid,reltxid,duration,flags);
//TWOSTRINGS_AND_TWOHASHES_AND_TWOINTS(InstantDEX,confirm,reference,message,basetxid,reltxid,baseheight,relheight);
THREE_STRINGS_AND_DOUBLE(tradebot,monitor,exchange,base,rel,commission);
STRING_AND_DOUBLE(tradebot,monitorall,exchange,commission);
@ -85,7 +92,7 @@ TWOSTRINGS_AND_TWOHASHES_AND_TWOINTS(SuperNET,DHT,hexmsg,destip,categoryhash,sub
THREE_STRINGS(SuperNET,rosetta,passphrase,pin,showprivkey);
ZERO_ARGS(SuperNET,keypair);
HASH_ARG(SuperNET,priv2pub,privkey);
HASH_AND_INT(SuperNET,priv2pub,privkey,addrtype);
STRING_ARG(SuperNET,wif2priv,wif);
TWOHASHES_AND_STRING(SuperNET,cipher,privkey,destpubkey,message);

4
includes/iguana_apidefs.h

@ -22,9 +22,11 @@
#define IGUANA_CFUNC_SSI(agent,name,str,str2,val) char *agent ## _ ## name(IGUANA_ARGS,char *str,char *str2,int32_t val)
#define IGUANA_CFUNC_SSH(agent,name,str,str2,hash) char *agent ## _ ## name(IGUANA_ARGS,char *str,char *str2,bits256 hash)
#define IGUANA_CFUNC_SSHI(agent,name,str,str2,hash,val) char *agent ## _ ## name(IGUANA_ARGS,char *str,char *str2,bits256 hash,int32_t val)
#define IGUANA_CFUNC_SSDD(agent,name,str,str2,val,val2) char *agent ## _ ## name(IGUANA_ARGS,char *str,char *str2,double val,double val2)
#define IGUANA_CFUNC_SSHII(agent,name,str,str2,hash,val,val2) char *agent ## _ ## name(IGUANA_ARGS,char *str,char *str2,bits256 hash,int32_t val,int32_t val2)
#define IGUANA_CFUNC_SSHHII(agent,name,str,str2,hash,hash2,val,val2) char *agent ## _ ## name(IGUANA_ARGS,char *str,char *str2,bits256 hash,bits256 hash2,int32_t val,int32_t val2)
#define IGUANA_CFUNC_SSS(agent,name,str,str2,str3) char *agent ## _ ## name(IGUANA_ARGS,char *str,char *str2,char *str3)
#define IGUANA_CFUNC_SDD(agent,name,str,val,val2) char *agent ## _ ## name(IGUANA_ARGS,char *str,double val,double val2)
#define IGUANA_CFUNC_SSSS(agent,name,str,str2,str3,str4) char *agent ## _ ## name(IGUANA_ARGS,char *str,char *str2,char *str3,char *str4)
#define IGUANA_CFUNC_SSSD(agent,name,str,str2,str3,val) char *agent ## _ ## name(IGUANA_ARGS,char *str,char *str2,char *str3,double val)
#define IGUANA_CFUNC_SSSDDD(agent,name,str,str2,str3,val,val2,val3) char *agent ## _ ## name(IGUANA_ARGS,char *str,char *str2,char *str3,double val,double val2,double val3)
@ -86,3 +88,5 @@
#define THREE_STRINGS_AND_THREE_INTS IGUANA_CFUNC_SSSIII
#define THREE_STRINGS_AND_THREE_DOUBLES IGUANA_CFUNC_SSSDDD
#define THREE_STRINGS_AND_DOUBLE IGUANA_CFUNC_SSSD
#define TWO_STRINGS_AND_TWO_DOUBLES IGUANA_CFUNC_SSDD
#define STRING_AND_TWO_DOUBLES IGUANA_CFUNC_SDD

2
includes/iguana_apiundefs.h

@ -38,6 +38,8 @@
#undef THREE_STRINGS_AND_DOUBLE
#undef STRING_AND_DOUBLE
#undef FOUR_STRINGS
#undef TWO_STRINGS_AND_TWO_DOUBLES
#undef STRING_AND_TWO_DOUBLES
#undef IGUANA_ARGS
#undef IGUANA_CALLARGS

10
pnacl_main.h

@ -187,20 +187,26 @@ void PostMessage(const char* format, ...)
*/
static int ParseMessage(struct PP_Var message,const char **out_function,struct PP_Var *out_params)
{
char *jsonstr;
char *jsonstr=0;
if ( message.type != PP_VARTYPE_DICTIONARY )
{
PNACL_message("illegal message.%d != %d\n",message.type,PP_VARTYPE_DICTIONARY);
return(1);
}
struct PP_Var cmd_value = GetDictVar(message, "cmd");
*out_function = VarToCStr(cmd_value);
g_ppb_var->Release(cmd_value);
*out_params = GetDictVar(message, "args");
if ( (jsonstr= (char *)VarToCStr(*out_params)) != 0 )
jsonstr = (char *)VarToCStr(*out_params);
PNACL_message("Parse.(%s) cmd.(%s) cmdtype.%d out.%d\n",*out_function,jsonstr!=0?jsonstr:"null",cmd_value.type,out_params->type);
if ( jsonstr != 0 )
{
PNACL_message("Parse.(%s) cmd.(%s)\n",*out_function,jsonstr);
if ( cmd_value.type != PP_VARTYPE_STRING )
return(1);
if ( out_params->type != PP_VARTYPE_ARRAY )
return(1);
return(0);
} else return(1);
}

19
tools/common.mk

@ -32,9 +32,12 @@ TOP_MAKE := $(word 1,$(MAKEFILE_LIST))
#
# Figure out which OS we are running on.
#
GETOS := python $(NACL_SDK_ROOT)/tools/getos.py
NACL_CONFIG := python $(NACL_SDK_ROOT)/tools/nacl_config.py
FIXDEPS := python $(NACL_SDK_ROOT)/tools/fix_deps.py -c
#GETOS := python $(NACL_SDK_ROOT)/tools/getos.py
#NACL_CONFIG := python $(NACL_SDK_ROOT)/tools/nacl_config.py
#FIXDEPS := python $(NACL_SDK_ROOT)/tools/fix_deps.py -c
GETOS := python tools/getos.py
NACL_CONFIG := python tools/nacl_config.py
FIXDEPS := python tools/fix_deps.py -c
OSNAME := $(shell $(GETOS))
@ -203,7 +206,7 @@ endif
#
# Compute path to requested NaCl Toolchain
#
TC_PATH := $(abspath $(NACL_SDK_ROOT)/../toolchain)
TC_PATH := $(abspath $(NACL_SDK_ROOT)/toolchain)
#
@ -260,8 +263,6 @@ clean:
$(RM) -f $(TARGET).nmf
$(RM) -rf $(OUTDIR)
$(RM) -rf user-data-dir
mkdir pnacl; mkdir pnacl/Release
cp Release/* nacl_io.stamp pnacl/Release;
#
@ -294,7 +295,6 @@ ifeq (,$(2))
else
+$(MAKE) -C $(2) STAMPDIR=$(abspath $(STAMPDIR)) $(abspath $(STAMPDIR)/$(1).stamp) $(3)
endif
cp pnacl/Release/*.pexe pnacl/Release/*.bc pnacl/Release/SuperNET_API.nmf Release
all: rebuild_$(1)
$(STAMPDIR)/$(1).stamp: rebuild_$(1)
@ -443,8 +443,7 @@ endif
# Variables for running examples with Chrome.
#
RUN_PY := python $(NACL_SDK_ROOT)/tools/run.py
#HTTPD_PY := python $(NACL_SDK_ROOT)/tools/httpd.py
HTTPD_PY := python tools/httpd.py
HTTPD_PY := python $(NACL_SDK_ROOT)/tools/httpd.py
# Add this to launch Chrome with additional environment variables defined.
# Each element should be specified as KEY=VALUE, with whitespace separating
@ -532,7 +531,7 @@ debug: check_for_chrome all $(PAGE)
.PHONY: serve
serve: all
echo run tools/httpd.py
$(HTTPD_PY) -C $(CURDIR)
endif
# uppercase aliases (for backward compatibility)

Loading…
Cancel
Save