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