package core
import (
"math/big"
"strings"
"testing"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethdb"
"github.com/harmony-one/bls/ffi/go/bls"
"github.com/harmony-one/harmony/core/state"
"github.com/harmony-one/harmony/crypto/hash"
common2 "github.com/harmony-one/harmony/internal/common"
"github.com/harmony-one/harmony/internal/ctxerror"
"github.com/harmony-one/harmony/numeric"
"github.com/harmony-one/harmony/shard"
staking "github.com/harmony-one/harmony/staking/types"
)
var (
validatorAddress = common . Address ( common2 . MustBech32ToAddress ( "one1pdv9lrdwl0rg5vglh4xtyrv3wjk3wsqket7zxy" ) )
)
func generateBlsKeySigPair ( ) ( shard . BlsPublicKey , shard . BLSSignature ) {
p := & bls . PublicKey { }
p . DeserializeHexStr ( testBLSPubKey )
pub := shard . BlsPublicKey { }
pub . FromLibBLSPublicKey ( p )
messageBytes := [ ] byte ( staking . BlsVerificationStr )
privateKey := & bls . SecretKey { }
privateKey . DeserializeHexStr ( testBLSPrvKey )
msgHash := hash . Keccak256 ( messageBytes )
signature := privateKey . SignHash ( msgHash [ : ] )
var sig shard . BLSSignature
copy ( sig [ : ] , signature . Serialize ( ) )
return pub , sig
}
func createValidator ( ) * staking . CreateValidator {
desc := staking . Description {
Name : "SuperHero" ,
Identity : "YouWouldNotKnow" ,
Website : "Secret Website" ,
SecurityContact : "LicenseToKill" ,
Details : "blah blah blah" ,
}
rate , _ := numeric . NewDecFromStr ( "0.1" )
maxRate , _ := numeric . NewDecFromStr ( "0.5" )
maxChangeRate , _ := numeric . NewDecFromStr ( "0.05" )
commission := staking . CommissionRates {
Rate : rate ,
MaxRate : maxRate ,
MaxChangeRate : maxChangeRate ,
}
minSelfDel := big . NewInt ( 1e18 )
maxTotalDel := big . NewInt ( 9e18 )
pubKey , pubSig := generateBlsKeySigPair ( )
slotPubKeys := [ ] shard . BlsPublicKey { pubKey }
slotKeySigs := [ ] shard . BLSSignature { pubSig }
amount := big . NewInt ( 5e18 )
v := staking . CreateValidator {
ValidatorAddress : validatorAddress ,
Description : desc ,
CommissionRates : commission ,
MinSelfDelegation : minSelfDel ,
MaxTotalDelegation : maxTotalDel ,
SlotPubKeys : slotPubKeys ,
SlotKeySigs : slotKeySigs ,
Amount : amount ,
}
return & v
}
// Test CV1: create validator
func TestCV1 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err != nil {
t . Error ( "expected" , nil , "got" , err )
}
}
// Test CV3: validator already exists
func TestCV3 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err != nil {
t . Error ( "expected" , nil , "got" , err )
}
statedb . SetValidatorFlag ( msg . ValidatorAddress )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; ! strings . Contains ( err . Error ( ) , errValidatorExist . Error ( ) ) {
t . Error ( "expected" , errValidatorExist , "got" , err )
}
}
// Test CV5: identity longer than 140 characters
func TestCV5 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// identity length: 200 characters
msg . Identity = "adsfwryuiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwiewwerfhuwefiuewfhuewhfiuewhfefhshfrhfhifhwbfvberhbvihfwuoefhusioehfeuwiafhaiobcfwfhceirui"
identitylengthCtxError := ctxerror . New ( "[EnsureLength] Exceed Maximum Length" , "have" , len ( msg . Identity ) , "maxIdentityLen" , staking . MaxIdentityLength )
_ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg )
if err == nil {
t . Errorf ( "expected non null error" )
}
ctxerr , ok := err . ( ctxerror . CtxError )
if ! ok {
t . Errorf ( "expected context aware error" )
}
if ctxerr . Message ( ) != identitylengthCtxError . Message ( ) {
t . Error ( "expected" , identitylengthCtxError , "got" , err )
}
}
// Test CV6: website longer than 140 characters
func TestCV6 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// Website length: 200 characters
msg . Website = "https://www.iwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwiewwerfhuwefiuewfwwwwwfiuewhfefhshfrheterhbvihfwuoefhusioehfeuwiafhaiobcfwfhceirui.com"
websiteLengthCtxError := ctxerror . New ( "[EnsureLength] Exceed Maximum Length" , "have" , len ( msg . Website ) , "maxWebsiteLen" , staking . MaxWebsiteLength )
_ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg )
if err == nil {
t . Errorf ( "expected non null error" )
}
ctxerr , ok := err . ( ctxerror . CtxError )
if ! ok {
t . Errorf ( "expected context aware error" )
}
if ctxerr . Message ( ) != websiteLengthCtxError . Message ( ) {
t . Error ( "expected" , websiteLengthCtxError , "got" , err )
}
}
// Test CV7: security contact longer than 140 characters
func TestCV7 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// Security Contact length: 200 characters
msg . SecurityContact = "HelloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwiewwerfhuwefiuewfwwwwwfiuewhfefhshfrheterhbvihfwuoefhusioehfeuwiafhaiobcfwfhceiruiHellodfdfdf"
securityContactLengthError := ctxerror . New ( "[EnsureLength] Exceed Maximum Length" , "have" , len ( msg . SecurityContact ) , "maxSecurityContactLen" , staking . MaxSecurityContactLength )
_ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg )
if err == nil {
t . Errorf ( "expected non null error" )
}
ctxerr , ok := err . ( ctxerror . CtxError )
if ! ok {
t . Errorf ( "expected context aware error" )
}
if ctxerr . Message ( ) != securityContactLengthError . Message ( ) {
t . Error ( "expected" , securityContactLengthError , "got" , err )
}
}
// Test CV8: details longer than 280 characters
func TestCV8 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// Details length: 300 characters
msg . Details = "HelloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwiewwerfhuwefiuewfwwwwwfiuewhfefhshfrheterhbvihfwuoefhusioehfeuwiafhaiobcfwfhceiruiHellodfdfdfjiusngognoherugbounviesrbgufhuoshcofwevusguahferhgvuervurehniwjvseivusehvsghjvorsugjvsiovjpsevsvvvvv"
detailsLenCtxError := ctxerror . New ( "[EnsureLength] Exceed Maximum Length" , "have" , len ( msg . Details ) , "maxDetailsLen" , staking . MaxDetailsLength )
_ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg )
if err == nil {
t . Errorf ( "Expected non null error" )
}
ctxerr , ok := err . ( ctxerror . CtxError )
if ! ok {
t . Errorf ( "expected context aware error" )
}
if ctxerr . Message ( ) != detailsLenCtxError . Message ( ) {
t . Error ( "expected" , detailsLenCtxError , "got" , err )
}
}
// Test CV9: name == 140 characters
func TestCV9 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
// name length: 140 characters
msg . Name = "Helloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwidsffevjnononwondqmeofniowfndjowe"
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err != nil {
t . Error ( "expected" , nil , "got" , err )
}
}
// Test CV10: identity == 140 characters
func TestCV10 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
// identity length: 140 characters
msg . Identity = "Helloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwidsffevjnononwondqmeofniowfndjowe"
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err != nil {
t . Error ( "expected" , nil , "got" , err )
}
}
// Test CV11: website == 140 characters
func TestCV11 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
// website length: 140 characters
msg . Website = "Helloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwidsffevjnononwondqmeofniowfndjowe"
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err != nil {
t . Error ( "expected" , nil , "got" , err )
}
}
// Test CV12: security == 140 characters
func TestCV12 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
// security contact length: 140 characters
msg . SecurityContact = "Helloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwidsffevjnononwondqmeofniowfndjowe"
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err != nil {
t . Error ( "expected" , nil , "got" , err )
}
}
// Test CV13: details == 280 characters
func TestCV13 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
// details length: 280 characters
msg . Details = "HelloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwidsffevjnononwondqmeofniowfndjoweHlloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuedbfcuyiewfhwieufwiweifhcwefhwefhwidsffevjnononwondqmeofniowfndjowe"
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err != nil {
t . Error ( "expected" , nil , "got" , err )
}
}
// Test CV14: commission rate <= max rate & max change rate <= max rate
func TestCV14 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// commission rate == max rate && max change rate == max rate
msg . CommissionRates . Rate , _ = numeric . NewDecFromStr ( "0.5" )
msg . CommissionRates . MaxChangeRate , _ = numeric . NewDecFromStr ( "0.5" )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err != nil {
t . Error ( "expected" , nil , "got" , err )
}
}
// Test CV15: commission rate > max rate
func TestCV15 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// commission rate: 0.6 > max rate: 0.5
msg . CommissionRates . Rate , _ = numeric . NewDecFromStr ( "0.6" )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err == nil {
t . Error ( "expected" , "commission rate and change rate can not be larger than max commission rate" , "got" , nil )
}
}
// Test CV16: max change rate > max rate
func TestCV16 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// max change rate: 0.6 > max rate: 0.5
msg . CommissionRates . MaxChangeRate , _ = numeric . NewDecFromStr ( "0.6" )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err == nil {
t . Error ( "expected" , "commission rate and change rate can not be larger than max commission rate" , "got" , nil )
}
}
// Test CV17: max rate == 1
func TestCV17 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// max rate == 1
msg . CommissionRates . MaxRate , _ = numeric . NewDecFromStr ( "1" )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err != nil {
t . Error ( "expected" , nil , "got" , err )
}
}
// Test CV18: max rate == 1 && max change rate == 1 && commission rate == 0
func TestCV18 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// max rate == 1 && max change rate == 1 && commission rate == 0
msg . CommissionRates . MaxRate , _ = numeric . NewDecFromStr ( "1" )
msg . CommissionRates . MaxChangeRate , _ = numeric . NewDecFromStr ( "1" )
msg . CommissionRates . Rate , _ = numeric . NewDecFromStr ( "1" )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err != nil {
t . Error ( "expected" , nil , "got" , err )
}
}
// Test CV19: commission rate == 0
func TestCV19 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// commission rate == 0
msg . CommissionRates . Rate , _ = numeric . NewDecFromStr ( "0" )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err != nil {
t . Error ( "expected" , nil , "got" , err )
}
}
// Test CV20: max change rate == 0
func TestCV20 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// commission rate == 0
msg . CommissionRates . MaxChangeRate , _ = numeric . NewDecFromStr ( "0" )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err != nil {
t . Error ( "expected" , nil , "got" , err )
}
}
// Test CV21: max change rate == 0 & max rate == 0 & commission rate == 0
func TestCV21 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// max change rate == 0 & max rate == 0 & commission rate == 0
msg . CommissionRates . MaxRate , _ = numeric . NewDecFromStr ( "0" )
msg . CommissionRates . MaxChangeRate , _ = numeric . NewDecFromStr ( "0" )
msg . CommissionRates . Rate , _ = numeric . NewDecFromStr ( "0" )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err != nil {
t . Error ( "expected" , nil , "got" , err )
}
}
// Test CV22: max change rate == 1 & max rate == 1
func TestCV22 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// max change rate == 1 & max rate == 1
msg . CommissionRates . MaxRate , _ = numeric . NewDecFromStr ( "1" )
msg . CommissionRates . MaxChangeRate , _ = numeric . NewDecFromStr ( "1" )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err != nil {
t . Error ( "expected" , nil , "got" , err )
}
}
// Test CV23: commission rate < 0
func TestCV23 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// commission rate < 0
msg . CommissionRates . Rate , _ = numeric . NewDecFromStr ( "-0.1" )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err == nil {
t . Error ( "expected" , "rate:-0.100000000000000000: commission rate, change rate and max rate should be within 0-100 percent" , "got" , nil )
}
}
// Test CV24: max rate < 0
func TestCV24 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// max rate < 0
msg . CommissionRates . MaxRate , _ = numeric . NewDecFromStr ( "-0.001" )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err == nil {
t . Error ( "expected" , "rate:-0.001000000000000000: commission rate, change rate and max rate should be within 0-100 percent" , "got" , nil )
}
}
// Test CV25: max change rate < 0
func TestCV25 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// max rate < 0
msg . CommissionRates . MaxChangeRate , _ = numeric . NewDecFromStr ( "-0.001" )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err == nil {
t . Error ( "expected" , "rate:-0.001000000000000000: commission rate, change rate and max rate should be within 0-100 percent" , "got" , nil )
}
}
// Test CV26: commission rate > 1
func TestCV26 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// commission rate > 1
msg . CommissionRates . Rate , _ = numeric . NewDecFromStr ( "1.01" )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err == nil {
t . Error ( "expected" , "rate:1.01000000000000000: commission rate, change rate and max rate should be within 0-100 percent" , "got" , nil )
}
}
// Test CV27: max rate > 1
func TestCV27 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// max rate > 1
msg . CommissionRates . MaxRate , _ = numeric . NewDecFromStr ( "1.01" )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err == nil {
t . Error ( "expected" , "rate:1.01000000000000000: commission rate, change rate and max rate should be within 0-100 percent" , "got" , nil )
}
}
// Test CV28: max change rate > 1
func TestCV28 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// max change rate > 1
msg . CommissionRates . MaxChangeRate , _ = numeric . NewDecFromStr ( "1.01" )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err == nil {
t . Error ( "expected" , "rate:1.01000000000000000: commission rate, change rate and max rate should be within 0-100 percent" , "got" , nil )
}
}
// Test CV29: amount > MinSelfDelegation
func TestCV29 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// amount > MinSelfDelegation
msg . Amount = big . NewInt ( 4e18 )
msg . MinSelfDelegation = big . NewInt ( 1e18 )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err != nil {
t . Error ( "expected" , nil , "got" , err )
}
}
// Test CV30: amount == MinSelfDelegation
func TestCV30 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// amount > MinSelfDelegation
msg . Amount = big . NewInt ( 4e18 )
msg . MinSelfDelegation = big . NewInt ( 4e18 )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err != nil {
t . Error ( "expected" , nil , "got" , err )
}
}
// Test CV31: amount < MinSelfDelegation
func TestCV31 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// amount > MinSelfDelegation
msg . Amount = big . NewInt ( 4e18 )
msg . MinSelfDelegation = big . NewInt ( 5e18 )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err == nil {
t . Error ( "expected" , "have 4000000000000000000 want 5000000000000000000: self delegation can not be less than min_self_delegation" , "got" , nil )
}
}
// Test CV32: MaxTotalDelegation < MinSelfDelegation
func TestCV32 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// MaxTotalDelegation < MinSelfDelegation
msg . MaxTotalDelegation = big . NewInt ( 2e18 )
msg . MinSelfDelegation = big . NewInt ( 3e18 )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err == nil {
t . Error ( "expected" , "max_total_delegation can not be less than min_self_delegation" , "got" , nil )
}
}
// Test CV33: MinSelfDelegation < 1 ONE
func TestCV33 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// MinSelfDelegation < 1 ONE
msg . MinSelfDelegation = big . NewInt ( 1e18 - 1 )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err == nil {
t . Error ( "expected" , "delegation-given 999999999999999999: min_self_delegation has to be greater than 1 ONE" , "got" , nil )
}
}
// Test CV34: MinSelfDelegation not specified
func TestCV34 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// MinSelfDelegation not specified
msg . MinSelfDelegation = nil
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err == nil {
t . Error ( "expected" , "MinSelfDelegation can not be nil" , "got" , nil )
}
}
// Test CV35: MinSelfDelegation < 0
func TestCV35 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// MinSelfDelegation < 0
msg . MinSelfDelegation = big . NewInt ( - 1 )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err == nil {
t . Error ( "expected" , "delegation-given -1: min_self_delegation has to be greater than 1 ONE" , "got" , nil )
}
}
// Test CV36: amount > MaxTotalDelegation
func TestCV36 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// amount > MaxTotalDelegation
msg . Amount = big . NewInt ( 4e18 )
msg . MaxTotalDelegation = big . NewInt ( 3e18 )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err == nil {
t . Error ( "expected" , "total delegation can not be bigger than max_total_delegation" , "got" , nil )
}
}
// Test CV39: MaxTotalDelegation < 0
func TestCV39 ( t * testing . T ) {
statedb , _ := state . New ( common . Hash { } , state . NewDatabase ( ethdb . NewMemDatabase ( ) ) )
msg := createValidator ( )
statedb . AddBalance ( msg . ValidatorAddress , big . NewInt ( 5e18 ) )
// MaxTotalDelegation < 0
msg . MaxTotalDelegation = big . NewInt ( - 1 )
if _ , err := VerifyAndCreateValidatorFromMsg ( statedb , big . NewInt ( 0 ) , big . NewInt ( 0 ) , msg ) ; err == nil {
t . Error ( "expected" , "max_total_delegation can not be less than min_self_delegation" , "got" , nil )
}
}