tera/Source/HTML/wallet.html

2083 lines
73 KiB
HTML

<!DOCTYPE HTML>
<html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>TERA</title>
<link rel="shortcut icon" href="/HTML/PIC/wallet.png" type="image/png">
<link rel="stylesheet" type="text/css" href="../HTML/CSS/style.css">
<link rel="stylesheet" type="text/css" href="../HTML/CSS/wallet.css">
<link rel="stylesheet" type="text/css" href="../HTML/CSS/buttons.css">
</head>
<script>
window.RUN_CLIENT=1;
window.RUN_SERVER=0;
if(typeof global === 'object')
{
global.RUN_CLIENT=1;
global.RUN_SERVER=0;
}
</script>
<script type="text/javascript" src="/HTML/JS/coinlib.js"></script>
<script type="text/javascript" src="../HTML/JS/client.js"></script>
<script type="text/javascript" src="../HTML/JS/sha3.js"></script>
<script type="text/javascript" src="../HTML/JS/crypto-client.js"></script>
<script type="text/javascript" src="/HTML/JS/wallet-lib.js"></script>
<script type="text/javascript" src="/HTML/JS/wallet-node.js"></script>
<script type="text/javascript" src="/HTML/JS/terahashlib.js"></script>
<script>
var WasInitCurrency=0;
var CONFIG_DATA={}; CONFIG_DATA.CONSTANTS={};
var ServerBlockNumDB=0;
var ServerCurBlockNum=0;
var ServerTime=0;
var MiningAccount=0;
//var min_power_pow_acc_create=0;
var WalletStatus;
var BLOCK_PROCESSING_LENGTH=8;
var PubKeyStr;
var PrivKeyStr;
var WalletOpen;
var INTERNET_IP_FROM_STUN;
var SERVER_IP;
var SERVER_PORT;
var CurTabName;
var TabArr=[{name:"TabAccounts",log:1},{name:"TabSend",log:1},{name:"TabDapps"},{name:"TabExplorer"}];
var SaveIdArr=["idAccount","idTo","idSumSend","idDescription","idSelStyle",
"idViewAccountNum","idViewBlockNum","idViewActNum","idViewHashNum","idViewDappNum",
"idRunText","idViewAccountFilter",
"idBlockCount","idPeriodAutoCheckPoint","idDeltaPow"];
var MaxAccID=0;
var MaxDappsID=0;
var MaxActNum=0;
var HistoryMaxNum=0;
var idPercentItem;
var WasSetRestart=0;
</script>
<script>
/*User action User action User action User action User action User action User action User action User action */
//CONFIG
//CONFIG
//CONFIG
function IsPrivateMode()
{
if(PrivKeyStr && PrivKeyStr.length===64 && PrivKeyStr!=="0000000000000000000000000000000000000000000000000000000000000000")
return true;
else
return false;
}
function NewPrivateKey()
{
var arr = new Uint8Array(32);
window.crypto.getRandomValues(arr);
var Str=GetHexFromArr(sha3(arr));
document.getElementById("idKeyNew").value=Str;
SetVisibleEditKeys(1);
var Select=document.getElementById("idTypeKey");
Select.value="private";
SetVisibleItemByTypeKey();
}
function EditPrivateKey()
{
if(!IsVisibleBlock("edit_keys"))
{
var Select=document.getElementById("idTypeKey");
if(IsPrivateMode())
{
document.getElementById("idKeyNew").value=PrivKeyStr;
Select.value="private";
}
else
{
document.getElementById("idKeyNew").value=PubKeyStr;
Select.value="public";
}
SetVisibleEditKeys(1);
}
else
{
CancelSavePrivateKey();
}
}
function ConvertToPrivateKey()
{
var Str=document.getElementById("idKeyNew").value;
if(!Str || Str.length<20)
{
SetError("Enter secret words that are at least 20 characters long");
return;
}
var Str2=document.getElementById("idKeyNew2").value;
if(Str2 && Str!==Str2)
{
SetError("Re-entered secret does not match");
return;
}
document.getElementById("idTypeKey").value="private";
SetVisibleItemByTypeKey();
document.getElementById("idKeyNew").value=GetPrivateKeyFromStr(Str);
document.getElementById("idKeyNew2").value="";
}
function GetPrivateKeyFromStr(Str)
{
var StrHex=sha3_str(Str);
for(var i=0;i<100000;i++)
StrHex=sha3_str(StrHex);
return StrHex.toUpperCase();
}
function CancelSavePrivateKey()
{
SetVisibleEditKeys(0);
}
//ACCOUNTS
//ACCOUNTS
//ACCOUNTS
function FindMyAccounts()
{
GetData("FindMyAccounts",{},function (Data)
{
WasAccountsDataStr="";
UpdatesData();
});
}
function ViewNewAccount()
{
var name="idAccountEdit";
if(IsVisibleBlock(name))
{
SetVisibleBlock(name,false);
}
else
{
SetVisibleBlock(name,true);
$("idAccountName").focus();
var Select=document.getElementById("idAccount");
SetViewWN();
}
}
function SetViewWN()
{
document.getElementById("Item.WN").innerText="";
SetVisibleBlock("Item.WN","none");
}
function CancelCreateAccount()
{
var name="idAccountEdit";
SetVisibleBlock(name,false)
}
var WasCreateAccountInfo;
function CreateAccount(bAddToPay)
{
if(!CanSendTransaction)
{
SetError("Can't Send transaction");
return;
}
WasCreateAccountInfo=PubKeyStr;
var Description=document.getElementById("idAccountName").value;
var Adviser=0;//ParseNum(document.getElementById("idAdviser").value);
var Smart=ParseNum(document.getElementById("idSmart").value);
var Currency=ParseNum(document.getElementById("idCurrency").value);
var WN=ParseNum(document.getElementById("idWN").value);
if(!Description)
{
SetError("Enter the account name.");
return;
}
if(WN)
{
GetData("GetAccountKey",WN,function (Data)
{
if(Data && Data.result===1)
{
SendTrCreateAcc(Currency,Data.PubKeyStr,Description,Adviser,Smart,1,bAddToPay);
}
});
}
else
{
SendTrCreateAcc(Currency,PubKeyStr,Description,Adviser,Smart,0,bAddToPay);
}
}
function SetVisibleEditKeys(bSet)
{
SetVisibleBlock("edit_keys",bSet);
if(bSet)
{
SetVisibleItemByTypeKey();
document.getElementById("idKeyNew").focus();
}
}
function SelectTypeKey()
{
var Select=document.getElementById("idTypeKey");
var Item=document.getElementById("idKeyNew");
var Item2=document.getElementById("idKeyNew2");
if(Select.value==="public" && (Item.value.length!==66 || Item.value.substr(0,1)!=="0"))
{
Item.value="";
Item2.value="";
}
else
if(Select.value==="private" && Item.value===PubKeyStr)
{
Item.value="";
Item2.value="";
}
else
if(Select.value==="brain" && Item.value.length>=64 && IsHexStr(Item.value))
{
Item.value="";
Item2.value="";
}
SetVisibleItemByTypeKey();
}
function SetVisibleItemByTypeKey()
{
var Select=document.getElementById("idTypeKey");
if(Select.value==="brain")
{
SetVisibleBlock("idViewKeyNew2","table-row");
SetVisibleBlock("idBtConvertKey","inline-block");
SetVisibleBlock("idBtSaveKey",false);
}
else
{
SetVisibleBlock("idViewKeyNew2","none");
SetVisibleBlock("idBtConvertKey",false);
SetVisibleBlock("idBtSaveKey","inline-block");
}
}
//SEND
</script>
<script>
//Pagination
var CountViewRows=20;
var DefAccounts={BlockName:"idPaginationAccount", NumName:"idViewAccountNum", TabName:"grid_accounts_all",APIName:"GetAccountList",Param3:"",FilterName:"idViewAccountFilter",TotalSum:"idTotalSum"};
var DefBlock={BlockName:"idPaginationBlock", NumName:"idViewBlockNum", TabName:"grid_block_all",APIName:"GetBlockList",Param3:"",FilterName:""};//idViewBlockFilter
var DefHistory={BlockName:"idPaginationHistory", NumName:"idViewHistoryNum", TabName:"grid_history",APIName:"GetHistoryAct",Param3:"",FilterName:"idViewHistoryFilter",TotalSum:"idTotalSumH"};
var DefActs={BlockName:"idPaginationAct", NumName:"idViewActNum", TabName:"grid_acts_all",APIName:"GetActList",Param3:""};
var DefHash={BlockName:"idPaginationHash", NumName:"idViewHashNum", TabName:"grid_hash_all",APIName:"GetHashList",Param3:""};
var DefDapps={BlockName:"idPaginationDapps", NumName:"idViewDappNum", TabName:"grid_dapps_all",APIName:"GetDappList",Param3:"",FilterName:"idViewDappsFilter",FilterName2:"idCategory",CountViewRows:10};
function ViewHistory()
{
ViewCurrent(DefHistory);
}
function ViewDapps()
{
ViewCurrent(DefDapps);
}
var MapCheckBtPress={};
var ArrCheckEscPress=[];
function SetImg(This,Name)
{
if(!This)
return;
MapCheckBtPress[Name]=This;
if(IsVisibleBlock(Name))
{
This.id="idUp";
for(var i=ArrCheckEscPress.length-1;i>=0;i--)
{
var element=ArrCheckEscPress[i];
if(element.name===Name)
{
return;
}
}
ArrCheckEscPress.push({name:Name,item:This,tab:CurTabName});
}
else
{
This.id="idDown";
}
//console.log("This="+This.value);
}
setInterval(function ()
{
for(var key in MapCheckBtPress)
{
var item=MapCheckBtPress[key];
SetImg(item,key);
}
},300);
</script>
<script>
/*Get data from server Get data from server Get data from server Get data from server Get data from server */
function UpdatesConfigData()
{
GetData("GetWalletInfo",{}, function (Data)
{
SetConfigData(Data);
});
}
function UpdatesAccountsData()
{
GetData("/GetWalletAccounts",{}, function (Data,responseText)
{
SetAccountsData(Data,responseText);
});
}
function UpdatesData()
{
UpdatesAccountsData();
CheckNameAccTo();
CheckSending();
}
var TitleWarning=0;
function SetTitle(TitleName)
{
if(TitleWarning===1)
document.title="*"+TitleName+"*";
else
if(TitleWarning===2)
document.title="**"+TitleName+"**";
else
if(TitleWarning>2)
document.title="***"+TitleName+"***";
else
document.title=TitleName;
}
function SetConfigData(Data)
{
if(!Data || !Data.result)
return;
CONFIG_DATA=Data;
ServerBlockNumDB=Data.BlockNumDB;
ServerCurBlockNum=Data.CurBlockNum;
ServerTime=Data.CurTime;
var DeltaTime=Data.DELTA_CURRENT_TIME/1000;
var Name="TERA";
if(CONFIG_DATA.CONSTANTS.WALLET_NAME)
Name=CONFIG_DATA.CONSTANTS.WALLET_NAME;
if(CONFIG_DATA.CONSTANTS.COUNT_VIEW_ROWS)
CountViewRows=CONFIG_DATA.CONSTANTS.COUNT_VIEW_ROWS;
SetBlockChainConstant(Data);
MaxBlockNum=GetCurrentBlockNumByTime();
window.NETWORK_NAME=CONFIG_DATA.NETWORK;
if(!WasInitCurrency)
FillCurrencyAsync("idCurrency");
WasInitCurrency=1;
var StrVersion=" 0."+Data.VersionNum;
if(Data.CODE_VERSION.VersionNum && Data.VersionNum<Data.CODE_VERSION.VersionNum)
{
StrVersion=StrVersion+"/0."+Data.CODE_VERSION.VersionNum;
}
SetTitle(Name+StrVersion);
if(Data.RelayMode && Data.CurBlockNum>Data.BlockNumDB+BLOCK_PROCESSING_LENGTH*2)
{
CanSendTransaction=0;
var StrMode="";
var MaxNum=Data.CurBlockNum-BLOCK_PROCESSING_LENGTH;
if(MaxNum>0)
{
var Percent=100*Data.BlockNumDB/MaxNum;
if(Percent<0)
Percent=0;
Percent=Percent.toFixed(2);
StrMode=" "+Percent+"% "+" ("+Data.BlockNumDB+"/"+MaxNum+")";
}
SetMainStatus("<DIV align='center' style='color:red'><big><B>Waiting for synchronization "+StrMode+"</B></big></DIV>");
WalletStatus="WAIT";
}
else
if(WalletStatus==="WAIT")
{
CanSendTransaction=1;
WalletStatus="OK";
SetMainStatus("<DIV align='center' style='color:green'><big><B>Synchronization complete</B></big></DIV>",1);
}
else
{
CanSendTransaction=1;
}
if(Data.NET_WORK_MODE && Data.NET_WORK_MODE.NOT_RUN)
{
CanSendTransaction=0;
WalletStatus="OK";
SetMainStatus("<DIV align='center' style='color:#565571'><big><B>NODE NOT RUNING</B></big></DIV>",1);
}
MaxAccID=Data.MaxAccID;
MaxDappsID=Data.MaxDappsID;
MaxActNum=Data.MaxActNum;
//min_power_pow_acc_create=Data.MIN_POWER_POW_ACC_CREATE+3;
PubKeyStr=Data.PublicKey;
PrivKeyStr=Data.PrivateKey;
WalletOpen=Data.WalletOpen;
SetVisibleBtOpenWallet();
HistoryMaxNum=Data.HistoryMaxNum;
DeltaTime=DeltaTime.toFixed(3);
var DeltaDB=Data.CurBlockNum-Data.BlockNumDB;
var DeltaTX=Data.CurBlockNum-Data.TXBlockNum;
$("idCurBlockNum").innerText=Data.CurBlockNum;
$("idDeltaDB").innerText=DeltaDB;
$("idDeltaTX").innerText=DeltaTX;
$("idDeltaTime").innerText=DeltaTime;
$("idWalletVersion").innerText=StrVersion;
$("idSpeedSignLib").innerText=Data.SpeedSignLib;
var MIN_SPEED=700;
if(CONFIG_DATA.SpeedSignLib<MIN_SPEED)
$("idSpeedSignLib").className="red";
else
$("idSpeedSignLib").className="";
if(CONFIG_DATA.SpeedSignLib)
SetVisibleBlock("idSignLibError",(CONFIG_DATA.SpeedSignLib<MIN_SPEED));
SetArrLog(Data.ArrLog);
if(document.getElementById("idPubKey").innerText!==PubKeyStr)
document.getElementById("idPubKey").innerText=PubKeyStr;
if(document.getElementById("idDataPath").innerText!==Data.DATA_PATH)
document.getElementById("idDataPath").innerText=Data.DATA_PATH;
// if(document.getElementById("idNodeAddr").innerText!==Data.NodeAddrStr)
// document.getElementById("idNodeAddr").innerText=Data.NodeAddrStr;
//document.getElementById("idTo").max=MaxAccID;
//document.getElementById("idAdviser").max=MaxAccID;
SetVisibleBlock("idDevelopService",Data.IsDevelopAccount);
SetVisibleBlock("idDevelopService2",Data.IsDevelopAccount);
// SetVisibleBlock("idFilterA",Data.IsDevelopAccount);
//SetVisibleBlock("idFilterB",Data.IsDevelopAccount);
//SetVisibleBlock("idFilterH",Data.IsDevelopAccount);
//SetVisibleBlock("idNetwork",CONFIG_DATA.CONSTANTS.COMMON_KEY);
if(Data.NeedRestart)
{
DoRestartWallet();
}
INTERNET_IP_FROM_STUN=Data.INTERNET_IP_FROM_STUN;
SERVER_IP=Data.ip;
SERVER_PORT=Data.port;
//Mining
MiningAccount=Data.MiningAccount;
document.getElementById("idUseMining").checked=CONFIG_DATA.CONSTANTS.USE_MINING;
if(!idPercentItem || document.activeElement!==idPercentItem)
{
idPercentItem=document.getElementById("idPercentMining");
idPercentItem.value=CONFIG_DATA.CONSTANTS.POW_MAX_PERCENT;
}
if(Data.CountMiningCPU>0 && CONFIG_DATA.CONSTANTS.USE_MINING)
SetVisibleBlock("idMiningParams","inline-block");
else
SetVisibleBlock("idMiningParams",0);
SetStatusMining(" Mining on:<B>"+MiningAccount+"</B> HashRate:<B>"+(Math.floor(Data.HashRate*10)/10)+"</B>Mh/s CPU RUN:<B>"+Data.CountRunCPU+"</B>/"+Data.CountMiningCPU+" "+(Data.MiningPaused?"<B style='color:darkred;'>=PAUSED=</B>":""));
if(CONFIG_DATA.CONSTANTS.USE_MINING && Data.CountRunCPU!==Data.CountMiningCPU)
{
$("idUseMining").className="checkbox checkbox_red";
}
else
{
$("idUseMining").className="checkbox";
}
if(Data.CODE_VERSION.VersionNum && Data.VersionNum<Data.CODE_VERSION.VersionNum)
{
$("idAutoUpdate").className="checkbox checkbox_alert";
}
else
{
$("idAutoUpdate").className="checkbox";
}
document.getElementById("idAutoUpdate").checked=CONFIG_DATA.CONSTANTS.USE_AUTO_UPDATE;
window.DEBUG_WALLET=CONFIG_DATA.CONSTANTS.DEBUG_WALLET;
SetViewWN();
$("idHintStyle").disabled = !CONFIG_DATA.USE_HINT;
DrawBlockInfo();
}
function SetVisibleBtOpenWallet()
{
SetVisibleBlock("idOpenWallet",WalletOpen!==undefined);
var item=document.getElementById("idOpenWallet");
if(WalletOpen==true)
{
item.value="Wallet opened";
item.style="background-image: url('/HTML/PIC/lock_open.png');color:green;";
}
else
if(WalletOpen==false)
{
item.value="Wallet closed";
item.style="background-image: url('/HTML/PIC/lock_closed.png');color:"+"#9b712a";
}
SetVisibleBlock("wallet_config_tab",WalletOpen!==false);
}
function TestSignLib()
{
GetData("TestSignLib",{});
}
</script>
<script>
//LIB
function ConfirmationFromBlock(BlockNum)
{
var Length=MaxBlockNum-8-BlockNum;
if(Length>0)
{
if(Length<=100)
return Length;
else
{
return ">"+Math.floor(Length/100)*100;
}
}
else
return "";
}
function ToLogServer(Str)
{
GetData("ToLogServer",Str, function (Data)
{
UpdatesData();
});
}
var PrevServerStr;
function SetStatusFromServer(Str)
{
var id = document.getElementById("idServerLog");
if(PrevServerStr!==Str)
{
PrevServerStr=Str;
id.innerText=Str;
}
}
var bMainCanClear=true;
var StrMainStatus="";
var StrNormalStatus="";
function SetMainStatus(Str,bCanClear)
{
bMainCanClear=bCanClear;
StrMainStatus=Str;
ViewStatus();
}
function SetStatus(Str,bError)
{
if(bError)
return SetError(Str);
StrNormalStatus=Str;
if(bMainCanClear)
{
StrMainStatus="";
}
ViewStatus();
}
function ViewStatus()
{
var Str=StrMainStatus+StrNormalStatus;
var id = $("idStatus");
id.innerHTML=Str;
}
function SetError(Str,bNoSound)
{
if(!bNoSound)
$("sound_err").play();
SetStatus("<DIV align='left' style='color:red'><B>"+Str+"</B></DIV>");
}
function SetStatusMining(Str)
{
var id = $("idStatusMining");
id.innerHTML=Str;
}
//EVENTS
//EVENTS
//EVENTS
function SetVisibleTab()
{
if(!CurTabName)
CurTabName=TabArr[0].name;
var bLogVisible=0;
var str;
for (var i=0;i<TabArr.length;i++)
{
var name=TabArr[i].name;
var Item=document.getElementById(name);
if(!Item)
continue;
if(CurTabName===name)
{
bLogVisible=TabArr[i].log;
Item.style.display = 'block';
str="current bt bttab"
}
else
{
Item.style.display = 'none';
str="bttab bt"
}
var ItemM=document.getElementById("M"+name);
if(ItemM)
ItemM.className=str;
}
//SetVisibleBlock("idStatus",bLogVisible);
SetVisibleBlock("idServerBlock",bLogVisible);
}
function OnSelectTab(name)
{
if(name==="TabDapps")
{
ViewDapps();
}
}
function SelectTab(name)
{
CurTabName=name;
OnSelectTab(name);
history.pushState(null,null,"#"+name);
//window.location.hash="#"+name;
SetVisibleTab();
SaveValues();
DoStableScroll();
}
function CheckCtrlEnterAndESC(e,F)
{
SaveValues();
if(e.ctrlKey && e.keyCode===13)
{
if(CurTabName==="TabAccounts" && IsVisibleBlock("edit_keys"))
SavePrivateKey();
else
if(CurTabName==="TabAccounts" && IsVisibleBlock("idAccountEdit"))
CreateAccount(0);
else
if(CurTabName==="TabAccounts" && IsVisibleBlock("edit_mining_set"))
SaveMiningSet();
else
if(CurTabName==="TabSend")
{
if(IsVisibleBlock("edit_transaction"))
SignAndSendFromJSON();
else
if(IsVisibleBlock("idBlockOnSend"))
SendMoney2();
else
SendMoneyBefore();
}
else
if(IsVisibleBlock("idBlockPasswordSet"))
SetPassword();
else
if(IsVisibleBlock("idBlockPasswordGet"))
SetPassword();
else
if(WalletOpen===false)
{
ViewOpenWallet();
}
}
else
if(e.keyCode===27)
{
for(var i=ArrCheckEscPress.length-1;i>=0;i--)
{
var element=ArrCheckEscPress[i];
if(element.tab===CurTabName)
{
SetVisibleBlock(element.name,false);
SetImg(element.item,element.name);
ArrCheckEscPress.splice(i,1);
break;
}
}
}
}
function LoadValues()
{
if(LoadValuesByArr(SaveIdArr))
{
CurTabName=localStorage["CurTabName"];
LoadMapAfter["idAccount"]=localStorage.getItem("idAccount");
}
}
function SaveValues()
{
SaveValuesByArr(SaveIdArr);
localStorage["CurTabName"]=CurTabName;
}
//INIT
//INIT
//INIT
function SelectStyle(value)
{
var Select=document.getElementById("idSelStyle");
if(value)
Select.value=value;
if(!Select.value)
Select.value=Select.options[0].value;
document.body.className="univers "+Select.value;
}
window.onload=function()
{
FillCategory("idCategory");
LoadValues();
InitPasItems();
SelectStyle();
SelectTypeKey();
InitRun();
window.onkeydown = CheckCtrlEnterAndESC;
SetVisibleTab();
localStorage["BIGWALLET"]=1;
window.OnInitWallet();
}
if(!window.OnInitWallet)
window.OnInitWallet=function()
{
UpdatesConfigData();
UpdatesData();
setInterval(UpdatesData,1000);
setInterval(UpdatesConfigData,335);
setInterval(CheckNewMoney,1000);
setInterval(SaveValues,2000);
setTimeout(CheckNameAccTo,100);
if(window.location.hash)
{
var LocationPath=window.location.hash.substr(1);
//console.log("LocationPath="+LocationPath)
if(LocationPath)
{
SelectTab(LocationPath);
}
}
setTimeout(function ()
{
OnSelectTab(CurTabName);
},100)
}
function InitRun()
{
if(localStorage["WasStart"]!=="1")
{
var ValText=document.getElementById("idRunText").value;
if(ValText && ValText!=="undefined" && ValText.trim())
{
localStorage["WasStart"]="1";
SetError("Run script ... Was Error?",1);
eval(ValText);
SetStatus("Run script ... OK");
}
localStorage["WasStart"]="0";
}
}
function SetRun()
{
SaveValues();
localStorage["WasStart"]="0";
SetStatus("Set to Run script");
}
</script>
<script>
var itemPasswordGet,itemPassword1,itemPassword2,itemBtPassword;
function InitPasItems()
{
itemPassword1=$("idPassword1");
itemPassword2=$("idPassword2");
itemPasswordGet=$("idPasswordGet");
}
function OnClickOpenCloseWallet()
{
if(WalletOpen===true)
{
GetData("CloseWallet",{},function (Data)
{
if(Data && Data.result===1)
{
SetStatus("Wallet close");
}
});
}
else
if(WalletOpen===false)
{
ViewOpenWallet();
}
}
function ViewOpenWallet()
{
if(WalletOpen!==false)
{
SetStatus("Wallet not close");
return;
}
itemPasswordGet.onkeydown = OnEnterPas1;
itemPasswordGet.value="";
SetVisibleBlock("idBlockPasswordGet",true);
itemPasswordGet.focus();
}
function OpenWallet()
{
var Passwd1=itemPasswordGet.value;
GetData("OpenWallet",Passwd1, function (Data)
{
if(Data && Data.result===1)
{
itemPasswordGet.value="";
SetStatus("Wallet open");
SetVisibleBlock("idBlockPasswordGet",false);
SetImg(itemBtPassword,'idBlockPasswordGet');
}
else
{
SetError("Wrong password!")
}
});
}
function CancelOpenWallet()
{
SetVisibleBlock("idBlockPasswordGet",false);
SetImg(itemBtPassword,'idBlockPasswordGet');
}
function ViewSetPassword()
{
if(WalletOpen===false)
{
SetError("First open wallet!");
return;
}
itemPassword1.onkeydown = OnEnterPas1;
itemPassword2.onkeydown = OnEnterPas2;
itemPassword1.value="";
itemPassword2.value="";
SetVisibleBlock("idBlockPasswordSet",!IsVisibleBlock("idBlockPasswordSet"));
SetImg(itemBtPassword,'idBlockPasswordSet');
itemPassword1.focus();
}
function SetPassword()
{
if(!IsVisibleBlock("idBlockPasswordSet"))
{
OpenWallet();
return;
}
var Passwd1=itemPassword1.value;
var Passwd2=itemPassword2.value;
if(Passwd1!==Passwd2)
{
SetError("Passwords are not equal");
return;
}
itemPassword1.value="";
itemPassword2.value="";
GetData("SetWalletPasswordNew",Passwd1, function (Data)
{
if(Data && Data.result===1)
{
SetStatus("New password was set");
SetVisibleBlock("idBlockPasswordSet",false);
SetImg(itemBtPassword,'idBlockPasswordSet');
}
});
}
function CancelSetPassword()
{
SetVisibleBlock("idBlockPasswordSet",false);
SetImg(itemBtPassword,'idBlockPasswordSet');
SetVisibleBlock("idBlockPasswordGet",false);
SetImg(itemBtPassword,'idBlockPasswordGet');
}
function OnEnterPas1(e)
{
if(e.keyCode===13)
{
if(IsVisibleBlock("idBlockPasswordSet"))
{
itemPassword2.focus();
}
else
{
OpenWallet();
}
}
//SetStatus("e.keyCode="+e.keyCode)
}
function OnEnterPas2(e)
{
if(e.keyCode===13)
{
SetPassword();
}
//SetStatus("e.keyCode="+e.keyCode)
}
</script>
<script>
var ArrInfo;
var MapInfo={};
function InitArrInfo()
{
MapInfo={};
ArrInfo=
[
{Name:"Hashrate from the beginning of the chain", Delta:1000000000, DX:310},
{Name:"month", Delta:30.5*24*3600, DX:200, Mult:10000},
{Name:"day", Delta:24*3600, DX:140, Mult:1000},
{Name:"hour", Delta:3600, DX:90, Mult:100},
{Name:"minute", Delta:60, DX:60, Mult:2},
];
for(var i=0;i<ArrInfo.length;i++)
{
var Item=ArrInfo[i];
MapInfo[Item.Name]=Item;
}
}
InitArrInfo();
function DrawBlockInfo()
{
var TimeBlockNum=GetCurrentBlockNumByTime();
var CurBlockNum=TimeBlockNum;
if(CurBlockNum<ServerBlockNumDB+8)
CurBlockNum=ServerBlockNumDB;
var WasArr=0;
var Arr=[];
for(var i=ArrInfo.length-1;i>=0;i--)
{
var Item=ArrInfo[i];
Item.BlockNum2=CurBlockNum;
Item.BlockNum1=Item.BlockNum2-Item.Delta;
if(Item.BlockNum1<0)
Item.BlockNum1=0;
CurBlockNum=Math.floor(Item.BlockNum1/Item.Mult)*Item.Mult;
var MustUpdate=0;
if(Item.PowerArr)
for(var n=0;n<Item.PowerArr.length;n++)
{
if(!Item.PowerArr[n])//есть нули
{
//ToLog("n="+n+" Item.BlockNum1="+Item.BlockNum1);
MustUpdate=1;
break;
}
}
if(Item.TimeBlockNum)
{
var DeltaTime=Math.abs(Item.TimeBlockNum-TimeBlockNum);
if(DeltaTime>Item.Delta/20)
{
MustUpdate=1;
}
}
if(!Item.PowerArr || Item.PowerArr.length===0 ||MustUpdate || i===ArrInfo.length-1)
{
WasArr=1;
Arr[i]={BlockNum1:Item.BlockNum1,BlockNum2:Item.BlockNum2};
}
}
if(!WasArr)
return;
//ToLog("GetHashRate: "+JSON.stringify(ArrInfo));
GetData("GetHashRate",Arr, function (Data)
{
//ToLog("GetHashRate: ")
var TimeBlockNum=GetCurrentBlockNumByTime();
if(Data && Data.result)
{
for(var i=0;i<Data.ItervalArr.length;i++)
{
var Item=ArrInfo[i];
if(Data.ItervalArr[i])
{
Item.TimeBlockNum=TimeBlockNum;
Item.PowerArr=Data.ItervalArr[i];
Item.AvgPow=CalcAvg(Item.PowerArr);
}
}
DrawBlockInfoByArr();
}
});
}
function CalcAvg(Arr)
{
var Sum=0;
var Count=0;
for(var i=0;i<Arr.length;i++)
{
if(Arr[i])
{
Sum+=Arr[i];
Count++;
}
}
if(!Count)
return 0;
return Math.floor((Sum/Count)*10)/10;
}
function DrawBlockInfoByArr()
{
var obj = document.getElementById("idBlockInfo");
var ctx = obj.getContext('2d');
var bodystyles = window.getComputedStyle(document.body, null);
ctx.fillStyle = bodystyles.backgroundColor;
ctx.fillRect(0, 0, obj.width, obj.height);
ctx.fillStyle = "#000";
ctx.strokeStyle = "#040";
ctx.lineWidth=2;
var Month=MapInfo["month"];
if(!Month)
return;
var AvgTotal=0;
for(var i=0;i<ArrInfo.length;i++)
{
var Item=ArrInfo[i];
AvgTotal+=Item.AvgPow;
}
AvgTotal=AvgTotal/ArrInfo.length;
function ValueToY(Value)
{
var Y=Value-3*AvgTotal/4;
if(Y<0)
if(Value>=2)
Y=1;
else
Y=0;
return obj.height-Y*2;
}
var x=0;
var lastx=x;
var lastvalue=0;
var WasRed=0;
for(var i=0;i<ArrInfo.length;i++)
{
var firstx=lastx;
ctx.beginPath();
var path = new Path2D();
path.moveTo(firstx,obj.height);
path.lineTo(firstx,ValueToY(lastvalue));
var Item=ArrInfo[i];
var Arr=Item.PowerArr;
var DeltaX=Item.DX/Arr.length;
var x2=0;
for(var n=0;n<Arr.length;n++)
{
if(Arr[n] && Arr[n]>lastvalue/3)
{
if(!lastvalue || lastvalue<Arr[n]/3)
path.moveTo(x+x2,obj.height);
path.lineTo(x+x2,ValueToY(Arr[n]));
}
else
{
path.lineTo(lastx,ValueToY(Arr[n]));
}
lastvalue=Arr[n];
lastx=x+x2;
x2+=DeltaX;
}
Item.x=x;
x+=Item.DX;
path.lineTo(lastx,obj.height);
path.lineTo(firstx,obj.height);
ctx.stroke(path);
var Delta=Month.AvgPow-Item.AvgPow;
if(i>1 && Delta>=1)
{
WasRed=1;
ctx.fillStyle = "#ff791a";
}
else
if(i>1 && Delta>=2)
{
WasRed=1;
ctx.fillStyle = "#e22317";
}
else
{
ctx.fillStyle = "#080";
}
ctx.fill(path);
}
ctx.lineWidth=0.5;
ctx.fillStyle = "#ffffff";
ctx.strokeStyle = ctx.fillStyle;
ctx.beginPath();
ctx.moveTo(obj.width,0);
ctx.lineTo(obj.width,obj.height);
for(var i=0;i<ArrInfo.length;i++)
{
var Item=ArrInfo[i];
ctx.fillText(""+Item.Name+(WasRed?"-"+Item.AvgPow:""),Item.x+Item.DX/2-4*Item.Name.length/2-16,25);
}
ctx.stroke();
}
</script>
<style type="text/css">
table.password
{
border-collapse: collapse;
width: 400px;
}
#idOpenWallet
{
z-index:1001;
position:relative;
float: right;
top:15px;
right:0px;
padding: 0 0 0 20px;
text-align: center;
box-shadow: 0 0 0 1px;
width: 130px;
height: 40px;
line-height: 20px;
margin: 10px;
background: transparent;
font-weight: 600;
background-image: url('/HTML/PIC/lock_closed.png');
background-repeat: no-repeat;
background-size: 20%;
cursor: pointer;
}
#idBlockPasswordSet,#idBlockPasswordGet
{
z-index:1000;
position:absolute;
top:150px;
right:25%;
height:150px;
width:320px;
padding: 10px;
background: #d9d9d9;
text-align: left;
box-shadow: 0 0 0 1px;
background-image: url('/HTML/PIC/key.png');
background-repeat: no-repeat;
}
</style>
<style id="idHintStyle">
th.hint:hover:after
{
position: absolute;
content: attr(data-name);
background: #f7efa3;
text-align: center;
font-size:smaller;
padding: 10px;
border-radius: 5px;
border: 1px solid #3b1c0e;
transform: translateY(-50px) translateX(-30px);
}
</style>
<script>
$("idHintStyle").disabled=1;
</script>
<style>
.red
{
color:red;
}
</style>
<body>
<DIV align='center'>
<DIV align='left' style="width: 800px;border2: 1px solid #727473;">
<table id="TabHeader">
<tr>
<th><DIV id="MTabAccounts" onclick="SelectTab('TabAccounts')" class="bttab">CONFIG</DIV></th>
<th><DIV id="MTabSend" onclick="SelectTab('TabSend')" class="bttab">SEND</DIV></th>
<th><DIV id="MTabDapps" onclick="SelectTab('TabDapps')" class="bttab">DApps</DIV></th>
<th><DIV id="MTabExplorer" onclick="SelectTab('TabExplorer')" class="bttab">EXPLORER</DIV></th>
</tr>
</table>
<INPUT id="idOpenWallet" style="display: none" type="button" onclick="OnClickOpenCloseWallet()" value="Wallet closed">
<DIV id="idStatus" style="height: 40px">&nbsp;</DIV>
<BR><BR><BR>
<DIV id="TabAccounts" style="display: block">
<BR>
<DIV id="idNodeUpdateMiningStatus" style="display: block">
<DIV style="float: left">
<input type="checkbox" class="checkbox" id="idAutoUpdate" onchange = "UseAutoUpdate()"/>
<label for="idAutoUpdate">Autoupdate</label>
</DIV>
<DIV style="float: left">
<input type="checkbox" class="checkbox" id="idUseMining" onchange = "UseMining()"/>
<label for="idUseMining">Mining</label>
</DIV>
<DIV style="float: left;display: none" id="idMiningParams">
<DIV style="float: left; color: blue;">CPU use:<input type="number" min=0 max=100 id="idPercentMining" onchange="SetPercentMining()"/>%</DIV>
<DIV style="float: left; margin: 2px 0 0 8px;" id="idStatusMining"></DIV>
</DIV>
</DIV>
<DIV id="idDevelopService" style="display: none">
<BR>
<INPUT type="button" id="idDown" onclick="SetVisibleBlock('idDevelopServiceView',!IsVisibleBlock('idDevelopServiceView'));SetImg(this,'idDevelopServiceView')" class="btdoit bt" value="DEV SERVICE">
<DIV id="idDevelopServiceView" style="display: none">
<table>
<tr>
<td style="width: 100px">
<BR>
<INPUT type="button" class="bt btdoit" onclick="SetCodeVersionJSON()" value="CODE VERS >>"><BR>
<INPUT type="button" class="bt btdoit" onclick="SetCorrTimeJSON()" value="DELTA TIME >>"><BR>
<INPUT type="button" class="bt btdoit" onclick="SetNetConstJSON()" value="NET CONST >>"><BR>
</td>
<td style="width: 500px">
Value:<INPUT type="string" id="idDevValue" value="0"><BR>
<TEXTAREA id="idDevService" rows="15" cols="90"> </TEXTAREA><BR>
</td>
</tr>
</table>
<INPUT type="button" onclick="CreateCheckPoint()" class="btdoit bt" value="CHECK POINT">
<INPUT type="button" onclick="SetNewCodeVersion()" class="btdoit bt" value=">>NEW VERSION">
<INPUT type="button" onclick="StartTimeCorrect()" class="btdoit bt" value=">>TIME CORR.">
<INPUT type="button" onclick="StartNetConst()" class="btdoit bt" value=">>SET CONST.">
<input type="checkbox" class="checkbox" id="idUseAutoCheckPoint" onchange = "UseAutoCheckPoint()"/>
<label for="idUseAutoCheckPoint">Auto check point each :</label>
<INPUT type="number" id="idPeriodAutoCheckPoint" style="width: 60px" value="10"> sec<BR>
<input type="checkbox" class="checkbox" id="idUseAutoCorrTime" onchange = "UseAutoCorrTime()"/>
<label for="idUseAutoCorrTime">Auto corr time</label><BR>
<HR>
</DIV>
</DIV>
<canvas width='800' height='30' id='idBlockInfo'></canvas>
<BR><BR>
<DIV style="float: left; font-family: monospace">
Block:<B id="idCurBlockNum"></B>
DB delta:<B id="idDeltaDB" style="min-width: 30px"></B>
TX delta:<B id="idDeltaTX" style="min-width: 30px"></B>
Time delta:<B id="idDeltaTime"></B>
Wallet ver:<B id="idWalletVersion"></B>
Max:<B id="idSpeedSignLib" style="cursor: pointer" onclick='TestSignLib()'></B> tps
</DIV>
<DIV id="idSignLibError" style="display: none;">
<BR><BR><DIV align='center' style="border: 1px solid #ff791a;padding: 5px"><b class="red">*************** WARNING: VERY SLOW LIBRARY: secp256k1 ***************<BR>Install all dependent packages, see detail: <a href="https://www.npmjs.com/package/secp256k1">https://www.npmjs.com/package/secp256k1</a></b>
</DIV>
<BR>
</DIV>
<DIV id="wallet_config_tab" style="display: none;float: left">
Wallet data path: <B id="idDataPath"></B><BR>
Public key: <B id="idPubKey"></B><BR>
<!--Node addr: <B id="idNodeAddr"></B><BR>-->
<INPUT type="button" onclick="MoveUp($('edit_keys'));NewPrivateKey();" class="btdoit bt" value="New wallet..." id="idDown2">
<INPUT type="button" onclick="MoveUp($('edit_keys'));EditPrivateKey();SetImg(this,'edit_keys');" class="btdoit bt" value="Edit wallet" id="idDown">
<INPUT type="button" onclick="MoveUp($('idAccountEdit'));ViewNewAccount();SetImg(this,'idAccountEdit');" class="btdoit bt" value="New account" id="idDown">
<INPUT type="button" onclick="MoveUp($('edit_mining_set'));MiningSets();SetImg(this,'edit_mining_set');" class="btdoit bt" value="Set mining" id="idDown">
<INPUT type="button" onclick="ViewSetPassword();itemBtPassword=this; SetImg(itemBtPassword,'idBlockPasswordSet');" class="bt btdoit" value="Set password" id="idDown">
</DIV>
<DIV>
<DIV id="edit_mining_set" style="display: none">
<table class="form_input keys" id="grid_mining_set">
<tr>
<td><DIV>Mining account:</DIV></td><td><INPUT type="number" id="idMiningAccount" min=0 max=1000000000000 value="0"></td>
</tr>
<tr>
<td></td>
<td><INPUT type="button" onclick="SaveMiningSet()" class="bt" value="Save">
<INPUT type="button" onclick="CancalMiningSet()" class="bt" value="Cancel"></td>
</tr>
</table>
</DIV>
<DIV id="edit_keys" style="display: none">
<table class="form_input keys" id="grid_edit_key">
<tr>
<td>
<select size="1" id="idTypeKey" onkeyup="SelectTypeKey();" onchange="SelectTypeKey();">
<option value="private">Private key</option>
<option value="public">Public key (sign from another wallet)</option>
<option value="brain">Brain key generator</option>
</select>
</td><td><INPUT type="string" autocomplete="off" id="idKeyNew" value=""></td>
</tr>
<tr id="idViewKeyNew2" style="display: none">
<td>You can repeat the secret words:</td>
<td><INPUT type="string" id="idKeyNew2" value=""></td>
</tr>
<tr>
<td></td>
<td>
<INPUT type="button" onclick="ConvertToPrivateKey()" class="btdoit bt" style="width: 130px;display: none;" id="idBtConvertKey" value="Convert to key">
<INPUT type="button" onclick="SavePrivateKey()" class="bt" id="idBtSaveKey" value="Save">
<INPUT type="button" onclick="CancelSavePrivateKey()" class="bt" value="Cancel">
</td>
</tr>
</table>
</DIV>
<DIV id="idAccountEdit" class="" style="display: none">
<table class="form_input keys" id="grid_edit_newacc">
<tr><td>Public name:</td>
<td>
<INPUT type="string" maxlength="40" style="width: 220px;text-align: left" autocomplete="off" id="idAccountName" onkeyup="CheckLengthAccDesription('idAccountName',40)">
Currency:
<select size="1" id="idCurrency" style="width: 80px;">
<option value="0">Loading...</option>
</select>
Smart:
<INPUT type="number" id="idSmart" min=0 max=100000000 value="0" style="width: 80px;">
</td>
</tr>
<tr>
<td>
</td>
<td><INPUT type="button" onclick="CreateAccount(0)" class="bt" value="Create">
<INPUT type="button" onclick="CancelCreateAccount()" class="bt" value="Cancel">
<INPUT type="button" onclick="CreateAccount(1)" class="bt btdoit" style="width: 130px;" id="idBtRun" value="Add to Pay list">
</td>
<td>
<span id="idRowWN" style="display: none;">WN:<INPUT type="number" id="idWN" min=0 max=100 style="width: 30px;" value=""></span>
</td>
</tr>
</table>
</DIV>
</DIV>
<BR>
<table id="grid_accounts" class="grid">
<tr>
<th id="(RetHistoryAccount(Item))" class="num">ID</th>
<th id="SUM_TO_STRING(Item.Value)" class="sum bold">Amount</th>
<th id="CurrencyNameItem(Item)" data-name="Currency" class="cur hint">Cur</th>
<!--<th id="(CurrencyNameItemHTML(Item))" data-name="Currency" class="cur hint">Cur</th>-->
<th id="Item.Name" data-name="Account name" class="accname hint">Name</th>
<th id="Item.Value.OperationID" data-name="Operation ID" class="snum hint">OP</th>
<th id="(RetHistoryAccount(Item,'Adviser'))" data-name="Adviser" class="snum hint">Adv</th>
<th id="(RetChangeSmart(Item))" data-name="Smart contract (DApp)" class="smart hint">Smart</th>
<th id="Item.WN" class="num" style="width: 30px;"></th>
</tr>
</table>
<B><DIV id="idMyTotalSum"></DIV></B>
<INPUT type="button" id="idDown" onclick="MoveUp($('idNetworkView'));ViewNetworkMode();SetImg(this,'idNetworkView')"
class="btdoit bt" value="NET CONNECT">
<INPUT type="button" id="idDown" onclick="MoveUp($('idRemoteView'));ViewRemoteParams();SetImg(this,'idRemoteView')"
class="btdoit bt" value="HTTP ACCESS">
<INPUT type="button" id="idDown" onclick="MoveUp($('idConstantView'));ViewConstant();SetImg(this,'idConstantView')"
class="btdoit bt" value="CONSTANTS">
<INPUT type="button" onclick="FindMyAccounts();" class="btdoit bt" value="Refresh accounts">
<DIV>
<DIV id="idNetworkView" style="display: none">
<H3>Network connections:</H3>
<INPUT type="checkbox" id="idUseDirectIP">Run server and use direct IP:<BR>
IP:<INPUT maxlength="20" id="idIP"> Port:<INPUT maxlength="9" id="idPort"><BR>
<!--<INPUT type="checkbox" id="idUseIncomeGrayIP">Allow connection users without a direct ip:<BR>-->
<!--White list nodes (HEX-format):<BR>-->
<TEXTAREA id="idNodeWhiteList" rows="4" cols="100" style="display: none"> </TEXTAREA>
<BR>
<!--<INPUT type="button" onclick="SetNetworkParams(0)" class="btdoit bt" value="Save">-->
<INPUT type="button" onclick="SetNetworkParams(1)" class="btdoit bt" value="Save and Restart">
<HR>
</DIV>
<DIV id="idRemoteView" style="display: none">
<H3>Remote access:</H3>
<table class="form_input keys">
<tr>
<td>HTTP port:</td>
<td><INPUT type="string" id="idHTTPPort" maxlength="6" value="80"></td>
</tr>
<tr>
<td>Password on HTTP:</td>
<td><INPUT type="string" id="idHTTPPassword"></td>
</tr>
</table>
<BR>
<!--<INPUT type="button" onclick="SetRemoteParams(0)" class="btdoit bt" value="Save">-->
<INPUT type="button" onclick="SetRemoteParams(1)" class="btdoit bt" value="Save and Restart">
<HR>
</DIV>
<DIV id="idConstantView" style="display: none">
<H3>All constants (only for advanced users):</H3>
<TEXTAREA id="idConstant" rows="20" cols="110"> </TEXTAREA><BR>
<BR>
<INPUT type="button" onclick="SaveConstant(0)" class="btdoit bt" value="Save">
<INPUT type="button" onclick="SaveConstant(1)" class="btdoit bt" value="Save and Restart">
<HR>
</DIV>
</DIV>
Style:
<select size="1" id="idSelStyle" onkeyup="SelectStyle();SaveValues()" onchange="SelectStyle();SaveValues()">
<option value="styleBrown">Brown</option>
<option value="styleBlue">Blue</option>
<option value="styleGreen">Green</option>
<option value="styleDark">Dark</option>
<option value="styleGray">Gray</option>
<option value="styleContrast1">Contrast 1</option>
<option value="styleContrast2">Contrast 2</option>
<option value="styleContrast3">Contrast 3</option>
</select>
</DIV>
<DIV id="TabSend" style="display: none">
<DIV id="idSendList"> </DIV>
<table class="form_input">
<tr>
<td style="min-width: 115px">From account</td>
<td>
<select size="1" id="idAccount" onkeyup="OnEditTransactionFields()" onchange="OnEditTransactionFields()">
</select>
</td>
</tr>
<tr><td>&nbsp;</td><td><DIV id="idNameTo" class="smallbold"></DIV></td></tr>
<tr>
<td>Pay to</td>
<td>
<INPUT style="float: left" type="string" id="idTo" value="" onkeyup="OnEditIdTo()" onchange="OnEditIdTo()"placeholder="Payee (required)" >
</td>
</tr>
<tr>
<td>Amount</td>
<td>
<INPUT type="number" id="idSumSend" style="color:#1e21cb" value="" step=0 min=0 max=1000000000 onkeyup="OnEditTransactionFields()" onchange="OnEditTransactionFields()">&nbsp;
<button style="font-family: monospace;" onclick="SetAllSum()"></button>
<B id="idCoinName"></B>
</td>
</tr>
<tr>
<td>Description (optional)</td><td><textarea id="idDescription" rows="4" onkeyup="CheckLengthAccDesription('idDescription',200);OnEditTransactionFields()" onchange="OnEditTransactionFields()"></textarea></td>
<td><DIV id="idAttach"> </DIV></td>
</tr>
<tr>
<td>
</td>
<td>
<INPUT type="button" onclick="ClearTransaction()" class="bsend bt" value="Clear">
<INPUT type="button" onclick="EditJSONTransaction();SetImg(this,'edit_transaction');" class="bsend bt" value="Edit JSON" id="idDown">
<INPUT type="button" onclick="SendMoneyBefore()" class="bsend bt" id="idSendButton" value="Send" >
</td>
</tr>
</table>
<DIV id="edit_transaction" style="display: none">
<textarea id="idTransaction" rows="20" onkeyup="StartEditTransactionJSON()" onchange="StartEditTransactionJSON()"></textarea>
<BR>
<INPUT type="button" onclick="SignJSON()" class="btdoit bt" value="Sign JSON" id="idSignJSON">
<INPUT type="button" onclick="SendMoneyJSON()" class="btdoit bt" value="Send from JSON">
Pow:<INPUT type="number" id="idDeltaPow" style="width: 60px" value="" onchange="SetMinPow()">&nbsp;
</DIV>
<script>
function SetAllSum()
{
var Item=MapAccounts[$("idAccount").value];
if(Item)
{
$("idSumSend").value=ToFixed(FLOAT_FROM_COIN(Item.Value),Item.Currency);
}
}
</script>
</DIV>
<DIV id="TabDapps" style="display: none">
<INPUT type="button" onclick="window.Open('./HTML/dapp-edit.html','smart',1240)" class="btdoit btopen bt" id="idOpenSmart" value="Dapps editor">
<BR>
<DIV id="idPaginationDapps" style="display: block">
<!--<DIV id="view_header" >DAPPS</DIV><BR>-->
Search:<INPUT type="search" id="idViewDappsFilter" value="" onchange="CheckNewSearch(DefDapps); ViewCurrent(DefDapps)">
Category:
<select size="1" id="idCategory" onchange="ViewCurrent(DefDapps)">
</select>
<BR>
<INPUT type="button" onclick="ViewBegin(DefDapps)" class="btdoitm bt" value="|&lt;-">
<INPUT type="button" onclick="ViewPrev(DefDapps)" class="btdoit bt" value="&lt;&lt; Prev">
<INPUT type="number" id="idViewDappNum" style="text-align: center" value="0" min=0 max=1000000000 onchange="ViewCurrent(DefDapps)">
<INPUT type="button" onclick="ViewNext(DefDapps,MaxDappsID)" class="btdoit bt" value="Next &gt;&gt;">
<INPUT type="button" onclick="ViewEnd(DefDapps,MaxDappsID)" class="btdoitm bt" value="-&gt;|">
<table id="grid_dapps_all" class="grid">
<tr>
<th id="(RetNumDapp(Item))" class="num">ID</th>
<th id="(RetOpenDapps(Item,0,0))" class="accname">Name</th>
<th id="Item.Description" class="code">Description</th>
<th id="(RetCategory(Item))" class="">Category</th>
<th id="(RetBaseAccount(Item))" class="num">Base Account</th>
<th id="(RetHistoryAccount(Item,'Owner'))" class="num">Owner</th>
<th id="RetBool(Item.TokenGenerate)" class="bool">Token generate</th>
<!--<th id="Item.ISIN" class="num">ISIN</th>-->
<th id="(RetOpenBlock(Item.BlockNum,1))" class="num">Block Num</th>
<!--<th id="GetHexFromArr(Item.SumHash)" class="hash">SumHash</th>-->
</tr>
</table>
<INPUT type="button" onclick="ViewPrev(DefDapps)" class="btdoit bt" value="&lt;&lt; Prev">
<INPUT type="button" onclick="ViewNext(DefDapps,MaxDappsID)" class="btdoit bt" value="Next &gt;&gt;">
</DIV>
</DIV>
<DIV id="TabExplorer" style="display: none">
<INPUT type="button" onclick="window.Open('./HTML/stat.html','counters',920)" class="btdoit btopen bt" id="idCounters" value="Counters">
<INPUT type="button" onclick="window.Open('./HTML/chains.html','chains',1240,600)" class="btdoit btopen bt" id="idChains" value="Chains">
<INPUT type="button" onclick="window.Open('./HTML/console.html','console',1240)" class="btdoit btopen bt" id="idConsole" value="Console">
<INPUT type="button" onclick="window.Open('./HTML/monitor.html','monitor',1200)" class="btdoit btopen bt" id="idMonitor" value="Monitor">
<INPUT type="button" onclick="window.Open('./HTML/network.html','network',1200)" class="btdoit btopen bt" id="idNetwork" value="Network">
<BR>
<INPUT type="button" onclick="ViewCurrent(DefAccounts,1,this);" class="btdoit bt btexlporer" id="idDown" value="Accounts">
<INPUT type="button" onclick="ViewCurrent(DefBlock,1,this)" class="btdoit bt btexlporer" id="idDown" value="Blocks & Tr">
<INPUT type="button" onclick="ViewCurrent(DefActs,1,this)" class="btdoit bt btexlporer" id="idDown" value="Accounts acts">
<INPUT type="button" onclick="ViewCurrent(DefHash,1,this)" class="btdoit bt btexlporer" id="idDown" value="Accounts hash">
<INPUT type="button" onclick="SetVisibleUtil(this)" class="btdoit bt btexlporer" id="idDown" value="Utilites">
<script>
function SetVisibleUtil(This)
{
MoveUp($("idUtilView"));
SetVisibleBlock('idUtilView',!IsVisibleBlock('idUtilView'));
SetImg(This,'idUtilView');
}
</script>
<BR>
<DIV>
<DIV id="idPaginationAccount" style="display: none">
<HR>
<DIV id="view_header" >Accounts</DIV><BR>
Search:<INPUT type="search" id="idViewAccountFilter" value="" onchange="CheckNewSearch(DefAccounts); ViewCurrent(DefAccounts)">
<INPUT type="button" onclick="ViewBegin(DefAccounts)" class="btdoitm bt" value="|&lt;-">
<INPUT type="button" onclick="ViewPrev(DefAccounts)" class="btdoit bt" value="&lt;&lt; Prev">
<INPUT type="number" id="idViewAccountNum" style="text-align: center" value="0" min=0 max=1000000000 onchange="ViewCurrent(DefAccounts)">
<INPUT type="button" onclick="ViewNext(DefAccounts,MaxAccID)" class="btdoit bt" value="Next &gt;&gt;">
<INPUT type="button" onclick="ViewEnd(DefAccounts,MaxAccID)" class="btdoitm bt" value="-&gt;|">
<table id="grid_accounts_all" class="grid">
<tr>
<th id="(RetHistoryAccount(Item))" class="num">ID</th>
<th id="SUM_TO_STRING(Item.Value)" class="sum smallbold">Amount</th>
<th id="CurrencyNameItem(Item)" class="cur">Cur</th>
<th id="Item.Name" class="accname">Name</th>
<th id="Item.PubKeyStr" class="pubkey">PubKey</th>
<th id="Item.Value.OperationID" class="num">Operation</th>
<th id="(RetHistoryAccount(Item,'Adviser'))" class="num">Adviser</th>
<th id="Item.Value.Smart" class="num">Smart</th>
<th id="(RetOpenBlock(Item.BlockNumCreate,1))" class="num">Block Num</th>
<!--<th id="Item.Arr[0].BlockNum" class="num">0</th>-->
<!--<th id="Item.Arr[1].BlockNum" class="num">1</th>-->
<!--<th id="Item.Arr[2].BlockNum" class="num">2</th>-->
<!--<th id="Item.Arr[3].BlockNum" class="num">3</th>-->
<!--<th id="Item.Arr[4].BlockNum" class="num">4</th>-->
</tr>
</table>
<INPUT type="button" onclick="ViewPrev(DefAccounts)" class="btdoit bt" value="&lt;&lt; Prev">
<INPUT type="button" onclick="ViewNext(DefAccounts,MaxAccID)" class="btdoit bt" value="Next &gt;&gt;">
<BR>
<B><DIV id="idTotalSum"></DIV></B>
<BR>
</DIV>
<DIV id="idPaginationBlock" style="display: none">
<HR>
<DIV id="view_header" >Blocks<BR></DIV>
<!--<DIV id="idFilterB">JS:<INPUT type="search" id="idViewBlockFilter" value="" onchange="ViewCurrent(DefBlock)"></DIV>-->
<INPUT type="button" onclick="ViewBegin(DefBlock)" class="btdoitm bt" value="|&lt;-">
<INPUT type="button" onclick="ViewPrev(DefBlock)" class="btdoit bt" value="&lt;&lt; Prev">
<INPUT type="number" id="idViewBlockNum" style="text-align: center" value="0" min=0 max=1000000000 onchange="ViewCurrent(DefBlock)">
<INPUT type="button" onclick="ViewNext(DefBlock,ServerBlockNumDB)" class="btdoit bt" value="Next &gt;&gt;">
<INPUT type="button" onclick="ViewEnd(DefBlock,ServerBlockNumDB)" class="btdoitm bt" value="-&gt;|">
<table id="grid_block_all" class="grid">
<tr>
<th id="(RetOpenBlock(Item.BlockNum,Item.TrDataLen))" class="num">Num</th>
<th id="(DateFromBlock(Item.BlockNum,1))" class="date">Date</th>
<th id="GetHexFromArr(Item.TreeHash)" class="hash">Data Hash</th>
<th id="GetHexFromArr(Item.PowHash)" class="hash">PowHash</th>
<th id="GetHexFromArr(Item.Hash)" class="hash">Block Hash</th>
<!--<th id="GetHexFromArr(Item.PrevHash)" class="hash">PrevHash</th>-->
<!--<th id="GetHexFromArr(Item.SumHash)" class="hash">SumHash</th>-->
<th id="Item.TrDataLen" class="num">Bytes</th>
<th id="Item.Power" class="num">Pow</th>
<th id="(RetHistoryAccount(Item,'Miner')+'<BR><b>'+Item.MinerName)+'</b>'" class="num">Miner</th>
<!--<th id="GetHexFromArr(Item.Hash1)" class="hash">Hash1</th>-->
<!--<th id="GetHexFromArr(Item.Hash2)" class="hash">Hash2</th>-->
<!--<th id="GetHexFromArr(Item.AddrHash)" class="hash">AddrHash</th>-->
<!--<th id="ReadUintFromArr(Item.AddrHash,6)" class="hash">Nonce0</th>-->
<!--<th id="ReadUintFromArr(Item.AddrHash,12)" class="hash">Nonce1</th>-->
<!--<th id="ReadUintFromArr(Item.AddrHash,18)" class="hash">Nonce2</th>-->
<!--<th id="GetPowPower(Item.Hash1)" class="num">Pow1</th>-->
<!--<th id="GetPowPower(Item.Hash2)" class="num">Pow2</th>-->
</tr>
</table>
<INPUT type="button" onclick="ViewPrev(DefBlock)" class="btdoit bt" value="&lt;&lt; Prev">
<INPUT type="button" onclick="ViewNext(DefBlock,ServerBlockNumDB)" class="btdoit bt" value="Next &gt;&gt;">
</DIV>
<DIV id="idPaginationAct" style="display: none">
<HR>
<DIV id="view_header" >Accounts acts<BR></DIV>
<INPUT type="button" onclick="ViewBegin(DefActs)" class="btdoitm bt" value="|&lt;-">
<INPUT type="button" onclick="ViewPrev(DefActs)" class="btdoit bt" value="&lt;&lt; Prev">
<INPUT type="number" id="idViewActNum" style="text-align: center" value="0" min=0 max=1000000000 onchange="ViewCurrent(DefActs)">
<INPUT type="button" onclick="ViewNext(DefActs,MaxActNum)" class="btdoit bt" value="Next &gt;&gt;">
<INPUT type="button" onclick="ViewEnd(DefActs,MaxActNum)" class="btdoitm bt" value="-&gt;|">
<table id="grid_acts_all" class="grid">
<tr>
<th id="Item.Num" class="num">Num</th>
<th id="Item.ID" class="num">Account</th>
<th id="Item.Mode">Mode</th>
<th id="(RetOpenBlock(Item.BlockNum,1))" class="num">Block</th>
<th id="Item.TrNum" class="num">TrNum</th>
<th id="(escapeHtml(DateFromBlock(Item.BlockNum,1)))" class="date">Date</th>
<th id="Item.PrevValue.OperationID" class="num">Prev. Operation</th>
<th id="SUM_TO_STRING(Item.PrevValue)" class="sum">Prev. amount</th>
<th id="Item.PrevValue.NextPos" class="num">Prev. History</th>
</tr>
</table>
<INPUT type="button" onclick="ViewPrev(DefActs)" class="btdoit bt" value="&lt;&lt; Prev">
<INPUT type="button" onclick="ViewNext(DefActs,MaxActNum)" class="btdoit bt" value="Next &gt;&gt;">
</DIV>
<DIV id="idPaginationHash" style="display: none">
<HR>
<DIV id="view_header" >Accounts hash<BR></DIV>
<INPUT type="button" onclick="ViewBegin(DefHash)" class="btdoitm bt" value="|&lt;-">
<INPUT type="button" onclick="ViewPrev(DefHash)" class="btdoit bt" value="&lt;&lt; Prev">
<INPUT type="number" id="idViewHashNum" style="text-align: center" value="0" min=0 max=1000000000 onchange="ViewCurrent(DefHash)">
<INPUT type="button" onclick="ViewNext(DefHash,CONFIG_DATA.MAX_ACCOUNT_HASH)" class="btdoit bt" value="Next &gt;&gt;">
<INPUT type="button" onclick="ViewEnd(DefHash,CONFIG_DATA.MAX_ACCOUNT_HASH)" class="btdoitm bt" value="-&gt;|">
<table id="grid_hash_all" class="grid">
<tr>
<th id="Item.Num" class="num">Num</th>
<th id="(RetOpenBlock(Item.BlockNum,3))" class="">Block</th>
<th id="(escapeHtml(DateFromBlock(Item.BlockNum,1)))" class="date">Date</th>
<th id="GetHexFromArr(Item.AccHash)" class="code">AccHash</th>
<th id="GetHexFromArr(Item.SumHash)" class="code">SumHash</th>
<th id="Item.AccountMax" class="num">AccountMax</th>
<th id="Item.SmartCount" class="num">SmartCount</th>
<th id="GetHexFromArr(Item.SmartHash)" class="code">SmartHash</th>
<th id="GetHexFromArr(Item.Hash100)" class="code">Hash100</th>
</tr>
</table>
<INPUT type="button" onclick="ViewPrev(DefHash)" class="btdoit bt" value="&lt;&lt; Prev">
<INPUT type="button" onclick="ViewNext(DefHash,CONFIG_DATA.MAX_ACCOUNT_HASH)" class="btdoit bt" value="Next &gt;&gt;">
</DIV>
<DIV id="idUtilView" style="display: none">
<HR>
<DIV id="view_header" >UTILITES<BR></DIV>
Number of blocks in depth:<INPUT type="number" id="idBlockCount" onchange = "SaveValues()" value="0"><BR>
<INPUT type="button" onclick="RestartNode()" class="bt btdoit btlong" value="Restart node">
<INPUT type="button" onclick="RewriteTransactions()" class="bt btdoit btlong" value="Rewrite transactions">
<INPUT type="button" onclick="TruncateBlockChain()" class="btdoit btlong bt" value="Truncate chain">
<INPUT type="button" onclick="ClearDataBase();InitArrInfo();" class="btdoit btlong bt" value="Clear DataBase <!>">
<DIV id="idDevelopService2">
<INPUT type="button" onclick="CleanChain()" class="bt btdoit btlong" value="Clean chain">
<BR>
<textarea id="idRunText" rows="8" cols="98" autofocus></textarea>
<BR>
<INPUT type="button" onclick="SetRun()" class="bt btdoit" value="Set run">
</DIV>
<BR>
</DIV>
</DIV>
</DIV>
<BR>
<DIV id="idServerBlock" style="width: 99.5%">
<HR>
Log from node:
<DIV id="idServerLog"></DIV><BR>
</DIV>
<FORM id="idBlockPasswordSet" style="display: none">
<H3 align="center">Enter new password:</H3>
<table class="password" id="idTablePassword1">
<tr style="display: none">
<td><DIV>Login:</DIV></td><td><INPUT type="string" id="Login1" value=""></td>
</tr>
<tr>
<td><DIV>Password:</DIV></td><td><INPUT type="password" autocomplete="WalletPassword" id="idPassword1" value=""></td>
</tr>
<tr>
<td><DIV>Repeat:</DIV></td><td><INPUT type="password" autocomplete="WalletPassword" id="idPassword2" onkeyup="" value=""></td>
</tr>
<tr>
<td></td>
<td><INPUT type="button" onclick="SetPassword()" class="bt" value="Set">
<INPUT type="button" onclick="CancelSetPassword()" class="bt" value="Cancel"></td>
</tr>
</table>
</FORM>
<FORM id="idBlockPasswordGet" style="display: none">
<H3 align="center">Enter your password:</H3>
<table class="password" id="idTablePassword2">
<tr style="display: none">
<td><DIV>Login:</DIV></td><td><INPUT type="string" id="Login2" value=""></td>
</tr>
<tr>
<td><DIV>Password:</DIV></td><td><INPUT type="password" autocomplete="WalletPassword" id="idPasswordGet" value=""></td>
</tr>
<tr>
<td></td>
<td><INPUT type="button" onclick="SetPassword()" class="bt" value="Set">
<INPUT type="button" onclick="CancelSetPassword()" class="bt" value="Cancel"></td>
</tr>
</table>
</FORM>
<DIV id="idBlockOnSend" style="display: none">
<DIV align="center">
Send <B id="idOnSendText"></B><BR>
<button onclick="SendMoney2()" id="idBtOnSend" class="radius">Send</button>
<button onclick='SetVisibleBlock("idBlockOnSend",0);' class="radius">Cancel</button>
<DIV align="left">
<DIV id="idCheckOnSend"><input type="checkbox" id="idWhiteOnSend"/> Add this account to white list</DIV>
</DIV>
</DIV>
</DIV>
<audio style="visibility: hidden;" controls="controls" id="sound_coin">
<source src="coin.mp3" type="audio/mpeg"/>
</audio>
<audio style="visibility: hidden;" controls="controls" id="sound_err">
<source src="click.mp3" type="audio/mpeg"/>
</audio>
</DIV>
</DIV>
</body>
</html>
<DIV id="idStableScroll" align='center'>
<A href="https://terafoundation.org/?utm_source=full_node&utm_medium=link&utm_campaign=wallet">Web</A>
<A href="https://bitcointalk.org/index.php?topic=4573801.0">ANN</A>
<A href="https://twitter.com/terafoundation">Twitter</A>
<A href="https://t.me/terafoundation">Telegram</A>
<A href="https://discord.gg/CvwrbeG">Discord</A>
<A href="https://jq.qq.com/?_wv=1027&k=5KpN5fw">QQ</A>
<!--progr76@gmail.com-->
</DIV>