banktest.gno

1.72 Kb ยท 80 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(cur realm, returnDenom string, returnAmount int64) string {
34	std.AssertOriginCall()
35	caller := std.OriginCaller()
36	send := std.Coins{{returnDenom, returnAmount}}
37	// record activity
38	act := &activity{
39		caller:   caller,
40		sent:     std.OriginSend(),
41		returned: send,
42		time:     time.Now(),
43	}
44	addActivity(act)
45	// return if any.
46	if returnAmount > 0 {
47		banker := std.NewBanker(std.BankerTypeOriginSend)
48		pkgaddr := std.CurrentRealm().Address()
49		// TODO: use std.Coins constructors, this isn't generally safe.
50		banker.SendCoins(pkgaddr, caller, send)
51		return "returned!"
52	} else {
53		return "thank you!"
54	}
55}
56
57func bankerAddr(cur realm) std.Address {
58	return std.CurrentRealm().Address()
59}
60
61func Render(path string) string {
62	// get realm coins.
63	banker := std.NewBanker(std.BankerTypeReadonly)
64	coins := banker.GetCoins(bankerAddr(cross))
65
66	// render
67	res := ""
68	res += "## recent activity\n"
69	res += "\n"
70	for _, act := range latest {
71		if act == nil {
72			break
73		}
74		res += " * " + act.String() + "\n"
75	}
76	res += "\n"
77	res += "## total deposits\n"
78	res += coins.String()
79	return res
80}