forked from circlecloud/tera
update HTML file...
This commit is contained in:
parent
1225f4b2f5
commit
5fd017eaf1
17
a.sh
17
a.sh
@ -1,17 +0,0 @@
|
||||
#!/bin/bash
|
||||
EXT=js
|
||||
DIST=ts
|
||||
for name in `ls *.${EXT}`; do
|
||||
mv $name ${name%.${EXT}}.${DIST}
|
||||
done
|
||||
: Function;
|
||||
global.
|
||||
: any
|
||||
as any
|
||||
|
||||
BlockNumDB
|
||||
BlockNumDBMin
|
||||
UseTruncateBlockDB
|
||||
ContextSendLoadToBegin
|
||||
|
||||
|
@ -2532,10 +2532,6 @@ td.hash {
|
||||
}
|
||||
|
||||
|
||||
.pointer
|
||||
{
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.nodapp .editdapp
|
||||
{
|
||||
@ -2742,3 +2738,18 @@ th.minwidth
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
iframe
|
||||
{
|
||||
left:0;
|
||||
top: 0px;
|
||||
width: 100%;
|
||||
height: 97vh;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.pointer,.olink
|
||||
{
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
|
@ -10,16 +10,20 @@
|
||||
|
||||
const ipcRenderer = require('electron').ipcRenderer;
|
||||
|
||||
function GetDataElectron(Method, ObjPost, Func) {
|
||||
if (Func === undefined) {
|
||||
function GetDataElectron(Method,ObjPost,Func)
|
||||
{
|
||||
if(Func === undefined)
|
||||
{
|
||||
Func = ObjPost;
|
||||
ObjPost = null;
|
||||
}
|
||||
var reply;
|
||||
try {
|
||||
try
|
||||
{
|
||||
reply = ipcRenderer.sendSync('GetData', {path:Method, obj:ObjPost});
|
||||
}
|
||||
catch (e) {
|
||||
catch(e)
|
||||
{
|
||||
reply = undefined;
|
||||
}
|
||||
if(Func)
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -11,63 +11,75 @@
|
||||
var MAX_SUM_TER = 1e9;
|
||||
var MAX_SUM_CENT = 1e9;
|
||||
|
||||
function ADD(Coin, Value2) {
|
||||
function ADD(Coin,Value2)
|
||||
{
|
||||
Coin.SumCOIN += Value2.SumCOIN;
|
||||
Coin.SumCENT += Value2.SumCENT;
|
||||
if (Coin.SumCENT >= MAX_SUM_CENT) {
|
||||
if(Coin.SumCENT >= MAX_SUM_CENT)
|
||||
{
|
||||
Coin.SumCENT -= MAX_SUM_CENT;
|
||||
Coin.SumCOIN++;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
function SUB(Coin, Value2) {
|
||||
function SUB(Coin,Value2)
|
||||
{
|
||||
Coin.SumCOIN -= Value2.SumCOIN;
|
||||
if (Coin.SumCENT >= Value2.SumCENT) {
|
||||
if(Coin.SumCENT >= Value2.SumCENT)
|
||||
{
|
||||
Coin.SumCENT -= Value2.SumCENT;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
Coin.SumCENT = MAX_SUM_CENT + Coin.SumCENT - Value2.SumCENT;
|
||||
Coin.SumCOIN--;
|
||||
}
|
||||
if (Coin.SumCOIN < 0) {
|
||||
if(Coin.SumCOIN < 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
function DIV(Coin, Value) {
|
||||
function DIV(Coin,Value)
|
||||
{
|
||||
Coin.SumCOIN = Coin.SumCOIN / Value;
|
||||
Coin.SumCENT = Math.floor(Coin.SumCENT / Value);
|
||||
var SumCOIN = Math.floor(Coin.SumCOIN);
|
||||
var SumCENT = Math.floor((Coin.SumCOIN - SumCOIN) * MAX_SUM_CENT);
|
||||
Coin.SumCOIN = SumCOIN;
|
||||
Coin.SumCENT = Coin.SumCENT + SumCENT;
|
||||
if (Coin.SumCENT >= MAX_SUM_CENT) {
|
||||
if(Coin.SumCENT >= MAX_SUM_CENT)
|
||||
{
|
||||
Coin.SumCENT -= MAX_SUM_CENT;
|
||||
Coin.SumCOIN++;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
function FLOAT_FROM_COIN(Coin) {
|
||||
function FLOAT_FROM_COIN(Coin)
|
||||
{
|
||||
var Sum = Coin.SumCOIN + Coin.SumCENT / MAX_SUM_CENT;
|
||||
return Sum;
|
||||
};
|
||||
|
||||
function STRING_FROM_COIN(Coin) {
|
||||
function STRING_FROM_COIN(Coin)
|
||||
{
|
||||
var Sum = FLOAT_FROM_COIN(Coin);
|
||||
return Sum.toLocaleString(undefined, {useGrouping:true, style:'decimal', maximumFractionDigits:9});
|
||||
};
|
||||
|
||||
function COIN_FROM_FLOAT(Sum) {
|
||||
function COIN_FROM_FLOAT(Sum)
|
||||
{
|
||||
var SumCOIN = Math.floor(Sum);
|
||||
var SumCENT = Math.floor((Sum - SumCOIN) * MAX_SUM_CENT);
|
||||
var Coin = {SumCOIN:SumCOIN, SumCENT:SumCENT};
|
||||
return Coin;
|
||||
};
|
||||
|
||||
function COIN_FROM_FLOAT2(Sum) {
|
||||
function COIN_FROM_FLOAT2(Sum)
|
||||
{
|
||||
var SumCOIN = Math.floor(Sum);
|
||||
var SumCENT = Math.floor(Sum * MAX_SUM_CENT - SumCOIN * MAX_SUM_CENT);
|
||||
var Coin = {SumCOIN:SumCOIN, SumCENT:SumCENT};
|
||||
@ -76,17 +88,20 @@ function COIN_FROM_FLOAT2(Sum) {
|
||||
if(typeof window === "object")
|
||||
window.COIN_FROM_FLOAT = COIN_FROM_FLOAT2;
|
||||
|
||||
function ISZERO(Coin) {
|
||||
function ISZERO(Coin)
|
||||
{
|
||||
if(Coin.SumCOIN === 0 && Coin.SumCENT === 0)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
};
|
||||
|
||||
function COIN_FROM_STRING(Str) {
|
||||
function COIN_FROM_STRING(Str)
|
||||
{
|
||||
throw "TODO: COIN_FROM_STRING";
|
||||
};
|
||||
if (typeof global === "object") {
|
||||
if(typeof global === "object")
|
||||
{
|
||||
global.ADD = ADD;
|
||||
global.SUB = SUB;
|
||||
global.DIV = DIV;
|
||||
|
@ -11,7 +11,8 @@
|
||||
var MAX_SUPER_VALUE_POW = (1 << 30) * 2;
|
||||
window.TYPE_TRANSACTION_CREATE = 100;
|
||||
|
||||
function GetHashWithValues(hash0, value1, value2, bNotCopy) {
|
||||
function GetHashWithValues(hash0,value1,value2,bNotCopy)
|
||||
{
|
||||
var hash;
|
||||
if(bNotCopy)
|
||||
hash = hash0;
|
||||
@ -29,14 +30,20 @@ function GetHashWithValues(hash0, value1, value2, bNotCopy) {
|
||||
return arrhash;
|
||||
};
|
||||
|
||||
function GetPowPower(arrhash) {
|
||||
function GetPowPower(arrhash)
|
||||
{
|
||||
var SumBit = 0;
|
||||
for (var i = 0; i < arrhash.length; i++) {
|
||||
for(var i = 0; i < arrhash.length; i++)
|
||||
{
|
||||
var byte = arrhash[i];
|
||||
for (var b = 7; b >= 0; b--) {
|
||||
if ((byte >> b) & 1) {
|
||||
for(var b = 7; b >= 0; b--)
|
||||
{
|
||||
if((byte >> b) & 1)
|
||||
{
|
||||
return SumBit;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
SumBit++;
|
||||
}
|
||||
}
|
||||
@ -44,14 +51,16 @@ function GetPowPower(arrhash) {
|
||||
return SumBit;
|
||||
};
|
||||
|
||||
function GetPowValue(arrhash) {
|
||||
function GetPowValue(arrhash)
|
||||
{
|
||||
var value = (arrhash[0] << 23) * 2 + (arrhash[1] << 16) + (arrhash[2] << 8) + arrhash[3];
|
||||
value = value * 256 + arrhash[4];
|
||||
value = value * 256 + arrhash[5];
|
||||
return value;
|
||||
};
|
||||
|
||||
function CreateNoncePOWExtern(arr0, BlockNum, count, startnone) {
|
||||
function CreateNoncePOWExtern(arr0,BlockNum,count,startnone)
|
||||
{
|
||||
var arr = [];
|
||||
for(var i = 0; i < arr0.length; i++)
|
||||
arr[i] = arr0[i];
|
||||
@ -59,10 +68,12 @@ function CreateNoncePOWExtern(arr0, BlockNum, count, startnone) {
|
||||
startnone = 0;
|
||||
var maxnonce = 0;
|
||||
var supervalue = MAX_SUPER_VALUE_POW;
|
||||
for (var nonce = startnone; nonce <= startnone + count; nonce++) {
|
||||
for(var nonce = startnone; nonce <= startnone + count; nonce++)
|
||||
{
|
||||
var arrhash = GetHashWithValues(arr, nonce, BlockNum, true);
|
||||
var value = GetPowValue(arrhash);
|
||||
if (value < supervalue) {
|
||||
if(value < supervalue)
|
||||
{
|
||||
maxnonce = nonce;
|
||||
supervalue = value;
|
||||
}
|
||||
@ -71,7 +82,8 @@ function CreateNoncePOWExtern(arr0, BlockNum, count, startnone) {
|
||||
};
|
||||
window.TR_TICKET_HASH_LENGTH = 10;
|
||||
|
||||
function CreateHashBody(body, Num, Nonce) {
|
||||
function CreateHashBody(body,Num,Nonce)
|
||||
{
|
||||
var length = body.length - 12;
|
||||
body[length + 0] = Num & 0xFF;
|
||||
body[length + 1] = (Num >>> 8) & 0xFF;
|
||||
@ -99,7 +111,8 @@ window.MIN_POWER_POW_TR = 0;
|
||||
window.CONSENSUS_PERIOD_TIME = 1000;
|
||||
window.FIRST_TIME_BLOCK = 1530446400000;
|
||||
window.NEW_SIGN_TIME = 25500000;
|
||||
window.SetBlockChainConstant = function(Data) {
|
||||
window.SetBlockChainConstant = function (Data)
|
||||
{
|
||||
var DeltaServerClient = new Date() - Data.CurTime;
|
||||
if(!Data.DELTA_CURRENT_TIME)
|
||||
Data.DELTA_CURRENT_TIME = 0;
|
||||
@ -108,7 +121,8 @@ window.SetBlockChainConstant = function(Data) {
|
||||
window.FIRST_TIME_BLOCK = Data.FIRST_TIME_BLOCK;
|
||||
window.NEW_SIGN_TIME = Data.NEW_SIGN_TIME;
|
||||
window.CONSENSUS_PERIOD_TIME = Data.CONSENSUS_PERIOD_TIME;
|
||||
window.GetCurrentBlockNumByTime = function() {
|
||||
window.GetCurrentBlockNumByTime = function ()
|
||||
{
|
||||
var CurrentTime = Date.now() + DELTA_CURRENT_TIME2;
|
||||
var CurTimeNum = CurrentTime - FIRST_TIME_BLOCK;
|
||||
var StartBlockNum = Math.floor((CurTimeNum + CONSENSUS_PERIOD_TIME) / CONSENSUS_PERIOD_TIME);
|
||||
@ -116,13 +130,16 @@ window.SetBlockChainConstant = function(Data) {
|
||||
};
|
||||
window.NWMODE = Data.NWMODE;
|
||||
};
|
||||
window.GetCurrentBlockNumByTime = function() {
|
||||
window.GetCurrentBlockNumByTime = function ()
|
||||
{
|
||||
return 0;
|
||||
};
|
||||
|
||||
function GetBlockNumTr(arr) {
|
||||
function GetBlockNumTr(arr)
|
||||
{
|
||||
var BlockNum = window.DELTA_FOR_TIME_TX + GetCurrentBlockNumByTime();
|
||||
if (arr[0] === TYPE_TRANSACTION_CREATE) {
|
||||
if(arr[0] === TYPE_TRANSACTION_CREATE)
|
||||
{
|
||||
var BlockNum2 = Math.floor(BlockNum / 10) * 10;
|
||||
if(BlockNum2 < BlockNum)
|
||||
BlockNum2 = BlockNum2 + 10;
|
||||
@ -134,20 +151,26 @@ var LastCreatePOWTrType = 0;
|
||||
var LastCreatePOWBlockNum = 0;
|
||||
var LastCreatePOWHash = [255, 255, 255, 255];
|
||||
|
||||
function CreateHashBodyPOWInnerMinPower(arr, MinPow, startnonce) {
|
||||
function CreateHashBodyPOWInnerMinPower(arr,MinPow,startnonce)
|
||||
{
|
||||
var TrType = arr[0];
|
||||
var BlockNum = GetBlockNumTr(arr);
|
||||
if (MinPow === undefined) {
|
||||
if(MinPow === undefined)
|
||||
{
|
||||
MinPow = MIN_POWER_POW_TR + Math.log2(arr.length / 128);
|
||||
}
|
||||
var nonce = startnonce;
|
||||
while (1) {
|
||||
while(1)
|
||||
{
|
||||
var arrhash = CreateHashBody(arr, BlockNum, nonce);
|
||||
var power = GetPowPower(arrhash);
|
||||
if (power >= MinPow) {
|
||||
if (LastCreatePOWBlockNum === BlockNum && LastCreatePOWTrType === TrType && CompareArr(LastCreatePOWHash, arrhash) > 0) {
|
||||
if(power >= MinPow)
|
||||
{
|
||||
if(LastCreatePOWBlockNum === BlockNum && LastCreatePOWTrType === TrType && CompareArr(LastCreatePOWHash, arrhash) > 0)
|
||||
{
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
LastCreatePOWBlockNum = BlockNum;
|
||||
LastCreatePOWTrType = TrType;
|
||||
LastCreatePOWHash = arrhash;
|
||||
@ -155,17 +178,20 @@ function CreateHashBodyPOWInnerMinPower(arr, MinPow, startnonce) {
|
||||
}
|
||||
}
|
||||
nonce++;
|
||||
if (nonce % 2000 === 0) {
|
||||
if(nonce % 2000 === 0)
|
||||
{
|
||||
BlockNum = GetBlockNumTr(arr);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function CalcHashFromArray(ArrHashes, bOriginalSeq) {
|
||||
function CalcHashFromArray(ArrHashes,bOriginalSeq)
|
||||
{
|
||||
if(bOriginalSeq === undefined)
|
||||
ArrHashes.sort(CompareArr);
|
||||
var Buf = [];
|
||||
for (var i = 0; i < ArrHashes.length; i++) {
|
||||
for(var i = 0; i < ArrHashes.length; i++)
|
||||
{
|
||||
var Value = ArrHashes[i];
|
||||
for(var n = 0; n < Value.length; n++)
|
||||
Buf.push(Value[n]);
|
||||
@ -179,7 +205,8 @@ function CalcHashFromArray(ArrHashes, bOriginalSeq) {
|
||||
return Hash;
|
||||
};
|
||||
|
||||
function GetArrFromValue(Num) {
|
||||
function GetArrFromValue(Num)
|
||||
{
|
||||
var arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||
arr[0] = Num & 0xFF;
|
||||
arr[1] = (Num >>> 8) & 0xFF;
|
||||
@ -191,42 +218,52 @@ function GetArrFromValue(Num) {
|
||||
return arr;
|
||||
};
|
||||
|
||||
function LoadLib(Path) {
|
||||
function LoadLib(Path)
|
||||
{
|
||||
var item = document.createElement('script');
|
||||
item.type = "text/javascript";
|
||||
item.src = Path;
|
||||
document.getElementsByTagName('head')[0].appendChild(item);
|
||||
};
|
||||
|
||||
function IsMS() {
|
||||
function IsMS()
|
||||
{
|
||||
var ua = window.navigator.userAgent;
|
||||
var msie = ua.indexOf("MSIE ");
|
||||
if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {
|
||||
if(msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
function LoadSignLib() {
|
||||
function LoadSignLib()
|
||||
{
|
||||
if(window.SignLib)
|
||||
return ;
|
||||
LoadLib("./JS/sign-lib-min.js");
|
||||
};
|
||||
|
||||
function ComputeSecretWithCheck(PubKey, StrPrivKey, F) {
|
||||
if (!window.SignLib) {
|
||||
function ComputeSecretWithCheck(PubKey,StrPrivKey,F)
|
||||
{
|
||||
if(!window.SignLib)
|
||||
{
|
||||
SetError("Error - SignLib not installed");
|
||||
return ;
|
||||
}
|
||||
if (!IsHexStr(StrPrivKey) || StrPrivKey.length !== 64) {
|
||||
if(!IsHexStr(StrPrivKey) || StrPrivKey.length !== 64)
|
||||
{
|
||||
SetError("Error set PrivKey");
|
||||
return ;
|
||||
}
|
||||
var PrivKey = Buffer.from(GetArrFromHex(StrPrivKey));
|
||||
if (typeof PubKey === "string") {
|
||||
if (!IsHexStr(PubKey) || PubKey.length !== 66) {
|
||||
if(typeof PubKey === "string")
|
||||
{
|
||||
if(!IsHexStr(PubKey) || PubKey.length !== 66)
|
||||
{
|
||||
SetError("Error PubKey");
|
||||
return ;
|
||||
}
|
||||
@ -236,12 +273,16 @@ function ComputeSecretWithCheck(PubKey, StrPrivKey, F) {
|
||||
F(sha3(Result));
|
||||
};
|
||||
|
||||
function ComputeSecret(Account, PubKey, F) {
|
||||
if (GetPrivKey()) {
|
||||
function ComputeSecret(Account,PubKey,F)
|
||||
{
|
||||
if(GetPrivKey())
|
||||
{
|
||||
ComputeSecretWithCheck(PubKey, GetPrivKey(), F);
|
||||
}
|
||||
else {
|
||||
GetData("GetWalletInfo", { Account: Account }, function(Data) {
|
||||
else
|
||||
{
|
||||
GetData("GetWalletInfo", {Account:Account}, function (Data)
|
||||
{
|
||||
if(!Data || !Data.result)
|
||||
return ;
|
||||
ComputeSecretWithCheck(PubKey, Data.PrivateKey, F);
|
||||
@ -249,13 +290,15 @@ function ComputeSecret(Account, PubKey, F) {
|
||||
}
|
||||
};
|
||||
|
||||
function Encrypt(ArrSecret, StartEncrypt, StrName, StrValue) {
|
||||
function Encrypt(ArrSecret,StartEncrypt,StrName,StrValue)
|
||||
{
|
||||
var arrRnd = sha3arr2(ArrSecret, sha3(StrName + StartEncrypt));
|
||||
var Arr = toUTF8Array(StrValue);
|
||||
return DoSecret(Arr, arrRnd);
|
||||
};
|
||||
|
||||
function Decrypt(ArrSecret, StartEncrypt, StrName, Arr) {
|
||||
function Decrypt(ArrSecret,StartEncrypt,StrName,Arr)
|
||||
{
|
||||
if(!ArrSecret)
|
||||
return "".padEnd(Arr.length / 2, ".");
|
||||
if(typeof Arr === "string")
|
||||
@ -266,15 +309,18 @@ function Decrypt(ArrSecret, StartEncrypt, StrName, Arr) {
|
||||
return Str;
|
||||
};
|
||||
|
||||
function DoSecret(Arr, arrRnd) {
|
||||
function DoSecret(Arr,arrRnd)
|
||||
{
|
||||
var Arr2 = [];
|
||||
var CryptID = 0;
|
||||
var Pos = 0;
|
||||
while (Pos < Arr.length) {
|
||||
while(Pos < Arr.length)
|
||||
{
|
||||
CryptID++;
|
||||
WriteUintToArrOnPos(arrRnd, CryptID, 0);
|
||||
var CurBuf = sha3(arrRnd);
|
||||
for (var i = 0; i < 32 && Pos < Arr.length; i++ , Pos++) {
|
||||
for(var i = 0; i < 32 && Pos < Arr.length; i++, Pos++)
|
||||
{
|
||||
Arr2[Pos] = Arr[Pos] ^ CurBuf[i];
|
||||
}
|
||||
}
|
||||
@ -282,22 +328,26 @@ function DoSecret(Arr, arrRnd) {
|
||||
};
|
||||
var glEncryptInit = 0;
|
||||
|
||||
function EncryptInit() {
|
||||
function EncryptInit()
|
||||
{
|
||||
glEncryptInit++;
|
||||
var Time = Date.now() - new Date(2019, 0, 1);
|
||||
return Math.floor(Time * 100 + Math.random() * 100) * 100 + glEncryptInit;
|
||||
};
|
||||
|
||||
function EncryptID(ArrSecret, StartEncrypt, id) {
|
||||
function EncryptID(ArrSecret,StartEncrypt,id)
|
||||
{
|
||||
var Value = $(id).value;
|
||||
Value = Value.padEnd(Value.length + random(5), " ");
|
||||
return GetHexFromArr(Encrypt(ArrSecret, StartEncrypt, id, Value));
|
||||
};
|
||||
|
||||
function EncryptFields(ArrSecret, Params, ArrName) {
|
||||
function EncryptFields(ArrSecret,Params,ArrName)
|
||||
{
|
||||
if(!Params.Crypto)
|
||||
Params.Crypto = EncryptInit();
|
||||
for (var i = 0; i < ArrName.length; i++) {
|
||||
for(var i = 0; i < ArrName.length; i++)
|
||||
{
|
||||
var Name = ArrName[i];
|
||||
var Value = Params[Name];
|
||||
Value = Value.padEnd(Value.length + random(5), " ");
|
||||
@ -305,13 +355,17 @@ function EncryptFields(ArrSecret, Params, ArrName) {
|
||||
}
|
||||
};
|
||||
|
||||
function DecryptFields(ArrSecret, Params, ArrName) {
|
||||
for (var i = 0; i < ArrName.length; i++) {
|
||||
function DecryptFields(ArrSecret,Params,ArrName)
|
||||
{
|
||||
for(var i = 0; i < ArrName.length; i++)
|
||||
{
|
||||
var Name = ArrName[i];
|
||||
if (Params[Name]) {
|
||||
if(Params[Name])
|
||||
{
|
||||
Params[Name] = Decrypt(ArrSecret, Params.Crypto, Name, GetArrFromHex(Params[Name]));
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
Params[Name] = "";
|
||||
}
|
||||
}
|
||||
|
@ -9,43 +9,52 @@
|
||||
*/
|
||||
|
||||
|
||||
function SendPay(Data) {
|
||||
function SendPay(Data)
|
||||
{
|
||||
Data.cmd = "pay";
|
||||
SendData(Data);
|
||||
};
|
||||
|
||||
function SetStorage(Key, Value) {
|
||||
function SetStorage(Key,Value)
|
||||
{
|
||||
var Data = {cmd:"setstorage", Key:Key, Value:Value};
|
||||
SendData(Data);
|
||||
};
|
||||
|
||||
function GetStorage(Key, F) {
|
||||
function GetStorage(Key,F)
|
||||
{
|
||||
var Data = {cmd:"getstorage", Key:Key};
|
||||
SendData(Data, F);
|
||||
};
|
||||
|
||||
function SetCommon(Key, Value) {
|
||||
function SetCommon(Key,Value)
|
||||
{
|
||||
var Data = {cmd:"setcommon", Key:Key, Value:Value};
|
||||
SendData(Data);
|
||||
};
|
||||
|
||||
function GetCommon(Key, F) {
|
||||
function GetCommon(Key,F)
|
||||
{
|
||||
var Data = {cmd:"getcommon", Key:Key};
|
||||
SendData(Data, F);
|
||||
};
|
||||
|
||||
function GetInfo(F, bUseCache) {
|
||||
function GetInfo(F,bUseCache)
|
||||
{
|
||||
var Data = {cmd:"DappInfo", AllAccounts:ALL_ACCOUNTS, AllData:!bUseCache};
|
||||
SendData(Data, F);
|
||||
};
|
||||
|
||||
function Call(Account, MethodName, Params, F) {
|
||||
function Call(Account,MethodName,Params,F)
|
||||
{
|
||||
var Data = {cmd:"DappCall", MethodName:MethodName, Params:Params, Account:Account};
|
||||
SendData(Data, F);
|
||||
};
|
||||
|
||||
function SendCall(Account, MethodName, Params, FromNum) {
|
||||
if (!INFO.WalletCanSign) {
|
||||
function SendCall(Account,MethodName,Params,FromNum)
|
||||
{
|
||||
if(!INFO.WalletCanSign)
|
||||
{
|
||||
SetError("Pls, open wallet");
|
||||
return 0;
|
||||
}
|
||||
@ -54,100 +63,125 @@ function SendCall(Account, MethodName, Params, FromNum) {
|
||||
return 1;
|
||||
};
|
||||
|
||||
function GetWalletAccounts(F) {
|
||||
function GetWalletAccounts(F)
|
||||
{
|
||||
var Data = {cmd:"DappWalletList"};
|
||||
SendData(Data, F);
|
||||
};
|
||||
|
||||
function GetAccountList(Params, F) {
|
||||
function GetAccountList(Params,F)
|
||||
{
|
||||
var Data = {cmd:"DappAccountList", Params:Params};
|
||||
SendData(Data, F);
|
||||
};
|
||||
|
||||
function GetSmartList(Params, F) {
|
||||
function GetSmartList(Params,F)
|
||||
{
|
||||
var Data = {cmd:"DappSmartList", Params:Params};
|
||||
SendData(Data, F);
|
||||
};
|
||||
|
||||
function GetBlockList(Params, F) {
|
||||
function GetBlockList(Params,F)
|
||||
{
|
||||
var Data = {cmd:"DappBlockList", Params:Params};
|
||||
SendData(Data, F);
|
||||
};
|
||||
|
||||
function GetTransactionList(Params, F) {
|
||||
function GetTransactionList(Params,F)
|
||||
{
|
||||
var Data = {cmd:"DappTransactionList", Params:Params};
|
||||
SendData(Data, F);
|
||||
};
|
||||
|
||||
function DappSmartHTMLFile(Smart, F) {
|
||||
function DappSmartHTMLFile(Smart,F)
|
||||
{
|
||||
var Data = {cmd:"DappSmartHTMLFile", Params:{Smart:Smart}};
|
||||
SendData(Data, F);
|
||||
};
|
||||
|
||||
function DappBlockFile(BlockNum, TrNum, F) {
|
||||
function DappBlockFile(BlockNum,TrNum,F)
|
||||
{
|
||||
var Data = {cmd:"DappBlockFile", Params:{BlockNum:BlockNum, TrNum:TrNum}};
|
||||
SendData(Data, F);
|
||||
};
|
||||
|
||||
function SetStatus(Str) {
|
||||
function SetStatus(Str)
|
||||
{
|
||||
SendData({cmd:"SetStatus", Message:Str});
|
||||
};
|
||||
|
||||
function SetError(Str) {
|
||||
function SetError(Str)
|
||||
{
|
||||
SendData({cmd:"SetError", Message:Str});
|
||||
};
|
||||
|
||||
function SetLocationPath(Str) {
|
||||
function SetLocationPath(Str)
|
||||
{
|
||||
SendData({cmd:"SetLocationHash", Message:Str});
|
||||
};
|
||||
|
||||
function CreateNewAccount(Currency) {
|
||||
function CreateNewAccount(Currency)
|
||||
{
|
||||
SendData({cmd:"CreateNewAccount", Currency:Currency});
|
||||
};
|
||||
|
||||
function OpenLink(Str) {
|
||||
function OpenLink(Str)
|
||||
{
|
||||
SendData({cmd:"OpenLink", Message:Str});
|
||||
};
|
||||
|
||||
function SetMobileMode() {
|
||||
function SetMobileMode()
|
||||
{
|
||||
SendData({cmd:"SetMobileMode"});
|
||||
};
|
||||
|
||||
function ComputeSecret(PubKey, F, Account) {
|
||||
if (!INFO.WalletCanSign) {
|
||||
function ComputeSecret(PubKey,F,Account)
|
||||
{
|
||||
if(!INFO.WalletCanSign)
|
||||
{
|
||||
SetError("Pls, open wallet");
|
||||
return 0;
|
||||
}
|
||||
if(!Account && USER_ACCOUNT.length)
|
||||
Account = USER_ACCOUNT[0].Num;
|
||||
if (typeof PubKey === "number") {
|
||||
if(typeof PubKey === "number")
|
||||
{
|
||||
var AccNum = PubKey;
|
||||
GetAccountList({ StartNum: AccNum, CountNum: 1 }, function(Err, Arr) {
|
||||
if (Err) {
|
||||
GetAccountList({StartNum:AccNum, CountNum:1}, function (Err,Arr)
|
||||
{
|
||||
if(Err)
|
||||
{
|
||||
SetError(Err);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
SendData({cmd:"ComputeSecret", Account:Account, PubKey:Arr[0].PubKey.data}, F);
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
SendData({cmd:"ComputeSecret", Account:Account, PubKey:PubKey}, F);
|
||||
}
|
||||
};
|
||||
|
||||
function CheckInstall() {
|
||||
function CheckInstall()
|
||||
{
|
||||
SendData({cmd:"CheckInstall"});
|
||||
};
|
||||
|
||||
function SendTransaction(Body, TR, SumPow, F) {
|
||||
function SendTransaction(Body,TR,SumPow,F)
|
||||
{
|
||||
SetError("Cannt SEND TR: " + JSON.stringify(TR));
|
||||
};
|
||||
|
||||
function CurrencyName(Num) {
|
||||
function CurrencyName(Num)
|
||||
{
|
||||
var Name = MapCurrency[Num];
|
||||
if (!Name) {
|
||||
GetSmartList({ StartNum: Num, CountNum: 1, TokenGenerate: 1 }, function(Err, Arr) {
|
||||
if(!Name)
|
||||
{
|
||||
GetSmartList({StartNum:Num, CountNum:1, TokenGenerate:1}, function (Err,Arr)
|
||||
{
|
||||
if(Err || Arr.length === 0)
|
||||
return ;
|
||||
var Smart = Arr[0];
|
||||
@ -160,15 +194,19 @@ function CurrencyName(Num) {
|
||||
};
|
||||
var SendCountUpdate = 0;
|
||||
|
||||
function FindAllCurrency() {
|
||||
function FindAllCurrency()
|
||||
{
|
||||
SendCountUpdate++;
|
||||
GetSmartList({ StartNum: 8, CountNum: 100, TokenGenerate: 1 }, function(Err, Arr) {
|
||||
GetSmartList({StartNum:8, CountNum:100, TokenGenerate:1}, function (Err,Arr)
|
||||
{
|
||||
SendCountUpdate--;
|
||||
if(Err)
|
||||
return ;
|
||||
for (var i = 0; i < Arr.length; i++) {
|
||||
for(var i = 0; i < Arr.length; i++)
|
||||
{
|
||||
var Smart = Arr[i];
|
||||
if (!MapCurrency[Smart.Num]) {
|
||||
if(!MapCurrency[Smart.Num])
|
||||
{
|
||||
var Name = GetTokenName(Smart.Num, Smart.ShortName);
|
||||
MapCurrency[Smart.Num] = Name;
|
||||
}
|
||||
@ -176,8 +214,10 @@ function FindAllCurrency() {
|
||||
});
|
||||
};
|
||||
|
||||
function GetFilePath(Path) {
|
||||
if (window.PROTOCOL_SERVER_PATH && Path.indexOf("file/")) {
|
||||
function GetFilePath(Path)
|
||||
{
|
||||
if(window.PROTOCOL_SERVER_PATH && Path.indexOf("file/"))
|
||||
{
|
||||
if(Path.substr(0, 1) !== "/")
|
||||
Path = "/" + Path;
|
||||
Path = window.PROTOCOL_SERVER_PATH + Path;
|
||||
@ -185,29 +225,37 @@ function GetFilePath(Path) {
|
||||
return Path;
|
||||
};
|
||||
|
||||
function GetParamsFromPath(Name) {
|
||||
function GetParamsFromPath(Name)
|
||||
{
|
||||
if(!OPEN_PATH)
|
||||
return undefined;
|
||||
var arr = OPEN_PATH.split("&");
|
||||
for (var i = 0; i < arr.length; i++) {
|
||||
if (arr[i].indexOf(Name + "=") === 0) {
|
||||
for(var i = 0; i < arr.length; i++)
|
||||
{
|
||||
if(arr[i].indexOf(Name + "=") === 0)
|
||||
{
|
||||
return arr[i].split("=")[1];
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function GetState(AccNum, F, FErr) {
|
||||
function GetState(AccNum,F,FErr)
|
||||
{
|
||||
SendCountUpdate++;
|
||||
GetAccountList({ StartNum: AccNum, CountNum: 1 }, function(Err, Arr) {
|
||||
GetAccountList({StartNum:AccNum, CountNum:1}, function (Err,Arr)
|
||||
{
|
||||
SendCountUpdate--;
|
||||
if (!Err && Arr.length) {
|
||||
if(!Err && Arr.length)
|
||||
{
|
||||
var Item = Arr[0].SmartState;
|
||||
if (Item) {
|
||||
if(Item)
|
||||
{
|
||||
F(Item);
|
||||
return ;
|
||||
}
|
||||
}
|
||||
if (FErr) {
|
||||
if(FErr)
|
||||
{
|
||||
FErr();
|
||||
return ;
|
||||
}
|
||||
@ -216,10 +264,12 @@ function GetState(AccNum, F, FErr) {
|
||||
var glMapF = {};
|
||||
var glKeyF = 0;
|
||||
|
||||
function SendData(Data, F) {
|
||||
function SendData(Data,F)
|
||||
{
|
||||
if(!window.parent)
|
||||
return ;
|
||||
if (F) {
|
||||
if(F)
|
||||
{
|
||||
glKeyF++;
|
||||
Data.CallID = glKeyF;
|
||||
glMapF[glKeyF] = F;
|
||||
@ -227,18 +277,22 @@ function SendData(Data, F) {
|
||||
window.parent.postMessage(Data, "*");
|
||||
};
|
||||
|
||||
function OnMessage(event) {
|
||||
function OnMessage(event)
|
||||
{
|
||||
var Data = event.data;
|
||||
if(!Data || typeof Data !== "object")
|
||||
return ;
|
||||
var CallID = Data.CallID;
|
||||
var cmd = Data.cmd;
|
||||
if (CallID) {
|
||||
if(CallID)
|
||||
{
|
||||
var F = glMapF[CallID];
|
||||
if (F) {
|
||||
if(F)
|
||||
{
|
||||
delete Data.CallID;
|
||||
delete Data.cmd;
|
||||
switch (cmd) {
|
||||
switch(cmd)
|
||||
{
|
||||
case "getstorage":
|
||||
case "getcommon":
|
||||
F(Data.Key, Data.Value);
|
||||
@ -269,14 +323,17 @@ function OnMessage(event) {
|
||||
delete glMapF[CallID];
|
||||
}
|
||||
}
|
||||
else {
|
||||
switch (cmd) {
|
||||
else
|
||||
{
|
||||
switch(cmd)
|
||||
{
|
||||
case "History":
|
||||
var eventEvent = new CustomEvent("History", {detail:Data});
|
||||
window.dispatchEvent(eventEvent);
|
||||
break;
|
||||
case "OnEvent":
|
||||
if (window.OnEvent) {
|
||||
if(window.OnEvent)
|
||||
{
|
||||
window.OnEvent(Data);
|
||||
}
|
||||
var eventEvent = new CustomEvent("Event", {detail:Data});
|
||||
@ -285,23 +342,29 @@ function OnMessage(event) {
|
||||
}
|
||||
};
|
||||
|
||||
function OpenRefFile(Str) {
|
||||
function OpenRefFile(Str)
|
||||
{
|
||||
var Param = ParseFileName(Str);
|
||||
if(Param.BlockNum)
|
||||
DappBlockFile(Param.BlockNum, Param.TrNum, function(Err, Body) {
|
||||
DappBlockFile(Param.BlockNum, Param.TrNum, function (Err,Body)
|
||||
{
|
||||
document.write(Body);
|
||||
});
|
||||
else {
|
||||
else
|
||||
{
|
||||
OpenLink(Str);
|
||||
}
|
||||
};
|
||||
|
||||
function SaveToStorageByArr(Arr) {
|
||||
function SaveToStorageByArr(Arr)
|
||||
{
|
||||
SetStorage("VerSave", "1");
|
||||
for (var i = 0; i < Arr.length; i++) {
|
||||
for(var i = 0; i < Arr.length; i++)
|
||||
{
|
||||
var name = Arr[i];
|
||||
var Item = $(name);
|
||||
if (Item) {
|
||||
if(Item)
|
||||
{
|
||||
if(Item.type === "checkbox")
|
||||
SetStorage(name, 0 + Item.checked);
|
||||
else
|
||||
@ -310,10 +373,14 @@ function SaveToStorageByArr(Arr) {
|
||||
}
|
||||
};
|
||||
|
||||
function LoadFromStorageByArr(Arr, F, bAll) {
|
||||
GetStorage("VerSave", function(Key, Value) {
|
||||
if (Value === "1") {
|
||||
for (var i = 0; i < Arr.length; i++) {
|
||||
function LoadFromStorageByArr(Arr,F,bAll)
|
||||
{
|
||||
GetStorage("VerSave", function (Key,Value)
|
||||
{
|
||||
if(Value === "1")
|
||||
{
|
||||
for(var i = 0; i < Arr.length; i++)
|
||||
{
|
||||
if(i === Arr.length - 1)
|
||||
LoadFromStorageById(Arr[i], F);
|
||||
else
|
||||
@ -325,10 +392,13 @@ function LoadFromStorageByArr(Arr, F, bAll) {
|
||||
});
|
||||
};
|
||||
|
||||
function LoadFromStorageById(Name, F) {
|
||||
GetStorage(Name, function(Key, Value) {
|
||||
function LoadFromStorageById(Name,F)
|
||||
{
|
||||
GetStorage(Name, function (Key,Value)
|
||||
{
|
||||
var Item = document.getElementById(Name);
|
||||
if (Item) {
|
||||
if(Item)
|
||||
{
|
||||
if(Item.type === "checkbox")
|
||||
Item.checked = parseInt(Value);
|
||||
else
|
||||
@ -340,22 +410,29 @@ function LoadFromStorageById(Name, F) {
|
||||
};
|
||||
var SendCountDappParams = 0;
|
||||
|
||||
function GetDappParams(BNum, TrNum, F, bAll) {
|
||||
if (!BNum) {
|
||||
function GetDappParams(BNum,TrNum,F,bAll)
|
||||
{
|
||||
if(!BNum)
|
||||
{
|
||||
if(bAll)
|
||||
F();
|
||||
return ;
|
||||
}
|
||||
SendCountDappParams++;
|
||||
DappBlockFile(BNum, TrNum, function(Err, Data) {
|
||||
DappBlockFile(BNum, TrNum, function (Err,Data)
|
||||
{
|
||||
SendCountDappParams--;
|
||||
if (!Err && Data.Type === 135) {
|
||||
try {
|
||||
if(!Err && Data.Type === 135)
|
||||
{
|
||||
try
|
||||
{
|
||||
var Params = JSON.parse(Data.Params);
|
||||
}
|
||||
catch (e) {
|
||||
catch(e)
|
||||
{
|
||||
}
|
||||
if (Params) {
|
||||
if(Params)
|
||||
{
|
||||
F(Params, Data.MethodName, Data.FromNum);
|
||||
return ;
|
||||
}
|
||||
@ -364,20 +441,26 @@ function GetDappParams(BNum, TrNum, F, bAll) {
|
||||
F();
|
||||
});
|
||||
};
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
document.addEventListener("DOMContentLoaded", function ()
|
||||
{
|
||||
var refs = document.getElementsByTagName("A");
|
||||
for (var i = 0, L = refs.length; i < L; i++) {
|
||||
if (refs[i].href.indexOf("/file/") >= 0) {
|
||||
refs[i].onclick = function() {
|
||||
for(var i = 0, L = refs.length; i < L; i++)
|
||||
{
|
||||
if(refs[i].href.indexOf("/file/") >= 0)
|
||||
{
|
||||
refs[i].onclick = function ()
|
||||
{
|
||||
OpenRefFile(this.href);
|
||||
};
|
||||
}
|
||||
}
|
||||
});
|
||||
if (window.addEventListener) {
|
||||
if(window.addEventListener)
|
||||
{
|
||||
window.addEventListener("message", OnMessage);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
window.attachEvent("onmessage", OnMessage);
|
||||
}
|
||||
var SMART = {}, BASE_ACCOUNT = {}, INFO = {}, USER_ACCOUNT = [], USER_ACCOUNT_MAP = {}, OPEN_PATH = "", ACCOUNT_OPEN_NUM = 0;
|
||||
@ -385,9 +468,12 @@ var ALL_ACCOUNTS = 0;
|
||||
var WasStartInit = 0, WasStartInit2 = 0;
|
||||
var eventInfo = new Event("UpdateInfo");
|
||||
|
||||
function UpdateDappInfo() {
|
||||
GetInfo(function(Err, Data) {
|
||||
if (Err) {
|
||||
function UpdateDappInfo()
|
||||
{
|
||||
GetInfo(function (Err,Data)
|
||||
{
|
||||
if(Err)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
INFO = Data;
|
||||
@ -400,29 +486,34 @@ function UpdateDappInfo() {
|
||||
USER_ACCOUNT_MAP = {};
|
||||
for(var i = 0; i < USER_ACCOUNT.length; i++)
|
||||
USER_ACCOUNT_MAP[USER_ACCOUNT[i].Num] = USER_ACCOUNT[i];
|
||||
if (window.OnInit && !WasStartInit) {
|
||||
if(window.OnInit && !WasStartInit)
|
||||
{
|
||||
WasStartInit = 1;
|
||||
window.OnInit(1);
|
||||
}
|
||||
else
|
||||
if (window.OnUpdateInfo) {
|
||||
if(window.OnUpdateInfo)
|
||||
{
|
||||
window.OnUpdateInfo();
|
||||
}
|
||||
if (!WasStartInit2) {
|
||||
if(!WasStartInit2)
|
||||
{
|
||||
WasStartInit2 = 1;
|
||||
var eventInit = new Event("Init");
|
||||
window.dispatchEvent(eventInit);
|
||||
}
|
||||
window.dispatchEvent(eventInfo);
|
||||
if(Data.ArrEvent)
|
||||
for (var i = 0; i < Data.ArrEvent.length; i++) {
|
||||
for(var i = 0; i < Data.ArrEvent.length; i++)
|
||||
{
|
||||
var Item = Data.ArrEvent[i];
|
||||
Item.cmd = "OnEvent";
|
||||
OnMessage({data:Item});
|
||||
}
|
||||
}, 1);
|
||||
};
|
||||
window.addEventListener('load', function() {
|
||||
window.addEventListener('load', function ()
|
||||
{
|
||||
if(!window.sha3)
|
||||
LoadLib("./JS/sha3.js");
|
||||
UpdateDappInfo();
|
||||
|
@ -12,18 +12,21 @@ var DiagramMap = {};
|
||||
var DiagramMapId = {};
|
||||
var LMouseOn = false;
|
||||
if(!window.toStaticHTML)
|
||||
toStaticHTML = function(Str) {
|
||||
toStaticHTML = function (Str)
|
||||
{
|
||||
return Str;
|
||||
};
|
||||
|
||||
function Rigth(Str, Count) {
|
||||
function Rigth(Str,Count)
|
||||
{
|
||||
if(Str.length < Count)
|
||||
return Str;
|
||||
else
|
||||
return Str.substr(Str.length - Count);
|
||||
};
|
||||
|
||||
function SetHTMLDiagramItem(Item, width) {
|
||||
function SetHTMLDiagramItem(Item,width)
|
||||
{
|
||||
Item.mouseX = width - 50;
|
||||
if(Item.Extern || Item.Delete)
|
||||
return ;
|
||||
@ -32,46 +35,56 @@ function SetHTMLDiagramItem(Item, width) {
|
||||
Item.id = "DgrmId" + Item.num;
|
||||
DiagramMap[Item.name] = Item;
|
||||
DiagramMapId[Item.id] = Item;
|
||||
if (Item.isLine) {
|
||||
if(Item.isLine)
|
||||
{
|
||||
if(Item.text)
|
||||
Str = "<BR><B>" + Item.text + '</B><INPUT type="button" class="delete" onclick="DeleteDiagram(\'' + Item.id + '\')" value="X">';
|
||||
else
|
||||
Str = "<HR>";
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
Str = '<BR><DIV>' + Item.text + '<INPUT type="button" class="delete" onclick="DeleteDiagram(\'' + Item.id + '\')" value="X"></DIV>\
|
||||
<BR><canvas class="DIAGRAM" width="' + width + '" height="' + MinHeight + '" id="' + Item.id + '"></canvas>';
|
||||
}
|
||||
var ElBlock = document.getElementById("B" + Item.id);
|
||||
if(ElBlock)
|
||||
ElBlock.innerHTML = toStaticHTML(Str);
|
||||
else {
|
||||
else
|
||||
{
|
||||
var diargams = document.getElementById("diargams");
|
||||
diargams.innerHTML = toStaticHTML(diargams.innerHTML + "<DIV id='B" + Item.id + "'>" + Str + "</DIV>");
|
||||
}
|
||||
};
|
||||
|
||||
function SetDiagramMouseX(event, mode) {
|
||||
if (event.srcElement && event.srcElement.className && event.srcElement.className.indexOf && event.srcElement.className.indexOf("DIAGRAM") >= 0) {
|
||||
function SetDiagramMouseX(event,mode)
|
||||
{
|
||||
if(event.srcElement && event.srcElement.className && event.srcElement.className.indexOf && event.srcElement.className.indexOf("DIAGRAM") >= 0)
|
||||
{
|
||||
if(mode === "down")
|
||||
LMouseOn = true;
|
||||
else
|
||||
if(mode === "up")
|
||||
LMouseOn = false;
|
||||
event.preventDefault();
|
||||
if (LMouseOn === true) {
|
||||
if(LMouseOn === true)
|
||||
{
|
||||
var obj = event.srcElement;
|
||||
var mouse = getMouse(obj, event);
|
||||
if (event.ctrlKey === true) {
|
||||
for (var key in DiagramMapId) {
|
||||
if(event.ctrlKey === true)
|
||||
{
|
||||
for(var key in DiagramMapId)
|
||||
{
|
||||
var Item = DiagramMapId[key];
|
||||
Item.mouseX = mouse.x;
|
||||
DrawDiagram(Item);
|
||||
}
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
var Item = DiagramMapId[obj.id];
|
||||
if (Item) {
|
||||
if(Item)
|
||||
{
|
||||
Item.mouseX = mouse.x;
|
||||
DrawDiagram(Item);
|
||||
}
|
||||
@ -80,7 +93,8 @@ function SetDiagramMouseX(event, mode) {
|
||||
}
|
||||
};
|
||||
|
||||
function DrawDiagram(Item) {
|
||||
function DrawDiagram(Item)
|
||||
{
|
||||
if(Item.Delete)
|
||||
return ;
|
||||
var arr = Item.arr;
|
||||
@ -116,7 +130,8 @@ function DrawDiagram(Item) {
|
||||
var MaxValue = arr[0];
|
||||
var MinValue = arr[0];
|
||||
var AvgValue = 0;
|
||||
for (var i = 0; i < arr.length; i++) {
|
||||
for(var i = 0; i < arr.length; i++)
|
||||
{
|
||||
if(arr[i] > MaxValue)
|
||||
MaxValue = arr[i];
|
||||
if(arr[i] < MinValue)
|
||||
@ -145,7 +160,8 @@ function DrawDiagram(Item) {
|
||||
var KY = (obj.height - Top - Button) / HValue;
|
||||
var DeltaY = 0;
|
||||
var bLine = Item.line;
|
||||
if (Item.zero) {
|
||||
if(Item.zero)
|
||||
{
|
||||
bLine = 1;
|
||||
DeltaY -= Item.zero * KY;
|
||||
MaxValue -= Item.zero;
|
||||
@ -165,26 +181,31 @@ function DrawDiagram(Item) {
|
||||
var mouseValue = undefined;
|
||||
var mouseColor = undefined;
|
||||
|
||||
function DrawLines(arr, mode, color) {
|
||||
function DrawLines(arr,mode,color)
|
||||
{
|
||||
var WasMove0 = 0;
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(Left, obj.height - Button);
|
||||
ctx.strokeStyle = color;
|
||||
var PrevX = undefined;
|
||||
for (var i = 0; i < arr.length; i++) {
|
||||
for(var i = 0; i < arr.length; i++)
|
||||
{
|
||||
var Value = arr[i];
|
||||
if(!Value)
|
||||
Value = 0;
|
||||
if (Value) {
|
||||
if(Value)
|
||||
{
|
||||
if(Pow2)
|
||||
Value = Math.pow(2, Value) / 1000000;
|
||||
}
|
||||
if (mode === "green") {
|
||||
if(mode === "green")
|
||||
{
|
||||
if(Value > GreenValue)
|
||||
continue;
|
||||
}
|
||||
else
|
||||
if (mode === "red") {
|
||||
if(mode === "red")
|
||||
{
|
||||
if(Value <= GreenValue)
|
||||
continue;
|
||||
}
|
||||
@ -196,23 +217,29 @@ function DrawDiagram(Item) {
|
||||
if(VX1 === VX2)
|
||||
VX1 -= 2;
|
||||
var x = StartX + ctx.lineWidth / 2 + (i) * KX;
|
||||
if (bLine) {
|
||||
if (!WasMove0) {
|
||||
if(bLine)
|
||||
{
|
||||
if(!WasMove0)
|
||||
{
|
||||
WasMove0 = 1;
|
||||
ctx.moveTo(x, StartY - VX2);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
ctx.lineTo(x, StartY - VX2);
|
||||
}
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
ctx.moveTo(x, StartY - VX1);
|
||||
ctx.lineTo(x, StartY - VX2);
|
||||
}
|
||||
if (mouseX) {
|
||||
if(mouseX)
|
||||
{
|
||||
var deltaCur = Math.abs(x - mouseX);
|
||||
var deltaWas = Math.abs(mouseValueX - mouseX);
|
||||
if (deltaCur < deltaWas) {
|
||||
if(deltaCur < deltaWas)
|
||||
{
|
||||
mouseValueX = x;
|
||||
mouseValue = Value;
|
||||
if(Item.zero)
|
||||
@ -225,10 +252,12 @@ function DrawDiagram(Item) {
|
||||
};
|
||||
if(!Item.red)
|
||||
Item.red = "#A00";
|
||||
if (bLine) {
|
||||
if(bLine)
|
||||
{
|
||||
DrawLines(arr, "line", Item.red);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
DrawLines(arr, "red", Item.red);
|
||||
if(GreenValue > 0)
|
||||
DrawLines(arr, "green", "#0A0");
|
||||
@ -246,14 +275,16 @@ function DrawDiagram(Item) {
|
||||
ctx.moveTo(StartX, StartY + DeltaY);
|
||||
ctx.lineTo(obj.width - 10, StartY + DeltaY);
|
||||
ctx.stroke();
|
||||
if (mouseX !== undefined) {
|
||||
if(mouseX !== undefined)
|
||||
{
|
||||
ctx.beginPath();
|
||||
ctx.lineWidth = 0.5;
|
||||
ctx.strokeStyle = "#00F";
|
||||
ctx.moveTo(mouseX, Top);
|
||||
ctx.lineTo(mouseX, StartY);
|
||||
ctx.stroke();
|
||||
if (mouseValue !== undefined) {
|
||||
if(mouseValue !== undefined)
|
||||
{
|
||||
ctx.fillStyle = mouseColor;
|
||||
var Val = GetValueByItemProperty(mouseValue, Item);
|
||||
var mouseTextX = mouseX;
|
||||
@ -267,12 +298,14 @@ function DrawDiagram(Item) {
|
||||
ctx.fillStyle = "#000";
|
||||
if(!Item.NoTextMax)
|
||||
ctx.fillText(Rigth(" " + MaxValueText, 8), 0, Top - 3);
|
||||
if (MaxValue > 0 && AvgValue > 0) {
|
||||
if(MaxValue > 0 && AvgValue > 0)
|
||||
{
|
||||
var heigh = StartY - Top;
|
||||
var KKY = AvgValue / MaxValue;
|
||||
var y = (heigh - Math.floor(KKY * heigh));
|
||||
var yT = y;
|
||||
if (yT < 10) {
|
||||
if(yT < 10)
|
||||
{
|
||||
yT = 10;
|
||||
}
|
||||
ctx.beginPath();
|
||||
@ -289,15 +322,18 @@ function DrawDiagram(Item) {
|
||||
var KDelitel = 1;
|
||||
var Step = arr.length / CountNameX;
|
||||
var StartTime, bNumber;
|
||||
if (arrX) {
|
||||
if(arrX)
|
||||
{
|
||||
}
|
||||
else
|
||||
if (StartNumber !== undefined) {
|
||||
if(StartNumber !== undefined)
|
||||
{
|
||||
bNumber = 1;
|
||||
StartTime = StartNumber;
|
||||
}
|
||||
else
|
||||
if (StartServer) {
|
||||
if(StartServer)
|
||||
{
|
||||
bNumber = 1;
|
||||
StartTime = Math.floor(((Date.now() - StartServer) - StepTime * arr.length * 1000) / 1000);
|
||||
if(StartTime < 0)
|
||||
@ -306,14 +342,17 @@ function DrawDiagram(Item) {
|
||||
if(KDelitel == 0)
|
||||
KDelitel = 1;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
bNumber = 0;
|
||||
StartTime = Date.now() - StepTime * arr.length * 1000;
|
||||
StartX = StartX - 16;
|
||||
}
|
||||
for (i = 0; i <= CountNameX; i++) {
|
||||
for(i = 0; i <= CountNameX; i++)
|
||||
{
|
||||
var Val;
|
||||
if (i === CountNameX) {
|
||||
if(i === CountNameX)
|
||||
{
|
||||
Val = arr.length * StepTime;
|
||||
KDelitel = 1;
|
||||
}
|
||||
@ -323,18 +362,21 @@ function DrawDiagram(Item) {
|
||||
else
|
||||
Val = i * Step * StepTime;
|
||||
var Str;
|
||||
if (arrX) {
|
||||
if(arrX)
|
||||
{
|
||||
Val = Math.floor(Val);
|
||||
Str = arrX[Val];
|
||||
if(Str === undefined)
|
||||
Str = "";
|
||||
}
|
||||
else
|
||||
if (bNumber) {
|
||||
if(bNumber)
|
||||
{
|
||||
Val = Math.floor((StartTime + Val) / KDelitel) * KDelitel;
|
||||
Str = Val;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
var Time = new Date(StartTime + Val * 1000);
|
||||
Str = "" + Time.getHours();
|
||||
Str += ":" + Rigth("0" + Time.getMinutes(), 2);
|
||||
@ -344,8 +386,10 @@ function DrawDiagram(Item) {
|
||||
}
|
||||
};
|
||||
|
||||
function GetValueByItemProperty(Value, Item) {
|
||||
if (Item.MathPow && Item.MathDiv) {
|
||||
function GetValueByItemProperty(Value,Item)
|
||||
{
|
||||
if(Item.MathPow && Item.MathDiv)
|
||||
{
|
||||
Value = Math.pow(Item.MathPow, Value) / Item.MathDiv;
|
||||
}
|
||||
var KPrecision = Item.KPrecision;
|
||||
@ -355,23 +399,29 @@ function GetValueByItemProperty(Value, Item) {
|
||||
return Value;
|
||||
};
|
||||
|
||||
function InitDiagramByArr(Arr, width) {
|
||||
for (var i = 0; i < Arr.length; i++) {
|
||||
function InitDiagramByArr(Arr,width)
|
||||
{
|
||||
for(var i = 0; i < Arr.length; i++)
|
||||
{
|
||||
Arr[i].num = i + 1;
|
||||
SetHTMLDiagramItem(Arr[i], width);
|
||||
}
|
||||
window.addEventListener('mousedown', function(event) {
|
||||
window.addEventListener('mousedown', function (event)
|
||||
{
|
||||
SetDiagramMouseX(event, "down");
|
||||
}, false);
|
||||
window.addEventListener('mouseup', function(event) {
|
||||
window.addEventListener('mouseup', function (event)
|
||||
{
|
||||
SetDiagramMouseX(event, "up");
|
||||
}, false);
|
||||
window.addEventListener('onmousemove', function(event) {
|
||||
window.addEventListener('onmousemove', function (event)
|
||||
{
|
||||
SetDiagramMouseX(event, "move");
|
||||
}, false);
|
||||
};
|
||||
|
||||
function getMouse(canvas, e) {
|
||||
function getMouse(canvas,e)
|
||||
{
|
||||
var x = e.clientX - getTrueOffsetLeft(canvas);
|
||||
if(window.pageXOffset)
|
||||
x = x + window.pageXOffset;
|
||||
@ -382,18 +432,22 @@ function getMouse(canvas, e) {
|
||||
return coord;
|
||||
};
|
||||
|
||||
function getTrueOffsetLeft(ele) {
|
||||
function getTrueOffsetLeft(ele)
|
||||
{
|
||||
var n = 0;
|
||||
while (ele) {
|
||||
while(ele)
|
||||
{
|
||||
n += ele.offsetLeft || 0;
|
||||
ele = ele.offsetParent;
|
||||
}
|
||||
return n;
|
||||
};
|
||||
|
||||
function getTrueOffsetTop(ele) {
|
||||
function getTrueOffsetTop(ele)
|
||||
{
|
||||
var n = 0;
|
||||
while (ele) {
|
||||
while(ele)
|
||||
{
|
||||
n += ele.offsetTop || 0;
|
||||
ele = ele.offsetParent;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -11,39 +11,48 @@
|
||||
|
||||
"use strict";
|
||||
var der = require("./der"), toString = Object.prototype.toString, exports = {}, assert = exports;
|
||||
exports.isArray = function(e, s) {
|
||||
exports.isArray = function (e,s)
|
||||
{
|
||||
if(!Array.isArray(e))
|
||||
throw TypeError(s);
|
||||
}, exports.isBoolean = function(e, s) {
|
||||
}, exports.isBoolean = function (e,s)
|
||||
{
|
||||
if("[object Boolean]" !== toString.call(e))
|
||||
throw TypeError(s);
|
||||
}, exports.isBuffer = function(e, s) {
|
||||
}, exports.isBuffer = function (e,s)
|
||||
{
|
||||
if(!Buffer.isBuffer(e))
|
||||
throw TypeError(s);
|
||||
}, exports.isFunction = function(e, s) {
|
||||
}, exports.isFunction = function (e,s)
|
||||
{
|
||||
if("[object Function]" !== toString.call(e))
|
||||
throw TypeError(s);
|
||||
}, exports.isNumber = function(e, s) {
|
||||
}, exports.isNumber = function (e,s)
|
||||
{
|
||||
if("[object Number]" !== toString.call(e))
|
||||
throw TypeError(s);
|
||||
}, exports.isObject = function(e, s) {
|
||||
}, exports.isObject = function (e,s)
|
||||
{
|
||||
if("[object Object]" !== toString.call(e))
|
||||
throw TypeError(s);
|
||||
}, exports.isBufferLength = function(e, s, r) {
|
||||
}, exports.isBufferLength = function (e,s,r)
|
||||
{
|
||||
if(e.length !== s)
|
||||
throw RangeError(r);
|
||||
}, exports.isBufferLength2 = function(e, s, r, _) {
|
||||
}, exports.isBufferLength2 = function (e,s,r,_)
|
||||
{
|
||||
if(e.length !== s && e.length !== r)
|
||||
throw RangeError(_);
|
||||
}, exports.isLengthGTZero = function(e, s) {
|
||||
}, exports.isLengthGTZero = function (e,s)
|
||||
{
|
||||
if(0 === e.length)
|
||||
throw RangeError(s);
|
||||
}, exports.isNumberInInterval = function(e, s, r, _) {
|
||||
}, exports.isNumberInInterval = function (e,s,r,_)
|
||||
{
|
||||
if(e <= s || r <= e)
|
||||
throw RangeError(_);
|
||||
};
|
||||
var messages = {
|
||||
COMPRESSED_TYPE_INVALID: "compressed should be a boolean", EC_PRIVATE_KEY_TYPE_INVALID: "private key should be a Buffer",
|
||||
var messages = {COMPRESSED_TYPE_INVALID:"compressed should be a boolean", EC_PRIVATE_KEY_TYPE_INVALID:"private key should be a Buffer",
|
||||
EC_PRIVATE_KEY_LENGTH_INVALID:"private key length is invalid", EC_PRIVATE_KEY_RANGE_INVALID:"private key range is invalid",
|
||||
EC_PRIVATE_KEY_TWEAK_ADD_FAIL:"tweak out of range or resulting private key is invalid", EC_PRIVATE_KEY_TWEAK_MUL_FAIL:"tweak out of range",
|
||||
EC_PRIVATE_KEY_EXPORT_DER_FAIL:"couldn't export to DER format", EC_PRIVATE_KEY_IMPORT_DER_FAIL:"couldn't import from DER format",
|
||||
@ -57,104 +66,125 @@ var messages = {
|
||||
MSG32_TYPE_INVALID:"message should be a Buffer", MSG32_LENGTH_INVALID:"message length is invalid", OPTIONS_TYPE_INVALID:"options should be an Object",
|
||||
OPTIONS_DATA_TYPE_INVALID:"options.data should be a Buffer", OPTIONS_DATA_LENGTH_INVALID:"options.data length is invalid",
|
||||
OPTIONS_NONCEFN_TYPE_INVALID:"options.noncefn should be a Function", RECOVERY_ID_TYPE_INVALID:"recovery should be a Number",
|
||||
RECOVERY_ID_VALUE_INVALID: "recovery should have value between -1 and 4", TWEAK_TYPE_INVALID: "tweak should be a Buffer", TWEAK_LENGTH_INVALID: "tweak length is invalid"
|
||||
};
|
||||
RECOVERY_ID_VALUE_INVALID:"recovery should have value between -1 and 4", TWEAK_TYPE_INVALID:"tweak should be a Buffer", TWEAK_LENGTH_INVALID:"tweak length is invalid"};
|
||||
|
||||
function initCompressedValue(e, s) {
|
||||
function initCompressedValue(e,s)
|
||||
{
|
||||
return void 0 === e ? s : (assert.isBoolean(e, messages.COMPRESSED_TYPE_INVALID), e);
|
||||
};
|
||||
module.exports = function(E) {
|
||||
return {
|
||||
privateKeyVerify: function(e) {
|
||||
module.exports = function (E)
|
||||
{
|
||||
return {privateKeyVerify:function (e)
|
||||
{
|
||||
return assert.isBuffer(e, messages.EC_PRIVATE_KEY_TYPE_INVALID), 32 === e.length && E.privateKeyVerify(e);
|
||||
}, privateKeyExport: function(e, s) {
|
||||
}, privateKeyExport:function (e,s)
|
||||
{
|
||||
assert.isBuffer(e, messages.EC_PRIVATE_KEY_TYPE_INVALID), assert.isBufferLength(e, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID),
|
||||
s = initCompressedValue(s, !0);
|
||||
var r = E.privateKeyExport(e, s);
|
||||
return der.privateKeyExport(e, r, s);
|
||||
}, privateKeyImport: function(e) {
|
||||
}, privateKeyImport:function (e)
|
||||
{
|
||||
if(assert.isBuffer(e, messages.EC_PRIVATE_KEY_TYPE_INVALID), (e = der.privateKeyImport(e)) && 32 === e.length && E.privateKeyVerify(e))
|
||||
return e;
|
||||
throw new Error(messages.EC_PRIVATE_KEY_IMPORT_DER_FAIL);
|
||||
}, privateKeyNegate: function(e) {
|
||||
}, privateKeyNegate:function (e)
|
||||
{
|
||||
return assert.isBuffer(e, messages.EC_PRIVATE_KEY_TYPE_INVALID), assert.isBufferLength(e, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID),
|
||||
E.privateKeyNegate(e);
|
||||
}, privateKeyModInverse: function(e) {
|
||||
}, privateKeyModInverse:function (e)
|
||||
{
|
||||
return assert.isBuffer(e, messages.EC_PRIVATE_KEY_TYPE_INVALID), assert.isBufferLength(e, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID),
|
||||
E.privateKeyModInverse(e);
|
||||
}, privateKeyTweakAdd: function(e, s) {
|
||||
}, privateKeyTweakAdd:function (e,s)
|
||||
{
|
||||
return assert.isBuffer(e, messages.EC_PRIVATE_KEY_TYPE_INVALID), assert.isBufferLength(e, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID),
|
||||
assert.isBuffer(s, messages.TWEAK_TYPE_INVALID), assert.isBufferLength(s, 32, messages.TWEAK_LENGTH_INVALID), E.privateKeyTweakAdd(e,
|
||||
s);
|
||||
}, privateKeyTweakMul: function(e, s) {
|
||||
}, privateKeyTweakMul:function (e,s)
|
||||
{
|
||||
return assert.isBuffer(e, messages.EC_PRIVATE_KEY_TYPE_INVALID), assert.isBufferLength(e, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID),
|
||||
assert.isBuffer(s, messages.TWEAK_TYPE_INVALID), assert.isBufferLength(s, 32, messages.TWEAK_LENGTH_INVALID), E.privateKeyTweakMul(e,
|
||||
s);
|
||||
}, publicKeyCreate: function(e, s) {
|
||||
}, publicKeyCreate:function (e,s)
|
||||
{
|
||||
return assert.isBuffer(e, messages.EC_PRIVATE_KEY_TYPE_INVALID), assert.isBufferLength(e, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID),
|
||||
s = initCompressedValue(s, !0), E.publicKeyCreate(e, s);
|
||||
}, publicKeyConvert: function(e, s) {
|
||||
}, publicKeyConvert:function (e,s)
|
||||
{
|
||||
return assert.isBuffer(e, messages.EC_PUBLIC_KEY_TYPE_INVALID), assert.isBufferLength2(e, 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID),
|
||||
s = initCompressedValue(s, !0), E.publicKeyConvert(e, s);
|
||||
}, publicKeyVerify: function(e) {
|
||||
}, publicKeyVerify:function (e)
|
||||
{
|
||||
return assert.isBuffer(e, messages.EC_PUBLIC_KEY_TYPE_INVALID), E.publicKeyVerify(e);
|
||||
}, publicKeyTweakAdd: function(e, s, r) {
|
||||
}, publicKeyTweakAdd:function (e,s,r)
|
||||
{
|
||||
return assert.isBuffer(e, messages.EC_PUBLIC_KEY_TYPE_INVALID), assert.isBufferLength2(e, 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID),
|
||||
assert.isBuffer(s, messages.TWEAK_TYPE_INVALID), assert.isBufferLength(s, 32, messages.TWEAK_LENGTH_INVALID), r = initCompressedValue(r,
|
||||
!0), E.publicKeyTweakAdd(e, s, r);
|
||||
}, publicKeyTweakMul: function(e, s, r) {
|
||||
}, publicKeyTweakMul:function (e,s,r)
|
||||
{
|
||||
return assert.isBuffer(e, messages.EC_PUBLIC_KEY_TYPE_INVALID), assert.isBufferLength2(e, 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID),
|
||||
assert.isBuffer(s, messages.TWEAK_TYPE_INVALID), assert.isBufferLength(s, 32, messages.TWEAK_LENGTH_INVALID), r = initCompressedValue(r,
|
||||
!0), E.publicKeyTweakMul(e, s, r);
|
||||
}, publicKeyCombine: function(e, s) {
|
||||
}, publicKeyCombine:function (e,s)
|
||||
{
|
||||
assert.isArray(e, messages.EC_PUBLIC_KEYS_TYPE_INVALID), assert.isLengthGTZero(e, messages.EC_PUBLIC_KEYS_LENGTH_INVALID);
|
||||
for(var r = 0; r < e.length; ++r)
|
||||
assert.isBuffer(e[r], messages.EC_PUBLIC_KEY_TYPE_INVALID), assert.isBufferLength2(e[r], 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID);
|
||||
return s = initCompressedValue(s, !0), E.publicKeyCombine(e, s);
|
||||
}, signatureNormalize: function(e) {
|
||||
}, signatureNormalize:function (e)
|
||||
{
|
||||
return assert.isBuffer(e, messages.ECDSA_SIGNATURE_TYPE_INVALID), assert.isBufferLength(e, 64, messages.ECDSA_SIGNATURE_LENGTH_INVALID),
|
||||
E.signatureNormalize(e);
|
||||
}, signatureExport: function(e) {
|
||||
}, signatureExport:function (e)
|
||||
{
|
||||
assert.isBuffer(e, messages.ECDSA_SIGNATURE_TYPE_INVALID), assert.isBufferLength(e, 64, messages.ECDSA_SIGNATURE_LENGTH_INVALID);
|
||||
var s = E.signatureExport(e);
|
||||
return der.signatureExport(s);
|
||||
}, signatureImport: function(e) {
|
||||
}, signatureImport:function (e)
|
||||
{
|
||||
assert.isBuffer(e, messages.ECDSA_SIGNATURE_TYPE_INVALID), assert.isLengthGTZero(e, messages.ECDSA_SIGNATURE_LENGTH_INVALID);
|
||||
var s = der.signatureImport(e);
|
||||
if(s)
|
||||
return E.signatureImport(s);
|
||||
throw new Error(messages.ECDSA_SIGNATURE_PARSE_DER_FAIL);
|
||||
}, signatureImportLax: function(e) {
|
||||
}, signatureImportLax:function (e)
|
||||
{
|
||||
assert.isBuffer(e, messages.ECDSA_SIGNATURE_TYPE_INVALID), assert.isLengthGTZero(e, messages.ECDSA_SIGNATURE_LENGTH_INVALID);
|
||||
var s = der.signatureImportLax(e);
|
||||
if(s)
|
||||
return E.signatureImport(s);
|
||||
throw new Error(messages.ECDSA_SIGNATURE_PARSE_DER_FAIL);
|
||||
}, sign: function(e, s, r) {
|
||||
}, sign:function (e,s,r)
|
||||
{
|
||||
assert.isBuffer(e, messages.MSG32_TYPE_INVALID), assert.isBufferLength(e, 32, messages.MSG32_LENGTH_INVALID), assert.isBuffer(s,
|
||||
messages.EC_PRIVATE_KEY_TYPE_INVALID), assert.isBufferLength(s, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID);
|
||||
var _ = null, t = null;
|
||||
return void 0 !== r && (assert.isObject(r, messages.OPTIONS_TYPE_INVALID), void 0 !== r.data && (assert.isBuffer(r.data, messages.OPTIONS_DATA_TYPE_INVALID),
|
||||
assert.isBufferLength(r.data, 32, messages.OPTIONS_DATA_LENGTH_INVALID), _ = r.data), void 0 !== r.noncefn && (assert.isFunction(r.noncefn,
|
||||
messages.OPTIONS_NONCEFN_TYPE_INVALID), t = r.noncefn)), E.sign(e, s, t, _);
|
||||
}, verify: function(e, s, r) {
|
||||
}, verify:function (e,s,r)
|
||||
{
|
||||
return assert.isBuffer(e, messages.MSG32_TYPE_INVALID), assert.isBufferLength(e, 32, messages.MSG32_LENGTH_INVALID), assert.isBuffer(s,
|
||||
messages.ECDSA_SIGNATURE_TYPE_INVALID), assert.isBufferLength(s, 64, messages.ECDSA_SIGNATURE_LENGTH_INVALID), assert.isBuffer(r,
|
||||
messages.EC_PUBLIC_KEY_TYPE_INVALID), assert.isBufferLength2(r, 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID), E.verify(e,
|
||||
s, r);
|
||||
}, recover: function(e, s, r, _) {
|
||||
}, recover:function (e,s,r,_)
|
||||
{
|
||||
return assert.isBuffer(e, messages.MSG32_TYPE_INVALID), assert.isBufferLength(e, 32, messages.MSG32_LENGTH_INVALID), assert.isBuffer(s,
|
||||
messages.ECDSA_SIGNATURE_TYPE_INVALID), assert.isBufferLength(s, 64, messages.ECDSA_SIGNATURE_LENGTH_INVALID), assert.isNumber(r,
|
||||
messages.RECOVERY_ID_TYPE_INVALID), assert.isNumberInInterval(r, - 1, 4, messages.RECOVERY_ID_VALUE_INVALID), _ = initCompressedValue(_,
|
||||
!0), E.recover(e, s, r, _);
|
||||
}, ecdh: function(e, s) {
|
||||
}, ecdh:function (e,s)
|
||||
{
|
||||
return assert.isBuffer(e, messages.EC_PUBLIC_KEY_TYPE_INVALID), assert.isBufferLength2(e, 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID),
|
||||
assert.isBuffer(s, messages.EC_PRIVATE_KEY_TYPE_INVALID), assert.isBufferLength(s, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID),
|
||||
E.ecdh(e, s);
|
||||
}, ecdhUnsafe: function(e, s, r) {
|
||||
}, ecdhUnsafe:function (e,s,r)
|
||||
{
|
||||
return assert.isBuffer(e, messages.EC_PUBLIC_KEY_TYPE_INVALID), assert.isBufferLength2(e, 33, 65, messages.EC_PUBLIC_KEY_LENGTH_INVALID),
|
||||
assert.isBuffer(s, messages.EC_PRIVATE_KEY_TYPE_INVALID), assert.isBufferLength(s, 32, messages.EC_PRIVATE_KEY_LENGTH_INVALID),
|
||||
r = initCompressedValue(r, !0), E.ecdhUnsafe(e, s, r);
|
||||
}
|
||||
};
|
||||
}};
|
||||
}, global.SIGN_LIB = module.exports;
|
||||
|
@ -8,14 +8,17 @@
|
||||
* Telegram: https://t.me/terafoundation
|
||||
*/
|
||||
|
||||
(function() {
|
||||
(function ()
|
||||
{
|
||||
'use strict';
|
||||
var root = typeof window === 'object' ? window : {};
|
||||
var NODE_JS = !root.JS_SHA3_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
|
||||
if (NODE_JS && !root.RUN_NW_CLIENT) {
|
||||
if(NODE_JS && !root.RUN_NW_CLIENT)
|
||||
{
|
||||
root = global;
|
||||
}
|
||||
if (root.RUN_CLIENT) {
|
||||
if(root.RUN_CLIENT)
|
||||
{
|
||||
root = window;
|
||||
}
|
||||
var COMMON_JS = !root.JS_SHA3_NO_COMMON_JS && typeof module === 'object' && module.exports;
|
||||
@ -34,117 +37,141 @@
|
||||
var SHAKE_BITS = [128, 256];
|
||||
var OUTPUT_TYPES = ['hex', 'buffer', 'arrayBuffer', 'array'];
|
||||
var CSHAKE_BYTEPAD = {'128':168, '256':136};
|
||||
if (root.JS_SHA3_NO_NODE_JS || !Array.isArray) {
|
||||
Array.isArray = function(obj) {
|
||||
if(root.JS_SHA3_NO_NODE_JS || !Array.isArray)
|
||||
{
|
||||
Array.isArray = function (obj)
|
||||
{
|
||||
return Object.prototype.toString.call(obj) === '[object Array]';
|
||||
};
|
||||
}
|
||||
var createOutputMethod = function(bits, padding, outputType) {
|
||||
return function(message) {
|
||||
var createOutputMethod = function (bits,padding,outputType)
|
||||
{
|
||||
return function (message)
|
||||
{
|
||||
return new Keccak(bits, padding, bits).update(message)[outputType]();
|
||||
};
|
||||
};
|
||||
var createShakeOutputMethod = function(bits, padding, outputType) {
|
||||
return function(message, outputBits) {
|
||||
var createShakeOutputMethod = function (bits,padding,outputType)
|
||||
{
|
||||
return function (message,outputBits)
|
||||
{
|
||||
return new Keccak(bits, padding, outputBits).update(message)[outputType]();
|
||||
};
|
||||
};
|
||||
var createCshakeOutputMethod = function(bits, padding, outputType) {
|
||||
return function(message, outputBits, n, s) {
|
||||
var createCshakeOutputMethod = function (bits,padding,outputType)
|
||||
{
|
||||
return function (message,outputBits,n,s)
|
||||
{
|
||||
return methods['cshake' + bits].update(message, outputBits, n, s)[outputType]();
|
||||
};
|
||||
};
|
||||
var createKmacOutputMethod = function(bits, padding, outputType) {
|
||||
return function(key, message, outputBits, s) {
|
||||
var createKmacOutputMethod = function (bits,padding,outputType)
|
||||
{
|
||||
return function (key,message,outputBits,s)
|
||||
{
|
||||
return methods['kmac' + bits].update(key, message, outputBits, s)[outputType]();
|
||||
};
|
||||
};
|
||||
var createOutputMethods = function(method, createMethod, bits, padding) {
|
||||
for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
|
||||
var createOutputMethods = function (method,createMethod,bits,padding)
|
||||
{
|
||||
for(var i = 0; i < OUTPUT_TYPES.length; ++i)
|
||||
{
|
||||
var type = OUTPUT_TYPES[i];
|
||||
method[type] = createMethod(bits, padding, type);
|
||||
}
|
||||
return method;
|
||||
};
|
||||
var createMethod = function(bits, padding, outputs) {
|
||||
var createMethod = function (bits,padding,outputs)
|
||||
{
|
||||
var method = createOutputMethod(bits, padding, outputs);
|
||||
method.create = function() {
|
||||
method.create = function ()
|
||||
{
|
||||
return new Keccak(bits, padding, bits);
|
||||
};
|
||||
method.update = function(message) {
|
||||
method.update = function (message)
|
||||
{
|
||||
return method.create().update(message);
|
||||
};
|
||||
return createOutputMethods(method, createOutputMethod, bits, padding);
|
||||
};
|
||||
var createMethodArray = function(bits, padding) {
|
||||
var createMethodArray = function (bits,padding)
|
||||
{
|
||||
var method = createOutputMethod(bits, padding, 'array');
|
||||
method.create = function() {
|
||||
method.create = function ()
|
||||
{
|
||||
return new Keccak(bits, padding, bits);
|
||||
};
|
||||
method.update = function(message) {
|
||||
method.update = function (message)
|
||||
{
|
||||
return method.create().update(message);
|
||||
};
|
||||
return createOutputMethods(method, createOutputMethod, bits, padding);
|
||||
};
|
||||
var createShakeMethod = function(bits, padding) {
|
||||
var createShakeMethod = function (bits,padding)
|
||||
{
|
||||
var method = createShakeOutputMethod(bits, padding, 'hex');
|
||||
method.create = function(outputBits) {
|
||||
method.create = function (outputBits)
|
||||
{
|
||||
return new Keccak(bits, padding, outputBits);
|
||||
};
|
||||
method.update = function(message, outputBits) {
|
||||
method.update = function (message,outputBits)
|
||||
{
|
||||
return method.create(outputBits).update(message);
|
||||
};
|
||||
return createOutputMethods(method, createShakeOutputMethod, bits, padding);
|
||||
};
|
||||
var createCshakeMethod = function(bits, padding) {
|
||||
var createCshakeMethod = function (bits,padding)
|
||||
{
|
||||
var w = CSHAKE_BYTEPAD[bits];
|
||||
var method = createCshakeOutputMethod(bits, padding, 'hex');
|
||||
method.create = function(outputBits, n, s) {
|
||||
if (!n && !s) {
|
||||
method.create = function (outputBits,n,s)
|
||||
{
|
||||
if(!n && !s)
|
||||
{
|
||||
return methods['shake' + bits].create(outputBits);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
return new Keccak(bits, padding, outputBits).bytepad([n, s], w);
|
||||
}
|
||||
};
|
||||
method.update = function(message, outputBits, n, s) {
|
||||
method.update = function (message,outputBits,n,s)
|
||||
{
|
||||
return method.create(outputBits, n, s).update(message);
|
||||
};
|
||||
return createOutputMethods(method, createCshakeOutputMethod, bits, padding);
|
||||
};
|
||||
var createKmacMethod = function(bits, padding) {
|
||||
var createKmacMethod = function (bits,padding)
|
||||
{
|
||||
var w = CSHAKE_BYTEPAD[bits];
|
||||
var method = createKmacOutputMethod(bits, padding, 'hex');
|
||||
method.create = function(key, outputBits, s) {
|
||||
method.create = function (key,outputBits,s)
|
||||
{
|
||||
return new Kmac(bits, padding, outputBits).bytepad(['KMAC', s], w).bytepad([key], w);
|
||||
};
|
||||
method.update = function(key, message, outputBits, s) {
|
||||
method.update = function (key,message,outputBits,s)
|
||||
{
|
||||
return method.create(key, outputBits, s).update(message);
|
||||
};
|
||||
return createOutputMethods(method, createKmacOutputMethod, bits, padding);
|
||||
};
|
||||
var algorithms = [{ name: 'keccak', padding: KECCAK_PADDING, bits: BITS, createMethod: createMethod }, {
|
||||
name: 'sha3', padding: PADDING,
|
||||
bits: BITS, createMethod: createMethod, outputs: 'hex'
|
||||
}, {
|
||||
name: 'sha3_array', padding: PADDING, bits: BITS, createMethod: createMethod,
|
||||
outputs: 'array'
|
||||
}, { name: 'sha3_buf', padding: PADDING, bits: BITS, createMethod: createMethod, outputs: 'buffer' }, {
|
||||
name: 'shake',
|
||||
padding: SHAKE_PADDING, bits: SHAKE_BITS, createMethod: createShakeMethod
|
||||
}, {
|
||||
name: 'cshake', padding: CSHAKE_PADDING, bits: SHAKE_BITS,
|
||||
createMethod: createCshakeMethod
|
||||
}, { name: 'kmac', padding: CSHAKE_PADDING, bits: SHAKE_BITS, createMethod: createKmacMethod }];
|
||||
var algorithms = [{name:'keccak', padding:KECCAK_PADDING, bits:BITS, createMethod:createMethod}, {name:'sha3', padding:PADDING,
|
||||
bits:BITS, createMethod:createMethod, outputs:'hex'}, {name:'sha3_array', padding:PADDING, bits:BITS, createMethod:createMethod,
|
||||
outputs:'array'}, {name:'sha3_buf', padding:PADDING, bits:BITS, createMethod:createMethod, outputs:'buffer'}, {name:'shake',
|
||||
padding:SHAKE_PADDING, bits:SHAKE_BITS, createMethod:createShakeMethod}, {name:'cshake', padding:CSHAKE_PADDING, bits:SHAKE_BITS,
|
||||
createMethod:createCshakeMethod}, {name:'kmac', padding:CSHAKE_PADDING, bits:SHAKE_BITS, createMethod:createKmacMethod}];
|
||||
var methods = {}, methodNames = [];
|
||||
for (var i = 0; i < algorithms.length; ++i) {
|
||||
for(var i = 0; i < algorithms.length; ++i)
|
||||
{
|
||||
var algorithm = algorithms[i];
|
||||
var bits = algorithm.bits;
|
||||
for (var j = 0; j < bits.length; ++j) {
|
||||
for(var j = 0; j < bits.length; ++j)
|
||||
{
|
||||
var methodName = algorithm.name + '_' + bits[j];
|
||||
methodNames.push(methodName);
|
||||
methods[methodName] = algorithm.createMethod(bits[j], algorithm.padding, algorithm.outputs);
|
||||
if (algorithm.name !== 'sha3') {
|
||||
if(algorithm.name !== 'sha3')
|
||||
{
|
||||
var newMethodName = algorithm.name + bits[j];
|
||||
methodNames.push(newMethodName);
|
||||
methods[newMethodName] = methods[methodName];
|
||||
@ -152,7 +179,8 @@
|
||||
}
|
||||
}
|
||||
|
||||
function Keccak(bits, padding, outputBits) {
|
||||
function Keccak(bits,padding,outputBits)
|
||||
{
|
||||
this.blocks = [];
|
||||
this.s = [];
|
||||
this.padding = padding;
|
||||
@ -164,55 +192,71 @@
|
||||
this.byteCount = this.blockCount << 2;
|
||||
this.outputBlocks = outputBits >> 5;
|
||||
this.extraBytes = (outputBits & 31) >> 3;
|
||||
for (var i = 0; i < 50; ++i) {
|
||||
for(var i = 0; i < 50; ++i)
|
||||
{
|
||||
this.s[i] = 0;
|
||||
}
|
||||
};
|
||||
Keccak.prototype.update = function(message) {
|
||||
Keccak.prototype.update = function (message)
|
||||
{
|
||||
var notString = typeof message !== 'string';
|
||||
if (notString && message.constructor === root.ArrayBuffer) {
|
||||
if(notString && message.constructor === root.ArrayBuffer)
|
||||
{
|
||||
TO_ERROR_LOG("SHA3", 10, 'ERROR: Error type ArrayBuffer, use Uint8Array instead!');
|
||||
return [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||
}
|
||||
var length = message.length;
|
||||
if (notString) {
|
||||
if (typeof length !== 'number' || !Array.isArray(message) && !(ARRAY_BUFFER && ArrayBuffer.isView(message))) {
|
||||
if(notString)
|
||||
{
|
||||
if(typeof length !== 'number' || !Array.isArray(message) && !(ARRAY_BUFFER && ArrayBuffer.isView(message)))
|
||||
{
|
||||
TO_ERROR_LOG("SHA3", 20, 'ERROR: Input is invalid type, message=' + JSON.stringify(message));
|
||||
return [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||
}
|
||||
}
|
||||
var blocks = this.blocks, byteCount = this.byteCount, blockCount = this.blockCount, index = 0, s = this.s, i, code;
|
||||
while (index < length) {
|
||||
if (this.reset) {
|
||||
while(index < length)
|
||||
{
|
||||
if(this.reset)
|
||||
{
|
||||
this.reset = false;
|
||||
blocks[0] = this.block;
|
||||
for (i = 1; i < blockCount + 1; ++i) {
|
||||
for(i = 1; i < blockCount + 1; ++i)
|
||||
{
|
||||
blocks[i] = 0;
|
||||
}
|
||||
}
|
||||
if (notString) {
|
||||
for (i = this.start; index < length && i < byteCount; ++index) {
|
||||
if(notString)
|
||||
{
|
||||
for(i = this.start; index < length && i < byteCount; ++index)
|
||||
{
|
||||
blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i = this.start; index < length && i < byteCount; ++index) {
|
||||
else
|
||||
{
|
||||
for(i = this.start; index < length && i < byteCount; ++index)
|
||||
{
|
||||
code = message.charCodeAt(index);
|
||||
if (code < 0x80) {
|
||||
if(code < 0x80)
|
||||
{
|
||||
blocks[i >> 2] |= code << SHIFT[i++ & 3];
|
||||
}
|
||||
else
|
||||
if (code < 0x800) {
|
||||
if(code < 0x800)
|
||||
{
|
||||
blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
|
||||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
||||
}
|
||||
else
|
||||
if (code < 0xd800 || code >= 0xe000) {
|
||||
if(code < 0xd800 || code >= 0xe000)
|
||||
{
|
||||
blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
|
||||
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
||||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
||||
blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
|
||||
blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
|
||||
@ -222,73 +266,91 @@
|
||||
}
|
||||
}
|
||||
this.lastByteIndex = i;
|
||||
if (i >= byteCount) {
|
||||
if(i >= byteCount)
|
||||
{
|
||||
this.start = i - byteCount;
|
||||
this.block = blocks[blockCount];
|
||||
for (i = 0; i < blockCount; ++i) {
|
||||
for(i = 0; i < blockCount; ++i)
|
||||
{
|
||||
s[i] ^= blocks[i];
|
||||
}
|
||||
f(s);
|
||||
this.reset = true;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
this.start = i;
|
||||
}
|
||||
}
|
||||
return this;
|
||||
};
|
||||
Keccak.prototype.encode = function(x, right) {
|
||||
Keccak.prototype.encode = function (x,right)
|
||||
{
|
||||
var o = x & 255, n = 1;
|
||||
var bytes = [o];
|
||||
x = x >> 8;
|
||||
o = x & 255;
|
||||
while (o > 0) {
|
||||
while(o > 0)
|
||||
{
|
||||
bytes.unshift(o);
|
||||
x = x >> 8;
|
||||
o = x & 255;
|
||||
++n;
|
||||
}
|
||||
if (right) {
|
||||
if(right)
|
||||
{
|
||||
bytes.push(n);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
bytes.unshift(n);
|
||||
}
|
||||
this.update(bytes);
|
||||
return bytes.length;
|
||||
};
|
||||
Keccak.prototype.encodeString = function(str) {
|
||||
Keccak.prototype.encodeString = function (str)
|
||||
{
|
||||
str = str || '';
|
||||
var notString = typeof str !== 'string';
|
||||
if (notString && str.constructor === root.ArrayBuffer) {
|
||||
if(notString && str.constructor === root.ArrayBuffer)
|
||||
{
|
||||
str = new Uint8Array(str);
|
||||
}
|
||||
var length = str.length;
|
||||
if (notString) {
|
||||
if (typeof length !== 'number' || !Array.isArray(str) && !(ARRAY_BUFFER && ArrayBuffer.isView(str))) {
|
||||
if(notString)
|
||||
{
|
||||
if(typeof length !== 'number' || !Array.isArray(str) && !(ARRAY_BUFFER && ArrayBuffer.isView(str)))
|
||||
{
|
||||
TO_ERROR_LOG("SHA3", 30, 'ERROR: Input is invalid type, str=' + JSON.stringify(str));
|
||||
return [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||
}
|
||||
}
|
||||
var bytes = 0;
|
||||
if (notString) {
|
||||
if(notString)
|
||||
{
|
||||
bytes = length;
|
||||
}
|
||||
else {
|
||||
for (var i = 0; i < str.length; ++i) {
|
||||
else
|
||||
{
|
||||
for(var i = 0; i < str.length; ++i)
|
||||
{
|
||||
var code = str.charCodeAt(i);
|
||||
if (code < 0x80) {
|
||||
if(code < 0x80)
|
||||
{
|
||||
bytes += 1;
|
||||
}
|
||||
else
|
||||
if (code < 0x800) {
|
||||
if(code < 0x800)
|
||||
{
|
||||
bytes += 2;
|
||||
}
|
||||
else
|
||||
if (code < 0xd800 || code >= 0xe000) {
|
||||
if(code < 0xd800 || code >= 0xe000)
|
||||
{
|
||||
bytes += 3;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
code = 0x10000 + (((code & 0x3ff) << 10) | (str.charCodeAt(++i) & 0x3ff));
|
||||
bytes += 4;
|
||||
}
|
||||
@ -298,9 +360,11 @@
|
||||
this.update(str);
|
||||
return bytes;
|
||||
};
|
||||
Keccak.prototype.bytepad = function(strs, w) {
|
||||
Keccak.prototype.bytepad = function (strs,w)
|
||||
{
|
||||
var bytes = this.encode(w);
|
||||
for (var i = 0; i < strs.length; ++i) {
|
||||
for(var i = 0; i < strs.length; ++i)
|
||||
{
|
||||
bytes += this.encodeString(strs[i]);
|
||||
}
|
||||
var paddingBytes = w - bytes % w;
|
||||
@ -309,82 +373,104 @@
|
||||
this.update(zeros);
|
||||
return this;
|
||||
};
|
||||
Keccak.prototype.finalize = function() {
|
||||
Keccak.prototype.finalize = function ()
|
||||
{
|
||||
var blocks = this.blocks, i = this.lastByteIndex, blockCount = this.blockCount, s = this.s;
|
||||
blocks[i >> 2] |= this.padding[i & 3];
|
||||
if (this.lastByteIndex === this.byteCount) {
|
||||
if(this.lastByteIndex === this.byteCount)
|
||||
{
|
||||
blocks[0] = blocks[blockCount];
|
||||
for (i = 1; i < blockCount + 1; ++i) {
|
||||
for(i = 1; i < blockCount + 1; ++i)
|
||||
{
|
||||
blocks[i] = 0;
|
||||
}
|
||||
}
|
||||
blocks[blockCount - 1] |= 0x80000000;
|
||||
for (i = 0; i < blockCount; ++i) {
|
||||
for(i = 0; i < blockCount; ++i)
|
||||
{
|
||||
s[i] ^= blocks[i];
|
||||
}
|
||||
f(s);
|
||||
};
|
||||
Keccak.prototype.toString = Keccak.prototype.hex = function() {
|
||||
Keccak.prototype.toString = Keccak.prototype.hex = function ()
|
||||
{
|
||||
this.finalize();
|
||||
var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, extraBytes = this.extraBytes, i = 0, j = 0;
|
||||
var hex = '', block;
|
||||
while (j < outputBlocks) {
|
||||
for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) {
|
||||
while(j < outputBlocks)
|
||||
{
|
||||
for(i = 0; i < blockCount && j < outputBlocks; ++i, ++j)
|
||||
{
|
||||
block = s[i];
|
||||
hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F] + HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F] + HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F] + HEX_CHARS[(block >> 28) & 0x0F] + HEX_CHARS[(block >> 24) & 0x0F];
|
||||
}
|
||||
if (j % blockCount === 0) {
|
||||
if(j % blockCount === 0)
|
||||
{
|
||||
f(s);
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
if (extraBytes) {
|
||||
if(extraBytes)
|
||||
{
|
||||
block = s[i];
|
||||
if (extraBytes > 0) {
|
||||
if(extraBytes > 0)
|
||||
{
|
||||
hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F];
|
||||
}
|
||||
if (extraBytes > 1) {
|
||||
if(extraBytes > 1)
|
||||
{
|
||||
hex += HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F];
|
||||
}
|
||||
if (extraBytes > 2) {
|
||||
if(extraBytes > 2)
|
||||
{
|
||||
hex += HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F];
|
||||
}
|
||||
}
|
||||
return hex;
|
||||
};
|
||||
Keccak.prototype.arrayBuffer = function() {
|
||||
Keccak.prototype.arrayBuffer = function ()
|
||||
{
|
||||
this.finalize();
|
||||
var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, extraBytes = this.extraBytes, i = 0, j = 0;
|
||||
var bytes = this.outputBits >> 3;
|
||||
var buffer;
|
||||
if (extraBytes) {
|
||||
if(extraBytes)
|
||||
{
|
||||
buffer = new ArrayBuffer((outputBlocks + 1) << 2);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
buffer = new ArrayBuffer(bytes);
|
||||
}
|
||||
var array = new Uint32Array(buffer);
|
||||
while (j < outputBlocks) {
|
||||
for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) {
|
||||
while(j < outputBlocks)
|
||||
{
|
||||
for(i = 0; i < blockCount && j < outputBlocks; ++i, ++j)
|
||||
{
|
||||
array[j] = s[i];
|
||||
}
|
||||
if (j % blockCount === 0) {
|
||||
if(j % blockCount === 0)
|
||||
{
|
||||
f(s);
|
||||
}
|
||||
}
|
||||
if (extraBytes) {
|
||||
if(extraBytes)
|
||||
{
|
||||
array[i] = s[i];
|
||||
buffer = buffer.slice(0, bytes);
|
||||
}
|
||||
return buffer;
|
||||
};
|
||||
Keccak.prototype.buffer = Keccak.prototype.arrayBuffer;
|
||||
Keccak.prototype.digest = Keccak.prototype.array = function() {
|
||||
Keccak.prototype.digest = Keccak.prototype.array = function ()
|
||||
{
|
||||
this.finalize();
|
||||
var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, extraBytes = this.extraBytes, i = 0, j = 0;
|
||||
var array = [], offset, block;
|
||||
while (j < outputBlocks) {
|
||||
for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) {
|
||||
while(j < outputBlocks)
|
||||
{
|
||||
for(i = 0; i < blockCount && j < outputBlocks; ++i, ++j)
|
||||
{
|
||||
offset = j << 2;
|
||||
block = s[i];
|
||||
array[offset] = block & 0xFF;
|
||||
@ -392,39 +478,48 @@
|
||||
array[offset + 2] = (block >> 16) & 0xFF;
|
||||
array[offset + 3] = (block >> 24) & 0xFF;
|
||||
}
|
||||
if (j % blockCount === 0) {
|
||||
if(j % blockCount === 0)
|
||||
{
|
||||
f(s);
|
||||
}
|
||||
}
|
||||
if (extraBytes) {
|
||||
if(extraBytes)
|
||||
{
|
||||
offset = j << 2;
|
||||
block = s[i];
|
||||
if (extraBytes > 0) {
|
||||
if(extraBytes > 0)
|
||||
{
|
||||
array[offset] = block & 0xFF;
|
||||
}
|
||||
if (extraBytes > 1) {
|
||||
if(extraBytes > 1)
|
||||
{
|
||||
array[offset + 1] = (block >> 8) & 0xFF;
|
||||
}
|
||||
if (extraBytes > 2) {
|
||||
if(extraBytes > 2)
|
||||
{
|
||||
array[offset + 2] = (block >> 16) & 0xFF;
|
||||
}
|
||||
}
|
||||
return array;
|
||||
};
|
||||
|
||||
function Kmac(bits, padding, outputBits) {
|
||||
function Kmac(bits,padding,outputBits)
|
||||
{
|
||||
Keccak.call(this, bits, padding, outputBits);
|
||||
};
|
||||
Kmac.prototype = new Keccak();
|
||||
Kmac.prototype.finalize = function() {
|
||||
Kmac.prototype.finalize = function ()
|
||||
{
|
||||
this.encode(this.outputBits, true);
|
||||
return Keccak.prototype.finalize.call(this);
|
||||
};
|
||||
var f = function(s) {
|
||||
var f = function (s)
|
||||
{
|
||||
var h, l, n, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15,
|
||||
b16, b17, b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33, b34, b35, b36, b37, b38, b39, b40,
|
||||
b41, b42, b43, b44, b45, b46, b47, b48, b49;
|
||||
for (n = 0; n < 48; n += 2) {
|
||||
for(n = 0; n < 48; n += 2)
|
||||
{
|
||||
c0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40];
|
||||
c1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41];
|
||||
c2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42];
|
||||
@ -602,47 +697,58 @@
|
||||
root.sha3_str = methods.sha3_256;
|
||||
root.sha3_array_256 = methods.sha3_array_256;
|
||||
root.sha3 = methods.sha3_array_256;
|
||||
root.sha = function(data) {
|
||||
root.sha = function (data)
|
||||
{
|
||||
return meshhash(methods.sha3_256(data));
|
||||
};
|
||||
root.shaarr = function(data) {
|
||||
root.shaarr = function (data)
|
||||
{
|
||||
return meshhash(methods.sha3_array_256(data));
|
||||
};
|
||||
root.shabuf = function(data) {
|
||||
root.shabuf = function (data)
|
||||
{
|
||||
return Buffer.from(shaarr(data));
|
||||
};
|
||||
root.shabuf = function(data) {
|
||||
root.shabuf = function (data)
|
||||
{
|
||||
return Buffer.from(shaarr(data));
|
||||
};
|
||||
root.SHA3BUF = function(data, num) {
|
||||
root.SHA3BUF = function (data,num)
|
||||
{
|
||||
return Buffer.from(SHA3ARR(data, num));
|
||||
};
|
||||
root.SHA3ARR = function(data, num) {
|
||||
root.SHA3ARR = function (data,num)
|
||||
{
|
||||
if(!NEW_SIGN_TIME || !num || num >= NEW_SIGN_TIME)
|
||||
return sha3(data);
|
||||
else
|
||||
return meshhash(methods.sha3_array_256(data));
|
||||
};
|
||||
root.shaarrblock = function(data, num) {
|
||||
root.shaarrblock = function (data,num)
|
||||
{
|
||||
return meshhash(methods.sha3_array_256(data), num);
|
||||
};
|
||||
})();
|
||||
|
||||
function meshhash(hash, num) {
|
||||
function meshhash(hash,num)
|
||||
{
|
||||
var regs = [hash[3], hash[2], hash[1], hash[0]];
|
||||
var mem = [];
|
||||
for (var i = 0; i < 16; i++) {
|
||||
for(var i = 0; i < 16; i++)
|
||||
{
|
||||
mem[i] = hash[i * 2] + (hash[i * 2 + 1] << 8);
|
||||
}
|
||||
var WasGoto = 0;
|
||||
var L = 0;
|
||||
for (var i = 0; i < 64; i++) {
|
||||
for(var i = 0; i < 64; i++)
|
||||
{
|
||||
var c = hash[L & 31];
|
||||
L++;
|
||||
var a = (c >> 4) & 0xF;
|
||||
var b = c & 0xF;
|
||||
var r = c & 0x3;
|
||||
switch (a) {
|
||||
switch(a)
|
||||
{
|
||||
case 0:
|
||||
regs[0] = regs[0] + regs[r];
|
||||
break;
|
||||
@ -662,13 +768,15 @@ function meshhash(hash, num) {
|
||||
regs[0] = regs[0] + regs[1] + regs[2] + regs[3];
|
||||
break;
|
||||
case 8:
|
||||
if ((regs[0] & 0xFFFF) < 32768 && !WasGoto) {
|
||||
if((regs[0] & 0xFFFF) < 32768 && !WasGoto)
|
||||
{
|
||||
L = 32 + L - b;
|
||||
WasGoto = 1;
|
||||
}
|
||||
break;
|
||||
case 9:
|
||||
if ((regs[0] & 0xFFFF) > 32768 && !WasGoto) {
|
||||
if((regs[0] & 0xFFFF) > 32768 && !WasGoto)
|
||||
{
|
||||
L += b;
|
||||
WasGoto = 1;
|
||||
}
|
||||
@ -678,14 +786,16 @@ function meshhash(hash, num) {
|
||||
}
|
||||
var index1 = regs[0] & 0xF;
|
||||
var index2 = (regs[0] >> 8) & 0xF;
|
||||
if (index1 !== index2) {
|
||||
if(index1 !== index2)
|
||||
{
|
||||
var temp = mem[index1];
|
||||
mem[index1] = mem[index2];
|
||||
mem[index2] = temp;
|
||||
}
|
||||
}
|
||||
var ret = [];
|
||||
for (var i = 0; i < 16; i++) {
|
||||
for(var i = 0; i < 16; i++)
|
||||
{
|
||||
ret[i * 2] = mem[i] & 0xFF;
|
||||
ret[i * 2 + 1] = mem[i] >> 8;
|
||||
}
|
||||
|
3486
src/HTML/JS/sign-lib-min.js
vendored
3486
src/HTML/JS/sign-lib-min.js
vendored
File diff suppressed because one or more lines are too long
@ -12,7 +12,8 @@ var DELTA_LONG_MINING = 5000;
|
||||
var BLOCKNUM_ALGO2 = 6560000;
|
||||
var BLOCKNUM_HASH_NEW = 10195000;
|
||||
var BLOCKNUM_TICKET_ALGO = 16070000;
|
||||
if (typeof global === "object") {
|
||||
if(typeof global === "object")
|
||||
{
|
||||
global.GetHashFromSeqAddr = GetHashFromSeqAddr;
|
||||
global.CalcHashBlockFromSeqAddr = CalcHashBlockFromSeqAddr;
|
||||
global.GetHashFromNum2 = GetHashFromNum2;
|
||||
@ -20,21 +21,26 @@ if (typeof global === "object") {
|
||||
global.GetHashFromArrNum2 = GetHashFromArrNum2;
|
||||
global.XORArr = XORArr;
|
||||
global.GetHash = GetHash;
|
||||
if (global.LOCAL_RUN || global.TEST_NETWORK) {
|
||||
if(global.LOCAL_RUN || global.TEST_NETWORK)
|
||||
{
|
||||
BLOCKNUM_ALGO2 = 0;
|
||||
if (global.TEST_NETWORK) {
|
||||
if(global.TEST_NETWORK)
|
||||
{
|
||||
BLOCKNUM_HASH_NEW = 100;
|
||||
BLOCKNUM_TICKET_ALGO = 0;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
BLOCKNUM_HASH_NEW = 100;
|
||||
BLOCKNUM_TICKET_ALGO = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function GetHashFromSeqAddr(SeqHash, AddrHash, BlockNum, PrevHash, MiningVer) {
|
||||
if (BlockNum < BLOCKNUM_ALGO2) {
|
||||
function GetHashFromSeqAddr(SeqHash,AddrHash,BlockNum,PrevHash,MiningVer)
|
||||
{
|
||||
if(BlockNum < BLOCKNUM_ALGO2)
|
||||
{
|
||||
var Hash = shaarrblock2(SeqHash, AddrHash, BlockNum);
|
||||
return {Hash:Hash, PowHash:Hash, Hash1:Hash, Hash2:Hash};
|
||||
}
|
||||
@ -45,15 +51,19 @@ function GetHashFromSeqAddr(SeqHash, AddrHash, BlockNum, PrevHash, MiningVer) {
|
||||
var DeltaNum1 = ReadUint16FromArr(AddrHash, 24);
|
||||
var DeltaNum2 = ReadUint16FromArr(AddrHash, 26);
|
||||
var PrevHashNum;
|
||||
if (PrevHash) {
|
||||
if(PrevHash)
|
||||
{
|
||||
PrevHashNum = ReadUint32FromArr(PrevHash, 28);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
PrevHashNum = ReadUint32FromArr(AddrHash, 28);
|
||||
}
|
||||
var Data = GetHash(SeqHash, PrevHashNum, BlockNum, MinerID, Nonce0, Nonce1, Nonce2, DeltaNum1, DeltaNum2);
|
||||
if (MiningVer) {
|
||||
if (AddrHash[17] !== MiningVer || AddrHash[23] !== MiningVer) {
|
||||
if(MiningVer)
|
||||
{
|
||||
if(AddrHash[17] !== MiningVer || AddrHash[23] !== MiningVer)
|
||||
{
|
||||
Data.PowHash = [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
||||
255, 255, 255, 255, 255, 255, 255, 255, 255, 255];
|
||||
}
|
||||
@ -61,7 +71,8 @@ function GetHashFromSeqAddr(SeqHash, AddrHash, BlockNum, PrevHash, MiningVer) {
|
||||
return Data;
|
||||
};
|
||||
|
||||
function GetHash(BlockHash, PrevHashNum, BlockNum, Miner, Nonce0, Nonce1, Nonce2, DeltaNum1, DeltaNum2) {
|
||||
function GetHash(BlockHash,PrevHashNum,BlockNum,Miner,Nonce0,Nonce1,Nonce2,DeltaNum1,DeltaNum2)
|
||||
{
|
||||
if(DeltaNum1 > DELTA_LONG_MINING)
|
||||
DeltaNum1 = 0;
|
||||
if(DeltaNum2 > DELTA_LONG_MINING)
|
||||
@ -73,13 +84,16 @@ function GetHash(BlockHash, PrevHashNum, BlockNum, Miner, Nonce0, Nonce1, Nonce2
|
||||
var Hash1 = XORArr(HashBase, HashNonce1);
|
||||
var Hash2 = XORArr(HashCurrent, HashNonce2);
|
||||
var Ret = {Hash:Hash2, Hash1:Hash1, Hash2:Hash2};
|
||||
if (CompareArr(Hash1, Hash2) > 0) {
|
||||
if(CompareArr(Hash1, Hash2) > 0)
|
||||
{
|
||||
Ret.PowHash = Hash1;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
Ret.PowHash = Hash2;
|
||||
}
|
||||
if (BlockNum >= BLOCKNUM_HASH_NEW) {
|
||||
if(BlockNum >= BLOCKNUM_HASH_NEW)
|
||||
{
|
||||
if(BlockNum >= BLOCKNUM_TICKET_ALGO)
|
||||
Ret.Hash = sha3arr2(Hash1, Hash2);
|
||||
else
|
||||
@ -88,28 +102,33 @@ function GetHash(BlockHash, PrevHashNum, BlockNum, Miner, Nonce0, Nonce1, Nonce2
|
||||
return Ret;
|
||||
};
|
||||
|
||||
function CalcHashBlockFromSeqAddr(Block, PrevHash, MiningVer) {
|
||||
function CalcHashBlockFromSeqAddr(Block,PrevHash,MiningVer)
|
||||
{
|
||||
var Value = GetHashFromSeqAddr(Block.SeqHash, Block.AddrHash, Block.BlockNum, PrevHash, MiningVer);
|
||||
Block.Hash = Value.Hash;
|
||||
Block.PowHash = Value.PowHash;
|
||||
};
|
||||
|
||||
function XORArr(Arr1, Arr2) {
|
||||
function XORArr(Arr1,Arr2)
|
||||
{
|
||||
var Ret = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||
for (var i = 0; i < 32; i++) {
|
||||
for(var i = 0; i < 32; i++)
|
||||
{
|
||||
Ret[i] = Arr1[i] ^ Arr2[i];
|
||||
}
|
||||
return Ret;
|
||||
};
|
||||
|
||||
function GetHashFromNum2(Value1, Value2) {
|
||||
function GetHashFromNum2(Value1,Value2)
|
||||
{
|
||||
var MeshArr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||
WriteUintToArrOnPos(MeshArr, Value1, 0);
|
||||
WriteUintToArrOnPos(MeshArr, Value2, 6);
|
||||
return sha3(MeshArr);
|
||||
};
|
||||
|
||||
function GetHashFromArrNum2(Arr, Value1, Value2) {
|
||||
function GetHashFromArrNum2(Arr,Value1,Value2)
|
||||
{
|
||||
var MeshArr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0];
|
||||
WriteArrToArrOnPos(MeshArr, Arr, 0, 32);
|
||||
@ -118,7 +137,8 @@ function GetHashFromArrNum2(Arr, Value1, Value2) {
|
||||
return sha3(MeshArr);
|
||||
};
|
||||
|
||||
function GetHashFromNum3(Value1, Value2, Value3) {
|
||||
function GetHashFromNum3(Value1,Value2,Value3)
|
||||
{
|
||||
var MeshArr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||
WriteUintToArrOnPos(MeshArr, Value1, 0);
|
||||
WriteUintToArrOnPos(MeshArr, Value2, 6);
|
||||
@ -126,8 +146,10 @@ function GetHashFromNum3(Value1, Value2, Value3) {
|
||||
return sha3(MeshArr);
|
||||
};
|
||||
|
||||
function ReadUintFromArr(arr, len) {
|
||||
if (len === undefined) {
|
||||
function ReadUintFromArr(arr,len)
|
||||
{
|
||||
if(len === undefined)
|
||||
{
|
||||
len = arr.len;
|
||||
arr.len += 6;
|
||||
}
|
||||
@ -137,8 +159,10 @@ function ReadUintFromArr(arr, len) {
|
||||
return value;
|
||||
};
|
||||
|
||||
function ReadUint32FromArr(arr, len) {
|
||||
if (len === undefined) {
|
||||
function ReadUint32FromArr(arr,len)
|
||||
{
|
||||
if(len === undefined)
|
||||
{
|
||||
len = arr.len;
|
||||
arr.len += 4;
|
||||
}
|
||||
@ -146,8 +170,10 @@ function ReadUint32FromArr(arr, len) {
|
||||
return value;
|
||||
};
|
||||
|
||||
function ReadUint16FromArr(arr, len) {
|
||||
if (len === undefined) {
|
||||
function ReadUint16FromArr(arr,len)
|
||||
{
|
||||
if(len === undefined)
|
||||
{
|
||||
len = arr.len;
|
||||
arr.len += 2;
|
||||
}
|
||||
@ -155,17 +181,20 @@ function ReadUint16FromArr(arr, len) {
|
||||
return value;
|
||||
};
|
||||
|
||||
function ReadArrFromArr(arr, length) {
|
||||
function ReadArrFromArr(arr,length)
|
||||
{
|
||||
var Ret = [];
|
||||
var len = arr.len;
|
||||
for (var i = 0; i < length; i++) {
|
||||
for(var i = 0; i < length; i++)
|
||||
{
|
||||
Ret[i] = arr[len + i];
|
||||
}
|
||||
arr.len += length;
|
||||
return Ret;
|
||||
};
|
||||
|
||||
function WriteUintToArr(arr, Num) {
|
||||
function WriteUintToArr(arr,Num)
|
||||
{
|
||||
var len = arr.length;
|
||||
arr[len] = Num & 0xFF;
|
||||
arr[len + 1] = (Num >>> 8) & 0xFF;
|
||||
@ -176,7 +205,8 @@ function WriteUintToArr(arr, Num) {
|
||||
arr[len + 5] = (NumH >>> 8) & 0xFF;
|
||||
};
|
||||
|
||||
function WriteUintToArrOnPos(arr, Num, Pos) {
|
||||
function WriteUintToArrOnPos(arr,Num,Pos)
|
||||
{
|
||||
arr[Pos] = Num & 0xFF;
|
||||
arr[Pos + 1] = (Num >>> 8) & 0xFF;
|
||||
arr[Pos + 2] = (Num >>> 16) & 0xFF;
|
||||
@ -186,7 +216,8 @@ function WriteUintToArrOnPos(arr, Num, Pos) {
|
||||
arr[Pos + 5] = (NumH >>> 8) & 0xFF;
|
||||
};
|
||||
|
||||
function WriteUint32ToArr(arr, Num) {
|
||||
function WriteUint32ToArr(arr,Num)
|
||||
{
|
||||
var len = arr.length;
|
||||
arr[len] = Num & 0xFF;
|
||||
arr[len + 1] = (Num >>> 8) & 0xFF;
|
||||
@ -194,41 +225,52 @@ function WriteUint32ToArr(arr, Num) {
|
||||
arr[len + 3] = (Num >>> 24) & 0xFF;
|
||||
};
|
||||
|
||||
function WriteUint32ToArrOnPos(arr, Num, Pos) {
|
||||
function WriteUint32ToArrOnPos(arr,Num,Pos)
|
||||
{
|
||||
arr[Pos] = Num & 0xFF;
|
||||
arr[Pos + 1] = (Num >>> 8) & 0xFF;
|
||||
arr[Pos + 2] = (Num >>> 16) & 0xFF;
|
||||
arr[Pos + 3] = (Num >>> 24) & 0xFF;
|
||||
};
|
||||
|
||||
function WriteUint16ToArrOnPos(arr, Num, Pos) {
|
||||
function WriteUint16ToArrOnPos(arr,Num,Pos)
|
||||
{
|
||||
arr[Pos] = Num & 0xFF;
|
||||
arr[Pos + 1] = (Num >>> 8) & 0xFF;
|
||||
};
|
||||
|
||||
function WriteArrToArr(arr, arr2, ConstLength) {
|
||||
function WriteArrToArr(arr,arr2,ConstLength)
|
||||
{
|
||||
var len = arr.length;
|
||||
for (var i = 0; i < ConstLength; i++) {
|
||||
for(var i = 0; i < ConstLength; i++)
|
||||
{
|
||||
arr[len + i] = arr2[i];
|
||||
}
|
||||
};
|
||||
|
||||
function WriteArrToArrOnPos(arr, arr2, Pos, ConstLength) {
|
||||
for (var i = 0; i < ConstLength; i++) {
|
||||
function WriteArrToArrOnPos(arr,arr2,Pos,ConstLength)
|
||||
{
|
||||
for(var i = 0; i < ConstLength; i++)
|
||||
{
|
||||
arr[Pos + i] = arr2[i];
|
||||
}
|
||||
};
|
||||
|
||||
function WriteArrToArrHOnPos(arr, arr2, Pos, ConstLength) {
|
||||
for (var i = 0; i < ConstLength; i++) {
|
||||
function WriteArrToArrHOnPos(arr,arr2,Pos,ConstLength)
|
||||
{
|
||||
for(var i = 0; i < ConstLength; i++)
|
||||
{
|
||||
arr[Pos + i] |= (arr2[i] << 8);
|
||||
}
|
||||
};
|
||||
|
||||
function ConvertBufferToStr(Data) {
|
||||
for (var key in Data) {
|
||||
function ConvertBufferToStr(Data)
|
||||
{
|
||||
for(var key in Data)
|
||||
{
|
||||
var item = Data[key];
|
||||
if (item instanceof Buffer) {
|
||||
if(item instanceof Buffer)
|
||||
{
|
||||
Data[key] = GetHexFromArr(item);
|
||||
}
|
||||
else
|
||||
@ -237,11 +279,13 @@ function ConvertBufferToStr(Data) {
|
||||
}
|
||||
};
|
||||
|
||||
function CopyObjValue(obj, num) {
|
||||
function CopyObjValue(obj,num)
|
||||
{
|
||||
if(num && num > 5)
|
||||
return obj;
|
||||
var ret = {};
|
||||
for (var key in obj) {
|
||||
for(var key in obj)
|
||||
{
|
||||
var val = obj[key];
|
||||
if((typeof val === "object") && !(val instanceof Buffer) && !(val instanceof ArrayBuffer) && !(val instanceof Array))
|
||||
val = CopyObjValue(val, num + 1);
|
||||
@ -250,7 +294,8 @@ function CopyObjValue(obj, num) {
|
||||
return ret;
|
||||
};
|
||||
|
||||
function CopyArr(arr1) {
|
||||
function CopyArr(arr1)
|
||||
{
|
||||
var arr2 = [];
|
||||
if(arr1)
|
||||
for(var i = 0; i < arr1.length; i++)
|
||||
@ -258,7 +303,8 @@ function CopyArr(arr1) {
|
||||
return arr2;
|
||||
};
|
||||
|
||||
function ParseNum(a) {
|
||||
function ParseNum(a)
|
||||
{
|
||||
var Num = parseInt(a);
|
||||
if(!Num)
|
||||
Num = 0;
|
||||
@ -269,31 +315,37 @@ function ParseNum(a) {
|
||||
return Num;
|
||||
};
|
||||
|
||||
function CompareArr(a, b) {
|
||||
for (var i = 0; i < a.length; i++) {
|
||||
function CompareArr(a,b)
|
||||
{
|
||||
for(var i = 0; i < a.length; i++)
|
||||
{
|
||||
if(a[i] !== b[i])
|
||||
return a[i] - b[i];
|
||||
}
|
||||
return 0;
|
||||
};
|
||||
|
||||
function CompareArrL(a, b) {
|
||||
function CompareArrL(a,b)
|
||||
{
|
||||
if(a.length !== b.length)
|
||||
return a.length - b.length;
|
||||
for (var i = 0; i < a.length; i++) {
|
||||
for(var i = 0; i < a.length; i++)
|
||||
{
|
||||
if(a[i] !== b[i])
|
||||
return a[i] - b[i];
|
||||
}
|
||||
return 0;
|
||||
};
|
||||
|
||||
function GetSeqHash(BlockNum, PrevHash, TreeHash) {
|
||||
function GetSeqHash(BlockNum,PrevHash,TreeHash)
|
||||
{
|
||||
var arr = [GetArrFromValue(BlockNum), PrevHash, TreeHash];
|
||||
var SeqHash = CalcHashFromArray(arr, true);
|
||||
return SeqHash;
|
||||
};
|
||||
|
||||
function arr2(Value1, Value2) {
|
||||
function arr2(Value1,Value2)
|
||||
{
|
||||
var Buf = [];
|
||||
for(var n = 0; n < Value1.length; n++)
|
||||
Buf.push(Value1[n]);
|
||||
@ -302,15 +354,18 @@ function arr2(Value1, Value2) {
|
||||
return Buf;
|
||||
};
|
||||
|
||||
function shaarr2(Value1, Value2) {
|
||||
function shaarr2(Value1,Value2)
|
||||
{
|
||||
return shaarr(arr2(Value1, Value2));
|
||||
};
|
||||
|
||||
function sha3arr2(Value1, Value2) {
|
||||
function sha3arr2(Value1,Value2)
|
||||
{
|
||||
return sha3(arr2(Value1, Value2));
|
||||
};
|
||||
|
||||
function GetBlockArrFromBuffer(BufRead, Info) {
|
||||
function GetBlockArrFromBuffer(BufRead,Info)
|
||||
{
|
||||
if(!BufRead || BufRead.length < 10)
|
||||
return [];
|
||||
var BLOCK_PROCESSING_LENGTH = 8;
|
||||
@ -319,19 +374,24 @@ function GetBlockArrFromBuffer(BufRead, Info) {
|
||||
var StartNum = ReadUintFromArr(BufRead);
|
||||
var CountLoad = ReadUint32FromArr(BufRead);
|
||||
var BufSize = 6 + 4 + BLOCK_PROCESSING_LENGTH2 * 32 + 32 + 6 + CountLoad * 64;
|
||||
if (CountLoad <= 0 || BufSize !== BufRead.length) {
|
||||
if(CountLoad <= 0 || BufSize !== BufRead.length)
|
||||
{
|
||||
return [];
|
||||
}
|
||||
var PrevBlock;
|
||||
var BlockArr = [];
|
||||
for (var i = 0; i < CountLoad + BLOCK_PROCESSING_LENGTH2; i++) {
|
||||
for(var i = 0; i < CountLoad + BLOCK_PROCESSING_LENGTH2; i++)
|
||||
{
|
||||
var Block = {};
|
||||
Block.BlockNum = StartNum + i;
|
||||
if (i < BLOCK_PROCESSING_LENGTH2) {
|
||||
if(i < BLOCK_PROCESSING_LENGTH2)
|
||||
{
|
||||
Block.Hash = ReadArrFromArr(BufRead, 32);
|
||||
}
|
||||
else {
|
||||
if (i === BLOCK_PROCESSING_LENGTH2) {
|
||||
else
|
||||
{
|
||||
if(i === BLOCK_PROCESSING_LENGTH2)
|
||||
{
|
||||
Block.SumHash = ReadArrFromArr(BufRead, 32);
|
||||
Block.SumPow = ReadUintFromArr(BufRead);
|
||||
}
|
||||
@ -339,7 +399,8 @@ function GetBlockArrFromBuffer(BufRead, Info) {
|
||||
Block.AddrHash = ReadArrFromArr(BufRead, 32);
|
||||
var arr = [];
|
||||
var start = i - BLOCK_PROCESSING_LENGTH2;
|
||||
for (var n = 0; n < BLOCK_PROCESSING_LENGTH; n++) {
|
||||
for(var n = 0; n < BLOCK_PROCESSING_LENGTH; n++)
|
||||
{
|
||||
var Prev = BlockArr[start + n];
|
||||
arr.push(Prev.Hash);
|
||||
}
|
||||
@ -347,8 +408,10 @@ function GetBlockArrFromBuffer(BufRead, Info) {
|
||||
Block.SeqHash = GetSeqHash(Block.BlockNum, Block.PrevHash, Block.TreeHash);
|
||||
var PrevHashNum = ReadUint32FromArr(Block.PrevHash, 28);
|
||||
var PrevAddrNum = ReadUint32FromArr(Block.AddrHash, 28);
|
||||
if (PrevHashNum !== PrevAddrNum && Block.BlockNum > 20000000) {
|
||||
if (global.WATCHDOG_DEV) {
|
||||
if(PrevHashNum !== PrevAddrNum && Block.BlockNum > 20000000)
|
||||
{
|
||||
if(global.WATCHDOG_DEV)
|
||||
{
|
||||
var Str = "";
|
||||
if(Info && Info.Node)
|
||||
Str = " from " + NodeName(Info.Node);
|
||||
@ -358,7 +421,8 @@ function GetBlockArrFromBuffer(BufRead, Info) {
|
||||
}
|
||||
CalcHashBlockFromSeqAddr(Block, Block.PrevHash);
|
||||
Block.Power = GetPowPower(Block.PowHash);
|
||||
if (PrevBlock) {
|
||||
if(PrevBlock)
|
||||
{
|
||||
Block.SumHash = shaarr2(PrevBlock.SumHash, Block.Hash);
|
||||
}
|
||||
PrevBlock = Block;
|
||||
@ -368,9 +432,11 @@ function GetBlockArrFromBuffer(BufRead, Info) {
|
||||
Block.TrDataLen = 0;
|
||||
BlockArr.push(Block);
|
||||
}
|
||||
for (var i = BlockArr.length - 1; i >= 0; i--) {
|
||||
for(var i = BlockArr.length - 1; i >= 0; i--)
|
||||
{
|
||||
var Block = BlockArr[i];
|
||||
if (!Block.SumHash) {
|
||||
if(!Block.SumHash)
|
||||
{
|
||||
BlockArr = BlockArr.slice(i + 1);
|
||||
break;
|
||||
}
|
||||
@ -378,10 +444,12 @@ function GetBlockArrFromBuffer(BufRead, Info) {
|
||||
return BlockArr;
|
||||
};
|
||||
|
||||
function shaarrblock2(Value1, Value2, BlockNum) {
|
||||
function shaarrblock2(Value1,Value2,BlockNum)
|
||||
{
|
||||
return shaarrblock(arr2(Value1, Value2), BlockNum);
|
||||
};
|
||||
if (typeof global === "object") {
|
||||
if(typeof global === "object")
|
||||
{
|
||||
global.ReadUint32FromArr = ReadUint32FromArr;
|
||||
global.ReadUintFromArr = ReadUintFromArr;
|
||||
global.ReadUint16FromArr = ReadUint16FromArr;
|
||||
@ -406,6 +474,7 @@ if (typeof global === "object") {
|
||||
global.shaarrblock2 = shaarrblock2;
|
||||
}
|
||||
else
|
||||
if (typeof window === "object") {
|
||||
if(typeof window === "object")
|
||||
{
|
||||
global = window;
|
||||
}
|
||||
|
@ -19,7 +19,8 @@ var MaxBlockNum = 0;
|
||||
var DelList = {};
|
||||
var WasAccountsDataStr;
|
||||
|
||||
function SetAccountsData(Data, AccountsDataStr) {
|
||||
function SetAccountsData(Data,AccountsDataStr)
|
||||
{
|
||||
if(!Data || !Data.result)
|
||||
return ;
|
||||
if($("idBtRun"))
|
||||
@ -29,13 +30,15 @@ function SetAccountsData(Data, AccountsDataStr) {
|
||||
WasAccountsDataStr = AccountsDataStr;
|
||||
var arr = Data.arr;
|
||||
var Select = $("idAccount");
|
||||
if (arr.length !== Select.options.length) {
|
||||
if(arr.length !== Select.options.length)
|
||||
{
|
||||
var options = Select.options;
|
||||
options.length = arr.length;
|
||||
}
|
||||
MaxBlockNum = GetCurrentBlockNumByTime();
|
||||
SetGridData(arr, "grid_accounts", "idMyTotalSum");
|
||||
for (var i = 0; arr && i < arr.length; i++) {
|
||||
for(var i = 0; arr && i < arr.length; i++)
|
||||
{
|
||||
var Item = arr[i];
|
||||
Item.MyAccount = true;
|
||||
var Num = ParseNum(Item.Num);
|
||||
@ -50,25 +53,31 @@ function SetAccountsData(Data, AccountsDataStr) {
|
||||
option.text = StrText;
|
||||
}
|
||||
var CurentValue = LoadMapAfter["idAccount"];
|
||||
if (CurentValue) {
|
||||
if(CurentValue)
|
||||
{
|
||||
Select.value = CurentValue;
|
||||
delete LoadMapAfter["idAccount"];
|
||||
}
|
||||
SetCurCurencyName();
|
||||
};
|
||||
|
||||
function CurTransactionToForm(bForce) {
|
||||
function CurTransactionToForm(bForce)
|
||||
{
|
||||
var Item = $("idTransaction");
|
||||
if(Item && (Item.className === "" || bForce))
|
||||
Item.value = GetJSONFromTransaction(CurrentTR);
|
||||
};
|
||||
|
||||
function CheckNameAccTo() {
|
||||
function CheckNameAccTo()
|
||||
{
|
||||
MaxBlockNum = GetCurrentBlockNumByTime();
|
||||
var ToID = ParseNum($("idTo").value);
|
||||
if (!MapAccounts[ToID] || (MapAccounts[ToID].MustUpdate && MapAccounts[ToID].MustUpdate >= MaxBlockNum)) {
|
||||
GetData("GetAccountList", { StartNum: ToID }, function(Data) {
|
||||
if (Data && Data.result === 1 && Data.arr.length) {
|
||||
if(!MapAccounts[ToID] || (MapAccounts[ToID].MustUpdate && MapAccounts[ToID].MustUpdate >= MaxBlockNum))
|
||||
{
|
||||
GetData("GetAccountList", {StartNum:ToID}, function (Data)
|
||||
{
|
||||
if(Data && Data.result === 1 && Data.arr.length)
|
||||
{
|
||||
var Item = Data.arr[0];
|
||||
Item.UpdateData = Date.now();
|
||||
MapAccounts[Item.Num] = Item;
|
||||
@ -79,19 +88,28 @@ function CheckNameAccTo() {
|
||||
SetNameAccTo();
|
||||
};
|
||||
|
||||
function SetNameAccTo() {
|
||||
function SetNameAccTo()
|
||||
{
|
||||
var Str = "";
|
||||
var ToID = ParseNum($("idTo").value);
|
||||
var ToID = $("idTo").value.trim();
|
||||
var Item = MapAccounts[ToID];
|
||||
var element = $("idNameTo");
|
||||
var StrTo = GetAccountText(Item, ToID, 1);
|
||||
if (!element) {
|
||||
var element = $("idNameTo");
|
||||
if(!element)
|
||||
{
|
||||
element = $("idNameTo2");
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
StrTo = "To: " + StrTo;
|
||||
}
|
||||
if (element.innerText !== StrTo) {
|
||||
if(!ToID || ToID === "0")
|
||||
{
|
||||
element.innerText = "";
|
||||
return ;
|
||||
}
|
||||
if(element && element.innerText !== StrTo)
|
||||
{
|
||||
element.innerText = StrTo;
|
||||
if(Item && Item.MyAccount)
|
||||
element.className = "smallbold";
|
||||
@ -100,52 +118,73 @@ function SetNameAccTo() {
|
||||
}
|
||||
};
|
||||
|
||||
function GetAccountText(Item, Num, bGetSum) {
|
||||
if (Item) {
|
||||
function GetAccountText(Item,Num,bGetSum)
|
||||
{
|
||||
if(Item)
|
||||
{
|
||||
var text = Item.Name;
|
||||
if(!text || text.length === 0)
|
||||
text = Num;
|
||||
else
|
||||
text = "" + Num + ". " + text;
|
||||
if (bGetSum) {
|
||||
if(bGetSum)
|
||||
{
|
||||
var StrSum = SUM_TO_STRING(Item.Value, Item.Currency);
|
||||
text += " (" + StrSum + ")";
|
||||
}
|
||||
return text;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
if(IsPublicAddr(Num))
|
||||
return Num;
|
||||
else
|
||||
return "<Error addres>";
|
||||
}
|
||||
};
|
||||
|
||||
function OnEditIdTo() {
|
||||
function OnEditIdTo()
|
||||
{
|
||||
CheckNameAccTo();
|
||||
OnEditTransactionFields();
|
||||
};
|
||||
|
||||
function OnEditTransactionFields() {
|
||||
function OnEditTransactionFields()
|
||||
{
|
||||
if(IsVisibleBlock("edit_transaction"))
|
||||
CreateTransaction();
|
||||
SetCurCurencyName();
|
||||
SaveValues();
|
||||
};
|
||||
|
||||
function SetCurCurencyName() {
|
||||
function SetCurCurencyName()
|
||||
{
|
||||
var idCoin = $("idCoinName");
|
||||
if(!idCoin)
|
||||
return ;
|
||||
var Num = ParseNum($("idAccount").value);
|
||||
var Item = MapAccounts[Num];
|
||||
if (Item) {
|
||||
if(Item)
|
||||
{
|
||||
idCoin.innerText = CurrencyName(Item.Currency);
|
||||
}
|
||||
};
|
||||
|
||||
function CreateTransaction(F, CheckErr, Run) {
|
||||
function IsPublicAddr(StrTo)
|
||||
{
|
||||
if(StrTo.length === 66 && (StrTo.substr(0, 2) === "02" || StrTo.substr(0, 2) === "03") && IsHexStr(StrTo))
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
};
|
||||
|
||||
function CreateTransaction(F,CheckErr,Run)
|
||||
{
|
||||
CheckNameAccTo();
|
||||
CheckSending();
|
||||
var FromID = ParseNum($("idAccount").value);
|
||||
if (CheckErr && FromID === 0) {
|
||||
if(CheckErr && FromID === 0)
|
||||
{
|
||||
SetError("Select valid 'From account'");
|
||||
return ;
|
||||
}
|
||||
@ -153,31 +192,37 @@ function CreateTransaction(F, CheckErr, Run) {
|
||||
var bFindAcc = 0;
|
||||
var ToPubKey = "";
|
||||
var ToID = ParseNum(StrTo);
|
||||
if (StrTo !== "" + ToID) {
|
||||
if (StrTo.length === 66 && (StrTo.substr(0, 2) === "02" || StrTo.substr(0, 2) === "03") && IsHexStr(StrTo)) {
|
||||
if(StrTo !== "" + ToID)
|
||||
{
|
||||
if(IsPublicAddr(StrTo))
|
||||
{
|
||||
ToID = 0;
|
||||
ToPubKey = StrTo;
|
||||
if (ToPubKey === PubKeyStr)
|
||||
if(ToPubKey === window.PubKeyStr)
|
||||
bFindAcc = 1;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
if(CheckErr)
|
||||
SetError("Valid 'Pay to' - required!");
|
||||
return ;
|
||||
}
|
||||
}
|
||||
if (CheckErr && ToID <= 0 && ToPubKey === "" && !AttachItem) {
|
||||
if(CheckErr && ToID <= 0 && ToPubKey === "" && !AttachItem)
|
||||
{
|
||||
SetError("Valid 'Pay to' - required!");
|
||||
return ;
|
||||
}
|
||||
var Description = $("idDescription").value.substr(0, 200);
|
||||
var StrSum = $("idSumSend").value;
|
||||
var indDot = StrSum.indexOf(".");
|
||||
if (indDot >= 0) {
|
||||
if(indDot >= 0)
|
||||
{
|
||||
var StrTER = StrSum.substr(0, indDot);
|
||||
var StrCENT = StrSum.substr(indDot + 1);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
var StrTER = StrSum;
|
||||
var StrCENT = "0";
|
||||
}
|
||||
@ -185,11 +230,13 @@ function CreateTransaction(F, CheckErr, Run) {
|
||||
var Coin = {SumCOIN:ParseNum(StrTER), SumCENT:ParseNum(StrCENT.substr(0, 9))};
|
||||
var OperationID = 0;
|
||||
var Item = MapAccounts[FromID];
|
||||
if (Item) {
|
||||
if(Item)
|
||||
{
|
||||
OperationID = Item.Value.OperationID;
|
||||
}
|
||||
var AttachBody = [];
|
||||
if (AttachItem) {
|
||||
if(AttachItem)
|
||||
{
|
||||
AttachBody = AttachItem.Data.Body;
|
||||
if(!AttachBody)
|
||||
AttachBody = [];
|
||||
@ -197,54 +244,58 @@ function CreateTransaction(F, CheckErr, Run) {
|
||||
var ToPubKeyArr = [];
|
||||
if(ToPubKey)
|
||||
ToPubKeyArr = GetArrFromHex(ToPubKey);
|
||||
var TR = {
|
||||
Type: 111, Version: 3, Reserve: 0, FromID: FromID, OperationID: OperationID, To: [{
|
||||
PubKey: ToPubKeyArr, ID: ToID, SumCOIN: Coin.SumCOIN,
|
||||
SumCENT: Coin.SumCENT
|
||||
}], Description: Description, Body: AttachBody, Sign: CurrentTR.Sign,
|
||||
};
|
||||
var TR = {Type:111, Version:3, Reserve:0, FromID:FromID, OperationID:OperationID, To:[{PubKey:ToPubKeyArr, ID:ToID, SumCOIN:Coin.SumCOIN,
|
||||
SumCENT:Coin.SumCENT}], Description:Description, Body:AttachBody, Sign:CurrentTR.Sign, };
|
||||
Object.defineProperties(TR, {bFindAcc:{configurable:true, writable:true, enumerable:false, value:bFindAcc}});
|
||||
Object.defineProperties(TR, {Run:{configurable:true, writable:true, enumerable:false, value:Run}});
|
||||
if (JSON.stringify(TR) === JSON.stringify(CurrentTR)) {
|
||||
if(JSON.stringify(TR) === JSON.stringify(CurrentTR))
|
||||
{
|
||||
if(F)
|
||||
F(CurrentTR);
|
||||
return ;
|
||||
}
|
||||
CurrentTR = TR;
|
||||
GetSignTransaction(TR, "", function(TR) {
|
||||
GetSignTransaction(TR, "", function (TR)
|
||||
{
|
||||
CurTransactionToForm(true);
|
||||
if(F)
|
||||
F(TR);
|
||||
});
|
||||
};
|
||||
|
||||
function SignJSON(F) {
|
||||
function SignJSON(F)
|
||||
{
|
||||
if($("idSignJSON").disabled)
|
||||
return ;
|
||||
var TR = GetTransactionFromJSON();
|
||||
if(!TR)
|
||||
return ;
|
||||
CurrentTR = TR;
|
||||
GetSignTransaction(TR, "", function(TR) {
|
||||
GetSignTransaction(TR, "", function (TR)
|
||||
{
|
||||
CurTransactionToForm(true);
|
||||
if(F)
|
||||
F();
|
||||
});
|
||||
};
|
||||
|
||||
function CheckSending(bToStatus) {
|
||||
function CheckSending(bToStatus)
|
||||
{
|
||||
MaxBlockNum = GetCurrentBlockNumByTime();
|
||||
var CanSend = IsPrivateMode();
|
||||
var StrButton = "Send";
|
||||
var StrButtonSign = "Sign JSON";
|
||||
if (!CanSend) {
|
||||
if(!CanSend)
|
||||
{
|
||||
StrButton = " ";
|
||||
StrButtonSign = " ";
|
||||
}
|
||||
if (CanSend) {
|
||||
if(CanSend)
|
||||
{
|
||||
var FromID = ParseNum($("idAccount").value);
|
||||
var Item = MapAccounts[FromID];
|
||||
if (Item && Item.NextSendTime && Item.NextSendTime > MaxBlockNum) {
|
||||
if(Item && Item.NextSendTime && Item.NextSendTime > MaxBlockNum)
|
||||
{
|
||||
if(bToStatus)
|
||||
SetStatus("Transaction was sending. Wait... (" + Item.LastTransactionText + ")");
|
||||
CanSend = false;
|
||||
@ -258,26 +309,31 @@ function CheckSending(bToStatus) {
|
||||
return CanSend;
|
||||
};
|
||||
|
||||
function AddWhiteList() {
|
||||
function AddWhiteList()
|
||||
{
|
||||
var ToID = ParseNum($("idTo").value);
|
||||
if(ToID && $("idWhiteOnSend").checked)
|
||||
Storage.setItem("White:" + ToID, 1);
|
||||
};
|
||||
|
||||
function SendMoneyBefore() {
|
||||
function SendMoneyBefore()
|
||||
{
|
||||
if($("idSendButton").disabled)
|
||||
return ;
|
||||
var ToID = ParseNum($("idTo").value);
|
||||
var Item = MapAccounts[ToID];
|
||||
if (Storage.getItem("White:" + ToID) || !$("idSumSend").value || Item && Item.MyAccount) {
|
||||
if(Storage.getItem("White:" + ToID) || !$("idSumSend").value || Item && Item.MyAccount)
|
||||
{
|
||||
SendMoney();
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
var CoinAmount = COIN_FROM_FLOAT($("idSumSend").value);
|
||||
var StrTo = " to " + GetAccountText(Item, ToID);
|
||||
$("idWhiteOnSend").checked = 0;
|
||||
$("idOnSendText").innerHTML = "<B style='color:#ff4534'>" + STRING_FROM_COIN(CoinAmount) + "</B> " + $("idCoinName").innerText + StrTo;
|
||||
if ($("idSumSend").value >= 100000) {
|
||||
if($("idSumSend").value >= 100000)
|
||||
{
|
||||
$("idOnSendText").innerHTML += "<BR><DIV style='color: yellow;'>WARNING: You are about to send a very large amount!</DIV>";
|
||||
}
|
||||
SetVisibleBlock("idBlockOnSend", 1);
|
||||
@ -285,13 +341,16 @@ function SendMoneyBefore() {
|
||||
}
|
||||
};
|
||||
|
||||
function SendMoney2() {
|
||||
function SendMoney2()
|
||||
{
|
||||
AddWhiteList();
|
||||
SendMoney();
|
||||
};
|
||||
|
||||
function SendMoney() {
|
||||
if (!CanSendTransaction) {
|
||||
function SendMoney()
|
||||
{
|
||||
if(!CanSendTransaction)
|
||||
{
|
||||
SetError("Can't Send transaction");
|
||||
return ;
|
||||
}
|
||||
@ -302,9 +361,11 @@ function SendMoney() {
|
||||
CreateTransaction(SendMoneyTR, true, ClearAttach);
|
||||
};
|
||||
|
||||
function GetJSONFromTransaction(TR) {
|
||||
function GetJSONFromTransaction(TR)
|
||||
{
|
||||
var TR2 = JSON.parse(JSON.stringify(TR));
|
||||
for (var i = 0; i < TR2.To.length; i++) {
|
||||
for(var i = 0; i < TR2.To.length; i++)
|
||||
{
|
||||
var Item = TR2.To[i];
|
||||
Item.PubKey = GetHexFromArr(Item.PubKey);
|
||||
}
|
||||
@ -314,19 +375,24 @@ function GetJSONFromTransaction(TR) {
|
||||
return Str;
|
||||
};
|
||||
|
||||
function GetTransactionFromJSON() {
|
||||
function GetTransactionFromJSON()
|
||||
{
|
||||
var Str = $("idTransaction").value;
|
||||
try {
|
||||
try
|
||||
{
|
||||
var TR = JSON.parse(Str);
|
||||
}
|
||||
catch (e) {
|
||||
catch(e)
|
||||
{
|
||||
SetError(e);
|
||||
return undefined;
|
||||
}
|
||||
for (var i = 0; i < TR.To.length; i++) {
|
||||
for(var i = 0; i < TR.To.length; i++)
|
||||
{
|
||||
var Item = TR.To[i];
|
||||
Item.PubKey = GetArrFromHex(Item.PubKey);
|
||||
if (Item.SumTER && Item.SumCOIN === undefined) {
|
||||
if(Item.SumTER && Item.SumCOIN === undefined)
|
||||
{
|
||||
Item.SumCOIN = Item.SumTER;
|
||||
delete Item.SumTER;
|
||||
}
|
||||
@ -336,8 +402,10 @@ function GetTransactionFromJSON() {
|
||||
return TR;
|
||||
};
|
||||
|
||||
function SendMoneyJSON() {
|
||||
if (!CanSendTransaction) {
|
||||
function SendMoneyJSON()
|
||||
{
|
||||
if(!CanSendTransaction)
|
||||
{
|
||||
SetError("Can't Send transaction");
|
||||
return ;
|
||||
}
|
||||
@ -347,22 +415,28 @@ function SendMoneyJSON() {
|
||||
SendMoneyTR(TR);
|
||||
};
|
||||
|
||||
function SignAndSendFromJSON() {
|
||||
function SignAndSendFromJSON()
|
||||
{
|
||||
SignJSON(SendMoneyJSON);
|
||||
};
|
||||
|
||||
function GetTransactionText(TR, key) {
|
||||
function GetTransactionText(TR,key)
|
||||
{
|
||||
var Str;
|
||||
if (TR) {
|
||||
if (TR.Type === TYPE_TRANSACTION_CREATE) {
|
||||
if(TR)
|
||||
{
|
||||
if(TR.Type === TYPE_TRANSACTION_CREATE)
|
||||
{
|
||||
Str = "New account " + TR.Name.substr(0, 20);
|
||||
}
|
||||
else
|
||||
if (TR.Type === 111) {
|
||||
if(TR.Type === 111)
|
||||
{
|
||||
var MapItem = {};
|
||||
var ValueTotal = {SumCOIN:0, SumCENT:0};
|
||||
Str = "" + TR.FromID + "/" + TR.OperationID + " to ";
|
||||
for (var i = 0; i < TR.To.length; i++) {
|
||||
for(var i = 0; i < TR.To.length; i++)
|
||||
{
|
||||
var Item = TR.To[i];
|
||||
if(Item.ID === TR.FromID || MapItem[Item.ID])
|
||||
continue;
|
||||
@ -370,7 +444,8 @@ function GetTransactionText(TR, key) {
|
||||
ADD(ValueTotal, Item);
|
||||
if(i === 0)
|
||||
Str += "[";
|
||||
if (Str.length < 16) {
|
||||
if(Str.length < 16)
|
||||
{
|
||||
if(i > 0)
|
||||
Str += ",";
|
||||
if(Item.ID || (Item.PubKey && Item.PubKey.length !== 66))
|
||||
@ -386,7 +461,8 @@ function GetTransactionText(TR, key) {
|
||||
Str += " " + (TR.Description.substr(0, 20)).replace(/\n/g, "");
|
||||
}
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
if(key)
|
||||
Str = key;
|
||||
else
|
||||
@ -395,15 +471,18 @@ function GetTransactionText(TR, key) {
|
||||
return Str;
|
||||
};
|
||||
|
||||
function SendMoneyTR(TR) {
|
||||
function SendMoneyTR(TR)
|
||||
{
|
||||
var Body = GetArrFromTR(TR);
|
||||
WriteArr(Body, TR.Sign, 64);
|
||||
Body.length += 12;
|
||||
SendTransaction(Body, TR, undefined, function(Err, TR, Body) {
|
||||
SendTransaction(Body, TR, undefined, function (Err,TR,Body)
|
||||
{
|
||||
if(Err)
|
||||
return ;
|
||||
var Item = MapAccounts[TR.FromID];
|
||||
if (Item) {
|
||||
if(Item)
|
||||
{
|
||||
var key = GetHexFromArr(sha3(Body));
|
||||
var BlockNum = GetCurrentBlockNumByTime();
|
||||
Item.LastTransactionText = GetTransactionText(TR);
|
||||
@ -414,31 +493,37 @@ function SendMoneyTR(TR) {
|
||||
});
|
||||
};
|
||||
|
||||
function ClearTransaction() {
|
||||
function ClearTransaction()
|
||||
{
|
||||
PayList = [];
|
||||
ClearAttach();
|
||||
CheckSendList(1);
|
||||
var arr = ["idAccount", "idTo", "idSumSend", "idDescription"];
|
||||
for (var i = 0; i < arr.length; i++) {
|
||||
for(var i = 0; i < arr.length; i++)
|
||||
{
|
||||
$(arr[i]).value = "";
|
||||
}
|
||||
SaveValues();
|
||||
CreateTransaction();
|
||||
};
|
||||
|
||||
function StartEditTransactionJSON() {
|
||||
function StartEditTransactionJSON()
|
||||
{
|
||||
var Item = $("idTransaction");
|
||||
Item.className = "smallbold";
|
||||
};
|
||||
|
||||
function EditJSONTransaction() {
|
||||
function EditJSONTransaction()
|
||||
{
|
||||
var name = "edit_transaction";
|
||||
var Item = $("idTransaction");
|
||||
if (IsVisibleBlock(name)) {
|
||||
if(IsVisibleBlock(name))
|
||||
{
|
||||
SetVisibleBlock(name, false);
|
||||
Item.className = "";
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
CreateTransaction();
|
||||
SetVisibleBlock(name, true);
|
||||
Item.className = "";
|
||||
@ -446,8 +531,10 @@ function EditJSONTransaction() {
|
||||
};
|
||||
var glNumPayCount = 0;
|
||||
|
||||
function GetInvoiceHTML(item, onclick, classstr) {
|
||||
if (!item.num) {
|
||||
function GetInvoiceHTML(item,onclick,classstr)
|
||||
{
|
||||
if(!item.num)
|
||||
{
|
||||
glNumPayCount++;
|
||||
item.num = glNumPayCount;
|
||||
}
|
||||
@ -461,44 +548,53 @@ function GetInvoiceHTML(item, onclick, classstr) {
|
||||
return "<button id='" + idname + "' onclick='" + onclick + "' class='" + classstr + "'>" + value + "</button>";
|
||||
};
|
||||
|
||||
function AddSendList(item) {
|
||||
function AddSendList(item)
|
||||
{
|
||||
PayList.push({Data:item});
|
||||
};
|
||||
|
||||
function CheckSendList(bRedraw) {
|
||||
function CheckSendList(bRedraw)
|
||||
{
|
||||
TitleWarning = PayList.length;
|
||||
if(AttachItem)
|
||||
TitleWarning++;
|
||||
var Str = Storage.getItem("InvoiceList");
|
||||
if(!Str && !bRedraw)
|
||||
return ;
|
||||
if (!bRedraw) {
|
||||
if(!bRedraw)
|
||||
{
|
||||
SelectTab("TabSend");
|
||||
}
|
||||
if (Str) {
|
||||
if(Str)
|
||||
{
|
||||
var arr = JSON.parse(Str);
|
||||
for (var i = 0; i < arr.length; i++) {
|
||||
for(var i = 0; i < arr.length; i++)
|
||||
{
|
||||
AddSendList(arr[i]);
|
||||
}
|
||||
Storage.setItem("InvoiceList", "");
|
||||
}
|
||||
var idList = $("idSendList");
|
||||
if (PayList.length) {
|
||||
if(PayList.length)
|
||||
{
|
||||
idList.innerHTML = "<DIV id='PaiListInfo'>Select the item you want to sign (pay) and send to blockchain:</DIV>";
|
||||
for (var i = 0; i < PayList.length; i++) {
|
||||
for(var i = 0; i < PayList.length; i++)
|
||||
{
|
||||
var item = PayList[i];
|
||||
idList.innerHTML += GetInvoiceHTML(item, "UseInvoice(" + i + ")", "btinvoice");
|
||||
}
|
||||
if(AttachItem === undefined)
|
||||
UseInvoice(0);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
idList.innerHTML = "";
|
||||
}
|
||||
};
|
||||
setInterval(CheckSendList, 200);
|
||||
|
||||
function UseInvoice(Num) {
|
||||
function UseInvoice(Num)
|
||||
{
|
||||
var item = PayList[Num];
|
||||
if(item.Data.From)
|
||||
$("idAccount").value = item.Data.From;
|
||||
@ -511,14 +607,17 @@ function UseInvoice(Num) {
|
||||
CheckSendList(1);
|
||||
};
|
||||
|
||||
function ClearAttach() {
|
||||
function ClearAttach()
|
||||
{
|
||||
AttachItem = undefined;
|
||||
if($("idAttach"))
|
||||
$("idAttach").innerHTML = "";
|
||||
};
|
||||
|
||||
function OpenAttach() {
|
||||
if (AttachItem) {
|
||||
function OpenAttach()
|
||||
{
|
||||
if(AttachItem)
|
||||
{
|
||||
var Data2 = JSON.parse(JSON.stringify(AttachItem.Data));
|
||||
if(Data2.Body)
|
||||
Data2.Body = GetHexFromArr(Data2.Body);
|
||||
@ -528,61 +627,75 @@ function OpenAttach() {
|
||||
};
|
||||
var CURRENCY, PUBKEY, NAME, SMART;
|
||||
|
||||
function SendTrCreateAccWait(Currency, PubKey, Name, Smart) {
|
||||
function SendTrCreateAccWait(Currency,PubKey,Name,Smart)
|
||||
{
|
||||
CURRENCY = Currency;
|
||||
PUBKEY = PubKey;
|
||||
NAME = Name;
|
||||
SMART = Smart;
|
||||
setTimeout(function() {
|
||||
setTimeout(function ()
|
||||
{
|
||||
SendTrCreateAcc(CURRENCY, PUBKEY, NAME, 0, SMART, 0, 0);
|
||||
}, 50);
|
||||
};
|
||||
|
||||
function SendTrCreateAcc(Currency, PubKey, Description, Adviser, Smart, bFindAcc, bAddToPay) {
|
||||
function SendTrCreateAcc(Currency,PubKey,Description,Adviser,Smart,bFindAcc,bAddToPay)
|
||||
{
|
||||
var TR = GetTrCreateAcc(Currency, PubKey, Description, Adviser, Smart);
|
||||
var Body = GetBodyCreateAcc(TR);
|
||||
TR.bFindAcc = 1;
|
||||
if (bAddToPay) {
|
||||
var Item = {
|
||||
name: Description, To: 0, Amount: CONFIG_DATA.PRICE_DAO.NewAccount, Description: "Create acc: " + Description, Body: Body,
|
||||
if(bAddToPay)
|
||||
{
|
||||
var Item = {name:Description, To:0, Amount:CONFIG_DATA.PRICE_DAO.NewAccount, Description:"Create acc: " + Description, Body:Body,
|
||||
};
|
||||
AddToInvoiceList(Item);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
SendTransaction(Body, TR);
|
||||
}
|
||||
$("idAccountName").value = "";
|
||||
CancelCreateAccount();
|
||||
};
|
||||
|
||||
function ChangeSmart(NumAccount, WasSmart) {
|
||||
if (!IsPrivateMode()) {
|
||||
function ChangeSmart(NumAccount,WasSmart)
|
||||
{
|
||||
if(!IsPrivateMode())
|
||||
{
|
||||
SetError("Pls, open wallet");
|
||||
return 0;
|
||||
}
|
||||
var Result = prompt("Enter smart number:", WasSmart);
|
||||
if (Result !== null && Result != WasSmart) {
|
||||
if(Result !== null && Result != WasSmart)
|
||||
{
|
||||
var Smart = parseInt(Result);
|
||||
if (Smart) {
|
||||
GetData("GetDappList", { StartNum: Smart, CountNum: 1 }, function(Data) {
|
||||
if (Data && Data.result && Data.arr.length === 1) {
|
||||
if(Smart)
|
||||
{
|
||||
GetData("GetDappList", {StartNum:Smart, CountNum:1}, function (Data)
|
||||
{
|
||||
if(Data && Data.result && Data.arr.length === 1)
|
||||
{
|
||||
SetSmartToAccount(NumAccount, Smart);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
SetError("Error smart number");
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
SetSmartToAccount(NumAccount, Smart);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function SetSmartToAccount(NumAccount, Smart) {
|
||||
function SetSmartToAccount(NumAccount,Smart)
|
||||
{
|
||||
var OperationID = 0;
|
||||
var Item = MapAccounts[NumAccount];
|
||||
if (Item) {
|
||||
if(Item)
|
||||
{
|
||||
OperationID = Item.Value.OperationID;
|
||||
}
|
||||
OperationID++;
|
||||
@ -597,7 +710,8 @@ function SetSmartToAccount(NumAccount, Smart) {
|
||||
SendTrArrayWithSign(Body, TR.Account, TR);
|
||||
};
|
||||
|
||||
function CheckLengthAccDesription(name, Length) {
|
||||
function CheckLengthAccDesription(name,Length)
|
||||
{
|
||||
var Str = $(name).value.substr(0, Length + 1);
|
||||
var arr = toUTF8Array(Str);
|
||||
var Len = Length - arr.length;
|
||||
|
@ -9,20 +9,24 @@
|
||||
*/
|
||||
|
||||
|
||||
function SavePrivateKey() {
|
||||
function SavePrivateKey()
|
||||
{
|
||||
var Select = document.getElementById("idTypeKey");
|
||||
if (Select.value === "brain") {
|
||||
if(Select.value === "brain")
|
||||
{
|
||||
ConvertToPrivateKey();
|
||||
return ;
|
||||
}
|
||||
var Str = document.getElementById("idKeyNew").value;
|
||||
Str = Str.trim();
|
||||
if (Select.value === "private" && (Str.length !== 64 || !IsHexStr(Str))) {
|
||||
if(Select.value === "private" && (Str.length !== 64 || !IsHexStr(Str)))
|
||||
{
|
||||
SetError("Error: Length must 64 HEX chars. (Length=" + Str.length + ")");
|
||||
return ;
|
||||
}
|
||||
else
|
||||
if (Select.value !== "private" && (Str.length !== 66 || Str.substr(0, 1) !== "0" || !IsHexStr(Str))) {
|
||||
if(Select.value !== "private" && (Str.length !== 66 || Str.substr(0, 1) !== "0" || !IsHexStr(Str)))
|
||||
{
|
||||
SetError("Error: Length must 66 HEX chars. (Length=" + Str.length + ")");
|
||||
return ;
|
||||
}
|
||||
@ -31,8 +35,10 @@ function SavePrivateKey() {
|
||||
else
|
||||
if(Select.value === "public" && PubKeyStr !== Str)
|
||||
SetStatus("Changed public key");
|
||||
GetData("SetWalletKey", Str, function(Data) {
|
||||
if (Data && Data.result === 1) {
|
||||
GetData("SetWalletKey", Str, function (Data)
|
||||
{
|
||||
if(Data && Data.result === 1)
|
||||
{
|
||||
if(Select.value === "private")
|
||||
SelectStyle("styleContrast1");
|
||||
else
|
||||
@ -44,8 +50,10 @@ function SavePrivateKey() {
|
||||
});
|
||||
};
|
||||
|
||||
function CreateCheckPoint() {
|
||||
if (!ServerBlockNumDB || ServerBlockNumDB < 16) {
|
||||
function CreateCheckPoint()
|
||||
{
|
||||
if(!ServerBlockNumDB || ServerBlockNumDB < 16)
|
||||
{
|
||||
SetError("Not set ServerBlockNumDB");
|
||||
return ;
|
||||
}
|
||||
@ -53,27 +61,35 @@ function CreateCheckPoint() {
|
||||
SetCheckPoint(BlockNum);
|
||||
};
|
||||
|
||||
function UseAutoCheckPoint() {
|
||||
function UseAutoCheckPoint()
|
||||
{
|
||||
var Set = $("idUseAutoCheckPoint").checked;
|
||||
var Period = ParseNum($("idPeriodAutoCheckPoint").value);
|
||||
GetData("SetAutoCheckPoint", { Set: Set, Period: Period }, function(Data) {
|
||||
if (Data) {
|
||||
GetData("SetAutoCheckPoint", {Set:Set, Period:Period}, function (Data)
|
||||
{
|
||||
if(Data)
|
||||
{
|
||||
SetStatus(Data.text, !Data.result);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function UseAutoCorrTime() {
|
||||
GetData("SetAutoCorrTime", document.getElementById("idUseAutoCorrTime").checked, function(Data) {
|
||||
if (Data) {
|
||||
function UseAutoCorrTime()
|
||||
{
|
||||
GetData("SetAutoCorrTime", document.getElementById("idUseAutoCorrTime").checked, function (Data)
|
||||
{
|
||||
if(Data)
|
||||
{
|
||||
SetStatus(Data.text, !Data.result);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function SetCodeVersionJSON() {
|
||||
function SetCodeVersionJSON()
|
||||
{
|
||||
var Data = JSON.parse(JSON.stringify(CONFIG_DATA.CODE_VERSION));
|
||||
if (!Data.BlockNum) {
|
||||
if(!Data.BlockNum)
|
||||
{
|
||||
Data.LevelUpdate = 160;
|
||||
}
|
||||
Data.BlockNum = CONFIG_DATA.CurBlockNum;
|
||||
@ -87,10 +103,12 @@ function SetCodeVersionJSON() {
|
||||
document.getElementById("idDevService").value = Str;
|
||||
};
|
||||
|
||||
function SetCorrTimeJSON() {
|
||||
function SetCorrTimeJSON()
|
||||
{
|
||||
var AutoDelta = parseInt(document.getElementById("idDevValue").value);
|
||||
var Data = {Num:CONFIG_DATA.CurBlockNum, bUse:1, bAddTime:1};
|
||||
if (AutoDelta < 0) {
|
||||
if(AutoDelta < 0)
|
||||
{
|
||||
AutoDelta = - AutoDelta;
|
||||
Data.bAddTime = 0;
|
||||
}
|
||||
@ -101,7 +119,8 @@ function SetCorrTimeJSON() {
|
||||
document.getElementById("idDevService").value = Str;
|
||||
};
|
||||
|
||||
function SetNetConstJSON() {
|
||||
function SetNetConstJSON()
|
||||
{
|
||||
var Str = JSON.stringify(Data, "", 2);
|
||||
document.getElementById("idDevService").value = Str;
|
||||
var Data = {MaxTrasactionLimit:CONFIG_DATA.MAX_TRANSACTION_LIMIT};
|
||||
@ -109,132 +128,171 @@ function SetNetConstJSON() {
|
||||
document.getElementById("idDevService").value = Str;
|
||||
};
|
||||
|
||||
function SetNewCodeVersion() {
|
||||
try {
|
||||
function SetNewCodeVersion()
|
||||
{
|
||||
try
|
||||
{
|
||||
var Data = JSON.parse(document.getElementById("idDevService").value);
|
||||
}
|
||||
catch (e) {
|
||||
catch(e)
|
||||
{
|
||||
SetError("Error format setting data");
|
||||
return ;
|
||||
}
|
||||
Data.addrArr = GetArrFromHex(Data.addrArr);
|
||||
GetData("SetNewCodeVersion", Data, function(Data) {
|
||||
if (Data) {
|
||||
GetData("SetNewCodeVersion", Data, function (Data)
|
||||
{
|
||||
if(Data)
|
||||
{
|
||||
SetStatus(Data.text, !Data.result);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function StartTimeCorrect() {
|
||||
try {
|
||||
function StartTimeCorrect()
|
||||
{
|
||||
try
|
||||
{
|
||||
var Data = JSON.parse(document.getElementById("idDevService").value);
|
||||
}
|
||||
catch (e) {
|
||||
catch(e)
|
||||
{
|
||||
SetError("Error format setting data");
|
||||
return ;
|
||||
}
|
||||
GetData("SetCheckDeltaTime", Data, function(Data) {
|
||||
if (Data) {
|
||||
GetData("SetCheckDeltaTime", Data, function (Data)
|
||||
{
|
||||
if(Data)
|
||||
{
|
||||
SetStatus(Data.text, !Data.result);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function StartNetConst() {
|
||||
try {
|
||||
function StartNetConst()
|
||||
{
|
||||
try
|
||||
{
|
||||
var Data = JSON.parse(document.getElementById("idDevService").value);
|
||||
}
|
||||
catch (e) {
|
||||
catch(e)
|
||||
{
|
||||
SetError("Error format setting data");
|
||||
return ;
|
||||
}
|
||||
GetData("SetCheckNetConstant", Data, function(Data) {
|
||||
if (Data) {
|
||||
GetData("SetCheckNetConstant", Data, function (Data)
|
||||
{
|
||||
if(Data)
|
||||
{
|
||||
SetStatus(Data.text, !Data.result);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function RestartNode() {
|
||||
function RestartNode()
|
||||
{
|
||||
GetData("RestartNode", {});
|
||||
DoRestartWallet();
|
||||
};
|
||||
|
||||
function UseAutoUpdate() {
|
||||
function UseAutoUpdate()
|
||||
{
|
||||
var Data = {USE_AUTO_UPDATE:document.getElementById("idAutoUpdate").checked, DoMining:1};
|
||||
GetData("SaveConstant", Data, function(Data) {
|
||||
if (Data && Data.result) {
|
||||
GetData("SaveConstant", Data, function (Data)
|
||||
{
|
||||
if(Data && Data.result)
|
||||
{
|
||||
SetStatus("Save AutoUpdate: " + document.getElementById("idAutoUpdate").checked);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function UseMining() {
|
||||
if (!MiningAccount) {
|
||||
function UseMining()
|
||||
{
|
||||
if(!MiningAccount)
|
||||
{
|
||||
SetError("Not set mining account");
|
||||
return ;
|
||||
}
|
||||
var Data = {USE_MINING:document.getElementById("idUseMining").checked, DoMining:1};
|
||||
GetData("SaveConstant", Data, function(Data) {
|
||||
if (Data && Data.result) {
|
||||
GetData("SaveConstant", Data, function (Data)
|
||||
{
|
||||
if(Data && Data.result)
|
||||
{
|
||||
SetStatus("Save Mining: " + document.getElementById("idUseMining").checked);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function SetPercentMining() {
|
||||
function SetPercentMining()
|
||||
{
|
||||
var Data = {POW_MAX_PERCENT:document.getElementById("idPercentMining").value};
|
||||
GetData("SaveConstant", Data, function(Data) {
|
||||
if (Data && Data.result) {
|
||||
GetData("SaveConstant", Data, function (Data)
|
||||
{
|
||||
if(Data && Data.result)
|
||||
{
|
||||
SetStatus("Save Mining percent: " + document.getElementById("idPercentMining").value + " %");
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function MiningSets() {
|
||||
function MiningSets()
|
||||
{
|
||||
var name = "edit_mining_set";
|
||||
if (IsVisibleBlock(name)) {
|
||||
if(IsVisibleBlock(name))
|
||||
{
|
||||
SetVisibleBlock(name, false);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
SetVisibleBlock(name, true);
|
||||
document.getElementById("idMiningAccount").value = MiningAccount;
|
||||
document.getElementById("idMiningAccount").focus();
|
||||
}
|
||||
};
|
||||
|
||||
function SaveMiningSet(Value) {
|
||||
function SaveMiningSet(Value)
|
||||
{
|
||||
SetVisibleBlock("edit_mining_set", false);
|
||||
if (Value) {
|
||||
if(Value)
|
||||
{
|
||||
MiningAccount = Value;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
MiningAccount = ParseNum(document.getElementById("idMiningAccount").value);
|
||||
}
|
||||
GetData("SetMining", MiningAccount, function(Data) {
|
||||
GetData("SetMining", MiningAccount, function (Data)
|
||||
{
|
||||
});
|
||||
};
|
||||
|
||||
function CancalMiningSet() {
|
||||
function CancalMiningSet()
|
||||
{
|
||||
var name = "edit_mining_set";
|
||||
SetVisibleBlock(name, false);
|
||||
};
|
||||
var WasHistoryMaxNum;
|
||||
var WasLastNumSound = 0;
|
||||
|
||||
function CheckNewMoney() {
|
||||
function CheckNewMoney()
|
||||
{
|
||||
return ;
|
||||
if(!$("idUseSoundHistory").checked)
|
||||
return ;
|
||||
if(WasHistoryMaxNum === HistoryMaxNum || !ServerBlockNumDB)
|
||||
return ;
|
||||
WasHistoryMaxNum = HistoryMaxNum;
|
||||
GetData("GetHistoryAct", { StartNum: HistoryMaxNum - 40, CountNum: 40 }, function(Data) {
|
||||
if (Data && Data.result) {
|
||||
GetData("GetHistoryAct", {StartNum:HistoryMaxNum - 40, CountNum:40}, function (Data)
|
||||
{
|
||||
if(Data && Data.result)
|
||||
{
|
||||
var arr = Data.arr;
|
||||
for (var i = 0; i < arr.length; i++) {
|
||||
for(var i = 0; i < arr.length; i++)
|
||||
{
|
||||
var Item = arr[i];
|
||||
if (Item.Direct === "+" && Item.BlockNum > ServerBlockNumDB - 60 && Item.BlockNum < ServerBlockNumDB - 20 && Item.BlockNum > WasLastNumSound) {
|
||||
if(Item.Direct === "+" && Item.BlockNum > ServerBlockNumDB - 60 && Item.BlockNum < ServerBlockNumDB - 20 && Item.BlockNum > WasLastNumSound)
|
||||
{
|
||||
WasLastNumSound = Item.BlockNum;
|
||||
$("sound_coin").play();
|
||||
}
|
||||
@ -243,41 +301,52 @@ function CheckNewMoney() {
|
||||
});
|
||||
};
|
||||
|
||||
function DoRestartWallet() {
|
||||
function DoRestartWallet()
|
||||
{
|
||||
SetStatus("<H1 align='center' style='color:blue'>Restarting program...</H1>");
|
||||
if (!WasSetRestart) {
|
||||
if(!WasSetRestart)
|
||||
{
|
||||
WasSetRestart = 1;
|
||||
setTimeout(function() {
|
||||
setTimeout(function ()
|
||||
{
|
||||
window.location.reload();
|
||||
}, 10 * 1000);
|
||||
}
|
||||
};
|
||||
|
||||
function SetArrLog(arr) {
|
||||
function SetArrLog(arr)
|
||||
{
|
||||
var Str = "";
|
||||
var bFindAccount = 0;
|
||||
for (var i = 0; i < arr.length; i++) {
|
||||
for(var i = 0; i < arr.length; i++)
|
||||
{
|
||||
var Item = arr[i];
|
||||
var tr_text = GetTransactionText(MapSendTransaction[Item.key], Item.key.substr(0, 16));
|
||||
var info = Item.text;
|
||||
if(tr_text)
|
||||
info += " (" + tr_text + ")";
|
||||
if (Item.final) {
|
||||
if(Item.final)
|
||||
{
|
||||
var TR = MapSendTransaction[Item.key];
|
||||
if (TR) {
|
||||
if (Item.text.indexOf("Add to blockchain") >= 0) {
|
||||
if (TR.bFindAcc) {
|
||||
if(TR)
|
||||
{
|
||||
if(Item.text.indexOf("Add to blockchain") >= 0)
|
||||
{
|
||||
if(TR.bFindAcc)
|
||||
{
|
||||
bFindAccount = 1;
|
||||
TR.bFindAcc = 0;
|
||||
}
|
||||
if (TR.Run) {
|
||||
if(TR.Run)
|
||||
{
|
||||
TR.Run(TR);
|
||||
TR.Run = undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
var Account = MapCheckTransaction[Item.key];
|
||||
if (Account) {
|
||||
if(Account)
|
||||
{
|
||||
delete MapCheckTransaction[Item.key];
|
||||
Account.NextSendTime = 0;
|
||||
}
|
||||
@ -286,28 +355,36 @@ function SetArrLog(arr) {
|
||||
}
|
||||
SetStatusFromServer(Str);
|
||||
CheckSending();
|
||||
if (bFindAccount) {
|
||||
if(bFindAccount)
|
||||
{
|
||||
FindMyAccounts();
|
||||
}
|
||||
};
|
||||
|
||||
function SetAutoMining() {
|
||||
setTimeout(function() {
|
||||
function SetAutoMining()
|
||||
{
|
||||
setTimeout(function ()
|
||||
{
|
||||
var Select = $("idAccount");
|
||||
if (Select.options.length) {
|
||||
if(Select.options.length)
|
||||
{
|
||||
SaveMiningSet(Select.options[Select.options.length - 1].value);
|
||||
}
|
||||
}, 100);
|
||||
};
|
||||
|
||||
function ViewNetworkMode() {
|
||||
if (IsVisibleBlock('idNetworkView')) {
|
||||
function ViewNetworkMode()
|
||||
{
|
||||
if(IsVisibleBlock('idNetworkView'))
|
||||
{
|
||||
SetVisibleBlock('idNetworkView', false);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
SetVisibleBlock('idNetworkView', true);
|
||||
var Mode = CONFIG_DATA.CONSTANTS.NET_WORK_MODE;
|
||||
if (!Mode) {
|
||||
if(!Mode)
|
||||
{
|
||||
Mode = {};
|
||||
Mode.UseDirectIP = true;
|
||||
if(INTERNET_IP_FROM_STUN)
|
||||
@ -325,15 +402,18 @@ function ViewNetworkMode() {
|
||||
}
|
||||
};
|
||||
|
||||
function SetNetworkParams(bRestart) {
|
||||
function SetNetworkParams(bRestart)
|
||||
{
|
||||
var Mode = {};
|
||||
Mode.UseDirectIP = document.getElementById("idUseDirectIP").checked;
|
||||
Mode.ip = document.getElementById("idIP").value;
|
||||
Mode.port = ParseNum(document.getElementById("idPort").value);
|
||||
Mode.NodeWhiteList = document.getElementById("idNodeWhiteList").value;
|
||||
Mode.DoRestartNode = bRestart;
|
||||
GetData("SetNetMode", Mode, function(Data) {
|
||||
if (Data && Data.result) {
|
||||
GetData("SetNetMode", Mode, function (Data)
|
||||
{
|
||||
if(Data && Data.result)
|
||||
{
|
||||
SetStatus("Set net work params OK");
|
||||
SetVisibleBlock('idNetworkView', false);
|
||||
}
|
||||
@ -342,27 +422,35 @@ function SetNetworkParams(bRestart) {
|
||||
DoRestartWallet();
|
||||
};
|
||||
|
||||
function ViewConstant() {
|
||||
if (IsVisibleBlock('idConstantView')) {
|
||||
function ViewConstant()
|
||||
{
|
||||
if(IsVisibleBlock('idConstantView'))
|
||||
{
|
||||
SetVisibleBlock('idConstantView', false);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
SetVisibleBlock('idConstantView', true);
|
||||
document.getElementById("idConstant").value = JSON.stringify(CONFIG_DATA.CONSTANTS, "", 2);
|
||||
}
|
||||
};
|
||||
|
||||
function SaveConstant(bRestart) {
|
||||
try {
|
||||
function SaveConstant(bRestart)
|
||||
{
|
||||
try
|
||||
{
|
||||
var Data = JSON.parse(document.getElementById("idConstant").value);
|
||||
}
|
||||
catch (e) {
|
||||
catch(e)
|
||||
{
|
||||
SetError("Error JSON format setting constant");
|
||||
return ;
|
||||
}
|
||||
Data.DoRestartNode = bRestart;
|
||||
GetData("SaveConstant", Data, function(Data) {
|
||||
if (Data && Data.result) {
|
||||
GetData("SaveConstant", Data, function (Data)
|
||||
{
|
||||
if(Data && Data.result)
|
||||
{
|
||||
SetStatus("Save Constant OK");
|
||||
SetVisibleBlock('idConstantView', false);
|
||||
}
|
||||
@ -371,11 +459,14 @@ function SaveConstant(bRestart) {
|
||||
DoRestartWallet();
|
||||
};
|
||||
|
||||
function ViewRemoteParams() {
|
||||
if (IsVisibleBlock('idRemoteView')) {
|
||||
function ViewRemoteParams()
|
||||
{
|
||||
if(IsVisibleBlock('idRemoteView'))
|
||||
{
|
||||
SetVisibleBlock('idRemoteView', false);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
SetVisibleBlock('idRemoteView', true);
|
||||
if(CONFIG_DATA.HTTPPort)
|
||||
document.getElementById("idHTTPPort").value = CONFIG_DATA.HTTPPort;
|
||||
@ -383,14 +474,17 @@ function ViewRemoteParams() {
|
||||
}
|
||||
};
|
||||
|
||||
function SetRemoteParams(bRestart) {
|
||||
function SetRemoteParams(bRestart)
|
||||
{
|
||||
var PrevHTTPPassword = HTTPPassword;
|
||||
var HTTPPort = ParseNum(document.getElementById("idHTTPPort").value);
|
||||
var HTTPPassword = document.getElementById("idHTTPPassword").value;
|
||||
GetData("SetHTTPParams", { HTTPPort: HTTPPort, HTTPPassword: HTTPPassword, DoRestartNode: bRestart }, function(Data) {
|
||||
GetData("SetHTTPParams", {HTTPPort:HTTPPort, HTTPPassword:HTTPPassword, DoRestartNode:bRestart}, function (Data)
|
||||
{
|
||||
if(!PrevHTTPPassword && HTTPPassword)
|
||||
window.location.reload();
|
||||
else {
|
||||
else
|
||||
{
|
||||
SetVisibleBlock('idRemoteView', false);
|
||||
SetStatus("Set HTTP params OK");
|
||||
}
|
||||
@ -399,30 +493,37 @@ function SetRemoteParams(bRestart) {
|
||||
DoRestartWallet();
|
||||
};
|
||||
|
||||
function RewriteAllTransactions() {
|
||||
function RewriteAllTransactions()
|
||||
{
|
||||
DoBlockChainProcess("RewriteAllTransactions", "Rewrite all transactions", 0);
|
||||
};
|
||||
|
||||
function RewriteTransactions() {
|
||||
function RewriteTransactions()
|
||||
{
|
||||
DoBlockChainProcess("RewriteTransactions", "Rewrite transactions on last %1 blocks", 1);
|
||||
};
|
||||
|
||||
function TruncateBlockChain() {
|
||||
function TruncateBlockChain()
|
||||
{
|
||||
DoBlockChainProcess("TruncateBlockChain", "Truncate last %1 blocks", 1);
|
||||
};
|
||||
|
||||
function ClearDataBase() {
|
||||
function ClearDataBase()
|
||||
{
|
||||
DoBlockChainProcess("ClearDataBase", "Clear DataBase", 0);
|
||||
};
|
||||
|
||||
function CleanChain() {
|
||||
function CleanChain()
|
||||
{
|
||||
DoBlockChainProcess("CleanChain", "Clean chain on last %1 blocks", 1);
|
||||
};
|
||||
|
||||
function DoBlockChainProcess(FuncName, Text, LastBlock) {
|
||||
function DoBlockChainProcess(FuncName,Text,LastBlock)
|
||||
{
|
||||
SaveValues();
|
||||
var Params = {};
|
||||
if (LastBlock) {
|
||||
if(LastBlock)
|
||||
{
|
||||
Params.BlockCount = ParseNum(document.getElementById("idBlockCount").value);
|
||||
Text = Text.replace("%1", Params.BlockCount);
|
||||
}
|
||||
@ -431,8 +532,10 @@ function DoBlockChainProcess(FuncName, Text, LastBlock) {
|
||||
return ;
|
||||
SetVisibleBlock("idServerBlock", 1);
|
||||
SetStatus("START: " + Text);
|
||||
GetData(FuncName, Params, function(Data) {
|
||||
if (Data) {
|
||||
GetData(FuncName, Params, function (Data)
|
||||
{
|
||||
if(Data)
|
||||
{
|
||||
SetStatus("FINISH: " + Text, !Data.result);
|
||||
}
|
||||
});
|
||||
|
@ -18,37 +18,23 @@ var StartTimeConnecting = 0;
|
||||
var ConnectedCount = 0;
|
||||
var NETWORK = "TERA-MAIN";
|
||||
var ServerMap = {};
|
||||
var ServerMainMap = {
|
||||
"127.0.0.1": { "ip": "127.0.0.1", "port": 80, "Name": "LOCAL" }, "terafoundation.org": {
|
||||
"ip": "terafoundation.org",
|
||||
"port": 443, "Name": "TERA", "System": 1
|
||||
}, "dappsgate.com": { "ip": "dappsgate.com", "port": 80, "Name": "SUPPORT2", "System": 1 }, "t1.teraexplorer.com": {
|
||||
"ip": "t1.teraexplorer.com",
|
||||
"port": 80, "Name": "t1.teraexplorer.com", "System": 1
|
||||
}, "t2.teraexplorer.com": {
|
||||
"ip": "t2.teraexplorer.com", "port": 80, "Name": "t2.teraexplorer.com",
|
||||
"System": 1
|
||||
}, "t3.teraexplorer.com": { "ip": "t3.teraexplorer.com", "port": 80, "Name": "t3.teraexplorer.com", "System": 1 }, "t4.teraexplorer.com": {
|
||||
"ip": "t4.teraexplorer.com",
|
||||
"port": 80, "Name": "t4.teraexplorer.com", "System": 1
|
||||
}, "t5.teraexplorer.com": {
|
||||
"ip": "t5.teraexplorer.com", "port": 80, "Name": "t5.teraexplorer.com",
|
||||
"System": 1
|
||||
},
|
||||
};
|
||||
var ServerTestMap = {
|
||||
"127.0.0.1": { "ip": "127.0.0.1", "port": 80, "Name": "LOCAL" }, "dappsgate.com": {
|
||||
"ip": "dappsgate.com", "port": 88,
|
||||
"Name": "SUPPORT2", "System": 1
|
||||
},
|
||||
};
|
||||
var ServerMainMap = {"127.0.0.1":{"ip":"127.0.0.1", "port":80, "Name":"LOCAL"}, "t2.teraexplorer.com":{"ip":"t2.teraexplorer.com",
|
||||
"port":443, "Name":"t2.teraexplorer.com", "System":1}, "t3.teraexplorer.com":{"ip":"t3.teraexplorer.com", "port":443, "Name":"t3.teraexplorer.com",
|
||||
"System":1}, "t4.teraexplorer.com":{"ip":"t4.teraexplorer.com", "port":443, "Name":"t4.teraexplorer.com", "System":1}, "t5.teraexplorer.com":{"ip":"t5.teraexplorer.com",
|
||||
"port":443, "Name":"t5.teraexplorer.com", "System":1}, "dappsgate.com":{"ip":"dappsgate.com", "port":80, "Name":"SUPPORT2",
|
||||
"System":1}, "t1.teraexplorer.com":{"ip":"t1.teraexplorer.com", "port":80, "Name":"t1.teraexplorer.com", "System":1}, };
|
||||
var ServerTestMap = {"127.0.0.1":{"ip":"127.0.0.1", "port":80, "Name":"LOCAL"}, "dappsgate.com":{"ip":"dappsgate.com", "port":88,
|
||||
"Name":"SUPPORT2", "System":1}, };
|
||||
|
||||
function StartWebWallet() {
|
||||
if (NETWORK === "TERA-TEST2") {
|
||||
function StartWebWallet()
|
||||
{
|
||||
if(NETWORK === "TERA-TEST2")
|
||||
{
|
||||
MIN_SUM_POWER = 0;
|
||||
ServerMap = ServerTestMap;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
MIN_SUM_POWER = COUNT_BLOCK_PROOF * 35;
|
||||
ServerMap = ServerMainMap;
|
||||
}
|
||||
@ -57,11 +43,14 @@ function StartWebWallet() {
|
||||
ConnectWebWallet();
|
||||
};
|
||||
|
||||
function OnInitWebWallet() {
|
||||
function OnInitWebWallet()
|
||||
{
|
||||
var str = Storage.getItem(NETWORK + "NodesArrayList");
|
||||
if (str) {
|
||||
if(str)
|
||||
{
|
||||
var arr = JSON.parse(str);
|
||||
for (var i = 0; i < arr.length; i++) {
|
||||
for(var i = 0; i < arr.length; i++)
|
||||
{
|
||||
var Item = ServerMap[arr[i].ip];
|
||||
if(Item && Item.System)
|
||||
continue;
|
||||
@ -70,38 +59,46 @@ function OnInitWebWallet() {
|
||||
}
|
||||
};
|
||||
|
||||
function SaveServerMap() {
|
||||
function SaveServerMap()
|
||||
{
|
||||
var arr = [];
|
||||
for (var key in ServerMap) {
|
||||
for(var key in ServerMap)
|
||||
{
|
||||
var Item = ServerMap[key];
|
||||
if (Item.SumPower >= MIN_SUM_POWER) {
|
||||
if(Item.SumPower >= MIN_SUM_POWER)
|
||||
{
|
||||
arr.push({ip:Item.ip, port:Item.port});
|
||||
}
|
||||
}
|
||||
Storage.setItem(NETWORK + "NodesArrayList", JSON.stringify(arr));
|
||||
};
|
||||
|
||||
function SetStatus(Str) {
|
||||
function SetStatus(Str)
|
||||
{
|
||||
var id = $("idStatus");
|
||||
id.innerHTML = Str;
|
||||
if(Str)
|
||||
console.log(id.innerText);
|
||||
};
|
||||
|
||||
function SetError(Str, bNoSound) {
|
||||
function SetError(Str,bNoSound)
|
||||
{
|
||||
SetStatus("<DIV align='left' style='color:red'><B>" + Str + "</B></DIV>");
|
||||
};
|
||||
var CountConnect = 0;
|
||||
var CountWallet = 0;
|
||||
|
||||
function ConnectWebWallet() {
|
||||
function ConnectWebWallet()
|
||||
{
|
||||
StartTimeConnecting = Date.now();
|
||||
ConnectedCount = 0;
|
||||
for (var key in ServerMap) {
|
||||
for(var key in ServerMap)
|
||||
{
|
||||
var Item = ServerMap[key];
|
||||
Item.SendHandShake = 0;
|
||||
}
|
||||
if (window.BrowserIE && !IsLocalClient()) {
|
||||
if(window.BrowserIE && !IsLocalClient())
|
||||
{
|
||||
MainServer = undefined;
|
||||
return ;
|
||||
}
|
||||
@ -113,10 +110,12 @@ function ConnectWebWallet() {
|
||||
};
|
||||
var Stage = 0;
|
||||
|
||||
function LoopHandShake() {
|
||||
function LoopHandShake()
|
||||
{
|
||||
Stage++;
|
||||
SetStatus("Connecting: " + Stage + "...");
|
||||
for (var key in ServerMap) {
|
||||
for(var key in ServerMap)
|
||||
{
|
||||
var Item = ServerMap[key];
|
||||
if(Item.SendHandShake || !Item.port)
|
||||
continue;
|
||||
@ -127,7 +126,8 @@ function LoopHandShake() {
|
||||
}
|
||||
};
|
||||
|
||||
function DoNodeList(Item) {
|
||||
function DoNodeList(Item)
|
||||
{
|
||||
console.log(GetProtocolServerPath(Item) + "/GetNodeList");
|
||||
if(window.location.protocol === "https:" && Item.port !== 443)
|
||||
return ;
|
||||
@ -135,33 +135,41 @@ function DoNodeList(Item) {
|
||||
return ;
|
||||
SetStatus("Try: " + Item.ip + ":" + Item.port);
|
||||
Item.SendHandShake = 1;
|
||||
GetData(GetProtocolServerPath(Item) + "/GetNodeList", {}, function(Data) {
|
||||
if (Data && Data.result && Data.NETWORK === NETWORK && Data.VersionNum >= MIN_VERSION) {
|
||||
GetData(GetProtocolServerPath(Item) + "/GetNodeList", {}, function (Data)
|
||||
{
|
||||
if(Data && Data.result && Data.NETWORK === NETWORK && Data.VersionNum >= MIN_VERSION)
|
||||
{
|
||||
ConnectedCount++;
|
||||
Item.GetHandShake = 1;
|
||||
Item.BlockChain = Data.BlockChain;
|
||||
SetStatus("Get: " + Item.ip + ":" + Item.port);
|
||||
var bWas = 0;
|
||||
for (var i = 0; i < Data.arr.length; i++) {
|
||||
for(var i = 0; i < Data.arr.length; i++)
|
||||
{
|
||||
var Node = Data.arr[i];
|
||||
if (!ServerMap[Node.ip] && Node.port) {
|
||||
if(!ServerMap[Node.ip] && Node.port)
|
||||
{
|
||||
ServerMap[Node.ip] = Node;
|
||||
console.log("New: " + Node.ip + ":" + Node.port);
|
||||
bWas = 1;
|
||||
}
|
||||
}
|
||||
if (bWas && ConnectedCount < MaxConnectedCount && new Date() - StartTimeConnecting < MaxTimeConnecting) {
|
||||
if(bWas && ConnectedCount < MaxConnectedCount && new Date() - StartTimeConnecting < MaxTimeConnecting)
|
||||
{
|
||||
setTimeout(LoopHandShake, 100);
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function LoopWalletInfo() {
|
||||
function LoopWalletInfo()
|
||||
{
|
||||
SetStatus("Get wallets info...");
|
||||
for (var key in ServerMap) {
|
||||
for(var key in ServerMap)
|
||||
{
|
||||
var Item = ServerMap[key];
|
||||
if (Item.port) {
|
||||
if(Item.port)
|
||||
{
|
||||
CountWallet++;
|
||||
if(window.BrowserIE && CountWallet > 4)
|
||||
break;
|
||||
@ -171,15 +179,18 @@ function LoopWalletInfo() {
|
||||
setTimeout(FindLider, 500);
|
||||
};
|
||||
|
||||
function DoWalletInfo(Item) {
|
||||
function DoWalletInfo(Item)
|
||||
{
|
||||
if(window.location.protocol === "https:" && Item.port !== 443)
|
||||
return ;
|
||||
if(Item.port === 443 && IsIPAddres(Item.ip))
|
||||
return ;
|
||||
Item.StartTime = Date.now();
|
||||
Item.SendWalletInfo = 1;
|
||||
GetData(GetProtocolServerPath(Item) + "/GetCurrentInfo", { BlockChain: 1 }, function(Data) {
|
||||
if (Data && Data.result && Data.BlockChain && Data.NETWORK === NETWORK) {
|
||||
GetData(GetProtocolServerPath(Item) + "/GetCurrentInfo", {BlockChain:1}, function (Data)
|
||||
{
|
||||
if(Data && Data.result && Data.BlockChain && Data.NETWORK === NETWORK)
|
||||
{
|
||||
Item.Name = Data.NODES_NAME;
|
||||
Item.GetWalletInfo = 1;
|
||||
Item.DeltaTime = new Date() - Item.StartTime;
|
||||
@ -190,18 +201,22 @@ function DoWalletInfo(Item) {
|
||||
});
|
||||
};
|
||||
|
||||
function FindLider() {
|
||||
function FindLider()
|
||||
{
|
||||
MainServer = undefined;
|
||||
var Arr = [];
|
||||
var MapSumPower = {};
|
||||
for (var key in ServerMap) {
|
||||
for(var key in ServerMap)
|
||||
{
|
||||
var Item = ServerMap[key];
|
||||
if (Item.GetWalletInfo && Item.BlockChain) {
|
||||
if(Item.GetWalletInfo && Item.BlockChain)
|
||||
{
|
||||
var arr = Item.BlockChain;
|
||||
if(arr.data)
|
||||
arr = arr.data;
|
||||
Item.SumPower = CalcPowFromBlockChain(arr);
|
||||
if (Item.SumPower < MIN_SUM_POWER) {
|
||||
if(Item.SumPower < MIN_SUM_POWER)
|
||||
{
|
||||
console.log("Skip: " + Item.ip + ":" + Item.port + " SumPower(" + Item.SumPower + ") < MIN_SUM_POWER(" + MIN_SUM_POWER + ")");
|
||||
continue;
|
||||
}
|
||||
@ -212,18 +227,23 @@ function FindLider() {
|
||||
}
|
||||
}
|
||||
var Max = 0, MaxKey;
|
||||
for (var key in MapSumPower) {
|
||||
if (MapSumPower[key] >= Max) {
|
||||
for(var key in MapSumPower)
|
||||
{
|
||||
if(MapSumPower[key] >= Max)
|
||||
{
|
||||
Max = MapSumPower[key];
|
||||
MaxKey = parseInt(key);
|
||||
}
|
||||
}
|
||||
Arr.sort(function(a, b) {
|
||||
Arr.sort(function (a,b)
|
||||
{
|
||||
return a.DeltaTime - b.DeltaTime;
|
||||
});
|
||||
for (var i = 0; i < Arr.length; i++) {
|
||||
for(var i = 0; i < Arr.length; i++)
|
||||
{
|
||||
var Item = Arr[i];
|
||||
if (Item.SumPower === MaxKey) {
|
||||
if(Item.SumPower === MaxKey)
|
||||
{
|
||||
SetStatus("Find " + Item.ip + ":" + Item.port + " with pow=" + Item.SumPower + "/" + MaxKey + " ping=" + Item.DeltaTime);
|
||||
MainServer = Item;
|
||||
SaveServerMap();
|
||||
@ -233,18 +253,22 @@ function FindLider() {
|
||||
OnFindServer();
|
||||
};
|
||||
|
||||
function CalcPowFromBlockChain(BufRead) {
|
||||
function CalcPowFromBlockChain(BufRead)
|
||||
{
|
||||
var Sum = 0;
|
||||
var Arr = GetBlockArrFromBuffer(BufRead);
|
||||
if (Arr.length === COUNT_BLOCK_PROOF) {
|
||||
for (var i = 0; i < Arr.length; i++) {
|
||||
if(Arr.length === COUNT_BLOCK_PROOF)
|
||||
{
|
||||
for(var i = 0; i < Arr.length; i++)
|
||||
{
|
||||
Sum += Arr[i].Power;
|
||||
}
|
||||
}
|
||||
return Sum;
|
||||
};
|
||||
|
||||
function SetAllSum() {
|
||||
function SetAllSum()
|
||||
{
|
||||
var Item = MapAccounts[$("idAccount").value];
|
||||
if(Item)
|
||||
$("idSumSend").value = FLOAT_FROM_COIN(Item.Value).toStringF();
|
||||
|
@ -42,7 +42,7 @@
|
||||
{
|
||||
if(e.keyCode===27)
|
||||
{
|
||||
window.close();
|
||||
ClosePage();
|
||||
}
|
||||
};
|
||||
|
||||
@ -53,6 +53,15 @@
|
||||
|
||||
}, false);
|
||||
|
||||
if (window.addEventListener)
|
||||
{
|
||||
window.addEventListener("message", OnMessage);
|
||||
} else
|
||||
{
|
||||
// IE8
|
||||
window.attachEvent("onmessage", OnMessage);
|
||||
}
|
||||
|
||||
}
|
||||
function ViewBlock(BlockNum)
|
||||
{
|
||||
@ -74,14 +83,49 @@
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
var FrameData;
|
||||
function ClosePage()
|
||||
{
|
||||
if(FrameData && window.parent)
|
||||
{
|
||||
FrameData.cmd="Close";
|
||||
window.parent.postMessage(FrameData, "*");
|
||||
}
|
||||
else
|
||||
window.close();
|
||||
}
|
||||
|
||||
function OnMessage(event)
|
||||
{
|
||||
var Data=event.data;
|
||||
if(!Data || typeof Data!=="object")
|
||||
return;
|
||||
|
||||
FrameData=Data;
|
||||
if(Data.BlockNum)
|
||||
{
|
||||
document.getElementById("idViewBlockNum").value=Data.BlockNum;
|
||||
ViewBlock();
|
||||
|
||||
$("MTabWelcome").className+=" back-link";
|
||||
}
|
||||
}
|
||||
function DoBackPage()
|
||||
{
|
||||
if(FrameData)
|
||||
ClosePage()
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<header class="header">
|
||||
<div class="header__wrapper">
|
||||
<div class="header__logo header__logo--history">
|
||||
<a onclick="" class="header__logo-link" id="MTabWelcome">
|
||||
<img class="main-logo" src="/PIC/TeraLogo.svg" alt="TERA Foundation">
|
||||
<a onclick="DoBackPage()" class="header__logo-link" id="MTabWelcome">
|
||||
<img class="main-logo" src="./PIC/TeraLogo.svg" alt="TERA Foundation">
|
||||
<p class="header__logo-name">Blockviewer</p>
|
||||
</a>
|
||||
</div>
|
||||
@ -96,7 +140,6 @@
|
||||
<section class="history-page" id="idTransactionBlock" style="display: block">
|
||||
<div class="history__text-block">
|
||||
<div class="history-page__id" >
|
||||
<!--<a class="back-link back-link--history" onclick="SelectTab('TabKeySet')"><span>Accounts</span></a>-->
|
||||
Transactions on block: <INPUT class="history-page__id-count" type="number" id="idViewBlockNum" style="text-align: center" value="0" min=0 max=1000000000 onchange="ViewBlock()">
|
||||
</div>
|
||||
<BR>
|
||||
|
@ -68,11 +68,13 @@
|
||||
$("idConsoleText").value=Data.Code;
|
||||
$("idConsoleSend").value=Data.Type;
|
||||
$("idProcessTX").checked=Data.ProcessTX;
|
||||
$("idProcessWEB").checked=Data.ProcessWEB;
|
||||
}
|
||||
else
|
||||
{
|
||||
$("idConsoleText").value=Data;
|
||||
$("idProcessTX").checked=0;
|
||||
$("idProcessWEB").checked=0;
|
||||
$("idConsoleSend").value="ServerCode";
|
||||
}
|
||||
if(bRun)
|
||||
@ -99,7 +101,7 @@
|
||||
|
||||
if(Name)
|
||||
{
|
||||
var Data={Code:$("idConsoleText").value,Type:$("idConsoleSend").value,ProcessTX:$("idProcessTX").checked};
|
||||
var Data={Code:$("idConsoleText").value,Type:$("idConsoleSend").value,ProcessTX:$("idProcessTX").checked,ProcessWEB:$("idProcessWEB").checked};
|
||||
CodeList[Name]=Data;
|
||||
}
|
||||
|
||||
@ -206,8 +208,10 @@
|
||||
function SendServerCode(Value)
|
||||
{
|
||||
var bProcessTX = $("idProcessTX").checked;
|
||||
var bProcessWEB = $("idProcessWEB").checked;
|
||||
|
||||
SetStatus("");
|
||||
GetData("SendDirectCode",{Code:Value,TX:bProcessTX }, function (Data)
|
||||
GetData("SendDirectCode",{Code:Value,TX:bProcessTX,WEB:bProcessWEB }, function (Data)
|
||||
{
|
||||
if(Data)
|
||||
{
|
||||
@ -422,6 +426,7 @@
|
||||
|
||||
|
||||
$("idProcessTX").checked=(localStorage["idConsoleProcessTX"]==="true");
|
||||
$("idProcessWEB").checked=(localStorage["idConsoleProcessWEB"]==="true");
|
||||
if(localStorage["idConsolePeriodRun"])
|
||||
$("idPeriodRun").value=localStorage["idConsolePeriodRun"];
|
||||
}
|
||||
@ -437,6 +442,8 @@
|
||||
//localStorage["idConsoleSendAll"]=$("idSendAll").checked;
|
||||
|
||||
localStorage["idConsoleProcessTX"]=$("idProcessTX").checked;
|
||||
localStorage["idConsoleProcessWEB"]=$("idProcessWEB").checked;
|
||||
|
||||
localStorage["idConsolePeriodRun"]=$("idPeriodRun").value;
|
||||
}
|
||||
|
||||
@ -498,6 +505,7 @@
|
||||
<INPUT type="button" onclick="StartSendServerPeriod()" class="bt btdoit" id="idBtRun2" value="Run every">
|
||||
<INPUT type="number" id="idPeriodRun" style="width: 50px;" onchange="SaveValues();" value="1">sec
|
||||
TX process:<INPUT type="checkbox" id="idProcessTX">
|
||||
WEB process:<INPUT type="checkbox" id="idProcessWEB">
|
||||
|
||||
|
||||
<BR>
|
||||
|
@ -528,7 +528,8 @@
|
||||
|
||||
function InstallApp()
|
||||
{
|
||||
CreateNewAccount(0);
|
||||
|
||||
CreateNewAccount(BASE_ACCOUNT.Currency);
|
||||
|
||||
if(idInstallApp)
|
||||
{
|
||||
|
@ -61,7 +61,7 @@
|
||||
{
|
||||
if(e.keyCode===27)
|
||||
{
|
||||
window.close();
|
||||
ClosePage();
|
||||
}
|
||||
};
|
||||
|
||||
@ -72,6 +72,15 @@
|
||||
|
||||
}, false);
|
||||
|
||||
if (window.addEventListener)
|
||||
{
|
||||
window.addEventListener("message", OnMessage);
|
||||
} else
|
||||
{
|
||||
// IE8
|
||||
window.attachEvent("onmessage", OnMessage);
|
||||
}
|
||||
|
||||
}
|
||||
function OnChangeAccount()
|
||||
{
|
||||
@ -128,12 +137,6 @@
|
||||
function ViewBegin()
|
||||
{
|
||||
ViewHistory(1);
|
||||
// CurPage=0;
|
||||
// var Item=ArrPos[CurPage];
|
||||
// if(Item)
|
||||
// {
|
||||
// ViewHistory(0,Item.First);
|
||||
// }
|
||||
}
|
||||
function ViewPrev()
|
||||
{
|
||||
@ -192,14 +195,66 @@
|
||||
return "";
|
||||
return Str;
|
||||
}
|
||||
|
||||
|
||||
var FrameData;
|
||||
function ClosePage()
|
||||
{
|
||||
if(FrameData && window.parent)
|
||||
{
|
||||
FrameData.cmd="Close";
|
||||
window.parent.postMessage(FrameData, "*");
|
||||
}
|
||||
else
|
||||
window.close();
|
||||
}
|
||||
|
||||
function OnMessage(event)
|
||||
{
|
||||
var Data=event.data;
|
||||
if(!Data || typeof Data!=="object")
|
||||
return;
|
||||
|
||||
FrameData=Data;
|
||||
if(Data.Account)
|
||||
{
|
||||
AccountID=Data.Account;
|
||||
document.getElementById("idViewAccountID").value=AccountID;
|
||||
ViewHistory(1)
|
||||
|
||||
$("MTabWelcome").className+=" back-link";
|
||||
}
|
||||
}
|
||||
function DoBackPage()
|
||||
{
|
||||
if(FrameData)
|
||||
ClosePage()
|
||||
|
||||
}
|
||||
|
||||
function OpenBlockViewerPage(Num)
|
||||
{
|
||||
if(FrameData && window.parent)
|
||||
{
|
||||
FrameData.cmd="OpenBlockViewerPage";
|
||||
FrameData.BlockNum=Num;
|
||||
window.parent.postMessage(FrameData, "*");
|
||||
}
|
||||
else
|
||||
{
|
||||
window.open("./blockviewer.html#"+Num);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<header class="header">
|
||||
<div class="header__wrapper">
|
||||
<div class="header__logo header__logo--history">
|
||||
<a onclick="" class="header__logo-link" id="MTabWelcome">
|
||||
<img class="main-logo" src="/PIC/TeraLogo.svg" alt="TERA Foundation">
|
||||
<a onclick="DoBackPage()" class="header__logo-link" id="MTabWelcome">
|
||||
<img class="main-logo" src="./PIC/TeraLogo.svg" alt="TERA Foundation">
|
||||
<p class="header__logo-name">History</p>
|
||||
</a>
|
||||
</div>
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
<html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>TERA</title>
|
||||
@ -320,6 +319,7 @@
|
||||
|
||||
|
||||
<script>
|
||||
|
||||
//Pagination
|
||||
var CountViewRows=20;
|
||||
var DefAccounts={BlockName:"idPaginationAccount", NumName:"idViewAccountNum", TabName:"grid_accounts_all",APIName:"GetAccountList",Param3:"",FilterName:"idViewAccountFilter",TotalSum:"idTotalSum"};
|
||||
@ -391,6 +391,7 @@
|
||||
|
||||
|
||||
<script>
|
||||
|
||||
/*Get data from server Get data from server Get data from server Get data from server Get data from server */
|
||||
function UpdatesConfigData()
|
||||
{
|
||||
@ -642,6 +643,8 @@
|
||||
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
//LIB
|
||||
function ConfirmationFromBlock(BlockNum)
|
||||
{
|
||||
@ -1123,6 +1126,7 @@
|
||||
if(CurBlockNum<ServerBlockNumDB+8)
|
||||
CurBlockNum=ServerBlockNumDB;
|
||||
|
||||
|
||||
var WasArr=0;
|
||||
var Arr=[];
|
||||
for(var i=ArrInfo.length-1;i>=0;i--)
|
||||
@ -1141,6 +1145,7 @@
|
||||
{
|
||||
if(!Item.PowerArr[n])//есть нули
|
||||
{
|
||||
//ToLog("n="+n+" Item.BlockNum1="+Item.BlockNum1);
|
||||
MustUpdate=1;
|
||||
break;
|
||||
}
|
||||
@ -1150,7 +1155,6 @@
|
||||
var DeltaTime=Math.abs(Item.TimeBlockNum-TimeBlockNum);
|
||||
if(DeltaTime>Item.Delta/20)
|
||||
{
|
||||
//ToLog("i="+i+" DeltaTime="+DeltaTime+" > "+(Item.Delta/20))
|
||||
MustUpdate=1;
|
||||
}
|
||||
}
|
||||
@ -1307,12 +1311,15 @@
|
||||
|
||||
</script>
|
||||
<style type="text/css">
|
||||
table.password {
|
||||
|
||||
table.password
|
||||
{
|
||||
border-collapse: collapse;
|
||||
width: 400px;
|
||||
}
|
||||
|
||||
#idOpenWallet {
|
||||
#idOpenWallet
|
||||
{
|
||||
z-index:1001;
|
||||
position:relative;
|
||||
float: right;
|
||||
@ -1335,8 +1342,8 @@
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#idBlockPasswordSet,
|
||||
#idBlockPasswordGet {
|
||||
#idBlockPasswordSet,#idBlockPasswordGet
|
||||
{
|
||||
z-index:1000;
|
||||
position:absolute;
|
||||
top:150px;
|
||||
@ -1352,10 +1359,13 @@
|
||||
background-repeat: no-repeat;
|
||||
|
||||
}
|
||||
|
||||
|
||||
</style>
|
||||
|
||||
<style id="idHintStyle">
|
||||
th.hint:hover:after {
|
||||
th.hint:hover:after
|
||||
{
|
||||
position: absolute;
|
||||
content: attr(data-name);
|
||||
background: #f7efa3;
|
||||
@ -1372,7 +1382,8 @@
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.red {
|
||||
.red
|
||||
{
|
||||
color:red;
|
||||
}
|
||||
</style>
|
||||
@ -1384,18 +1395,10 @@
|
||||
|
||||
<table id="TabHeader">
|
||||
<tr>
|
||||
<th>
|
||||
<DIV id="MTabAccounts" onclick="SelectTab('TabAccounts')" class="bttab">配置</DIV>
|
||||
</th>
|
||||
<th>
|
||||
<DIV id="MTabSend" onclick="SelectTab('TabSend')" class="bttab">发送</DIV>
|
||||
</th>
|
||||
<th>
|
||||
<DIV id="MTabDapps" onclick="SelectTab('TabDapps')" class="bttab">分布式应用</DIV>
|
||||
</th>
|
||||
<th>
|
||||
<DIV id="MTabExplorer" onclick="SelectTab('TabExplorer')" class="bttab">浏览器</DIV>
|
||||
</th>
|
||||
<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>
|
||||
|
||||
@ -1409,21 +1412,22 @@
|
||||
<DIV id="idNodeUpdateMiningStatus" style="display: block">
|
||||
<DIV style="float: left">
|
||||
<input type="checkbox" class="checkbox" id="idAutoUpdate" onchange = "UseAutoUpdate()"/>
|
||||
<label for="idAutoUpdate">AutoUpdate</label>
|
||||
<label for="idAutoUpdate">Autoupdate</label>
|
||||
</DIV>
|
||||
<DIV style="float: left">
|
||||
<input type="checkbox" class="checkbox" id="idUseMining" onchange = "UseMining()"/>
|
||||
<label for="idUseMining">UseMining</label>
|
||||
<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; 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">
|
||||
<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">
|
||||
@ -1456,7 +1460,6 @@
|
||||
</DIV>
|
||||
<canvas width='800' height='30' id='idBlockInfo'></canvas>
|
||||
<BR><BR>
|
||||
<DIV style="float: left;" id="idStatusMining"></DIV>
|
||||
<DIV style="float: left; font-family: monospace">
|
||||
Block:<B id="idCurBlockNum"></B>
|
||||
DB delta:<B id="idDeltaDB" style="min-width: 30px"></B>
|
||||
@ -1466,30 +1469,32 @@
|
||||
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>
|
||||
<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">
|
||||
DataPath: <B id="idDataPath"></B><BR>
|
||||
PubKey: <B id="idPubKey"></B><BR>
|
||||
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="NewWallet" id="idDown2">
|
||||
<INPUT type="button" onclick="MoveUp($('edit_keys'));EditPrivateKey();SetImg(this,'edit_keys');" class="btdoit bt" value="EditWallet" id="idDown">
|
||||
<INPUT type="button" onclick="MoveUp($('idAccountEdit'));ViewNewAccount();SetImg(this,'idAccountEdit');" class="btdoit bt" value="NewAccount" id="idDown">
|
||||
<INPUT type="button" onclick="MoveUp($('edit_mining_set'));MiningSets();SetImg(this,'edit_mining_set');" class="btdoit bt" value="MiningSet" id="idDown">
|
||||
<INPUT type="button" onclick="ViewSetPassword();itemBtPassword=this; SetImg(itemBtPassword,'idBlockPasswordSet');" class="bt btdoit" value="SetPassword" id="idDown">
|
||||
|
||||
|
||||
<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>
|
||||
<td><DIV>Mining account:</DIV></td><td><INPUT type="number" id="idMiningAccount" min=0 max=1000000000000 value="0"></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
@ -1509,8 +1514,7 @@
|
||||
<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>
|
||||
</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>
|
||||
@ -1531,9 +1535,7 @@
|
||||
<DIV id="idAccountEdit" style="display: none">
|
||||
<table class="form_input keys" id="grid_edit_newacc">
|
||||
<tr>
|
||||
<td>
|
||||
<DIV>Public name:</DIV>
|
||||
</td>
|
||||
<td><DIV>Public name:</DIV></td>
|
||||
<td>
|
||||
<INPUT type="string" maxlength="40" autocomplete="off" id="idAccountName" onkeyup="CheckLengthAccDesription('idAccountName',40)" value="">
|
||||
</td>
|
||||
@ -1546,16 +1548,12 @@
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<DIV>Currency:</DIV>
|
||||
</td>
|
||||
<td><INPUT type="number" id="idCurrency" min=0 max=1000000000 value="0">
|
||||
<DIV>Currency:</DIV></td><td><INPUT type="number" id="idCurrency" min=0 max=1000000000 value="0">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<DIV>Smart:</DIV>
|
||||
</td>
|
||||
<td><INPUT type="number" id="idSmart" min=0 max=1000000000 value="0">
|
||||
<DIV>Smart:</DIV></td><td><INPUT type="number" id="idSmart" min=0 max=1000000000 value="0">
|
||||
</td>
|
||||
</tr>
|
||||
<!--<tr>-->
|
||||
@ -1564,9 +1562,7 @@
|
||||
|
||||
<tr id="idRowWN" style="display: none">
|
||||
<td>
|
||||
<DIV>Wallet number:</DIV>
|
||||
</td>
|
||||
<td><INPUT type="number" id="idWN" min=0 max=100 value="0">
|
||||
<DIV>Wallet number:</DIV></td><td><INPUT type="number" id="idWN" min=0 max=100 value="0">
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@ -1591,11 +1587,9 @@
|
||||
<th id="CurrencyNameItem(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="(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="(RetChangeSmart(Item))" data-name="Smart contract (DApp)" class="smart hint">Smart</th>
|
||||
<th id="Item.WN" class="num" style="width: 30px;"></th>
|
||||
</tr>
|
||||
</table>
|
||||
@ -1654,6 +1648,8 @@
|
||||
<HR>
|
||||
</DIV>
|
||||
</DIV>
|
||||
|
||||
|
||||
Style:
|
||||
<select size="1" id="idSelStyle" onkeyup="SelectStyle();SaveValues()" onchange="SelectStyle();SaveValues()">
|
||||
<option value="styleBrown">Brown</option>
|
||||
@ -1665,24 +1661,27 @@
|
||||
<option value="styleContrast2">Contrast 2</option>
|
||||
<option value="styleContrast3">Contrast 3</option>
|
||||
</select>
|
||||
此版本由 MiaoWoo 使用 TypeScript 重构<BR>
|
||||
|
||||
|
||||
|
||||
</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> </td>
|
||||
<td>
|
||||
<DIV id="idNameTo" class="smallbold"></DIV>
|
||||
</td>
|
||||
</tr>
|
||||
<tr><td> </td><td><DIV id="idNameTo" class="smallbold"></DIV></td></tr>
|
||||
<tr>
|
||||
<td>Pay to</td>
|
||||
<td>
|
||||
@ -1698,12 +1697,8 @@
|
||||
</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>
|
||||
<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>
|
||||
@ -1828,18 +1823,14 @@
|
||||
<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="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="(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="(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>-->
|
||||
@ -1869,25 +1860,15 @@
|
||||
<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="(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.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="(RetHistoryAccount(Item,'Miner')+'<BR><b>'+Item.MinerName)+'</b>'" class="num">Miner</th>
|
||||
|
||||
|
||||
<!--<th id="GetHexFromArr(Item.Hash1)" class="hash">Hash1</th>-->
|
||||
@ -1925,20 +1906,13 @@
|
||||
<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="(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="(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>
|
||||
<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="<< Prev">
|
||||
@ -1958,22 +1932,14 @@
|
||||
<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>
|
||||
<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="<< Prev">
|
||||
@ -1984,8 +1950,7 @@
|
||||
<HR>
|
||||
<DIV id="view_header" >UTILITES<BR></DIV>
|
||||
|
||||
Number of blocks in
|
||||
depth:<INPUT type="number" id="idBlockCount" onchange = "SaveValues()" value="0"><BR>
|
||||
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">
|
||||
@ -2012,38 +1977,24 @@
|
||||
|
||||
|
||||
<BR>
|
||||
<DIV id="idServerBlock"
|
||||
style="width: 99.5%">
|
||||
<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">
|
||||
<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>
|
||||
<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>
|
||||
<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>
|
||||
<td><DIV>Repeat:</DIV></td><td><INPUT type="password" autocomplete="WalletPassword" id="idPassword2" onkeyup="" value=""></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
@ -2054,24 +2005,14 @@
|
||||
|
||||
</table>
|
||||
</FORM>
|
||||
<FORM id="idBlockPasswordGet"
|
||||
style="display: none">
|
||||
<H3 align="center">Enter your
|
||||
password:
|
||||
</H3>
|
||||
<table class="password"
|
||||
id="idTablePassword2">
|
||||
<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>
|
||||
<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>
|
||||
<td><DIV>Password:</DIV></td><td><INPUT type="password" autocomplete="WalletPassword" id="idPasswordGet" value=""></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
@ -2083,33 +2024,24 @@
|
||||
|
||||
|
||||
|
||||
<DIV id="idBlockOnSend"
|
||||
style="display: none">
|
||||
<DIV id="idBlockOnSend" style="display: none">
|
||||
<DIV align="center">
|
||||
Send
|
||||
<B id="idOnSendText"></B><BR>
|
||||
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 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 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 style="visibility: hidden;" controls="controls" id="sound_err">
|
||||
<source src="click.mp3" type="audio/mpeg"/>
|
||||
</audio>
|
||||
|
||||
|
||||
@ -2117,7 +2049,6 @@
|
||||
|
||||
</DIV>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
<DIV id="idStableScroll" align='center'>
|
||||
@ -2129,3 +2060,4 @@
|
||||
<A href="https://jq.qq.com/?_wv=1027&k=5KpN5fw">QQ</A>
|
||||
<!--progr76@gmail.com-->
|
||||
</DIV>
|
||||
|
||||
|
@ -22,7 +22,7 @@
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<header class="header">
|
||||
<header id="idMainHeader" class="header">
|
||||
<div class="header__wrapper">
|
||||
<div class="header__logo">
|
||||
<a onclick="SelectTab('TabWelcome')" class="header__logo-link" id="MTabWelcome">
|
||||
@ -54,7 +54,7 @@
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<main id="idMain">
|
||||
<section id="TabWelcome" class="welcome" >
|
||||
<div class="welcome__img">
|
||||
<svg class="" xmlns="http://www.w3.org/2000/svg" fill="#445368" viewBox="0 0 992.13 992.13" width="150" height="150">
|
||||
@ -211,8 +211,8 @@
|
||||
<div class="prod-card__first-line">
|
||||
<span class="hidden id-sign">ID: </span>
|
||||
<a target='_blank' class="prod-card__id prod-card__id--mobile">{Item.Num}</a>
|
||||
<a href="./history.html#{Item.Num}" target='_blank' class="prod-card__id prod-card__id--mobile-active">{Item.Num}</a>
|
||||
<a href="./history.html#{Item.Num}" target='_blank' class="prod-card__id prod-card__id--desktop">{Item.Num}</a>
|
||||
<a onclick="OpenHistoryPage({Item.Num})" class="prod-card__id prod-card__id--mobile-active pointer">{Item.Num}</a>
|
||||
<a onclick="OpenHistoryPage({Item.Num})" target='_blank' class="prod-card__id prod-card__id--desktop pointer">{Item.Num}</a>
|
||||
<div class="prod-card__heading">
|
||||
<span class="prod-card__coins-count">{Value.SumCOIN}<sup>,{Value.SumCENT}</sup><br>
|
||||
<span class="light-grey-text small-text mob-hidden">{Value.CurrencyName}</span>
|
||||
@ -318,6 +318,7 @@
|
||||
</div>
|
||||
|
||||
<div class="send-page__send-btn-wrp">
|
||||
<!--<button class="btn btn--full-width btn--450" onclick="ClearSend()" id="idClearButton">Clear</button>-->
|
||||
<button class="btn btn--full-width btn--450 send-page__send-btn" onclick="SendMobileBefore()" id="idSendButton">Send</button>
|
||||
</div>
|
||||
</div>
|
||||
@ -630,9 +631,7 @@
|
||||
<a class="password-modal__link pointer" id="idEntrance" onclick="MyOpenWallet(0)">Entrance to sub-wallet</a>
|
||||
</form>
|
||||
</section>
|
||||
<footer>
|
||||
|
||||
</footer>
|
||||
|
||||
<div class="fixed-status">
|
||||
<div class="fixed-status__wrap">
|
||||
@ -654,12 +653,13 @@
|
||||
|
||||
<DIV align='center'>
|
||||
<DIV align='left' style="display: none;">
|
||||
|
||||
<INPUT id="idCurTabName" value="TabInfo" style="display: none">
|
||||
</DIV>
|
||||
|
||||
</DIV>
|
||||
|
||||
<iframe id="idHistoryPage" name="HistoryPage" style="display: none" src="./history.html"></iframe>
|
||||
<iframe id="idBlockViewerPage" name="BlockViewerPage" style="display: none" src="./blockviewer.html"></iframe>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user