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