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}