2019-02-10 19:53:54 +00:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "UTF-8" >
< meta http-equiv = "X-Frame-Options" value = "sameorigin" >
< title > DAPP Loading...< / title >
< link rel = "shortcut icon" href = "./tera.ico" type = "image/vnd.microsoft.icon" >
< script type = "text/javascript" src = "./JS/crypto-client.js" > < / script >
< script type = "text/javascript" src = "./JS/coinlib.js" > < / script >
< script type = "text/javascript" src = "./JS/client.js" > < / script >
< script type = "text/javascript" src = "./JS/terahashlib.js" > < / script >
< script >
var DapNumber="#template-number#";
var glSmart=parseInt(DapNumber);
var CONFIG_DATA={};
var NumDappGet=0;
var NumDappInfo=0;
var arr = new Uint8Array(6);
window.crypto.getRandomValues(arr);
var glSession=GetHexFromArr(arr);
//DAPP TRANSFER
function SendMessage(Data)
{
var win = window.frames.dapp;
if(!win)
{
console.log("Error window.frames.dapp");
//try latter
setTimeout(function ()
{
win.postMessage(Data, "*");
},200);
return;
}
//console.log("To dapp: "+JSON.stringify(Data))
win.postMessage(Data, "*");
}
var glProgramSetHash;
function listener(event)
{
var Data=event.data;
if(!Data || typeof Data!=="object")
return;
switch (Data.cmd)
{
case "pay":
{
AddToInvoiceList(Data);
break;
}
case "setstorage":
{
localStorage.setItem("DAPP-"+DapNumber+"-"+Data.Key,JSON.stringify(Data.Value));
break;
}
case "getstorage":
{
Data.Value=localStorage.getItem("DAPP-"+DapNumber+"-"+Data.Key);
if(Data.Value)
Data.Value=JSON.parse(Data.Value);
SendMessage(Data);
break;
}
case "setcommon":
{
localStorage.setItem("DAPP-"+Data.Key,JSON.stringify(Data.Value));
break;
}
case "getcommon":
{
Data.Value=localStorage.getItem("DAPP-"+Data.Key);
if(Data.Value)
Data.Value=JSON.parse(Data.Value);
SendMessage(Data);
break;
}
case "DappCall":
{
if(!Data.Account)
Data.Account=BASE_ACCOUNT.Num;
GetData("DappStaticCall",{Account:Data.Account,MethodName:Data.MethodName,Params:Data.Params}, function (SetData)
{
if(SetData)
{
Data.Err=!SetData.result;
Data.RetValue=SetData.RetValue;
}
else
{
Data.Err=1;
}
SendMessage(Data);
});
break;
}
case "DappSendCall":
{
if(!Data.Account)
Data.Account=BASE_ACCOUNT.Num;
if(!Data.FromNum)
Data.FromNum=0;
SendCallMethod(Data.Account,Data.MethodName,Data.Params,Data.FromNum,glSmart);
break;
}
case "DappInfo":
{
//called every 1 sec from dapp-inner.js
var AllData=0;
if(!NumDappGet || NumDappGet%60===0)
AllData=1;
NumDappGet++;
var Key=localStorage["idPubKey"];
GetData("DappInfo",{Smart:glSmart,Key:Key,Session:glSession,NumDappInfo:NumDappInfo,AllData:AllData,AllAccounts:Data.AllAccounts}, function (SetData)
{
if(SetData)
{
Data.Err=!SetData.result;
Data.cache=SetData.cache;
if(SetData.result)
{
CONFIG_DATA=SetData;
SMART=SetData.Smart;
BASE_ACCOUNT=SetData.Account;
SetBlockChainConstant(SetData);
NumDappInfo=SetData.NumDappInfo;
SetArrLog(SetData.ArrLog);
for(var key in SetData)
Data[key]=SetData[key];
Data.OPEN_PATH=OPEN_PATH;
if(!Data.PubKey)
{
//support web/light wallet mode:
Data.PubKey=localStorage["idPubKey"];
Data.WalletIsOpen=IsPrivateMode(localStorage["idPrivKey"]);
Data.WalletCanSign=Data.WalletIsOpen;
}
}
SendMessage(Data);
}
});
break;
}
case "DappWalletList":
var Key=localStorage["idPubKey"];
Data.Params={Smart:glSmart,Key:Key};
case "DappSmartHTMLFile":
case "DappBlockFile":
case "DappAccountList":
case "DappSmartList":
case "DappBlockList":
case "DappTransactionList":
{
if(Data.cmd==="DappBlockFile")
{
//check storage
var StrKeyStorage=Data.Params.BlockNum+"-"+Data.Params.TrNum;
var Storage=sessionStorage;
var SavedTextData=Storage[StrKeyStorage];
if(SavedTextData)
{
var SetData=JSON.parse(SavedTextData);
Data.Err=!SetData.result;
Data.arr=SetData.arr;
Data.Body=SetData.Body;
SendMessage(Data);
return;
}
}
Data.Params.Session=glSession;
GetData(Data.cmd,Data.Params, function (SetData,responseText)
{
if(SetData)
{
Data.Err=!SetData.result;
Data.arr=SetData.arr;
Data.Body=SetData.Body;
SendMessage(Data);
if(StrKeyStorage & & SetData.result)
{
Storage[StrKeyStorage]=responseText;
}
}
});
break;
}
case "SetStatus":
{
SetStatus(escapeHtml(Data.Message));
break;
}
case "SetError":
{
SetError(escapeHtml(Data.Message));
break;
}
case "CheckInstall":
{
CheckInstall();
break;
}
case "SetLocationHash":
{
glProgramSetHash=1;
window.location.hash="#"+Data.Message;
glProgramSetHash=0;
break;
}
case "OpenLink":
{
window.open(Data.Message);
break;
}
case "ComputeSecret":
{
2019-02-12 18:41:41 +00:00
ComputeSecret(Data.Account,Data.PubKey,function (Result)
2019-02-10 19:53:54 +00:00
{
Data.Result=Result;
SendMessage(Data);
});
break;
}
// case "GetLink":
// {
// GetData(Data.url,Data.Params, function (SetData)
// {
// if(SetData)
// {
// SendMessage({cmd:"GetLink",Result:SendData});
// }
// });
// break;
// }
}
}
if (window.addEventListener)
{
window.addEventListener("message", listener);
} else
{
// IE8
window.attachEvent("onmessage", listener);
}
var SMART={},BASE_ACCOUNT={},OPEN_PATH="";
window.onload=function()
{
if(window.location.hash)
OPEN_PATH=window.location.hash.substr(1);
if(window.location.protocol==="file:")
{
DapNumber=window.location.search.substr(6);
if(localStorage["MainServer"])
{
MainServer=JSON.parse(localStorage["MainServer"]);
}
}
glSmart=parseInt(DapNumber);
var Key=localStorage["idPubKey"];
GetData("DappInfo",{Smart:glSmart, Key:Key, Session:glSession, AllData:1}, function (SetData)
{
if(!SetData || !SetData.result)
return;
CONFIG_DATA=SetData;
SMART=SetData.Smart;
BASE_ACCOUNT=SetData.Account;
SetBlockChainConstant(SetData);
document.title=SMART.Name;
2019-03-16 16:08:05 +00:00
var HTMLBlock=BASE_ACCOUNT.SmartState.HTMLBlock;
var HTMLTr=BASE_ACCOUNT.SmartState.HTMLTr;
if(!glDebugPath & & HTMLBlock)
2019-02-10 19:53:54 +00:00
{
2019-03-16 16:08:05 +00:00
console.log("Load HTML from: /file/"+HTMLBlock+"/"+HTMLTr);
GetData("DappBlockFile",{BlockNum:HTMLBlock,TrNum:HTMLTr}, function (SetData)
2019-02-10 19:53:54 +00:00
{
if(SetData & & SetData.result)
{
CreateFrame(SetData);
}
});
}
else
{
GetData("DappSmartHTMLFile",{Smart:glSmart,DebugPath:glDebugPath}, function (SetData)
{
if(SetData & & SetData.result)
{
CreateFrame(SetData);
}
});
}
});
if(!window.sha3)
LoadLib("./JS/sha3.js");
LoadSignLib();
window.addEventListener("popstate", function(event)
{
OPEN_PATH=window.location.hash.substr(1);
if(!glProgramSetHash)
SendMessage({cmd:"History",OPEN_PATH:OPEN_PATH});
}, false);
}
function CreateFrame(SetData)
{
var SriptLW="";
if(MainServer)
{
var StrPath=GetProtocolServerPath(MainServer);
//console.log("StrPath:"+StrPath);
//console.log("WAS:\n"+SetData.Body);
//поддрежка старого кода dapp (после обновления dapp этот код возможно будет удален)
SetData.Body=SetData.Body.replace(/\/[0-9a-z_-]+.css\">/g,StrPath+"/CSS$&");
SetData.Body=SetData.Body.replace(/\/[0-9a-z_-]+.js\">/g,StrPath+"/JS$&");
//TODO: переделать на нормальный парсинг без регулярки
//поддержка перенаправления в блокчейн
SetData.Body=SetData.Body.replace(/\/file\/[0-9]+\/[0-9]+\"/g,StrPath+"$&");
SriptLW="< script > w i n d o w . P R O T O C O L _ S E R V E R _ P A T H = ' " + S t r P a t h + " ' ; < \ / s c r i p t > " ;
//console.log("NEW:\n"+SetData.Body);
}
var iframe = document.createElement('iframe');
iframe.name = 'dapp';
iframe.sandbox="allow-scripts";
SetData.Body='\
< meta charset = "UTF-8" > \
< meta http-equiv = "X-Frame-Options" value = "sameorigin" > \
< script type = "text/javascript" src = "./JS/crypto-client.js" > < \ / s c r i p t > \
< script type = "text/javascript" src = "./JS/coinlib.js" > < \ / s c r i p t > \
< script type = "text/javascript" src = "./JS/client.js" > < \ / s c r i p t > \
< script type = "text/javascript" src = "./JS/dapp-inner.js" > < \ / s c r i p t > \
< script type = "text/javascript" src = "./JS/terahashlib.js" > < \ / s c r i p t > \
'+SriptLW+SetData.Body;
iframe.srcdoc=SetData.Body;
document.getElementsByTagName('body')[0].appendChild(iframe);
}
var WasCheckInstall=0;
function CheckInstall()
{
if(WasCheckInstall)
return;
setInterval(function ()
{
if(CONFIG_DATA & & CONFIG_DATA.ArrWallet & & CONFIG_DATA.ArrWallet.length===0)
{
WasCheckInstall=1;
var StrRef;
if(MainServer)
StrRef='< A href = "./web-wallet.html#TabAccounts" > ACCOUNTS< / A > ';
else
{
if(localStorage["BIGWALLET"])
StrRef='< A href = "/wallet.html#TabAccounts" > CONFIG< / A > '
else
StrRef='< A href = "/web-wallet.html#TabAccounts" > ACCOUNTS< / A > ';
}
SetStatus('< DIV style = "background-color: peachpuff;" > For install this application goto '+StrRef+' tab, select your account, press "Set" and enter smart number: < B > '+SMART.Num+'< / B > < DIV > ');
}
},2000);
}
//LIB
function SetArrLog(arr)
{
var Str="";
if(arr)
for(var i=0;i< arr.length ; i + + )
{
var Item=arr[i];
if(!Item.final)
continue;
if(Item.text.indexOf("Add to blockchain")>=0)
continue;
var TR=MapSendTransaction[Item.key];
if(TR & & !TR.WasSend & & Item.final)
{
var Data={};
Data.cmd="OnEvent";
Data.Description="Error: "+Item.text;
Data.Error=1;
//console.log(JSON.stringify(Item));
SendMessage(Data);
TR.WasSend=1;
}
}
}
function IsPrivateMode(PrivKeyStr)
{
if(PrivKeyStr & & PrivKeyStr.length===64)
return 1;
else
return 0;
}
function SetStatus(Str)
{
var id = $("idStatus");
id.innerHTML=Str;
console.log(id.innerText);
}
function SetError(Str,bNoSound)
{
SetStatus("< DIV style = 'color:red' > < B > "+Str+"< / B > < / DIV > ");
}
function InstallApp()
{
}
< / script >
< style >
iframe
{
position2:fixed;
left:0;
top: 20px;
width: 100%;
height: 97vh;
border: 0;
}
#idStatus
{
text-align: center;
position:fixed;
top: 0;
left: 0;
width: 100%;
height:20px;
padding: 0;
margin: 0;
background-color:white;
}
< / style >
< / head >
< body >
< DIV id = "idStatus" > < / DIV >
< / body >
< / html >
< script >
var glDebugPath="";
// glDebugPath="./dapp-smart/forum.html";
//glDebugPath="./dapp-smart/DEX.html";
//glDebugPath="./dapp-smart/test-load.html";
// glDebugPath="./dapp-smart/gambling-1.html";
// glDebugPath="./dapp-smart/BTC-coin.html";
// glDebugPath="./dapp-smart/freeze.html";
// glDebugPath="./dapp-smart/promise.html";
//glDebugPath="./dapp-smart/OnlineStore.html";
//glDebugPath="./dapp-smart/Clicker.html";
//{"HTMLBlock":3492141,"HTMLTr":0}
< / script >