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}