2019-02-10 19:53:54 +00:00
|
|
|
/*
|
|
|
|
* @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
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
{
|
|
|
|
var Data = {cmd:"DappInfo", AllAccounts:ALL_ACCOUNTS};
|
|
|
|
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 OpenLink(Str)
|
|
|
|
{
|
|
|
|
SendData({cmd:"OpenLink", Message:Str});
|
|
|
|
};
|
|
|
|
|
2019-02-12 18:41:41 +00:00
|
|
|
function ComputeSecret(PubKey,F,Account)
|
2019-02-10 19:53:54 +00:00
|
|
|
{
|
|
|
|
if(!INFO.WalletCanSign)
|
|
|
|
{
|
|
|
|
SetError("Pls, open wallet");
|
|
|
|
return 0;
|
|
|
|
}
|
2019-02-12 18:41:41 +00:00
|
|
|
if(!Account && USER_ACCOUNT.length)
|
|
|
|
Account = USER_ACCOUNT[0].Num;
|
2019-02-10 19:53:54 +00:00
|
|
|
if(typeof PubKey === "number")
|
|
|
|
{
|
|
|
|
var AccNum = PubKey;
|
|
|
|
GetAccountList({StartNum:AccNum, CountNum:1}, function (Err,Arr)
|
|
|
|
{
|
|
|
|
if(Err)
|
|
|
|
{
|
|
|
|
SetError(Err);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2019-02-12 18:41:41 +00:00
|
|
|
SendData({cmd:"ComputeSecret", Account:Account, PubKey:Arr[0].PubKey.data}, F);
|
2019-02-10 19:53:54 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2019-02-12 18:41:41 +00:00
|
|
|
SendData({cmd:"ComputeSecret", Account:Account, PubKey:PubKey}, F);
|
2019-02-10 19:53:54 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
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.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.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});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
|
|
|
window.addEventListener('load', function ()
|
|
|
|
{
|
|
|
|
if(!window.sha3)
|
|
|
|
LoadLib("./JS/sha3.js");
|
|
|
|
UpdateDappInfo();
|
|
|
|
setInterval(UpdateDappInfo, 1000);
|
|
|
|
});
|