32
src/HTML/JS/client-electron.js
Normal file
32
src/HTML/JS/client-electron.js
Normal file
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* @project: TERA
|
||||
* @version: Development (beta)
|
||||
* @license: MIT (not for evil)
|
||||
* @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com]
|
||||
* Web: https://terafoundation.org
|
||||
* Twitter: https://twitter.com/terafoundation
|
||||
* Telegram: https://t.me/terafoundation
|
||||
*/
|
||||
|
||||
const ipcRenderer = require('electron').ipcRenderer;
|
||||
|
||||
function GetDataElectron(Method,ObjPost,Func)
|
||||
{
|
||||
if(Func === undefined)
|
||||
{
|
||||
Func = ObjPost;
|
||||
ObjPost = null;
|
||||
}
|
||||
var reply;
|
||||
try
|
||||
{
|
||||
reply = ipcRenderer.sendSync('GetData', {path:Method, obj:ObjPost});
|
||||
}
|
||||
catch(e)
|
||||
{
|
||||
reply = undefined;
|
||||
}
|
||||
if(Func)
|
||||
Func(reply);
|
||||
};
|
||||
window.GetData = GetDataElectron;
|
||||
1937
src/HTML/JS/client.js
Normal file
1937
src/HTML/JS/client.js
Normal file
File diff suppressed because it is too large
Load Diff
112
src/HTML/JS/coinlib.js
Normal file
112
src/HTML/JS/coinlib.js
Normal file
@@ -0,0 +1,112 @@
|
||||
/*
|
||||
* @project: TERA
|
||||
* @version: Development (beta)
|
||||
* @license: MIT (not for evil)
|
||||
* @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com]
|
||||
* Web: https://terafoundation.org
|
||||
* Twitter: https://twitter.com/terafoundation
|
||||
* Telegram: https://t.me/terafoundation
|
||||
*/
|
||||
|
||||
var MAX_SUM_TER = 1e9;
|
||||
var MAX_SUM_CENT = 1e9;
|
||||
|
||||
function ADD(Coin,Value2)
|
||||
{
|
||||
Coin.SumCOIN += Value2.SumCOIN;
|
||||
Coin.SumCENT += Value2.SumCENT;
|
||||
if(Coin.SumCENT >= MAX_SUM_CENT)
|
||||
{
|
||||
Coin.SumCENT -= MAX_SUM_CENT;
|
||||
Coin.SumCOIN++;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
function SUB(Coin,Value2)
|
||||
{
|
||||
Coin.SumCOIN -= Value2.SumCOIN;
|
||||
if(Coin.SumCENT >= Value2.SumCENT)
|
||||
{
|
||||
Coin.SumCENT -= Value2.SumCENT;
|
||||
}
|
||||
else
|
||||
{
|
||||
Coin.SumCENT = MAX_SUM_CENT + Coin.SumCENT - Value2.SumCENT;
|
||||
Coin.SumCOIN--;
|
||||
}
|
||||
if(Coin.SumCOIN < 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
Coin.SumCENT -= MAX_SUM_CENT;
|
||||
Coin.SumCOIN++;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
function FLOAT_FROM_COIN(Coin)
|
||||
{
|
||||
var Sum = Coin.SumCOIN + Coin.SumCENT / MAX_SUM_CENT;
|
||||
return Sum;
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
var SumCOIN = Math.floor(Sum);
|
||||
var SumCENT = Math.floor(Sum * MAX_SUM_CENT - SumCOIN * MAX_SUM_CENT);
|
||||
var Coin = {SumCOIN:SumCOIN, SumCENT:SumCENT};
|
||||
return Coin;
|
||||
};
|
||||
if(typeof window === "object")
|
||||
window.COIN_FROM_FLOAT = COIN_FROM_FLOAT2;
|
||||
|
||||
function ISZERO(Coin)
|
||||
{
|
||||
if(Coin.SumCOIN === 0 && Coin.SumCENT === 0)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
};
|
||||
|
||||
function COIN_FROM_STRING(Str)
|
||||
{
|
||||
throw "TODO: COIN_FROM_STRING";
|
||||
};
|
||||
if(typeof global === "object")
|
||||
{
|
||||
global.ADD = ADD;
|
||||
global.SUB = SUB;
|
||||
global.DIV = DIV;
|
||||
global.ISZERO = ISZERO;
|
||||
global.FLOAT_FROM_COIN = FLOAT_FROM_COIN;
|
||||
global.COIN_FROM_FLOAT = COIN_FROM_FLOAT;
|
||||
global.COIN_FROM_STRING = COIN_FROM_STRING;
|
||||
}
|
||||
372
src/HTML/JS/crypto-client.js
Normal file
372
src/HTML/JS/crypto-client.js
Normal file
@@ -0,0 +1,372 @@
|
||||
/*
|
||||
* @project: TERA
|
||||
* @version: Development (beta)
|
||||
* @license: MIT (not for evil)
|
||||
* @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com]
|
||||
* Web: https://terafoundation.org
|
||||
* Twitter: https://twitter.com/terafoundation
|
||||
* Telegram: https://t.me/terafoundation
|
||||
*/
|
||||
|
||||
var MAX_SUPER_VALUE_POW = (1 << 30) * 2;
|
||||
window.TYPE_TRANSACTION_CREATE = 100;
|
||||
|
||||
function GetHashWithValues(hash0,value1,value2,bNotCopy)
|
||||
{
|
||||
var hash;
|
||||
if(bNotCopy)
|
||||
hash = hash0;
|
||||
else
|
||||
hash = hash0.slice();
|
||||
hash[0] = value1 & 0xFF;
|
||||
hash[1] = (value1 >>> 8) & 0xFF;
|
||||
hash[2] = (value1 >>> 16) & 0xFF;
|
||||
hash[3] = (value1 >>> 24) & 0xFF;
|
||||
hash[4] = value2 & 0xFF;
|
||||
hash[5] = (value2 >>> 8) & 0xFF;
|
||||
hash[6] = (value2 >>> 16) & 0xFF;
|
||||
hash[7] = (value2 >>> 24) & 0xFF;
|
||||
var arrhash = shaarr(hash);
|
||||
return arrhash;
|
||||
};
|
||||
|
||||
function GetPowPower(arrhash)
|
||||
{
|
||||
var SumBit = 0;
|
||||
for(var i = 0; i < arrhash.length; i++)
|
||||
{
|
||||
var byte = arrhash[i];
|
||||
for(var b = 7; b >= 0; b--)
|
||||
{
|
||||
if((byte >> b) & 1)
|
||||
{
|
||||
return SumBit;
|
||||
}
|
||||
else
|
||||
{
|
||||
SumBit++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return SumBit;
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
var arr = [];
|
||||
for(var i = 0; i < arr0.length; i++)
|
||||
arr[i] = arr0[i];
|
||||
if(!startnone)
|
||||
startnone = 0;
|
||||
var maxnonce = 0;
|
||||
var supervalue = MAX_SUPER_VALUE_POW;
|
||||
for(var nonce = startnone; nonce <= startnone + count; nonce++)
|
||||
{
|
||||
var arrhash = GetHashWithValues(arr, nonce, BlockNum, true);
|
||||
var value = GetPowValue(arrhash);
|
||||
if(value < supervalue)
|
||||
{
|
||||
maxnonce = nonce;
|
||||
supervalue = value;
|
||||
}
|
||||
}
|
||||
return maxnonce;
|
||||
};
|
||||
window.TR_TICKET_HASH_LENGTH = 10;
|
||||
|
||||
function CreateHashBody(body,Num,Nonce)
|
||||
{
|
||||
var length = body.length - 12;
|
||||
body[length + 0] = Num & 0xFF;
|
||||
body[length + 1] = (Num >>> 8) & 0xFF;
|
||||
body[length + 2] = (Num >>> 16) & 0xFF;
|
||||
body[length + 3] = (Num >>> 24) & 0xFF;
|
||||
body[length + 4] = 0;
|
||||
body[length + 5] = 0;
|
||||
length = body.length - 6;
|
||||
body[length + 0] = Nonce & 0xFF;
|
||||
body[length + 1] = (Nonce >>> 8) & 0xFF;
|
||||
body[length + 2] = (Nonce >>> 16) & 0xFF;
|
||||
body[length + 3] = (Nonce >>> 24) & 0xFF;
|
||||
body[length + 4] = 0;
|
||||
body[length + 5] = 0;
|
||||
var HASH = sha3(body);
|
||||
var FullHashTicket = [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 < TR_TICKET_HASH_LENGTH; i++)
|
||||
FullHashTicket[i] = HASH[i];
|
||||
WriteUintToArrOnPos(FullHashTicket, Num, TR_TICKET_HASH_LENGTH);
|
||||
return sha3(FullHashTicket);
|
||||
};
|
||||
window.DELTA_POWER_POW_TR = 0;
|
||||
window.DELTA_FOR_TIME_TX = 0;
|
||||
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)
|
||||
{
|
||||
var DeltaServerClient = new Date() - Data.CurTime;
|
||||
if(!Data.DELTA_CURRENT_TIME)
|
||||
Data.DELTA_CURRENT_TIME = 0;
|
||||
window.DELTA_CURRENT_TIME2 = Data.DELTA_CURRENT_TIME - DeltaServerClient;
|
||||
window.MIN_POWER_POW_TR = DELTA_POWER_POW_TR + Data.MIN_POWER_POW_TR;
|
||||
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 ()
|
||||
{
|
||||
var CurrentTime = Date.now() + DELTA_CURRENT_TIME2;
|
||||
var CurTimeNum = CurrentTime - FIRST_TIME_BLOCK;
|
||||
var StartBlockNum = Math.floor((CurTimeNum + CONSENSUS_PERIOD_TIME) / CONSENSUS_PERIOD_TIME);
|
||||
return StartBlockNum;
|
||||
};
|
||||
window.NWMODE = Data.NWMODE;
|
||||
};
|
||||
window.GetCurrentBlockNumByTime = function ()
|
||||
{
|
||||
return 0;
|
||||
};
|
||||
|
||||
function GetBlockNumTr(arr)
|
||||
{
|
||||
var BlockNum = window.DELTA_FOR_TIME_TX + GetCurrentBlockNumByTime();
|
||||
if(arr[0] === TYPE_TRANSACTION_CREATE)
|
||||
{
|
||||
var BlockNum2 = Math.floor(BlockNum / 10) * 10;
|
||||
if(BlockNum2 < BlockNum)
|
||||
BlockNum2 = BlockNum2 + 10;
|
||||
BlockNum = BlockNum2;
|
||||
}
|
||||
return BlockNum;
|
||||
};
|
||||
var LastCreatePOWTrType = 0;
|
||||
var LastCreatePOWBlockNum = 0;
|
||||
var LastCreatePOWHash = [255, 255, 255, 255];
|
||||
|
||||
function CreateHashBodyPOWInnerMinPower(arr,MinPow,startnonce)
|
||||
{
|
||||
var TrType = arr[0];
|
||||
var BlockNum = GetBlockNumTr(arr);
|
||||
if(MinPow === undefined)
|
||||
{
|
||||
MinPow = MIN_POWER_POW_TR + Math.log2(arr.length / 128);
|
||||
}
|
||||
var nonce = startnonce;
|
||||
while(1)
|
||||
{
|
||||
var arrhash = CreateHashBody(arr, BlockNum, nonce);
|
||||
var power = GetPowPower(arrhash);
|
||||
if(power >= MinPow)
|
||||
{
|
||||
if(LastCreatePOWBlockNum === BlockNum && LastCreatePOWTrType === TrType && CompareArr(LastCreatePOWHash, arrhash) > 0)
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
LastCreatePOWBlockNum = BlockNum;
|
||||
LastCreatePOWTrType = TrType;
|
||||
LastCreatePOWHash = arrhash;
|
||||
return nonce;
|
||||
}
|
||||
}
|
||||
nonce++;
|
||||
if(nonce % 2000 === 0)
|
||||
{
|
||||
BlockNum = GetBlockNumTr(arr);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function CalcHashFromArray(ArrHashes,bOriginalSeq)
|
||||
{
|
||||
if(bOriginalSeq === undefined)
|
||||
ArrHashes.sort(CompareArr);
|
||||
var Buf = [];
|
||||
for(var i = 0; i < ArrHashes.length; i++)
|
||||
{
|
||||
var Value = ArrHashes[i];
|
||||
for(var n = 0; n < Value.length; n++)
|
||||
Buf.push(Value[n]);
|
||||
}
|
||||
if(Buf.length === 0)
|
||||
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];
|
||||
else
|
||||
if(Buf.length === 32)
|
||||
return Buf;
|
||||
var Hash = shaarr(Buf);
|
||||
return Hash;
|
||||
};
|
||||
|
||||
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;
|
||||
arr[2] = (Num >>> 16) & 0xFF;
|
||||
arr[3] = (Num >>> 24) & 0xFF;
|
||||
var NumH = Math.floor(Num / 4294967296);
|
||||
arr[4] = NumH & 0xFF;
|
||||
arr[5] = (NumH >>> 8) & 0xFF;
|
||||
return arr;
|
||||
};
|
||||
|
||||
function LoadLib(Path)
|
||||
{
|
||||
var item = document.createElement('script');
|
||||
item.type = "text/javascript";
|
||||
item.src = Path;
|
||||
document.getElementsByTagName('head')[0].appendChild(item);
|
||||
};
|
||||
|
||||
function IsMS()
|
||||
{
|
||||
var ua = window.navigator.userAgent;
|
||||
var msie = ua.indexOf("MSIE ");
|
||||
if(msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
function LoadSignLib()
|
||||
{
|
||||
if(window.SignLib)
|
||||
return ;
|
||||
LoadLib("./JS/sign-lib-min.js");
|
||||
};
|
||||
|
||||
function ComputeSecretWithCheck(PubKey,StrPrivKey,F)
|
||||
{
|
||||
if(!window.SignLib)
|
||||
{
|
||||
SetError("Error - SignLib not installed");
|
||||
return ;
|
||||
}
|
||||
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)
|
||||
{
|
||||
SetError("Error PubKey");
|
||||
return ;
|
||||
}
|
||||
PubKey = Buffer.from(GetArrFromHex(PubKey));
|
||||
}
|
||||
var Result = SignLib.ecdh(PubKey, PrivKey);
|
||||
F(sha3(Result));
|
||||
};
|
||||
|
||||
function ComputeSecret(Account,PubKey,F)
|
||||
{
|
||||
if(GetPrivKey())
|
||||
{
|
||||
ComputeSecretWithCheck(PubKey, GetPrivKey(), F);
|
||||
}
|
||||
else
|
||||
{
|
||||
GetData("GetWalletInfo", {Account:Account}, function (Data)
|
||||
{
|
||||
if(!Data || !Data.result)
|
||||
return ;
|
||||
ComputeSecretWithCheck(PubKey, Data.PrivateKey, F);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
if(!ArrSecret)
|
||||
return "".padEnd(Arr.length / 2, ".");
|
||||
if(typeof Arr === "string")
|
||||
Arr = GetArrFromHex(Arr);
|
||||
var arrRnd = sha3arr2(ArrSecret, sha3(StrName + StartEncrypt));
|
||||
var Arr2 = DoSecret(Arr, arrRnd);
|
||||
var Str = Utf8ArrayToStr(Arr2);
|
||||
return Str;
|
||||
};
|
||||
|
||||
function DoSecret(Arr,arrRnd)
|
||||
{
|
||||
var Arr2 = [];
|
||||
var CryptID = 0;
|
||||
var Pos = 0;
|
||||
while(Pos < Arr.length)
|
||||
{
|
||||
CryptID++;
|
||||
WriteUintToArrOnPos(arrRnd, CryptID, 0);
|
||||
var CurBuf = sha3(arrRnd);
|
||||
for(var i = 0; i < 32 && Pos < Arr.length; i++, Pos++)
|
||||
{
|
||||
Arr2[Pos] = Arr[Pos] ^ CurBuf[i];
|
||||
}
|
||||
}
|
||||
return Arr2;
|
||||
};
|
||||
var glEncryptInit = 0;
|
||||
|
||||
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)
|
||||
{
|
||||
var Value = $(id).value;
|
||||
Value = Value.padEnd(Value.length + random(5), " ");
|
||||
return GetHexFromArr(Encrypt(ArrSecret, StartEncrypt, id, Value));
|
||||
};
|
||||
|
||||
function EncryptFields(ArrSecret,Params,ArrName)
|
||||
{
|
||||
if(!Params.Crypto)
|
||||
Params.Crypto = EncryptInit();
|
||||
for(var i = 0; i < ArrName.length; i++)
|
||||
{
|
||||
var Name = ArrName[i];
|
||||
var Value = Params[Name];
|
||||
Value = Value.padEnd(Value.length + random(5), " ");
|
||||
Params[Name] = GetHexFromArr(Encrypt(ArrSecret, Params.Crypto, Name, Value));
|
||||
}
|
||||
};
|
||||
|
||||
function DecryptFields(ArrSecret,Params,ArrName)
|
||||
{
|
||||
for(var i = 0; i < ArrName.length; i++)
|
||||
{
|
||||
var Name = ArrName[i];
|
||||
if(Params[Name])
|
||||
{
|
||||
Params[Name] = Decrypt(ArrSecret, Params.Crypto, Name, GetArrFromHex(Params[Name]));
|
||||
}
|
||||
else
|
||||
{
|
||||
Params[Name] = "";
|
||||
}
|
||||
}
|
||||
};
|
||||
521
src/HTML/JS/dapp-inner.js
Normal file
521
src/HTML/JS/dapp-inner.js
Normal file
@@ -0,0 +1,521 @@
|
||||
/*
|
||||
* @project: TERA
|
||||
* @version: Development (beta)
|
||||
* @license: MIT (not for evil)
|
||||
* @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com]
|
||||
* Web: https://terafoundation.org
|
||||
* Twitter: https://twitter.com/terafoundation
|
||||
* Telegram: https://t.me/terafoundation
|
||||
*/
|
||||
|
||||
|
||||
function SendPay(Data)
|
||||
{
|
||||
Data.cmd = "pay";
|
||||
SendData(Data);
|
||||
};
|
||||
|
||||
function SetStorage(Key,Value)
|
||||
{
|
||||
var Data = {cmd:"setstorage", Key:Key, Value:Value};
|
||||
SendData(Data);
|
||||
};
|
||||
|
||||
function GetStorage(Key,F)
|
||||
{
|
||||
var Data = {cmd:"getstorage", Key:Key};
|
||||
SendData(Data, F);
|
||||
};
|
||||
|
||||
function SetCommon(Key,Value)
|
||||
{
|
||||
var Data = {cmd:"setcommon", Key:Key, Value:Value};
|
||||
SendData(Data);
|
||||
};
|
||||
|
||||
function GetCommon(Key,F)
|
||||
{
|
||||
var Data = {cmd:"getcommon", Key:Key};
|
||||
SendData(Data, F);
|
||||
};
|
||||
|
||||
function GetInfo(F,bUseCache)
|
||||
{
|
||||
var Data = {cmd:"DappInfo", AllAccounts:ALL_ACCOUNTS, AllData:!bUseCache};
|
||||
SendData(Data, 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)
|
||||
{
|
||||
SetError("Pls, open wallet");
|
||||
return 0;
|
||||
}
|
||||
var Data = {cmd:"DappSendCall", MethodName:MethodName, Params:Params, Account:Account, FromNum:FromNum};
|
||||
SendData(Data);
|
||||
return 1;
|
||||
};
|
||||
|
||||
function GetWalletAccounts(F)
|
||||
{
|
||||
var Data = {cmd:"DappWalletList"};
|
||||
SendData(Data, F);
|
||||
};
|
||||
|
||||
function GetAccountList(Params,F)
|
||||
{
|
||||
var Data = {cmd:"DappAccountList", Params:Params};
|
||||
SendData(Data, F);
|
||||
};
|
||||
|
||||
function GetSmartList(Params,F)
|
||||
{
|
||||
var Data = {cmd:"DappSmartList", Params:Params};
|
||||
SendData(Data, F);
|
||||
};
|
||||
|
||||
function GetBlockList(Params,F)
|
||||
{
|
||||
var Data = {cmd:"DappBlockList", Params:Params};
|
||||
SendData(Data, F);
|
||||
};
|
||||
|
||||
function GetTransactionList(Params,F)
|
||||
{
|
||||
var Data = {cmd:"DappTransactionList", Params:Params};
|
||||
SendData(Data, F);
|
||||
};
|
||||
|
||||
function DappSmartHTMLFile(Smart,F)
|
||||
{
|
||||
var Data = {cmd:"DappSmartHTMLFile", Params:{Smart:Smart}};
|
||||
SendData(Data, F);
|
||||
};
|
||||
|
||||
function DappBlockFile(BlockNum,TrNum,F)
|
||||
{
|
||||
var Data = {cmd:"DappBlockFile", Params:{BlockNum:BlockNum, TrNum:TrNum}};
|
||||
SendData(Data, F);
|
||||
};
|
||||
|
||||
function SetStatus(Str)
|
||||
{
|
||||
SendData({cmd:"SetStatus", Message:Str});
|
||||
};
|
||||
|
||||
function SetError(Str)
|
||||
{
|
||||
SendData({cmd:"SetError", Message:Str});
|
||||
};
|
||||
|
||||
function SetLocationPath(Str)
|
||||
{
|
||||
SendData({cmd:"SetLocationHash", Message:Str});
|
||||
};
|
||||
|
||||
function CreateNewAccount(Currency)
|
||||
{
|
||||
SendData({cmd:"CreateNewAccount", Currency:Currency});
|
||||
};
|
||||
|
||||
function OpenLink(Str)
|
||||
{
|
||||
SendData({cmd:"OpenLink", Message:Str});
|
||||
};
|
||||
|
||||
function SetMobileMode()
|
||||
{
|
||||
SendData({cmd:"SetMobileMode"});
|
||||
};
|
||||
|
||||
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")
|
||||
{
|
||||
var AccNum = PubKey;
|
||||
GetAccountList({StartNum:AccNum, CountNum:1}, function (Err,Arr)
|
||||
{
|
||||
if(Err)
|
||||
{
|
||||
SetError(Err);
|
||||
}
|
||||
else
|
||||
{
|
||||
SendData({cmd:"ComputeSecret", Account:Account, PubKey:Arr[0].PubKey.data}, F);
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
SendData({cmd:"ComputeSecret", Account:Account, PubKey:PubKey}, F);
|
||||
}
|
||||
};
|
||||
|
||||
function CheckInstall()
|
||||
{
|
||||
SendData({cmd:"CheckInstall"});
|
||||
};
|
||||
|
||||
function SendTransaction(Body,TR,SumPow,F)
|
||||
{
|
||||
SetError("Cannt SEND TR: " + JSON.stringify(TR));
|
||||
};
|
||||
|
||||
function CurrencyName(Num)
|
||||
{
|
||||
var Name = MapCurrency[Num];
|
||||
if(!Name)
|
||||
{
|
||||
GetSmartList({StartNum:Num, CountNum:1, TokenGenerate:1}, function (Err,Arr)
|
||||
{
|
||||
if(Err || Arr.length === 0)
|
||||
return ;
|
||||
var Smart = Arr[0];
|
||||
Name = GetTokenName(Smart.Num, Smart.ShortName);
|
||||
MapCurrency[Smart.Num] = Name;
|
||||
});
|
||||
Name = GetTokenName(Num, "");
|
||||
}
|
||||
return Name;
|
||||
};
|
||||
var SendCountUpdate = 0;
|
||||
|
||||
function FindAllCurrency()
|
||||
{
|
||||
SendCountUpdate++;
|
||||
GetSmartList({StartNum:8, CountNum:100, TokenGenerate:1}, function (Err,Arr)
|
||||
{
|
||||
SendCountUpdate--;
|
||||
if(Err)
|
||||
return ;
|
||||
for(var i = 0; i < Arr.length; i++)
|
||||
{
|
||||
var Smart = Arr[i];
|
||||
if(!MapCurrency[Smart.Num])
|
||||
{
|
||||
var Name = GetTokenName(Smart.Num, Smart.ShortName);
|
||||
MapCurrency[Smart.Num] = Name;
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function GetFilePath(Path)
|
||||
{
|
||||
if(window.PROTOCOL_SERVER_PATH && Path.indexOf("file/"))
|
||||
{
|
||||
if(Path.substr(0, 1) !== "/")
|
||||
Path = "/" + Path;
|
||||
Path = window.PROTOCOL_SERVER_PATH + Path;
|
||||
}
|
||||
return Path;
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
return arr[i].split("=")[1];
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function GetState(AccNum,F,FErr)
|
||||
{
|
||||
SendCountUpdate++;
|
||||
GetAccountList({StartNum:AccNum, CountNum:1}, function (Err,Arr)
|
||||
{
|
||||
SendCountUpdate--;
|
||||
if(!Err && Arr.length)
|
||||
{
|
||||
var Item = Arr[0].SmartState;
|
||||
if(Item)
|
||||
{
|
||||
F(Item);
|
||||
return ;
|
||||
}
|
||||
}
|
||||
if(FErr)
|
||||
{
|
||||
FErr();
|
||||
return ;
|
||||
}
|
||||
});
|
||||
};
|
||||
var glMapF = {};
|
||||
var glKeyF = 0;
|
||||
|
||||
function SendData(Data,F)
|
||||
{
|
||||
if(!window.parent)
|
||||
return ;
|
||||
if(F)
|
||||
{
|
||||
glKeyF++;
|
||||
Data.CallID = glKeyF;
|
||||
glMapF[glKeyF] = F;
|
||||
}
|
||||
window.parent.postMessage(Data, "*");
|
||||
};
|
||||
|
||||
function OnMessage(event)
|
||||
{
|
||||
var Data = event.data;
|
||||
if(!Data || typeof Data !== "object")
|
||||
return ;
|
||||
var CallID = Data.CallID;
|
||||
var cmd = Data.cmd;
|
||||
if(CallID)
|
||||
{
|
||||
var F = glMapF[CallID];
|
||||
if(F)
|
||||
{
|
||||
delete Data.CallID;
|
||||
delete Data.cmd;
|
||||
switch(cmd)
|
||||
{
|
||||
case "getstorage":
|
||||
case "getcommon":
|
||||
F(Data.Key, Data.Value);
|
||||
break;
|
||||
case "DappCall":
|
||||
F(Data.Err, Data.RetValue);
|
||||
break;
|
||||
case "DappInfo":
|
||||
F(Data.Err, Data);
|
||||
break;
|
||||
case "DappWalletList":
|
||||
case "DappAccountList":
|
||||
case "DappSmartList":
|
||||
case "DappBlockList":
|
||||
case "DappTransactionList":
|
||||
F(Data.Err, Data.arr);
|
||||
break;
|
||||
case "DappBlockFile":
|
||||
case "DappSmartHTMLFile":
|
||||
F(Data.Err, Data.Body);
|
||||
break;
|
||||
case "ComputeSecret":
|
||||
F(Data.Result);
|
||||
break;
|
||||
default:
|
||||
console.log("Error cmd: " + cmd);
|
||||
}
|
||||
delete glMapF[CallID];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch(cmd)
|
||||
{
|
||||
case "History":
|
||||
var eventEvent = new CustomEvent("History", {detail:Data});
|
||||
window.dispatchEvent(eventEvent);
|
||||
break;
|
||||
case "OnEvent":
|
||||
if(window.OnEvent)
|
||||
{
|
||||
window.OnEvent(Data);
|
||||
}
|
||||
var eventEvent = new CustomEvent("Event", {detail:Data});
|
||||
window.dispatchEvent(eventEvent);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function OpenRefFile(Str)
|
||||
{
|
||||
var Param = ParseFileName(Str);
|
||||
if(Param.BlockNum)
|
||||
DappBlockFile(Param.BlockNum, Param.TrNum, function (Err,Body)
|
||||
{
|
||||
document.write(Body);
|
||||
});
|
||||
else
|
||||
{
|
||||
OpenLink(Str);
|
||||
}
|
||||
};
|
||||
|
||||
function SaveToStorageByArr(Arr)
|
||||
{
|
||||
SetStorage("VerSave", "1");
|
||||
for(var i = 0; i < Arr.length; i++)
|
||||
{
|
||||
var name = Arr[i];
|
||||
var Item = $(name);
|
||||
if(Item)
|
||||
{
|
||||
if(Item.type === "checkbox")
|
||||
SetStorage(name, 0 + Item.checked);
|
||||
else
|
||||
SetStorage(name, Item.value);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
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
|
||||
LoadFromStorageById(Arr[i]);
|
||||
}
|
||||
}
|
||||
if(bAll && F)
|
||||
F(0);
|
||||
});
|
||||
};
|
||||
|
||||
function LoadFromStorageById(Name,F)
|
||||
{
|
||||
GetStorage(Name, function (Key,Value)
|
||||
{
|
||||
var Item = document.getElementById(Name);
|
||||
if(Item)
|
||||
{
|
||||
if(Item.type === "checkbox")
|
||||
Item.checked = parseInt(Value);
|
||||
else
|
||||
Item.value = Value;
|
||||
}
|
||||
if(F)
|
||||
F(Key, Value);
|
||||
});
|
||||
};
|
||||
var SendCountDappParams = 0;
|
||||
|
||||
function GetDappParams(BNum,TrNum,F,bAll)
|
||||
{
|
||||
if(!BNum)
|
||||
{
|
||||
if(bAll)
|
||||
F();
|
||||
return ;
|
||||
}
|
||||
SendCountDappParams++;
|
||||
DappBlockFile(BNum, TrNum, function (Err,Data)
|
||||
{
|
||||
SendCountDappParams--;
|
||||
if(!Err && Data.Type === 135)
|
||||
{
|
||||
try
|
||||
{
|
||||
var Params = JSON.parse(Data.Params);
|
||||
}
|
||||
catch(e)
|
||||
{
|
||||
}
|
||||
if(Params)
|
||||
{
|
||||
F(Params, Data.MethodName, Data.FromNum);
|
||||
return ;
|
||||
}
|
||||
}
|
||||
if(bAll)
|
||||
F();
|
||||
});
|
||||
};
|
||||
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 ()
|
||||
{
|
||||
OpenRefFile(this.href);
|
||||
};
|
||||
}
|
||||
}
|
||||
});
|
||||
if(window.addEventListener)
|
||||
{
|
||||
window.addEventListener("message", OnMessage);
|
||||
}
|
||||
else
|
||||
{
|
||||
window.attachEvent("onmessage", OnMessage);
|
||||
}
|
||||
var SMART = {}, BASE_ACCOUNT = {}, INFO = {}, USER_ACCOUNT = [], USER_ACCOUNT_MAP = {}, OPEN_PATH = "", ACCOUNT_OPEN_NUM = 0;
|
||||
var ALL_ACCOUNTS = 0;
|
||||
var WasStartInit = 0, WasStartInit2 = 0;
|
||||
var eventInfo = new Event("UpdateInfo");
|
||||
|
||||
function UpdateDappInfo()
|
||||
{
|
||||
GetInfo(function (Err,Data)
|
||||
{
|
||||
if(Err)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
INFO = Data;
|
||||
SMART = Data.Smart;
|
||||
BASE_ACCOUNT = Data.Account;
|
||||
OPEN_PATH = Data.OPEN_PATH;
|
||||
ACCOUNT_OPEN_NUM = ParseNum(OPEN_PATH);
|
||||
SetBlockChainConstant(Data);
|
||||
USER_ACCOUNT = Data.ArrWallet;
|
||||
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)
|
||||
{
|
||||
WasStartInit = 1;
|
||||
window.OnInit(1);
|
||||
}
|
||||
else
|
||||
if(window.OnUpdateInfo)
|
||||
{
|
||||
window.OnUpdateInfo();
|
||||
}
|
||||
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++)
|
||||
{
|
||||
var Item = Data.ArrEvent[i];
|
||||
Item.cmd = "OnEvent";
|
||||
OnMessage({data:Item});
|
||||
}
|
||||
}, 1);
|
||||
};
|
||||
window.addEventListener('load', function ()
|
||||
{
|
||||
if(!window.sha3)
|
||||
LoadLib("./JS/sha3.js");
|
||||
UpdateDappInfo();
|
||||
setInterval(UpdateDappInfo, 1000);
|
||||
});
|
||||
455
src/HTML/JS/diagram.js
Normal file
455
src/HTML/JS/diagram.js
Normal file
@@ -0,0 +1,455 @@
|
||||
/*
|
||||
* @project: TERA
|
||||
* @version: Development (beta)
|
||||
* @license: MIT (not for evil)
|
||||
* @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com]
|
||||
* Web: https://terafoundation.org
|
||||
* Twitter: https://twitter.com/terafoundation
|
||||
* Telegram: https://t.me/terafoundation
|
||||
*/
|
||||
|
||||
var DiagramMap = {};
|
||||
var DiagramMapId = {};
|
||||
var LMouseOn = false;
|
||||
if(!window.toStaticHTML)
|
||||
toStaticHTML = function (Str)
|
||||
{
|
||||
return Str;
|
||||
};
|
||||
|
||||
function Rigth(Str,Count)
|
||||
{
|
||||
if(Str.length < Count)
|
||||
return Str;
|
||||
else
|
||||
return Str.substr(Str.length - Count);
|
||||
};
|
||||
|
||||
function SetHTMLDiagramItem(Item,width)
|
||||
{
|
||||
Item.mouseX = width - 50;
|
||||
if(Item.Extern || Item.Delete)
|
||||
return ;
|
||||
var MinHeight = 80;
|
||||
if(!Item.id)
|
||||
Item.id = "DgrmId" + Item.num;
|
||||
DiagramMap[Item.name] = Item;
|
||||
DiagramMapId[Item.id] = Item;
|
||||
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
|
||||
{
|
||||
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
|
||||
{
|
||||
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)
|
||||
{
|
||||
if(mode === "down")
|
||||
LMouseOn = true;
|
||||
else
|
||||
if(mode === "up")
|
||||
LMouseOn = false;
|
||||
event.preventDefault();
|
||||
if(LMouseOn === true)
|
||||
{
|
||||
var obj = event.srcElement;
|
||||
var mouse = getMouse(obj, event);
|
||||
if(event.ctrlKey === true)
|
||||
{
|
||||
for(var key in DiagramMapId)
|
||||
{
|
||||
var Item = DiagramMapId[key];
|
||||
Item.mouseX = mouse.x;
|
||||
DrawDiagram(Item);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var Item = DiagramMapId[obj.id];
|
||||
if(Item)
|
||||
{
|
||||
Item.mouseX = mouse.x;
|
||||
DrawDiagram(Item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function DrawDiagram(Item)
|
||||
{
|
||||
if(Item.Delete)
|
||||
return ;
|
||||
var arr = Item.arr;
|
||||
if(!arr)
|
||||
arr = Item.ArrList;
|
||||
var arrX = Item.arrX;
|
||||
var GreenValue = Item.value;
|
||||
var StepTime = Item.steptime;
|
||||
var StartNumber = Item.startnumber;
|
||||
var StartServer = Item.starttime;
|
||||
var mouseX = Item.mouseX;
|
||||
var KPrecision = Item.KPrecision;
|
||||
if(!KPrecision)
|
||||
KPrecision = 1;
|
||||
if(!arr)
|
||||
return ;
|
||||
var obj = document.getElementById(Item.id);
|
||||
var ctx = obj.getContext('2d');
|
||||
var Left = 50;
|
||||
var Top = 11;
|
||||
var Button = 15;
|
||||
var Right = 50;
|
||||
if(Item.fillStyle)
|
||||
ctx.fillStyle = Item.fillStyle;
|
||||
else
|
||||
ctx.fillStyle = "#FFF";
|
||||
ctx.fillRect(0, 0, obj.width, obj.height);
|
||||
if(arr.length <= 0)
|
||||
return ;
|
||||
var Pow2 = 0;
|
||||
if(Item.name.substr(Item.name.length - 2) === "**")
|
||||
Pow2 = 1;
|
||||
var MaxValue = arr[0];
|
||||
var MinValue = arr[0];
|
||||
var AvgValue = 0;
|
||||
for(var i = 0; i < arr.length; i++)
|
||||
{
|
||||
if(arr[i] > MaxValue)
|
||||
MaxValue = arr[i];
|
||||
if(arr[i] < MinValue)
|
||||
MinValue = arr[i];
|
||||
if(arr[i])
|
||||
AvgValue += arr[i];
|
||||
}
|
||||
if(Item.name.substr(0, 4) !== "MAX:" || !Item.AvgValue)
|
||||
AvgValue = AvgValue / arr.length;
|
||||
else
|
||||
AvgValue = Item.AvgValue;
|
||||
if(Pow2 && AvgValue)
|
||||
AvgValue = Math.pow(2, AvgValue) / 1000000;
|
||||
if(AvgValue < 50)
|
||||
AvgValue = AvgValue.toFixed(2);
|
||||
else
|
||||
AvgValue = Math.floor(AvgValue);
|
||||
if(Item.MaxValue !== undefined)
|
||||
MaxValue = Item.MaxValue;
|
||||
if(Pow2 && MaxValue)
|
||||
MaxValue = Math.pow(2, MaxValue) / 1000000;
|
||||
var HValue = MaxValue;
|
||||
if(HValue <= 0)
|
||||
HValue = 1;
|
||||
var KX = (obj.width - Left - Right) / arr.length;
|
||||
var KY = (obj.height - Top - Button) / HValue;
|
||||
var DeltaY = 0;
|
||||
var bLine = Item.line;
|
||||
if(Item.zero)
|
||||
{
|
||||
bLine = 1;
|
||||
DeltaY -= Item.zero * KY;
|
||||
MaxValue -= Item.zero;
|
||||
AvgValue -= Item.zero;
|
||||
}
|
||||
MaxValue = Math.floor(MaxValue + 0.5);
|
||||
if(bLine)
|
||||
ctx.lineWidth = 3;
|
||||
else
|
||||
if(KX > 1)
|
||||
ctx.lineWidth = KX;
|
||||
else
|
||||
ctx.lineWidth = 1;
|
||||
var StartX = Left;
|
||||
var StartY = obj.height - Button;
|
||||
var mouseValueX = 0;
|
||||
var mouseValue = undefined;
|
||||
var mouseColor = undefined;
|
||||
|
||||
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++)
|
||||
{
|
||||
var Value = arr[i];
|
||||
if(!Value)
|
||||
Value = 0;
|
||||
if(Value)
|
||||
{
|
||||
if(Pow2)
|
||||
Value = Math.pow(2, Value) / 1000000;
|
||||
}
|
||||
if(mode === "green")
|
||||
{
|
||||
if(Value > GreenValue)
|
||||
continue;
|
||||
}
|
||||
else
|
||||
if(mode === "red")
|
||||
{
|
||||
if(Value <= GreenValue)
|
||||
continue;
|
||||
}
|
||||
var Value1 = Value;
|
||||
if(Value1 > GreenValue)
|
||||
Value1 = GreenValue;
|
||||
var VX1 = Math.floor(Value1 * KY);
|
||||
var VX2 = Math.floor(Value * KY);
|
||||
if(VX1 === VX2)
|
||||
VX1 -= 2;
|
||||
var x = StartX + ctx.lineWidth / 2 + (i) * KX;
|
||||
if(bLine)
|
||||
{
|
||||
if(!WasMove0)
|
||||
{
|
||||
WasMove0 = 1;
|
||||
ctx.moveTo(x, StartY - VX2);
|
||||
}
|
||||
else
|
||||
{
|
||||
ctx.lineTo(x, StartY - VX2);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ctx.moveTo(x, StartY - VX1);
|
||||
ctx.lineTo(x, StartY - VX2);
|
||||
}
|
||||
if(mouseX)
|
||||
{
|
||||
var deltaCur = Math.abs(x - mouseX);
|
||||
var deltaWas = Math.abs(mouseValueX - mouseX);
|
||||
if(deltaCur < deltaWas)
|
||||
{
|
||||
mouseValueX = x;
|
||||
mouseValue = Value;
|
||||
if(Item.zero)
|
||||
mouseValue -= Item.zero;
|
||||
mouseColor = color;
|
||||
}
|
||||
}
|
||||
}
|
||||
ctx.stroke();
|
||||
};
|
||||
if(!Item.red)
|
||||
Item.red = "#A00";
|
||||
if(bLine)
|
||||
{
|
||||
DrawLines(arr, "line", Item.red);
|
||||
}
|
||||
else
|
||||
{
|
||||
DrawLines(arr, "red", Item.red);
|
||||
if(GreenValue > 0)
|
||||
DrawLines(arr, "green", "#0A0");
|
||||
}
|
||||
var MaxValueText = GetValueByItemProperty(MaxValue, Item);
|
||||
var AvgValueText = GetValueByItemProperty(AvgValue, Item);
|
||||
ctx.lineWidth = 0.5;
|
||||
ctx.beginPath();
|
||||
ctx.strokeStyle = "#000";
|
||||
Left--;
|
||||
StartX--;
|
||||
StartY += 2;
|
||||
ctx.moveTo(Left, Top);
|
||||
ctx.lineTo(StartX, StartY);
|
||||
ctx.moveTo(StartX, StartY + DeltaY);
|
||||
ctx.lineTo(obj.width - 10, StartY + DeltaY);
|
||||
ctx.stroke();
|
||||
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)
|
||||
{
|
||||
ctx.fillStyle = mouseColor;
|
||||
var Val = GetValueByItemProperty(mouseValue, Item);
|
||||
var mouseTextX = mouseX;
|
||||
if(Item.MouseText)
|
||||
mouseTextX -= 3 * Item.MouseText.length;
|
||||
else
|
||||
Item.MouseText = "";
|
||||
ctx.fillText("" + Val + Item.MouseText, mouseTextX - 3, Top - 2);
|
||||
}
|
||||
}
|
||||
ctx.fillStyle = "#000";
|
||||
if(!Item.NoTextMax)
|
||||
ctx.fillText(Rigth(" " + MaxValueText, 8), 0, Top - 3);
|
||||
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)
|
||||
{
|
||||
yT = 10;
|
||||
}
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(Left - 2, y + Top);
|
||||
ctx.lineTo(Left + 2, y + Top);
|
||||
ctx.stroke();
|
||||
ctx.strokeStyle = "#00F";
|
||||
ctx.fillText(Rigth(" " + AvgValueText, 8), 0, yT + Top);
|
||||
}
|
||||
var CountNameX = 10;
|
||||
if(arr.length < CountNameX)
|
||||
CountNameX = arr.length;
|
||||
var KX3 = (obj.width - Left - Right) / CountNameX;
|
||||
var KDelitel = 1;
|
||||
var Step = arr.length / CountNameX;
|
||||
var StartTime, bNumber;
|
||||
if(arrX)
|
||||
{
|
||||
}
|
||||
else
|
||||
if(StartNumber !== undefined)
|
||||
{
|
||||
bNumber = 1;
|
||||
StartTime = StartNumber;
|
||||
}
|
||||
else
|
||||
if(StartServer)
|
||||
{
|
||||
bNumber = 1;
|
||||
StartTime = Math.floor(((Date.now() - StartServer) - StepTime * arr.length * 1000) / 1000);
|
||||
if(StartTime < 0)
|
||||
StartTime = 0;
|
||||
var KDelitel = Math.floor(Step / 10) * 10;
|
||||
if(KDelitel == 0)
|
||||
KDelitel = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
bNumber = 0;
|
||||
StartTime = Date.now() - StepTime * arr.length * 1000;
|
||||
StartX = StartX - 16;
|
||||
}
|
||||
for(i = 0; i <= CountNameX; i++)
|
||||
{
|
||||
var Val;
|
||||
if(i === CountNameX)
|
||||
{
|
||||
Val = arr.length * StepTime;
|
||||
KDelitel = 1;
|
||||
}
|
||||
else
|
||||
if(i === 0)
|
||||
Val = 0;
|
||||
else
|
||||
Val = i * Step * StepTime;
|
||||
var Str;
|
||||
if(arrX)
|
||||
{
|
||||
Val = Math.floor(Val);
|
||||
Str = arrX[Val];
|
||||
if(Str === undefined)
|
||||
Str = "";
|
||||
}
|
||||
else
|
||||
if(bNumber)
|
||||
{
|
||||
Val = Math.floor((StartTime + Val) / KDelitel) * KDelitel;
|
||||
Str = Val;
|
||||
}
|
||||
else
|
||||
{
|
||||
var Time = new Date(StartTime + Val * 1000);
|
||||
Str = "" + Time.getHours();
|
||||
Str += ":" + Rigth("0" + Time.getMinutes(), 2);
|
||||
Str += ":" + Rigth("0" + Time.getSeconds(), 2);
|
||||
}
|
||||
ctx.fillText(Str, StartX + i * KX3, StartY + 10);
|
||||
}
|
||||
};
|
||||
|
||||
function GetValueByItemProperty(Value,Item)
|
||||
{
|
||||
if(Item.MathPow && Item.MathDiv)
|
||||
{
|
||||
Value = Math.pow(Item.MathPow, Value) / Item.MathDiv;
|
||||
}
|
||||
var KPrecision = Item.KPrecision;
|
||||
if(!Item.KPrecision)
|
||||
KPrecision = 1;
|
||||
Value = Math.floor(Value * KPrecision + 0.5) / KPrecision;
|
||||
return Value;
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
SetDiagramMouseX(event, "down");
|
||||
}, false);
|
||||
window.addEventListener('mouseup', function (event)
|
||||
{
|
||||
SetDiagramMouseX(event, "up");
|
||||
}, false);
|
||||
window.addEventListener('onmousemove', function (event)
|
||||
{
|
||||
SetDiagramMouseX(event, "move");
|
||||
}, false);
|
||||
};
|
||||
|
||||
function getMouse(canvas,e)
|
||||
{
|
||||
var x = e.clientX - getTrueOffsetLeft(canvas);
|
||||
if(window.pageXOffset)
|
||||
x = x + window.pageXOffset;
|
||||
var y = e.clientY - getTrueOffsetTop(canvas);
|
||||
if(window.pageYOffset)
|
||||
y = y + window.pageYOffset;
|
||||
var coord = {x:x, y:y};
|
||||
return coord;
|
||||
};
|
||||
|
||||
function getTrueOffsetLeft(ele)
|
||||
{
|
||||
var n = 0;
|
||||
while(ele)
|
||||
{
|
||||
n += ele.offsetLeft || 0;
|
||||
ele = ele.offsetParent;
|
||||
}
|
||||
return n;
|
||||
};
|
||||
|
||||
function getTrueOffsetTop(ele)
|
||||
{
|
||||
var n = 0;
|
||||
while(ele)
|
||||
{
|
||||
n += ele.offsetTop || 0;
|
||||
ele = ele.offsetParent;
|
||||
}
|
||||
return n;
|
||||
};
|
||||
1
src/HTML/JS/highlight-html.js
Normal file
1
src/HTML/JS/highlight-html.js
Normal file
@@ -0,0 +1 @@
|
||||
function FLanguage(e){var n={endsWithParent:!0,illegal:/</,relevance:0,contains:[{className:"attr",begin:"[A-Za-z0-9\\._:-]+",relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/},{begin:/[^\s"'=<>`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],case_insensitive:!0,contains:[{className:"meta",begin:"<!DOCTYPE",end:">",relevance:10,contains:[{begin:"\\[",end:"\\]"}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{begin:/<\?(php)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},e.inherit(e.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]},{className:"tag",begin:"<style(?=\\s|>|$)",end:">",keywords:{name:"style"},contains:[n],starts:{end:"</style>",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:"<script(?=\\s|>|$)",end:">",keywords:{name:"script"},contains:[n],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["actionscript","javascript","handlebars","xml"]}},{className:"tag",begin:"</?",end:"/?>",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},n]}]}}hljs.registerLanguage("html",FLanguage);
|
||||
1
src/HTML/JS/highlight-js.js
Normal file
1
src/HTML/JS/highlight-js.js
Normal file
@@ -0,0 +1 @@
|
||||
function FLanguage(e){var n="[A-Za-z$_][0-9A-Za-z$_]*",a={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},r={className:"number",variants:[{begin:"\\b(0[bB][01]+)"},{begin:"\\b(0[oO][0-7]+)"},{begin:e.C_NUMBER_RE}],relevance:0},s={className:"subst",begin:"\\$\\{",end:"\\}",keywords:a,contains:[]},i={className:"string",begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,s]};s.contains=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,i,r,e.REGEXP_MODE];var t=s.contains.concat([e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]);return{aliases:["js","jsx"],keywords:a,contains:[{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},{className:"meta",begin:/^#!/,end:/$/},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,r,{begin:/[{,]\s*/,relevance:0,contains:[{begin:n+"\\s*:",returnBegin:!0,relevance:0,contains:[{className:"attr",begin:n,relevance:0}]}]},{begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.REGEXP_MODE,{className:"function",begin:"(\\(.*?\\)|"+n+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:n},{begin:/\(\s*\)/},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:a,contains:t}]}]},{begin:/</,end:/(\/\w+|\w+\/)>/,subLanguage:"xml",contains:[{begin:/<\w+\s*\/>/,skip:!0},{begin:/<\w+/,end:/(\/\w+|\w+\/)>/,skip:!0,contains:[{begin:/<\w+\s*\/>/,skip:!0},"self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:n}),{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:t}],illegal:/\[|%/},{begin:/\$[(.]/},e.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0}],illegal:/#(?!!)/}}hljs.registerLanguage("javascript",FLanguage),hljs.registerLanguage("js",FLanguage);
|
||||
1
src/HTML/JS/highlight.js
Normal file
1
src/HTML/JS/highlight.js
Normal file
File diff suppressed because one or more lines are too long
1686
src/HTML/JS/lexer.js
Normal file
1686
src/HTML/JS/lexer.js
Normal file
File diff suppressed because it is too large
Load Diff
1
src/HTML/JS/marked.js
Normal file
1
src/HTML/JS/marked.js
Normal file
File diff suppressed because one or more lines are too long
1099
src/HTML/JS/mobile-wallet.js
Normal file
1099
src/HTML/JS/mobile-wallet.js
Normal file
File diff suppressed because it is too large
Load Diff
190
src/HTML/JS/sec256k1.js
Normal file
190
src/HTML/JS/sec256k1.js
Normal file
@@ -0,0 +1,190 @@
|
||||
/*
|
||||
* @project: TERA
|
||||
* @version: Development (beta)
|
||||
* @copyright: Yuriy Ivanov 2017-2019 [progr76@gmail.com]
|
||||
* @license: MIT (not for evil)
|
||||
* Web: http://terafoundation.org
|
||||
* GitHub: https://github.com/terafoundation/wallet
|
||||
* Twitter: https://twitter.com/terafoundation
|
||||
* Telegram: https://web.telegram.org/#/im?p=@terafoundation
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
var der = require("./der"), toString = Object.prototype.toString, exports = {}, assert = exports;
|
||||
exports.isArray = function (e,s)
|
||||
{
|
||||
if(!Array.isArray(e))
|
||||
throw TypeError(s);
|
||||
}, exports.isBoolean = function (e,s)
|
||||
{
|
||||
if("[object Boolean]" !== toString.call(e))
|
||||
throw TypeError(s);
|
||||
}, exports.isBuffer = function (e,s)
|
||||
{
|
||||
if(!Buffer.isBuffer(e))
|
||||
throw TypeError(s);
|
||||
}, exports.isFunction = function (e,s)
|
||||
{
|
||||
if("[object Function]" !== toString.call(e))
|
||||
throw TypeError(s);
|
||||
}, exports.isNumber = function (e,s)
|
||||
{
|
||||
if("[object Number]" !== toString.call(e))
|
||||
throw TypeError(s);
|
||||
}, exports.isObject = function (e,s)
|
||||
{
|
||||
if("[object Object]" !== toString.call(e))
|
||||
throw TypeError(s);
|
||||
}, exports.isBufferLength = function (e,s,r)
|
||||
{
|
||||
if(e.length !== s)
|
||||
throw RangeError(r);
|
||||
}, exports.isBufferLength2 = function (e,s,r,_)
|
||||
{
|
||||
if(e.length !== s && e.length !== r)
|
||||
throw RangeError(_);
|
||||
}, exports.isLengthGTZero = function (e,s)
|
||||
{
|
||||
if(0 === e.length)
|
||||
throw RangeError(s);
|
||||
}, 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",
|
||||
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",
|
||||
EC_PUBLIC_KEYS_TYPE_INVALID:"public keys should be an Array", EC_PUBLIC_KEYS_LENGTH_INVALID:"public keys Array should have at least 1 element",
|
||||
EC_PUBLIC_KEY_TYPE_INVALID:"public key should be a Buffer", EC_PUBLIC_KEY_LENGTH_INVALID:"public key length is invalid", EC_PUBLIC_KEY_PARSE_FAIL:"the public key could not be parsed or is invalid",
|
||||
EC_PUBLIC_KEY_CREATE_FAIL:"private was invalid, try again", EC_PUBLIC_KEY_TWEAK_ADD_FAIL:"tweak out of range or resulting public key is invalid",
|
||||
EC_PUBLIC_KEY_TWEAK_MUL_FAIL:"tweak out of range", EC_PUBLIC_KEY_COMBINE_FAIL:"the sum of the public keys is not valid", ECDH_FAIL:"scalar was invalid (zero or overflow)",
|
||||
ECDSA_SIGNATURE_TYPE_INVALID:"signature should be a Buffer", ECDSA_SIGNATURE_LENGTH_INVALID:"signature length is invalid",
|
||||
ECDSA_SIGNATURE_PARSE_FAIL:"couldn't parse signature", ECDSA_SIGNATURE_PARSE_DER_FAIL:"couldn't parse DER signature", ECDSA_SIGNATURE_SERIALIZE_DER_FAIL:"couldn't serialize signature to DER format",
|
||||
ECDSA_SIGN_FAIL:"nonce generation function failed or private key is invalid", ECDSA_RECOVER_FAIL:"couldn't recover public key from signature",
|
||||
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"};
|
||||
|
||||
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)
|
||||
{
|
||||
return assert.isBuffer(e, messages.EC_PRIVATE_KEY_TYPE_INVALID), 32 === e.length && E.privateKeyVerify(e);
|
||||
}, 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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
return assert.isBuffer(e, messages.EC_PUBLIC_KEY_TYPE_INVALID), E.publicKeyVerify(e);
|
||||
}, 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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
return assert.isBuffer(e, messages.ECDSA_SIGNATURE_TYPE_INVALID), assert.isBufferLength(e, 64, messages.ECDSA_SIGNATURE_LENGTH_INVALID),
|
||||
E.signatureNormalize(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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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,_)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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;
|
||||
803
src/HTML/JS/sha3.js
Normal file
803
src/HTML/JS/sha3.js
Normal file
@@ -0,0 +1,803 @@
|
||||
/*
|
||||
* @project: TERA
|
||||
* @version: Development (beta)
|
||||
* @license: MIT (not for evil)
|
||||
* @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com]
|
||||
* Web: https://terafoundation.org
|
||||
* Twitter: https://twitter.com/terafoundation
|
||||
* Telegram: https://t.me/terafoundation
|
||||
*/
|
||||
|
||||
(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)
|
||||
{
|
||||
root = global;
|
||||
}
|
||||
if(root.RUN_CLIENT)
|
||||
{
|
||||
root = window;
|
||||
}
|
||||
var COMMON_JS = !root.JS_SHA3_NO_COMMON_JS && typeof module === 'object' && module.exports;
|
||||
var ARRAY_BUFFER = !root.JS_SHA3_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';
|
||||
var HEX_CHARS = '0123456789abcdef'.split('');
|
||||
var SHAKE_PADDING = [31, 7936, 2031616, 520093696];
|
||||
var CSHAKE_PADDING = [4, 1024, 262144, 67108864];
|
||||
var KECCAK_PADDING = [1, 256, 65536, 16777216];
|
||||
var PADDING = [6, 1536, 393216, 100663296];
|
||||
var SHIFT = [0, 8, 16, 24];
|
||||
var RC = [1, 0, 32898, 0, 32906, 2147483648, 2147516416, 2147483648, 32907, 0, 2147483649, 0, 2147516545, 2147483648, 32777,
|
||||
2147483648, 138, 0, 136, 0, 2147516425, 0, 2147483658, 0, 2147516555, 0, 139, 2147483648, 32905, 2147483648, 32771, 2147483648,
|
||||
32770, 2147483648, 128, 2147483648, 32778, 0, 2147483658, 2147483648, 2147516545, 2147483648, 32896, 2147483648, 2147483649,
|
||||
0, 2147516424, 2147483648];
|
||||
var BITS = [224, 256, 384, 512];
|
||||
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)
|
||||
{
|
||||
return Object.prototype.toString.call(obj) === '[object Array]';
|
||||
};
|
||||
}
|
||||
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)
|
||||
{
|
||||
return new Keccak(bits, padding, outputBits).update(message)[outputType]();
|
||||
};
|
||||
};
|
||||
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)
|
||||
{
|
||||
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 type = OUTPUT_TYPES[i];
|
||||
method[type] = createMethod(bits, padding, type);
|
||||
}
|
||||
return method;
|
||||
};
|
||||
var createMethod = function (bits,padding,outputs)
|
||||
{
|
||||
var method = createOutputMethod(bits, padding, outputs);
|
||||
method.create = function ()
|
||||
{
|
||||
return new Keccak(bits, padding, bits);
|
||||
};
|
||||
method.update = function (message)
|
||||
{
|
||||
return method.create().update(message);
|
||||
};
|
||||
return createOutputMethods(method, createOutputMethod, bits, padding);
|
||||
};
|
||||
var createMethodArray = function (bits,padding)
|
||||
{
|
||||
var method = createOutputMethod(bits, padding, 'array');
|
||||
method.create = function ()
|
||||
{
|
||||
return new Keccak(bits, padding, bits);
|
||||
};
|
||||
method.update = function (message)
|
||||
{
|
||||
return method.create().update(message);
|
||||
};
|
||||
return createOutputMethods(method, createOutputMethod, bits, padding);
|
||||
};
|
||||
var createShakeMethod = function (bits,padding)
|
||||
{
|
||||
var method = createShakeOutputMethod(bits, padding, 'hex');
|
||||
method.create = function (outputBits)
|
||||
{
|
||||
return new Keccak(bits, padding, outputBits);
|
||||
};
|
||||
method.update = function (message,outputBits)
|
||||
{
|
||||
return method.create(outputBits).update(message);
|
||||
};
|
||||
return createOutputMethods(method, createShakeOutputMethod, 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)
|
||||
{
|
||||
return methods['shake' + bits].create(outputBits);
|
||||
}
|
||||
else
|
||||
{
|
||||
return new Keccak(bits, padding, outputBits).bytepad([n, s], w);
|
||||
}
|
||||
};
|
||||
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 w = CSHAKE_BYTEPAD[bits];
|
||||
var method = createKmacOutputMethod(bits, padding, 'hex');
|
||||
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)
|
||||
{
|
||||
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 methods = {}, methodNames = [];
|
||||
for(var i = 0; i < algorithms.length; ++i)
|
||||
{
|
||||
var algorithm = algorithms[i];
|
||||
var bits = algorithm.bits;
|
||||
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')
|
||||
{
|
||||
var newMethodName = algorithm.name + bits[j];
|
||||
methodNames.push(newMethodName);
|
||||
methods[newMethodName] = methods[methodName];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function Keccak(bits,padding,outputBits)
|
||||
{
|
||||
this.blocks = [];
|
||||
this.s = [];
|
||||
this.padding = padding;
|
||||
this.outputBits = outputBits;
|
||||
this.reset = true;
|
||||
this.block = 0;
|
||||
this.start = 0;
|
||||
this.blockCount = (1600 - (bits << 1)) >> 5;
|
||||
this.byteCount = this.blockCount << 2;
|
||||
this.outputBlocks = outputBits >> 5;
|
||||
this.extraBytes = (outputBits & 31) >> 3;
|
||||
for(var i = 0; i < 50; ++i)
|
||||
{
|
||||
this.s[i] = 0;
|
||||
}
|
||||
};
|
||||
Keccak.prototype.update = function (message)
|
||||
{
|
||||
var notString = typeof message !== 'string';
|
||||
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)))
|
||||
{
|
||||
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)
|
||||
{
|
||||
this.reset = false;
|
||||
blocks[0] = this.block;
|
||||
for(i = 1; i < blockCount + 1; ++i)
|
||||
{
|
||||
blocks[i] = 0;
|
||||
}
|
||||
}
|
||||
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)
|
||||
{
|
||||
code = message.charCodeAt(index);
|
||||
if(code < 0x80)
|
||||
{
|
||||
blocks[i >> 2] |= code << SHIFT[i++ & 3];
|
||||
}
|
||||
else
|
||||
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)
|
||||
{
|
||||
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
|
||||
{
|
||||
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];
|
||||
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
||||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
||||
}
|
||||
}
|
||||
}
|
||||
this.lastByteIndex = i;
|
||||
if(i >= byteCount)
|
||||
{
|
||||
this.start = i - byteCount;
|
||||
this.block = blocks[blockCount];
|
||||
for(i = 0; i < blockCount; ++i)
|
||||
{
|
||||
s[i] ^= blocks[i];
|
||||
}
|
||||
f(s);
|
||||
this.reset = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.start = i;
|
||||
}
|
||||
}
|
||||
return this;
|
||||
};
|
||||
Keccak.prototype.encode = function (x,right)
|
||||
{
|
||||
var o = x & 255, n = 1;
|
||||
var bytes = [o];
|
||||
x = x >> 8;
|
||||
o = x & 255;
|
||||
while(o > 0)
|
||||
{
|
||||
bytes.unshift(o);
|
||||
x = x >> 8;
|
||||
o = x & 255;
|
||||
++n;
|
||||
}
|
||||
if(right)
|
||||
{
|
||||
bytes.push(n);
|
||||
}
|
||||
else
|
||||
{
|
||||
bytes.unshift(n);
|
||||
}
|
||||
this.update(bytes);
|
||||
return bytes.length;
|
||||
};
|
||||
Keccak.prototype.encodeString = function (str)
|
||||
{
|
||||
str = str || '';
|
||||
var notString = typeof str !== 'string';
|
||||
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)))
|
||||
{
|
||||
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)
|
||||
{
|
||||
bytes = length;
|
||||
}
|
||||
else
|
||||
{
|
||||
for(var i = 0; i < str.length; ++i)
|
||||
{
|
||||
var code = str.charCodeAt(i);
|
||||
if(code < 0x80)
|
||||
{
|
||||
bytes += 1;
|
||||
}
|
||||
else
|
||||
if(code < 0x800)
|
||||
{
|
||||
bytes += 2;
|
||||
}
|
||||
else
|
||||
if(code < 0xd800 || code >= 0xe000)
|
||||
{
|
||||
bytes += 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
code = 0x10000 + (((code & 0x3ff) << 10) | (str.charCodeAt(++i) & 0x3ff));
|
||||
bytes += 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
bytes += this.encode(bytes * 8);
|
||||
this.update(str);
|
||||
return bytes;
|
||||
};
|
||||
Keccak.prototype.bytepad = function (strs,w)
|
||||
{
|
||||
var bytes = this.encode(w);
|
||||
for(var i = 0; i < strs.length; ++i)
|
||||
{
|
||||
bytes += this.encodeString(strs[i]);
|
||||
}
|
||||
var paddingBytes = w - bytes % w;
|
||||
var zeros = [];
|
||||
zeros.length = paddingBytes;
|
||||
this.update(zeros);
|
||||
return this;
|
||||
};
|
||||
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)
|
||||
{
|
||||
blocks[0] = blocks[blockCount];
|
||||
for(i = 1; i < blockCount + 1; ++i)
|
||||
{
|
||||
blocks[i] = 0;
|
||||
}
|
||||
}
|
||||
blocks[blockCount - 1] |= 0x80000000;
|
||||
for(i = 0; i < blockCount; ++i)
|
||||
{
|
||||
s[i] ^= blocks[i];
|
||||
}
|
||||
f(s);
|
||||
};
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
f(s);
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
if(extraBytes)
|
||||
{
|
||||
block = s[i];
|
||||
if(extraBytes > 0)
|
||||
{
|
||||
hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F];
|
||||
}
|
||||
if(extraBytes > 1)
|
||||
{
|
||||
hex += HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F];
|
||||
}
|
||||
if(extraBytes > 2)
|
||||
{
|
||||
hex += HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F];
|
||||
}
|
||||
}
|
||||
return hex;
|
||||
};
|
||||
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)
|
||||
{
|
||||
buffer = new ArrayBuffer((outputBlocks + 1) << 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
buffer = new ArrayBuffer(bytes);
|
||||
}
|
||||
var array = new Uint32Array(buffer);
|
||||
while(j < outputBlocks)
|
||||
{
|
||||
for(i = 0; i < blockCount && j < outputBlocks; ++i, ++j)
|
||||
{
|
||||
array[j] = s[i];
|
||||
}
|
||||
if(j % blockCount === 0)
|
||||
{
|
||||
f(s);
|
||||
}
|
||||
}
|
||||
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 ()
|
||||
{
|
||||
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)
|
||||
{
|
||||
offset = j << 2;
|
||||
block = s[i];
|
||||
array[offset] = block & 0xFF;
|
||||
array[offset + 1] = (block >> 8) & 0xFF;
|
||||
array[offset + 2] = (block >> 16) & 0xFF;
|
||||
array[offset + 3] = (block >> 24) & 0xFF;
|
||||
}
|
||||
if(j % blockCount === 0)
|
||||
{
|
||||
f(s);
|
||||
}
|
||||
}
|
||||
if(extraBytes)
|
||||
{
|
||||
offset = j << 2;
|
||||
block = s[i];
|
||||
if(extraBytes > 0)
|
||||
{
|
||||
array[offset] = block & 0xFF;
|
||||
}
|
||||
if(extraBytes > 1)
|
||||
{
|
||||
array[offset + 1] = (block >> 8) & 0xFF;
|
||||
}
|
||||
if(extraBytes > 2)
|
||||
{
|
||||
array[offset + 2] = (block >> 16) & 0xFF;
|
||||
}
|
||||
}
|
||||
return array;
|
||||
};
|
||||
|
||||
function Kmac(bits,padding,outputBits)
|
||||
{
|
||||
Keccak.call(this, bits, padding, outputBits);
|
||||
};
|
||||
Kmac.prototype = new Keccak();
|
||||
Kmac.prototype.finalize = function ()
|
||||
{
|
||||
this.encode(this.outputBits, true);
|
||||
return Keccak.prototype.finalize.call(this);
|
||||
};
|
||||
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)
|
||||
{
|
||||
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];
|
||||
c3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43];
|
||||
c4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44];
|
||||
c5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45];
|
||||
c6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46];
|
||||
c7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47];
|
||||
c8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48];
|
||||
c9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49];
|
||||
h = c8 ^ ((c2 << 1) | (c3 >>> 31));
|
||||
l = c9 ^ ((c3 << 1) | (c2 >>> 31));
|
||||
s[0] ^= h;
|
||||
s[1] ^= l;
|
||||
s[10] ^= h;
|
||||
s[11] ^= l;
|
||||
s[20] ^= h;
|
||||
s[21] ^= l;
|
||||
s[30] ^= h;
|
||||
s[31] ^= l;
|
||||
s[40] ^= h;
|
||||
s[41] ^= l;
|
||||
h = c0 ^ ((c4 << 1) | (c5 >>> 31));
|
||||
l = c1 ^ ((c5 << 1) | (c4 >>> 31));
|
||||
s[2] ^= h;
|
||||
s[3] ^= l;
|
||||
s[12] ^= h;
|
||||
s[13] ^= l;
|
||||
s[22] ^= h;
|
||||
s[23] ^= l;
|
||||
s[32] ^= h;
|
||||
s[33] ^= l;
|
||||
s[42] ^= h;
|
||||
s[43] ^= l;
|
||||
h = c2 ^ ((c6 << 1) | (c7 >>> 31));
|
||||
l = c3 ^ ((c7 << 1) | (c6 >>> 31));
|
||||
s[4] ^= h;
|
||||
s[5] ^= l;
|
||||
s[14] ^= h;
|
||||
s[15] ^= l;
|
||||
s[24] ^= h;
|
||||
s[25] ^= l;
|
||||
s[34] ^= h;
|
||||
s[35] ^= l;
|
||||
s[44] ^= h;
|
||||
s[45] ^= l;
|
||||
h = c4 ^ ((c8 << 1) | (c9 >>> 31));
|
||||
l = c5 ^ ((c9 << 1) | (c8 >>> 31));
|
||||
s[6] ^= h;
|
||||
s[7] ^= l;
|
||||
s[16] ^= h;
|
||||
s[17] ^= l;
|
||||
s[26] ^= h;
|
||||
s[27] ^= l;
|
||||
s[36] ^= h;
|
||||
s[37] ^= l;
|
||||
s[46] ^= h;
|
||||
s[47] ^= l;
|
||||
h = c6 ^ ((c0 << 1) | (c1 >>> 31));
|
||||
l = c7 ^ ((c1 << 1) | (c0 >>> 31));
|
||||
s[8] ^= h;
|
||||
s[9] ^= l;
|
||||
s[18] ^= h;
|
||||
s[19] ^= l;
|
||||
s[28] ^= h;
|
||||
s[29] ^= l;
|
||||
s[38] ^= h;
|
||||
s[39] ^= l;
|
||||
s[48] ^= h;
|
||||
s[49] ^= l;
|
||||
b0 = s[0];
|
||||
b1 = s[1];
|
||||
b32 = (s[11] << 4) | (s[10] >>> 28);
|
||||
b33 = (s[10] << 4) | (s[11] >>> 28);
|
||||
b14 = (s[20] << 3) | (s[21] >>> 29);
|
||||
b15 = (s[21] << 3) | (s[20] >>> 29);
|
||||
b46 = (s[31] << 9) | (s[30] >>> 23);
|
||||
b47 = (s[30] << 9) | (s[31] >>> 23);
|
||||
b28 = (s[40] << 18) | (s[41] >>> 14);
|
||||
b29 = (s[41] << 18) | (s[40] >>> 14);
|
||||
b20 = (s[2] << 1) | (s[3] >>> 31);
|
||||
b21 = (s[3] << 1) | (s[2] >>> 31);
|
||||
b2 = (s[13] << 12) | (s[12] >>> 20);
|
||||
b3 = (s[12] << 12) | (s[13] >>> 20);
|
||||
b34 = (s[22] << 10) | (s[23] >>> 22);
|
||||
b35 = (s[23] << 10) | (s[22] >>> 22);
|
||||
b16 = (s[33] << 13) | (s[32] >>> 19);
|
||||
b17 = (s[32] << 13) | (s[33] >>> 19);
|
||||
b48 = (s[42] << 2) | (s[43] >>> 30);
|
||||
b49 = (s[43] << 2) | (s[42] >>> 30);
|
||||
b40 = (s[5] << 30) | (s[4] >>> 2);
|
||||
b41 = (s[4] << 30) | (s[5] >>> 2);
|
||||
b22 = (s[14] << 6) | (s[15] >>> 26);
|
||||
b23 = (s[15] << 6) | (s[14] >>> 26);
|
||||
b4 = (s[25] << 11) | (s[24] >>> 21);
|
||||
b5 = (s[24] << 11) | (s[25] >>> 21);
|
||||
b36 = (s[34] << 15) | (s[35] >>> 17);
|
||||
b37 = (s[35] << 15) | (s[34] >>> 17);
|
||||
b18 = (s[45] << 29) | (s[44] >>> 3);
|
||||
b19 = (s[44] << 29) | (s[45] >>> 3);
|
||||
b10 = (s[6] << 28) | (s[7] >>> 4);
|
||||
b11 = (s[7] << 28) | (s[6] >>> 4);
|
||||
b42 = (s[17] << 23) | (s[16] >>> 9);
|
||||
b43 = (s[16] << 23) | (s[17] >>> 9);
|
||||
b24 = (s[26] << 25) | (s[27] >>> 7);
|
||||
b25 = (s[27] << 25) | (s[26] >>> 7);
|
||||
b6 = (s[36] << 21) | (s[37] >>> 11);
|
||||
b7 = (s[37] << 21) | (s[36] >>> 11);
|
||||
b38 = (s[47] << 24) | (s[46] >>> 8);
|
||||
b39 = (s[46] << 24) | (s[47] >>> 8);
|
||||
b30 = (s[8] << 27) | (s[9] >>> 5);
|
||||
b31 = (s[9] << 27) | (s[8] >>> 5);
|
||||
b12 = (s[18] << 20) | (s[19] >>> 12);
|
||||
b13 = (s[19] << 20) | (s[18] >>> 12);
|
||||
b44 = (s[29] << 7) | (s[28] >>> 25);
|
||||
b45 = (s[28] << 7) | (s[29] >>> 25);
|
||||
b26 = (s[38] << 8) | (s[39] >>> 24);
|
||||
b27 = (s[39] << 8) | (s[38] >>> 24);
|
||||
b8 = (s[48] << 14) | (s[49] >>> 18);
|
||||
b9 = (s[49] << 14) | (s[48] >>> 18);
|
||||
s[0] = b0 ^ (~b2 & b4);
|
||||
s[1] = b1 ^ (~b3 & b5);
|
||||
s[10] = b10 ^ (~b12 & b14);
|
||||
s[11] = b11 ^ (~b13 & b15);
|
||||
s[20] = b20 ^ (~b22 & b24);
|
||||
s[21] = b21 ^ (~b23 & b25);
|
||||
s[30] = b30 ^ (~b32 & b34);
|
||||
s[31] = b31 ^ (~b33 & b35);
|
||||
s[40] = b40 ^ (~b42 & b44);
|
||||
s[41] = b41 ^ (~b43 & b45);
|
||||
s[2] = b2 ^ (~b4 & b6);
|
||||
s[3] = b3 ^ (~b5 & b7);
|
||||
s[12] = b12 ^ (~b14 & b16);
|
||||
s[13] = b13 ^ (~b15 & b17);
|
||||
s[22] = b22 ^ (~b24 & b26);
|
||||
s[23] = b23 ^ (~b25 & b27);
|
||||
s[32] = b32 ^ (~b34 & b36);
|
||||
s[33] = b33 ^ (~b35 & b37);
|
||||
s[42] = b42 ^ (~b44 & b46);
|
||||
s[43] = b43 ^ (~b45 & b47);
|
||||
s[4] = b4 ^ (~b6 & b8);
|
||||
s[5] = b5 ^ (~b7 & b9);
|
||||
s[14] = b14 ^ (~b16 & b18);
|
||||
s[15] = b15 ^ (~b17 & b19);
|
||||
s[24] = b24 ^ (~b26 & b28);
|
||||
s[25] = b25 ^ (~b27 & b29);
|
||||
s[34] = b34 ^ (~b36 & b38);
|
||||
s[35] = b35 ^ (~b37 & b39);
|
||||
s[44] = b44 ^ (~b46 & b48);
|
||||
s[45] = b45 ^ (~b47 & b49);
|
||||
s[6] = b6 ^ (~b8 & b0);
|
||||
s[7] = b7 ^ (~b9 & b1);
|
||||
s[16] = b16 ^ (~b18 & b10);
|
||||
s[17] = b17 ^ (~b19 & b11);
|
||||
s[26] = b26 ^ (~b28 & b20);
|
||||
s[27] = b27 ^ (~b29 & b21);
|
||||
s[36] = b36 ^ (~b38 & b30);
|
||||
s[37] = b37 ^ (~b39 & b31);
|
||||
s[46] = b46 ^ (~b48 & b40);
|
||||
s[47] = b47 ^ (~b49 & b41);
|
||||
s[8] = b8 ^ (~b0 & b2);
|
||||
s[9] = b9 ^ (~b1 & b3);
|
||||
s[18] = b18 ^ (~b10 & b12);
|
||||
s[19] = b19 ^ (~b11 & b13);
|
||||
s[28] = b28 ^ (~b20 & b22);
|
||||
s[29] = b29 ^ (~b21 & b23);
|
||||
s[38] = b38 ^ (~b30 & b32);
|
||||
s[39] = b39 ^ (~b31 & b33);
|
||||
s[48] = b48 ^ (~b40 & b42);
|
||||
s[49] = b49 ^ (~b41 & b43);
|
||||
s[0] ^= RC[n];
|
||||
s[1] ^= RC[n + 1];
|
||||
}
|
||||
};
|
||||
root.sha3_str = methods.sha3_256;
|
||||
root.sha3_array_256 = methods.sha3_array_256;
|
||||
root.sha3 = methods.sha3_array_256;
|
||||
root.sha = function (data)
|
||||
{
|
||||
return meshhash(methods.sha3_256(data));
|
||||
};
|
||||
root.shaarr = function (data)
|
||||
{
|
||||
return meshhash(methods.sha3_array_256(data));
|
||||
};
|
||||
root.shabuf = function (data)
|
||||
{
|
||||
return Buffer.from(shaarr(data));
|
||||
};
|
||||
root.shabuf = function (data)
|
||||
{
|
||||
return Buffer.from(shaarr(data));
|
||||
};
|
||||
root.SHA3BUF = function (data,num)
|
||||
{
|
||||
return Buffer.from(SHA3ARR(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)
|
||||
{
|
||||
return meshhash(methods.sha3_array_256(data), num);
|
||||
};
|
||||
})();
|
||||
|
||||
function meshhash(hash,num)
|
||||
{
|
||||
var regs = [hash[3], hash[2], hash[1], hash[0]];
|
||||
var mem = [];
|
||||
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++)
|
||||
{
|
||||
var c = hash[L & 31];
|
||||
L++;
|
||||
var a = (c >> 4) & 0xF;
|
||||
var b = c & 0xF;
|
||||
var r = c & 0x3;
|
||||
switch(a)
|
||||
{
|
||||
case 0:
|
||||
regs[0] = regs[0] + regs[r];
|
||||
break;
|
||||
case 1:
|
||||
regs[0] = regs[0] * regs[r];
|
||||
break;
|
||||
case 2:
|
||||
regs[0] = regs[0] | regs[r];
|
||||
break;
|
||||
case 3:
|
||||
regs[0] = regs[0] & regs[r];
|
||||
break;
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
regs[0] = regs[0] + regs[1] + regs[2] + regs[3];
|
||||
break;
|
||||
case 8:
|
||||
if((regs[0] & 0xFFFF) < 32768 && !WasGoto)
|
||||
{
|
||||
L = 32 + L - b;
|
||||
WasGoto = 1;
|
||||
}
|
||||
break;
|
||||
case 9:
|
||||
if((regs[0] & 0xFFFF) > 32768 && !WasGoto)
|
||||
{
|
||||
L += b;
|
||||
WasGoto = 1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
regs[a % 4] = mem[b];
|
||||
}
|
||||
var index1 = regs[0] & 0xF;
|
||||
var index2 = (regs[0] >> 8) & 0xF;
|
||||
if(index1 !== index2)
|
||||
{
|
||||
var temp = mem[index1];
|
||||
mem[index1] = mem[index2];
|
||||
mem[index2] = temp;
|
||||
}
|
||||
}
|
||||
var ret = [];
|
||||
for(var i = 0; i < 16; i++)
|
||||
{
|
||||
ret[i * 2] = mem[i] & 0xFF;
|
||||
ret[i * 2 + 1] = mem[i] >> 8;
|
||||
}
|
||||
return sha3_array_256(ret);
|
||||
};
|
||||
4140
src/HTML/JS/sign-lib-min.js
vendored
Normal file
4140
src/HTML/JS/sign-lib-min.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
411
src/HTML/JS/terahashlib.js
Normal file
411
src/HTML/JS/terahashlib.js
Normal file
@@ -0,0 +1,411 @@
|
||||
/*
|
||||
* @project: TERA
|
||||
* @version: Development (beta)
|
||||
* @license: MIT (not for evil)
|
||||
* @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com]
|
||||
* Web: https://terafoundation.org
|
||||
* Twitter: https://twitter.com/terafoundation
|
||||
* Telegram: https://t.me/terafoundation
|
||||
*/
|
||||
|
||||
var DELTA_LONG_MINING = 5000;
|
||||
var BLOCKNUM_ALGO2 = 6560000;
|
||||
var BLOCKNUM_HASH_NEW = 10195000;
|
||||
var BLOCKNUM_TICKET_ALGO = 16070000;
|
||||
if (typeof global === "object") {
|
||||
global.GetHashFromSeqAddr = GetHashFromSeqAddr;
|
||||
global.CalcHashBlockFromSeqAddr = CalcHashBlockFromSeqAddr;
|
||||
global.GetHashFromNum2 = GetHashFromNum2;
|
||||
global.GetHashFromNum3 = GetHashFromNum3;
|
||||
global.GetHashFromArrNum2 = GetHashFromArrNum2;
|
||||
global.XORArr = XORArr;
|
||||
global.GetHash = GetHash;
|
||||
if (global.LOCAL_RUN || global.TEST_NETWORK) {
|
||||
BLOCKNUM_ALGO2 = 0;
|
||||
if (global.TEST_NETWORK) {
|
||||
BLOCKNUM_HASH_NEW = 100;
|
||||
BLOCKNUM_TICKET_ALGO = 0;
|
||||
}
|
||||
else {
|
||||
BLOCKNUM_HASH_NEW = 100;
|
||||
BLOCKNUM_TICKET_ALGO = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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 };
|
||||
}
|
||||
var MinerID = ReadUintFromArr(AddrHash, 0);
|
||||
var Nonce0 = ReadUintFromArr(AddrHash, 6);
|
||||
var Nonce1 = ReadUintFromArr(AddrHash, 12);
|
||||
var Nonce2 = ReadUintFromArr(AddrHash, 18);
|
||||
var DeltaNum1 = ReadUint16FromArr(AddrHash, 24);
|
||||
var DeltaNum2 = ReadUint16FromArr(AddrHash, 26);
|
||||
var PrevHashNum;
|
||||
if (PrevHash) {
|
||||
PrevHashNum = ReadUint32FromArr(PrevHash, 28);
|
||||
}
|
||||
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) {
|
||||
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];
|
||||
}
|
||||
}
|
||||
return Data;
|
||||
};
|
||||
|
||||
function GetHash(BlockHash, PrevHashNum, BlockNum, Miner, Nonce0, Nonce1, Nonce2, DeltaNum1, DeltaNum2) {
|
||||
if (DeltaNum1 > DELTA_LONG_MINING)
|
||||
DeltaNum1 = 0;
|
||||
if (DeltaNum2 > DELTA_LONG_MINING)
|
||||
DeltaNum2 = 0;
|
||||
var HashBase = GetHashFromNum2(BlockNum, PrevHashNum);
|
||||
var HashCurrent = GetHashFromArrNum2(BlockHash, Miner, Nonce0);
|
||||
var HashNonce1 = GetHashFromNum3(BlockNum - DeltaNum1, Miner, Nonce1);
|
||||
var HashNonce2 = GetHashFromNum3(BlockNum - DeltaNum2, Miner, Nonce2);
|
||||
var Hash1 = XORArr(HashBase, HashNonce1);
|
||||
var Hash2 = XORArr(HashCurrent, HashNonce2);
|
||||
var Ret = { Hash: Hash2, Hash1: Hash1, Hash2: Hash2 };
|
||||
if (CompareArr(Hash1, Hash2) > 0) {
|
||||
Ret.PowHash = Hash1;
|
||||
}
|
||||
else {
|
||||
Ret.PowHash = Hash2;
|
||||
}
|
||||
if (BlockNum >= BLOCKNUM_HASH_NEW) {
|
||||
if (BlockNum >= BLOCKNUM_TICKET_ALGO)
|
||||
Ret.Hash = sha3arr2(Hash1, Hash2);
|
||||
else
|
||||
Ret.Hash = shaarr2(Hash1, Hash2);
|
||||
}
|
||||
return Ret;
|
||||
};
|
||||
|
||||
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) {
|
||||
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++) {
|
||||
Ret[i] = Arr1[i] ^ Arr2[i];
|
||||
}
|
||||
return Ret;
|
||||
};
|
||||
|
||||
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) {
|
||||
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);
|
||||
WriteUintToArrOnPos(MeshArr, Value1, 32);
|
||||
WriteUintToArrOnPos(MeshArr, Value2, 38);
|
||||
return sha3(MeshArr);
|
||||
};
|
||||
|
||||
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);
|
||||
WriteUintToArrOnPos(MeshArr, Value3, 12);
|
||||
return sha3(MeshArr);
|
||||
};
|
||||
|
||||
function ReadUintFromArr(arr, len) {
|
||||
if (len === undefined) {
|
||||
len = arr.len;
|
||||
arr.len += 6;
|
||||
}
|
||||
var value = (arr[len + 5] << 23) * 2 + (arr[len + 4] << 16) + (arr[len + 3] << 8) + arr[len + 2];
|
||||
value = value * 256 + arr[len + 1];
|
||||
value = value * 256 + arr[len];
|
||||
return value;
|
||||
};
|
||||
|
||||
function ReadUint32FromArr(arr, len) {
|
||||
if (len === undefined) {
|
||||
len = arr.len;
|
||||
arr.len += 4;
|
||||
}
|
||||
var value = (arr[len + 3] << 23) * 2 + (arr[len + 2] << 16) + (arr[len + 1] << 8) + arr[len];
|
||||
return value;
|
||||
};
|
||||
|
||||
function ReadUint16FromArr(arr, len) {
|
||||
if (len === undefined) {
|
||||
len = arr.len;
|
||||
arr.len += 2;
|
||||
}
|
||||
var value = (arr[len + 1] << 8) + arr[len];
|
||||
return value;
|
||||
};
|
||||
|
||||
function ReadArrFromArr(arr, length) {
|
||||
var Ret = [];
|
||||
var len = arr.len;
|
||||
for (var i = 0; i < length; i++) {
|
||||
Ret[i] = arr[len + i];
|
||||
}
|
||||
arr.len += length;
|
||||
return Ret;
|
||||
};
|
||||
|
||||
function WriteUintToArr(arr, Num) {
|
||||
var len = arr.length;
|
||||
arr[len] = Num & 0xFF;
|
||||
arr[len + 1] = (Num >>> 8) & 0xFF;
|
||||
arr[len + 2] = (Num >>> 16) & 0xFF;
|
||||
arr[len + 3] = (Num >>> 24) & 0xFF;
|
||||
var NumH = Math.floor(Num / 4294967296);
|
||||
arr[len + 4] = NumH & 0xFF;
|
||||
arr[len + 5] = (NumH >>> 8) & 0xFF;
|
||||
};
|
||||
|
||||
function WriteUintToArrOnPos(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;
|
||||
var NumH = Math.floor(Num / 4294967296);
|
||||
arr[Pos + 4] = NumH & 0xFF;
|
||||
arr[Pos + 5] = (NumH >>> 8) & 0xFF;
|
||||
};
|
||||
|
||||
function WriteUint32ToArr(arr, Num) {
|
||||
var len = arr.length;
|
||||
arr[len] = Num & 0xFF;
|
||||
arr[len + 1] = (Num >>> 8) & 0xFF;
|
||||
arr[len + 2] = (Num >>> 16) & 0xFF;
|
||||
arr[len + 3] = (Num >>> 24) & 0xFF;
|
||||
};
|
||||
|
||||
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) {
|
||||
arr[Pos] = Num & 0xFF;
|
||||
arr[Pos + 1] = (Num >>> 8) & 0xFF;
|
||||
};
|
||||
|
||||
function WriteArrToArr(arr, arr2, ConstLength) {
|
||||
var len = arr.length;
|
||||
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++) {
|
||||
arr[Pos + i] = arr2[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) {
|
||||
var item = Data[key];
|
||||
if (item instanceof Buffer) {
|
||||
Data[key] = GetHexFromArr(item);
|
||||
}
|
||||
else
|
||||
if (typeof item === "object")
|
||||
ConvertBufferToStr(item);
|
||||
}
|
||||
};
|
||||
|
||||
function CopyObjValue(obj, num) {
|
||||
if (num && num > 5)
|
||||
return obj;
|
||||
var ret = {};
|
||||
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);
|
||||
ret[key] = val;
|
||||
}
|
||||
return ret;
|
||||
};
|
||||
|
||||
function CopyArr(arr1) {
|
||||
var arr2 = [];
|
||||
if (arr1)
|
||||
for (var i = 0; i < arr1.length; i++)
|
||||
arr2[i] = arr1[i];
|
||||
return arr2;
|
||||
};
|
||||
|
||||
function ParseNum(a) {
|
||||
var Num = parseInt(a);
|
||||
if (!Num)
|
||||
Num = 0;
|
||||
if (isNaN(Num))
|
||||
Num = 0;
|
||||
if (Num < 0)
|
||||
Num = 0;
|
||||
return Num;
|
||||
};
|
||||
|
||||
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) {
|
||||
if (a.length !== b.length)
|
||||
return a.length - b.length;
|
||||
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) {
|
||||
var arr = [GetArrFromValue(BlockNum), PrevHash, TreeHash];
|
||||
var SeqHash = CalcHashFromArray(arr, true);
|
||||
return SeqHash;
|
||||
};
|
||||
|
||||
function arr2(Value1, Value2) {
|
||||
var Buf = [];
|
||||
for (var n = 0; n < Value1.length; n++)
|
||||
Buf.push(Value1[n]);
|
||||
for (var n = 0; n < Value2.length; n++)
|
||||
Buf.push(Value2[n]);
|
||||
return Buf;
|
||||
};
|
||||
|
||||
function shaarr2(Value1, Value2) {
|
||||
return shaarr(arr2(Value1, Value2));
|
||||
};
|
||||
|
||||
function sha3arr2(Value1, Value2) {
|
||||
return sha3(arr2(Value1, Value2));
|
||||
};
|
||||
|
||||
function GetBlockArrFromBuffer(BufRead, Info) {
|
||||
if (!BufRead || BufRead.length < 10)
|
||||
return [];
|
||||
var BLOCK_PROCESSING_LENGTH = 8;
|
||||
var BLOCK_PROCESSING_LENGTH2 = BLOCK_PROCESSING_LENGTH * 2;
|
||||
BufRead.len = 0;
|
||||
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) {
|
||||
return [];
|
||||
}
|
||||
var PrevBlock;
|
||||
var BlockArr = [];
|
||||
for (var i = 0; i < CountLoad + BLOCK_PROCESSING_LENGTH2; i++) {
|
||||
var Block = {};
|
||||
Block.BlockNum = StartNum + i;
|
||||
if (i < BLOCK_PROCESSING_LENGTH2) {
|
||||
Block.Hash = ReadArrFromArr(BufRead, 32);
|
||||
}
|
||||
else {
|
||||
if (i === BLOCK_PROCESSING_LENGTH2) {
|
||||
Block.SumHash = ReadArrFromArr(BufRead, 32);
|
||||
Block.SumPow = ReadUintFromArr(BufRead);
|
||||
}
|
||||
Block.TreeHash = ReadArrFromArr(BufRead, 32);
|
||||
Block.AddrHash = ReadArrFromArr(BufRead, 32);
|
||||
var arr = [];
|
||||
var start = i - BLOCK_PROCESSING_LENGTH2;
|
||||
for (var n = 0; n < BLOCK_PROCESSING_LENGTH; n++) {
|
||||
var Prev = BlockArr[start + n];
|
||||
arr.push(Prev.Hash);
|
||||
}
|
||||
Block.PrevHash = CalcHashFromArray(arr, true);
|
||||
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) {
|
||||
var Str = "";
|
||||
if (Info && Info.Node)
|
||||
Str = " from " + NodeName(Info.Node);
|
||||
ToError("Error on block load: " + Block.BlockNum + Str);
|
||||
}
|
||||
return [];
|
||||
}
|
||||
CalcHashBlockFromSeqAddr(Block, Block.PrevHash);
|
||||
Block.Power = GetPowPower(Block.PowHash);
|
||||
if (PrevBlock) {
|
||||
Block.SumHash = shaarr2(PrevBlock.SumHash, Block.Hash);
|
||||
}
|
||||
PrevBlock = Block;
|
||||
}
|
||||
Block.TrCount = 0;
|
||||
Block.TrDataPos = 0;
|
||||
Block.TrDataLen = 0;
|
||||
BlockArr.push(Block);
|
||||
}
|
||||
for (var i = BlockArr.length - 1; i >= 0; i--) {
|
||||
var Block = BlockArr[i];
|
||||
if (!Block.SumHash) {
|
||||
BlockArr = BlockArr.slice(i + 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return BlockArr;
|
||||
};
|
||||
|
||||
function shaarrblock2(Value1, Value2, BlockNum) {
|
||||
return shaarrblock(arr2(Value1, Value2), BlockNum);
|
||||
};
|
||||
if (typeof global === "object") {
|
||||
global.ReadUint32FromArr = ReadUint32FromArr;
|
||||
global.ReadUintFromArr = ReadUintFromArr;
|
||||
global.ReadUint16FromArr = ReadUint16FromArr;
|
||||
global.WriteUintToArr = WriteUintToArr;
|
||||
global.WriteUint32ToArr = WriteUint32ToArr;
|
||||
global.WriteUint32ToArrOnPos = WriteUint32ToArrOnPos;
|
||||
global.WriteUint16ToArrOnPos = WriteUint16ToArrOnPos;
|
||||
global.WriteUintToArrOnPos = WriteUintToArrOnPos;
|
||||
global.WriteArrToArr = WriteArrToArr;
|
||||
global.WriteArrToArrOnPos = WriteArrToArrOnPos;
|
||||
global.WriteArrToArrHOnPos = WriteArrToArrHOnPos;
|
||||
global.ConvertBufferToStr = ConvertBufferToStr;
|
||||
global.CopyObjValue = CopyObjValue;
|
||||
global.CopyArr = CopyArr;
|
||||
global.ParseNum = ParseNum;
|
||||
global.CompareArr = CompareArr;
|
||||
global.CompareArrL = CompareArrL;
|
||||
global.shaarr2 = shaarr2;
|
||||
global.sha3arr2 = sha3arr2;
|
||||
global.arr2 = arr2;
|
||||
global.GetBlockArrFromBuffer = GetBlockArrFromBuffer;
|
||||
global.shaarrblock2 = shaarrblock2;
|
||||
}
|
||||
else
|
||||
if (typeof window === "object") {
|
||||
global = window;
|
||||
}
|
||||
10
src/HTML/JS/tx-lib.js
Normal file
10
src/HTML/JS/tx-lib.js
Normal file
@@ -0,0 +1,10 @@
|
||||
/*
|
||||
* @project: TERA
|
||||
* @version: Development (beta)
|
||||
* @license: MIT (not for evil)
|
||||
* @copyright: Yuriy Ivanov 2017-2019 [progr76@gmail.com]
|
||||
* Web: https://terafoundation.org
|
||||
* Twitter: https://twitter.com/terafoundation
|
||||
* Telegram: https://web.telegram.org/#/im?p=@terafoundation
|
||||
*/
|
||||
|
||||
706
src/HTML/JS/wallet-lib.js
Normal file
706
src/HTML/JS/wallet-lib.js
Normal file
@@ -0,0 +1,706 @@
|
||||
/*
|
||||
* @project: TERA
|
||||
* @version: Development (beta)
|
||||
* @license: MIT (not for evil)
|
||||
* @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com]
|
||||
* Web: https://terafoundation.org
|
||||
* Twitter: https://twitter.com/terafoundation
|
||||
* Telegram: https://t.me/terafoundation
|
||||
*/
|
||||
|
||||
var PayList = [];
|
||||
var AttachItem;
|
||||
var MapAccounts = {};
|
||||
var LoadMapAfter = {};
|
||||
var MapCheckTransaction = {};
|
||||
var CanSendTransaction = 1;
|
||||
var CurrentTR = {};
|
||||
var MaxBlockNum = 0;
|
||||
var DelList = {};
|
||||
var WasAccountsDataStr;
|
||||
|
||||
function SetAccountsData(Data,AccountsDataStr)
|
||||
{
|
||||
if(!Data || !Data.result)
|
||||
return ;
|
||||
if($("idBtRun"))
|
||||
$("idBtRun").style.display = (Data.arr.length ? '' : 'none');
|
||||
if(AccountsDataStr === WasAccountsDataStr)
|
||||
return ;
|
||||
WasAccountsDataStr = AccountsDataStr;
|
||||
var arr = Data.arr;
|
||||
var Select = $("idAccount");
|
||||
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++)
|
||||
{
|
||||
var Item = arr[i];
|
||||
Item.MyAccount = true;
|
||||
var Num = ParseNum(Item.Num);
|
||||
if(!MapAccounts[Num])
|
||||
MapAccounts[Num] = {};
|
||||
CopyObjKeys(MapAccounts[Num], Item);
|
||||
var option = Select.options[i];
|
||||
var StrText = GetAccountText(Item, Num, 1);
|
||||
if(option.text !== StrText)
|
||||
CheckNameAccTo();
|
||||
option.value = Num;
|
||||
option.text = StrText;
|
||||
}
|
||||
var CurentValue = LoadMapAfter["idAccount"];
|
||||
if(CurentValue)
|
||||
{
|
||||
Select.value = CurentValue;
|
||||
delete LoadMapAfter["idAccount"];
|
||||
}
|
||||
SetCurCurencyName();
|
||||
};
|
||||
|
||||
function CurTransactionToForm(bForce)
|
||||
{
|
||||
var Item = $("idTransaction");
|
||||
if(Item && (Item.className === "" || bForce))
|
||||
Item.value = GetJSONFromTransaction(CurrentTR);
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
var Item = Data.arr[0];
|
||||
Item.UpdateData = Date.now();
|
||||
MapAccounts[Item.Num] = Item;
|
||||
SetNameAccTo();
|
||||
}
|
||||
});
|
||||
}
|
||||
SetNameAccTo();
|
||||
};
|
||||
|
||||
function SetNameAccTo()
|
||||
{
|
||||
var Str = "";
|
||||
var ToID = ParseNum($("idTo").value);
|
||||
var Item = MapAccounts[ToID];
|
||||
var element = $("idNameTo");
|
||||
var StrTo = GetAccountText(Item, ToID, 1);
|
||||
if(!element)
|
||||
{
|
||||
element = $("idNameTo2");
|
||||
}
|
||||
else
|
||||
{
|
||||
StrTo = "To: " + StrTo;
|
||||
}
|
||||
if(element.innerText !== StrTo)
|
||||
{
|
||||
element.innerText = StrTo;
|
||||
if(Item && Item.MyAccount)
|
||||
element.className = "smallbold";
|
||||
else
|
||||
element.className = "";
|
||||
}
|
||||
};
|
||||
|
||||
function GetAccountText(Item,Num,bGetSum)
|
||||
{
|
||||
if(Item)
|
||||
{
|
||||
var text = Item.Name;
|
||||
if(!text || text.length === 0)
|
||||
text = Num;
|
||||
else
|
||||
text = "" + Num + ". " + text;
|
||||
if(bGetSum)
|
||||
{
|
||||
var StrSum = SUM_TO_STRING(Item.Value, Item.Currency);
|
||||
text += " (" + StrSum + ")";
|
||||
}
|
||||
return text;
|
||||
}
|
||||
else
|
||||
{
|
||||
return Num;
|
||||
}
|
||||
};
|
||||
|
||||
function OnEditIdTo()
|
||||
{
|
||||
CheckNameAccTo();
|
||||
OnEditTransactionFields();
|
||||
};
|
||||
|
||||
function OnEditTransactionFields()
|
||||
{
|
||||
if(IsVisibleBlock("edit_transaction"))
|
||||
CreateTransaction();
|
||||
SetCurCurencyName();
|
||||
SaveValues();
|
||||
};
|
||||
|
||||
function SetCurCurencyName()
|
||||
{
|
||||
var idCoin = $("idCoinName");
|
||||
if(!idCoin)
|
||||
return ;
|
||||
var Num = ParseNum($("idAccount").value);
|
||||
var Item = MapAccounts[Num];
|
||||
if(Item)
|
||||
{
|
||||
idCoin.innerText = CurrencyName(Item.Currency);
|
||||
}
|
||||
};
|
||||
|
||||
function CreateTransaction(F,CheckErr,Run)
|
||||
{
|
||||
CheckNameAccTo();
|
||||
CheckSending();
|
||||
var FromID = ParseNum($("idAccount").value);
|
||||
if(CheckErr && FromID === 0)
|
||||
{
|
||||
SetError("Select valid 'From account'");
|
||||
return ;
|
||||
}
|
||||
var StrTo = $("idTo").value.trim();
|
||||
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))
|
||||
{
|
||||
ToID = 0;
|
||||
ToPubKey = StrTo;
|
||||
if(ToPubKey === PubKeyStr)
|
||||
bFindAcc = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(CheckErr)
|
||||
SetError("Valid 'Pay to' - required!");
|
||||
return ;
|
||||
}
|
||||
}
|
||||
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)
|
||||
{
|
||||
var StrTER = StrSum.substr(0, indDot);
|
||||
var StrCENT = StrSum.substr(indDot + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
var StrTER = StrSum;
|
||||
var StrCENT = "0";
|
||||
}
|
||||
StrCENT = StrCENT + "000000000";
|
||||
var Coin = {SumCOIN:ParseNum(StrTER), SumCENT:ParseNum(StrCENT.substr(0, 9))};
|
||||
var OperationID = 0;
|
||||
var Item = MapAccounts[FromID];
|
||||
if(Item)
|
||||
{
|
||||
OperationID = Item.Value.OperationID;
|
||||
}
|
||||
var AttachBody = [];
|
||||
if(AttachItem)
|
||||
{
|
||||
AttachBody = AttachItem.Data.Body;
|
||||
if(!AttachBody)
|
||||
AttachBody = [];
|
||||
}
|
||||
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, };
|
||||
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(F)
|
||||
F(CurrentTR);
|
||||
return ;
|
||||
}
|
||||
CurrentTR = TR;
|
||||
GetSignTransaction(TR, "", function (TR)
|
||||
{
|
||||
CurTransactionToForm(true);
|
||||
if(F)
|
||||
F(TR);
|
||||
});
|
||||
};
|
||||
|
||||
function SignJSON(F)
|
||||
{
|
||||
if($("idSignJSON").disabled)
|
||||
return ;
|
||||
var TR = GetTransactionFromJSON();
|
||||
if(!TR)
|
||||
return ;
|
||||
CurrentTR = TR;
|
||||
GetSignTransaction(TR, "", function (TR)
|
||||
{
|
||||
CurTransactionToForm(true);
|
||||
if(F)
|
||||
F();
|
||||
});
|
||||
};
|
||||
|
||||
function CheckSending(bToStatus)
|
||||
{
|
||||
MaxBlockNum = GetCurrentBlockNumByTime();
|
||||
var CanSend = IsPrivateMode();
|
||||
var StrButton = "Send";
|
||||
var StrButtonSign = "Sign JSON";
|
||||
if(!CanSend)
|
||||
{
|
||||
StrButton = " ";
|
||||
StrButtonSign = " ";
|
||||
}
|
||||
if(CanSend)
|
||||
{
|
||||
var FromID = ParseNum($("idAccount").value);
|
||||
var Item = MapAccounts[FromID];
|
||||
if(Item && Item.NextSendTime && Item.NextSendTime > MaxBlockNum)
|
||||
{
|
||||
if(bToStatus)
|
||||
SetStatus("Transaction was sending. Wait... (" + Item.LastTransactionText + ")");
|
||||
CanSend = false;
|
||||
StrButton = "Wait...";
|
||||
}
|
||||
}
|
||||
$("idSendButton").disabled = (!CanSend);
|
||||
$("idSendButton").value = StrButton;
|
||||
$("idSignJSON").disabled = (!CanSend);
|
||||
$("idSignJSON").value = StrButtonSign;
|
||||
return CanSend;
|
||||
};
|
||||
|
||||
function AddWhiteList()
|
||||
{
|
||||
var ToID = ParseNum($("idTo").value);
|
||||
if(ToID && $("idWhiteOnSend").checked)
|
||||
Storage.setItem("White:" + ToID, 1);
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
SendMoney();
|
||||
}
|
||||
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)
|
||||
{
|
||||
$("idOnSendText").innerHTML += "<BR><DIV style='color: yellow;'>WARNING: You are about to send a very large amount!</DIV>";
|
||||
}
|
||||
SetVisibleBlock("idBlockOnSend", 1);
|
||||
SetImg(this, 'idBlockOnSend');
|
||||
}
|
||||
};
|
||||
|
||||
function SendMoney2()
|
||||
{
|
||||
AddWhiteList();
|
||||
SendMoney();
|
||||
};
|
||||
|
||||
function SendMoney()
|
||||
{
|
||||
if(!CanSendTransaction)
|
||||
{
|
||||
SetError("Can't Send transaction");
|
||||
return ;
|
||||
}
|
||||
CheckSending(true);
|
||||
if($("idSendButton").disabled)
|
||||
return ;
|
||||
SetVisibleBlock("idBlockOnSend", 0);
|
||||
CreateTransaction(SendMoneyTR, true, ClearAttach);
|
||||
};
|
||||
|
||||
function GetJSONFromTransaction(TR)
|
||||
{
|
||||
var TR2 = JSON.parse(JSON.stringify(TR));
|
||||
for(var i = 0; i < TR2.To.length; i++)
|
||||
{
|
||||
var Item = TR2.To[i];
|
||||
Item.PubKey = GetHexFromArr(Item.PubKey);
|
||||
}
|
||||
TR2.Body = GetHexFromArr(TR2.Body);
|
||||
TR2.Sign = GetHexFromArr(TR2.Sign);
|
||||
var Str = JSON.stringify(TR2, "", 4);
|
||||
return Str;
|
||||
};
|
||||
|
||||
function GetTransactionFromJSON()
|
||||
{
|
||||
var Str = $("idTransaction").value;
|
||||
try
|
||||
{
|
||||
var TR = JSON.parse(Str);
|
||||
}
|
||||
catch(e)
|
||||
{
|
||||
SetError(e);
|
||||
return undefined;
|
||||
}
|
||||
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)
|
||||
{
|
||||
Item.SumCOIN = Item.SumTER;
|
||||
delete Item.SumTER;
|
||||
}
|
||||
}
|
||||
TR.Body = GetArrFromHex(TR.Body);
|
||||
TR.Sign = GetArrFromHex(TR.Sign);
|
||||
return TR;
|
||||
};
|
||||
|
||||
function SendMoneyJSON()
|
||||
{
|
||||
if(!CanSendTransaction)
|
||||
{
|
||||
SetError("Can't Send transaction");
|
||||
return ;
|
||||
}
|
||||
var TR = GetTransactionFromJSON();
|
||||
if(!TR)
|
||||
return ;
|
||||
SendMoneyTR(TR);
|
||||
};
|
||||
|
||||
function SignAndSendFromJSON()
|
||||
{
|
||||
SignJSON(SendMoneyJSON);
|
||||
};
|
||||
|
||||
function GetTransactionText(TR,key)
|
||||
{
|
||||
var Str;
|
||||
if(TR)
|
||||
{
|
||||
if(TR.Type === TYPE_TRANSACTION_CREATE)
|
||||
{
|
||||
Str = "New account " + TR.Name.substr(0, 20);
|
||||
}
|
||||
else
|
||||
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++)
|
||||
{
|
||||
var Item = TR.To[i];
|
||||
if(Item.ID === TR.FromID || MapItem[Item.ID])
|
||||
continue;
|
||||
MapItem[Item.ID] = 1;
|
||||
ADD(ValueTotal, Item);
|
||||
if(i === 0)
|
||||
Str += "[";
|
||||
if(Str.length < 16)
|
||||
{
|
||||
if(i > 0)
|
||||
Str += ",";
|
||||
if(Item.ID || (Item.PubKey && Item.PubKey.length !== 66))
|
||||
Str += Item.ID;
|
||||
else
|
||||
Str += GetHexFromArr(Item.PubKey).substr(0, 8);
|
||||
}
|
||||
else
|
||||
if(Str.substr(Str.length - 1) !== ".")
|
||||
Str += "...";
|
||||
}
|
||||
Str += "] " + SUM_TO_STRING(ValueTotal);
|
||||
Str += " " + (TR.Description.substr(0, 20)).replace(/\n/g, "");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(key)
|
||||
Str = key;
|
||||
else
|
||||
Str = "";
|
||||
}
|
||||
return Str;
|
||||
};
|
||||
|
||||
function SendMoneyTR(TR)
|
||||
{
|
||||
var Body = GetArrFromTR(TR);
|
||||
WriteArr(Body, TR.Sign, 64);
|
||||
Body.length += 12;
|
||||
SendTransaction(Body, TR, undefined, function (Err,TR,Body)
|
||||
{
|
||||
if(Err)
|
||||
return ;
|
||||
var Item = MapAccounts[TR.FromID];
|
||||
if(Item)
|
||||
{
|
||||
var key = GetHexFromArr(sha3(Body));
|
||||
var BlockNum = GetCurrentBlockNumByTime();
|
||||
Item.LastTransactionText = GetTransactionText(TR);
|
||||
Item.NextSendTime = BlockNum + 10;
|
||||
MapCheckTransaction[key] = Item;
|
||||
CheckSending();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function ClearTransaction()
|
||||
{
|
||||
PayList = [];
|
||||
ClearAttach();
|
||||
CheckSendList(1);
|
||||
var arr = ["idAccount", "idTo", "idSumSend", "idDescription"];
|
||||
for(var i = 0; i < arr.length; i++)
|
||||
{
|
||||
$(arr[i]).value = "";
|
||||
}
|
||||
SaveValues();
|
||||
CreateTransaction();
|
||||
};
|
||||
|
||||
function StartEditTransactionJSON()
|
||||
{
|
||||
var Item = $("idTransaction");
|
||||
Item.className = "smallbold";
|
||||
};
|
||||
|
||||
function EditJSONTransaction()
|
||||
{
|
||||
var name = "edit_transaction";
|
||||
var Item = $("idTransaction");
|
||||
if(IsVisibleBlock(name))
|
||||
{
|
||||
SetVisibleBlock(name, false);
|
||||
Item.className = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
CreateTransaction();
|
||||
SetVisibleBlock(name, true);
|
||||
Item.className = "";
|
||||
}
|
||||
};
|
||||
var glNumPayCount = 0;
|
||||
|
||||
function GetInvoiceHTML(item,onclick,classstr)
|
||||
{
|
||||
if(!item.num)
|
||||
{
|
||||
glNumPayCount++;
|
||||
item.num = glNumPayCount;
|
||||
}
|
||||
var idname = "idSendInvoice" + item.num;
|
||||
var value = "";
|
||||
if(item.Data.Amount)
|
||||
value += "<B>" + item.Data.Amount + "</B> Tera";
|
||||
else
|
||||
value += "<B style='color:green'>No pay</B>";
|
||||
value += "
" + item.num + ". " + item.Data.name;
|
||||
return "<button id='" + idname + "' onclick='" + onclick + "' class='" + classstr + "'>" + value + "</button>";
|
||||
};
|
||||
|
||||
function AddSendList(item)
|
||||
{
|
||||
PayList.push({Data:item});
|
||||
};
|
||||
|
||||
function CheckSendList(bRedraw)
|
||||
{
|
||||
TitleWarning = PayList.length;
|
||||
if(AttachItem)
|
||||
TitleWarning++;
|
||||
var Str = Storage.getItem("InvoiceList");
|
||||
if(!Str && !bRedraw)
|
||||
return ;
|
||||
if(!bRedraw)
|
||||
{
|
||||
SelectTab("TabSend");
|
||||
}
|
||||
if(Str)
|
||||
{
|
||||
var arr = JSON.parse(Str);
|
||||
for(var i = 0; i < arr.length; i++)
|
||||
{
|
||||
AddSendList(arr[i]);
|
||||
}
|
||||
Storage.setItem("InvoiceList", "");
|
||||
}
|
||||
var idList = $("idSendList");
|
||||
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++)
|
||||
{
|
||||
var item = PayList[i];
|
||||
idList.innerHTML += GetInvoiceHTML(item, "UseInvoice(" + i + ")", "btinvoice");
|
||||
}
|
||||
if(AttachItem === undefined)
|
||||
UseInvoice(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
idList.innerHTML = "";
|
||||
}
|
||||
};
|
||||
setInterval(CheckSendList, 200);
|
||||
|
||||
function UseInvoice(Num)
|
||||
{
|
||||
var item = PayList[Num];
|
||||
if(item.Data.From)
|
||||
$("idAccount").value = item.Data.From;
|
||||
$("idTo").value = item.Data.To;
|
||||
$("idSumSend").value = item.Data.Amount;
|
||||
$("idDescription").value = item.Data.Description;
|
||||
PayList.splice(Num, 1);
|
||||
AttachItem = item;
|
||||
$("idAttach").innerHTML = GetInvoiceHTML(AttachItem, "OpenAttach()", "btinvoice btinvoice_use");
|
||||
CheckSendList(1);
|
||||
};
|
||||
|
||||
function ClearAttach()
|
||||
{
|
||||
AttachItem = undefined;
|
||||
if($("idAttach"))
|
||||
$("idAttach").innerHTML = "";
|
||||
};
|
||||
|
||||
function OpenAttach()
|
||||
{
|
||||
if(AttachItem)
|
||||
{
|
||||
var Data2 = JSON.parse(JSON.stringify(AttachItem.Data));
|
||||
if(Data2.Body)
|
||||
Data2.Body = GetHexFromArr(Data2.Body);
|
||||
delete Data2.TransferSecret;
|
||||
alert("DATA:\n" + JSON.stringify(Data2, "", 4));
|
||||
}
|
||||
};
|
||||
var CURRENCY, PUBKEY, NAME, SMART;
|
||||
|
||||
function SendTrCreateAccWait(Currency,PubKey,Name,Smart)
|
||||
{
|
||||
CURRENCY = Currency;
|
||||
PUBKEY = PubKey;
|
||||
NAME = Name;
|
||||
SMART = Smart;
|
||||
setTimeout(function ()
|
||||
{
|
||||
SendTrCreateAcc(CURRENCY, PUBKEY, NAME, 0, SMART, 0, 0);
|
||||
}, 50);
|
||||
};
|
||||
|
||||
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,
|
||||
};
|
||||
AddToInvoiceList(Item);
|
||||
}
|
||||
else
|
||||
{
|
||||
SendTransaction(Body, TR);
|
||||
}
|
||||
$("idAccountName").value = "";
|
||||
CancelCreateAccount();
|
||||
};
|
||||
|
||||
function ChangeSmart(NumAccount,WasSmart)
|
||||
{
|
||||
if(!IsPrivateMode())
|
||||
{
|
||||
SetError("Pls, open wallet");
|
||||
return 0;
|
||||
}
|
||||
var Result = prompt("Enter smart number:", 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)
|
||||
{
|
||||
SetSmartToAccount(NumAccount, Smart);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetError("Error smart number");
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
SetSmartToAccount(NumAccount, Smart);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function SetSmartToAccount(NumAccount,Smart)
|
||||
{
|
||||
var OperationID = 0;
|
||||
var Item = MapAccounts[NumAccount];
|
||||
if(Item)
|
||||
{
|
||||
OperationID = Item.Value.OperationID;
|
||||
}
|
||||
OperationID++;
|
||||
var TR = {Type:140, Account:NumAccount, Smart:Smart, FromNum:NumAccount, Reserve:[], OperationID:OperationID, Sign:"", };
|
||||
var Body = [];
|
||||
WriteByte(Body, TR.Type);
|
||||
WriteUint(Body, TR.Account);
|
||||
WriteUint32(Body, TR.Smart);
|
||||
WriteArr(Body, TR.Reserve, 10);
|
||||
WriteUint(Body, TR.FromNum);
|
||||
WriteUint(Body, TR.OperationID);
|
||||
SendTrArrayWithSign(Body, TR.Account, TR);
|
||||
};
|
||||
|
||||
function CheckLengthAccDesription(name,Length)
|
||||
{
|
||||
var Str = $(name).value.substr(0, Length + 1);
|
||||
var arr = toUTF8Array(Str);
|
||||
var Len = Length - arr.length;
|
||||
if(Len < 0)
|
||||
SetError("Bad length");
|
||||
else
|
||||
SetStatus("Lost: " + Len + " bytes");
|
||||
};
|
||||
542
src/HTML/JS/wallet-node.js
Normal file
542
src/HTML/JS/wallet-node.js
Normal file
@@ -0,0 +1,542 @@
|
||||
/*
|
||||
* @project: TERA
|
||||
* @version: Development (beta)
|
||||
* @license: MIT (not for evil)
|
||||
* @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com]
|
||||
* Web: https://terafoundation.org
|
||||
* Twitter: https://twitter.com/terafoundation
|
||||
* Telegram: https://t.me/terafoundation
|
||||
*/
|
||||
|
||||
|
||||
function SavePrivateKey()
|
||||
{
|
||||
var Select = document.getElementById("idTypeKey");
|
||||
if(Select.value === "brain")
|
||||
{
|
||||
ConvertToPrivateKey();
|
||||
return ;
|
||||
}
|
||||
var Str = document.getElementById("idKeyNew").value;
|
||||
Str = Str.trim();
|
||||
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)))
|
||||
{
|
||||
SetError("Error: Length must 66 HEX chars. (Length=" + Str.length + ")");
|
||||
return ;
|
||||
}
|
||||
if(Select.value === "private" && PrivKeyStr !== Str)
|
||||
SetStatus("Changed privat key");
|
||||
else
|
||||
if(Select.value === "public" && PubKeyStr !== Str)
|
||||
SetStatus("Changed public key");
|
||||
GetData("SetWalletKey", Str, function (Data)
|
||||
{
|
||||
if(Data && Data.result === 1)
|
||||
{
|
||||
if(Select.value === "private")
|
||||
SelectStyle("styleContrast1");
|
||||
else
|
||||
if(Select.value === "public")
|
||||
SelectStyle("styleContrast2");
|
||||
SetVisibleEditKeys(0);
|
||||
UpdatesData();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function CreateCheckPoint()
|
||||
{
|
||||
if(!ServerBlockNumDB || ServerBlockNumDB < 16)
|
||||
{
|
||||
SetError("Not set ServerBlockNumDB");
|
||||
return ;
|
||||
}
|
||||
var BlockNum = ServerBlockNumDB - 10;
|
||||
SetCheckPoint(BlockNum);
|
||||
};
|
||||
|
||||
function UseAutoCheckPoint()
|
||||
{
|
||||
var Set = $("idUseAutoCheckPoint").checked;
|
||||
var Period = ParseNum($("idPeriodAutoCheckPoint").value);
|
||||
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)
|
||||
{
|
||||
SetStatus(Data.text, !Data.result);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function SetCodeVersionJSON()
|
||||
{
|
||||
var Data = JSON.parse(JSON.stringify(CONFIG_DATA.CODE_VERSION));
|
||||
if(!Data.BlockNum)
|
||||
{
|
||||
Data.LevelUpdate = 160;
|
||||
}
|
||||
Data.BlockNum = CONFIG_DATA.CurBlockNum;
|
||||
Data.addrArr = GetHexFromArr(Data.addrArr);
|
||||
Data.Hash = GetHexFromArr(Data.Hash);
|
||||
Data.Sign = GetHexFromArr(Data.Sign);
|
||||
Data.Hash = undefined;
|
||||
Data.Sign = undefined;
|
||||
Data.StartLoadVersionNum = undefined;
|
||||
var Str = JSON.stringify(Data, "", 2);
|
||||
document.getElementById("idDevService").value = Str;
|
||||
};
|
||||
|
||||
function SetCorrTimeJSON()
|
||||
{
|
||||
var AutoDelta = parseInt(document.getElementById("idDevValue").value);
|
||||
var Data = {Num:CONFIG_DATA.CurBlockNum, bUse:1, bAddTime:1};
|
||||
if(AutoDelta < 0)
|
||||
{
|
||||
AutoDelta = - AutoDelta;
|
||||
Data.bAddTime = 0;
|
||||
}
|
||||
Data.DeltaTime = 40;
|
||||
Data.StartBlockNum = ServerCurBlockNum + 10;
|
||||
Data.EndBlockNum = Data.StartBlockNum + Math.floor(AutoDelta / Data.DeltaTime);
|
||||
var Str = JSON.stringify(Data, "", 2);
|
||||
document.getElementById("idDevService").value = Str;
|
||||
};
|
||||
|
||||
function SetNetConstJSON()
|
||||
{
|
||||
var Str = JSON.stringify(Data, "", 2);
|
||||
document.getElementById("idDevService").value = Str;
|
||||
var Data = {MaxTrasactionLimit:CONFIG_DATA.MAX_TRANSACTION_LIMIT};
|
||||
var Str = JSON.stringify(Data, "", 2);
|
||||
document.getElementById("idDevService").value = Str;
|
||||
};
|
||||
|
||||
function SetNewCodeVersion()
|
||||
{
|
||||
try
|
||||
{
|
||||
var Data = JSON.parse(document.getElementById("idDevService").value);
|
||||
}
|
||||
catch(e)
|
||||
{
|
||||
SetError("Error format setting data");
|
||||
return ;
|
||||
}
|
||||
Data.addrArr = GetArrFromHex(Data.addrArr);
|
||||
GetData("SetNewCodeVersion", Data, function (Data)
|
||||
{
|
||||
if(Data)
|
||||
{
|
||||
SetStatus(Data.text, !Data.result);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function StartTimeCorrect()
|
||||
{
|
||||
try
|
||||
{
|
||||
var Data = JSON.parse(document.getElementById("idDevService").value);
|
||||
}
|
||||
catch(e)
|
||||
{
|
||||
SetError("Error format setting data");
|
||||
return ;
|
||||
}
|
||||
GetData("SetCheckDeltaTime", Data, function (Data)
|
||||
{
|
||||
if(Data)
|
||||
{
|
||||
SetStatus(Data.text, !Data.result);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function StartNetConst()
|
||||
{
|
||||
try
|
||||
{
|
||||
var Data = JSON.parse(document.getElementById("idDevService").value);
|
||||
}
|
||||
catch(e)
|
||||
{
|
||||
SetError("Error format setting data");
|
||||
return ;
|
||||
}
|
||||
GetData("SetCheckNetConstant", Data, function (Data)
|
||||
{
|
||||
if(Data)
|
||||
{
|
||||
SetStatus(Data.text, !Data.result);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function RestartNode()
|
||||
{
|
||||
GetData("RestartNode", {});
|
||||
DoRestartWallet();
|
||||
};
|
||||
|
||||
function UseAutoUpdate()
|
||||
{
|
||||
var Data = {USE_AUTO_UPDATE:document.getElementById("idAutoUpdate").checked, DoMining:1};
|
||||
GetData("SaveConstant", Data, function (Data)
|
||||
{
|
||||
if(Data && Data.result)
|
||||
{
|
||||
SetStatus("Save AutoUpdate: " + document.getElementById("idAutoUpdate").checked);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
SetStatus("Save Mining: " + document.getElementById("idUseMining").checked);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function SetPercentMining()
|
||||
{
|
||||
var Data = {POW_MAX_PERCENT:document.getElementById("idPercentMining").value};
|
||||
GetData("SaveConstant", Data, function (Data)
|
||||
{
|
||||
if(Data && Data.result)
|
||||
{
|
||||
SetStatus("Save Mining percent: " + document.getElementById("idPercentMining").value + " %");
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function MiningSets()
|
||||
{
|
||||
var name = "edit_mining_set";
|
||||
if(IsVisibleBlock(name))
|
||||
{
|
||||
SetVisibleBlock(name, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVisibleBlock(name, true);
|
||||
document.getElementById("idMiningAccount").value = MiningAccount;
|
||||
document.getElementById("idMiningAccount").focus();
|
||||
}
|
||||
};
|
||||
|
||||
function SaveMiningSet(Value)
|
||||
{
|
||||
SetVisibleBlock("edit_mining_set", false);
|
||||
if(Value)
|
||||
{
|
||||
MiningAccount = Value;
|
||||
}
|
||||
else
|
||||
{
|
||||
MiningAccount = ParseNum(document.getElementById("idMiningAccount").value);
|
||||
}
|
||||
GetData("SetMining", MiningAccount, function (Data)
|
||||
{
|
||||
});
|
||||
};
|
||||
|
||||
function CancalMiningSet()
|
||||
{
|
||||
var name = "edit_mining_set";
|
||||
SetVisibleBlock(name, false);
|
||||
};
|
||||
var WasHistoryMaxNum;
|
||||
var WasLastNumSound = 0;
|
||||
|
||||
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)
|
||||
{
|
||||
var arr = Data.arr;
|
||||
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)
|
||||
{
|
||||
WasLastNumSound = Item.BlockNum;
|
||||
$("sound_coin").play();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function DoRestartWallet()
|
||||
{
|
||||
SetStatus("<H1 align='center' style='color:blue'>Restarting program...</H1>");
|
||||
if(!WasSetRestart)
|
||||
{
|
||||
WasSetRestart = 1;
|
||||
setTimeout(function ()
|
||||
{
|
||||
window.location.reload();
|
||||
}, 10 * 1000);
|
||||
}
|
||||
};
|
||||
|
||||
function SetArrLog(arr)
|
||||
{
|
||||
var Str = "";
|
||||
var bFindAccount = 0;
|
||||
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)
|
||||
{
|
||||
var TR = MapSendTransaction[Item.key];
|
||||
if(TR)
|
||||
{
|
||||
if(Item.text.indexOf("Add to blockchain") >= 0)
|
||||
{
|
||||
if(TR.bFindAcc)
|
||||
{
|
||||
bFindAccount = 1;
|
||||
TR.bFindAcc = 0;
|
||||
}
|
||||
if(TR.Run)
|
||||
{
|
||||
TR.Run(TR);
|
||||
TR.Run = undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
var Account = MapCheckTransaction[Item.key];
|
||||
if(Account)
|
||||
{
|
||||
delete MapCheckTransaction[Item.key];
|
||||
Account.NextSendTime = 0;
|
||||
}
|
||||
}
|
||||
Str = Str + info + "\n";
|
||||
}
|
||||
SetStatusFromServer(Str);
|
||||
CheckSending();
|
||||
if(bFindAccount)
|
||||
{
|
||||
FindMyAccounts();
|
||||
}
|
||||
};
|
||||
|
||||
function SetAutoMining()
|
||||
{
|
||||
setTimeout(function ()
|
||||
{
|
||||
var Select = $("idAccount");
|
||||
if(Select.options.length)
|
||||
{
|
||||
SaveMiningSet(Select.options[Select.options.length - 1].value);
|
||||
}
|
||||
}, 100);
|
||||
};
|
||||
|
||||
function ViewNetworkMode()
|
||||
{
|
||||
if(IsVisibleBlock('idNetworkView'))
|
||||
{
|
||||
SetVisibleBlock('idNetworkView', false);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVisibleBlock('idNetworkView', true);
|
||||
var Mode = CONFIG_DATA.CONSTANTS.NET_WORK_MODE;
|
||||
if(!Mode)
|
||||
{
|
||||
Mode = {};
|
||||
Mode.UseDirectIP = true;
|
||||
if(INTERNET_IP_FROM_STUN)
|
||||
Mode.ip = INTERNET_IP_FROM_STUN;
|
||||
else
|
||||
Mode.ip = SERVER_IP;
|
||||
Mode.port = SERVER_PORT;
|
||||
}
|
||||
document.getElementById("idUseDirectIP").checked = Mode.UseDirectIP;
|
||||
document.getElementById("idIP").value = Mode.ip;
|
||||
document.getElementById("idPort").value = Mode.port;
|
||||
if(!Mode.NodeWhiteList)
|
||||
Mode.NodeWhiteList = "";
|
||||
document.getElementById("idNodeWhiteList").value = Mode.NodeWhiteList;
|
||||
}
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
SetStatus("Set net work params OK");
|
||||
SetVisibleBlock('idNetworkView', false);
|
||||
}
|
||||
});
|
||||
if(bRestart)
|
||||
DoRestartWallet();
|
||||
};
|
||||
|
||||
function ViewConstant()
|
||||
{
|
||||
if(IsVisibleBlock('idConstantView'))
|
||||
{
|
||||
SetVisibleBlock('idConstantView', false);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVisibleBlock('idConstantView', true);
|
||||
document.getElementById("idConstant").value = JSON.stringify(CONFIG_DATA.CONSTANTS, "", 2);
|
||||
}
|
||||
};
|
||||
|
||||
function SaveConstant(bRestart)
|
||||
{
|
||||
try
|
||||
{
|
||||
var Data = JSON.parse(document.getElementById("idConstant").value);
|
||||
}
|
||||
catch(e)
|
||||
{
|
||||
SetError("Error JSON format setting constant");
|
||||
return ;
|
||||
}
|
||||
Data.DoRestartNode = bRestart;
|
||||
GetData("SaveConstant", Data, function (Data)
|
||||
{
|
||||
if(Data && Data.result)
|
||||
{
|
||||
SetStatus("Save Constant OK");
|
||||
SetVisibleBlock('idConstantView', false);
|
||||
}
|
||||
});
|
||||
if(bRestart)
|
||||
DoRestartWallet();
|
||||
};
|
||||
|
||||
function ViewRemoteParams()
|
||||
{
|
||||
if(IsVisibleBlock('idRemoteView'))
|
||||
{
|
||||
SetVisibleBlock('idRemoteView', false);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetVisibleBlock('idRemoteView', true);
|
||||
if(CONFIG_DATA.HTTPPort)
|
||||
document.getElementById("idHTTPPort").value = CONFIG_DATA.HTTPPort;
|
||||
document.getElementById("idHTTPPassword").value = CONFIG_DATA.HTTPPassword;
|
||||
}
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
if(!PrevHTTPPassword && HTTPPassword)
|
||||
window.location.reload();
|
||||
else
|
||||
{
|
||||
SetVisibleBlock('idRemoteView', false);
|
||||
SetStatus("Set HTTP params OK");
|
||||
}
|
||||
});
|
||||
if(bRestart)
|
||||
DoRestartWallet();
|
||||
};
|
||||
|
||||
function RewriteAllTransactions()
|
||||
{
|
||||
DoBlockChainProcess("RewriteAllTransactions", "Rewrite all transactions", 0);
|
||||
};
|
||||
|
||||
function RewriteTransactions()
|
||||
{
|
||||
DoBlockChainProcess("RewriteTransactions", "Rewrite transactions on last %1 blocks", 1);
|
||||
};
|
||||
|
||||
function TruncateBlockChain()
|
||||
{
|
||||
DoBlockChainProcess("TruncateBlockChain", "Truncate last %1 blocks", 1);
|
||||
};
|
||||
|
||||
function ClearDataBase()
|
||||
{
|
||||
DoBlockChainProcess("ClearDataBase", "Clear DataBase", 0);
|
||||
};
|
||||
|
||||
function CleanChain()
|
||||
{
|
||||
DoBlockChainProcess("CleanChain", "Clean chain on last %1 blocks", 1);
|
||||
};
|
||||
|
||||
function DoBlockChainProcess(FuncName,Text,LastBlock)
|
||||
{
|
||||
SaveValues();
|
||||
var Params = {};
|
||||
if(LastBlock)
|
||||
{
|
||||
Params.BlockCount = ParseNum(document.getElementById("idBlockCount").value);
|
||||
Text = Text.replace("%1", Params.BlockCount);
|
||||
}
|
||||
var result = confirm(Text + "?");
|
||||
if(!result)
|
||||
return ;
|
||||
SetVisibleBlock("idServerBlock", 1);
|
||||
SetStatus("START: " + Text);
|
||||
GetData(FuncName, Params, function (Data)
|
||||
{
|
||||
if(Data)
|
||||
{
|
||||
SetStatus("FINISH: " + Text, !Data.result);
|
||||
}
|
||||
});
|
||||
};
|
||||
276
src/HTML/JS/wallet-web.js
Normal file
276
src/HTML/JS/wallet-web.js
Normal file
@@ -0,0 +1,276 @@
|
||||
/*
|
||||
* @project: TERA
|
||||
* @version: Development (beta)
|
||||
* @license: MIT (not for evil)
|
||||
* @copyright: Yuriy Ivanov (Vtools) 2017-2019 [progr76@gmail.com]
|
||||
* Web: https://terafoundation.org
|
||||
* Twitter: https://twitter.com/terafoundation
|
||||
* Telegram: https://t.me/terafoundation
|
||||
*/
|
||||
|
||||
var MIN_VERSION = 1020;
|
||||
var COUNT_BLOCK_PROOF = 300;
|
||||
var MIN_SUM_POWER = COUNT_BLOCK_PROOF * 35;
|
||||
var MainServer = undefined;
|
||||
var MaxConnectedCount = 10;
|
||||
var MaxTimeConnecting = 3 * 1000;
|
||||
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}, };
|
||||
|
||||
function StartWebWallet()
|
||||
{
|
||||
if(NETWORK === "TERA-TEST2")
|
||||
{
|
||||
MIN_SUM_POWER = 0;
|
||||
ServerMap = ServerTestMap;
|
||||
}
|
||||
else
|
||||
{
|
||||
MIN_SUM_POWER = COUNT_BLOCK_PROOF * 35;
|
||||
ServerMap = ServerMainMap;
|
||||
}
|
||||
$("idNetwork").innerText = NETWORK;
|
||||
OnInitWebWallet();
|
||||
ConnectWebWallet();
|
||||
};
|
||||
|
||||
function OnInitWebWallet()
|
||||
{
|
||||
var str = Storage.getItem(NETWORK + "NodesArrayList");
|
||||
if(str)
|
||||
{
|
||||
var arr = JSON.parse(str);
|
||||
for(var i = 0; i < arr.length; i++)
|
||||
{
|
||||
var Item = ServerMap[arr[i].ip];
|
||||
if(Item && Item.System)
|
||||
continue;
|
||||
ServerMap[arr[i].ip] = arr[i];
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function SaveServerMap()
|
||||
{
|
||||
var arr = [];
|
||||
for(var key in ServerMap)
|
||||
{
|
||||
var Item = ServerMap[key];
|
||||
if(Item.SumPower >= MIN_SUM_POWER)
|
||||
{
|
||||
arr.push({ip:Item.ip, port:Item.port});
|
||||
}
|
||||
}
|
||||
Storage.setItem(NETWORK + "NodesArrayList", JSON.stringify(arr));
|
||||
};
|
||||
|
||||
function SetStatus(Str)
|
||||
{
|
||||
var id = $("idStatus");
|
||||
id.innerHTML = Str;
|
||||
if(Str)
|
||||
console.log(id.innerText);
|
||||
};
|
||||
|
||||
function SetError(Str,bNoSound)
|
||||
{
|
||||
SetStatus("<DIV align='left' style='color:red'><B>" + Str + "</B></DIV>");
|
||||
};
|
||||
var CountConnect = 0;
|
||||
var CountWallet = 0;
|
||||
|
||||
function ConnectWebWallet()
|
||||
{
|
||||
StartTimeConnecting = Date.now();
|
||||
ConnectedCount = 0;
|
||||
for(var key in ServerMap)
|
||||
{
|
||||
var Item = ServerMap[key];
|
||||
Item.SendHandShake = 0;
|
||||
}
|
||||
if(window.BrowserIE && !IsLocalClient())
|
||||
{
|
||||
MainServer = undefined;
|
||||
return ;
|
||||
}
|
||||
CountConnect = 0;
|
||||
CountWallet = 0;
|
||||
SetStatus("Connecting...");
|
||||
LoopHandShake();
|
||||
setTimeout(LoopWalletInfo, 1500);
|
||||
};
|
||||
var Stage = 0;
|
||||
|
||||
function LoopHandShake()
|
||||
{
|
||||
Stage++;
|
||||
SetStatus("Connecting: " + Stage + "...");
|
||||
for(var key in ServerMap)
|
||||
{
|
||||
var Item = ServerMap[key];
|
||||
if(Item.SendHandShake || !Item.port)
|
||||
continue;
|
||||
CountConnect++;
|
||||
if(window.BrowserIE && CountConnect > 4)
|
||||
break;
|
||||
DoNodeList(Item);
|
||||
}
|
||||
};
|
||||
|
||||
function DoNodeList(Item)
|
||||
{
|
||||
console.log(GetProtocolServerPath(Item) + "/GetNodeList");
|
||||
if(window.location.protocol === "https:" && Item.port !== 443)
|
||||
return ;
|
||||
if(Item.port === 443 && IsIPAddres(Item.ip))
|
||||
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)
|
||||
{
|
||||
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++)
|
||||
{
|
||||
var Node = Data.arr[i];
|
||||
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)
|
||||
{
|
||||
setTimeout(LoopHandShake, 100);
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function LoopWalletInfo()
|
||||
{
|
||||
SetStatus("Get wallets info...");
|
||||
for(var key in ServerMap)
|
||||
{
|
||||
var Item = ServerMap[key];
|
||||
if(Item.port)
|
||||
{
|
||||
CountWallet++;
|
||||
if(window.BrowserIE && CountWallet > 4)
|
||||
break;
|
||||
DoWalletInfo(Item);
|
||||
}
|
||||
}
|
||||
setTimeout(FindLider, 500);
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
Item.Name = Data.NODES_NAME;
|
||||
Item.GetWalletInfo = 1;
|
||||
Item.DeltaTime = new Date() - Item.StartTime;
|
||||
Item.BlockChain = Data.BlockChain;
|
||||
Item.MaxNumBlockDB = Data.MaxNumBlockDB;
|
||||
console.log("Get: " + Item.ip + ":" + Item.port + " delta=" + Item.DeltaTime);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function FindLider()
|
||||
{
|
||||
MainServer = undefined;
|
||||
var Arr = [];
|
||||
var MapSumPower = {};
|
||||
for(var key in ServerMap)
|
||||
{
|
||||
var Item = ServerMap[key];
|
||||
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)
|
||||
{
|
||||
console.log("Skip: " + Item.ip + ":" + Item.port + " SumPower(" + Item.SumPower + ") < MIN_SUM_POWER(" + MIN_SUM_POWER + ")");
|
||||
continue;
|
||||
}
|
||||
if(!MapSumPower[Item.SumPower])
|
||||
MapSumPower[Item.SumPower] = 0;
|
||||
MapSumPower[Item.SumPower]++;
|
||||
Arr.push(Item);
|
||||
}
|
||||
}
|
||||
var Max = 0, MaxKey;
|
||||
for(var key in MapSumPower)
|
||||
{
|
||||
if(MapSumPower[key] >= Max)
|
||||
{
|
||||
Max = MapSumPower[key];
|
||||
MaxKey = parseInt(key);
|
||||
}
|
||||
}
|
||||
Arr.sort(function (a,b)
|
||||
{
|
||||
return a.DeltaTime - b.DeltaTime;
|
||||
});
|
||||
for(var i = 0; i < Arr.length; i++)
|
||||
{
|
||||
var Item = Arr[i];
|
||||
if(Item.SumPower === MaxKey)
|
||||
{
|
||||
SetStatus("Find " + Item.ip + ":" + Item.port + " with pow=" + Item.SumPower + "/" + MaxKey + " ping=" + Item.DeltaTime);
|
||||
MainServer = Item;
|
||||
SaveServerMap();
|
||||
break;
|
||||
}
|
||||
}
|
||||
OnFindServer();
|
||||
};
|
||||
|
||||
function CalcPowFromBlockChain(BufRead)
|
||||
{
|
||||
var Sum = 0;
|
||||
var Arr = GetBlockArrFromBuffer(BufRead);
|
||||
if(Arr.length === COUNT_BLOCK_PROOF)
|
||||
{
|
||||
for(var i = 0; i < Arr.length; i++)
|
||||
{
|
||||
Sum += Arr[i].Power;
|
||||
}
|
||||
}
|
||||
return Sum;
|
||||
};
|
||||
|
||||
function SetAllSum()
|
||||
{
|
||||
var Item = MapAccounts[$("idAccount").value];
|
||||
if(Item)
|
||||
$("idSumSend").value = FLOAT_FROM_COIN(Item.Value).toStringF();
|
||||
};
|
||||
Reference in New Issue
Block a user