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

fix: version for address is not included when importing and exporting the genesis state #325

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ Contains bug fixes.
Contains all the PRs that improved the code without changing the behaviors.
-->

### Fixed
- added VersionForAddress field to GenesisState

# v1.0.5-Prerelease
### Added
- Arkeo testnet validator addresses to airdrop
Expand Down
6 changes: 6 additions & 0 deletions proto/arkeo/arkeo/genesis.proto
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ import "arkeo/arkeo/keeper.proto";

option go_package = "github.com/arkeonetwork/arkeo/x/arkeo/types";

message ValidatorVersion {
string validator_address = 1;
int64 version = 2;
}

// GenesisState defines the arkeo module's genesis state.
message GenesisState {
Params params = 1 [ (gogoproto.nullable) = false ];
Expand All @@ -19,5 +24,6 @@ message GenesisState {
repeated UserContractSet user_contract_sets = 6
[ (gogoproto.nullable) = false ];
int64 version = 7;
repeated ValidatorVersion validator_versions = 8 [(gogoproto.nullable) = false];
// this line is used by starport scaffolding # genesis/proto/state
}
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,12 @@
}
],
"user_contract_sets": [],
"validator_versions": [
{
"validator_address": "tarkeovaloper1hnyy4gp5tgarpg3xu6w5cw4zsyphx2lyfn54sh",
"version": "1"
}
],
"version": "1"
},
"auth": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,12 @@
}
],
"user_contract_sets": [],
"validator_versions": [
{
"validator_address": "tarkeovaloper1hnyy4gp5tgarpg3xu6w5cw4zsyphx2lyfn54sh",
"version": "1"
}
],
"version": "1"
},
"auth": {
Expand Down
6 changes: 6 additions & 0 deletions test/regression/mnt/exports/suites_core_send.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@
},
"providers": [],
"user_contract_sets": [],
"validator_versions": [
{
"validator_address": "tarkeovaloper1hnyy4gp5tgarpg3xu6w5cw4zsyphx2lyfn54sh",
"version": "1"
}
],
"version": "1"
},
"auth": {
Expand Down
6 changes: 6 additions & 0 deletions test/regression/mnt/exports/suites_initialize.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@
},
"providers": [],
"user_contract_sets": [],
"validator_versions": [
{
"validator_address": "tarkeovaloper1hnyy4gp5tgarpg3xu6w5cw4zsyphx2lyfn54sh",
"version": "1"
}
],
"version": "1"
},
"auth": {
Expand Down
6 changes: 6 additions & 0 deletions test/regression/mnt/exports/suites_providers_providers.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@
},
"providers": [],
"user_contract_sets": [],
"validator_versions": [
{
"validator_address": "tarkeovaloper1hnyy4gp5tgarpg3xu6w5cw4zsyphx2lyfn54sh",
"version": "1"
}
],
"version": "1"
},
"auth": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,12 @@
}
],
"user_contract_sets": [],
"validator_versions": [
{
"validator_address": "tarkeovaloper1hnyy4gp5tgarpg3xu6w5cw4zsyphx2lyfn54sh",
"version": "1"
}
],
"version": "1"
},
"auth": {
Expand Down
6 changes: 6 additions & 0 deletions test/regression/mnt/exports/suites_sentinel_contracts.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,12 @@
}
],
"user_contract_sets": [],
"validator_versions": [
{
"validator_address": "tarkeovaloper1hnyy4gp5tgarpg3xu6w5cw4zsyphx2lyfn54sh",
"version": "1"
}
],
"version": "1"
},
"auth": {
Expand Down
6 changes: 6 additions & 0 deletions test/regression/mnt/exports/suites_sentinel_providers.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,12 @@
}
],
"user_contract_sets": [],
"validator_versions": [
{
"validator_address": "tarkeovaloper1hnyy4gp5tgarpg3xu6w5cw4zsyphx2lyfn54sh",
"version": "1"
}
],
"version": "1"
},
"auth": {
Expand Down
6 changes: 6 additions & 0 deletions test/regression/mnt/exports/suites_sentinel_sentinel.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@
},
"providers": [],
"user_contract_sets": [],
"validator_versions": [
{
"validator_address": "tarkeovaloper1hnyy4gp5tgarpg3xu6w5cw4zsyphx2lyfn54sh",
"version": "1"
}
],
"version": "1"
},
"auth": {
Expand Down
1 change: 1 addition & 0 deletions testutil/keeper/arkeo.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ func ArkeoKeeper(t testing.TB) (cosmos.Context, keeper.Keeper) {

db := tmdb.NewMemDB()
stateStore := store.NewCommitMultiStore(db, logger, storemetrics.NewNoOpMetrics())
stateStore.MountStoreWithDB(keyStake, storetypes.StoreTypeIAVL, db)
stateStore.MountStoreWithDB(storeKey, storetypes.StoreTypeIAVL, db)
stateStore.MountStoreWithDB(memStoreKey, storetypes.StoreTypeMemory, nil)
require.NoError(t, stateStore.LoadLatestVersion())
Expand Down
33 changes: 33 additions & 0 deletions x/arkeo/genesis.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,17 @@ func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState)
ctx.Logger().Error("unable to set user contract set", "user", userContractSet.User, "error", err)
}
}

for _, vv := range genState.ValidatorVersions {
valAddr, err := sdk.ValAddressFromBech32(vv.ValidatorAddress)
if err != nil {
ctx.Logger().Error("invalid validator address in genesis",
"address", vv.ValidatorAddress,
"error", err)
continue
}
k.SetVersionForAddress(ctx, valAddr, vv.Version)
}
}

// ExportGenesis returns the module's exported genesis
Expand Down Expand Up @@ -92,5 +103,27 @@ func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState {
genesis.UserContractSets = append(genesis.UserContractSets, userContractSet)
}

// export validator versions
validators, err := k.GetActiveValidators(ctx)
if err != nil {
ctx.Logger().Error("failed to get active validators during genesis export", "error", err)
} else {
for _, val := range validators {
valAddr, err := sdk.ValAddressFromBech32(val.GetOperator())
if err != nil {
ctx.Logger().Error("failed to parse validator address",
"operator", val.GetOperator(),
"error", err)
continue
}
version := k.GetVersionForAddress(ctx, valAddr)

genesis.ValidatorVersions = append(genesis.ValidatorVersions, types.ValidatorVersion{
ValidatorAddress: val.GetOperator(),
Version: version,
})
}
}

return genesis
}
4 changes: 3 additions & 1 deletion x/arkeo/genesis_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,15 @@ import (
)

func TestGenesis(t *testing.T) {

ctx, k := keepertest.ArkeoKeeper(t)

genesisState := types.GenesisState{
Params: types.DefaultParams(),

// this line is used by starport scaffolding # genesis/test/state
}

ctx, k := keepertest.ArkeoKeeper(t)
arkeo.InitGenesis(ctx, k, genesisState)
got := arkeo.ExportGenesis(ctx, k)
require.NotNil(t, got)
Expand Down
64 changes: 59 additions & 5 deletions x/arkeo/types/genesis.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
package types

import (
fmt "fmt"

sdk "github.com/cosmos/cosmos-sdk/types"
)

// this line is used by starport scaffolding # genesis/types/import

// DefaultIndex is the default global index
Expand All @@ -9,10 +15,14 @@ const DefaultIndex uint64 = 1
func DefaultGenesis() *GenesisState {
return &GenesisState{
// this line is used by starport scaffolding # genesis/types/default
Params: DefaultParams(),
Providers: make([]Provider, 0),
Contracts: make([]Contract, 0),
NextContractId: 0,
Params: DefaultParams(),
Providers: make([]Provider, 0),
Contracts: make([]Contract, 0),
NextContractId: 0,
ContractExpirationSets: make([]ContractExpirationSet, 0),
UserContractSets: make([]UserContractSet, 0),
Version: 1,
ValidatorVersions: make([]ValidatorVersion, 0),
}
}

Expand All @@ -21,5 +31,49 @@ func DefaultGenesis() *GenesisState {
func (gs GenesisState) Validate() error {
// this line is used by starport scaffolding # genesis/types/validate

return gs.Params.Validate()
if err := gs.Params.Validate(); err != nil {
return fmt.Errorf("invalid params: %w", err)
}

seenProviders := make(map[string]bool)
for _, provider := range gs.Providers {
key := fmt.Sprintf("%s-%s", provider.PubKey, provider.Service)
if seenProviders[key] {
return fmt.Errorf("duplicate provider found: %s", key)
}
seenProviders[key] = true
}

seenContracts := make(map[uint64]bool)
for _, contract := range gs.Contracts {
if seenContracts[contract.Id] {
return fmt.Errorf("duplicate contract ID found: %d", contract.Id)
}
seenContracts[contract.Id] = true
}

seenValidators := make(map[string]bool)
for _, vv := range gs.ValidatorVersions {
if seenValidators[vv.ValidatorAddress] {
return fmt.Errorf("duplicate validator address in versions: %s", vv.ValidatorAddress)
}
seenValidators[vv.ValidatorAddress] = true

// Validate validator address format
if _, err := sdk.ValAddressFromBech32(vv.ValidatorAddress); err != nil {
return fmt.Errorf("invalid validator address %s: %w", vv.ValidatorAddress, err)
}

// Validate version number
if vv.Version <= 0 {
return fmt.Errorf("invalid version for validator %s: %d", vv.ValidatorAddress, vv.Version)
}
}

// Validate version
if gs.Version < 0 {
return fmt.Errorf("invalid version: %d", gs.Version)
}

return nil
}
Loading
Loading