faucet.gno
2.36 Kb ยท 94 lines
1package faucet
2
3import (
4 "errors"
5 "std"
6
7 "gno.land/p/demo/avl"
8 "gno.land/p/demo/ufmt"
9)
10
11var (
12 // configurable by admin.
13 gAdminAddr std.Address = std.Address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
14 gControllers = avl.NewTree()
15 gControllersMaxSize = 10 // limit it to 10
16 gInPause = false
17 gMessage = "# Community Faucet.\n\n"
18
19 // internal vars, for stats.
20 gTotalTransferred std.Coins
21 gTotalTransfers = uint(0)
22
23 // per request limit, 350 gnot
24 gLimit std.Coin = std.NewCoin("ugnot", 350_000_000)
25)
26
27func Transfer(cur realm, to std.Address, send int64) string {
28 if err := assertIsController(); err != nil {
29 return err.Error()
30 }
31
32 if gInPause {
33 return errors.New("faucet in pause").Error()
34 }
35
36 // limit the per request
37 if send > gLimit.Amount {
38 return errors.New("Per request limit " + gLimit.String() + " exceed").Error()
39 }
40 sendCoins := std.Coins{std.NewCoin("ugnot", send)}
41
42 gTotalTransferred = gTotalTransferred.Add(sendCoins)
43 gTotalTransfers++
44
45 banker := std.NewBanker(std.BankerTypeRealmSend)
46 pkgaddr := std.CurrentRealm().Address()
47 banker.SendCoins(pkgaddr, to, sendCoins)
48 return ""
49}
50
51func GetPerTransferLimit() int64 {
52 return gLimit.Amount
53}
54
55func bankerAddr(cur realm) std.Address {
56 return std.CurrentRealm().Address()
57}
58
59func Render(_ string) string {
60 banker := std.NewBanker(std.BankerTypeReadonly)
61 balance := banker.GetCoins(bankerAddr(cross))
62
63 output := gMessage
64 if gInPause {
65 output += "Status: inactive.\n"
66 } else {
67 output += "Status: active.\n"
68 }
69 output += ufmt.Sprintf("Balance: %s.\n", balance.String())
70 output += ufmt.Sprintf("Total transfers: %s (in %d times).\n\n", gTotalTransferred.String(), gTotalTransfers)
71
72 output += "Package address: " + std.CurrentRealm().Address().String() + "\n\n"
73 output += ufmt.Sprintf("Admin: %s\n\n ", gAdminAddr.String())
74 output += ufmt.Sprintf("Controllers:\n\n ")
75
76 for i := 0; i < gControllers.Size(); i++ {
77 _, v := gControllers.GetByIndex(i)
78 output += ufmt.Sprintf("%s ", v.(std.Address))
79 }
80
81 output += "\n\n"
82 output += ufmt.Sprintf("Per request limit: %s\n\n", gLimit.String())
83
84 return output
85}
86
87func assertIsController() error {
88 caller := std.PreviousRealm().Address()
89 ok := gControllers.Has(caller.String())
90 if !ok {
91 return errors.New(caller.String() + " is not on the controller list")
92 }
93 return nil
94}