Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}