From 228076945f1e5a1a3834a23bf277c8dde7b349b2 Mon Sep 17 00:00:00 2001 From: MiaoWoo Date: Tue, 3 Sep 2019 09:01:40 +0800 Subject: [PATCH] Tue Sep 3 09:01:40 CST 2019 Source Update... --- Source/HTML/JS/client.js | 31 +- Source/HTML/JS/coinlib.js | 9 + Source/HTML/JS/dapp-inner.js | 388 ++++++++-- Source/HTML/JS/mobile-wallet.js | 7 +- Source/HTML/JS/terahashlib.js | 7 + Source/HTML/JS/wallet-lib.js | 4 +- Source/HTML/dapp-edit.html | 2 +- Source/HTML/dapp-frame.html | 122 +++- Source/HTML/wallet.html | 1209 ++++++++++++++++--------------- Source/HTML/web-wallet.html | 2 +- Source/core/constant.js | 5 +- Source/core/html-server.js | 15 +- Source/core/rest-loader.js | 2 +- Source/process/web-process.js | 14 +- Source/system/accounts.js | 8 +- Source/system/smart.js | 134 +++- 16 files changed, 1262 insertions(+), 697 deletions(-) diff --git a/Source/HTML/JS/client.js b/Source/HTML/JS/client.js index ad95ffe..2f59cce 100644 --- a/Source/HTML/JS/client.js +++ b/Source/HTML/JS/client.js @@ -198,13 +198,35 @@ function GetProtocolServerPath(Item) return "http://" + Item.ip + ":" + Item.port; }; +function ToFixed(Sum,Currency) +{ + var Fixed = GetCurrencyFixed(Currency); + var Str = Sum.toFixed(Fixed); + var Index = Str.indexOf("."); + if(Index > 0) + { + for(var i = Str.length - 1; i >= Index; i--) + { + var c = Str.substr(i, 1); + if(c !== "0") + { + if(c === ".") + Str = Str.substr(0, i); + break; + } + Str = Str.substr(0, i); + } + } + return Str; +}; + function SUM_TO_STRING(Value,Currency,bFloat,bLocal) { var Str; if(Value.SumCOIN || Value.SumCENT) if(bFloat) { - Str = "" + FLOAT_FROM_COIN(Value).toStringF(); + Str = ToFixed(FLOAT_FROM_COIN(Value), Currency); } else { @@ -1284,8 +1306,7 @@ function GetTokenName(Num,Name) { if(!Name) Name = "Token"; - return "(" + Num + "." + Name + ")"; - return "{" + Num + "." + Name + "}"; + return String(Name).toLowerCase(); }; function CurrencyNameItem(Item) @@ -1294,11 +1315,15 @@ function CurrencyNameItem(Item) if(!Name) { if(Item.CurrencyObj) + { Name = GetTokenName(Item.Currency, Item.CurrencyObj.ShortName); + } else Name = GetTokenName(Item.Currency, ""); MapCurrency[Item.Currency] = Name; } + if(Item.CurrencyObj && Item.CurrencyObj.TokenDescription) + Name += " : " + Item.CurrencyObj.TokenDescription; return Name; }; diff --git a/Source/HTML/JS/coinlib.js b/Source/HTML/JS/coinlib.js index 1815db0..b29acbc 100644 --- a/Source/HTML/JS/coinlib.js +++ b/Source/HTML/JS/coinlib.js @@ -108,6 +108,15 @@ function COIN_FROM_STRING(Str) { throw "TODO: COIN_FROM_STRING"; }; + +function GetCurrencyFixed(Currency) +{ + var Fixed = 9; + var Name = CurrencyName(Currency); + if(Name === "BTC") + Fixed = 8; + return Fixed; +}; if(typeof global === "object") { global.CHECKSUM = CHECKSUM; diff --git a/Source/HTML/JS/dapp-inner.js b/Source/HTML/JS/dapp-inner.js index 3af93f0..9657fc3 100644 --- a/Source/HTML/JS/dapp-inner.js +++ b/Source/HTML/JS/dapp-inner.js @@ -175,6 +175,11 @@ function SendTransaction(Body,TR,SumPow,F) SetError("Cannt SEND TR: " + JSON.stringify(TR)); }; +function ReloadDapp() +{ + SendData({cmd:"ReloadDapp"}); +}; + function CurrencyName(Num) { var Name = MapCurrency[Num]; @@ -232,6 +237,8 @@ function FindAllCurrencyNext(StartNum) function GetFilePath(Path) { + if(Path.substr(0, 5) === "http:" || Path.substr(0, 6) === "https:") + return Path; if(window.PROTOCOL_SERVER_PATH && Path.indexOf("file/")) { if(Path.substr(0, 1) !== "/") @@ -277,26 +284,71 @@ function GetState(AccNum,F,FErr) } }); }; +var glWasModal = 0; -function UpdateListArr(Block,Tr,Arr,StopBlock,IgnoreTailBlock,MaxDepth,F) +function openModal(id) { - Arr.sort(function (a,b) - { - return a.Num - b.Num; - }); - if(Arr.length) - StopBlock = Math.max(StopBlock, Arr[Arr.length - 1].BlockNum); - UpdateListArrNext(Block, Tr, Arr, StopBlock, IgnoreTailBlock, MaxDepth, F); + glWasModal = 1; + var modal = document.querySelector("#" + id); + var overlay = document.querySelector("#idOverlay"); + modal.style.display = "block"; + overlay.style.display = "block"; }; -function UpdateListArrNext(Block,Tr,Arr,StopMinBlock,IgnoreTailBlock,MaxDepth,F) +function closeModal() +{ + glWasModal = 0; + var modals = document.querySelectorAll(".ModalDlg"); + var overlay = document.querySelector("#idOverlay"); + modals.forEach(function (item) + { + item.style.display = "none"; + }); + overlay.style.display = "none"; +}; +var TEMP_DISABLED_MAP = {}; + +function SetTempDisabled(Id,TimeSec) +{ + if(!TimeSec) + TimeSec = 8; + $(Id).disabled = 1; + TEMP_DISABLED_MAP[Id] = 1; + setTimeout(function () + { + $(Id).disabled = 0; + delete TEMP_DISABLED_MAP[Id]; + }, TimeSec * 1000); +}; +var glConfirmF; + +function DoConfirm(StrTitle,StrText,F,bDirect) +{ + if(!bDirect && window.openModal && $("idConfirm")) + { + $("idConfirmTitle").innerHTML = StrTitle; + $("idConfirmText").innerHTML = StrText; + glConfirmF = F; + openModal("idConfirm"); + } + else + { + F(); + } +}; + +function OnConfirmOK() +{ + closeModal(); + if(glConfirmF) + glConfirmF(); + glConfirmF = undefined; +}; + +function GetDappBlock(Block,Tr,F) { - if(Block <= StopMinBlock || !MaxDepth) - return ; - SendCountUpdate++; DappBlockFile(Block, Tr, function (Err,Data) { - SendCountUpdate--; if(!Err && Data.Type === 135) { try @@ -308,31 +360,267 @@ function UpdateListArrNext(Block,Tr,Arr,StopMinBlock,IgnoreTailBlock,MaxDepth,F) } if(Params) { - if(Block <= INFO.CurBlockNum - IgnoreTailBlock) - { - Params.BlockNum = Block; - Params.TrNum = Tr; - Params.Num = Params.BlockNum * 100000 + Params.TrNum; - Params.Time = Date.now(); - if(!Arr.length || Arr[Arr.length - 1].Num !== Params.Num) - Arr.push(Params); - } - if(Params.PrevBlock) - { - UpdateListArrNext(Params.PrevBlock, Params.PrevTr, Arr, StopMinBlock, IgnoreTailBlock, MaxDepth - 1, F); - } + F(0, Params, Data.MethodName, Data.FromNum); + return ; } } - if(F && SendCountUpdate === 0) + F(1); + }); +}; + +function UpdateListArr(Block,Tr,Arr,StopBlock,IgnoreTailBlock,MaxDepth,F) +{ + Arr.sort(function (a,b) + { + return a.Num - b.Num; + }); + if(Arr.length) + StopBlock = Math.max(StopBlock, Arr[Arr.length - 1].BlockNum); + UpdateRowArr(Block, Tr, Arr, StopBlock, IgnoreTailBlock, MaxDepth, F); +}; + +function UpdateRowArr(Block,Tr,Arr,StopMinBlock,IgnoreTailBlock,MaxDepth,F) +{ + if(Block <= StopMinBlock || !MaxDepth) + return ; + SendCountUpdate++; + GetDappBlock(Block, Tr, function (Err,Params) + { + SendCountUpdate--; + if(!Err) { - Arr.sort(function (a,b) + if(Block <= INFO.CurBlockNum - IgnoreTailBlock) { - return a.Num - b.Num; - }); - F(Arr); + Params.BlockNum = Block; + Params.TrNum = Tr; + Params.Num = Params.BlockNum * 100000 + Params.TrNum; + Params.Time = Date.now(); + if(!Arr.length || Arr[Arr.length - 1].Num !== Params.Num) + { + if(F) + { + if(F(Params)) + { + return ; + } + } + else + { + Arr.push(Params); + } + } + } + if(Params.PrevBlock) + { + UpdateRowArr(Params.PrevBlock, Params.PrevTr, Arr, StopMinBlock, IgnoreTailBlock, MaxDepth - 1, F); + } } }); }; + +function GetKeyNum(Key) +{ + var Arr; + if(typeof Key === "number") + { + Arr = sha3("" + Key); + } + else + { + Arr = sha3(Key); + } + var KeyNum = ReadUintFromArr(Arr, 0); + return KeyNum; +}; + +function GetKeyInner(Key,DBBlock,DBTr,F) +{ + FindItem(DBBlock, DBTr, Key, function (Result,PathArr) + { + for(var i = 0; i < PathArr.length; i++) + { + var Elem = PathArr[i]; + if(Elem.Key === Key) + { + if(Elem.VB) + { + LoadElement(Elem, i, PathArr, F); + } + else + { + F(1, Elem, PathArr); + } + return ; + } + } + F(0, undefined, PathArr); + }); +}; + +function SetKeyInner(Key,Value,DBBlock,DBTr,F) +{ + FindItem(DBBlock, DBTr, Key, function (Result,PathArr) + { + var Elem; + var bCreate = 1; + var ElemEdit = undefined; + for(var i = 0; i < PathArr.length; i++) + { + Elem = PathArr[i]; + if(Elem.Key === Key) + { + Elem.Key = undefined; + Elem.VB = undefined; + Elem.VT = undefined; + Elem.Level = undefined; + if(i === PathArr.length - 1) + bCreate = 0; + if(typeof Value === "number") + ElemEdit = Elem; + } + if(Elem.VB) + { + Elem.Value = undefined; + } + } + var L = PathArr.length - 1; + if(ElemEdit) + { + Elem = ElemEdit; + } + else + { + if(L === - 1 || bCreate) + { + L++; + PathArr[L] = {}; + } + Elem = PathArr[L]; + } + Elem.Key = Key; + Elem.Value = Value; + F(PathArr); + }); +}; +var GetBlockKeyCount = 0; + +function FindItem(Block,Tr,Key,F) +{ + GetBlockKeyCount = 0; + var KeyNum = GetKeyNum(Key); + FindItemNext(Block, Tr, Key, KeyNum, [], 0, F); +}; + +function FindItemNext(Block,Tr,Key,KeyNum,PathArr,Level,F) +{ + GetBlockKeyCount++; + GetDappBlock(Block, Tr, function (Err,Params) + { + GetBlockKeyCount--; + if(!Err) + { + var KeyNumStr = KeyNum.toString(2); + var Arr = Params.Arr; + for(var L = Level; Arr && L < Arr.length; L++) + { + var Elem = Arr[L]; + PathArr[L] = Elem; + if(Elem.Key !== undefined) + { + if(Elem.Key !== Key && !Elem.VB && typeof Elem.Value !== "number") + { + Elem.VB = Block; + Elem.VT = Tr; + } + } + var Bit = + KeyNumStr.substr(L, 1); + if(Bit !== Elem.t) + { + var IB = Elem.IB; + var IT = Elem.IT; + Elem.t = Bit; + Elem.IB = Block; + Elem.IT = Tr; + if(IB) + { + FindItemNext(IB, IT, Key, KeyNum, PathArr, L + 1, F); + } + else + { + break; + } + return ; + } + } + F(1, PathArr); + return ; + } + if(GetBlockKeyCount === 0) + F(0, []); + }); +}; + +function LoadElement(Element,Level,PathArr,F) +{ + GetBlockKeyCount++; + GetDappBlock(Element.VB, Element.VT, function (Err,Params) + { + GetBlockKeyCount--; + if(!Err) + { + F(1, Params.Arr[Level], PathArr); + return ; + } + if(GetBlockKeyCount === 0) + F(0); + }); +}; + +function GetXORArr(Arr1,Arr2) +{ + var Arr3 = []; + for(var i = 0; i < 32; i++) + { + Arr3[i] = Arr1[i] ^ Arr2[i]; + } + return Arr3; +}; + +function EncryptUint32(ArrSecret,RandomNum,Value) +{ + WriteUintToArrOnPos(ArrSecret, 0, 0); + WriteUintToArrOnPos(ArrSecret, RandomNum, 6); + var ValueArr = []; + WriteUint32ToArr(ValueArr, Value); + return GetHexFromArr(DoSecret(ValueArr, ArrSecret)); +}; + +function DecryptUint32(ArrSecret,RandomNum,StrValue) +{ + WriteUintToArrOnPos(ArrSecret, 0, 0); + WriteUintToArrOnPos(ArrSecret, RandomNum, 6); + var Arr0 = GetArrFromHex(StrValue); + var ValueArr = DoSecret(Arr0, ArrSecret); + ValueArr.len = 0; + var Value = ReadUint32FromArr(ValueArr); + return Value; +}; + +function EncryptArr32(ArrSecret,RandomNum,ValueArr) +{ + WriteUintToArrOnPos(ArrSecret, 0, 0); + WriteUintToArrOnPos(ArrSecret, RandomNum, 6); + return GetHexFromArr(DoSecret(ValueArr, ArrSecret)); +}; + +function DecryptArr32(ArrSecret,RandomNum,StrValue) +{ + WriteUintToArrOnPos(ArrSecret, 0, 0); + WriteUintToArrOnPos(ArrSecret, RandomNum, 6); + var Arr0 = GetArrFromHex(StrValue); + var ValueArr = DoSecret(Arr0, ArrSecret); + return ValueArr; +}; var glMapF = {}; var glKeyF = 0; @@ -492,23 +780,13 @@ function GetDappParams(BNum,TrNum,F,bAll) return ; } SendCountDappParams++; - DappBlockFile(BNum, TrNum, function (Err,Data) + GetDappBlock(BNum, TrNum, function (Err,Params,MethodName,FromNum) { SendCountDappParams--; - if(!Err && Data.Type === 135) + if(!Err) { - try - { - var Params = JSON.parse(Data.Params); - } - catch(e) - { - } - if(Params) - { - F(Params, Data.MethodName, Data.FromNum); - return ; - } + F(Params, MethodName, FromNum); + return ; } if(bAll) F(); @@ -595,3 +873,23 @@ window.addEventListener('load', function () UpdateDappInfo(); setInterval(UpdateDappInfo, 1000); }); +window.onkeydown = function (e) +{ + if(e.keyCode === 116) + { + e.preventDefault(); + ReloadDapp(); + } + else + if(e.keyCode === 27) + { + if(window.closeModal) + closeModal(); + } + else + if(e.keyCode === 13) + { + if(glConfirmF) + OnConfirmOK(); + } +}; diff --git a/Source/HTML/JS/mobile-wallet.js b/Source/HTML/JS/mobile-wallet.js index 49cead0..5a1038c 100644 --- a/Source/HTML/JS/mobile-wallet.js +++ b/Source/HTML/JS/mobile-wallet.js @@ -468,7 +468,7 @@ function SetAccountsCard(Data,AccountsDataStr) Str1 = ""; Str2 = ""; } - var StrCurrencyName = CurrencyName(Item.Currency); + var StrCurrencyName = CurrencyNameItem(Item); Str = Str.replace("$Value.SumCOIN", Str1); Str = Str.replace("$Value.SumCENT", Str2); Str = Str.replace("$Value.CurrencyName", StrCurrencyName); @@ -1295,8 +1295,7 @@ LangMap["RUS"] = {"TERA WALLET":"TERA КОШЕЛЕК", "Generate key":"Сген "Load key":"Загруз.", "Create your first account and start using TERA":"Создайте свой первый счет и начните использовать TERA", "0 Accounts":"0 Счетов", "OWNER: {Item.Owner}":"Владелец: {Item.Owner}", "More info":"Инфо", "Public key":"Публичный ключ", "Enter number of dapp":"Введите номер Dapp", "Enter the dapps number that will be added to your account. Attention make sure that you trust this dapp, otherwise you may lose all funds in this account.":"Введите номер Dapp, который будет добавлен в ваш аккаунт. Внимание убедитесь, что Вы доверяете ему, в противном случае вы можете потерять все средства на этом счете.", - "Sending Tx":"Отправка транзакции", "Wallet ver:":"Версия:", "HELP: Tera Wallet creation Guide...":"Руководство по созданию Tera Wallet...", - "==HELP-LINK==":"https://medium.com/@evkara777/tera-%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%BD%D1%8B%D0%B9-%D0%BA%D0%BE%D1%88%D0%B5%D0%BB%D0%B5%D0%BA-%D0%B2%D0%B8%D0%B4%D1%8B-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D1%87%D0%B5%D1%82%D0%B0-6402531ecc11", + "Sending Tx":"Отправка транзакции", "Wallet ver:":"Версия:", "Tera Wallet Guide...":"Руководство по Tera Wallet...", "==HELP-LINK==":"https://medium.com/@evkara777/tera-%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%BD%D1%8B%D0%B9-%D0%BA%D0%BE%D1%88%D0%B5%D0%BB%D0%B5%D0%BA-%D0%B2%D0%B8%D0%B4%D1%8B-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D1%87%D0%B5%D1%82%D0%B0-6402531ecc11", }; LangMap["简体中文"] = {"TERA WALLET":"TERA 钱包", "Generate key":"生成私钥", "OK":"OK", "Cancel":"取消", "Edit":"编辑", "Save key":"保存私钥", "+ CREATE A NEW ACCOUNT":"+ 新建账号", "Create account":"创建账号", "Send":"发送", "SEND":"转账", "CONFIRM":"确认", "Accounts":"账号", "Account(s)":"账号", @@ -1314,7 +1313,7 @@ LangMap["简体中文"] = {"TERA WALLET":"TERA 钱包", "Generate key":"生成 "From:":"付款:", "Set a password for protect entry":"设置密码保护钱包", "Enter password to unlock wallet":"输入密码解锁钱包", "From ID:":"付款ID:", "Pay to ID:":"收款ID:", "Account":"账号", "Owner":"拥有者", "Block num":"区块编号", "Private key (secret)":"私钥 (机密)", "Load key":"载入私钥", "Create your first account and start using TERA":"创建你的第一个账号,开启TERA之旅", "0 Accounts":"0 账号", "OWNER: {Item.Owner}":"拥有者: {Item.Owner}", - "More info":"详情", "Public key":"公钥", "HELP: Tera Wallet creation Guide...":"TERA钱包创作指南", "==HELP-LINK==":"https://terafoundation.org/files/Tera-Wallet-cn.pdf", + "More info":"详情", "Public key":"公钥", "Tera Wallet Guide...":"TERA钱包创建指南", "==HELP-LINK==":"https://terafoundation.org/files/Tera-Wallet-cn.pdf", }; LangMap["한글"] = {"TERA WALLET":"TERA 지갑", "Generate key":"개인 키 생성", "OK":"OK", "Cancel":"취소", "Edit":"편집", "Save key":"개인 키 저장", "+ CREATE A NEW ACCOUNT":"+ 새 계정 만들기", "Create account":"계정 만들기", "Send":"발송", "CONFIRM":"확인", "Accounts":"계정", "Account(s)":"계정", diff --git a/Source/HTML/JS/terahashlib.js b/Source/HTML/JS/terahashlib.js index 1904d1d..221864e 100644 --- a/Source/HTML/JS/terahashlib.js +++ b/Source/HTML/JS/terahashlib.js @@ -216,6 +216,13 @@ function WriteUintToArrOnPos(arr,Num,Pos) arr[Pos + 5] = (NumH >>> 8) & 0xFF; }; +function WriteUint16ToArr(arr,Num) +{ + var len = arr.length; + arr[len] = Num & 0xFF; + arr[len + 1] = (Num >>> 8) & 0xFF; +}; + function WriteUint32ToArr(arr,Num) { var len = arr.length; diff --git a/Source/HTML/JS/wallet-lib.js b/Source/HTML/JS/wallet-lib.js index 6ef7156..b4c6920 100644 --- a/Source/HTML/JS/wallet-lib.js +++ b/Source/HTML/JS/wallet-lib.js @@ -129,8 +129,8 @@ function GetAccountText(Item,Num,bGetSum) text = "" + Num + ". " + text; if(bGetSum) { - var StrSum = SUM_TO_STRING(Item.Value, Item.Currency); - text += " (" + StrSum + ")"; + var StrSum = SUM_TO_STRING(Item.Value, Item.Currency, 1); + text += " : " + StrSum; } return text; } diff --git a/Source/HTML/dapp-edit.html b/Source/HTML/dapp-edit.html index dfb921f..6c61939 100644 --- a/Source/HTML/dapp-edit.html +++ b/Source/HTML/dapp-edit.html @@ -933,7 +933,7 @@
Name: - Accounts: + Acc count: - -
 
-


- -
-
-
-
- - -
-
- - -
- -
- - -

-
- Block: - DB delta: - TX delta: - Time delta: - Wallet ver: - Max: tps -
- - - - - - -
- - - - - -
- - -
- +
- - - - - - - - - + + + +
IDAmountCurNameOPAdvSmart
CONFIG
SEND
DApps
EXPLORER
-
+ +
 
+


- - - - - -
- - - - - - - - - - -

Welcome to TERA Wallet

-

HELP: Tera Wallet creation Guide...

+

Tera Wallet Guide...

ATTENTION: Before using the wallet, save the private key.