Unpack contract details from genesis (#802)

* Unpack contract details from genesis

* Address linter warnings
This commit is contained in:
Alexander Peters
2022-04-12 17:46:44 +02:00
committed by GitHub
parent 64d39c3c11
commit 68b4908b78
3 changed files with 78 additions and 1 deletions

View File

@@ -984,7 +984,7 @@ func moduleLogger(ctx sdk.Context) log.Logger {
} }
// Querier creates a new grpc querier instance // Querier creates a new grpc querier instance
func Querier(k *Keeper) *grpcQuerier { func Querier(k *Keeper) *grpcQuerier { //nolint:revive
return NewGrpcQuerier(k.cdc, k.storeKey, k, k.queryGasLimit) return NewGrpcQuerier(k.cdc, k.storeKey, k, k.queryGasLimit)
} }

View File

@@ -1,6 +1,7 @@
package types package types
import ( import (
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
sdk "github.com/cosmos/cosmos-sdk/types" sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
) )
@@ -98,3 +99,22 @@ func (m GenesisState_GenMsgs) ValidateBasic() error {
func ValidateGenesis(data GenesisState) error { func ValidateGenesis(data GenesisState) error {
return data.ValidateBasic() return data.ValidateBasic()
} }
var _ codectypes.UnpackInterfacesMessage = GenesisState{}
// UnpackInterfaces implements codectypes.UnpackInterfaces
func (s GenesisState) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error {
for _, v := range s.Contracts {
if err := v.UnpackInterfaces(unpacker); err != nil {
return err
}
}
return nil
}
var _ codectypes.UnpackInterfacesMessage = &Contract{}
// UnpackInterfaces implements codectypes.UnpackInterfaces
func (c *Contract) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error {
return c.ContractInfo.UnpackInterfaces(unpacker)
}

View File

@@ -3,6 +3,14 @@ package types
import ( import (
"bytes" "bytes"
"testing" "testing"
"time"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/codec/types"
sdk "github.com/cosmos/cosmos-sdk/types"
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
"github.com/stretchr/testify/assert"
"github.com/tendermint/tendermint/libs/rand"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
@@ -170,3 +178,52 @@ func TestContractValidateBasic(t *testing.T) {
}) })
} }
} }
func TestGenesisContractInfoMarshalUnmarshal(t *testing.T) {
var myAddr sdk.AccAddress = rand.Bytes(ContractAddrLen)
var myOtherAddr sdk.AccAddress = rand.Bytes(ContractAddrLen)
var anyPos = AbsoluteTxPosition{BlockHeight: 1, TxIndex: 2}
anyTime := time.Now().UTC()
// using gov proposal here as a random protobuf types as it contains an Any type inside for nested unpacking
myExtension, err := govtypes.NewProposal(&govtypes.TextProposal{Title: "bar"}, 1, anyTime, anyTime)
require.NoError(t, err)
myExtension.TotalDeposit = nil
src := NewContractInfo(1, myAddr, myOtherAddr, "bar", &anyPos)
err = src.SetExtension(&myExtension)
require.NoError(t, err)
interfaceRegistry := types.NewInterfaceRegistry()
marshaler := codec.NewProtoCodec(interfaceRegistry)
RegisterInterfaces(interfaceRegistry)
// register proposal as extension type
interfaceRegistry.RegisterImplementations(
(*ContractInfoExtension)(nil),
&govtypes.Proposal{},
)
// register gov types for nested Anys
govtypes.RegisterInterfaces(interfaceRegistry)
// when encode
gs := GenesisState{
Contracts: []Contract{{
ContractInfo: src,
}},
}
bz, err := marshaler.Marshal(&gs)
require.NoError(t, err)
// and decode
var destGs GenesisState
err = marshaler.Unmarshal(bz, &destGs)
require.NoError(t, err)
// then
require.Len(t, destGs.Contracts, 1)
dest := destGs.Contracts[0].ContractInfo
assert.Equal(t, src, dest)
// and sanity check nested any
var destExt govtypes.Proposal
require.NoError(t, dest.ReadExtension(&destExt))
assert.Equal(t, destExt.GetTitle(), "bar")
}