--[[----------------------------------------------- | KristWallet by cossacksson | --------------------------------------------------- | This is the reference wallet for Krist. | | It is the basic definition of a functional | | Krist program, although it is not as old as the | | network (we used to just use raw API calls). | --------------------------------------------------- | 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 --[[pretty sneaky, huh?]] -----------------------------------------------]]-- version = 11 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_wallet","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_wallet",[[-----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("")) --This is meaningless gibberish 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() log("Swept hex address") end balance = tonumber(http.get(readconfig("syncnode").."?getbalance="..address).readAll()) if balance >= 100000 then log("Woah! There's a small fortune here!") elseif balance > 0 then log("There is some krist here!") end if balance == 420 then log("This is such a blazing balance") end if balance == 42 then log("Hey, Chuck") end 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") elseif id == 8 then --Name sent elseif id == 9 then --Name received 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 if nameclicked > 0 then repeat listofnames = listofnames:sub(1+listofnames:find(";")) nameclicked = nameclicked - 1 until nameclicked == 0 end subject = listofnames:sub(0,listofnames:find(";")-1) elseif yPos >= 3 and xPos >= 44 and xPos <= 47 then page = 18 local listofnames = http.get(readconfig("syncnode").."?listnames="..address).readAll() local nameclicked = yPos - 3 if nameclicked > 0 then repeat listofnames = listofnames:sub(1+listofnames:find(";")) nameclicked = nameclicked - 1 until nameclicked == 0 end 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 == 18 then if yPos == 5 and xPos >= 30 then term.setCursorPos(30,5) term.write(" ") term.setCursorPos(30,5) maxspace = read():lower() term.setCursorPos(19,7) pagespace = http.get(readconfig("syncnode").."?name_transfer&pkey="..masterkey.."&name="..subject.."&q="..maxspace).readAll() if pagespace == "Success" then end term.write("Transfer request broadcasted") log("Tried sending a name to "..maxspace) os.sleep(3) page = 15 --im drunk on water right now 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 == "khm4f12scx" or address == "klhyy8e845" or address == "kcyd5vejdw" then term.setCursorPos(1,1) term.setBackgroundColor(16384) term.setTextColor(16) term.clearLine() term.write("The crash on trying to edit a name is now fixed btw") 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 Names") term.setTextColor(512) term.setCursorPos(19,3) term.write("Double vault Register name") term.setCursorPos(19,4) term.write("Local vault ") 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 local thisname = namelist:sub(0,namelist:find(";")-1) term.setTextColor(32768) term.setCursorPos(18,3+namecount) term.write(string.sub(thisname..".kst",0,20)) term.setCursorPos(39,3+namecount) term.setTextColor(512) if thisname == "a" or thisname == "name" or thisname == "owner" or thisname == "updated" or thisname == "registered" or thisname == "expires" or thisname == "id" or thisname == "unpaid" then term.setTextColor(256) end term.write("Edit Send ") term.setTextColor(256) 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,7) term.write("Your name's zone file is the") term.setCursorPos(19,8) term.write("URL of the site it is pointing") term.setCursorPos(19,9) term.write("to. When KristScape navigates") term.setCursorPos(19,10) term.write("to a name, it will make an HTTP") term.setCursorPos(19,11) term.write("get request to the above URL.") term.setCursorPos(19,12) term.write("The zone record should not") term.setCursorPos(19,13) term.write("include a protocol (http://)") term.setCursorPos(19,14) term.write("and shouldn't end with a") term.setCursorPos(19,15) term.write("slash. You can redirect a name") term.setCursorPos(19,16) term.write("to another name by making the") term.setCursorPos(19,17) term.write("first character of the record") term.setCursorPos(19,18) term.write("a dollar sign; e.g. $krist.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 == 18 then term.setBackgroundColor(1) term.setCursorPos(28,2) term.write("Name transfer") 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("Recipient: ") 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()