Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: updates for the faucet community bot #400

Merged
merged 11 commits into from
Mar 12, 2023
67 changes: 50 additions & 17 deletions examples/gno.land/r/gnoland/faucet/admin.gno
Original file line number Diff line number Diff line change
Expand Up @@ -5,44 +5,77 @@ import (
"std"
)

func AdminSetInPause(inPause bool) error {
func AdminSetInPause(inPause bool) string {
zivkovicmilos marked this conversation as resolved.
Show resolved Hide resolved
if err := assertIsAdmin(); err != nil {
return err
return err.Error()
}
gInPause = inPause
return nil
return ""
}

func AdminSetMessage(message string) error {
func AdminSetMessage(message string) string {
if err := assertIsAdmin(); err != nil {
return err
return err.Error()
}
gMessage = message
return nil
return ""
}

func AdminSetPerTransferSend(send std.Coins) error {
func AdminSetTransferLimit(amount int64) string {
if err := assertIsAdmin(); err != nil {
return err
return err.Error()
}
gPerTransferSend = send
return nil
gLimit = std.Coin{Denom: "ugnot", Amount: amount}
zivkovicmilos marked this conversation as resolved.
Show resolved Hide resolved
return ""
}

func AdminSetAdminAddr(addr std.Address) error {
func AdminSetAdminAddr(addr std.Address) string {
if err := assertIsAdmin(); err != nil {
return err
return err.Error()
}
gAdminAddr = addr
return nil
return ""
}

func AdminSetControllerAddr(addr std.Address) error {
func AdminAddController(addr std.Address) string {
if err := assertIsAdmin(); err != nil {
return err
return err.Error()
}
gControllerAddr = addr
return nil

size := gControllers.Size()

if size >= gControllersSize {
return "can not add more controllers than allowed"
}
zivkovicmilos marked this conversation as resolved.
Show resolved Hide resolved

if gControllers.Has(addr.String()) {
return addr.String() + " exists, no need to add."
}
zivkovicmilos marked this conversation as resolved.
Show resolved Hide resolved

gControllers.Set(addr.String(), addr)

return ""
}

func AdminRemoveController(addr std.Address) string {
if err := assertIsAdmin(); err != nil {
return err.Error()
}

if !gControllers.Has(addr.String()) {
return addr.String() + " is not on the controller list"
}

_, ok := gControllers.Remove(addr.String())

// it not should happen.
// we will check anyway to prevent issues in the underline implementation.

if !ok {
return addr.String() + " is not on the controller list"
}
zivkovicmilos marked this conversation as resolved.
Show resolved Hide resolved

return ""
}

func assertIsAdmin() error {
Expand Down
63 changes: 43 additions & 20 deletions examples/gno.land/r/gnoland/faucet/faucet.gno
Original file line number Diff line number Diff line change
Expand Up @@ -4,65 +4,88 @@ import (
"errors"
"std"

"gno.land/p/demo/avl"
"gno.land/p/demo/ufmt"
)

var (
// configurable by admin.
gAdminAddr std.Address = "g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq"
gControllerAddr std.Address = "g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq"
gPerTransferSend = std.Coins{std.Coin{"ugnot", 1000000}}
gInPause = false
gMessage = "# Community Faucet.\n\n"
gAdminAddr std.Address = std.Address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
gControllers = avl.NewMutTree()
gControllersSize = 10 // limit it to 10
gInPause = false
gMessage = "# Community Faucet.\n\n"

// internal vars, for stats.
gTotalTransferred std.Coins
gTotalTransfers = uint(0)

// per request limit, 350 gnot
gLimit std.Coin = std.Coin{"ugnot", 350000000}
)

func Transfer(to std.Address) error {
func Transfer(to std.Address, send int64) string {
zivkovicmilos marked this conversation as resolved.
Show resolved Hide resolved
if err := assertIsController(); err != nil {
return err
return err.Error()
}

if gInPause {
return errors.New("faucet in pause")
return errors.New("faucet in pause").Error()
}

send := gPerTransferSend
// limit the per request
if send > gLimit.Amount {
return errors.New("Per request limit " + gLimit.String() + " exceed").Error()
}
sendCoins := std.Coins{std.Coin{Denom: "ugnot", Amount: send}}

gTotalTransferred = gTotalTransferred.Add(send)
gTotalTransferred = gTotalTransferred.Add(sendCoins)
gTotalTransfers++

banker := std.GetBanker(std.BankerTypeOrigSend)
banker := std.GetBanker(std.BankerTypeRealmSend)
pkgaddr := std.GetOrigPkgAddr()
banker.SendCoins(pkgaddr, to, send)
return nil
banker.SendCoins(pkgaddr, to, sendCoins)
return ""
}

func GetPerTransferLimit() int64 {
return gLimit.Amount
}

func Render(path string) string {
banker := std.GetBanker(std.BankerTypeOrigSend)
banker := std.GetBanker(std.BankerTypeRealmSend)
balance := banker.GetCoins(std.GetOrigPkgAddr())

output := gMessage
output := path + gMessage
if gInPause {
output += "Status: inactive.\n"
} else {
output += "Status: active.\n"
}
output += ufmt.Sprintf("Balance: %s.\n", balance.String())
output += ufmt.Sprintf("Rewarded: %s (in %d times).\n", gTotalTransferred.String(), gTotalTransfers)
output += ufmt.Sprintf("Total transfers: %s (in %d times).\n\n", gTotalTransferred.String(), gTotalTransfers)

if path == "?debug" {
output += ufmt.Sprintf("Admin: %s, Controller: %s\n", gAdminAddr.String(), gControllerAddr.String())
output += "Package address: " + std.GetOrigPkgAddr().String() + "\n\n"
output += ufmt.Sprintf("Admin: %s\n\n ", gAdminAddr.String())
output += ufmt.Sprintf("Controllers:\n\n ")

for i := 0; i < gControllersSize; i++ {
_, v := gControllers.GetByIndex(i)
output += ufmt.Sprintf("%s ", v.(std.Address))
}

output += "\n\n"
output += ufmt.Sprintf("Per request limit: %s\n\n", gLimit.String())

return output
}

func assertIsController() error {
caller := std.GetOrigCaller()
if caller != gControllerAddr {
return errors.New("restricted for controller")

ok := gControllers.Has(caller.String())
if !ok {
return errors.New(caller.String() + " is not on the controller list")
}
return nil
}
75 changes: 0 additions & 75 deletions examples/gno.land/r/gnoland/faucet/faucet_filetest.gno

This file was deleted.

Loading