banktest.gno

1.73 Kb ยท 84 lines
 1package banktest
 2
 3import (
 4	"std"
 5	"time"
 6)
 7
 8type activity struct {
 9	caller   std.Address
10	sent     std.Coins
11	returned std.Coins
12	time     time.Time
13}
14
15func (act *activity) String() string {
16	return act.caller.String() + " " +
17		act.sent.String() + " sent, " +
18		act.returned.String() + " returned, at " +
19		act.time.Format("2006-01-02 3:04pm MST")
20}
21
22var latest [10]*activity
23
24func addActivity(act *activity) {
25	for i := len(latest) - 2; i >= 0; i-- {
26		latest[i+1] = latest[i] // shift by +1.
27	}
28	latest[0] = act
29}
30
31// Deposit will take the coins (to the realm's pkgaddr) if returnAmount is 0,
32// or return the specified return amount back to user.
33func Deposit(returnDenom string, returnAmount int64) string {
34	crossing()
35
36	std.AssertOriginCall()
37	caller := std.OriginCaller()
38	send := std.Coins{{returnDenom, returnAmount}}
39	// record activity
40	act := &activity{
41		caller:   caller,
42		sent:     std.OriginSend(),
43		returned: send,
44		time:     time.Now(),
45	}
46	addActivity(act)
47	// return if any.
48	if returnAmount > 0 {
49		banker := std.NewBanker(std.BankerTypeOriginSend)
50		pkgaddr := std.CurrentRealm().Address()
51		// TODO: use std.Coins constructors, this isn't generally safe.
52		banker.SendCoins(pkgaddr, caller, send)
53		return "returned!"
54	} else {
55		return "thank you!"
56	}
57}
58
59func bankerAddr() std.Address {
60	crossing()
61
62	return std.CurrentRealm().Address()
63}
64
65func Render(path string) string {
66	// get realm coins.
67	banker := std.NewBanker(std.BankerTypeReadonly)
68	coins := banker.GetCoins(cross(bankerAddr)())
69
70	// render
71	res := ""
72	res += "## recent activity\n"
73	res += "\n"
74	for _, act := range latest {
75		if act == nil {
76			break
77		}
78		res += " * " + act.String() + "\n"
79	}
80	res += "\n"
81	res += "## total deposits\n"
82	res += coins.String()
83	return res
84}