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  }