Skip to content

Commit

Permalink
feat: admin updates validators powers
Browse files Browse the repository at this point in the history
  • Loading branch information
anarcher committed Sep 3, 2023
1 parent 0347fcc commit b8055c2
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 29 deletions.
20 changes: 20 additions & 0 deletions examples/gno.land/r/system/validators/admin.gno
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package validators

import (
"std"
)

var (
adminAddr = std.Address("g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq")
)

func assertIsAdmin() {
caller := std.GetOrigCaller()
if !isAdmin(caller) {
panic("access restricted.")
}
}

func isAdmin(addr std.Address) bool {
return addr == adminAddr
}
31 changes: 16 additions & 15 deletions examples/gno.land/r/system/validators/public.gno
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,19 @@ import (
"gno.land/p/demo/ufmt"
)

// CreateValidator creates a new validator with the given name and public key
func CreateValidator(name, pubkey string) {
std.AssertOriginCall()

if validators.Size() >= maxValidators {
panic("validator set is full")
}

caller := std.GetOrigCaller()
vkey := validatorKey(caller)
if validators.Has(vkey) {
panic("validator already registered")
}

power := std.GetOrigSend().AmountOf(nativeDenom)

var power int64 = 0 // when created validator, power is 0, admin must confirm this validator is active or not
validator := newValidator(name, caller, pubkey, power)
validators.Set(vkey, validator)

}

func RemoveValidator() {
Expand All @@ -37,26 +32,32 @@ func RemoveValidator() {
validators.Remove(vkey)
}

func UpdateMaxValidators(max int) {
std.AssertOriginCall()
caller := std.GetOrigCaller()
if caller != admin {
panic("unauthorized")
}
// UpdateValidatorPower updates the power of the given validator by admins
func UpdateValidatorPower(addr std.Address, power int64) {
assertIsAdmin()
vkey := validatorKey(addr)

maxValidators = max
v, ok := validators.Get(vkey)
if !ok {
panic("validator not found")
}
v.(*Validator).power = power
}

// ValidatorSet returns the current active validator set
func ValidatorSet() string {
output := ""
colon := ""
validators.Iterate("", "", func(key string, value interface{}) bool {
validator := value.(*Validator)
if validator.power == 0 {
return false
}

output = output + colon + ufmt.Sprintf("%s:%d", validator.pubkey, validator.power)
colon = ","
return false

})

return output
}
6 changes: 3 additions & 3 deletions examples/gno.land/r/system/validators/render.gno
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ import (

func Render(path string) string {
output := ""
output += ufmt.Sprintf("## Validators: (%d / %d)\n", validators.Size(), maxValidators)
output += ufmt.Sprintf("## Validators: (%d)\n", validators.Size())
output += "\n"
output += "| Name | Address | VotingPower |\n"
output += "| ---- | ------- | ----------- |\n"
output += "| Name | Address | Pubkey | VotingPower |\n"
output += "| ---- | ------- | ------ | ----------- |\n"

validators.Iterate("", "", func(key string, value interface{}) bool {
v := value.(*Validator)
Expand Down
10 changes: 5 additions & 5 deletions examples/gno.land/r/system/validators/validator.gno
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,16 @@ import (

type Validator struct {
name string
address std.Address
pubkey string
power int64
address std.Address // owner address
pubkey string // node pubkey(id)
power int64 // voting power
}

func newValidator(name string, address std.Address, pubkey string, power int64) *Validator {
return &Validator{name, address, pubkey, power}
}

func (v Validator) Render() string {
format := "|%s|%s|%d|"
return ufmt.Sprintf(format, v.name, v.address, v.power)
format := "|%s|%s|%s|%d|"
return ufmt.Sprintf(format, v.name, v.address, v.pubkey, v.power)
}
6 changes: 0 additions & 6 deletions examples/gno.land/r/system/validators/validators.gno
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,6 @@ var (
validators = avl.NewTree() // addr -> *Validator
)

var (
maxValidators = 20
nativeDenom = "ugnot"
admin = std.Address("g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq")
)

func validatorKey(addr std.Address) string {
return addr.String()
}

0 comments on commit b8055c2

Please sign in to comment.