diff --git a/apps/3d6/kristwallet.spk b/apps/3d6/kristwallet.spk new file mode 100644 index 0000000..592c493 --- /dev/null +++ b/apps/3d6/kristwallet.spk @@ -0,0 +1,1761 @@ +-- +-- sPhone Application Package +-- Built with SPK builder 1.2 +-- +{ + files = "{\ + [ \"krist.lua\" ] = \"--[[-----------------------------------------------\\r\\\ +| KristWallet by 3d6 |\\r\\\ +---------------------------------------------------\\r\\\ +| This is the reference wallet for Krist. |\\r\\\ +| It is the basic definition of a functional |\\r\\\ +| Krist program, although it is not as old as the |\\r\\\ +| network (we used to just use raw API calls). |\\r\\\ +---------------------------------------------------\\r\\\ + /\\\\ /\\\\ /\\\\ /\\\\ /\\\\ /\\\\ /\\\\ /\\\\ /\\\\ /\\\\ /\\\\ /\\\\ /\\\\\\r\\\ +/ \\\\/ \\\\/ \\\\/ \\\\/ \\\\/ \\\\/ \\\\/ \\\\/ \\\\/ \\\\/ \\\\/ \\\\/\\r\\\ +---------------------------------------------------\\r\\\ +| Do whatever you want with this, but if you make |\\r\\\ +| it interact with a currency or network other |\\r\\\ +| than Krist, please give me credit. Thanks <3 |\\r\\\ +---------------------------------------------------\\r\\\ +| This wallet will NEVER save passwords anywhere. |]]local\\r\\\ +-----------------------------------------------]]--\\r\\\ + version = 14\\r\\\ +local latest = 0\\r\\\ +local balance = 0\\r\\\ +local balance2 = 0\\r\\\ +local balance3 = 0\\r\\\ +local MOD = 2^32\\r\\\ +local MODM = MOD-1\\r\\\ +local gui = 0\\r\\\ +local page = 0\\r\\\ +local lastpage = 0\\r\\\ +local scroll = 0\\r\\\ +local masterkey = \\\"\\\"\\r\\\ +local doublekey = \\\"\\\"\\r\\\ +local address = \\\"\\\"\\r\\\ +local addressv1 = \\\"\\\"\\r\\\ +local addressdv = \\\"\\\"\\r\\\ +local addresslv = \\\"\\\"\\r\\\ +local subject = \\\"\\\"\\r\\\ +local name = \\\"\\\"\\r\\\ +local subbal = 0\\r\\\ +local subtxs = \\\"\\\"\\r\\\ +local stdate = {}\\r\\\ +local stpeer = {}\\r\\\ +local stval = {}\\r\\\ +local blkpeer = {}\\r\\\ +local pagespace = \\\"\\\"\\r\\\ +local maxspace = \\\"\\\"\\r\\\ +local ar = 0\\r\\\ +local amt = 0\\r\\\ +local availability = 0\\r\\\ +local wallet, hud, update, settle, log, readconfig, checkdir, openwallet, makev2address\\r\\\ +\\r\\\ +local function split(inputstr, sep)\\r\\\ + if sep == nil then\\r\\\ + sep = \\\"%s\\\"\\r\\\ + end\\r\\\ + local t={} ; i=1\\r\\\ + for str in string.gmatch(inputstr, \\\"([^\\\"..sep..\\\"]+)\\\") do\\r\\\ + t[i] = str\\r\\\ + i = i + 1\\r\\\ + end\\r\\\ + return t\\r\\\ +end\\r\\\ +\\r\\\ +local function readURL(url)\\r\\\ + local resp = http.get(url)\\r\\\ + if not resp then\\r\\\ + log(\\\"Could not reach \\\"..url)\\r\\\ + error(\\\"Error connecting to server\\\")\\r\\\ + panic()\\r\\\ + end\\r\\\ + local content = resp.readAll():gsub(\\\"\\\\n+$\\\", \\\"\\\")\\r\\\ + resp.close()\\r\\\ + return content\\r\\\ +end\\r\\\ +\\r\\\ +local function boot()\\r\\\ + for i=1,2 do checkdir() end\\r\\\ + print(\\\"Starting KristWallet v\\\"..tostring(version))\\r\\\ + log(\\\"Started KristWallet v\\\"..tostring(version))\\r\\\ + update()\\r\\\ + if readconfig(\\\"enabled\\\") and latest <= version then\\r\\\ + settle()\\r\\\ + openwallet()\\r\\\ + while page ~= 0 do\\r\\\ + wallet()\\r\\\ + end\\r\\\ + term.setBackgroundColor(32768)\\r\\\ + term.setTextColor(16)\\r\\\ + term.clear()\\r\\\ + term.setCursorPos(1,1)\\r\\\ + log(\\\"KristWallet closed safely\\\")\\r\\\ + else\\r\\\ + if not readconfig(\\\"enabled\\\") then print(\\\"KristWallet is disabled on this computer.\\\") log(\\\"Disabled, shutting down\\\") end\\r\\\ + end\\r\\\ + if readconfig(\\\"rebootonexit\\\") then\\r\\\ + log(\\\"Rebooted computer\\\")\\r\\\ + os.reboot()\\r\\\ + end\\r\\\ +end\\r\\\ +function update()\\r\\\ + latest = tonumber(readURL(readconfig(\\\"versionserver\\\")))\\r\\\ + if latest > version then\\r\\\ + print(\\\"An update is available!\\\")\\r\\\ + log(\\\"Discovered update\\\")\\r\\\ + if readconfig(\\\"autoupdate\\\") and not bench then\\r\\\ + local me = fs.open(fs.getName(shell.getRunningProgram()),\\\"w\\\")\\r\\\ + local nextversion = readURL(readconfig(\\\"updateserver\\\"))\\r\\\ + print(\\\"Installed update. Run this program again to start v\\\"..latest..\\\".\\\")\\r\\\ + me.write(nextversion)\\r\\\ + me.close()\\r\\\ + log(\\\"Installed update\\\")\\r\\\ + else\\r\\\ + log(\\\"Ignored update\\\")\\r\\\ + latest = -2\\r\\\ + end\\r\\\ + else\\r\\\ + log(\\\"No updates found\\\")\\r\\\ + end\\r\\\ +end\\r\\\ +function log(text)\\r\\\ + local logfile = spk.open(\\\"log_wallet\\\",\\\"a\\\")\\r\\\ + logfile.writeLine(tostring(os.day())..\\\"-\\\"..tostring(os.time())..\\\"/\\\"..text)\\r\\\ + logfile.close()\\r\\\ +end\\r\\\ +local function checkfile(path,default)\\r\\\ + if not fs.exists(spk.getDataPath()..\\\"/\\\"..path) or path == \\\"syncnode\\\" then\\r\\\ + local file = spk.open(path,\\\"w\\\")\\r\\\ + file.writeLine(default)\\r\\\ + file.close()\\r\\\ + log(\\\"Created file \\\"..path)\\r\\\ + return false\\r\\\ + else\\r\\\ + return true\\r\\\ + end\\r\\\ +end\\r\\\ +function readconfig(path)\\r\\\ + if fs.exists(spk.getDataPath()..\\\"/\\\"..path) then\\r\\\ + local file = spk.open(path,\\\"r\\\")\\r\\\ + local context = file.readAll():gsub(\\\"\\\\n+$\\\", \\\"\\\")\\r\\\ + file.close()\\r\\\ + if context == \\\"true\\\" then return true end\\r\\\ + if context == \\\"false\\\" then return false end\\r\\\ + return context\\r\\\ + else\\r\\\ + print(\\\"An unknown error happened\\\")\\r\\\ + end\\r\\\ +end\\r\\\ +function settle()\\r\\\ + if term.isColor() then gui = 1 end\\r\\\ + if term.isColor() and pocket then gui = 2 end\\r\\\ +end\\r\\\ +local function drawKrist()\\r\\\ + local posx, posy = term.getCursorPos()\\r\\\ + term.setBackgroundColor(1)\\r\\\ + term.setTextColor(32)\\r\\\ + term.write(\\\"/\\\")\\r\\\ + term.setBackgroundColor(32)\\r\\\ + term.setTextColor(8192)\\r\\\ + term.write(\\\"\\\\\\\\\\\")\\r\\\ + term.setCursorPos(posx,posy+1)\\r\\\ + term.setBackgroundColor(32)\\r\\\ + term.setTextColor(8192)\\r\\\ + term.write(\\\"\\\\\\\\\\\")\\r\\\ + term.setBackgroundColor(8192)\\r\\\ + term.setTextColor(32)\\r\\\ + term.write(\\\"/\\\")\\r\\\ + term.setCursorPos(posx+2,posy)\\r\\\ +end\\r\\\ +local function memoize(f)\\r\\\ + local mt = {}\\r\\\ + local t = setmetatable({}, mt)\\r\\\ + function mt:__index(k)\\r\\\ + local v = f(k)\\r\\\ + t[k] = v\\r\\\ + return v\\r\\\ + end\\r\\\ + return t\\r\\\ +end\\r\\\ +local function make_bitop_uncached(t, m)\\r\\\ + local function bitop(a, b)\\r\\\ + local res,p = 0,1\\r\\\ + while a ~= 0 and b ~= 0 do\\r\\\ + local am, bm = a % m, b % m\\r\\\ + res = res + t[am][bm] * p\\r\\\ + a = (a - am) / m\\r\\\ + b = (b - bm) / m\\r\\\ + p = p*m\\r\\\ + end\\r\\\ + res = res + (a + b) * p\\r\\\ + return res\\r\\\ + end\\r\\\ + return bitop\\r\\\ +end\\r\\\ +local function make_bitop(t)\\r\\\ + local op1 = make_bitop_uncached(t,2^1)\\r\\\ + local op2 = memoize(function(a) return memoize(function(b) return op1(a, b) end) end)\\r\\\ + return make_bitop_uncached(op2, 2 ^ (t.n or 1))\\r\\\ +end\\r\\\ +local bxor1 = make_bitop({[0] = {[0] = 0,[1] = 1}, [1] = {[0] = 1, [1] = 0}, n = 4})\\r\\\ +local function bxor(a, b, c, ...)\\r\\\ + local z = nil\\r\\\ + if b then\\r\\\ + a = a % MOD\\r\\\ + b = b % MOD\\r\\\ + z = bxor1(a, b)\\r\\\ + if c then z = bxor(z, c, ...) end\\r\\\ + return z\\r\\\ + elseif a then return a % MOD\\r\\\ + else return 0 end\\r\\\ +end\\r\\\ +local function band(a, b, c, ...)\\r\\\ + local z\\r\\\ + if b then\\r\\\ + a = a % MOD\\r\\\ + b = b % MOD\\r\\\ + z = ((a + b) - bxor1(a,b)) / 2\\r\\\ + if c then z = bit32_band(z, c, ...) end\\r\\\ + return z\\r\\\ + elseif a then return a % MOD\\r\\\ + else return MODM end\\r\\\ +end\\r\\\ +local function bnot(x) return (-1 - x) % MOD end\\r\\\ +local function rshift1(a, disp)\\r\\\ + if disp < 0 then return lshift(a,-disp) end\\r\\\ + return math.floor(a % 2 ^ 32 / 2 ^ disp)\\r\\\ +end\\r\\\ +local function rshift(x, disp)\\r\\\ + if disp > 31 or disp < -31 then return 0 end\\r\\\ + return rshift1(x % MOD, disp)\\r\\\ +end\\r\\\ +local function lshift(a, disp)\\r\\\ + if disp < 0 then return rshift(a,-disp) end\\r\\\ + return (a * 2 ^ disp) % 2 ^ 32\\r\\\ +end\\r\\\ +local function rrotate(x, disp)\\r\\\ + x = x % MOD\\r\\\ + disp = disp % 32\\r\\\ + local low = band(x, 2 ^ disp - 1)\\r\\\ + return rshift(x, disp) + lshift(low, 32 - disp)\\r\\\ +end\\r\\\ +local k = {\\r\\\ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\\r\\\ + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\\r\\\ + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\\r\\\ + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\\r\\\ + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\\r\\\ + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\\r\\\ + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\\r\\\ + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\\r\\\ + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\\r\\\ + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\\r\\\ + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\\r\\\ + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\\r\\\ + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\\r\\\ + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\\r\\\ + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\\r\\\ + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\\r\\\ +}\\r\\\ +local function str2hexa(s)\\r\\\ + return (string.gsub(s, \\\".\\\", function(c) return string.format(\\\"%02x\\\", string.byte(c)) end))\\r\\\ +end\\r\\\ +local function num2s(l, n)\\r\\\ + local s = \\\"\\\"\\r\\\ + for i = 1, n do\\r\\\ + local rem = l % 256\\r\\\ + s = string.char(rem) .. s\\r\\\ + l = (l - rem) / 256\\r\\\ + end\\r\\\ + return s\\r\\\ +end\\r\\\ +local function s232num(s, i)\\r\\\ + local n = 0\\r\\\ + for i = i, i + 3 do n = n*256 + string.byte(s, i) end\\r\\\ + return n\\r\\\ +end\\r\\\ +local function preproc(msg, len)\\r\\\ + local extra = 64 - ((len + 9) % 64)\\r\\\ + len = num2s(8 * len, 8)\\r\\\ + msg = msg .. \\\"\\\\128\\\" .. string.rep(\\\"\\\\0\\\", extra) .. len\\r\\\ + assert(#msg % 64 == 0)\\r\\\ + return msg\\r\\\ +end\\r\\\ +local function initH256(H)\\r\\\ + H[1] = 0x6a09e667\\r\\\ + H[2] = 0xbb67ae85\\r\\\ + H[3] = 0x3c6ef372\\r\\\ + H[4] = 0xa54ff53a\\r\\\ + H[5] = 0x510e527f\\r\\\ + H[6] = 0x9b05688c\\r\\\ + H[7] = 0x1f83d9ab\\r\\\ + H[8] = 0x5be0cd19\\r\\\ + return H\\r\\\ +end\\r\\\ +local function digestblock(msg, i, H)\\r\\\ + local w = {}\\r\\\ + for j = 1, 16 do w[j] = s232num(msg, i + (j - 1)*4) end\\r\\\ + for j = 17, 64 do\\r\\\ + local v = w[j - 15]\\r\\\ + local s0 = bxor(rrotate(v, 7), rrotate(v, 18), rshift(v, 3))\\r\\\ + v = w[j - 2]\\r\\\ + w[j] = w[j - 16] + s0 + w[j - 7] + bxor(rrotate(v, 17), rrotate(v, 19), rshift(v, 10))\\r\\\ + end\\r\\\ + \\r\\\ + 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]\\r\\\ + for i = 1, 64 do\\r\\\ + local s0 = bxor(rrotate(a, 2), rrotate(a, 13), rrotate(a, 22))\\r\\\ + local maj = bxor(band(a, b), band(a, c), band(b, c))\\r\\\ + local t2 = s0 + maj\\r\\\ + local s1 = bxor(rrotate(e, 6), rrotate(e, 11), rrotate(e, 25))\\r\\\ + local ch = bxor (band(e, f), band(bnot(e), g))\\r\\\ + local t1 = h + s1 + ch + k[i] + w[i]\\r\\\ + h, g, f, e, d, c, b, a = g, f, e, d + t1, c, b, a, t1 + t2\\r\\\ + end\\r\\\ + \\r\\\ + H[1] = band(H[1] + a)\\r\\\ + H[2] = band(H[2] + b)\\r\\\ + H[3] = band(H[3] + c)\\r\\\ + H[4] = band(H[4] + d)\\r\\\ + H[5] = band(H[5] + e)\\r\\\ + H[6] = band(H[6] + f)\\r\\\ + H[7] = band(H[7] + g)\\r\\\ + H[8] = band(H[8] + h)\\r\\\ +end\\r\\\ +local function sha256(msg)\\r\\\ + msg = preproc(msg, #msg)\\r\\\ + local H = initH256({})\\r\\\ + for i = 1, #msg, 64 do digestblock(msg, i, H) end\\r\\\ + return str2hexa(num2s(H[1], 4) .. num2s(H[2], 4) .. num2s(H[3], 4) .. num2s(H[4], 4) ..\\r\\\ + num2s(H[5], 4) .. num2s(H[6], 4) .. num2s(H[7], 4) .. num2s(H[8], 4))\\r\\\ +end\\r\\\ +local function panic()\\r\\\ + page = 0\\r\\\ + log(\\\"Panicking! Shutting down KristWallet.\\\")\\r\\\ +end\\r\\\ +local function makeaddressbyte(j)\\r\\\ + if j <= 6 then return \\\"0\\\"\\r\\\ + elseif j <= 13 then return \\\"1\\\"\\r\\\ + elseif j <= 20 then return \\\"2\\\"\\r\\\ + elseif j <= 27 then return \\\"3\\\"\\r\\\ + elseif j <= 34 then return \\\"4\\\"\\r\\\ + elseif j <= 41 then return \\\"5\\\"\\r\\\ + elseif j <= 48 then return \\\"6\\\"\\r\\\ + elseif j <= 55 then return \\\"7\\\"\\r\\\ + elseif j <= 62 then return \\\"8\\\"\\r\\\ + elseif j <= 69 then return \\\"9\\\"\\r\\\ + elseif j <= 76 then return \\\"a\\\"\\r\\\ + elseif j <= 83 then return \\\"b\\\"\\r\\\ + elseif j <= 90 then return \\\"c\\\"\\r\\\ + elseif j <= 97 then return \\\"d\\\"\\r\\\ + elseif j <= 104 then return \\\"e\\\"\\r\\\ + elseif j <= 111 then return \\\"f\\\"\\r\\\ + elseif j <= 118 then return \\\"g\\\"\\r\\\ + elseif j <= 125 then return \\\"h\\\"\\r\\\ + elseif j <= 132 then return \\\"i\\\"\\r\\\ + elseif j <= 139 then return \\\"j\\\"\\r\\\ + elseif j <= 146 then return \\\"k\\\"\\r\\\ + elseif j <= 153 then return \\\"l\\\"\\r\\\ + elseif j <= 160 then return \\\"m\\\"\\r\\\ + elseif j <= 167 then return \\\"n\\\"\\r\\\ + elseif j <= 174 then return \\\"o\\\"\\r\\\ + elseif j <= 181 then return \\\"p\\\"\\r\\\ + elseif j <= 188 then return \\\"q\\\"\\r\\\ + elseif j <= 195 then return \\\"r\\\"\\r\\\ + elseif j <= 202 then return \\\"s\\\"\\r\\\ + elseif j <= 209 then return \\\"t\\\"\\r\\\ + elseif j <= 216 then return \\\"u\\\"\\r\\\ + elseif j <= 223 then return \\\"v\\\"\\r\\\ + elseif j <= 230 then return \\\"w\\\"\\r\\\ + elseif j <= 237 then return \\\"x\\\"\\r\\\ + elseif j <= 244 then return \\\"y\\\"\\r\\\ + elseif j <= 251 then return \\\"z\\\"\\r\\\ + else return \\\"e\\\"\\r\\\ + end\\r\\\ +end\\r\\\ +function checkdir()\\r\\\ + if fs.isDir(spk.getDataPath()) then\\r\\\ + math.randomseed(os.time()) \\r\\\ + checkfile(\\\"log_wallet\\\",\\\"-----KRISTWALLET LOG FILE-----\\\")\\r\\\ + checkfile(\\\"enabled\\\",\\\"true\\\") --Disabling this just makes KristWallet refuse to start.\\r\\\ + checkfile(\\\"sweepv1\\\",\\\"true\\\")\\r\\\ + checkfile(\\\"appendhashes\\\",\\\"true\\\") --Disabling this makes it possible to use KristWallet with extremely old addresses.\\r\\\ + checkfile(\\\"autoupdate\\\",\\\"true\\\")\\r\\\ + checkfile(\\\"whitelisted\\\",\\\"false\\\")\\r\\\ + checkfile(\\\"rebootonexit\\\",\\\"false\\\")\\r\\\ + checkfile(\\\"autologin\\\",\\\"false\\\")\\r\\\ + checkfile(\\\"keyAL\\\",sha256(\\\"\\\"))\\r\\\ + checkfile(\\\"keyLV\\\",sha256(math.random(1000000)..os.time())) --This is where the local vault's krist is stored. DO NOT DESTROY!\\r\\\ + checkfile(\\\"versionserver\\\",\\\"https://raw.githubusercontent.com/BTCTaras/kristwallet/master/staticapi/version\\\")\\r\\\ + checkfile(\\\"updateserver\\\",\\\"https://raw.githubusercontent.com/BTCTaras/kristwallet/master/kristwallet\\\")\\r\\\ + checkfile(\\\"syncnode\\\",\\\"http://krist.ceriat.net/\\\")\\r\\\ + checkfile(\\\"whitelist\\\",\\\"\\\")\\r\\\ + checkfile(\\\"blacklist\\\",\\\"\\\")\\r\\\ + end\\r\\\ +end\\r\\\ +function openwallet()\\r\\\ + term.setBackgroundColor(8)\\r\\\ + term.clear()\\r\\\ + local krists = 0\\r\\\ + repeat\\r\\\ + term.setCursorPos(3+(3*krists),3)\\r\\\ + drawKrist()\\r\\\ + krists = krists + 1\\r\\\ + until krists == 16\\r\\\ + krists = 0\\r\\\ + repeat\\r\\\ + term.setCursorPos(3+(3*krists),16)\\r\\\ + drawKrist()\\r\\\ + krists = krists + 1\\r\\\ + until krists == 16\\r\\\ + term.setBackgroundColor(8)\\r\\\ + term.setTextColor(32768)\\r\\\ + term.setCursorPos(6,6)\\r\\\ + term.write(\\\"Password:\\\")\\r\\\ + term.setCursorPos(6,8)\\r\\\ + -----|---+---------+---------+---------+-----|---+-\\r\\\ + term.write(\\\"Please enter your secret password to\\\")\\r\\\ + term.setCursorPos(6,9)\\r\\\ + term.write(\\\"use Krist. If this is your first time\\\")\\r\\\ + term.setCursorPos(6,10)\\r\\\ + term.write(\\\"using Krist, type your desired password.\\\")\\r\\\ + term.setCursorPos(6,11)\\r\\\ + term.write(\\\"You will be able to access your Krist\\\")\\r\\\ + term.setCursorPos(6,12)\\r\\\ + term.write(\\\"on any computer on any server as long\\\")\\r\\\ + term.setCursorPos(6,13)\\r\\\ + term.write(\\\"as you type in the same password! It will\\\")\\r\\\ + term.setCursorPos(6,14)\\r\\\ + term.write(\\\"not be saved or shared with anyone.\\\")\\r\\\ + term.setCursorPos(16,6)\\r\\\ + local password = \\\"\\\"\\r\\\ + if readconfig(\\\"autologin\\\") then\\r\\\ + password = readconfig(\\\"keyAL\\\")\\r\\\ + else\\r\\\ + password = read(\\\"*\\\")\\r\\\ + if password == \\\"\\\" then term.setCursorPos(16,6) password = read(\\\"*\\\") end\\r\\\ + if readconfig(\\\"appendhashes\\\") then password = sha256(\\\"KRISTWALLET\\\"..password) end\\r\\\ + end\\r\\\ + term.clear()\\r\\\ + term.setCursorPos(1,1)\\r\\\ + page = 1+gui*(10*(gui-1))\\r\\\ + if readconfig(\\\"appendhashes\\\") then masterkey = password..\\\"-000\\\" else masterkey = password end\\r\\\ + log(\\\"Read password\\\")\\r\\\ + addressv1 = string.sub(sha256(masterkey),0,10)\\r\\\ + log(\\\"Derived address: \\\"..addressv1)\\r\\\ + address = makev2address(masterkey)\\r\\\ + log(\\\"Derived address: \\\"..address)\\r\\\ + balance = tonumber(readURL(readconfig(\\\"syncnode\\\")..\\\"?getbalance=\\\"..addressv1))\\r\\\ + if balance > 0 and readconfig(\\\"sweepv1\\\") then local transaction = readURL(readconfig(\\\"syncnode\\\")..\\\"?pushtx&q=\\\"..address..\\\"&pkey=\\\"..masterkey..\\\"&amt=\\\"..balance); log(\\\"Swept hex address\\\") end\\r\\\ + balance = tonumber(readURL(readconfig(\\\"syncnode\\\")..\\\"?getbalance=\\\"..address))\\r\\\ + if balance >= 100000 then log(\\\"Woah! There's a small fortune here!\\\") elseif balance > 0 then log(\\\"There is some krist here!\\\") end\\r\\\ + if readconfig(\\\"whitelisted\\\") then\\r\\\ + local whitelist = readconfig(\\\"whitelist\\\")\\r\\\ + if string.find(whitelist, address) == nil then\\r\\\ + log(address..\\\" is not on the whitelist!\\\")\\r\\\ + print(\\\"Sorry, this wallet is not on the whitelist for this computer!\\\")\\r\\\ + page = 0\\r\\\ + os.sleep(3)\\r\\\ + end\\r\\\ + else\\r\\\ + local blacklist = readconfig(\\\"blacklist\\\")\\r\\\ + if string.find(blacklist, addressv1) ~= nil then\\r\\\ + log(addressv1..\\\" is on the blacklist!\\\")\\r\\\ + print(\\\"Your wallet is blocked from this computer!\\\")\\r\\\ + page = 0\\r\\\ + os.sleep(3)\\r\\\ + elseif string.find(blacklist, address) ~= nil then\\r\\\ + log(address..\\\" is on the blacklist!\\\")\\r\\\ + print(\\\"Your wallet is blocked from this computer!\\\")\\r\\\ + page = 0\\r\\\ + os.sleep(3)\\r\\\ + end\\r\\\ + end\\r\\\ + addresslv = makev2address(readconfig(\\\"keyLV\\\"))\\r\\\ + log(\\\"Loaded local vault\\\")\\r\\\ +end\\r\\\ +function makev2address(key)\\r\\\ + local protein = {}\\r\\\ + local stick = sha256(sha256(key))\\r\\\ + local n = 0\\r\\\ + local link = 0\\r\\\ + local v2 = \\\"k\\\"\\r\\\ + repeat\\r\\\ + if n < 9 then protein[n] = string.sub(stick,0,2)\\r\\\ + stick = sha256(sha256(stick)) end\\r\\\ + n = n + 1\\r\\\ + until n == 9\\r\\\ + n = 0\\r\\\ + repeat\\r\\\ + link = tonumber(string.sub(stick,1+(2*n),2+(2*n)),16) % 9\\r\\\ + if string.len(protein[link]) ~= 0 then\\r\\\ + v2 = v2 .. makeaddressbyte(tonumber(protein[link],16))\\r\\\ + protein[link] = ''\\r\\\ + n = n + 1\\r\\\ + else\\r\\\ + stick = sha256(stick)\\r\\\ + end\\r\\\ + until n == 9\\r\\\ + return v2\\r\\\ +end\\r\\\ +local function postgraphic(px,py,id)\\r\\\ + term.setCursorPos(px,py)\\r\\\ + if id == 0 then drawKrist()\\r\\\ + elseif id == 1 then\\r\\\ + --Mined Krist\\r\\\ + term.setCursorPos(px+1,py)\\r\\\ + term.setBackgroundColor(256)\\r\\\ + term.setTextColor(128)\\r\\\ + term.write(\\\"/T\\\\\\\\\\\")\\r\\\ + term.setCursorPos(px,py+1)\\r\\\ + term.write(\\\"/\\\")\\r\\\ + term.setCursorPos(px+2,py+1)\\r\\\ + term.write(\\\"|\\\")\\r\\\ + term.setCursorPos(px+4,py+1)\\r\\\ + term.write(\\\"\\\\\\\\\\\")\\r\\\ + term.setCursorPos(px+2,py+2)\\r\\\ + term.write(\\\"|\\\")\\r\\\ + term.setCursorPos(px+2,py+3)\\r\\\ + term.write(\\\"|\\\")\\r\\\ + term.setCursorPos(px+4,py+2)\\r\\\ + drawKrist()\\r\\\ + elseif id == 2 then\\r\\\ + --Sent Krist\\r\\\ + term.setCursorPos(px,py+2)\\r\\\ + term.setBackgroundColor(256)\\r\\\ + term.setTextColor(16384)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(px+1,py+3)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(px+5,py+2)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setBackgroundColor(1)\\r\\\ + term.setCursorPos(px+2,py)\\r\\\ + term.write(\\\"/\\\\\\\\\\\")\\r\\\ + term.setCursorPos(px+2,py+1)\\r\\\ + term.write(\\\"||\\\")\\r\\\ + elseif id == 3 then\\r\\\ + --Received Krist\\r\\\ + term.setCursorPos(px,py+2)\\r\\\ + term.setBackgroundColor(256)\\r\\\ + term.setTextColor(8192)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(px+1,py+3)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(px+5,py+2)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setBackgroundColor(1)\\r\\\ + term.setCursorPos(px+2,py)\\r\\\ + term.write(\\\"||\\\")\\r\\\ + term.setCursorPos(px+2,py+1)\\r\\\ + term.write(\\\"\\\\\\\\/\\\")\\r\\\ + elseif id == 4 then\\r\\\ + --Sent to yourself\\r\\\ + term.setCursorPos(px,py+2)\\r\\\ + term.setBackgroundColor(256)\\r\\\ + term.setTextColor(16)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(px+1,py+3)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(px+5,py+2)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setBackgroundColor(1)\\r\\\ + term.setCursorPos(px+1,py)\\r\\\ + term.write(\\\"/\\\\\\\\||\\\")\\r\\\ + term.setCursorPos(px+1,py+1)\\r\\\ + term.write(\\\"||\\\\\\\\/\\\")\\r\\\ + elseif id == 5 then\\r\\\ + --Swept from v1 address\\r\\\ + term.setCursorPos(px+1,py)\\r\\\ + term.setBackgroundColor(256)\\r\\\ + term.setTextColor(128)\\r\\\ + term.write(\\\" v1 \\\")\\r\\\ + term.setCursorPos(px+2,py+1)\\r\\\ + term.setBackgroundColor(1)\\r\\\ + term.setTextColor(2048)\\r\\\ + term.write(\\\"||\\\")\\r\\\ + term.setCursorPos(px+2,py+2)\\r\\\ + term.write(\\\"\\\\\\\\/\\\")\\r\\\ + term.setCursorPos(px+1,py+3)\\r\\\ + term.setBackgroundColor(16)\\r\\\ + term.setTextColor(32768)\\r\\\ + term.write(\\\" v2 \\\")\\r\\\ + elseif id == 6 then\\r\\\ + --Name registered\\r\\\ + term.setBackgroundColor(32)\\r\\\ + term.setTextColor(8192)\\r\\\ + term.setCursorPos(px+4,py)\\r\\\ + term.write(\\\"/\\\")\\r\\\ + term.setCursorPos(px+1,py+1)\\r\\\ + term.write(\\\"\\\\\\\\\\\")\\r\\\ + term.setCursorPos(px+3,py+1)\\r\\\ + term.write(\\\"/\\\")\\r\\\ + term.setCursorPos(px+2,py+2)\\r\\\ + term.write(\\\"V\\\")\\r\\\ + term.setCursorPos(px+1,py+3)\\r\\\ + term.setBackgroundColor(16384)\\r\\\ + term.setTextColor(4)\\r\\\ + term.write(\\\".kst\\\")\\r\\\ + elseif id == 7 then\\r\\\ + --Name operation\\r\\\ + term.setBackgroundColor(8)\\r\\\ + term.setTextColor(512)\\r\\\ + term.setCursorPos(px+1,py)\\r\\\ + term.write(\\\" a \\\")\\r\\\ + term.setBackgroundColor(1)\\r\\\ + term.write(\\\"\\\\\\\\\\\")\\r\\\ + term.setBackgroundColor(8)\\r\\\ + term.setCursorPos(px+1,py+1)\\r\\\ + term.write(\\\"====\\\")\\r\\\ + term.setCursorPos(px+1,py+2)\\r\\\ + term.write(\\\"====\\\")\\r\\\ + term.setCursorPos(px+1,py+3)\\r\\\ + term.setBackgroundColor(16384)\\r\\\ + term.setTextColor(4)\\r\\\ + term.write(\\\".kst\\\")\\r\\\ + elseif id == 8 then\\r\\\ + --Name sent\\r\\\ + term.setCursorPos(px+1,py+3)\\r\\\ + term.setBackgroundColor(16384)\\r\\\ + term.setTextColor(4)\\r\\\ + term.write(\\\".kst\\\")\\r\\\ + term.setTextColor(16384)\\r\\\ + term.setBackgroundColor(1)\\r\\\ + term.setCursorPos(px+2,py)\\r\\\ + term.write(\\\"/\\\\\\\\\\\")\\r\\\ + term.setCursorPos(px+2,py+1)\\r\\\ + term.write(\\\"||\\\")\\r\\\ + elseif id == 9 then\\r\\\ + --Name received\\r\\\ + term.setCursorPos(px+1,py+3)\\r\\\ + term.setBackgroundColor(16384)\\r\\\ + term.setTextColor(4)\\r\\\ + term.write(\\\".kst\\\")\\r\\\ + term.setTextColor(8192)\\r\\\ + term.setBackgroundColor(1)\\r\\\ + term.setCursorPos(px+1,py)\\r\\\ + term.write(\\\"||\\\")\\r\\\ + term.setCursorPos(px+1,py+1)\\r\\\ + term.write(\\\"\\\\\\\\/\\\")\\r\\\ + term.setTextColor(16384)\\r\\\ + term.setCursorPos(px+3,py)\\r\\\ + term.write(\\\"/\\\\\\\\\\\")\\r\\\ + term.setCursorPos(px+3,py+1)\\r\\\ + term.write(\\\"||\\\")\\r\\\ + end\\r\\\ +end\\r\\\ +function wallet()\\r\\\ + hud()\\r\\\ + local pagebefore = page\\r\\\ + local event, button, xPos, yPos = os.pullEvent(\\\"mouse_click\\\")\\r\\\ + if gui == 1 and xPos >= 3 and xPos <= 14 then\\r\\\ + if yPos == 5 then\\r\\\ + page = 1\\r\\\ + balance = tonumber(readURL(readconfig(\\\"syncnode\\\")..\\\"?getbalance=\\\"..address))\\r\\\ + end\\r\\\ + if yPos == 7 then\\r\\\ + page = 2\\r\\\ + subject = address\\r\\\ + scroll = 0\\r\\\ + end\\r\\\ + if yPos == 9 then\\r\\\ + page = 3\\r\\\ + balance = tonumber(readURL(readconfig(\\\"syncnode\\\")..\\\"?getbalance=\\\"..address))\\r\\\ + end\\r\\\ + if yPos == 11 then\\r\\\ + page = 8\\r\\\ + end\\r\\\ + if yPos == 13 then\\r\\\ + page = 4\\r\\\ + end\\r\\\ + if yPos == 15 then\\r\\\ + page = 15\\r\\\ + end\\r\\\ + if yPos == 17 then\\r\\\ + page = 0\\r\\\ + end\\r\\\ + elseif gui == 2 then\\r\\\ + if yPos == 2 and xPos >= 19 and xPos <= 24 then\\r\\\ + page = 0\\r\\\ + end\\r\\\ + end\\r\\\ + local lexm = http.get(readconfig(\\\"syncnode\\\")..\\\"?listnames=\\\"..address)\\r\\\ + local lem = false\\r\\\ + local lexmm\\r\\\ + if lexm.readAll then\\r\\\ + lem = true\\r\\\ + lexmm = lexm.readAll():gsub(\\\"\\\\n+$\\\", \\\"\\\")\\r\\\ + end\\r\\\ + \\r\\\ + if page == 1 then\\r\\\ + balance = tonumber(readURL(readconfig(\\\"syncnode\\\")..\\\"?getbalance=\\\"..address))\\r\\\ + if (yPos-7)%5 == 0 and yPos >= 7 and xPos >= 26 and xPos <= 35 then\\r\\\ + subject = string.sub(readURL(readconfig(\\\"syncnode\\\")..\\\"?listtx=\\\"..address..\\\"&overview\\\"),13+(31*((yPos-7)/5)),22+(31*((yPos-7)/5)))\\r\\\ + if string.len(subject) == 10 and subject ~= \\\"N/A(Mined)\\\" and subject ~= \\\"N/A(Names)\\\" then\\r\\\ + page = 2\\r\\\ + end\\r\\\ + end\\r\\\ + elseif page == 2 then\\r\\\ + if yPos > 2 and yPos <= 2+ar-(16*(scroll)) and xPos >= 31 and xPos < 41 then\\r\\\ + if stpeer[(yPos-2)+(16*(scroll))] == \\\"N/A(Mined)\\\" then\\r\\\ + --possibly link to a block later?\\r\\\ + elseif stpeer[(yPos-2)+(16*(scroll))] == \\\"N/A(Names)\\\" then\\r\\\ + --possibly link to a name later??\\r\\\ + else\\r\\\ + subject = stpeer[(yPos-2)+(16*(scroll))]\\r\\\ + scroll = 0\\r\\\ + end\\r\\\ + end\\r\\\ + if yPos == 19 and xPos >= 32 and xPos <= 36 then\\r\\\ + scroll = 0\\r\\\ + end\\r\\\ + if yPos == 19 and xPos >= 38 and xPos <= 41 then\\r\\\ + scroll = math.max(0,scroll-1)\\r\\\ + end\\r\\\ + if yPos == 19 and xPos >= 43 and xPos <= 46 then\\r\\\ + scroll = math.min(lastpage,scroll+1)\\r\\\ + end\\r\\\ + if yPos == 19 and xPos >= 48 then\\r\\\ + scroll = lastpage\\r\\\ + end\\r\\\ + if yPos == 1 and xPos >= 17 then\\r\\\ + page = 6\\r\\\ + end\\r\\\ + log(\\\"Page index is \\\"..scroll)\\r\\\ + elseif page == 3 then\\r\\\ + if xPos >= 17 then\\r\\\ + term.setCursorPos(33,5)\\r\\\ + local recipient = read()\\r\\\ + term.setCursorPos(33,6)\\r\\\ + log(\\\"Read recipient for transfer\\\")\\r\\\ + local amount = read()\\r\\\ + log(\\\"Read amount for transfer\\\")\\r\\\ + local transaction = readURL(readconfig(\\\"syncnode\\\")..\\\"?pushtx2&q=\\\"..recipient..\\\"&pkey=\\\"..masterkey..\\\"&amt=\\\"..amount)\\r\\\ + balance = tonumber(readURL(readconfig(\\\"syncnode\\\")..\\\"?getbalance=\\\"..address))\\r\\\ + log(\\\"Attempting to send \\\"..amount..\\\" KST to \\\"..recipient)\\r\\\ + term.setCursorPos(19,8)\\r\\\ + if transaction == \\\"Success\\\" then\\r\\\ + term.setTextColor(8192)\\r\\\ + term.write(\\\"Transfer successful\\\")\\r\\\ + log(\\\"Transfer successful\\\")\\r\\\ + term.setTextColor(32768)\\r\\\ + elseif string.sub(transaction,0,5) == \\\"Error\\\" then\\r\\\ + local problem = \\\"An unknown error happened\\\"\\r\\\ + local code = tonumber(string.sub(transaction,6,10))\\r\\\ + if code == 1 then problem = \\\"Insufficient funds available\\\" end\\r\\\ + if code == 2 then problem = \\\"Not enough KST in transaction\\\" end\\r\\\ + if code == 3 then problem = \\\"Can't comprehend amount to send\\\" end\\r\\\ + if code == 4 then problem = \\\"Invalid recipient address\\\" end\\r\\\ + term.setTextColor(16384)\\r\\\ + term.write(problem)\\r\\\ + log(problem)\\r\\\ + term.setTextColor(32768)\\r\\\ + else\\r\\\ + term.setTextColor(16384)\\r\\\ + term.write(transaction)\\r\\\ + term.setTextColor(32768)\\r\\\ + end\\r\\\ + os.sleep(2.5) --lower this if you do tons of transfers\\r\\\ + log(\\\"Unfroze display\\\")\\r\\\ + end\\r\\\ + elseif page == 4 then\\r\\\ + if yPos == 3 and xPos >= 19 and xPos <= 31 then\\r\\\ + page = 5\\r\\\ + scroll = 0\\r\\\ + end\\r\\\ + if yPos == 4 and xPos >= 19 and xPos <= 31 then\\r\\\ + page = 10\\r\\\ + end\\r\\\ + if yPos == 3 and xPos >= 35 and xPos <= 48 then\\r\\\ + page = 6\\r\\\ + end\\r\\\ + if yPos == 4 and xPos >= 35 and xPos <= 46 then\\r\\\ + page = 7\\r\\\ + end\\r\\\ + elseif page == 5 then\\r\\\ + if yPos > 2 and xPos >= 27 and xPos <= 36 then\\r\\\ + page = 2\\r\\\ + subject = blkpeer[(yPos-2)]\\r\\\ + scroll = 0\\r\\\ + end\\r\\\ + elseif page == 6 then\\r\\\ + term.setCursorPos(18,1)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(18,1)\\r\\\ + term.write(\\\"ADDRESS \\\")\\r\\\ + subject = read()\\r\\\ + if string.len(subject) == 10 then\\r\\\ + page = 2\\r\\\ + scroll = 0\\r\\\ + else\\r\\\ + page = 6\\r\\\ + end\\r\\\ + elseif page == 7 then\\r\\\ + if yPos > 2 and yPos <= 18 and xPos >= 20 and xPos < 30 then\\r\\\ + if blkpeer[(yPos-2)] ~= \\\"N/A(Burnt)\\\" then\\r\\\ + page = 2\\r\\\ + subject = blkpeer[(yPos-2)]\\r\\\ + scroll = 0\\r\\\ + end\\r\\\ + end\\r\\\ + elseif page == 15 then\\r\\\ + \\r\\\ + local function isEdit(xpo)\\r\\\ + return xpo >= 39 and xpo <= 42\\r\\\ + end\\r\\\ + local function isSend(xpo)\\r\\\ + return xpo >= 44 and xpo <= 47\\r\\\ + end\\r\\\ + \\r\\\ + if xPos and yPos then\\r\\\ + local listofnames = split(lexmm, \\\";\\\")\\r\\\ + if yPos == 1 and xPos >= 46 then\\r\\\ + page = 16\\r\\\ + elseif lem and yPos >= 3 and isEdit(xPos) then\\r\\\ + if listofnames[yPos - 3] then\\r\\\ + page = 17\\r\\\ + local nameclicked = yPos - 3\\r\\\ + subject = listofnames[nameclicked]\\r\\\ + end\\r\\\ + elseif lem and yPos >= 3 and isSend(xPos) then\\r\\\ + if listofnames[yPos - 3] then\\r\\\ + page = 18\\r\\\ + local nameclicked = yPos - 3\\r\\\ + subject = listofnames[nameclicked]\\r\\\ + end\\r\\\ + end\\r\\\ + end\\r\\\ + elseif page == 8 then\\r\\\ + if yPos == 3 and xPos >= 19 and xPos <= 30 then\\r\\\ + page = 9\\r\\\ + end\\r\\\ + if yPos == 3 and xPos >= 35 and xPos <= 47 then\\r\\\ + page = 16\\r\\\ + end\\r\\\ + if yPos == 4 and xPos >= 35 and xPos <= 47 then\\r\\\ + --page = 18\\r\\\ + end\\r\\\ + if yPos == 4 and xPos >= 19 and xPos <= 29 then\\r\\\ + page = 13\\r\\\ + end\\r\\\ + elseif page == 18 then\\r\\\ + if yPos == 5 and xPos >= 30 then\\r\\\ + term.setCursorPos(30,5)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(30,5)\\r\\\ + maxspace = read():lower()\\r\\\ + term.setCursorPos(19,7)\\r\\\ + pagespace = readURL(readconfig(\\\"syncnode\\\")..\\\"?name_transfer&pkey=\\\"..masterkey..\\\"&name=\\\"..subject..\\\"&q=\\\"..maxspace)\\r\\\ + if pagespace == \\\"Success\\\" then\\r\\\ + end\\r\\\ + term.write(\\\"Name transferred\\\")\\r\\\ + log(\\\"Tried sending a name to \\\"..maxspace)\\r\\\ + os.sleep(3)\\r\\\ + page = 15\\r\\\ + end\\r\\\ + elseif page == 16 then\\r\\\ + if yPos == 4 and xPos >= 25 then\\r\\\ + term.setCursorPos(25,4)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(25,4)\\r\\\ + name = read():lower():gsub(\\\".kst\\\",\\\"\\\"):gsub(\\\" \\\",\\\"\\\")\\r\\\ + term.setCursorPos(25,4)\\r\\\ + term.write(\\\"Please wait... \\\")\\r\\\ + if string.len(name) > 0 then\\r\\\ + 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\\r\\\ + availability = 0\\r\\\ + else\\r\\\ + availability = tonumber(readURL(readconfig(\\\"syncnode\\\")..\\\"?name_check=\\\"..name))\\r\\\ + log(\\\"Checked \\\"..name..\\\".kst for availability (\\\"..availability..\\\")\\\")\\r\\\ + term.setCursorPos(19,7)\\r\\\ + if availability then\\r\\\ + term.setTextColor(colors.green)\\r\\\ + term.write(\\\"Available!\\\")\\r\\\ + else\\r\\\ + term.setTextColor(colors.red)\\r\\\ + term.write(\\\"Not available!\\\")\\r\\\ + end\\r\\\ + end\\r\\\ + else\\r\\\ + name = \\\"\\\"\\r\\\ + end\\r\\\ + elseif yPos == 7 and xPos >= 30 and xPos <= 39 and availability == 1 and balance >= 500 then\\r\\\ + availability = 2\\r\\\ + local k = readURL(readconfig(\\\"syncnode\\\")..\\\"?name_new&pkey=\\\"..masterkey..\\\"&name=\\\"..name)\\r\\\ + end\\r\\\ + elseif page == 17 then\\r\\\ + if yPos == 5 and xPos >= 25 then\\r\\\ + term.setCursorPos(25,5)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(25,5)\\r\\\ + zone = read():gsub(\\\"http://\\\",\\\"\\\")\\r\\\ + term.setCursorPos(25,5)\\r\\\ + term.write(\\\"Please wait... \\\")\\r\\\ + local sevenminutesleftuntilmaystartsfuckihavetoreleasethisnow = readURL(readconfig(\\\"syncnode\\\")..\\\"?name_update&pkey=\\\"..masterkey..\\\"&name=\\\"..subject..\\\"&ar=\\\"..zone)\\r\\\ + elseif yPos == 7 and xPos >= 30 and xPos <= 39 and availability == 1 and balance >= 500 then\\r\\\ + availability = 2\\r\\\ + local k = readURL(readconfig(\\\"syncnode\\\")..\\\"?name_new&pkey=\\\"..masterkey..\\\"&name=\\\"..name)\\r\\\ + end\\r\\\ + elseif page == 9 then\\r\\\ + if yPos == 4 and xPos >= 30 then\\r\\\ + term.setCursorPos(30,4)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(30,4)\\r\\\ + doublekey = read(\\\"*\\\")\\r\\\ + term.setCursorPos(30,4)\\r\\\ + term.write(\\\"Please wait... \\\")\\r\\\ + if string.len(doublekey) > 0 then\\r\\\ + doublekey = sha256(masterkey..\\\"-\\\"..sha256(doublekey))\\r\\\ + addressdv = makev2address(doublekey)\\r\\\ + balance2 = tonumber(readURL(readconfig(\\\"syncnode\\\")..\\\"?getbalance=\\\"..addressdv))\\r\\\ + log(\\\"Derived double vault \\\"..addressdv)\\r\\\ + else\\r\\\ + addressdv = \\\"\\\"\\r\\\ + balance2 = 0\\r\\\ + end\\r\\\ + end\\r\\\ + if yPos == 5 and xPos >= 33 then\\r\\\ + term.setCursorPos(33,5)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(33,5)\\r\\\ + amt = read()\\r\\\ + if tonumber(amt) == nil then\\r\\\ + amt = 0\\r\\\ + elseif tonumber(amt) % 1 ~= 0 then\\r\\\ + amt = 0\\r\\\ + elseif tonumber(amt) <= 0 then\\r\\\ + amt = 0\\r\\\ + end\\r\\\ + end\\r\\\ + if yPos == 6 and xPos >= 25 and xPos <= 33 then\\r\\\ + if tonumber(amt) > 0 and string.len(doublekey) > 0 then\\r\\\ + if tonumber(amt) <= balance then\\r\\\ + local transaction = readURL(readconfig(\\\"syncnode\\\")..\\\"?pushtx2&q=\\\"..addressdv..\\\"&pkey=\\\"..masterkey..\\\"&amt=\\\"..tonumber(amt))\\r\\\ + balance = tonumber(readURL(readconfig(\\\"syncnode\\\")..\\\"?getbalance=\\\"..address))\\r\\\ + balance2 = tonumber(readURL(readconfig(\\\"syncnode\\\")..\\\"?getbalance=\\\"..addressdv))\\r\\\ + log(\\\"Put \\\"..amt..\\\" KST in a double vault\\\")\\r\\\ + end\\r\\\ + end\\r\\\ + end\\r\\\ + if yPos == 6 and xPos >= 35 and xPos <= 44 then\\r\\\ + if tonumber(amt) > 0 and string.len(doublekey) > 0 then\\r\\\ + if tonumber(amt) <= balance2 then\\r\\\ + local transaction = readURL(readconfig(\\\"syncnode\\\")..\\\"?pushtx2&q=\\\"..address..\\\"&pkey=\\\"..doublekey..\\\"&amt=\\\"..tonumber(amt))\\r\\\ + balance = tonumber(readURL(readconfig(\\\"syncnode\\\")..\\\"?getbalance=\\\"..address))\\r\\\ + balance2 = tonumber(readURL(readconfig(\\\"syncnode\\\")..\\\"?getbalance=\\\"..addressdv))\\r\\\ + log(\\\"Took \\\"..amt..\\\" KST from a double vault\\\")\\r\\\ + end\\r\\\ + end\\r\\\ + end\\r\\\ + elseif page == 13 then\\r\\\ + if yPos == 5 and xPos >= 33 then\\r\\\ + term.setCursorPos(33,5)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(33,5)\\r\\\ + term.setTextColor(32768)\\r\\\ + amt = read()\\r\\\ + if tonumber(amt) == nil then\\r\\\ + amt = 0\\r\\\ + elseif tonumber(amt) % 1 ~= 0 then\\r\\\ + amt = 0\\r\\\ + elseif tonumber(amt) <= 0 then\\r\\\ + amt = 0\\r\\\ + end\\r\\\ + end\\r\\\ + if yPos == 6 and xPos >= 25 and xPos <= 33 then\\r\\\ + if tonumber(amt) > 0 then\\r\\\ + if tonumber(amt) <= balance then\\r\\\ + local transaction = readURL(readconfig(\\\"syncnode\\\")..\\\"?pushtx2&q=\\\"..addresslv..\\\"&pkey=\\\"..masterkey..\\\"&amt=\\\"..tonumber(amt))\\r\\\ + balance = tonumber(readURL(readconfig(\\\"syncnode\\\")..\\\"?getbalance=\\\"..address))\\r\\\ + log(\\\"Put \\\"..amt..\\\" KST in a local vault\\\")\\r\\\ + end\\r\\\ + end\\r\\\ + end\\r\\\ + if yPos == 6 and xPos >= 35 and xPos <= 44 then\\r\\\ + if tonumber(amt) > 0 then\\r\\\ + if tonumber(amt) <= balance3 then\\r\\\ + local transaction = readURL(readconfig(\\\"syncnode\\\")..\\\"?pushtx2&q=\\\"..address..\\\"&pkey=\\\"..readconfig(\\\"keyLV\\\")..\\\"&amt=\\\"..tonumber(amt))\\r\\\ + balance = tonumber(readURL(readconfig(\\\"syncnode\\\")..\\\"?getbalance=\\\"..address))\\r\\\ + log(\\\"Took \\\"..amt..\\\" KST from a local vault\\\")\\r\\\ + end\\r\\\ + end\\r\\\ + end\\r\\\ + end\\r\\\ + if pagebefore ~= page then log(\\\"Switched to page \\\"..page) end\\r\\\ +end\\r\\\ +local function drawTab(text)\\r\\\ + term.setBackgroundColor(512)\\r\\\ + term.write(text)\\r\\\ +end\\r\\\ +local function drawBtn(text)\\r\\\ + term.setBackgroundColor(32)\\r\\\ + term.write(text)\\r\\\ +end\\r\\\ +function hud()\\r\\\ + term.setBackgroundColor(1)\\r\\\ + term.setTextColor(32768)\\r\\\ + term.clear()\\r\\\ + if gui == 1 then\\r\\\ + local sidebar = 1\\r\\\ + while sidebar < 51 do\\r\\\ + term.setCursorPos(1,sidebar)\\r\\\ + term.setBackgroundColor(8)\\r\\\ + term.write(\\\" \\\")\\r\\\ + sidebar = sidebar + 1\\r\\\ + end\\r\\\ + term.setCursorPos(2,2)\\r\\\ + drawKrist()\\r\\\ + term.setBackgroundColor(8)\\r\\\ + term.setTextColor(32768)\\r\\\ + term.write(\\\" KristWallet\\\")\\r\\\ + term.setCursorPos(5,3)\\r\\\ + term.setTextColor(2048)\\r\\\ + term.write(\\\"release \\\"..version..\\\"\\\")\\r\\\ + term.setCursorPos(2,19)\\r\\\ + term.write(\\\" by 3d6\\\")\\r\\\ + term.setTextColor(32768)\\r\\\ + term.setCursorPos(3,5)\\r\\\ + drawTab(\\\" Overview \\\")\\r\\\ + term.setCursorPos(3,7)\\r\\\ + drawTab(\\\"Transactions\\\")\\r\\\ + term.setCursorPos(3,9)\\r\\\ + drawTab(\\\" Send Krist \\\")\\r\\\ + term.setCursorPos(3,11)\\r\\\ + drawTab(\\\" Special TX \\\")\\r\\\ + term.setCursorPos(3,13)\\r\\\ + drawTab(\\\" Economicon \\\")\\r\\\ + term.setCursorPos(3,15)\\r\\\ + drawTab(\\\"Name Manager\\\")\\r\\\ + term.setCursorPos(3,17)\\r\\\ + drawTab(\\\" Exit \\\")\\r\\\ + term.setBackgroundColor(1)\\r\\\ + elseif gui == 2 then\\r\\\ + term.setCursorPos(1,1)\\r\\\ + term.setBackgroundColor(8)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(1,2)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(1,3)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(1,4)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(2,2)\\r\\\ + drawKrist()\\r\\\ + term.setBackgroundColor(8)\\r\\\ + term.setTextColor(32768)\\r\\\ + term.write(\\\" KristWallet\\\")\\r\\\ + term.setCursorPos(5,3)\\r\\\ + term.setTextColor(2048)\\r\\\ + term.write(\\\"release \\\"..version..\\\"\\\")\\r\\\ + term.setCursorPos(19,2)\\r\\\ + term.setBackgroundColor(16384)\\r\\\ + term.setTextColor(32768)\\r\\\ + term.write(\\\" Exit \\\")\\r\\\ + end\\r\\\ + if page == 1 then\\r\\\ + term.setCursorPos(19,2)\\r\\\ + term.write(\\\"Your address: \\\")\\r\\\ + term.setTextColor(16384)\\r\\\ + term.write(address)\\r\\\ + term.setTextColor(32768)\\r\\\ + term.setCursorPos(19,5)\\r\\\ + local recenttransactions = \\\"\\\"\\r\\\ + if tostring(balance) ~= 'nil' then recenttransactions = readURL(readconfig(\\\"syncnode\\\")..\\\"?listtx=\\\"..address..\\\"&overview\\\") end\\r\\\ + local txtype = 0\\r\\\ + local graphics = 0\\r\\\ + if string.len(recenttransactions) > 25 then\\r\\\ + repeat\\r\\\ + if string.sub(recenttransactions,13+(31*graphics),22+(31*graphics)) == \\\"N/A(Mined)\\\" then txtype = 1\\r\\\ + 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\\r\\\ + elseif tonumber(string.sub(recenttransactions,23+(31*graphics),31+(31*graphics))) == 0 then txtype = 9\\r\\\ + elseif string.sub(recenttransactions,13+(31*graphics),22+(31*graphics)) == \\\"N/A(Names)\\\" then txtype = 6\\r\\\ + elseif string.sub(recenttransactions,13+(31*graphics),22+(31*graphics)) == address then txtype = 4\\r\\\ + elseif string.sub(recenttransactions,13+(31*graphics),22+(31*graphics)) == addressv1 then txtype = 5\\r\\\ + elseif tonumber(string.sub(recenttransactions,23+(31*graphics),31+(31*graphics))) < 0 then txtype = 2\\r\\\ + elseif tonumber(string.sub(recenttransactions,23+(31*graphics),31+(31*graphics))) > 0 then txtype = 3\\r\\\ + else txtype = 8\\r\\\ + end\\r\\\ + postgraphic(19,5+(5*graphics),txtype)\\r\\\ + term.setCursorPos(26,5+(5*graphics))\\r\\\ + term.setBackgroundColor(1)\\r\\\ + term.setTextColor(32768)\\r\\\ + if txtype == 1 then term.write(\\\"Mined\\\")\\r\\\ + elseif txtype == 2 then term.write(\\\"Sent\\\")\\r\\\ + elseif txtype == 3 then term.write(\\\"Received\\\")\\r\\\ + elseif txtype == 4 then term.write(\\\"Sent to yourself\\\")\\r\\\ + elseif txtype == 5 then term.write(\\\"Imported\\\")\\r\\\ + elseif txtype == 6 then term.write(\\\"Name registered\\\")\\r\\\ + elseif txtype == 7 then term.write(\\\"Name operation\\\")\\r\\\ + elseif txtype == 8 then term.write(\\\"Unknown\\\")\\r\\\ + elseif txtype == 9 then term.write(\\\"Name transfer\\\")\\r\\\ + end\\r\\\ + term.setCursorPos(26,6+(5*graphics))\\r\\\ + if txtype == 4 then\\r\\\ + term.setTextColor(32768)\\r\\\ + elseif tonumber(string.sub(recenttransactions,23+(31*graphics),31+(31*graphics))) > 0 then\\r\\\ + term.setTextColor(8192)\\r\\\ + term.write(\\\"+\\\")\\r\\\ + elseif tonumber(string.sub(recenttransactions,23+(31*graphics),31+(31*graphics))) == 0 then\\r\\\ + term.setTextColor(16)\\r\\\ + else\\r\\\ + term.setTextColor(16384)\\r\\\ + end\\r\\\ + if txtype < 7 then term.write(tostring(tonumber(string.sub(recenttransactions,23+(31*graphics),31+(31*graphics))))..\\\" KST\\\") end\\r\\\ + term.setCursorPos(26,7+(5*graphics))\\r\\\ + term.setTextColor(32768)\\r\\\ + if txtype ~= 6 then term.setTextColor(512) end\\r\\\ + if txtype == 9 or (txtype > 1 and txtype < 6) then term.write(string.sub(recenttransactions,13+(31*graphics),22+(31*graphics))) end\\r\\\ + --if txtype == 6 then term.write(\\\".kst\\\") end\\r\\\ + term.setCursorPos(26,8+(5*graphics))\\r\\\ + term.setTextColor(128)\\r\\\ + term.write(string.sub(recenttransactions,1+(31*graphics),12+(31*graphics)))\\r\\\ + graphics = graphics + 1\\r\\\ + until graphics >= math.floor(string.len(recenttransactions)/32)\\r\\\ + end\\r\\\ + term.setTextColor(32768)\\r\\\ + term.setCursorPos(19,3)\\r\\\ + term.write(\\\"Your balance: \\\")\\r\\\ + term.setTextColor(1024)\\r\\\ + if tostring(balance) == 'nil' then balance = 0 end\\r\\\ + term.write(tostring(balance)..\\\" KST \\\")\\r\\\ + term.setTextColor(512)\\r\\\ + local names = tonumber(readURL(readconfig(\\\"syncnode\\\")..\\\"?getnames=\\\"..address))\\r\\\ + if names > 0 then term.write(\\\"[\\\"..tostring(names)..\\\"]\\\") end\\r\\\ + if address == \\\"ke3kjplzsz\\\" or address == \\\"767fc628a4\\\" or address == \\\"e3b0c44298\\\" then\\r\\\ + term.setCursorPos(1,1)\\r\\\ + term.setBackgroundColor(16384)\\r\\\ + term.setTextColor(16)\\r\\\ + term.clearLine()\\r\\\ + term.write(\\\"You are currently using a blank string password.\\\")\\r\\\ + end\\r\\\ + elseif page == 2 then\\r\\\ + term.setCursorPos(18,1)\\r\\\ + term.write(\\\"Please wait...\\\")\\r\\\ + os.sleep(0)\\r\\\ + subbal = readURL(readconfig(\\\"syncnode\\\")..\\\"?getbalance=\\\"..subject)\\r\\\ + subtxs = readURL(readconfig(\\\"syncnode\\\")..\\\"?listtx=\\\"..subject)\\r\\\ + log(\\\"Loaded transactions for address \\\"..subject)\\r\\\ + log(\\\"Page index is \\\"..scroll)\\r\\\ + term.setCursorPos(18,1)\\r\\\ + if subtxs == \\\"end\\\" then subbal = 0 end\\r\\\ + term.write(\\\"ADDRESS \\\"..subject..\\\" - \\\"..subbal..\\\" KST\\\")\\r\\\ + term.setCursorPos(17,2)\\r\\\ + term.setBackgroundColor(256)\\r\\\ + term.write(\\\" Time Peer Value \\\")\\r\\\ + term.setBackgroundColor(1)\\r\\\ + if subtxs ~= \\\"end\\\" then\\r\\\ + local tx = 0\\r\\\ + local s = 0\\r\\\ + ar = 16*scroll\\r\\\ + repeat\\r\\\ + tx = tx + 1\\r\\\ + stdate[tx] = string.sub(subtxs,1,12)\\r\\\ + subtxs = string.sub(subtxs,13)\\r\\\ + stpeer[tx] = string.sub(subtxs,1,10)\\r\\\ + subtxs = string.sub(subtxs,11)\\r\\\ + stval[tx] = tonumber(string.sub(subtxs,1,9))\\r\\\ + subtxs = string.sub(subtxs,10)\\r\\\ + if stpeer[tx] == subject then stval[tx] = 0 end\\r\\\ + until string.len(subtxs) == 3\\r\\\ + repeat\\r\\\ + ar = ar + 1\\r\\\ + term.setTextColor(32768)\\r\\\ + term.setCursorPos(18,2+ar-(16*(scroll)))\\r\\\ + term.write(stdate[ar])\\r\\\ + if stpeer[ar] ~= \\\"N/A(Mined)\\\" then term.setTextColor(512) end\\r\\\ + if stpeer[ar] == subject then term.setTextColor(32768) end\\r\\\ + if stpeer[ar] == \\\"N/A(Names)\\\" then term.setTextColor(32768) end\\r\\\ + term.setCursorPos(31,2+ar-(16*(scroll)))\\r\\\ + term.write(stpeer[ar])\\r\\\ + term.setCursorPos(50-string.len(tostring(math.abs(stval[ar]))),2+ar-(16*(scroll)))\\r\\\ + if stval[ar] > 0 then\\r\\\ + term.setTextColor(8192)\\r\\\ + term.write(\\\"+\\\")\\r\\\ + elseif stval[ar] < 0 then\\r\\\ + term.setTextColor(16384)\\r\\\ + else\\r\\\ + term.setTextColor(32768)\\r\\\ + term.write(\\\" \\\")\\r\\\ + end\\r\\\ + term.write(tostring(stval[ar]))\\r\\\ + until ar == math.min(tx,16*(scroll+1))\\r\\\ + term.setBackgroundColor(256)\\r\\\ + term.setCursorPos(17,19)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(17,19)\\r\\\ + term.setTextColor(32768)\\r\\\ + lastpage = math.floor((tx-1)/16)\\r\\\ + if (1+lastpage) < 100 then maxspace = maxspace..\\\" \\\" end\\r\\\ + if (1+lastpage) < 10 then maxspace = maxspace..\\\" \\\" end\\r\\\ + if (1+scroll) < 100 then pagespace = pagespace..\\\" \\\" end\\r\\\ + if (1+scroll) < 10 then pagespace = pagespace..\\\" \\\" end\\r\\\ + term.write(\\\" Page \\\"..pagespace..(1+scroll)..\\\"/\\\"..maxspace..(1+lastpage))\\r\\\ + pagespace = \\\"\\\"\\r\\\ + maxspace = \\\"\\\"\\r\\\ + term.setCursorPos(32,19)\\r\\\ + term.setTextColor(128)\\r\\\ + term.write(\\\"First Prev Next Last\\\")\\r\\\ + if (scroll > 0) then\\r\\\ + term.setCursorPos(32,19)\\r\\\ + term.setTextColor(2048)\\r\\\ + term.write(\\\"First Prev\\\")\\r\\\ + end\\r\\\ + if (scroll < lastpage and tx > 16) then\\r\\\ + term.setCursorPos(43,19)\\r\\\ + term.setTextColor(2048)\\r\\\ + term.write(\\\"Next Last\\\")\\r\\\ + end\\r\\\ + else\\r\\\ + term.write(\\\"No transactions to display!\\\")\\r\\\ + term.setBackgroundColor(256)\\r\\\ + term.setCursorPos(17,19)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(17,19)\\r\\\ + term.setTextColor(32768)\\r\\\ + term.write(\\\" Page 1/ 1\\\")\\r\\\ + term.setCursorPos(32,19)\\r\\\ + term.setTextColor(128)\\r\\\ + term.write(\\\"First Prev Next Last\\\")\\r\\\ + end\\r\\\ + elseif page == 3 then\\r\\\ + term.setCursorPos(19,2)\\r\\\ + term.write(\\\"Your address: \\\")\\r\\\ + term.setTextColor(16384)\\r\\\ + term.write(address)\\r\\\ + term.setTextColor(32768)\\r\\\ + term.setCursorPos(19,3)\\r\\\ + term.write(\\\"Your balance: \\\")\\r\\\ + term.setTextColor(1024)\\r\\\ + if tostring(balance) == 'nil' then balance = 0 end\\r\\\ + term.write(tostring(balance)..\\\" KST\\\")\\r\\\ + term.setTextColor(32768)\\r\\\ + term.setCursorPos(19,5)\\r\\\ + term.write(\\\"Recipient: \\\")\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(19,6)\\r\\\ + term.write(\\\"Amount (KST): \\\")\\r\\\ + term.write(\\\" \\\")\\r\\\ + elseif page == 4 then\\r\\\ + term.setCursorPos(19,2)\\r\\\ + term.write(\\\"Mining Addresses\\\")\\r\\\ + term.setTextColor(512)\\r\\\ + term.setCursorPos(19,3)\\r\\\ + term.write(\\\"Latest blocks Address lookup\\\")\\r\\\ + term.setCursorPos(19,4)\\r\\\ + term.write(\\\"Lowest hashes Top balances\\\")\\r\\\ + term.setCursorPos(19,5)\\r\\\ + --term.write(\\\"Lowest nonces \\\")\\r\\\ + term.setTextColor(32768)\\r\\\ + term.setCursorPos(19,7)\\r\\\ + --term.write(\\\"Economy Transactions\\\")\\r\\\ + term.setTextColor(512)\\r\\\ + term.setCursorPos(19,8)\\r\\\ + --term.write(\\\"KST issuance Latest transfers\\\")\\r\\\ + term.setCursorPos(19,9)\\r\\\ + --term.write(\\\"KST distrib. Largest transfers\\\")\\r\\\ + elseif page == 5 then\\r\\\ + local blocks = readURL(readconfig(\\\"syncnode\\\")..\\\"?blocks\\\")\\r\\\ + local tx = 0\\r\\\ + ar = 0\\r\\\ + local height = string.sub(blocks,1,8)\\r\\\ + local blktime = {}\\r\\\ + blkpeer = {}\\r\\\ + local blkhash = {}\\r\\\ + height = tonumber(string.sub(blocks,1,8))\\r\\\ + blocks = string.sub(blocks,9)\\r\\\ + local today = string.sub(blocks,1,10)\\r\\\ + blocks = string.sub(blocks,11)\\r\\\ + repeat\\r\\\ + tx = tx + 1\\r\\\ + blktime[tx] = string.sub(blocks,1,8)\\r\\\ + blocks = string.sub(blocks,9)\\r\\\ + blkpeer[tx] = string.sub(blocks,1,10)\\r\\\ + blocks = string.sub(blocks,11)\\r\\\ + blkhash[tx] = string.sub(blocks,1,12)\\r\\\ + blocks = string.sub(blocks,13)\\r\\\ + if stpeer[tx] == subject then stval[tx] = 0 end\\r\\\ + until string.len(blocks) == 0\\r\\\ + term.setCursorPos(18,1)\\r\\\ + term.write(\\\"Height: \\\"..tostring(height))\\r\\\ + term.setCursorPos(36,1)\\r\\\ + term.write(\\\"Date: \\\"..today)\\r\\\ + term.setCursorPos(17,2)\\r\\\ + term.setBackgroundColor(256)\\r\\\ + term.write(\\\" Time Miner Hash \\\")\\r\\\ + ----------(\\\" 00:00:00 0000000000 000000000000 \\\")\\r\\\ + term.setBackgroundColor(1)\\r\\\ + repeat\\r\\\ + ar = ar + 1\\r\\\ + term.setCursorPos(18,2+ar)\\r\\\ + term.write(blktime[ar])\\r\\\ + if blkpeer[ar] ~= \\\"N/A(Burnt)\\\" then term.setTextColor(512) end\\r\\\ + term.setCursorPos(27,2+ar)\\r\\\ + term.write(blkpeer[ar])\\r\\\ + term.setTextColor(32768)\\r\\\ + term.setCursorPos(38,2+ar)\\r\\\ + term.write(blkhash[ar])\\r\\\ + until ar == math.min(tx,17*(scroll+1))\\r\\\ + elseif page == 6 then\\r\\\ + term.setCursorPos(17,2)\\r\\\ + term.setBackgroundColor(256)\\r\\\ + term.write(\\\" Time Peer Value \\\")\\r\\\ + term.setBackgroundColor(256)\\r\\\ + term.setCursorPos(17,19)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setCursorPos(17,19)\\r\\\ + term.setTextColor(32768)\\r\\\ + term.write(\\\" Page /\\\")\\r\\\ + term.setCursorPos(32,19)\\r\\\ + term.setTextColor(128)\\r\\\ + term.write(\\\"First Prev Next Last\\\")\\r\\\ + term.setBackgroundColor(1)\\r\\\ + term.setCursorPos(18,1)\\r\\\ + term.write(\\\"ADDRESS (click to edit)\\\")\\r\\\ + elseif page == 7 then\\r\\\ + local blocks = readURL(readconfig(\\\"syncnode\\\")..\\\"?richapi\\\")\\r\\\ + local tx = 0\\r\\\ + ar = 0\\r\\\ + local height = string.sub(blocks,1,8)\\r\\\ + local blktime = {}\\r\\\ + blkpeer = {}\\r\\\ + local blkhash = {}\\r\\\ + repeat\\r\\\ + tx = tx + 1\\r\\\ + blkpeer[tx] = string.sub(blocks,1,10)\\r\\\ + blocks = string.sub(blocks,11)\\r\\\ + blktime[tx] = tonumber(string.sub(blocks,1,8))\\r\\\ + blocks = string.sub(blocks,9)\\r\\\ + blkhash[tx] = string.sub(blocks,1,11)\\r\\\ + blocks = string.sub(blocks,12)\\r\\\ + until string.len(blocks) == 0\\r\\\ + term.setCursorPos(18,1)\\r\\\ + term.write(\\\"Krist address rich list\\\")\\r\\\ + term.setCursorPos(17,2)\\r\\\ + term.setBackgroundColor(256)\\r\\\ + term.write(\\\"R# Address Balance First seen \\\")\\r\\\ + term.setBackgroundColor(1)\\r\\\ + repeat\\r\\\ + ar = ar + 1\\r\\\ + term.setCursorPos(17,2+ar)\\r\\\ + if ar < 10 then term.write(\\\" \\\") end\\r\\\ + term.write(ar)\\r\\\ + term.setCursorPos(20,2+ar)\\r\\\ + if blkpeer[ar] ~= \\\"N/A(Burnt)\\\" then term.setTextColor(512) end\\r\\\ + term.write(blkpeer[ar])\\r\\\ + term.setTextColor(32768)\\r\\\ + term.setCursorPos(39-string.len(tostring(math.abs(blktime[ar]))),2+ar)\\r\\\ + term.write(blktime[ar])\\r\\\ + term.setCursorPos(40,2+ar)\\r\\\ + term.write(blkhash[ar])\\r\\\ + until ar == 16\\r\\\ + elseif page == 8 then\\r\\\ + term.setCursorPos(19,2)\\r\\\ + term.write(\\\"Storage Names\\\")\\r\\\ + term.setTextColor(512)\\r\\\ + term.setCursorPos(19,3)\\r\\\ + term.write(\\\"Double vault Register name\\\")\\r\\\ + term.setCursorPos(19,4)\\r\\\ + term.write(\\\"Local vault\\\")\\r\\\ + term.setCursorPos(19,5)\\r\\\ + --term.write(\\\"Disk vault v1 SHA vault\\\")\\r\\\ + term.setCursorPos(19,6)\\r\\\ + --term.write(\\\"SHA vault v1 wallet\\\")\\r\\\ + elseif page == 9 then\\r\\\ + term.setCursorPos(25,2)\\r\\\ + term.write(\\\"Double vault manager\\\")\\r\\\ + term.setCursorPos(19,8)\\r\\\ + term.write(\\\"Using double vaults is a way to\\\")\\r\\\ + term.setCursorPos(19,9)\\r\\\ + term.write(\\\"store your Krist under an extra\\\")\\r\\\ + term.setCursorPos(19,10)\\r\\\ + term.write(\\\"layer of security. You can only\\\")\\r\\\ + term.setCursorPos(19,11)\\r\\\ + term.write(\\\"access a double vault from your\\\")\\r\\\ + term.setCursorPos(19,12)\\r\\\ + term.write(\\\"wallet (on any server) and then\\\")\\r\\\ + term.setCursorPos(19,13)\\r\\\ + term.write(\\\"only after typing an extra pass\\\")\\r\\\ + term.setCursorPos(19,14)\\r\\\ + term.write(\\\"code. Double wallets are wholly\\\")\\r\\\ + term.setCursorPos(19,15)\\r\\\ + term.write(\\\"invisible to unauthorized users\\\")\\r\\\ + term.setCursorPos(19,16)\\r\\\ + term.write(\\\"of your wallet; they can not be\\\")\\r\\\ + term.setCursorPos(19,17)\\r\\\ + term.write(\\\"seen or opened without the pass\\\")\\r\\\ + term.setCursorPos(19,18)\\r\\\ + term.write(\\\"code set by you.\\\")\\r\\\ + term.setCursorPos(19,4)\\r\\\ + term.write(\\\"Pass code: \\\")\\r\\\ + term.setCursorPos(19,5)\\r\\\ + term.write(\\\"Amount (KST): \\\")\\r\\\ + term.setCursorPos(30,4)\\r\\\ + if string.len(doublekey) == 0 then\\r\\\ + term.setTextColor(256)\\r\\\ + term.write(\\\"(click to set)\\\")\\r\\\ + else\\r\\\ + term.setTextColor(8192)\\r\\\ + term.write(\\\"Ready: \\\"..balance2..\\\" KST\\\")\\r\\\ + if tonumber(amt) > 0 then\\r\\\ + term.setCursorPos(25,6)\\r\\\ + term.setTextColor(32768)\\r\\\ + term.setBackgroundColor(128)\\r\\\ + if tonumber(amt) <= balance then\\r\\\ + term.setBackgroundColor(2)\\r\\\ + end\\r\\\ + term.write(\\\" Deposit \\\")\\r\\\ + term.setBackgroundColor(1)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setBackgroundColor(128)\\r\\\ + if tonumber(amt) <= balance2 then\\r\\\ + term.setBackgroundColor(2)\\r\\\ + end\\r\\\ + term.write(\\\" Withdraw \\\")\\r\\\ + term.setBackgroundColor(1)\\r\\\ + end\\r\\\ + end\\r\\\ + term.setCursorPos(33,5)\\r\\\ + if amt == 0 then\\r\\\ + term.setTextColor(256)\\r\\\ + term.write(\\\"(click to set)\\\")\\r\\\ + else\\r\\\ + term.setTextColor(32768)\\r\\\ + term.write(amt)\\r\\\ + end\\r\\\ + term.setTextColor(32768)\\r\\\ + elseif page == 10 then\\r\\\ + local blocks = readURL(readconfig(\\\"syncnode\\\")..\\\"?blocks&low\\\")\\r\\\ + local tx = 0\\r\\\ + ar = 0\\r\\\ + local blktime = {}\\r\\\ + blkpeer = {}\\r\\\ + local blkhash = {}\\r\\\ + repeat\\r\\\ + tx = tx + 1\\r\\\ + blktime[tx] = string.sub(blocks,1,6)\\r\\\ + blocks = string.sub(blocks,7)\\r\\\ + blkpeer[tx] = string.sub(blocks,1,6)\\r\\\ + blocks = string.sub(blocks,7)\\r\\\ + blkhash[tx] = string.sub(blocks,1,20)\\r\\\ + blocks = string.sub(blocks,21)\\r\\\ + until string.len(blocks) == 0\\r\\\ + term.setCursorPos(17,1)\\r\\\ + term.setBackgroundColor(256)\\r\\\ + term.write(\\\" Date Block# Hash \\\")\\r\\\ + ----------(\\\" Feb 28 000000 000000000000oooooooo\\\")\\r\\\ + term.setBackgroundColor(1)\\r\\\ + repeat\\r\\\ + ar = ar + 1\\r\\\ + term.setCursorPos(18,1+ar)\\r\\\ + term.write(blktime[ar])\\r\\\ + term.setCursorPos(31-string.len(tostring(math.abs(tonumber(blkpeer[ar])))),1+ar)\\r\\\ + term.write(tonumber(blkpeer[ar]))\\r\\\ + term.setTextColor(256)\\r\\\ + term.setCursorPos(32,1+ar)\\r\\\ + term.write(blkhash[ar])\\r\\\ + term.setTextColor(32768)\\r\\\ + term.setCursorPos(32,1+ar)\\r\\\ + term.write(string.sub(blkhash[ar],1,12))\\r\\\ + until ar == math.min(tx,18)\\r\\\ + elseif page == 11 then\\r\\\ + local blocks = readURL(readconfig(\\\"syncnode\\\")..\\\"?blocks&low&lownonce\\\")\\r\\\ + local tx = 0\\r\\\ + ar = 0\\r\\\ + local blktime = {}\\r\\\ + blkpeer = {}\\r\\\ + local blkhash = {}\\r\\\ + repeat\\r\\\ + tx = tx + 1\\r\\\ + blktime[tx] = string.sub(blocks,1,6)\\r\\\ + blocks = string.sub(blocks,7)\\r\\\ + blkpeer[tx] = string.sub(blocks,1,6)\\r\\\ + blocks = string.sub(blocks,7)\\r\\\ + blkhash[tx] = string.sub(blocks,1,12)\\r\\\ + blocks = string.sub(blocks,13)\\r\\\ + until string.len(blocks) == 0\\r\\\ + term.setCursorPos(17,1)\\r\\\ + term.setBackgroundColor(256)\\r\\\ + term.write(\\\" Date Block# Nonce \\\")\\r\\\ + ----------(\\\" Feb 28 000000 000000000000\\\")\\r\\\ + term.setBackgroundColor(1)\\r\\\ + repeat\\r\\\ + ar = ar + 1\\r\\\ + term.setCursorPos(18,1+ar)\\r\\\ + term.write(blktime[ar])\\r\\\ + term.setCursorPos(31-string.len(tostring(math.abs(tonumber(blkpeer[ar])))),1+ar)\\r\\\ + term.write(tonumber(blkpeer[ar]))\\r\\\ + term.setTextColor(32768)\\r\\\ + term.setCursorPos(32,1+ar)\\r\\\ + term.write(tonumber(blkhash[ar]))\\r\\\ + until ar == math.min(tx,18)\\r\\\ + elseif page == 12 then\\r\\\ + local blocks = readURL(readconfig(\\\"syncnode\\\")..\\\"?blocks&low&highnonce\\\")\\r\\\ + local tx = 0\\r\\\ + ar = 0\\r\\\ + local blktime = {}\\r\\\ + blkpeer = {}\\r\\\ + local blkhash = {}\\r\\\ + repeat\\r\\\ + tx = tx + 1\\r\\\ + blktime[tx] = string.sub(blocks,1,6)\\r\\\ + blocks = string.sub(blocks,7)\\r\\\ + blkpeer[tx] = string.sub(blocks,1,6)\\r\\\ + blocks = string.sub(blocks,7)\\r\\\ + blkhash[tx] = string.sub(blocks,1,12)\\r\\\ + blocks = string.sub(blocks,13)\\r\\\ + until string.len(blocks) == 0\\r\\\ + term.setCursorPos(17,1)\\r\\\ + term.setBackgroundColor(256)\\r\\\ + term.write(\\\" Date Block# Nonce \\\")\\r\\\ + ----------(\\\" Feb 28 000000 000000000000\\\")\\r\\\ + term.setBackgroundColor(1)\\r\\\ + repeat\\r\\\ + ar = ar + 1\\r\\\ + term.setCursorPos(18,1+ar)\\r\\\ + term.write(blktime[ar])\\r\\\ + term.setCursorPos(31-string.len(tostring(math.abs(tonumber(blkpeer[ar])))),1+ar)\\r\\\ + term.write(tonumber(blkpeer[ar]))\\r\\\ + term.setTextColor(32768)\\r\\\ + term.setCursorPos(32,1+ar)\\r\\\ + term.write(tonumber(blkhash[ar]))\\r\\\ + until ar == math.min(tx,18)\\r\\\ + elseif page == 13 then\\r\\\ + balance3 = tonumber(readURL(readconfig(\\\"syncnode\\\")..\\\"?getbalance=\\\"..addresslv))\\r\\\ + term.setCursorPos(25,2)\\r\\\ + term.write(\\\"Local vault manager\\\")\\r\\\ + term.setCursorPos(19,8)\\r\\\ + term.write(\\\"Local vaults are a place to put\\\")\\r\\\ + term.setCursorPos(19,9)\\r\\\ + term.write(\\\"Krist in the form of a file on\\\")\\r\\\ + term.setCursorPos(19,10)\\r\\\ + term.write(\\\"a computer. Unlike traditional\\\")\\r\\\ + term.setCursorPos(19,11)\\r\\\ + term.write(\\\"wallets, local vaults can only\\\")\\r\\\ + term.setCursorPos(19,12)\\r\\\ + term.write(\\\"be accessed on the computer\\\")\\r\\\ + term.setCursorPos(19,13)\\r\\\ + term.write(\\\"they were initially created on.\\\")\\r\\\ + term.setCursorPos(19,14)\\r\\\ + term.write(\\\"If you do this, please ensure\\\")\\r\\\ + term.setCursorPos(19,15)\\r\\\ + term.write(\\\"that this computer is never\\\")\\r\\\ + term.setCursorPos(19,16)\\r\\\ + term.write(\\\"stolen or broken, as your money\\\")\\r\\\ + term.setCursorPos(19,17)\\r\\\ + term.write(\\\"may be lost if you don't have a\\\")\\r\\\ + term.setCursorPos(19,18)\\r\\\ + term.write(\\\"backup.\\\")\\r\\\ + term.setCursorPos(19,4)\\r\\\ + term.write(\\\"KST put here: \\\"..balance3)\\r\\\ + term.setCursorPos(19,5)\\r\\\ + term.write(\\\"Amount (KST): \\\")\\r\\\ + term.setCursorPos(33,5)\\r\\\ + if amt == 0 then\\r\\\ + term.setTextColor(256)\\r\\\ + term.write(\\\"(click to set)\\\")\\r\\\ + else\\r\\\ + term.setTextColor(32768)\\r\\\ + term.write(amt)\\r\\\ + end\\r\\\ + if tonumber(amt) > 0 then\\r\\\ + term.setCursorPos(25,6)\\r\\\ + term.setTextColor(32768)\\r\\\ + term.setBackgroundColor(128)\\r\\\ + if tonumber(amt) <= balance then\\r\\\ + term.setBackgroundColor(2)\\r\\\ + end\\r\\\ + term.write(\\\" Deposit \\\")\\r\\\ + term.setBackgroundColor(1)\\r\\\ + term.write(\\\" \\\")\\r\\\ + term.setBackgroundColor(128)\\r\\\ + if tonumber(amt) <= balance3 then\\r\\\ + term.setBackgroundColor(2)\\r\\\ + end\\r\\\ + term.write(\\\" Withdraw \\\")\\r\\\ + term.setBackgroundColor(1)\\r\\\ + end\\r\\\ + elseif page == 14 then\\r\\\ + term.setBackgroundColor(1)\\r\\\ + term.setCursorPos(19,2)\\r\\\ + term.write(\\\"Local settings\\\")\\r\\\ + --deprecated for now\\r\\\ + elseif page == 15 then\\r\\\ + term.setBackgroundColor(1)\\r\\\ + term.setCursorPos(18,1)\\r\\\ + term.write(\\\".KST domain name manager [New]\\\")\\r\\\ + term.setCursorPos(46,1)\\r\\\ + term.setBackgroundColor(32)\\r\\\ + term.setTextColor(1)\\r\\\ + term.write(\\\" + NEW\\\")\\r\\\ + term.setCursorPos(17,2)\\r\\\ + term.setBackgroundColor(256)\\r\\\ + term.setTextColor(32768)\\r\\\ + term.write(\\\" Name Actions \\\")\\r\\\ + term.setBackgroundColor(1)\\r\\\ + term.setCursorPos(18,3)\\r\\\ + local namelist = readURL(readconfig(\\\"syncnode\\\")..\\\"?listnames=\\\"..address)\\r\\\ + local splitname = split(namelist, \\\";\\\")\\r\\\ + \\r\\\ +\\r\\\ + if #splitname == 0 then\\r\\\ + term.setTextColor(256)\\r\\\ + term.write(\\\"No names to display!\\\")\\r\\\ + else\\r\\\ + local namecount = 1\\r\\\ + repeat\\r\\\ + local thisname = splitname[namecount]\\r\\\ + --namelist:sub(0,namelist:find(\\\";\\\")-1)\\r\\\ + term.setTextColor(32768)\\r\\\ + term.setCursorPos(18,3+namecount)\\r\\\ + term.write(splitname[namecount]..\\\".kst\\\")\\r\\\ + term.setCursorPos(39,3+namecount)\\r\\\ + term.setTextColor(512)\\r\\\ + 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\\r\\\ + term.write(\\\"Edit Send \\\")\\r\\\ + term.setTextColor(256)\\r\\\ + term.write(\\\"Go\\\")\\r\\\ + namecount = namecount + 1\\r\\\ + until namecount == #splitname+1\\r\\\ + end\\r\\\ + --term.write(\\\"a.kst Edit Send Go\\\")\\r\\\ + term.setBackgroundColor(1)\\r\\\ + elseif page == 16 then\\r\\\ + term.setBackgroundColor(1)\\r\\\ + term.setCursorPos(20,2)\\r\\\ + term.write(\\\".KST domain name registration\\\")\\r\\\ + term.setCursorPos(19,4)\\r\\\ + term.write(\\\"Name: \\\")\\r\\\ + if name == \\\"\\\" then\\r\\\ + term.setTextColor(colors.lightGray)\\r\\\ + term.write(\\\"(click to set)\\\")\\r\\\ + else\\r\\\ + term.write(name)\\r\\\ + term.setTextColor(colors.lightGray)\\r\\\ + term.write(\\\".kst\\\")\\r\\\ + end\\r\\\ + term.setTextColor(colors.black)\\r\\\ + term.setCursorPos(19,5)\\r\\\ + term.write(\\\"Cost: 500 KST\\\")\\r\\\ + term.setCursorPos(19,7)\\r\\\ + --term.write(\\\"Available! [Register]\\\")\\r\\\ + if name == \\\"\\\" then\\r\\\ + term.setTextColor(colors.blue)\\r\\\ + term.write(\\\"Please select a name!\\\")\\r\\\ + elseif availability == 1 then\\r\\\ + term.setTextColor(colors.green)\\r\\\ + term.write(\\\"Available! \\\")\\r\\\ + --if balance >= 500 then\\r\\\ + term.setBackgroundColor(colors.green)\\r\\\ + term.setTextColor(colors.lime)\\r\\\ + term.write(\\\" Register \\\")\\r\\\ + term.setBackgroundColor(colors.white)\\r\\\ + --end\\r\\\ + elseif availability == 2 then\\r\\\ + term.setTextColor(colors.yellow)\\r\\\ + term.write(\\\"Name registered!\\\")\\r\\\ + else\\r\\\ + term.setTextColor(colors.red)\\r\\\ + term.write(\\\"Not available!\\\")\\r\\\ + end\\r\\\ + term.setTextColor(colors.black)\\r\\\ + term.setCursorPos(19,9)\\r\\\ + term.write(\\\".KST domain names are used on\\\")\\r\\\ + term.setCursorPos(19,10)\\r\\\ + term.write(\\\"the KristScape browser. For\\\")\\r\\\ + term.setCursorPos(19,11)\\r\\\ + term.write(\\\"more information, please see\\\")\\r\\\ + term.setCursorPos(19,12)\\r\\\ + term.write(\\\"the Krist thread.\\\")\\r\\\ + term.setCursorPos(19,14)\\r\\\ + term.write(\\\"All Krist spent on names will\\\")\\r\\\ + term.setCursorPos(19,15)\\r\\\ + term.write(\\\"be added to the value of\\\")\\r\\\ + term.setCursorPos(19,16)\\r\\\ + term.write(\\\"future blocks; essentially\\\")\\r\\\ + term.setCursorPos(19,17)\\r\\\ + term.write(\\\"being \\\\\\\"re-mined.\\\\\\\"\\\")\\r\\\ + elseif page == 17 then\\r\\\ + term.setBackgroundColor(1)\\r\\\ + term.setCursorPos(28,2)\\r\\\ + term.write(\\\".KST zone file\\\")\\r\\\ + term.setCursorPos(19,4)\\r\\\ + term.write(\\\"Name: \\\"..subject)\\r\\\ + term.setTextColor(colors.lightGray)\\r\\\ + term.write(\\\".kst\\\")\\r\\\ + term.setTextColor(colors.black)\\r\\\ + term.setCursorPos(19,7)\\r\\\ + term.write(\\\"Your name's zone file is the\\\")\\r\\\ + term.setCursorPos(19,8)\\r\\\ + term.write(\\\"URL of the site it is pointing\\\")\\r\\\ + term.setCursorPos(19,9)\\r\\\ + term.write(\\\"to. When KristScape navigates\\\")\\r\\\ + term.setCursorPos(19,10)\\r\\\ + term.write(\\\"to a name, it will make an HTTP\\\")\\r\\\ + term.setCursorPos(19,11)\\r\\\ + term.write(\\\"get request to the above URL.\\\")\\r\\\ + term.setCursorPos(19,12)\\r\\\ + term.write(\\\"The zone record should not\\\")\\r\\\ + term.setCursorPos(19,13)\\r\\\ + term.write(\\\"include a protocol (http://)\\\")\\r\\\ + term.setCursorPos(19,14)\\r\\\ + term.write(\\\"and shouldn't end with a\\\")\\r\\\ + term.setCursorPos(19,15)\\r\\\ + term.write(\\\"slash. You can redirect a name\\\")\\r\\\ + term.setCursorPos(19,16)\\r\\\ + term.write(\\\"to another name by making the\\\")\\r\\\ + term.setCursorPos(19,17)\\r\\\ + term.write(\\\"first character of the record\\\")\\r\\\ + term.setCursorPos(19,18)\\r\\\ + term.write(\\\"a dollar sign; e.g. $krist.kst\\\")\\r\\\ + term.setTextColor(colors.black)\\r\\\ + term.setCursorPos(19,5)\\r\\\ + term.write(\\\"Zone: \\\")\\r\\\ + zone = readURL(readconfig(\\\"syncnode\\\")..\\\"?a=\\\"..subject)\\r\\\ + if zone == \\\"\\\" then\\r\\\ + term.setTextColor(colors.lightGray)\\r\\\ + term.write(\\\"(click to set)\\\")\\r\\\ + else\\r\\\ + term.write(zone)\\r\\\ + end\\r\\\ + elseif page == 18 then\\r\\\ + term.setBackgroundColor(1)\\r\\\ + term.setCursorPos(28,2)\\r\\\ + term.write(\\\"Name transfer\\\")\\r\\\ + term.setCursorPos(19,4)\\r\\\ + term.write(\\\"Name: \\\"..subject)\\r\\\ + term.setTextColor(colors.lightGray)\\r\\\ + term.write(\\\".kst\\\")\\r\\\ + term.setTextColor(colors.black)\\r\\\ + term.setCursorPos(19,5)\\r\\\ + term.write(\\\"Recipient: \\\")\\r\\\ + elseif page == 21 then\\r\\\ + term.setBackgroundColor(1)\\r\\\ + term.setCursorPos(4,6)\\r\\\ + term.write(\\\"Address - \\\")\\r\\\ + term.setTextColor(16384)\\r\\\ + term.write(address)\\r\\\ + term.setTextColor(32768)\\r\\\ + term.setCursorPos(4,7)\\r\\\ + term.write(\\\"Balance - \\\")\\r\\\ + term.setTextColor(1024)\\r\\\ + if tostring(balance) == 'nil' then balance = 0 end\\r\\\ + term.write(tostring(balance)..\\\" KST\\\")\\r\\\ + term.setTextColor(32768)\\r\\\ + term.setCursorPos(3,9)\\r\\\ + end\\r\\\ +end\\r\\\ +boot()\",\ +}", + config = "{\ + type = \"Cryptocurrency\",\ + name = \"Krist Wallet\",\ + version = 14,\ + main = \"krist.lua\",\ + id = \"3d6.kristwallet\",\ + author = \"3d6\",\ + hidden = false,\ +}", +}