sPhone/src/apps/kstwallet.lua
2015-11-01 12:19:21 +01:00

1705 lines
57 KiB
Lua

--[[-----------------------------------------------
| 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()