View difference between Paste ID: saMzkR82 and CChWjRx6
SHOW: | | - or go back to the newest paste.
1
--[[-----------------------------------------------
2
|               KristWallet by 3d6                |
3
---------------------------------------------------
4
| This is the reference wallet for Krist.         |
5
| It is the basic definition of a functional      |
6
| Krist program, although it is not as old as the |
7
| network (we used to just use raw API calls).    |
8
---------------------------------------------------
9
 /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\  /\
10
/  \/  \/  \/  \/  \/  \/  \/  \/  \/  \/  \/  \/
11
---------------------------------------------------
12
| Do whatever you want with this, but if you make |
13
| it interact with a currency or network other    |
14
| than Krist, please give me credit. Thanks <3    |
15
---------------------------------------------------
16
| This wallet will NEVER save passwords anywhere. |]]local
17
-----------------------------------------------]]--
18
                   version = 14
19
local latest = 0
20
local balance = 0
21
local balance2 = 0
22
local balance3 = 0
23
local MOD = 2^32
24
local MODM = MOD-1
25
local gui = 0
26
local page = 0
27
local lastpage = 0
28
local scroll = 0
29
local masterkey = ""
30
local doublekey = ""
31
local address = ""
32
local addressv1 = ""
33
local addressdv = ""
34
local addresslv = ""
35
local subject = ""
36
local name = ""
37
local subbal = 0
38
local subtxs = ""
39
local stdate = {}
40
local stpeer = {}
41
local stval = {}
42
local blkpeer = {}
43
local pagespace = ""
44
local maxspace = ""
45
local ar = 0
46
local amt = 0
47
local availability = 0
48
local wallet, hud, update, settle, log, readconfig, checkdir, openwallet, makev2address
49
50
local function split(inputstr, sep)
51
        if sep == nil then
52
                sep = "%s"
53
        end
54
        local t={} ; i=1
55
        for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
56
                t[i] = str
57
                i = i + 1
58
        end
59
        return t
60
end
61
62
local function readURL(url)
63
  local resp = http.get(url)
64
  if not resp then
65
	log("Could not reach "..url)
66
    error("Error connecting to server")
67
	panic()
68
  end
69
  local content = resp.readAll():gsub("\n+$", "")
70
  resp.close()
71
  return content
72
end
73
74
local function boot()
75
  for i=1,2 do checkdir() end
76
  print("Starting KristWallet v"..tostring(version))
77
  log("Started KristWallet v"..tostring(version))
78
  update()
79
  if readconfig("enabled") and latest <= version then
80
    settle()
81
    openwallet()
82
    while page ~= 0 do
83
      wallet()
84
    end
85
    term.setBackgroundColor(32768)
86
    term.setTextColor(16)
87
    term.clear()
88
    term.setCursorPos(1,1)
89
    log("KristWallet closed safely")
90
  else
91
    if not readconfig("enabled") then print("KristWallet is disabled on this computer.") log("Disabled, shutting down") end
92
  end
93
  if readconfig("rebootonexit") then
94
    log("Rebooted computer")
95
    os.reboot()
96
  end
97
end
98
function update()
99
  latest = tonumber(readURL(readconfig("versionserver")))
100
  if latest > version then
101
    print("An update is available!")
102
    log("Discovered update")
103
    if readconfig("autoupdate") and not bench then
104
      local me = fs.open(fs.getName(shell.getRunningProgram()),"w")
105
      local nextversion = readURL(readconfig("updateserver"))
106
      print("Installed update. Run this program again to start v"..latest..".")
107
      me.write(nextversion)
108
      me.close()
109
      log("Installed update")
110
    else
111
      log("Ignored update")
112
      latest = -2
113
    end
114
  else
115
    log("No updates found")
116
  end
117
end
118
function log(text)
119
  local logfile = fs.open("kst/log_wallet","a")
120
  logfile.writeLine(tostring(os.day()).."-"..tostring(os.time()).."/"..text)
121
  logfile.close()
122
end
123
local function checkfile(path,default)
124
  if not fs.exists("kst/"..path) or path == "syncnode" then
125
    local file = fs.open("kst/"..path,"w")
126
    file.writeLine(default)
127
    file.close()
128
    log("Created file "..path)
129
    return false
130
  else
131
    return true
132
  end
133
end
134
function readconfig(path)
135
  if fs.exists("kst/"..path) then
136
    local file = fs.open("kst/"..path,"r")
137
    local context = file.readAll():gsub("\n+$", "")
138
    file.close()
139
    if context == "true" then return true end
140
    if context == "false" then return false end
141
    return context
142
  else
143
    print("An unknown error happened")
144
  end
145
end
146
function settle()
147
  if term.isColor() then gui = 1 end
148
  if term.isColor() and pocket then gui = 2 end
149
end
150
local function drawKrist()
151
  local posx, posy = term.getCursorPos()
152
  term.setBackgroundColor(1)
153
  term.setTextColor(32)
154
  term.write("/")
155
  term.setBackgroundColor(32)
156
  term.setTextColor(8192)
157
  term.write("\\")
158
  term.setCursorPos(posx,posy+1)
159
  term.setBackgroundColor(32)
160
  term.setTextColor(8192)
161
  term.write("\\")
162
  term.setBackgroundColor(8192)
163
  term.setTextColor(32)
164
  term.write("/")
165
  term.setCursorPos(posx+2,posy)
166
end
167
local function memoize(f)
168
  local mt = {}
169
  local t = setmetatable({}, mt)
170
  function mt:__index(k)
171
    local v = f(k)
172
    t[k] = v
173
    return v
174
  end
175
  return t
176
end
177
local function make_bitop_uncached(t, m)
178
  local function bitop(a, b)
179
    local res,p = 0,1
180
    while a ~= 0 and b ~= 0 do
181
      local am, bm = a % m, b % m
182
      res = res + t[am][bm] * p
183
      a = (a - am) / m
184
      b = (b - bm) / m
185
      p = p*m
186
    end
187
    res = res + (a + b) * p
188
    return res
189
  end
190
  return bitop
191
end
192
local function make_bitop(t)
193
  local op1 = make_bitop_uncached(t,2^1)
194
  local op2 = memoize(function(a) return memoize(function(b) return op1(a, b) end) end)
195
  return make_bitop_uncached(op2, 2 ^ (t.n or 1))
196
end
197
local bxor1 = make_bitop({[0] = {[0] = 0,[1] = 1}, [1] = {[0] = 1, [1] = 0}, n = 4})
198
local function bxor(a, b, c, ...)
199
  local z = nil
200
  if b then
201
    a = a % MOD
202
    b = b % MOD
203
    z = bxor1(a, b)
204
    if c then z = bxor(z, c, ...) end
205
    return z
206
  elseif a then return a % MOD
207
  else return 0 end
208
end
209
local function band(a, b, c, ...)
210
  local z
211
  if b then
212
    a = a % MOD
213
    b = b % MOD
214
    z = ((a + b) - bxor1(a,b)) / 2
215
    if c then z = bit32_band(z, c, ...) end
216
    return z
217
  elseif a then return a % MOD
218
  else return MODM end
219
end
220
local function bnot(x) return (-1 - x) % MOD end
221
local function rshift1(a, disp)
222
  if disp < 0 then return lshift(a,-disp) end
223
  return math.floor(a % 2 ^ 32 / 2 ^ disp)
224
end
225
local function rshift(x, disp)
226
  if disp > 31 or disp < -31 then return 0 end
227
  return rshift1(x % MOD, disp)
228
end
229
local function lshift(a, disp)
230
  if disp < 0 then return rshift(a,-disp) end
231
  return (a * 2 ^ disp) % 2 ^ 32
232
end
233
local function rrotate(x, disp)
234
  x = x % MOD
235
  disp = disp % 32
236
  local low = band(x, 2 ^ disp - 1)
237
  return rshift(x, disp) + lshift(low, 32 - disp)
238
end
239
local k = {
240
  0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
241
  0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
242
  0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
243
  0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
244
  0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
245
  0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
246
  0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
247
  0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
248
  0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
249
  0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
250
  0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
251
  0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
252
  0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
253
  0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
254
  0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
255
  0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
256
}
257
local function str2hexa(s)
258
  return (string.gsub(s, ".", function(c) return string.format("%02x", string.byte(c)) end))
259
end
260
local function num2s(l, n)
261
  local s = ""
262
  for i = 1, n do
263
    local rem = l % 256
264
    s = string.char(rem) .. s
265
    l = (l - rem) / 256
266
  end
267
  return s
268
end
269
local function s232num(s, i)
270
  local n = 0
271
  for i = i, i + 3 do n = n*256 + string.byte(s, i) end
272
  return n
273
end
274
local function preproc(msg, len)
275
  local extra = 64 - ((len + 9) % 64)
276
  len = num2s(8 * len, 8)
277
  msg = msg .. "\128" .. string.rep("\0", extra) .. len
278
  assert(#msg % 64 == 0)
279
  return msg
280
end
281
local function initH256(H)
282
  H[1] = 0x6a09e667
283
  H[2] = 0xbb67ae85
284
  H[3] = 0x3c6ef372
285
  H[4] = 0xa54ff53a
286
  H[5] = 0x510e527f
287
  H[6] = 0x9b05688c
288
  H[7] = 0x1f83d9ab
289
  H[8] = 0x5be0cd19
290
  return H
291
end
292
local function digestblock(msg, i, H)
293
  local w = {}
294
  for j = 1, 16 do w[j] = s232num(msg, i + (j - 1)*4) end
295
  for j = 17, 64 do
296
    local v = w[j - 15]
297
    local s0 = bxor(rrotate(v, 7), rrotate(v, 18), rshift(v, 3))
298
    v = w[j - 2]
299
    w[j] = w[j - 16] + s0 + w[j - 7] + bxor(rrotate(v, 17), rrotate(v, 19), rshift(v, 10))
300
  end
301
 
302
  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]
303
  for i = 1, 64 do
304
    local s0 = bxor(rrotate(a, 2), rrotate(a, 13), rrotate(a, 22))
305
    local maj = bxor(band(a, b), band(a, c), band(b, c))
306
    local t2 = s0 + maj
307
    local s1 = bxor(rrotate(e, 6), rrotate(e, 11), rrotate(e, 25))
308
    local ch = bxor (band(e, f), band(bnot(e), g))
309
    local t1 = h + s1 + ch + k[i] + w[i]
310
    h, g, f, e, d, c, b, a = g, f, e, d + t1, c, b, a, t1 + t2
311
  end
312
 
313
  H[1] = band(H[1] + a)
314
  H[2] = band(H[2] + b)
315
  H[3] = band(H[3] + c)
316
  H[4] = band(H[4] + d)
317
  H[5] = band(H[5] + e)
318
  H[6] = band(H[6] + f)
319
  H[7] = band(H[7] + g)
320
  H[8] = band(H[8] + h)
321
end
322
local function sha256(msg)
323
  msg = preproc(msg, #msg)
324
  local H = initH256({})
325
  for i = 1, #msg, 64 do digestblock(msg, i, H) end
326
  return str2hexa(num2s(H[1], 4) .. num2s(H[2], 4) .. num2s(H[3], 4) .. num2s(H[4], 4) ..
327
          num2s(H[5], 4) .. num2s(H[6], 4) .. num2s(H[7], 4) .. num2s(H[8], 4))
328
end
329
local function panic()
330
  page = 0
331
  log("Panicking! Shutting down KristWallet.")
332
end
333
local function makeaddressbyte(j)
334
  if j <= 6 then return "0"
335
  elseif j <= 13 then return "1"
336
  elseif j <= 20 then return "2"
337
  elseif j <= 27 then return "3"
338
  elseif j <= 34 then return "4"
339
  elseif j <= 41 then return "5"
340
  elseif j <= 48 then return "6"
341
  elseif j <= 55 then return "7"
342
  elseif j <= 62 then return "8"
343
  elseif j <= 69 then return "9"
344
  elseif j <= 76 then return "a"
345
  elseif j <= 83 then return "b"
346
  elseif j <= 90 then return "c"
347
  elseif j <= 97 then return "d"
348
  elseif j <= 104 then return "e"
349
  elseif j <= 111 then return "f"
350
  elseif j <= 118 then return "g"
351
  elseif j <= 125 then return "h"
352
  elseif j <= 132 then return "i"
353
  elseif j <= 139 then return "j"
354
  elseif j <= 146 then return "k"
355
  elseif j <= 153 then return "l"
356
  elseif j <= 160 then return "m"
357
  elseif j <= 167 then return "n"
358
  elseif j <= 174 then return "o"
359
  elseif j <= 181 then return "p"
360
  elseif j <= 188 then return "q"
361
  elseif j <= 195 then return "r"
362
  elseif j <= 202 then return "s"
363
  elseif j <= 209 then return "t"
364
  elseif j <= 216 then return "u"
365
  elseif j <= 223 then return "v"
366
  elseif j <= 230 then return "w"
367
  elseif j <= 237 then return "x"
368
  elseif j <= 244 then return "y"
369
  elseif j <= 251 then return "z"
370
  else return "e"
371
  end
372
end
373
function checkdir()
374
  if fs.isDir("kst") then
375
    math.randomseed(os.time()) 
376
    checkfile("log_wallet","-----KRISTWALLET LOG FILE-----")
377
    checkfile("enabled","true") --Disabling this just makes KristWallet refuse to start.
378
    checkfile("sweepv1","true")
379
    checkfile("appendhashes","true") --Disabling this makes it possible to use KristWallet with extremely old addresses.
380
    checkfile("autoupdate","true")
381
    checkfile("whitelisted","false")
382
    checkfile("rebootonexit","false")
383
    checkfile("autologin","false")
384
    checkfile("keyAL",sha256(""))
385
    checkfile("keyLV",sha256(math.random(1000000)..os.time())) --This is where the local vault's krist is stored. DO NOT DESTROY!
386
    checkfile("versionserver","https://raw.githubusercontent.com/BTCTaras/kristwallet/master/staticapi/version")
387
    checkfile("updateserver","https://raw.githubusercontent.com/BTCTaras/kristwallet/master/kristwallet")
388
    checkfile("syncnode","http://krist.ceriat.net/")
389
    checkfile("whitelist","")
390
    checkfile("blacklist","")
391
  else
392
    fs.makeDir("kst")
393
  end
394
end
395
function openwallet()
396
  term.setBackgroundColor(8)
397
  term.clear()
398
  local krists = 0
399
  repeat
400
    term.setCursorPos(3+(3*krists),3)
401
    drawKrist()
402
    krists = krists + 1
403
  until krists == 16
404
  krists = 0
405
  repeat
406
    term.setCursorPos(3+(3*krists),16)
407
    drawKrist()
408
    krists = krists + 1
409
  until krists == 16
410
  term.setBackgroundColor(8)
411
  term.setTextColor(32768)
412
  term.setCursorPos(6,6)
413
  term.write("Password:")
414
  term.setCursorPos(6,8)
415
         -----|---+---------+---------+---------+-----|---+-
416
  term.write("Please enter your secret password to")
417
  term.setCursorPos(6,9)
418
  term.write("use Krist. If this is your first time")
419
  term.setCursorPos(6,10)
420
  term.write("using Krist, type your desired password.")
421
  term.setCursorPos(6,11)
422
  term.write("You will be able to access your Krist")
423
  term.setCursorPos(6,12)
424
  term.write("on any computer on any server as long")
425
  term.setCursorPos(6,13)
426
  term.write("as you type in the same password! It will")
427
  term.setCursorPos(6,14)
428
  term.write("not be saved or shared with anyone.")
429
  term.setCursorPos(16,6)
430
  local password = ""
431
  if readconfig("autologin") then
432
    password = readconfig("keyAL")
433
  else
434
    password = read("*")
435
	if password == "" then term.setCursorPos(16,6) password = read("*") end
436
    if readconfig("appendhashes") then password = sha256("KRISTWALLET"..password) end
437
  end
438
  term.clear()
439
  term.setCursorPos(1,1)
440
  page = 1+gui*(10*(gui-1))
441
  if readconfig("appendhashes") then masterkey = password.."-000" else masterkey = password end
442
  log("Read password")
443
  addressv1 = string.sub(sha256(masterkey),0,10)
444
  log("Derived address: "..addressv1)
445
  address = makev2address(masterkey)
446
  log("Derived address: "..address)
447
  balance = tonumber(readURL(readconfig("syncnode").."?getbalance="..addressv1))
448
  if balance > 0 and readconfig("sweepv1") then local transaction = readURL(readconfig("syncnode").."?pushtx&q="..address.."&pkey="..masterkey.."&amt="..balance); log("Swept hex address") end
449
  balance = tonumber(readURL(readconfig("syncnode").."?getbalance="..address))
450
	if balance >= 100000 then log("Woah! There's a small fortune here!") elseif balance > 0 then log("There is some krist here!") end
451
  if readconfig("whitelisted") then
452
    local whitelist = readconfig("whitelist")
453
    if string.find(whitelist, address) == nil then
454
      log(address.." is not on the whitelist!")
455
      print("Sorry, this wallet is not on the whitelist for this computer!")
456
      page = 0
457
      os.sleep(3)
458
    end
459
  else
460
    local blacklist = readconfig("blacklist")
461
    if string.find(blacklist, addressv1) ~= nil then
462
      log(addressv1.." is on the blacklist!")
463
      print("Your wallet is blocked from this computer!")
464
      page = 0
465
      os.sleep(3)
466
    elseif string.find(blacklist, address) ~= nil then
467
      log(address.." is on the blacklist!")
468
      print("Your wallet is blocked from this computer!")
469
      page = 0
470
      os.sleep(3)
471
    end
472
  end
473
  addresslv = makev2address(readconfig("keyLV"))
474
  log("Loaded local vault")
475
end
476
function makev2address(key)
477
  local protein = {}
478
  local stick = sha256(sha256(key))
479
  local n = 0
480
  local link = 0
481
  local v2 = "k"
482
  repeat
483
    if n < 9 then protein[n] = string.sub(stick,0,2)
484
    stick = sha256(sha256(stick)) end
485
    n = n + 1
486
  until n == 9
487
  n = 0
488
  repeat
489
    link = tonumber(string.sub(stick,1+(2*n),2+(2*n)),16) % 9
490
    if string.len(protein[link]) ~= 0 then
491
      v2 = v2 .. makeaddressbyte(tonumber(protein[link],16))
492
      protein[link] = ''
493
      n = n + 1
494
    else
495
      stick = sha256(stick)
496
    end
497
  until n == 9
498
  return v2
499
end
500
local function postgraphic(px,py,id)
501
  term.setCursorPos(px,py)
502
  if id == 0 then drawKrist()
503
  elseif id == 1 then
504
    --Mined Krist
505
    term.setCursorPos(px+1,py)
506
    term.setBackgroundColor(256)
507
    term.setTextColor(128)
508
    term.write("/T\\")
509
    term.setCursorPos(px,py+1)
510
    term.write("/")
511
    term.setCursorPos(px+2,py+1)
512
    term.write("|")
513
    term.setCursorPos(px+4,py+1)
514
    term.write("\\")
515
    term.setCursorPos(px+2,py+2)
516
    term.write("|")
517
    term.setCursorPos(px+2,py+3)
518
    term.write("|")
519
    term.setCursorPos(px+4,py+2)
520
    drawKrist()
521
  elseif id == 2 then
522
    --Sent Krist
523
    term.setCursorPos(px,py+2)
524
    term.setBackgroundColor(256)
525
    term.setTextColor(16384)
526
    term.write(" ")
527
    term.setCursorPos(px+1,py+3)
528
    term.write("    ")
529
    term.setCursorPos(px+5,py+2)
530
    term.write(" ")
531
    term.setBackgroundColor(1)
532
    term.setCursorPos(px+2,py)
533
    term.write("/\\")
534
    term.setCursorPos(px+2,py+1)
535
    term.write("||")
536
  elseif id == 3 then
537
    --Received Krist
538
    term.setCursorPos(px,py+2)
539
    term.setBackgroundColor(256)
540
    term.setTextColor(8192)
541
    term.write(" ")
542
    term.setCursorPos(px+1,py+3)
543
    term.write("    ")
544
    term.setCursorPos(px+5,py+2)
545
    term.write(" ")
546
    term.setBackgroundColor(1)
547
    term.setCursorPos(px+2,py)
548
    term.write("||")
549
    term.setCursorPos(px+2,py+1)
550
    term.write("\\/")
551
  elseif id == 4 then
552
    --Sent to yourself
553
    term.setCursorPos(px,py+2)
554
    term.setBackgroundColor(256)
555
    term.setTextColor(16)
556
    term.write(" ")
557
    term.setCursorPos(px+1,py+3)
558
    term.write("    ")
559
    term.setCursorPos(px+5,py+2)
560
    term.write(" ")
561
    term.setBackgroundColor(1)
562
    term.setCursorPos(px+1,py)
563
    term.write("/\\||")
564
    term.setCursorPos(px+1,py+1)
565
    term.write("||\\/")
566
  elseif id == 5 then
567
    --Swept from v1 address
568
    term.setCursorPos(px+1,py)
569
    term.setBackgroundColor(256)
570
    term.setTextColor(128)
571
    term.write(" v1 ")
572
    term.setCursorPos(px+2,py+1)
573
    term.setBackgroundColor(1)
574
    term.setTextColor(2048)
575
    term.write("||")
576
    term.setCursorPos(px+2,py+2)
577
    term.write("\\/")
578
    term.setCursorPos(px+1,py+3)
579
    term.setBackgroundColor(16)
580
    term.setTextColor(32768)
581
    term.write(" v2 ")
582
  elseif id == 6 then
583
    --Name registered
584
    term.setBackgroundColor(32)
585
    term.setTextColor(8192)
586
    term.setCursorPos(px+4,py)
587
    term.write("/")
588
    term.setCursorPos(px+1,py+1)
589
    term.write("\\")
590
    term.setCursorPos(px+3,py+1)
591
    term.write("/")
592
    term.setCursorPos(px+2,py+2)
593
    term.write("V")
594
    term.setCursorPos(px+1,py+3)
595
    term.setBackgroundColor(16384)
596
    term.setTextColor(4)
597
    term.write(".kst")
598
  elseif id == 7 then
599
    --Name operation
600
    term.setBackgroundColor(8)
601
    term.setTextColor(512)
602
    term.setCursorPos(px+1,py)
603
    term.write(" a ")
604
    term.setBackgroundColor(1)
605
    term.write("\\")
606
    term.setBackgroundColor(8)
607
    term.setCursorPos(px+1,py+1)
608
    term.write("====")
609
    term.setCursorPos(px+1,py+2)
610
    term.write("====")
611
    term.setCursorPos(px+1,py+3)
612
    term.setBackgroundColor(16384)
613
    term.setTextColor(4)
614
    term.write(".kst")
615
  elseif id == 8 then
616
    --Name sent
617
    term.setCursorPos(px+1,py+3)
618
    term.setBackgroundColor(16384)
619
    term.setTextColor(4)
620
    term.write(".kst")
621
    term.setTextColor(16384)
622
    term.setBackgroundColor(1)
623
    term.setCursorPos(px+2,py)
624
    term.write("/\\")
625
    term.setCursorPos(px+2,py+1)
626
    term.write("||")
627
  elseif id == 9 then
628
    --Name received
629
    term.setCursorPos(px+1,py+3)
630
    term.setBackgroundColor(16384)
631
    term.setTextColor(4)
632
    term.write(".kst")
633
    term.setTextColor(8192)
634
    term.setBackgroundColor(1)
635
    term.setCursorPos(px+1,py)
636
    term.write("||")
637
    term.setCursorPos(px+1,py+1)
638
    term.write("\\/")
639
    term.setTextColor(16384)
640
    term.setCursorPos(px+3,py)
641
    term.write("/\\")
642
    term.setCursorPos(px+3,py+1)
643
    term.write("||")
644
  end
645
end
646
function wallet()
647
  hud()
648
  local pagebefore = page
649
  local event, button, xPos, yPos = os.pullEvent("mouse_click")
650
  if gui == 1 and xPos >= 3 and xPos <= 14 then
651
    if yPos == 5 then
652
      page = 1
653
      balance = tonumber(readURL(readconfig("syncnode").."?getbalance="..address))
654
    end
655
    if yPos == 7 then
656
      page = 2
657
      subject = address
658
      scroll = 0
659
    end
660
    if yPos == 9 then
661
      page = 3
662
      balance = tonumber(readURL(readconfig("syncnode").."?getbalance="..address))
663
    end
664
    if yPos == 11 then
665
      page = 8
666
    end
667
    if yPos == 13 then
668
      page = 4
669
    end
670
    if yPos == 15 then
671
      page = 15
672
    end
673
    if yPos == 17 then
674
      page = 0
675
    end
676
  elseif gui == 2 then
677
    if yPos == 2 and xPos >= 19 and xPos <= 24 then
678
      page = 0
679
    end
680
  end
681
  local lexm = http.get(readconfig("syncnode").."?listnames="..address)
682
  local lem = false
683
  local lexmm
684
  if lexm.readAll then
685
	lem = true
686
	lexmm = lexm.readAll():gsub("\n+$", "")
687
  end
688
	
689
  if page == 1 then
690
    balance = tonumber(readURL(readconfig("syncnode").."?getbalance="..address))
691
    if (yPos-7)%5 == 0 and yPos >= 7 and xPos >= 26 and xPos <= 35 then
692
      subject = string.sub(readURL(readconfig("syncnode").."?listtx="..address.."&overview"),13+(31*((yPos-7)/5)),22+(31*((yPos-7)/5)))
693
      if string.len(subject) == 10 and subject ~= "N/A(Mined)" and subject ~= "N/A(Names)" then
694
        page = 2
695
      end
696
    end
697
  elseif page == 2 then
698
    if yPos > 2 and yPos <= 2+ar-(16*(scroll)) and xPos >= 31 and xPos < 41 then
699
      if stpeer[(yPos-2)+(16*(scroll))] == "N/A(Mined)" then
700
        --possibly link to a block later?
701
      elseif stpeer[(yPos-2)+(16*(scroll))] == "N/A(Names)" then
702
        --possibly link to a name later??
703
      else
704
        subject = stpeer[(yPos-2)+(16*(scroll))]
705
        scroll = 0
706
      end
707
    end
708
    if yPos == 19 and xPos >= 32 and xPos <= 36 then
709
      scroll = 0
710
    end
711
    if yPos == 19 and xPos >= 38 and xPos <= 41 then
712
      scroll = math.max(0,scroll-1)
713
    end
714
    if yPos == 19 and xPos >= 43 and xPos <= 46 then
715
      scroll = math.min(lastpage,scroll+1)
716
    end
717
    if yPos == 19 and xPos >= 48 then
718
      scroll = lastpage
719
    end
720
    if yPos == 1 and xPos >= 17 then
721
      page = 6
722
    end
723
    log("Page index is "..scroll)
724
  elseif page == 3 then
725
    if xPos >= 17 then
726
      term.setCursorPos(33,5)
727
      local recipient = read()
728
      term.setCursorPos(33,6)
729
      log("Read recipient for transfer")
730
      local amount = read()
731
      log("Read amount for transfer")
732
      local transaction = readURL(readconfig("syncnode").."?pushtx2&q="..recipient.."&pkey="..masterkey.."&amt="..amount)
733
      balance = tonumber(readURL(readconfig("syncnode").."?getbalance="..address))
734
      log("Attempting to send "..amount.." KST to "..recipient)
735
      term.setCursorPos(19,8)
736
      if transaction == "Success" then
737
        term.setTextColor(8192)
738
        term.write("Transfer successful")
739
        log("Transfer successful")
740
        term.setTextColor(32768)
741
      elseif string.sub(transaction,0,5) == "Error" then
742
        local problem = "An unknown error happened"
743
        local code = tonumber(string.sub(transaction,6,10))
744
        if code == 1 then problem = "Insufficient funds available" end
745
        if code == 2 then problem = "Not enough KST in transaction" end
746
        if code == 3 then problem = "Can't comprehend amount to send" end
747
        if code == 4 then problem = "Invalid recipient address" end
748
        term.setTextColor(16384)
749
        term.write(problem)
750
        log(problem)
751
        term.setTextColor(32768)
752
      else
753
        term.setTextColor(16384)
754
        term.write(transaction)
755
        term.setTextColor(32768)
756
      end
757
      os.sleep(2.5) --lower this if you do tons of transfers
758
      log("Unfroze display")
759
    end
760
  elseif page == 4 then
761
    if yPos == 3 and xPos >= 19 and xPos <= 31 then
762
      page = 5
763
      scroll = 0
764
    end
765
    if yPos == 4 and xPos >= 19 and xPos <= 31 then
766
      page = 10
767
    end
768
    if yPos == 3 and xPos >= 35 and xPos <= 48 then
769
      page = 6
770
    end
771
    if yPos == 4 and xPos >= 35 and xPos <= 46 then
772
      page = 7
773
    end
774
  elseif page == 5 then
775
    if yPos > 2 and xPos >= 27 and xPos <= 36 then
776
      page = 2
777
      subject = blkpeer[(yPos-2)]
778
      scroll = 0
779
    end
780
  elseif page == 6 then
781
    term.setCursorPos(18,1)
782
    term.write("                       ")
783
    term.setCursorPos(18,1)
784
    term.write("ADDRESS ")
785
    subject = read()
786
    if string.len(subject) == 10 then
787
      page = 2
788
      scroll = 0
789
    else
790
      page = 6
791
    end
792
  elseif page == 7 then
793
    if yPos > 2 and yPos <= 18 and xPos >= 20 and xPos < 30 then
794
      if blkpeer[(yPos-2)] ~= "N/A(Burnt)" then
795
        page = 2
796
        subject = blkpeer[(yPos-2)]
797
        scroll = 0
798
      end
799
    end
800
  elseif page == 15 then
801
	
802
	local function isEdit(xpo)
803
		return xpo >= 39 and xpo <= 42
804
	end
805
	local function isSend(xpo)
806
		return xpo >= 44 and xpo <= 47
807
	end
808
	
809
	if xPos and yPos then
810
		local listofnames = split(lexmm, ";")
811
		if yPos == 1 and xPos >= 46 then
812
			page = 16
813
		elseif lem and yPos >= 3 and isEdit(xPos) then
814
			if listofnames[yPos - 3] then
815
				page = 17
816
				local nameclicked = yPos - 3
817
				subject = listofnames[nameclicked]
818
			end
819
		elseif lem and yPos >= 3 and isSend(xPos) then
820
			if listofnames[yPos - 3] then
821
				page = 18
822
				local nameclicked = yPos - 3
823
				subject = listofnames[nameclicked]
824
			end
825
		end
826
	end
827
  elseif page == 8 then
828
    if yPos == 3 and xPos >= 19 and xPos <= 30 then
829
      page = 9
830
    end
831
    if yPos == 3 and xPos >= 35 and xPos <= 47 then
832
      page = 16
833
    end
834
    if yPos == 4 and xPos >= 35 and xPos <= 47 then
835
      --page = 18
836
    end
837
    if yPos == 4 and xPos >= 19 and xPos <= 29 then
838
      page = 13
839
    end
840
  elseif page == 18 then
841
		if yPos == 5 and xPos >= 30 then
842
      term.setCursorPos(30,5)
843
      term.write("                           ")
844
      term.setCursorPos(30,5)
845
      maxspace = read():lower()
846
      term.setCursorPos(19,7)
847
      pagespace = readURL(readconfig("syncnode").."?name_transfer&pkey="..masterkey.."&name="..subject.."&q="..maxspace)
848
			if pagespace == "Success" then
849
			end
850
				term.write("Name transferred")
851
				log("Tried sending a name to "..maxspace)
852
				os.sleep(3)
853
				page = 15
854
		end
855
  elseif page == 16 then
856
    if yPos == 4 and xPos >= 25 then
857
      term.setCursorPos(25,4)
858
      term.write("                           ")
859
      term.setCursorPos(25,4)
860
      name = read():lower():gsub(".kst",""):gsub(" ","")
861
      term.setCursorPos(25,4)
862
      term.write("Please wait...             ")
863
      if string.len(name) > 0 then
864
        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
865
          availability = 0
866
        else
867
          availability = tonumber(readURL(readconfig("syncnode").."?name_check="..name))
868
          log("Checked "..name..".kst for availability ("..availability..")")
869
          term.setCursorPos(19,7)
870
          if availability then
871
            term.setTextColor(colors.green)
872
            term.write("Available!")
873
          else
874
            term.setTextColor(colors.red)
875
            term.write("Not available!")
876
          end
877
        end
878
      else
879
        name = ""
880
      end
881
    elseif yPos == 7 and xPos >= 30 and xPos <= 39 and availability == 1 and balance >= 500 then
882
      availability = 2
883
      local k = readURL(readconfig("syncnode").."?name_new&pkey="..masterkey.."&name="..name)
884
    end
885
  elseif page == 17 then
886
    if yPos == 5 and xPos >= 25 then
887
      term.setCursorPos(25,5)
888
      term.write("                           ")
889
      term.setCursorPos(25,5)
890
      zone = read():gsub("http://","")
891
      term.setCursorPos(25,5)
892
      term.write("Please wait...             ")
893
      local sevenminutesleftuntilmaystartsfuckihavetoreleasethisnow = readURL(readconfig("syncnode").."?name_update&pkey="..masterkey.."&name="..subject.."&ar="..zone)
894
    elseif yPos == 7 and xPos >= 30 and xPos <= 39 and availability == 1 and balance >= 500 then
895
      availability = 2
896
      local k = readURL(readconfig("syncnode").."?name_new&pkey="..masterkey.."&name="..name)
897
    end
898
  elseif page == 9 then
899
    if yPos == 4 and xPos >= 30 then
900
      term.setCursorPos(30,4)
901
      term.write("                      ")
902
      term.setCursorPos(30,4)
903
      doublekey = read("*")
904
      term.setCursorPos(30,4)
905
      term.write("Please wait...        ")
906
      if string.len(doublekey) > 0 then
907
        doublekey = sha256(masterkey.."-"..sha256(doublekey))
908
        addressdv = makev2address(doublekey)
909
        balance2 = tonumber(readURL(readconfig("syncnode").."?getbalance="..addressdv))
910
        log("Derived double vault "..addressdv)
911
      else
912
        addressdv = ""
913
        balance2 = 0
914
      end
915
    end
916
    if yPos == 5 and xPos >= 33 then
917
      term.setCursorPos(33,5)
918
      term.write("                      ")
919
      term.setCursorPos(33,5)
920
      amt = read()
921
      if tonumber(amt) == nil then
922
        amt = 0
923
      elseif tonumber(amt) % 1 ~= 0 then
924
        amt = 0
925
      elseif tonumber(amt) <= 0 then
926
        amt = 0
927
      end
928
    end
929
    if yPos == 6 and xPos >= 25 and xPos <= 33 then
930
      if tonumber(amt) > 0 and string.len(doublekey) > 0 then
931
        if tonumber(amt) <= balance then
932
          local transaction = readURL(readconfig("syncnode").."?pushtx2&q="..addressdv.."&pkey="..masterkey.."&amt="..tonumber(amt))
933
          balance = tonumber(readURL(readconfig("syncnode").."?getbalance="..address))
934
          balance2 = tonumber(readURL(readconfig("syncnode").."?getbalance="..addressdv))
935
          log("Put "..amt.." KST in a double vault")
936
        end
937
      end
938
    end
939
    if yPos == 6 and xPos >= 35 and xPos <= 44 then
940
      if tonumber(amt) > 0 and string.len(doublekey) > 0 then
941
        if tonumber(amt) <= balance2 then
942
          local transaction = readURL(readconfig("syncnode").."?pushtx2&q="..address.."&pkey="..doublekey.."&amt="..tonumber(amt))
943
          balance = tonumber(readURL(readconfig("syncnode").."?getbalance="..address))
944
          balance2 = tonumber(readURL(readconfig("syncnode").."?getbalance="..addressdv))
945
          log("Took "..amt.." KST from a double vault")
946
        end
947
      end
948
    end
949
  elseif page == 13 then
950
    if yPos == 5 and xPos >= 33 then
951
      term.setCursorPos(33,5)
952
      term.write("                      ")
953
      term.setCursorPos(33,5)
954
      term.setTextColor(32768)
955
      amt = read()
956
      if tonumber(amt) == nil then
957
        amt = 0
958
      elseif tonumber(amt) % 1 ~= 0 then
959
        amt = 0
960
      elseif tonumber(amt) <= 0 then
961
        amt = 0
962
      end
963
    end
964
    if yPos == 6 and xPos >= 25 and xPos <= 33 then
965
      if tonumber(amt) > 0 then
966
        if tonumber(amt) <= balance then
967
          local transaction = readURL(readconfig("syncnode").."?pushtx2&q="..addresslv.."&pkey="..masterkey.."&amt="..tonumber(amt))
968
          balance = tonumber(readURL(readconfig("syncnode").."?getbalance="..address))
969
          log("Put "..amt.." KST in a local vault")
970
        end
971
      end
972
    end
973
    if yPos == 6 and xPos >= 35 and xPos <= 44 then
974
      if tonumber(amt) > 0 then
975
        if tonumber(amt) <= balance3 then
976
          local transaction = readURL(readconfig("syncnode").."?pushtx2&q="..address.."&pkey="..readconfig("keyLV").."&amt="..tonumber(amt))
977
          balance = tonumber(readURL(readconfig("syncnode").."?getbalance="..address))
978
          log("Took "..amt.." KST from a local vault")
979
        end
980
      end
981
    end
982
  end
983
  if pagebefore ~= page then log("Switched to page "..page) end
984
end
985
local function drawTab(text)
986
  term.setBackgroundColor(512)
987
  term.write(text)
988
end
989
local function drawBtn(text)
990
  term.setBackgroundColor(32)
991
  term.write(text)
992
end
993
function hud()
994
  term.setBackgroundColor(1)
995
  term.setTextColor(32768)
996
  term.clear()
997
  if gui == 1 then
998
    local sidebar = 1
999
    while sidebar < 51 do
1000
      term.setCursorPos(1,sidebar)
1001
      term.setBackgroundColor(8)
1002
      term.write("                ")
1003
      sidebar = sidebar + 1
1004
    end
1005
    term.setCursorPos(2,2)
1006
    drawKrist()
1007
    term.setBackgroundColor(8)
1008
    term.setTextColor(32768)
1009
    term.write(" KristWallet")
1010
    term.setCursorPos(5,3)
1011
    term.setTextColor(2048)
1012
    term.write("release "..version.."")
1013
    term.setCursorPos(2,19)
1014
    term.write("    by 3d6")
1015
    term.setTextColor(32768)
1016
    term.setCursorPos(3,5)
1017
    drawTab("  Overview  ")
1018
    term.setCursorPos(3,7)
1019
    drawTab("Transactions")
1020
    term.setCursorPos(3,9)
1021
    drawTab(" Send Krist ")
1022
    term.setCursorPos(3,11)
1023
    drawTab(" Special TX ")
1024
    term.setCursorPos(3,13)
1025
    drawTab(" Economicon ")
1026
    term.setCursorPos(3,15)
1027
    drawTab("Name Manager")
1028
    term.setCursorPos(3,17)
1029
    drawTab("    Exit    ")
1030
    term.setBackgroundColor(1)
1031
  elseif gui == 2 then
1032
    term.setCursorPos(1,1)
1033
    term.setBackgroundColor(8)
1034
    term.write("                          ")
1035
    term.setCursorPos(1,2)
1036
    term.write("                          ")
1037
    term.setCursorPos(1,3)
1038
    term.write("                          ")
1039
    term.setCursorPos(1,4)
1040
    term.write("                          ")
1041
    term.setCursorPos(2,2)
1042
    drawKrist()
1043
    term.setBackgroundColor(8)
1044
    term.setTextColor(32768)
1045
    term.write(" KristWallet")
1046
    term.setCursorPos(5,3)
1047
    term.setTextColor(2048)
1048
    term.write("release "..version.."")
1049
    term.setCursorPos(19,2)
1050
    term.setBackgroundColor(16384)
1051
    term.setTextColor(32768)
1052
    term.write(" Exit ")
1053
  end
1054
  if page == 1 then
1055
    term.setCursorPos(19,2)
1056
    term.write("Your address: ")
1057
    term.setTextColor(16384)
1058
    term.write(address)
1059
    term.setTextColor(32768)
1060
    term.setCursorPos(19,5)
1061
    local recenttransactions = ""
1062
    if tostring(balance) ~= 'nil' then recenttransactions = readURL(readconfig("syncnode").."?listtx="..address.."&overview") end
1063
    local txtype = 0
1064
    local graphics = 0
1065
    if string.len(recenttransactions) > 25 then
1066
      repeat
1067
        if string.sub(recenttransactions,13+(31*graphics),22+(31*graphics)) == "N/A(Mined)" then txtype = 1
1068
        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
1069
        elseif tonumber(string.sub(recenttransactions,23+(31*graphics),31+(31*graphics))) == 0 then txtype = 9
1070
        elseif string.sub(recenttransactions,13+(31*graphics),22+(31*graphics)) == "N/A(Names)" then txtype = 6
1071
        elseif string.sub(recenttransactions,13+(31*graphics),22+(31*graphics)) == address then txtype = 4
1072
        elseif string.sub(recenttransactions,13+(31*graphics),22+(31*graphics)) == addressv1 then txtype = 5
1073
        elseif tonumber(string.sub(recenttransactions,23+(31*graphics),31+(31*graphics))) < 0 then txtype = 2
1074
        elseif tonumber(string.sub(recenttransactions,23+(31*graphics),31+(31*graphics))) > 0 then txtype = 3
1075
		else txtype = 8
1076
        end
1077
        postgraphic(19,5+(5*graphics),txtype)
1078
        term.setCursorPos(26,5+(5*graphics))
1079
        term.setBackgroundColor(1)
1080
        term.setTextColor(32768)
1081
        if txtype == 1 then term.write("Mined")
1082
        elseif txtype == 2 then term.write("Sent")
1083
        elseif txtype == 3 then term.write("Received")
1084
        elseif txtype == 4 then term.write("Sent to yourself")
1085
        elseif txtype == 5 then term.write("Imported")
1086
        elseif txtype == 6 then term.write("Name registered")
1087
        elseif txtype == 7 then term.write("Name operation")
1088
        elseif txtype == 8 then term.write("Unknown")
1089
        elseif txtype == 9 then term.write("Name transfer")
1090
        end
1091
        term.setCursorPos(26,6+(5*graphics))
1092
        if txtype == 4 then
1093
          term.setTextColor(32768)
1094
        elseif tonumber(string.sub(recenttransactions,23+(31*graphics),31+(31*graphics))) > 0 then
1095
          term.setTextColor(8192)
1096
          term.write("+")
1097
        elseif tonumber(string.sub(recenttransactions,23+(31*graphics),31+(31*graphics))) == 0 then
1098
          term.setTextColor(16)
1099
        else
1100
          term.setTextColor(16384)
1101
        end
1102
        if txtype < 7 then term.write(tostring(tonumber(string.sub(recenttransactions,23+(31*graphics),31+(31*graphics)))).." KST") end
1103
        term.setCursorPos(26,7+(5*graphics))
1104
        term.setTextColor(32768)
1105
        if txtype ~= 6 then term.setTextColor(512) end
1106
        if txtype == 9 or (txtype > 1 and txtype < 6) then term.write(string.sub(recenttransactions,13+(31*graphics),22+(31*graphics))) end
1107
        --if txtype == 6 then term.write(".kst") end
1108
        term.setCursorPos(26,8+(5*graphics))
1109
        term.setTextColor(128)
1110
        term.write(string.sub(recenttransactions,1+(31*graphics),12+(31*graphics)))
1111
        graphics = graphics + 1
1112
      until graphics >= math.floor(string.len(recenttransactions)/32)
1113
    end
1114
    term.setTextColor(32768)
1115
    term.setCursorPos(19,3)
1116
    term.write("Your balance: ")
1117
    term.setTextColor(1024)
1118
    if tostring(balance) == 'nil' then balance = 0 end
1119
    term.write(tostring(balance).." KST ")
1120
    term.setTextColor(512)
1121
    local names = tonumber(readURL(readconfig("syncnode").."?getnames="..address))
1122
    if names > 0 then term.write("["..tostring(names).."]") end
1123
    if address == "ke3kjplzsz" or address == "767fc628a4" or address == "e3b0c44298" then
1124
      term.setCursorPos(1,1)
1125
      term.setBackgroundColor(16384)
1126
      term.setTextColor(16)
1127
      term.clearLine()
1128
      term.write("You are currently using a blank string password.")
1129
    end
1130
  elseif page == 2 then
1131
    term.setCursorPos(18,1)
1132
    term.write("Please wait...")
1133
    os.sleep(0)
1134
    subbal = readURL(readconfig("syncnode").."?getbalance="..subject)
1135
    subtxs = readURL(readconfig("syncnode").."?listtx="..subject)
1136
    log("Loaded transactions for address "..subject)
1137
    log("Page index is "..scroll)
1138
    term.setCursorPos(18,1)
1139
    if subtxs == "end" then subbal = 0 end
1140
    term.write("ADDRESS "..subject.." - "..subbal.." KST")
1141
    term.setCursorPos(17,2)
1142
    term.setBackgroundColor(256)
1143
    term.write(" Time         Peer           Value ")
1144
    term.setBackgroundColor(1)
1145
    if subtxs ~= "end" then
1146
      local tx = 0
1147
      local s = 0
1148
      ar = 16*scroll
1149
      repeat
1150
        tx = tx + 1
1151
        stdate[tx] = string.sub(subtxs,1,12)
1152
        subtxs = string.sub(subtxs,13)
1153
        stpeer[tx] = string.sub(subtxs,1,10)
1154
        subtxs = string.sub(subtxs,11)
1155
        stval[tx] = tonumber(string.sub(subtxs,1,9))
1156
        subtxs = string.sub(subtxs,10)
1157
        if stpeer[tx] == subject then stval[tx] = 0 end
1158
      until string.len(subtxs) == 3
1159
      repeat
1160
        ar = ar + 1
1161
        term.setTextColor(32768)
1162
        term.setCursorPos(18,2+ar-(16*(scroll)))
1163
        term.write(stdate[ar])
1164
        if stpeer[ar] ~= "N/A(Mined)" then term.setTextColor(512) end
1165
        if stpeer[ar] == subject then term.setTextColor(32768) end
1166
        if stpeer[ar] == "N/A(Names)" then term.setTextColor(32768) end
1167
        term.setCursorPos(31,2+ar-(16*(scroll)))
1168
        term.write(stpeer[ar])
1169
        term.setCursorPos(50-string.len(tostring(math.abs(stval[ar]))),2+ar-(16*(scroll)))
1170
        if stval[ar] > 0 then
1171
          term.setTextColor(8192)
1172
          term.write("+")
1173
        elseif stval[ar] < 0 then
1174
          term.setTextColor(16384)
1175
        else
1176
          term.setTextColor(32768)
1177
          term.write(" ")
1178
        end
1179
        term.write(tostring(stval[ar]))
1180
      until ar == math.min(tx,16*(scroll+1))
1181
      term.setBackgroundColor(256)
1182
      term.setCursorPos(17,19)
1183
      term.write("                                   ")
1184
      term.setCursorPos(17,19)
1185
      term.setTextColor(32768)
1186
      lastpage = math.floor((tx-1)/16)
1187
      if (1+lastpage) < 100 then maxspace = maxspace.." " end
1188
      if (1+lastpage) < 10 then maxspace = maxspace.." " end
1189
      if (1+scroll) < 100 then pagespace = pagespace.." " end
1190
      if (1+scroll) < 10 then pagespace = pagespace.." " end
1191
      term.write(" Page "..pagespace..(1+scroll).."/"..maxspace..(1+lastpage))
1192
      pagespace = ""
1193
      maxspace = ""
1194
      term.setCursorPos(32,19)
1195
      term.setTextColor(128)
1196
      term.write("First Prev Next Last")
1197
      if (scroll > 0) then
1198
        term.setCursorPos(32,19)
1199
        term.setTextColor(2048)
1200
        term.write("First Prev")
1201
      end
1202
      if (scroll < lastpage and tx > 16) then
1203
        term.setCursorPos(43,19)
1204
        term.setTextColor(2048)
1205
        term.write("Next Last")
1206
      end
1207
    else
1208
      term.write("No transactions to display!")
1209
      term.setBackgroundColor(256)
1210
      term.setCursorPos(17,19)
1211
      term.write("                                   ")
1212
      term.setCursorPos(17,19)
1213
      term.setTextColor(32768)
1214
      term.write(" Page   1/  1")
1215
      term.setCursorPos(32,19)
1216
      term.setTextColor(128)
1217
      term.write("First Prev Next Last")
1218
    end
1219
  elseif page == 3 then
1220
    term.setCursorPos(19,2)
1221
    term.write("Your address: ")
1222
    term.setTextColor(16384)
1223
    term.write(address)
1224
    term.setTextColor(32768)
1225
    term.setCursorPos(19,3)
1226
    term.write("Your balance: ")
1227
    term.setTextColor(1024)
1228
    if tostring(balance) == 'nil' then balance = 0 end
1229
    term.write(tostring(balance).." KST")
1230
    term.setTextColor(32768)
1231
    term.setCursorPos(19,5)
1232
    term.write("Recipient:    ")
1233
    term.write("                   ")
1234
    term.setCursorPos(19,6)
1235
    term.write("Amount (KST): ")
1236
    term.write("                   ")
1237
  elseif page == 4 then
1238
    term.setCursorPos(19,2)
1239
    term.write("Mining          Addresses")
1240
    term.setTextColor(512)
1241
    term.setCursorPos(19,3)
1242
    term.write("Latest blocks   Address lookup")
1243
    term.setCursorPos(19,4)
1244
    term.write("Lowest hashes   Top balances")
1245
    term.setCursorPos(19,5)
1246
    --term.write("Lowest nonces   ")
1247
    term.setTextColor(32768)
1248
    term.setCursorPos(19,7)
1249
    --term.write("Economy         Transactions")
1250
    term.setTextColor(512)
1251
    term.setCursorPos(19,8)
1252
    --term.write("KST issuance    Latest transfers")
1253
    term.setCursorPos(19,9)
1254
    --term.write("KST distrib.    Largest transfers")
1255
  elseif page == 5 then
1256
    local blocks = readURL(readconfig("syncnode").."?blocks")
1257
    local tx = 0
1258
    ar = 0
1259
    local height = string.sub(blocks,1,8)
1260
    local blktime = {}
1261
    blkpeer = {}
1262
    local blkhash = {}
1263
    height = tonumber(string.sub(blocks,1,8))
1264
    blocks = string.sub(blocks,9)
1265
    local today = string.sub(blocks,1,10)
1266
    blocks = string.sub(blocks,11)
1267
    repeat
1268
      tx = tx + 1
1269
      blktime[tx] = string.sub(blocks,1,8)
1270
      blocks = string.sub(blocks,9)
1271
      blkpeer[tx] = string.sub(blocks,1,10)
1272
      blocks = string.sub(blocks,11)
1273
      blkhash[tx] = string.sub(blocks,1,12)
1274
      blocks = string.sub(blocks,13)
1275
      if stpeer[tx] == subject then stval[tx] = 0 end
1276
    until string.len(blocks) == 0
1277
    term.setCursorPos(18,1)
1278
    term.write("Height: "..tostring(height))
1279
    term.setCursorPos(36,1)
1280
    term.write("Date: "..today)
1281
    term.setCursorPos(17,2)
1282
    term.setBackgroundColor(256)
1283
    term.write(" Time     Miner      Hash          ")
1284
    ----------(" 00:00:00 0000000000 000000000000 ")
1285
    term.setBackgroundColor(1)
1286
    repeat
1287
      ar = ar + 1
1288
      term.setCursorPos(18,2+ar)
1289
      term.write(blktime[ar])
1290
      if blkpeer[ar] ~= "N/A(Burnt)" then term.setTextColor(512) end
1291
      term.setCursorPos(27,2+ar)
1292
      term.write(blkpeer[ar])
1293
      term.setTextColor(32768)
1294
      term.setCursorPos(38,2+ar)
1295
      term.write(blkhash[ar])
1296
    until ar == math.min(tx,17*(scroll+1))
1297
  elseif page == 6 then
1298
    term.setCursorPos(17,2)
1299
    term.setBackgroundColor(256)
1300
    term.write(" Time         Peer           Value ")
1301
    term.setBackgroundColor(256)
1302
    term.setCursorPos(17,19)
1303
    term.write("                                   ")
1304
    term.setCursorPos(17,19)
1305
    term.setTextColor(32768)
1306
    term.write(" Page    /")
1307
    term.setCursorPos(32,19)
1308
    term.setTextColor(128)
1309
    term.write("First Prev Next Last")
1310
    term.setBackgroundColor(1)
1311
    term.setCursorPos(18,1)
1312
    term.write("ADDRESS (click to edit)")
1313
  elseif page == 7 then
1314
    local blocks = readURL(readconfig("syncnode").."?richapi")
1315
    local tx = 0
1316
    ar = 0
1317
    local height = string.sub(blocks,1,8)
1318
    local blktime = {}
1319
    blkpeer = {}
1320
    local blkhash = {}
1321
    repeat
1322
      tx = tx + 1
1323
      blkpeer[tx] = string.sub(blocks,1,10)
1324
      blocks = string.sub(blocks,11)
1325
      blktime[tx] = tonumber(string.sub(blocks,1,8))
1326
      blocks = string.sub(blocks,9)
1327
      blkhash[tx] = string.sub(blocks,1,11)
1328
      blocks = string.sub(blocks,12)
1329
    until string.len(blocks) == 0
1330
    term.setCursorPos(18,1)
1331
    term.write("Krist address rich list")
1332
    term.setCursorPos(17,2)
1333
    term.setBackgroundColor(256)
1334
    term.write("R# Address     Balance First seen  ")
1335
    term.setBackgroundColor(1)
1336
    repeat
1337
      ar = ar + 1
1338
      term.setCursorPos(17,2+ar)
1339
      if ar < 10 then term.write(" ") end
1340
      term.write(ar)
1341
      term.setCursorPos(20,2+ar)
1342
      if blkpeer[ar] ~= "N/A(Burnt)" then term.setTextColor(512) end
1343
      term.write(blkpeer[ar])
1344
      term.setTextColor(32768)
1345
      term.setCursorPos(39-string.len(tostring(math.abs(blktime[ar]))),2+ar)
1346
      term.write(blktime[ar])
1347
      term.setCursorPos(40,2+ar)
1348
      term.write(blkhash[ar])
1349
    until ar == 16
1350
  elseif page == 8 then
1351
    term.setCursorPos(19,2)
1352
    term.write("Storage         Names")
1353
    term.setTextColor(512)
1354
    term.setCursorPos(19,3)
1355
    term.write("Double vault    Register name")
1356
    term.setCursorPos(19,4)
1357
    term.write("Local vault")
1358
    term.setCursorPos(19,5)
1359
    --term.write("Disk vault      v1 SHA vault")
1360
    term.setCursorPos(19,6)
1361
    --term.write("SHA vault       v1 wallet")
1362
  elseif page == 9 then
1363
    term.setCursorPos(25,2)
1364
    term.write("Double vault manager")
1365
    term.setCursorPos(19,8)
1366
    term.write("Using double vaults is a way to")
1367
    term.setCursorPos(19,9)
1368
    term.write("store your Krist under an extra")
1369
    term.setCursorPos(19,10)
1370
    term.write("layer of security. You can only")
1371
    term.setCursorPos(19,11)
1372
    term.write("access a double vault from your")
1373
    term.setCursorPos(19,12)
1374
    term.write("wallet (on any server) and then")
1375
    term.setCursorPos(19,13)
1376
    term.write("only after typing an extra pass")
1377
    term.setCursorPos(19,14)
1378
    term.write("code. Double wallets are wholly")
1379
    term.setCursorPos(19,15)
1380
    term.write("invisible to unauthorized users")
1381
    term.setCursorPos(19,16)
1382
    term.write("of your wallet; they can not be")
1383
    term.setCursorPos(19,17)
1384
    term.write("seen or opened without the pass")
1385
    term.setCursorPos(19,18)
1386
    term.write("code set by you.")
1387
    term.setCursorPos(19,4)
1388
    term.write("Pass code: ")
1389
    term.setCursorPos(19,5)
1390
    term.write("Amount (KST): ")
1391
    term.setCursorPos(30,4)
1392
    if string.len(doublekey) == 0 then
1393
      term.setTextColor(256)
1394
      term.write("(click to set)")
1395
    else
1396
      term.setTextColor(8192)
1397
      term.write("Ready: "..balance2.." KST")
1398
      if tonumber(amt) > 0 then
1399
        term.setCursorPos(25,6)
1400
        term.setTextColor(32768)
1401
        term.setBackgroundColor(128)
1402
        if tonumber(amt) <= balance then
1403
          term.setBackgroundColor(2)
1404
        end
1405
        term.write(" Deposit ")
1406
        term.setBackgroundColor(1)
1407
        term.write(" ")
1408
        term.setBackgroundColor(128)
1409
        if tonumber(amt) <= balance2 then
1410
          term.setBackgroundColor(2)
1411
        end
1412
        term.write(" Withdraw ")
1413
        term.setBackgroundColor(1)
1414
      end
1415
    end
1416
    term.setCursorPos(33,5)
1417
    if amt == 0 then
1418
      term.setTextColor(256)
1419
      term.write("(click to set)")
1420
    else
1421
      term.setTextColor(32768)
1422
      term.write(amt)
1423
    end
1424
    term.setTextColor(32768)
1425
  elseif page == 10 then
1426
    local blocks = readURL(readconfig("syncnode").."?blocks&low")
1427
    local tx = 0
1428
    ar = 0
1429
    local blktime = {}
1430
    blkpeer = {}
1431
    local blkhash = {}
1432
    repeat
1433
      tx = tx + 1
1434
      blktime[tx] = string.sub(blocks,1,6)
1435
      blocks = string.sub(blocks,7)
1436
      blkpeer[tx] = string.sub(blocks,1,6)
1437
      blocks = string.sub(blocks,7)
1438
      blkhash[tx] = string.sub(blocks,1,20)
1439
      blocks = string.sub(blocks,21)
1440
    until string.len(blocks) == 0
1441
    term.setCursorPos(17,1)
1442
    term.setBackgroundColor(256)
1443
    term.write(" Date   Block# Hash                ")
1444
    ----------(" Feb 28 000000 000000000000oooooooo")
1445
    term.setBackgroundColor(1)
1446
    repeat
1447
      ar = ar + 1
1448
      term.setCursorPos(18,1+ar)
1449
      term.write(blktime[ar])
1450
      term.setCursorPos(31-string.len(tostring(math.abs(tonumber(blkpeer[ar])))),1+ar)
1451
      term.write(tonumber(blkpeer[ar]))
1452
      term.setTextColor(256)
1453
      term.setCursorPos(32,1+ar)
1454
      term.write(blkhash[ar])
1455
      term.setTextColor(32768)
1456
      term.setCursorPos(32,1+ar)
1457
      term.write(string.sub(blkhash[ar],1,12))
1458
    until ar == math.min(tx,18)
1459
  elseif page == 11 then
1460
    local blocks = readURL(readconfig("syncnode").."?blocks&low&lownonce")
1461
    local tx = 0
1462
    ar = 0
1463
    local blktime = {}
1464
    blkpeer = {}
1465
    local blkhash = {}
1466
    repeat
1467
      tx = tx + 1
1468
      blktime[tx] = string.sub(blocks,1,6)
1469
      blocks = string.sub(blocks,7)
1470
      blkpeer[tx] = string.sub(blocks,1,6)
1471
      blocks = string.sub(blocks,7)
1472
      blkhash[tx] = string.sub(blocks,1,12)
1473
      blocks = string.sub(blocks,13)
1474
    until string.len(blocks) == 0
1475
    term.setCursorPos(17,1)
1476
    term.setBackgroundColor(256)
1477
    term.write(" Date   Block# Nonce               ")
1478
    ----------(" Feb 28 000000 000000000000")
1479
    term.setBackgroundColor(1)
1480
    repeat
1481
      ar = ar + 1
1482
      term.setCursorPos(18,1+ar)
1483
      term.write(blktime[ar])
1484
      term.setCursorPos(31-string.len(tostring(math.abs(tonumber(blkpeer[ar])))),1+ar)
1485
      term.write(tonumber(blkpeer[ar]))
1486
      term.setTextColor(32768)
1487
      term.setCursorPos(32,1+ar)
1488
      term.write(tonumber(blkhash[ar]))
1489
    until ar == math.min(tx,18)
1490
  elseif page == 12 then
1491
    local blocks = readURL(readconfig("syncnode").."?blocks&low&highnonce")
1492
    local tx = 0
1493
    ar = 0
1494
    local blktime = {}
1495
    blkpeer = {}
1496
    local blkhash = {}
1497
    repeat
1498
      tx = tx + 1
1499
      blktime[tx] = string.sub(blocks,1,6)
1500
      blocks = string.sub(blocks,7)
1501
      blkpeer[tx] = string.sub(blocks,1,6)
1502
      blocks = string.sub(blocks,7)
1503
      blkhash[tx] = string.sub(blocks,1,12)
1504
      blocks = string.sub(blocks,13)
1505
    until string.len(blocks) == 0
1506
    term.setCursorPos(17,1)
1507
    term.setBackgroundColor(256)
1508
    term.write(" Date   Block# Nonce               ")
1509
    ----------(" Feb 28 000000 000000000000")
1510
    term.setBackgroundColor(1)
1511
    repeat
1512
      ar = ar + 1
1513
      term.setCursorPos(18,1+ar)
1514
      term.write(blktime[ar])
1515
      term.setCursorPos(31-string.len(tostring(math.abs(tonumber(blkpeer[ar])))),1+ar)
1516
      term.write(tonumber(blkpeer[ar]))
1517
      term.setTextColor(32768)
1518
      term.setCursorPos(32,1+ar)
1519
      term.write(tonumber(blkhash[ar]))
1520
    until ar == math.min(tx,18)
1521
  elseif page == 13 then
1522
    balance3 = tonumber(readURL(readconfig("syncnode").."?getbalance="..addresslv))
1523
    term.setCursorPos(25,2)
1524
    term.write("Local vault manager")
1525
    term.setCursorPos(19,8)
1526
    term.write("Local vaults are a place to put")
1527
    term.setCursorPos(19,9)
1528
    term.write("Krist in the form of a file on")
1529
    term.setCursorPos(19,10)
1530
    term.write("a computer. Unlike traditional")
1531
    term.setCursorPos(19,11)
1532
    term.write("wallets, local vaults can only")
1533
    term.setCursorPos(19,12)
1534
    term.write("be accessed on the computer")
1535
    term.setCursorPos(19,13)
1536
    term.write("they were initially created on.")
1537
    term.setCursorPos(19,14)
1538
    term.write("If you do this, please ensure")
1539
    term.setCursorPos(19,15)
1540
    term.write("that this computer is never")
1541
    term.setCursorPos(19,16)
1542
    term.write("stolen or broken, as your money")
1543
    term.setCursorPos(19,17)
1544
    term.write("may be lost if you don't have a")
1545
    term.setCursorPos(19,18)
1546
    term.write("backup.")
1547
    term.setCursorPos(19,4)
1548
    term.write("KST put here: "..balance3)
1549
    term.setCursorPos(19,5)
1550
    term.write("Amount (KST): ")
1551
    term.setCursorPos(33,5)
1552
    if amt == 0 then
1553
      term.setTextColor(256)
1554
      term.write("(click to set)")
1555
    else
1556
      term.setTextColor(32768)
1557
      term.write(amt)
1558
    end
1559
    if tonumber(amt) > 0 then
1560
      term.setCursorPos(25,6)
1561
      term.setTextColor(32768)
1562
      term.setBackgroundColor(128)
1563
      if tonumber(amt) <= balance then
1564
        term.setBackgroundColor(2)
1565
      end
1566
      term.write(" Deposit ")
1567
      term.setBackgroundColor(1)
1568
      term.write(" ")
1569
      term.setBackgroundColor(128)
1570
      if tonumber(amt) <= balance3 then
1571
        term.setBackgroundColor(2)
1572
      end
1573
      term.write(" Withdraw ")
1574
      term.setBackgroundColor(1)
1575
    end
1576
  elseif page == 14 then
1577
    term.setBackgroundColor(1)
1578
    term.setCursorPos(19,2)
1579
    term.write("Local settings")
1580
    --deprecated for now
1581
  elseif page == 15 then
1582
    term.setBackgroundColor(1)
1583
    term.setCursorPos(18,1)
1584
    term.write(".KST domain name manager     [New]")
1585
    term.setCursorPos(46,1)
1586
    term.setBackgroundColor(32)
1587
    term.setTextColor(1)
1588
    term.write(" + NEW")
1589
    term.setCursorPos(17,2)
1590
    term.setBackgroundColor(256)
1591
    term.setTextColor(32768)
1592
    term.write(" Name                 Actions      ")
1593
    term.setBackgroundColor(1)
1594
    term.setCursorPos(18,3)
1595
    local namelist = readURL(readconfig("syncnode").."?listnames="..address)
1596
	local splitname = split(namelist, ";")
1597
	
1598
1599
    if #splitname == 0 then
1600
      term.setTextColor(256)
1601
      term.write("No names to display!")
1602
    else
1603
      local namecount = 1
1604
      repeat
1605
				local thisname = splitname[namecount]
1606
				--namelist:sub(0,namelist:find(";")-1)
1607
        term.setTextColor(32768)
1608
        term.setCursorPos(18,3+namecount)
1609
        term.write(splitname[namecount]..".kst")
1610
        term.setCursorPos(39,3+namecount)
1611
        term.setTextColor(512)
1612
        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
1613
        term.write("Edit Send ")
1614
        term.setTextColor(256)
1615
        term.write("Go")
1616
        namecount = namecount + 1
1617
      until namecount == #splitname+1
1618
    end
1619
    --term.write("a.kst                Edit Send Go")
1620
    term.setBackgroundColor(1)
1621
  elseif page == 16 then
1622
    term.setBackgroundColor(1)
1623
    term.setCursorPos(20,2)
1624
    term.write(".KST domain name registration")
1625
    term.setCursorPos(19,4)
1626
    term.write("Name: ")
1627
    if name == "" then
1628
      term.setTextColor(colors.lightGray)
1629
      term.write("(click to set)")
1630
    else
1631
      term.write(name)
1632
      term.setTextColor(colors.lightGray)
1633
      term.write(".kst")
1634
    end
1635
    term.setTextColor(colors.black)
1636
    term.setCursorPos(19,5)
1637
    term.write("Cost: 500 KST")
1638
    term.setCursorPos(19,7)
1639
    --term.write("Available! [Register]")
1640
    if name == "" then
1641
      term.setTextColor(colors.blue)
1642
      term.write("Please select a name!")
1643
    elseif availability == 1 then
1644
      term.setTextColor(colors.green)
1645
      term.write("Available! ")
1646
      --if balance >= 500 then
1647
        term.setBackgroundColor(colors.green)
1648
        term.setTextColor(colors.lime)
1649
        term.write(" Register ")
1650
        term.setBackgroundColor(colors.white)
1651
      --end
1652
    elseif availability == 2 then
1653
      term.setTextColor(colors.yellow)
1654
      term.write("Name registered!")
1655
    else
1656
      term.setTextColor(colors.red)
1657
      term.write("Not available!")
1658
    end
1659
    term.setTextColor(colors.black)
1660
    term.setCursorPos(19,9)
1661
    term.write(".KST domain names are used on")
1662
    term.setCursorPos(19,10)
1663
    term.write("the KristScape browser. For")
1664
    term.setCursorPos(19,11)
1665
    term.write("more information, please see")
1666
    term.setCursorPos(19,12)
1667
    term.write("the Krist thread.")
1668
    term.setCursorPos(19,14)
1669
    term.write("All Krist spent on names will")
1670
    term.setCursorPos(19,15)
1671
    term.write("be added to the value of")
1672
    term.setCursorPos(19,16)
1673
    term.write("future blocks; essentially")
1674
    term.setCursorPos(19,17)
1675
    term.write("being \"re-mined.\"")
1676
  elseif page == 17 then
1677
    term.setBackgroundColor(1)
1678
    term.setCursorPos(28,2)
1679
    term.write(".KST zone file")
1680
    term.setCursorPos(19,4)
1681
    term.write("Name: "..subject)
1682
    term.setTextColor(colors.lightGray)
1683
    term.write(".kst")
1684
    term.setTextColor(colors.black)
1685
    term.setCursorPos(19,7)
1686
    term.write("Your name's zone file is the")
1687
    term.setCursorPos(19,8)
1688
    term.write("URL of the site it is pointing")
1689
    term.setCursorPos(19,9)
1690
    term.write("to. When KristScape navigates")
1691
    term.setCursorPos(19,10)
1692
    term.write("to a name, it will make an HTTP")
1693
    term.setCursorPos(19,11)
1694
    term.write("get request to the above URL.")
1695
    term.setCursorPos(19,12)
1696
    term.write("The zone record should not")
1697
    term.setCursorPos(19,13)
1698
    term.write("include a protocol (http://)")
1699
    term.setCursorPos(19,14)
1700
    term.write("and shouldn't end with a")
1701
    term.setCursorPos(19,15)
1702
    term.write("slash. You can redirect a name")
1703
    term.setCursorPos(19,16)
1704
    term.write("to another name by making the")
1705
    term.setCursorPos(19,17)
1706
    term.write("first character of the record")
1707
    term.setCursorPos(19,18)
1708
    term.write("a dollar sign; e.g. $krist.kst")
1709
    term.setTextColor(colors.black)
1710
    term.setCursorPos(19,5)
1711
    term.write("Zone: ")
1712
    zone = readURL(readconfig("syncnode").."?a="..subject)
1713
    if zone == "" then
1714
      term.setTextColor(colors.lightGray)
1715
      term.write("(click to set)")
1716
    else
1717
      term.write(zone)
1718
    end
1719
  elseif page == 18 then
1720
    term.setBackgroundColor(1)
1721
    term.setCursorPos(28,2)
1722
    term.write("Name transfer")
1723
    term.setCursorPos(19,4)
1724
    term.write("Name: "..subject)
1725
    term.setTextColor(colors.lightGray)
1726
    term.write(".kst")
1727
    term.setTextColor(colors.black)
1728
    term.setCursorPos(19,5)
1729
    term.write("Recipient: ")
1730
  elseif page == 21 then
1731
    term.setBackgroundColor(1)
1732
    term.setCursorPos(4,6)
1733
    term.write("Address - ")
1734
    term.setTextColor(16384)
1735
    term.write(address)
1736
    term.setTextColor(32768)
1737
    term.setCursorPos(4,7)
1738
    term.write("Balance - ")
1739
    term.setTextColor(1024)
1740
    if tostring(balance) == 'nil' then balance = 0 end
1741
    term.write(tostring(balance).." KST")
1742
    term.setTextColor(32768)
1743
    term.setCursorPos(3,9)
1744
  end
1745
end
1746
boot()