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}