github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/examples/gno.land/r/gnoland/faucet/faucet.gno (about) 1 package faucet 2 3 import ( 4 "errors" 5 "std" 6 7 "gno.land/p/demo/avl" 8 "gno.land/p/demo/ufmt" 9 ) 10 11 var ( 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.Coin{"ugnot", 350000000} 25 ) 26 27 func Transfer(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.Coin{Denom: "ugnot", Amount: send}} 41 42 gTotalTransferred = gTotalTransferred.Add(sendCoins) 43 gTotalTransfers++ 44 45 banker := std.GetBanker(std.BankerTypeRealmSend) 46 pkgaddr := std.CurrentRealm().Addr() 47 banker.SendCoins(pkgaddr, to, sendCoins) 48 return "" 49 } 50 51 func GetPerTransferLimit() int64 { 52 return gLimit.Amount 53 } 54 55 func Render(_ string) string { 56 banker := std.GetBanker(std.BankerTypeRealmSend) 57 balance := banker.GetCoins(std.CurrentRealm().Addr()) 58 59 output := gMessage 60 if gInPause { 61 output += "Status: inactive.\n" 62 } else { 63 output += "Status: active.\n" 64 } 65 output += ufmt.Sprintf("Balance: %s.\n", balance.String()) 66 output += ufmt.Sprintf("Total transfers: %s (in %d times).\n\n", gTotalTransferred.String(), gTotalTransfers) 67 68 output += "Package address: " + std.CurrentRealm().Addr().String() + "\n\n" 69 output += ufmt.Sprintf("Admin: %s\n\n ", gAdminAddr.String()) 70 output += ufmt.Sprintf("Controllers:\n\n ") 71 72 for i := 0; i < gControllers.Size(); i++ { 73 _, v := gControllers.GetByIndex(i) 74 output += ufmt.Sprintf("%s ", v.(std.Address)) 75 } 76 77 output += "\n\n" 78 output += ufmt.Sprintf("Per request limit: %s\n\n", gLimit.String()) 79 80 return output 81 } 82 83 func assertIsController() error { 84 caller := std.GetOrigCaller() 85 86 ok := gControllers.Has(caller.String()) 87 if !ok { 88 return errors.New(caller.String() + " is not on the controller list") 89 } 90 return nil 91 }