diff --git a/src/apps/cstwallet.lua b/src/apps/cstwallet.lua deleted file mode 100644 index 1b1312a..0000000 --- a/src/apps/cstwallet.lua +++ /dev/null @@ -1,258 +0,0 @@ -os.loadAPI("/.sPhone/apps/cst/api") ---[[ - - CrystalCoin Wallet (KST) - ---]] -local function drawCryst(x,y) - term.setCursorPos(x,y) - term.setBackgroundColor(colors.lightGray) - term.setTextColor(colors.lightBlue) - write("/") - term.setCursorPos(x + 1,y) - term.setBackgroundColor(colors.lightBlue) - term.setTextColor(colors.blue) - write("\\") - term.setCursorPos(x,y + 1) - write("\\") - term.setCursorPos(x + 1,y + 1) - term.setBackgroundColor(colors.blue) - term.setTextColor(colors.lightBlue) - write("/") -end - -local function center(str,yLvl) - x, y = term.getSize() - x = x / 2 - x = x - ( #str / 2 ) - term.setCursorPos(x,yLvl) - write(str) -end - -hash = sha256.sha256 - -term.setBackgroundColor(colors.white) -term.clear() -drawCryst(2,2) -term.setCursorPos(2,5) -term.setBackgroundColor(colors.white) -term.setTextColor(colors.blue) -write("Username: ") -term.setTextColor(colors.lightBlue) -username = read() -term.setCursorPos(2,6) -term.setTextColor(colors.blue) -write("Password: ") -term.setTextColor(colors.lightBlue) -password = hash(read("*")) -term.setBackgroundColor(colors.white) -term.clear() -x, y = term.getSize() -drawCryst(x / 2,y / 2) -sleep(0.8) -term.setCursorPos(2,2) -term.setBackgroundColor(colors.lightGray) -x, y = term.getSize() -x = x - 2 -for i=1,x do - write(" ") -end -if api.login(username,password) then - term.setTextColor(colors.lime) - center("Logged In Successfully.",2) -else - createUser = api.create(username,password) - if createUser == true then - term.setTextColor(colors.lime) - center("Created User",2) - else - term.setTextColor(colors.red) - center("Already Taken / Wrong Password",2) - sleep(2) - term.setBackgroundColor(colors.black) - term.clear() - term.setCursorPos(1,1) - password = nil - return - end -end -sleep(2) -while true do - term.setBackgroundColor(colors.white) - term.clear() - x, y = term.getSize() - x = x - 2 - drawCryst(x,2) - term.setCursorPos(2,2) - term.setBackgroundColor(colors.white) - term.setTextColor(colors.blue) - write("Balance: ") - term.setTextColor(colors.lightBlue) - bal = api.getBalance(username) - write(bal.."CST") - term.setCursorPos(2,4) - term.setBackgroundColor(colors.lightGray) - term.setTextColor(colors.gray) - write(" Exit ") - term.setCursorPos(2,6) - write("Transfer") - term.setCursorPos(2,8) - write(" Lookup ") - term.setCursorPos(2,10) - write("Password") - term.setCursorPos(2,12) - term.setBackgroundColor(colors.red) - write(" Delete ") - e, c, x, y = os.pullEvent("mouse_click") - if x > 1 and x < 10 and y == 4 then - term.setBackgroundColor(colors.black) - term.clear() - term.setCursorPos(1,1) - password = nil - return - end - if x > 1 and x < 10 and y == 6 then - term.setBackgroundColor(colors.white) - term.clear() - x, y = term.getSize() - x = x - 2 - drawCryst(x,2) - term.setCursorPos(2,2) - term.setBackgroundColor(colors.white) - term.setTextColor(colors.blue) - write("Send To: ") - term.setTextColor(colors.lightBlue) - toUser = read() - term.setCursorPos(2,3) - term.setTextColor(colors.blue) - write("Ammount: ") - term.setTextColor(colors.lightBlue) - ammount = tonumber(read()) - if ammount == nil then - term.setCursorPos(2,5) - term.setTextColor(colors.orange) - write("Ammount not a number") - else - trans = api.transaction(username,password,toUser,ammount) - if trans == "User doesn't exists!" then - term.setTextColor(colors.red) - term.setCursorPos(2,5) - write("Username doesn't exist!") - elseif trans == "Not enough CST" then - term.setTextColor(colors.red) - term.setCursorPos(2,5) - write("Insufficent Funds") - elseif trans == "Negative amount" then - term.setTextColor(colors.red) - term.setCursorPos(2,5) - write("Negative Ammount!!!!") - elseif username == toUser then - term.setCursorPos(2,5) - term.setTextColor(colors.red) - write("Cannot give yourself money") - else - term.setTextColor(colors.lime) - term.setCursorPos(2,5) - write("Transfer Successful!") - end - end - sleep(1.5) - end - if x > 1 and x < 10 and y == 8 then - term.setBackgroundColor(colors.white) - term.clear() - x,y = term.getSize() - x = x - 2 - drawCryst(x,2) - term.setCursorPos(2,2) - term.setBackgroundColor(colors.white) - term.setTextColor(colors.blue) - write("Account: ") - term.setTextColor(colors.lightBlue) - acc = read() - bal = api.getBalance(acc) - if bal == "User doesn't exists!" then - term.setCursorPos(2,4) - term.setTextColor(colors.red) - write("No such user") - sleep(2) - else - term.setCursorPos(2,4) - term.setTextColor(colors.blue) - write(acc.." Has ") - term.setTextColor(colors.lightBlue) - write(bal.."CST") - os.pullEvent("key") - end - end - if x > 1 and x < 10 and y == 10 then - term.setBackgroundColor(colors.white) - term.clear() - x, y = term.getSize() - x = x - 2 - drawCryst(x,2) - term.setCursorPos(2,2) - term.setTextColor(colors.blue) - term.setBackgroundColor(colors.white) - write("Change Password") - term.setCursorPos(2,4) - write("Old Password: ") - oldPW = hash(read("*")) - if api.login(username,oldPW) then - term.setCursorPos(2,5) - term.setTextColor(colors.blue) - write("New Password: ") - newPW = hash(read("*")) - api.newpass(username,password,newPW) - term.setCursorPos(2,7) - term.setTextColor(colors.lime) - write("Changed Password.") - sleep(2) - else - term.setCursorPos(2,6) - term.setTextColor(colors.red) - write("Incorrect Password") - sleep(2) - end - end - if x > 1 and x < 10 and y == 12 then - term.setBackgroundColor(colors.white) - term.clear() - x, y = term.getSize() - x = x - 2 - drawCryst(x,2) - term.setCursorPos(2,2) - term.setBackgroundColor(colors.white) - term.setTextColor(colors.red) - write("Account Deletion") - term.setCursorPos(2,4) - term.setTextColor(colors.blue) - write("Press [1] To Delete") - term.setCursorPos(2,5) - write("Press [2] To Go Back") - e, k = os.pullEvent("key") - sleep(0.5) - if k == 2 then - term.setCursorPos(2,6) - write("Username: ") - term.setTextColor(colors.lightBlue) - delUser = read() - term.setTextColor(colors.blue) - term.setCursorPos(2,7) - write("Password: ") - term.setTextColor(colors.lightBlue) - delPass = hash(read("*")) - if api.login(username,delPass) then - api.delete(username,delPass) - term.setBackgroundColor(colors.black) - term.clear() - term.setCursorPos(1,1) - return - else - term.setTextColor(colors.red) - term.setCursorPos(2,9) - write("Incorrect Password") - end - end - end -end \ No newline at end of file diff --git a/src/apps/kstwallet.lua b/src/apps/kstwallet.lua new file mode 100644 index 0000000..49a6b5b --- /dev/null +++ b/src/apps/kstwallet.lua @@ -0,0 +1,1636 @@ +--------------------------------------------------- +-- KristWallet by cossacksson -- +--------------------------------------------------- +--This is the reference wallet for Krist. -- +--It is the basic definition of a functional -- +--Krist program, and it was built alongside the -- +--protocol itself. -- +--------------------------------------------------- +--Every last bit of this program (except, of -- +--course, SHA256 itself) was made entirely by -- +--cossacksson and is "free software" and whatnot.-- +--Do whatever you want with it, but if you make -- +--it interact with a currency or network other -- +--than Krist, please give me credit. Thanks <3 -- +--------------------------------------------------- +--This wallet will never save passwords anywhere.-- +--------------------------------------------------- +local version = 10 +local latest = 0 +local balance = 0 +local balance2 = 0 +local balance3 = 0 +local MOD = 2^32 +local MODM = MOD-1 +local gui = 0 +local page = 0 +local lastpage = 0 +local scroll = 0 +local masterkey = "" +local doublekey = "" +local address = "" +local addressv1 = "" +local addressdv = "" +local addresslv = "" +local subject = "" +local name = "" +local subbal = 0 +local subtxs = "" +local stdate = {} +local stpeer = {} +local stval = {} +local blkpeer = {} +local pagespace = "" +local maxspace = "" +local ar = 0 +local amt = 0 +local availability = 0 +local function boot() + checkdir() + checkdir() + print("Starting KristWallet v"..tostring(version)) + log("Started KristWallet v"..tostring(version)) + update() + if readconfig("enabled") and latest <= version then + settle() + openwallet() + while page ~= 0 do + wallet() + end + term.setBackgroundColor(32768) + term.setTextColor(16) + term.clear() + term.setCursorPos(1,1) + log("KristWallet closed safely") + else + if not readconfig("enabled") then print("KristWallet is disabled on this computer.") log("Disabled, shutting down") end + end + if readconfig("rebootonexit") then + log("Rebooted computer") + os.reboot() + end +end +function update() + latest = tonumber(http.get(readconfig("versionserver")).readAll()) + if latest > version then + print("An update is available!") + log("Discovered update") + if readconfig("autoupdate") then + local me = fs.open(fs.getName(shell.getRunningProgram()),"w") + local nextversion = http.get(readconfig("updateserver")).readAll() + print("Installed update. Run this program again to start v"..latest..".") + me.write(nextversion) + me.close() + log("Installed update") + else + log("Ignored update") + latest = -2 + end + else + log("No updates found") + end +end +function log(text) + logfile = fs.open("kst/log","a") + logfile.writeLine(tostring(os.day()).."-"..tostring(os.time()).."/"..text) + logfile.close() +end +function checkfile(path,default) + if not fs.exists("kst/"..path) or path == "syncnode" then + file = fs.open("kst/"..path,"w") + file.writeLine(default) + file.close() + log("Created file "..path) + return false + else + return true + end +end +function readconfig(path) + if fs.exists("kst/"..path) then + file = fs.open("kst/"..path,"r") + local context = file.readAll() + file.close() + if context == "true" then return true end + if context == "false" then return false end + return context + else + print("An unknown error happened") + end +end +function settle() + if term.isColor() then gui = 1 end + if term.isColor() and pocket then gui = 2 end +end +local function drawKrist() + posx, posy = term.getCursorPos() + term.setBackgroundColor(1) + term.setTextColor(32) + term.write("/") + term.setBackgroundColor(32) + term.setTextColor(8192) + term.write("\\") + term.setCursorPos(posx,posy+1) + term.setBackgroundColor(32) + term.setTextColor(8192) + term.write("\\") + term.setBackgroundColor(8192) + term.setTextColor(32) + term.write("/") + term.setCursorPos(posx+2,posy) +end +local function memoize(f) + local mt = {} + local t = setmetatable({}, mt) + function mt:__index(k) + local v = f(k) + t[k] = v + return v + end + return t +end +local function make_bitop_uncached(t, m) + local function bitop(a, b) + local res,p = 0,1 + while a ~= 0 and b ~= 0 do + local am, bm = a % m, b % m + res = res + t[am][bm] * p + a = (a - am) / m + b = (b - bm) / m + p = p*m + end + res = res + (a + b) * p + return res + end + return bitop +end +local function make_bitop(t) + local op1 = make_bitop_uncached(t,2^1) + local op2 = memoize(function(a) return memoize(function(b) return op1(a, b) end) end) + return make_bitop_uncached(op2, 2 ^ (t.n or 1)) +end +local bxor1 = make_bitop({[0] = {[0] = 0,[1] = 1}, [1] = {[0] = 1, [1] = 0}, n = 4}) +local function bxor(a, b, c, ...) + local z = nil + if b then + a = a % MOD + b = b % MOD + z = bxor1(a, b) + if c then z = bxor(z, c, ...) end + return z + elseif a then return a % MOD + else return 0 end +end +local function band(a, b, c, ...) + local z + if b then + a = a % MOD + b = b % MOD + z = ((a + b) - bxor1(a,b)) / 2 + if c then z = bit32_band(z, c, ...) end + return z + elseif a then return a % MOD + else return MODM end +end +local function bnot(x) return (-1 - x) % MOD end +local function rshift1(a, disp) + if disp < 0 then return lshift(a,-disp) end + return math.floor(a % 2 ^ 32 / 2 ^ disp) +end +local function rshift(x, disp) + if disp > 31 or disp < -31 then return 0 end + return rshift1(x % MOD, disp) +end +local function lshift(a, disp) + if disp < 0 then return rshift(a,-disp) end + return (a * 2 ^ disp) % 2 ^ 32 +end +local function rrotate(x, disp) + x = x % MOD + disp = disp % 32 + local low = band(x, 2 ^ disp - 1) + return rshift(x, disp) + lshift(low, 32 - disp) +end +local k = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, +} +local function str2hexa(s) + return (string.gsub(s, ".", function(c) return string.format("%02x", string.byte(c)) end)) +end +local function num2s(l, n) + local s = "" + for i = 1, n do + local rem = l % 256 + s = string.char(rem) .. s + l = (l - rem) / 256 + end + return s +end +local function s232num(s, i) + local n = 0 + for i = i, i + 3 do n = n*256 + string.byte(s, i) end + return n +end +local function preproc(msg, len) + local extra = 64 - ((len + 9) % 64) + len = num2s(8 * len, 8) + msg = msg .. "\128" .. string.rep("\0", extra) .. len + assert(#msg % 64 == 0) + return msg +end +local function initH256(H) + H[1] = 0x6a09e667 + H[2] = 0xbb67ae85 + H[3] = 0x3c6ef372 + H[4] = 0xa54ff53a + H[5] = 0x510e527f + H[6] = 0x9b05688c + H[7] = 0x1f83d9ab + H[8] = 0x5be0cd19 + return H +end +local function digestblock(msg, i, H) + local w = {} + for j = 1, 16 do w[j] = s232num(msg, i + (j - 1)*4) end + for j = 17, 64 do + local v = w[j - 15] + local s0 = bxor(rrotate(v, 7), rrotate(v, 18), rshift(v, 3)) + v = w[j - 2] + w[j] = w[j - 16] + s0 + w[j - 7] + bxor(rrotate(v, 17), rrotate(v, 19), rshift(v, 10)) + end + + local a, b, c, d, e, f, g, h = H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8] + for i = 1, 64 do + local s0 = bxor(rrotate(a, 2), rrotate(a, 13), rrotate(a, 22)) + local maj = bxor(band(a, b), band(a, c), band(b, c)) + local t2 = s0 + maj + local s1 = bxor(rrotate(e, 6), rrotate(e, 11), rrotate(e, 25)) + local ch = bxor (band(e, f), band(bnot(e), g)) + local t1 = h + s1 + ch + k[i] + w[i] + h, g, f, e, d, c, b, a = g, f, e, d + t1, c, b, a, t1 + t2 + end + + H[1] = band(H[1] + a) + H[2] = band(H[2] + b) + H[3] = band(H[3] + c) + H[4] = band(H[4] + d) + H[5] = band(H[5] + e) + H[6] = band(H[6] + f) + H[7] = band(H[7] + g) + H[8] = band(H[8] + h) +end +local function sha256(msg) + msg = preproc(msg, #msg) + local H = initH256({}) + for i = 1, #msg, 64 do digestblock(msg, i, H) end + return str2hexa(num2s(H[1], 4) .. num2s(H[2], 4) .. num2s(H[3], 4) .. num2s(H[4], 4) .. + num2s(H[5], 4) .. num2s(H[6], 4) .. num2s(H[7], 4) .. num2s(H[8], 4)) +end +local function panic() + page = 0 + log("Panicking! Shutting down KristWallet.") +end +local function makeaddressbyte(j) + if j <= 6 then return "0" + elseif j <= 13 then return "1" + elseif j <= 20 then return "2" + elseif j <= 27 then return "3" + elseif j <= 34 then return "4" + elseif j <= 41 then return "5" + elseif j <= 48 then return "6" + elseif j <= 55 then return "7" + elseif j <= 62 then return "8" + elseif j <= 69 then return "9" + elseif j <= 76 then return "a" + elseif j <= 83 then return "b" + elseif j <= 90 then return "c" + elseif j <= 97 then return "d" + elseif j <= 104 then return "e" + elseif j <= 111 then return "f" + elseif j <= 118 then return "g" + elseif j <= 125 then return "h" + elseif j <= 132 then return "i" + elseif j <= 139 then return "j" + elseif j <= 146 then return "k" + elseif j <= 153 then return "l" + elseif j <= 160 then return "m" + elseif j <= 167 then return "n" + elseif j <= 174 then return "o" + elseif j <= 181 then return "p" + elseif j <= 188 then return "q" + elseif j <= 195 then return "r" + elseif j <= 202 then return "s" + elseif j <= 209 then return "t" + elseif j <= 216 then return "u" + elseif j <= 223 then return "v" + elseif j <= 230 then return "w" + elseif j <= 237 then return "x" + elseif j <= 244 then return "y" + elseif j <= 251 then return "z" + else return "e" + end +end +function checkdir() + if fs.isDir("kst") then + math.randomseed(os.time()) + checkfile("log",[[-----KRISTWALLET LOG FILE----- +--If this file becomes excessively large, you +--should save a copy to a disk and stow it away. +--You should not destroy logs - they may help any +--detectives recover stolen krist, or at least find +--the perpetrator! Happy Kristmas! -cossacksson. +---------------------------------------------------]]) + checkfile("enabled","true") --Disabling this just makes KristWallet refuse to start. No danger of Krist loss. + checkfile("sweepv1","true") + checkfile("appendhashes","true") --Disabling this makes it possible to use KristWallet with extremely old addresses. I doubt anyone but me ever will. + checkfile("autoupdate","true") + checkfile("whitelisted","false") + checkfile("rebootonexit","false") + checkfile("locksettings","false") + checkfile("usev1address","false") + checkfile("autologin","false") --Don't use autologin. Admittedly, it was a very stupid and dangerous idea. If you want a wallet exclusive to your address, use whitelist instead. + checkfile("keyAL",sha256("")) + checkfile("keyLV",sha256(math.random(10)..os.time())) --This is where the local vault's krist is stored. DO NOT DESTROY EVER. + checkfile("versionserver","https://raw.githubusercontent.com/BTCTaras/kristwallet/master/staticapi/version") + checkfile("updateserver","https://raw.githubusercontent.com/BTCTaras/kristwallet/master/kristwallet") + checkfile("syncnode","http://ceriat.net/krist/") --A trusted A-class node to push transactions to. + checkfile("whitelist",[[kg5dc1lzo0 +a5dfb396d3]]) + checkfile("blacklist",[[ke3kjplzsz #Blank string (prevent accidents) +kojddz0uzw #RV main +8c11bb0d2d #Ransom virus +]]) + else + fs.makeDir("kst") + end +end +function openwallet() + term.setBackgroundColor(8) + term.clear() + local krists = 0 + repeat + term.setCursorPos(3+(3*krists),3) + drawKrist() + krists = krists + 1 + until krists == 16 + krists = 0 + repeat + term.setCursorPos(3+(3*krists),16) + drawKrist() + krists = krists + 1 + until krists == 16 + term.setBackgroundColor(8) + term.setTextColor(32768) + term.setCursorPos(6,6) + term.write("Password:") + term.setCursorPos(6,8) + -----|---+---------+---------+---------+-----|---+- + term.write("Please enter your secret password to") + term.setCursorPos(6,9) + term.write("use Krist. If this is your first time") + term.setCursorPos(6,10) + term.write("using Krist, type your desired password.") + term.setCursorPos(6,11) + term.write("You will be able to access your Krist") + term.setCursorPos(6,12) + term.write("on any computer on any server as long") + term.setCursorPos(6,13) + term.write("as you type in the same password! It will") + term.setCursorPos(6,14) + term.write("not be saved or shared with anyone.") + term.setCursorPos(16,6) + local password = "" + if readconfig("autologin") then + password = readconfig("keyAL") + else + password = read("*") + if readconfig("appendhashes") then password = sha256("KRISTWALLET"..password) end + end + term.clear() + term.setCursorPos(1,1) + page = 1+gui*(10*(gui-1)) + if readconfig("appendhashes") then masterkey = password.."-000" else masterkey = password end + log("Read password") + addressv1 = string.sub(sha256(masterkey),0,10) + log("Derived address: "..addressv1) + address = makev2address(masterkey) + log("Derived address: "..address) + balance = tonumber(http.get(readconfig("syncnode").."?getbalance="..addressv1).readAll()) + if balance > 0 and readconfig("sweepv1") then local transaction = http.get(readconfig("syncnode").."?pushtx&q="..address.."&pkey="..masterkey.."&amt="..balance).readAll() end + balance = tonumber(http.get(readconfig("syncnode").."?getbalance="..address).readAll()) + if readconfig("whitelisted") then + local whitelist = readconfig("whitelist") + if string.find(whitelist, address) == nil then + log(address.." is not on the whitelist!") + print("Sorry, this wallet is not on the whitelist for this computer!") + page = 0 + os.sleep(3) + end + else + local blacklist = readconfig("blacklist") + if string.find(blacklist, addressv1) ~= nil then + log(addressv1.." is on the blacklist!") + print("Your wallet is blocked from this computer!") + page = 0 + os.sleep(3) + elseif string.find(blacklist, address) ~= nil then + log(address.." is on the blacklist!") + print("Your wallet is blocked from this computer!") + page = 0 + os.sleep(3) + end + end + if readconfig("usev1address") then address = addressv1 end + addresslv = makev2address(readconfig("keyLV")) + log("Loaded local vault") +end +function makev2address(key) + local protein = {} + local stick = sha256(sha256(key)) + local n = 0 + local link = 0 + local v2 = "k" + repeat + if n < 9 then protein[n] = string.sub(stick,0,2) + stick = sha256(sha256(stick)) end + n = n + 1 + until n == 9 + n = 0 + repeat + link = tonumber(string.sub(stick,1+(2*n),2+(2*n)),16) % 9 + if string.len(protein[link]) ~= 0 then + v2 = v2 .. makeaddressbyte(tonumber(protein[link],16)) + protein[link] = '' + n = n + 1 + else + stick = sha256(stick) + end + until n == 9 + return v2 +end +local function postgraphic(px,py,id) + term.setCursorPos(px,py) + if id == 0 then drawKrist() + elseif id == 1 then + --Mined Krist + term.setCursorPos(px+1,py) + term.setBackgroundColor(256) + term.setTextColor(128) + term.write("/T\\") + term.setCursorPos(px,py+1) + term.write("/") + term.setCursorPos(px+2,py+1) + term.write("|") + term.setCursorPos(px+4,py+1) + term.write("\\") + term.setCursorPos(px+2,py+2) + term.write("|") + term.setCursorPos(px+2,py+3) + term.write("|") + term.setCursorPos(px+4,py+2) + drawKrist() + elseif id == 2 then + --Sent Krist + term.setCursorPos(px,py+2) + term.setBackgroundColor(256) + term.setTextColor(16384) + term.write(" ") + term.setCursorPos(px+1,py+3) + term.write(" ") + term.setCursorPos(px+5,py+2) + term.write(" ") + term.setBackgroundColor(1) + term.setCursorPos(px+2,py) + term.write("/\\") + term.setCursorPos(px+2,py+1) + term.write("||") + elseif id == 3 then + --Received Krist + term.setCursorPos(px,py+2) + term.setBackgroundColor(256) + term.setTextColor(8192) + term.write(" ") + term.setCursorPos(px+1,py+3) + term.write(" ") + term.setCursorPos(px+5,py+2) + term.write(" ") + term.setBackgroundColor(1) + term.setCursorPos(px+2,py) + term.write("||") + term.setCursorPos(px+2,py+1) + term.write("\\/") + elseif id == 4 then + --Sent to yourself + term.setCursorPos(px,py+2) + term.setBackgroundColor(256) + term.setTextColor(16) + term.write(" ") + term.setCursorPos(px+1,py+3) + term.write(" ") + term.setCursorPos(px+5,py+2) + term.write(" ") + term.setBackgroundColor(1) + term.setCursorPos(px+1,py) + term.write("/\\||") + term.setCursorPos(px+1,py+1) + term.write("||\\/") + elseif id == 5 then + --Swept from v1 address + term.setCursorPos(px+1,py) + term.setBackgroundColor(256) + term.setTextColor(128) + term.write(" v1 ") + term.setCursorPos(px+2,py+1) + term.setBackgroundColor(1) + term.setTextColor(2048) + term.write("||") + term.setCursorPos(px+2,py+2) + term.write("\\/") + term.setCursorPos(px+1,py+3) + term.setBackgroundColor(16) + term.setTextColor(32768) + term.write(" v2 ") + elseif id == 6 then + --Name registered + term.setBackgroundColor(32) + term.setTextColor(8192) + term.setCursorPos(px+4,py) + term.write("/") + term.setCursorPos(px+1,py+1) + term.write("\\") + term.setCursorPos(px+3,py+1) + term.write("/") + term.setCursorPos(px+2,py+2) + term.write("V") + term.setCursorPos(px+1,py+3) + term.setBackgroundColor(16384) + term.setTextColor(4) + term.write(".kst") + elseif id == 7 then + --Name operation + term.setBackgroundColor(8) + term.setTextColor(512) + term.setCursorPos(px+1,py) + term.write(" a ") + term.setBackgroundColor(1) + term.write("\\") + term.setBackgroundColor(8) + term.setCursorPos(px+1,py+1) + term.write("====") + term.setCursorPos(px+1,py+2) + term.write("====") + term.setCursorPos(px+1,py+3) + term.setBackgroundColor(16384) + term.setTextColor(4) + term.write(".kst") + end +end +function wallet() + hud() + local pagebefore = page + local event, button, xPos, yPos = os.pullEvent("mouse_click") + if gui == 1 and xPos >= 3 and xPos <= 14 then + if yPos == 5 then + page = 1 + balance = tonumber(http.get(readconfig("syncnode").."?getbalance="..address).readAll()) + end + if yPos == 7 then + page = 2 + subject = address + scroll = 0 + end + if yPos == 9 then + page = 3 + balance = tonumber(http.get(readconfig("syncnode").."?getbalance="..address).readAll()) + end + if yPos == 11 then + page = 8 + end + if yPos == 13 then + page = 4 + end + if yPos == 15 then + page = 15 + end + if yPos == 17 then + page = 0 + end + elseif gui == 2 then + if yPos == 2 and xPos >= 19 and xPos <= 24 then + page = 0 + end + end + if page == 1 then + balance = tonumber(http.get(readconfig("syncnode").."?getbalance="..address).readAll()) + if (yPos-7)%5 == 0 and yPos >= 7 and xPos >= 26 and xPos <= 35 then + subject = string.sub(http.get(readconfig("syncnode").."?listtx="..address.."&overview").readAll(),13+(31*((yPos-7)/5)),22+(31*((yPos-7)/5))) + if string.len(subject) == 10 and subject ~= "N/A(Mined)" and subject ~= "N/A(Names)" then + page = 2 + end + end + elseif page == 2 then + if yPos > 2 and yPos <= 2+ar-(16*(scroll)) and xPos >= 31 and xPos < 41 then + if stpeer[(yPos-2)+(16*(scroll))] == "N/A(Mined)" then + --possibly link to a block later? + elseif stpeer[(yPos-2)+(16*(scroll))] == "N/A(Names)" then + --possibly link to a name later?? + else + subject = stpeer[(yPos-2)+(16*(scroll))] + scroll = 0 + end + end + if yPos == 19 and xPos >= 32 and xPos <= 36 then + scroll = 0 + end + if yPos == 19 and xPos >= 38 and xPos <= 41 then + scroll = math.max(0,scroll-1) + end + if yPos == 19 and xPos >= 43 and xPos <= 46 then + scroll = math.min(lastpage,scroll+1) + end + if yPos == 19 and xPos >= 48 then + scroll = lastpage + end + if yPos == 1 and xPos >= 17 then + page = 6 + end + log("Page index is "..scroll) + elseif page == 3 then + if xPos >= 17 then + term.setCursorPos(33,5) + local recipient = read() + term.setCursorPos(33,6) + log("Read recipient for transfer") + local amount = read() + log("Read amount for transfer") + local transaction = http.get(readconfig("syncnode").."?pushtx2&q="..recipient.."&pkey="..masterkey.."&amt="..amount).readAll() + balance = tonumber(http.get(readconfig("syncnode").."?getbalance="..address).readAll()) + log("Attempting to send "..amount.." KST to "..recipient) + term.setCursorPos(19,8) + if transaction == "Success" then + term.setTextColor(8192) + term.write("Transfer successful") + log("Transfer successful") + term.setTextColor(32768) + elseif string.sub(transaction,0,5) == "Error" then + local problem = "An unknown error happened" + local code = tonumber(string.sub(transaction,6,10)) + if code == 1 then problem = "Insufficient funds available" end + if code == 2 then problem = "Not enough KST in transaction" end + if code == 3 then problem = "Can't comprehend amount to send" end + if code == 4 then problem = "Invalid recipient address" end + term.setTextColor(16384) + term.write(problem) + log(problem) + term.setTextColor(32768) + else + term.setTextColor(16384) + term.write(transaction) + term.setTextColor(32768) + end + os.sleep(2.5) --lower this if you do tons of transfers + log("Unfroze display") + end + elseif page == 4 then + if yPos == 3 and xPos >= 19 and xPos <= 31 then + page = 5 + scroll = 0 + end + if yPos == 4 and xPos >= 19 and xPos <= 31 then + page = 10 + end + if yPos == 5 and xPos >= 19 and xPos <= 31 then + --page = 11 + end + if yPos == 3 and xPos >= 35 and xPos <= 48 then + page = 6 + end + if yPos == 4 and xPos >= 35 and xPos <= 46 then + page = 7 + end + elseif page == 5 then + if yPos > 2 and xPos >= 27 and xPos <= 36 then + page = 2 + subject = blkpeer[(yPos-2)] + scroll = 0 + end + elseif page == 6 then + term.setCursorPos(18,1) + term.write(" ") + term.setCursorPos(18,1) + term.write("ADDRESS ") + subject = read() + if string.len(subject) == 10 then + page = 2 + scroll = 0 + else + page = 6 + end + elseif page == 7 then + if yPos > 2 and yPos <= 18 and xPos >= 20 and xPos < 30 then + if blkpeer[(yPos-2)] ~= "N/A(Burnt)" then + page = 2 + subject = blkpeer[(yPos-2)] + scroll = 0 + end + end + elseif page == 15 then + if yPos == 1 and xPos >= 46 then + page = 16 + elseif yPos >= 3 and xPos >= 39 and xPos <= 42 then + page = 17 + local listofnames = http.get(readconfig("syncnode").."?listnames="..address).readAll() + local nameclicked = yPos - 3 + repeat + listofnames = listofnames:sub(1+listofnames:find(";")) + nameclicked = nameclicked - 1 + until nameclicked == 0 + subject = listofnames:sub(0,listofnames:find(";")-1) + end + elseif page == 8 then + if yPos == 3 and xPos >= 19 and xPos <= 30 then + page = 9 + end + if yPos == 3 and xPos >= 35 and xPos <= 47 then + page = 16 + end + if yPos == 4 and xPos >= 19 and xPos <= 29 then + page = 13 + end + elseif page == 16 then + if yPos == 4 and xPos >= 25 then + term.setCursorPos(25,4) + term.write(" ") + term.setCursorPos(25,4) + name = read():lower():gsub(".kst",""):gsub(" ","") + term.setCursorPos(25,4) + term.write("Please wait... ") + if string.len(name) > 0 then + if name == "a" or name == "name" or name == "id" or name == "owner" or name == "registered" or name == "updated" or name == "expires" or name == "unpaid" then + availability = 0 + else + availability = tonumber(http.get(readconfig("syncnode").."?name_check="..name).readAll()) + log("Checked "..name..".kst for availability ("..availability..")") + term.setCursorPos(19,7) + if availability then + term.setTextColor(colors.green) + term.write("Available!") + else + term.setTextColor(colors.red) + term.write("Not available!") + end + end + else + name = "" + end + elseif yPos == 7 and xPos >= 30 and xPos <= 39 and availability == 1 and balance >= 500 then + availability = 2 + local k = http.get(readconfig("syncnode").."?name_new&pkey="..masterkey.."&name="..name).readAll() + end + elseif page == 17 then + if yPos == 5 and xPos >= 25 then + term.setCursorPos(25,5) + term.write(" ") + term.setCursorPos(25,5) + zone = read():gsub("http://","") + term.setCursorPos(25,5) + term.write("Please wait... ") + local sevenminutesleftuntilmaystartsfuckihavetoreleasethisnow = http.get(readconfig("syncnode").."?name_update&pkey="..masterkey.."&name="..subject.."&ar="..zone).readAll() + elseif yPos == 7 and xPos >= 30 and xPos <= 39 and availability == 1 and balance >= 500 then + availability = 2 + local k = http.get(readconfig("syncnode").."?name_new&pkey="..masterkey.."&name="..name).readAll() + end + elseif page == 9 then + if yPos == 4 and xPos >= 30 then + term.setCursorPos(30,4) + term.write(" ") + term.setCursorPos(30,4) + doublekey = read("*") + term.setCursorPos(30,4) + term.write("Please wait... ") + if string.len(doublekey) > 0 then + doublekey = sha256(masterkey.."-"..sha256(doublekey)) + addressdv = makev2address(doublekey) + balance2 = tonumber(http.get(readconfig("syncnode").."?getbalance="..addressdv).readAll()) + log("Derived double vault "..addressdv) + else + addressdv = "" + balance2 = 0 + end + end + if yPos == 5 and xPos >= 33 then + term.setCursorPos(33,5) + term.write(" ") + term.setCursorPos(33,5) + amt = read() + if tonumber(amt) == nil then + amt = 0 + elseif tonumber(amt) % 1 ~= 0 then + amt = 0 + elseif tonumber(amt) <= 0 then + amt = 0 + end + end + if yPos == 6 and xPos >= 25 and xPos <= 33 then + if tonumber(amt) > 0 and string.len(doublekey) > 0 then + if tonumber(amt) <= balance then + local transaction = http.get(readconfig("syncnode").."?pushtx2&q="..addressdv.."&pkey="..masterkey.."&amt="..tonumber(amt)).readAll() + balance = tonumber(http.get(readconfig("syncnode").."?getbalance="..address).readAll()) + balance2 = tonumber(http.get(readconfig("syncnode").."?getbalance="..addressdv).readAll()) + log("Put "..amt.." KST in a double vault") + end + end + end + if yPos == 6 and xPos >= 35 and xPos <= 44 then + if tonumber(amt) > 0 and string.len(doublekey) > 0 then + if tonumber(amt) <= balance2 then + local transaction = http.get(readconfig("syncnode").."?pushtx2&q="..address.."&pkey="..doublekey.."&amt="..tonumber(amt)).readAll() + balance = tonumber(http.get(readconfig("syncnode").."?getbalance="..address).readAll()) + balance2 = tonumber(http.get(readconfig("syncnode").."?getbalance="..addressdv).readAll()) + log("Took "..amt.." KST from a double vault") + end + end + end + elseif page == 13 then + if yPos == 5 and xPos >= 33 then + term.setCursorPos(33,5) + term.write(" ") + term.setCursorPos(33,5) + term.setTextColor(32768) + amt = read() + if tonumber(amt) == nil then + amt = 0 + elseif tonumber(amt) % 1 ~= 0 then + amt = 0 + elseif tonumber(amt) <= 0 then + amt = 0 + end + end + if yPos == 6 and xPos >= 25 and xPos <= 33 then + if tonumber(amt) > 0 then + if tonumber(amt) <= balance then + local transaction = http.get(readconfig("syncnode").."?pushtx2&q="..addresslv.."&pkey="..masterkey.."&amt="..tonumber(amt)).readAll() + balance = tonumber(http.get(readconfig("syncnode").."?getbalance="..address).readAll()) + log("Put "..amt.." KST in a local vault") + end + end + end + if yPos == 6 and xPos >= 35 and xPos <= 44 then + if tonumber(amt) > 0 then + if tonumber(amt) <= balance3 then + local transaction = http.get(readconfig("syncnode").."?pushtx2&q="..address.."&pkey="..readconfig("keyLV").."&amt="..tonumber(amt)).readAll() + balance = tonumber(http.get(readconfig("syncnode").."?getbalance="..address).readAll()) + log("Took "..amt.." KST from a local vault") + end + end + end + end + if pagebefore ~= page then log("Switched to page "..page) end +end +function drawTab(text) + term.setBackgroundColor(512) + term.write(text) +end +function drawBtn(text) + term.setBackgroundColor(32) + term.write(text) +end +function hud() + term.setBackgroundColor(1) + term.setTextColor(32768) + term.clear() + if gui == 1 then + local sidebar = 1 + while sidebar < 51 do + term.setCursorPos(1,sidebar) + term.setBackgroundColor(8) + term.write(" ") + sidebar = sidebar + 1 + end + term.setCursorPos(2,2) + drawKrist() + term.setBackgroundColor(8) + term.setTextColor(32768) + term.write(" KristWallet") + term.setCursorPos(5,3) + term.setTextColor(2048) + term.write("release "..version.."") + term.setCursorPos(2,19) + term.write("by cossacksson") + term.setTextColor(32768) + term.setCursorPos(3,5) + drawTab(" Overview ") + term.setCursorPos(3,7) + drawTab("Transactions") + term.setCursorPos(3,9) + drawTab(" Send Krist ") + term.setCursorPos(3,11) + drawTab(" Special TX ") + term.setCursorPos(3,13) + drawTab(" Economicon ") + term.setCursorPos(3,15) + drawTab("Name Manager") + term.setCursorPos(3,17) + drawTab(" Exit ") + term.setBackgroundColor(1) + elseif gui == 2 then + term.setCursorPos(1,1) + term.setBackgroundColor(8) + term.write(" ") + term.setCursorPos(1,2) + term.write(" ") + term.setCursorPos(1,3) + term.write(" ") + term.setCursorPos(1,4) + term.write(" ") + term.setCursorPos(2,2) + drawKrist() + term.setBackgroundColor(8) + term.setTextColor(32768) + term.write(" KristWallet") + term.setCursorPos(5,3) + term.setTextColor(2048) + term.write("release "..version.."") + term.setCursorPos(19,2) + term.setBackgroundColor(16384) + term.setTextColor(32768) + term.write(" Exit ") + end + if page == 1 then + term.setCursorPos(19,2) + term.write("Your address: ") + term.setTextColor(16384) + term.write(address) + term.setTextColor(32768) + term.setCursorPos(19,5) + local recenttransactions = "" + --if tostring(balance) ~= 'nil' then recenttransactions = http.get(readconfig("syncnode").."?listtx="..address.."&overview").readAll() end + local txtype = 0 + local graphics = 0 + if string.len(recenttransactions) > 25 then + repeat + if string.sub(recenttransactions,13+(31*graphics),22+(31*graphics)) == "N/A(Mined)" then txtype = 1 + elseif string.sub(recenttransactions,13+(31*graphics),22+(31*graphics)) == "N/A(Names)" and tonumber(string.sub(recenttransactions,23+(31*graphics),31+(31*graphics))) == 0 then txtype = 7 + elseif string.sub(recenttransactions,13+(31*graphics),22+(31*graphics)) == "N/A(Names)" then txtype = 6 + elseif string.sub(recenttransactions,13+(31*graphics),22+(31*graphics)) == address then txtype = 4 + elseif string.sub(recenttransactions,13+(31*graphics),22+(31*graphics)) == addressv1 then txtype = 5 + elseif tonumber(string.sub(recenttransactions,23+(31*graphics),31+(31*graphics))) < 0 then txtype = 2 + elseif tonumber(string.sub(recenttransactions,23+(31*graphics),31+(31*graphics))) > 0 then txtype = 3 + end + postgraphic(19,5+(5*graphics),txtype) + term.setCursorPos(26,5+(5*graphics)) + term.setBackgroundColor(1) + term.setTextColor(32768) + if txtype == 1 then term.write("Mined") + elseif txtype == 2 then term.write("Sent") + elseif txtype == 3 then term.write("Received") + elseif txtype == 4 then term.write("Sent to yourself") + elseif txtype == 5 then term.write("Imported") + elseif txtype == 6 then term.write("Name registered") + elseif txtype == 7 then term.write("Name operation") + end + term.setCursorPos(26,6+(5*graphics)) + if txtype == 4 then + term.setTextColor(32768) + elseif tonumber(string.sub(recenttransactions,23+(31*graphics),31+(31*graphics))) > 0 then + term.setTextColor(8192) + term.write("+") + elseif tonumber(string.sub(recenttransactions,23+(31*graphics),31+(31*graphics))) == 0 then + term.setTextColor(16) + else + term.setTextColor(16384) + end + if txtype < 7 then term.write(tostring(tonumber(string.sub(recenttransactions,23+(31*graphics),31+(31*graphics)))).." KST") end + term.setCursorPos(26,7+(5*graphics)) + term.setTextColor(32768) + if txtype ~= 6 then term.setTextColor(512) end + if txtype > 1 and txtype < 6 then term.write(string.sub(recenttransactions,13+(31*graphics),22+(31*graphics))) end + --if txtype == 6 then term.write(".kst") end + term.setCursorPos(26,8+(5*graphics)) + term.setTextColor(128) + term.write(string.sub(recenttransactions,1+(31*graphics),12+(31*graphics))) + graphics = graphics + 1 + until graphics >= math.floor(string.len(recenttransactions)/32) + end + term.setTextColor(colors.gray) + term.setCursorPos(19,5) + term.write("The Krist database is getting") + term.setCursorPos(19,6) + term.write("extremely huge. Some features") + term.setCursorPos(19,7) + term.write("have been temporarily disabled") + term.setCursorPos(19,8) + term.write("until queries can be made more") + term.setCursorPos(19,9) + term.write("efficient.") + term.setCursorPos(19,11) + term.write("This includes the recent") + term.setCursorPos(19,12) + term.write("transaction list that would") + term.setCursorPos(19,13) + term.write("normally be found here.") + term.setTextColor(32768) + term.setCursorPos(19,3) + term.write("Your balance: ") + term.setTextColor(1024) + if tostring(balance) == 'nil' then balance = 0 end + term.write(tostring(balance).." KST ") + term.setTextColor(512) + local names = tonumber(http.get(readconfig("syncnode").."?getnames="..address).readAll()) + if names > 0 then term.write("["..tostring(names).."]") end + if address == "kgvewr7va7" then + term.setCursorPos(1,1) + term.setBackgroundColor(16384) + term.setTextColor(16) + term.clearLine() + term.write("Test alert. Please disregard") + end + elseif page == 2 then + subbal = http.get(readconfig("syncnode").."?getbalance="..subject).readAll() + subtxs = http.get(readconfig("syncnode").."?listtx="..subject).readAll() + log("Loaded transactions for address "..subject) + log("Page index is "..scroll) + term.setCursorPos(18,1) + if subtxs == "end" then subbal = 0 end + term.write("ADDRESS "..subject.." - "..subbal.." KST") + term.setCursorPos(17,2) + term.setBackgroundColor(256) + term.write(" Time Peer Value ") + term.setBackgroundColor(1) + if subtxs ~= "end" then + local tx = 0 + local s = 0 + ar = 16*scroll + repeat + tx = tx + 1 + stdate[tx] = string.sub(subtxs,1,12) + subtxs = string.sub(subtxs,13) + stpeer[tx] = string.sub(subtxs,1,10) + subtxs = string.sub(subtxs,11) + stval[tx] = tonumber(string.sub(subtxs,1,9)) + subtxs = string.sub(subtxs,10) + if stpeer[tx] == subject then stval[tx] = 0 end + until string.len(subtxs) == 3 + repeat + ar = ar + 1 + term.setTextColor(32768) + term.setCursorPos(18,2+ar-(16*(scroll))) + term.write(stdate[ar]) + if stpeer[ar] ~= "N/A(Mined)" then term.setTextColor(512) end + if stpeer[ar] == subject then term.setTextColor(32768) end + if stpeer[ar] == "N/A(Names)" then term.setTextColor(32768) end + term.setCursorPos(31,2+ar-(16*(scroll))) + term.write(stpeer[ar]) + term.setCursorPos(50-string.len(tostring(math.abs(stval[ar]))),2+ar-(16*(scroll))) + if stval[ar] > 0 then + term.setTextColor(8192) + term.write("+") + elseif stval[ar] < 0 then + term.setTextColor(16384) + else + term.setTextColor(32768) + term.write(" ") + end + term.write(tostring(stval[ar])) + until ar == math.min(tx,16*(scroll+1)) + term.setBackgroundColor(256) + term.setCursorPos(17,19) + term.write(" ") + term.setCursorPos(17,19) + term.setTextColor(32768) + lastpage = math.floor((tx-1)/16) + if (1+lastpage) < 100 then maxspace = maxspace.." " end + if (1+lastpage) < 10 then maxspace = maxspace.." " end + if (1+scroll) < 100 then pagespace = pagespace.." " end + if (1+scroll) < 10 then pagespace = pagespace.." " end + term.write(" Page "..pagespace..(1+scroll).."/"..maxspace..(1+lastpage)) + pagespace = "" + maxspace = "" + term.setCursorPos(32,19) + term.setTextColor(128) + term.write("First Prev Next Last") + if (scroll > 0) then + term.setCursorPos(32,19) + term.setTextColor(2048) + term.write("First Prev") + end + if (scroll < lastpage and tx > 16) then + term.setCursorPos(43,19) + term.setTextColor(2048) + term.write("Next Last") + end + else + term.write("No transactions to display!") + term.setBackgroundColor(256) + term.setCursorPos(17,19) + term.write(" ") + term.setCursorPos(17,19) + term.setTextColor(32768) + term.write(" Page 1/ 1") + term.setCursorPos(32,19) + term.setTextColor(128) + term.write("First Prev Next Last") + end + elseif page == 3 then + term.setCursorPos(19,2) + term.write("Your address: ") + term.setTextColor(16384) + term.write(address) + term.setTextColor(32768) + term.setCursorPos(19,3) + term.write("Your balance: ") + term.setTextColor(1024) + if tostring(balance) == 'nil' then balance = 0 end + term.write(tostring(balance).." KST") + term.setTextColor(32768) + term.setCursorPos(19,5) + term.write("Recipient: ") + term.write(" ") + term.setCursorPos(19,6) + term.write("Amount (KST): ") + term.write(" ") + elseif page == 4 then + term.setCursorPos(19,2) + term.write("Mining Addresses") + term.setTextColor(512) + term.setCursorPos(19,3) + term.write("Latest blocks Address lookup") + term.setCursorPos(19,4) + term.write("Lowest hashes Top balances") + term.setCursorPos(19,5) + --term.write("Lowest nonces ") + term.setTextColor(32768) + term.setCursorPos(19,7) + --term.write("Economy Transactions") + term.setTextColor(512) + term.setCursorPos(19,8) + --term.write("KST issuance Latest transfers") + term.setCursorPos(19,9) + --term.write("KST distrib. Largest transfers") + elseif page == 5 then + local blocks = http.get(readconfig("syncnode").."?blocks").readAll() + local tx = 0 + ar = 0 + local height = string.sub(blocks,1,8) + local blktime = {} + blkpeer = {} + local blkhash = {} + height = tonumber(string.sub(blocks,1,8)) + blocks = string.sub(blocks,9) + local today = string.sub(blocks,1,10) + blocks = string.sub(blocks,11) + repeat + tx = tx + 1 + blktime[tx] = string.sub(blocks,1,8) + blocks = string.sub(blocks,9) + blkpeer[tx] = string.sub(blocks,1,10) + blocks = string.sub(blocks,11) + blkhash[tx] = string.sub(blocks,1,12) + blocks = string.sub(blocks,13) + if stpeer[tx] == subject then stval[tx] = 0 end + until string.len(blocks) == 0 + term.setCursorPos(18,1) + term.write("Height: "..tostring(height)) + term.setCursorPos(36,1) + term.write("Date: "..today) + term.setCursorPos(17,2) + term.setBackgroundColor(256) + term.write(" Time Miner Hash ") + ----------(" 00:00:00 0000000000 000000000000 ") + term.setBackgroundColor(1) + repeat + ar = ar + 1 + term.setCursorPos(18,2+ar) + term.write(blktime[ar]) + if blkpeer[ar] ~= "N/A(Burnt)" then term.setTextColor(512) end + term.setCursorPos(27,2+ar) + term.write(blkpeer[ar]) + term.setTextColor(32768) + term.setCursorPos(38,2+ar) + term.write(blkhash[ar]) + until ar == math.min(tx,17*(scroll+1)) + elseif page == 6 then + term.setCursorPos(17,2) + term.setBackgroundColor(256) + term.write(" Time Peer Value ") + term.setBackgroundColor(256) + term.setCursorPos(17,19) + term.write(" ") + term.setCursorPos(17,19) + term.setTextColor(32768) + term.write(" Page /") + term.setCursorPos(32,19) + term.setTextColor(128) + term.write("First Prev Next Last") + term.setBackgroundColor(1) + term.setCursorPos(18,1) + term.write("ADDRESS (click to edit)") + elseif page == 7 then + local blocks = http.get(readconfig("syncnode").."?richapi").readAll() + local tx = 0 + ar = 0 + local height = string.sub(blocks,1,8) + local blktime = {} + blkpeer = {} + local blkhash = {} + repeat + tx = tx + 1 + blkpeer[tx] = string.sub(blocks,1,10) + blocks = string.sub(blocks,11) + blktime[tx] = tonumber(string.sub(blocks,1,8)) + blocks = string.sub(blocks,9) + blkhash[tx] = string.sub(blocks,1,11) + blocks = string.sub(blocks,12) + until string.len(blocks) == 0 + term.setCursorPos(18,1) + term.write("Krist address rich list") + term.setCursorPos(17,2) + term.setBackgroundColor(256) + term.write("R# Address Balance First seen ") + term.setBackgroundColor(1) + repeat + ar = ar + 1 + term.setCursorPos(17,2+ar) + if ar < 10 then term.write(" ") end + term.write(ar) + term.setCursorPos(20,2+ar) + if blkpeer[ar] ~= "N/A(Burnt)" then term.setTextColor(512) end + term.write(blkpeer[ar]) + term.setTextColor(32768) + term.setCursorPos(39-string.len(tostring(math.abs(blktime[ar]))),2+ar) + term.write(blktime[ar]) + term.setCursorPos(40,2+ar) + term.write(blkhash[ar]) + until ar == 16 + elseif page == 8 then + term.setCursorPos(19,2) + term.write("Storage Domain names") + term.setTextColor(512) + term.setCursorPos(19,3) + term.write("Double vault Register name") + term.setCursorPos(19,4) + term.write("Local vault Edit zone record") + term.setCursorPos(19,5) + --term.write("Disk vault v1 SHA vault") + term.setCursorPos(19,6) + --term.write("SHA vault v1 wallet") + elseif page == 9 then + term.setCursorPos(25,2) + term.write("Double vault manager") + term.setCursorPos(19,8) + term.write("Using double vaults is a way to") + term.setCursorPos(19,9) + term.write("store your Krist under an extra") + term.setCursorPos(19,10) + term.write("layer of security. You can only") + term.setCursorPos(19,11) + term.write("access a double vault from your") + term.setCursorPos(19,12) + term.write("wallet (on any server) and then") + term.setCursorPos(19,13) + term.write("only after typing an extra pass") + term.setCursorPos(19,14) + term.write("code. Double wallets are wholly") + term.setCursorPos(19,15) + term.write("invisible to unauthorized users") + term.setCursorPos(19,16) + term.write("of your wallet; they can not be") + term.setCursorPos(19,17) + term.write("seen or opened without the pass") + term.setCursorPos(19,18) + term.write("code set by you.") + term.setCursorPos(19,4) + term.write("Pass code: ") + term.setCursorPos(19,5) + term.write("Amount (KST): ") + term.setCursorPos(30,4) + if string.len(doublekey) == 0 then + term.setTextColor(256) + term.write("(click to set)") + else + term.setTextColor(8192) + term.write("Ready: "..balance2.." KST") + if tonumber(amt) > 0 then + term.setCursorPos(25,6) + term.setTextColor(32768) + term.setBackgroundColor(128) + if tonumber(amt) <= balance then + term.setBackgroundColor(2) + end + term.write(" Deposit ") + term.setBackgroundColor(1) + term.write(" ") + term.setBackgroundColor(128) + if tonumber(amt) <= balance2 then + term.setBackgroundColor(2) + end + term.write(" Withdraw ") + term.setBackgroundColor(1) + end + end + term.setCursorPos(33,5) + if amt == 0 then + term.setTextColor(256) + term.write("(click to set)") + else + term.setTextColor(32768) + term.write(amt) + end + term.setTextColor(32768) + elseif page == 10 then + local blocks = http.get(readconfig("syncnode").."?blocks&low").readAll() + local tx = 0 + ar = 0 + local blktime = {} + blkpeer = {} + local blkhash = {} + repeat + tx = tx + 1 + blktime[tx] = string.sub(blocks,1,6) + blocks = string.sub(blocks,7) + blkpeer[tx] = string.sub(blocks,1,6) + blocks = string.sub(blocks,7) + blkhash[tx] = string.sub(blocks,1,20) + blocks = string.sub(blocks,21) + until string.len(blocks) == 0 + term.setCursorPos(17,1) + term.setBackgroundColor(256) + term.write(" Date Block# Hash ") + ----------(" Feb 28 000000 000000000000oooooooo") + term.setBackgroundColor(1) + repeat + ar = ar + 1 + term.setCursorPos(18,1+ar) + term.write(blktime[ar]) + term.setCursorPos(31-string.len(tostring(math.abs(tonumber(blkpeer[ar])))),1+ar) + term.write(tonumber(blkpeer[ar])) + term.setTextColor(256) + term.setCursorPos(32,1+ar) + term.write(blkhash[ar]) + term.setTextColor(32768) + term.setCursorPos(32,1+ar) + term.write(string.sub(blkhash[ar],1,12)) + until ar == math.min(tx,18) + elseif page == 11 then + local blocks = http.get(readconfig("syncnode").."?blocks&low&lownonce").readAll() + local tx = 0 + ar = 0 + local blktime = {} + blkpeer = {} + local blkhash = {} + repeat + tx = tx + 1 + blktime[tx] = string.sub(blocks,1,6) + blocks = string.sub(blocks,7) + blkpeer[tx] = string.sub(blocks,1,6) + blocks = string.sub(blocks,7) + blkhash[tx] = string.sub(blocks,1,12) + blocks = string.sub(blocks,13) + until string.len(blocks) == 0 + term.setCursorPos(17,1) + term.setBackgroundColor(256) + term.write(" Date Block# Nonce ") + ----------(" Feb 28 000000 000000000000") + term.setBackgroundColor(1) + repeat + ar = ar + 1 + term.setCursorPos(18,1+ar) + term.write(blktime[ar]) + term.setCursorPos(31-string.len(tostring(math.abs(tonumber(blkpeer[ar])))),1+ar) + term.write(tonumber(blkpeer[ar])) + term.setTextColor(32768) + term.setCursorPos(32,1+ar) + term.write(tonumber(blkhash[ar])) + until ar == math.min(tx,18) + elseif page == 12 then + local blocks = http.get(readconfig("syncnode").."?blocks&low&highnonce").readAll() + local tx = 0 + ar = 0 + local blktime = {} + blkpeer = {} + local blkhash = {} + repeat + tx = tx + 1 + blktime[tx] = string.sub(blocks,1,6) + blocks = string.sub(blocks,7) + blkpeer[tx] = string.sub(blocks,1,6) + blocks = string.sub(blocks,7) + blkhash[tx] = string.sub(blocks,1,12) + blocks = string.sub(blocks,13) + until string.len(blocks) == 0 + term.setCursorPos(17,1) + term.setBackgroundColor(256) + term.write(" Date Block# Nonce ") + ----------(" Feb 28 000000 000000000000") + term.setBackgroundColor(1) + repeat + ar = ar + 1 + term.setCursorPos(18,1+ar) + term.write(blktime[ar]) + term.setCursorPos(31-string.len(tostring(math.abs(tonumber(blkpeer[ar])))),1+ar) + term.write(tonumber(blkpeer[ar])) + term.setTextColor(32768) + term.setCursorPos(32,1+ar) + term.write(tonumber(blkhash[ar])) + until ar == math.min(tx,18) + elseif page == 13 then + balance3 = tonumber(http.get(readconfig("syncnode").."?getbalance="..addresslv).readAll()) + term.setCursorPos(25,2) + term.write("Local vault manager") + term.setCursorPos(19,8) + term.write("Local vaults are a place to put") + term.setCursorPos(19,9) + term.write("Krist in the form of a file on") + term.setCursorPos(19,10) + term.write("a computer. Unlike traditional") + term.setCursorPos(19,11) + term.write("wallets, local vaults can only") + term.setCursorPos(19,12) + term.write("be accessed on the computer") + term.setCursorPos(19,13) + term.write("they were initially created on.") + term.setCursorPos(19,14) + term.write("This has use cases, but is a") + term.setCursorPos(19,15) + term.write("dangerous way of storing Krist") + term.setCursorPos(19,16) + term.write("and you should probably only do") + term.setCursorPos(19,17) + term.write("it this way if you know what") + term.setCursorPos(19,18) + term.write("you're doing.") + term.setCursorPos(19,4) + term.write("KST put here: "..balance3) + term.setCursorPos(19,5) + term.write("Amount (KST): ") + term.setCursorPos(33,5) + if amt == 0 then + term.setTextColor(256) + term.write("(click to set)") + else + term.setTextColor(32768) + term.write(amt) + end + if tonumber(amt) > 0 then + term.setCursorPos(25,6) + term.setTextColor(32768) + term.setBackgroundColor(128) + if tonumber(amt) <= balance then + term.setBackgroundColor(2) + end + term.write(" Deposit ") + term.setBackgroundColor(1) + term.write(" ") + term.setBackgroundColor(128) + if tonumber(amt) <= balance3 then + term.setBackgroundColor(2) + end + term.write(" Withdraw ") + term.setBackgroundColor(1) + end + elseif page == 14 then + term.setBackgroundColor(1) + term.setCursorPos(19,2) + term.write("Local settings") + --deprecated for now + elseif page == 15 then + term.setBackgroundColor(1) + term.setCursorPos(18,1) + term.write(".KST domain name manager [New]") + term.setCursorPos(46,1) + term.setBackgroundColor(32) + term.setTextColor(1) + term.write(" + NEW") + term.setCursorPos(17,2) + term.setBackgroundColor(256) + term.setTextColor(32768) + term.write(" Name Actions ") + term.setBackgroundColor(1) + term.setCursorPos(18,3) + local namelist = http.get(readconfig("syncnode").."?listnames="..address).readAll() + if string.len(namelist) == 0 then + term.setTextColor(256) + term.write("No names to display!") + else + local namecount = 0 + repeat + term.setTextColor(32768) + term.setCursorPos(18,3+namecount) + term.write(string.sub(namelist:sub(0,namelist:find(";")-1)..".kst",0,20)) + term.setCursorPos(39,3+namecount) + term.setTextColor(512) + term.write("Edit ") + term.setTextColor(256) + term.write("Send ") + term.write("Go") + namelist = namelist:sub(1+namelist:find(";")) + namecount = namecount + 1 + until string.len(namelist) == 0 + end + --term.write("a.kst Edit Send Go") + term.setBackgroundColor(1) + elseif page == 16 then + term.setBackgroundColor(1) + term.setCursorPos(20,2) + term.write(".KST domain name registration") + term.setCursorPos(19,4) + term.write("Name: ") + if name == "" then + term.setTextColor(colors.lightGray) + term.write("(click to set)") + else + term.write(name) + term.setTextColor(colors.lightGray) + term.write(".kst") + end + term.setTextColor(colors.black) + term.setCursorPos(19,5) + term.write("Cost: 500 KST") + term.setCursorPos(19,7) + --term.write("Available! [Register]") + if name == "" then + term.setTextColor(colors.blue) + term.write("Please select a name!") + elseif availability == 1 then + term.setTextColor(colors.green) + term.write("Available! ") + if balance >= 500 then + term.setBackgroundColor(colors.green) + term.setTextColor(colors.lime) + term.write(" Register ") + term.setBackgroundColor(colors.white) + end + elseif availability == 2 then + term.setTextColor(colors.yellow) + term.write("Name registered!") + else + term.setTextColor(colors.red) + term.write("Not available!") + end + term.setTextColor(colors.black) + term.setCursorPos(19,9) + term.write(".KST domain names are used on") + term.setCursorPos(19,10) + term.write("the KristScape browser. For") + term.setCursorPos(19,11) + term.write("more information, please see") + term.setCursorPos(19,12) + term.write("the Krist thread.") + term.setCursorPos(19,14) + term.write("All Krist spent on names will") + term.setCursorPos(19,15) + term.write("be added to the value of") + term.setCursorPos(19,16) + term.write("future blocks; essentially") + term.setCursorPos(19,17) + term.write("being \"re-mined.\"") + elseif page == 17 then + term.setBackgroundColor(1) + term.setCursorPos(28,2) + term.write(".KST zone file") + term.setCursorPos(19,4) + term.write("Name: "..subject) + term.setTextColor(colors.lightGray) + term.write(".kst") + term.setTextColor(colors.black) + term.setCursorPos(19,5) + term.write("Zone: ") + zone = http.get(readconfig("syncnode").."?a="..subject).readAll() + if zone == "" then + term.setTextColor(colors.lightGray) + term.write("(click to set)") + else + term.write(zone) + end + elseif page == 21 then + term.setBackgroundColor(1) + term.setCursorPos(4,6) + term.write("Address - ") + term.setTextColor(16384) + term.write(address) + term.setTextColor(32768) + term.setCursorPos(4,7) + term.write("Balance - ") + term.setTextColor(1024) + if tostring(balance) == 'nil' then balance = 0 end + term.write(tostring(balance).." KST") + term.setTextColor(32768) + term.setCursorPos(3,9) + end +end +boot()