diff --git a/app/app.go b/app/app.go index 59a069aa7..c02b58887 100644 --- a/app/app.go +++ b/app/app.go @@ -7,7 +7,9 @@ import ( "os" "path/filepath" - store "github.com/cosmos/cosmos-sdk/store/types" + "github.com/enigmampc/SecretNetwork/app/upgrades" + v1_3 "github.com/enigmampc/SecretNetwork/app/upgrades/v1.3" + v1_4 "github.com/enigmampc/SecretNetwork/app/upgrades/v1.4" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" @@ -37,7 +39,6 @@ import ( porttypes "github.com/cosmos/ibc-go/v3/modules/core/05-port/types" ibchost "github.com/cosmos/ibc-go/v3/modules/core/24-host" ibckeeper "github.com/cosmos/ibc-go/v3/modules/core/keeper" - v1_3 "github.com/enigmampc/SecretNetwork/app/upgrades/v1.3" icaauth "github.com/enigmampc/SecretNetwork/x/mauth" icaauthtypes "github.com/enigmampc/SecretNetwork/x/mauth/types" @@ -136,6 +137,8 @@ var ( allowedReceivingModAcc = map[string]bool{ distrtypes.ModuleName: true, } + + Upgrades = []upgrades.Upgrade{v1_3.Upgrade, v1_4.Upgrade} ) // Verify app interface at compile time @@ -566,31 +569,9 @@ func NewSecretNetworkApp( app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()) app.mm.RegisterServices(app.configurator) + // setupUpgradeHandlers() shoulbe be called after app.mm is configured app.setupUpgradeHandlers(&icaModule) - // add test gRPC service for testing gRPC queries in isolation - // testdata.RegisterTestServiceServer(app.GRPCQueryRouter(), testdata.QueryImpl{}) // TODO: this is testdata !!! - - // create the simulation manager and define the order of the modules for deterministic simulations - // - // NOTE: This is not required for apps that don't use the simulator for fuzz testing - // transactions. - // app.sm = module.NewSimulationManager( - // auth.NewAppModule(appCodec, app.accountKeeper, authsims.RandomGenesisAccounts), - // bank.NewAppModule(appCodec, app.bankKeeper, app.accountKeeper), - // capability.NewAppModule(appCodec, *app.capabilityKeeper), - // gov.NewAppModule(appCodec, app.govKeeper, app.accountKeeper, app.bankKeeper), - // mint.NewAppModule(appCodec, app.mintKeeper, app.accountKeeper), - // staking.NewAppModule(appCodec, app.stakingKeeper, app.accountKeeper, app.bankKeeper), - // distr.NewAppModule(appCodec, app.distrKeeper, app.accountKeeper, app.bankKeeper, app.stakingKeeper), - // slashing.NewAppModule(appCodec, app.slashingKeeper, app.accountKeeper, app.bankKeeper, app.stakingKeeper), - // params.NewAppModule(app.paramsKeeper), - // //compute.NewAppModule(app.computeKeeper), - // evidence.NewAppModule(app.evidenceKeeper), - //) - - // app.sm.RegisterStoreDecoders() - // initialize stores app.MountKVStores(keys) app.MountTransientStores(tKeys) @@ -751,11 +732,15 @@ func (app *SecretNetworkApp) BlockedAddrs() map[string]bool { } func (app *SecretNetworkApp) setupUpgradeHandlers(icamodule *ica.AppModule) { - // this configures a no-op upgrade handler for the v4 upgrade, - // which improves the lockup module's store management. - app.upgradeKeeper.SetUpgradeHandler( - v1_3.UpgradeName, v1_3.CreateUpgradeHandler( - app.mm, icamodule, app.configurator)) + for _, upgradeDetails := range Upgrades { + app.upgradeKeeper.SetUpgradeHandler( + upgradeDetails.UpgradeName, + upgradeDetails.CreateUpgradeHandler( + app.mm, + app.configurator, + ), + ) + } } func (app *SecretNetworkApp) setupUpgradeStoreLoaders() { @@ -764,14 +749,14 @@ func (app *SecretNetworkApp) setupUpgradeStoreLoaders() { panic(fmt.Sprintf("Failed to read upgrade info from disk %s", err)) } - if upgradeInfo.Name == v1_3.UpgradeName && !app.upgradeKeeper.IsSkipHeight(upgradeInfo.Height) { - // @Frey do we do this for Cosmwasm? - storeUpgrades := store.StoreUpgrades{ - Added: []string{icahosttypes.StoreKey}, - } + if app.upgradeKeeper.IsSkipHeight(upgradeInfo.Height) { + return + } - // configure store loader that checks if version == upgradeHeight and applies store upgrades - app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades)) + for _, upgradeDetails := range Upgrades { + if upgradeInfo.Name == upgradeDetails.UpgradeName { + app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &upgradeDetails.StoreUpgrades)) + } } } diff --git a/app/upgrades/types.go b/app/upgrades/types.go new file mode 100644 index 000000000..595f21932 --- /dev/null +++ b/app/upgrades/types.go @@ -0,0 +1,32 @@ +package upgrades + +import ( + store "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + abci "github.com/tendermint/tendermint/abci/types" +) + +// BaseAppParamManager defines an interrace that BaseApp is expected to fullfil +// that allows upgrade handlers to modify BaseApp parameters. +type BaseAppParamManager interface { + GetConsensusParams(ctx sdk.Context) *abci.ConsensusParams + StoreConsensusParams(ctx sdk.Context, cp *abci.ConsensusParams) +} + +// Upgrade defines a struct containing necessary fields that a SoftwareUpgradeProposal +// must have written, in order for the state migration to go smoothly. +// An upgrade must implement this struct, and then set it in the app.go. +// The app.go will then define the handler. +type Upgrade struct { + // Upgrade version name, for the upgrade handler, e.g. `v1.4` + UpgradeName string + + // CreateUpgradeHandler defines the function that creates an upgrade handler + // mm *module.Manager, computeModule *computetypes.AppModule, configurator module.Configurator + CreateUpgradeHandler func(*module.Manager, module.Configurator) upgradetypes.UpgradeHandler + + // Store upgrades, should be used for any new modules introduced, new modules deleted, or store names renamed. + StoreUpgrades store.StoreUpgrades +} diff --git a/app/upgrades/v1.3/upgrades.go b/app/upgrades/v1.3/upgrades.go index c6a2fb0a7..d17ea9d97 100644 --- a/app/upgrades/v1.3/upgrades.go +++ b/app/upgrades/v1.3/upgrades.go @@ -1,6 +1,7 @@ package v1_3 import ( + store "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" @@ -8,11 +9,18 @@ import ( icacontrollertypes "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/controller/types" icahosttypes "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/host/types" icatypes "github.com/cosmos/ibc-go/v3/modules/apps/27-interchain-accounts/types" + "github.com/enigmampc/SecretNetwork/app/upgrades" ) const UpgradeName = "v1.3" -func CreateUpgradeHandler(mm *module.Manager, icamodule *icamodule.AppModule, configurator module.Configurator, +var Upgrade = upgrades.Upgrade{ + UpgradeName: UpgradeName, + CreateUpgradeHandler: CreateUpgradeHandler, + StoreUpgrades: store.StoreUpgrades{Added: []string{icahosttypes.StoreKey}}, +} + +func CreateUpgradeHandler(mm *module.Manager, configurator module.Configurator, ) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { // Assaf: Set version map for all modules because for some @@ -24,7 +32,7 @@ func CreateUpgradeHandler(mm *module.Manager, icamodule *icamodule.AppModule, co vm[moduleName] = mm.Modules[moduleName].ConsensusVersion() } - vm[icatypes.ModuleName] = icamodule.ConsensusVersion() + vm[icatypes.ModuleName] = mm.Modules[icatypes.ModuleName].ConsensusVersion() // create ICS27 Controller submodule params controllerParams := icacontrollertypes.Params{ @@ -60,7 +68,15 @@ func CreateUpgradeHandler(mm *module.Manager, icamodule *icamodule.AppModule, co ctx.Logger().Info("Starting to init interchainaccount module...") // initialize ICS27 module - icamodule.InitModule(ctx, controllerParams, hostParams) + // icamodule.InitModule(ctx, controllerParams, hostParams) + + // initialize ICS27 module + icamoduleInstance, correctTypecast := mm.Modules[icatypes.ModuleName].(icamodule.AppModule) + if !correctTypecast { + panic("mm.Modules[icatypes.ModuleName] is not of type ica.AppModule") + } + + icamoduleInstance.InitModule(ctx, controllerParams, hostParams) ctx.Logger().Info("Starting to run module migrations...") diff --git a/app/upgrades/v1.4/upgrades.go b/app/upgrades/v1.4/upgrades.go new file mode 100644 index 000000000..27c23d59b --- /dev/null +++ b/app/upgrades/v1.4/upgrades.go @@ -0,0 +1,29 @@ +package v1_4 + +import ( + store "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + "github.com/enigmampc/SecretNetwork/app/upgrades" +) + +const UpgradeName = "v1.4" + +var Upgrade = upgrades.Upgrade{ + UpgradeName: UpgradeName, + CreateUpgradeHandler: CreateUpgradeHandler, + StoreUpgrades: store.StoreUpgrades{}, +} + +func CreateUpgradeHandler(mm *module.Manager, configurator module.Configurator, +) upgradetypes.UpgradeHandler { + return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { + // We're not upgrading cosmos-sdk, Tendermint or ibc-go, so no ConsensusVersion changes + // Therefore mm.RunMigrations() should not find any module to upgrade + + ctx.Logger().Info("Running module migrations for v1.4...") + + return mm.RunMigrations(ctx, configurator, vm) + } +} diff --git a/go-cosmwasm/types/queries.go b/go-cosmwasm/types/queries.go index 65d8f4e24..c124f3c7f 100644 --- a/go-cosmwasm/types/queries.go +++ b/go-cosmwasm/types/queries.go @@ -264,16 +264,6 @@ type ContractInfoQuery struct { ContractAddr string `json:"contract_addr"` } -type ContractInfoResponse struct { - CodeID uint64 `json:"code_id"` - Creator string `json:"creator"` - // Set to the admin who can migrate contract, if any - Admin string `json:"admin,omitempty"` - Pinned bool `json:"pinned"` - // Set if the contract is IBC enabled - IBCPort string `json:"ibc_port,omitempty"` -} - type DistQuery struct { Rewards *RewardsQuery `json:"rewards,omitempty"` } diff --git a/x/compute/alias.go b/x/compute/alias.go index db3836e71..93ae7362b 100644 --- a/x/compute/alias.go +++ b/x/compute/alias.go @@ -131,7 +131,4 @@ type ( QueryHandler = keeper.QueryHandler CustomQuerier = keeper.CustomQuerier QueryPlugins = keeper.QueryPlugins - // MsgMigrateContract = types.MsgMigrateContract - // MsgUpdateAdmin = types.MsgUpdateAdmin - // MsgClearAdmin = types.MsgClearAdmin ) diff --git a/x/compute/client/cli/gov_tx.go b/x/compute/client/cli/gov_tx.go deleted file mode 100644 index 808936a1d..000000000 --- a/x/compute/client/cli/gov_tx.go +++ /dev/null @@ -1,297 +0,0 @@ -package cli - -/* -import ( - "bufio" - - "github.com/enigmampc/SecretNetwork/x/compute/internal/types" - "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/auth/client/utils" - "github.com/cosmos/cosmos-sdk/x/gov/client/cli" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/pkg/errors" - "github.com/spf13/cobra" - "github.com/spf13/viper" -) - -func ProposalStoreCodeCmd(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "wasm-store [wasm file] --source [source] --builder [builder] --title [text] --description [text] --run-as [address]", - Short: "Submit a wasm binary proposal", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx := context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - - src, err := parseStoreCodeArgs(args, cliCtx) - if err != nil { - return err - } - if len(viper.GetString(flagRunAs)) == 0 { - return errors.New("run-as address is required") - } - runAsAddr, err := sdk.AccAddressFromBech32(viper.GetString(flagRunAs)) - if err != nil { - return errors.Wrap(err, "run-as") - } - content := types.StoreCodeProposal{ - WasmProposal: types.WasmProposal{ - Title: viper.GetString(cli.FlagTitle), - Description: viper.GetString(cli.FlagDescription), - }, - RunAs: runAsAddr, - WASMByteCode: src.WASMByteCode, - Source: src.Source, - Builder: src.Builder, - InstantiatePermission: src.InstantiatePermission, - } - - deposit, err := sdk.ParseCoins(viper.GetString(cli.FlagDeposit)) - if err != nil { - return err - } - - msg := govtypes.NewMsgSubmitProposal(content, deposit, cliCtx.GetFromAddress()) - if err = msg.ValidateBasic(); err != nil { - return err - } - - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - - cmd.Flags().String(flagSource, "", "A valid URI reference to the contract's source code, optional") - cmd.Flags().String(flagBuilder, "", "A valid docker tag for the build system, optional") - cmd.Flags().String(flagRunAs, "", "The address that is stored as code creator") - cmd.Flags().String(flagInstantiateByEverybody, "", "Everybody can instantiate a contract from the code, optional") - cmd.Flags().String(flagInstantiateByAddress, "", "Only this address can instantiate a contract instance from the code, optional") - - // proposal flags - cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") - cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") - cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") - cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") - // type values must match the "ProposalHandler" "routes" in cli - cmd.Flags().String(flagProposalType, "", "Type of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") - return cmd -} - -func ProposalInstantiateContractCmd(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "instantiate-contract [code_id_int64] [json_encoded_init_args] --label [text] --title [text] --description [text] --run-as [address] --admin [address,optional] --amount [coins,optional]", - Short: "Submit an instantiate wasm contract proposal", - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx := context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - - src, err := parseInstantiateArgs(args, cliCtx) - if err != nil { - return err - } - if len(viper.GetString(flagRunAs)) == 0 { - return errors.New("creator address is required") - } - creator, err := sdk.AccAddressFromBech32(viper.GetString(flagRunAs)) - if err != nil { - return errors.Wrap(err, "creator") - } - content := types.InstantiateContractProposal{ - WasmProposal: types.WasmProposal{ - Title: viper.GetString(cli.FlagTitle), - Description: viper.GetString(cli.FlagDescription), - }, - RunAs: creator, - Admin: src.Admin, - CodeID: src.CodeID, - Label: src.Label, - InitMsg: src.InitMsg, - InitFunds: src.InitFunds, - } - - deposit, err := sdk.ParseCoins(viper.GetString(cli.FlagDeposit)) - if err != nil { - return err - } - - msg := govtypes.NewMsgSubmitProposal(content, deposit, cliCtx.GetFromAddress()) - if err = msg.ValidateBasic(); err != nil { - return err - } - - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(flagAmount, "", "Coins to send to the contract during instantiation") - cmd.Flags().String(flagLabel, "", "A human-readable name for this contract in lists") - cmd.Flags().String(flagAdmin, "", "Address of an admin") - cmd.Flags().String(flagRunAs, "", "The address that pays the init funds. It is the creator of the contract and passed to the contract as sender on proposal execution") - - // proposal flags - cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") - cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") - cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") - cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") - // type values must match the "ProposalHandler" "routes" in cli - cmd.Flags().String(flagProposalType, "", "Type of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") - return cmd -} - -func ProposalMigrateContractCmd(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "migrate-contract [contract_addr_bech32] [new_code_id_int64] [json_encoded_migration_args]", - Short: "Submit a migrate wasm contract to a new code version proposal", - Args: cobra.ExactArgs(3), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx := context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - - src, err := parseMigrateContractArgs(args, cliCtx) - if err != nil { - return err - } - - if len(viper.GetString(flagRunAs)) == 0 { - return errors.New("run-as address is required") - } - runAs, err := sdk.AccAddressFromBech32(viper.GetString(flagRunAs)) - if err != nil { - return errors.Wrap(err, "run-as") - } - - content := types.MigrateContractProposal{ - WasmProposal: types.WasmProposal{ - Title: viper.GetString(cli.FlagTitle), - Description: viper.GetString(cli.FlagDescription), - }, - Contract: src.Contract, - CodeID: src.CodeID, - MigrateMsg: src.MigrateMsg, - RunAs: runAs, - } - - deposit, err := sdk.ParseCoins(viper.GetString(cli.FlagDeposit)) - if err != nil { - return err - } - - msg := govtypes.NewMsgSubmitProposal(content, deposit, cliCtx.GetFromAddress()) - if err = msg.ValidateBasic(); err != nil { - return err - } - - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - cmd.Flags().String(flagRunAs, "", "The address that is passed as sender to the contract on proposal execution") - - // proposal flags - cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") - cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") - cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") - cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") - // type values must match the "ProposalHandler" "routes" in cli - cmd.Flags().String(flagProposalType, "", "Type of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") - return cmd -} - -func ProposalUpdateContractAdminCmd(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "set-contract-admin [contract_addr_bech32] [new_admin_addr_bech32]", - Short: "Submit a new admin for a contract proposal", - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx := context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - - src, err := parseUpdateContractAdminArgs(args, cliCtx) - if err != nil { - return err - } - - content := types.UpdateAdminProposal{ - WasmProposal: types.WasmProposal{ - Title: viper.GetString(cli.FlagTitle), - Description: viper.GetString(cli.FlagDescription), - }, - Contract: src.Contract, - NewAdmin: src.NewAdmin, - } - - deposit, err := sdk.ParseCoins(viper.GetString(cli.FlagDeposit)) - if err != nil { - return err - } - - msg := govtypes.NewMsgSubmitProposal(content, deposit, cliCtx.GetFromAddress()) - if err = msg.ValidateBasic(); err != nil { - return err - } - - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - // proposal flags - cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") - cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") - cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") - cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") - // type values must match the "ProposalHandler" "routes" in cli - cmd.Flags().String(flagProposalType, "", "Type of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") - return cmd -} - -func ProposalClearContractAdminCmd(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "clear-contract-admin [contract_addr_bech32]", - Short: "Submit a clear admin for a contract to prevent further migrations proposal", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx := context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - - contractAddr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return sdkerrors.Wrap(err, "contract") - } - - content := types.ClearAdminProposal{ - WasmProposal: types.WasmProposal{ - Title: viper.GetString(cli.FlagTitle), - Description: viper.GetString(cli.FlagDescription), - }, - Contract: contractAddr, - } - - deposit, err := sdk.ParseCoins(viper.GetString(cli.FlagDeposit)) - if err != nil { - return err - } - - msg := govtypes.NewMsgSubmitProposal(content, deposit, cliCtx.GetFromAddress()) - if err = msg.ValidateBasic(); err != nil { - return err - } - - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - // proposal flags - cmd.Flags().String(cli.FlagTitle, "", "Title of proposal") - cmd.Flags().String(cli.FlagDescription, "", "Description of proposal") - cmd.Flags().String(cli.FlagDeposit, "", "Deposit of proposal") - cmd.Flags().String(cli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") - // type values must match the "ProposalHandler" "routes" in cli - cmd.Flags().String(flagProposalType, "", "Type of proposal, types: store-code/instantiate/migrate/update-admin/clear-admin/text/parameter_change/software_upgrade") - return cmd -} -*/ diff --git a/x/compute/client/cli/new_tx.go b/x/compute/client/cli/new_tx.go deleted file mode 100644 index 0520b283e..000000000 --- a/x/compute/client/cli/new_tx.go +++ /dev/null @@ -1,138 +0,0 @@ -package cli - -/* -import ( - "bufio" - "strconv" - - "github.com/enigmampc/SecretNetwork/x/compute/internal/types" - "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/auth/client/utils" - "github.com/spf13/cobra" -) - -// MigrateContractCmd will migrate a contract to a new code version -// NO SUPPORT FOR THIS COMMAND YET -func MigrateContractCmd(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "migrate [contract_addr_bech32] [new_code_id_int64] [json_encoded_migration_args]", - Short: "Migrate a wasm contract to a new code version", - Args: cobra.ExactArgs(3), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx := context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - - msg, err := parseMigrateContractArgs(args, cliCtx) - if err != nil { - return err - } - if err := msg.ValidateBasic(); err != nil { - return nil - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - return cmd -} - -func parseMigrateContractArgs(args []string, cliCtx context.CLIContext) (types.MsgMigrateContract, error) { - contractAddr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return types.MsgMigrateContract{}, sdkerrors.Wrap(err, "contract") - } - - // get the id of the code to instantiate - codeID, err := strconv.ParseUint(args[1], 10, 64) - if err != nil { - return types.MsgMigrateContract{}, sdkerrors.Wrap(err, "code id") - } - - migrateMsg := args[2] - - msg := types.MsgMigrateContract{ - Sender: cliCtx.GetFromAddress(), - Contract: contractAddr, - CodeID: codeID, - MigrateMsg: []byte(migrateMsg), - } - return msg, nil -} - -// UpdateContractAdminCmd sets an new admin for a contract -// NO SUPPORT FOR THIS COMMAND YET -func UpdateContractAdminCmd(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "set-contract-admin [contract_addr_bech32] [new_admin_addr_bech32]", - Short: "Set new admin for a contract", - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx := context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - - msg, err := parseUpdateContractAdminArgs(args, cliCtx) - if err != nil { - return err - } - if err := msg.ValidateBasic(); err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - return cmd -} - -func parseUpdateContractAdminArgs(args []string, cliCtx context.CLIContext) (types.MsgUpdateAdmin, error) { - contractAddr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return types.MsgUpdateAdmin{}, sdkerrors.Wrap(err, "contract") - } - newAdmin, err := sdk.AccAddressFromBech32(args[1]) - if err != nil { - return types.MsgUpdateAdmin{}, sdkerrors.Wrap(err, "new admin") - } - - msg := types.MsgUpdateAdmin{ - Sender: cliCtx.GetFromAddress(), - Contract: contractAddr, - NewAdmin: newAdmin, - } - return msg, nil -} - -// ClearContractAdminCmd clears an admin for a contract -// NO SUPPORT FOR THIS COMMAND YET -func ClearContractAdminCmd(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "clear-contract-admin [contract_addr_bech32]", - Short: "Clears admin for a contract to prevent further migrations", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - inBuf := bufio.NewReader(cmd.InOrStdin()) - txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx := context.NewCLIContextWithInput(inBuf).WithCodec(cdc) - - contractAddr, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return sdkerrors.Wrap(err, "contract") - } - - msg := types.MsgClearAdmin{ - Sender: cliCtx.GetFromAddress(), - Contract: contractAddr, - } - if err := msg.ValidateBasic(); err != nil { - return err - } - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - return cmd -} -*/ diff --git a/x/compute/client/cli/tx.go b/x/compute/client/cli/tx.go index 935096789..8fe9b1f2a 100644 --- a/x/compute/client/cli/tx.go +++ b/x/compute/client/cli/tx.go @@ -147,7 +147,6 @@ func InstantiateContractCmd() *cobra.Command { "io-master-cert.der file, which you can get using the command `secretcli q register secret-network-params` ") cmd.Flags().String(flagAmount, "", "Coins to send to the contract during instantiation") cmd.Flags().String(flagLabel, "", "A human-readable name for this contract in lists") - // cmd.Flags().String(flagAdmin, "", "Address of an admin") flags.AddTxFlagsToCmd(cmd) return cmd } diff --git a/x/compute/client/proposal_handler.go b/x/compute/client/proposal_handler.go deleted file mode 100644 index 0e171d952..000000000 --- a/x/compute/client/proposal_handler.go +++ /dev/null @@ -1,18 +0,0 @@ -package client - -/* -import ( - "github.com/enigmampc/SecretNetwork/x/compute/client/cli" - "github.com/enigmampc/SecretNetwork/x/compute/client/rest" - govclient "github.com/cosmos/cosmos-sdk/x/gov/client" -) - -// ProposalHandlers define the wasm cli proposal types and rest handler. -var ProposalHandlers = []govclient.ProposalHandler{ - govclient.NewProposalHandler(cli.ProposalStoreCodeCmd, rest.StoreCodeProposalHandler), - govclient.NewProposalHandler(cli.ProposalInstantiateContractCmd, rest.InstantiateProposalHandler), - govclient.NewProposalHandler(cli.ProposalMigrateContractCmd, rest.MigrateProposalHandler), - govclient.NewProposalHandler(cli.ProposalUpdateContractAdminCmd, rest.UpdateContractAdminProposalHandler), - govclient.NewProposalHandler(cli.ProposalClearContractAdminCmd, rest.ClearContractAdminProposalHandler), -} -*/ diff --git a/x/compute/client/proposal_handler_test.go b/x/compute/client/proposal_handler_test.go deleted file mode 100644 index d219f1bda..000000000 --- a/x/compute/client/proposal_handler_test.go +++ /dev/null @@ -1,236 +0,0 @@ -package client - -/* -import ( - "bytes" - "encoding/json" - "fmt" - "net/http" - "net/http/httptest" - "testing" - - wasmtypes "github.com/enigmampc/SecretNetwork/x/compute/internal/types" - "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - authvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting" - "github.com/cosmos/cosmos-sdk/x/gov" - "github.com/gorilla/mux" - "github.com/stretchr/testify/require" -) - -func TestGovRestHandlers(t *testing.T) { - type dict map[string]interface{} - var ( - anyAddress = "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz" - aBaseReq = dict{ - "from": anyAddress, - "memo": "rest test", - "chain_id": "testing", - "account_number": "1", - "sequence": "1", - "fees": []dict{{"denom": "ustake", "amount": "1000000"}}, - } - ) - cdc := MakeCodec() - clientCtx := context.CLIContext{}.WithChainID("testing").WithCodec(cdc) - - // router setup as in gov/client/rest/tx.go - propSubRtr := mux.NewRouter().PathPrefix("/gov/proposals").Subrouter() - for _, ph := range ProposalHandlers { - r := ph.RESTHandler(clientCtx) - propSubRtr.HandleFunc(fmt.Sprintf("/%s", r.SubRoute), r.Handler).Methods("POST") - } - - specs := map[string]struct { - srcBody dict - srcPath string - expCode int - }{ - "store-code": { - srcPath: "/gov/proposals/wasm_store_code", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "store-code", - "run_as": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz", - "wasm_byte_code": []byte("valid wasm byte code"), - "source": "https://example.com/", - "builder": "my/builder:tag", - "instantiate_permission": dict{ - "permission": "OnlyAddress", - "address": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - }, - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusOK, - }, - "store-code without permission": { - srcPath: "/gov/proposals/wasm_store_code", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "store-code", - "run_as": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz", - "wasm_byte_code": []byte("valid wasm byte code"), - "source": "https://example.com/", - "builder": "my/builder:tag", - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusOK, - }, - "store-code invalid permission": { - srcPath: "/gov/proposals/wasm_store_code", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "store-code", - "run_as": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz", - "wasm_byte_code": []byte("valid wasm byte code"), - "source": "https://example.com/", - "builder": "my/builder:tag", - "instantiate_permission": dict{ - "permission": "Nobody", - "address": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - }, - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusBadRequest, - }, - "store-code with incomplete proposal data: blank title": { - srcPath: "/gov/proposals/wasm_store_code", - srcBody: dict{ - "title": "", - "description": "My proposal", - "type": "store-code", - "run_as": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz", - "wasm_byte_code": []byte("valid wasm byte code"), - "source": "https://example.com/", - "builder": "my/builder:tag", - "instantiate_permission": dict{ - "permission": "OnlyAddress", - "address": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - }, - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusBadRequest, - }, - "store-code with incomplete content data: no wasm_byte_code": { - srcPath: "/gov/proposals/wasm_store_code", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "store-code", - "run_as": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz", - "wasm_byte_code": "", - "source": "https://example.com/", - "builder": "my/builder:tag", - "instantiate_permission": dict{ - "permission": "OnlyAddress", - "address": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - }, - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusBadRequest, - }, - "instantiate contract": { - srcPath: "/gov/proposals/wasm_instantiate", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "instantiate", - "run_as": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz", - "admin": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz", - "code_id": "1", - "label": "https://example.com/", - "init_msg": "my/builder:tag", - "init_funds": []dict{{"denom": "ustake", "amount": "100"}}, - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusOK, - }, - "migrate contract": { - srcPath: "/gov/proposals/wasm_migrate", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "migrate", - "contract": "cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5", - "code_id": "1", - "msg": dict{"foo": "bar"}, - "run_as": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz", - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusOK, - }, - "update contract admin": { - srcPath: "/gov/proposals/wasm_update_admin", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "migrate", - "contract": "cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5", - "new_admin": "cosmos100dejzacpanrldpjjwksjm62shqhyss44jf5xz", - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusOK, - }, - "clear contract admin": { - srcPath: "/gov/proposals/wasm_clear_admin", - srcBody: dict{ - "title": "Test Proposal", - "description": "My proposal", - "type": "migrate", - "contract": "cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5", - "deposit": []dict{{"denom": "ustake", "amount": "10"}}, - "proposer": "cosmos1ve557a5g9yw2g2z57js3pdmcvd5my6g8ze20np", - "base_req": aBaseReq, - }, - expCode: http.StatusOK, - }, - } - for msg, spec := range specs { - t.Run(msg, func(t *testing.T) { - src, err := json.Marshal(spec.srcBody) - require.NoError(t, err) - - // when - r := httptest.NewRequest("POST", spec.srcPath, bytes.NewReader(src)) - w := httptest.NewRecorder() - propSubRtr.ServeHTTP(w, r) - - // then - require.Equal(t, spec.expCode, w.Code, w.Body.String()) - }) - } -} - -func MakeCodec() *codec.Codec { - var cdc = codec.New() - wasmtypes.RegisterCodec(cdc) - gov.RegisterCodec(cdc) - sdk.RegisterCodec(cdc) - codec.RegisterCrypto(cdc) - codec.RegisterEvidences(cdc) - authvesting.RegisterCodec(cdc) - - return cdc.Seal() - -} -*/ diff --git a/x/compute/client/rest/gov.go b/x/compute/client/rest/gov.go deleted file mode 100644 index 98c1f2b85..000000000 --- a/x/compute/client/rest/gov.go +++ /dev/null @@ -1,272 +0,0 @@ -package rest - -/* -import ( - "encoding/json" - "net/http" - - "github.com/enigmampc/SecretNetwork/x/compute/internal/types" - "github.com/cosmos/cosmos-sdk/client/context" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/rest" - "github.com/cosmos/cosmos-sdk/x/auth/client/utils" - "github.com/cosmos/cosmos-sdk/x/gov" - govrest "github.com/cosmos/cosmos-sdk/x/gov/client/rest" -) - -type StoreCodeProposalJsonReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - - Title string `json:"title" yaml:"title"` - Description string `json:"description" yaml:"description"` - Proposer sdk.AccAddress `json:"proposer" yaml:"proposer"` - Deposit sdk.Coins `json:"deposit" yaml:"deposit"` - - RunAs sdk.AccAddress `json:"run_as" yaml:"run_as"` - // WASMByteCode can be raw or gzip compressed - WASMByteCode []byte `json:"wasm_byte_code" yaml:"wasm_byte_code"` - // Source is a valid absolute HTTPS URI to the contract's source code, optional - Source string `json:"source" yaml:"source"` - // Builder is a valid docker image name with tag, optional - Builder string `json:"builder" yaml:"builder"` - // InstantiatePermission to apply on contract creation, optional - InstantiatePermission *types.AccessConfig `json:"instantiate_permission" yaml:"instantiate_permission"` -} - -func (s StoreCodeProposalJsonReq) Content() gov.Content { - return types.StoreCodeProposal{ - WasmProposal: types.WasmProposal{ - Title: s.Title, - Description: s.Description, - }, - RunAs: s.RunAs, - WASMByteCode: s.WASMByteCode, - Source: s.Source, - Builder: s.Builder, - InstantiatePermission: s.InstantiatePermission, - } -} -func (s StoreCodeProposalJsonReq) GetProposer() sdk.AccAddress { - return s.Proposer -} -func (s StoreCodeProposalJsonReq) GetDeposit() sdk.Coins { - return s.Deposit -} -func (s StoreCodeProposalJsonReq) GetBaseReq() rest.BaseReq { - return s.BaseReq -} - -func StoreCodeProposalHandler(cliCtx context.CLIContext) govrest.ProposalRESTHandler { - return govrest.ProposalRESTHandler{ - SubRoute: "wasm_store_code", - Handler: func(w http.ResponseWriter, r *http.Request) { - var req StoreCodeProposalJsonReq - if !rest.ReadRESTReq(w, r, cliCtx.Codec, &req) { - return - } - toStdTxResponse(cliCtx, w, req) - }, - } -} - -type InstantiateProposalJsonReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - - Title string `json:"title" yaml:"title"` - Description string `json:"description" yaml:"description"` - - Proposer sdk.AccAddress `json:"proposer" yaml:"proposer"` - Deposit sdk.Coins `json:"deposit" yaml:"deposit"` - - RunAs sdk.AccAddress `json:"run_as" yaml:"run_as"` - // Admin is an optional address that can execute migrations - Admin sdk.AccAddress `json:"admin,omitempty" yaml:"admin"` - Code uint64 `json:"code_id" yaml:"code_id"` - Label string `json:"label" yaml:"label"` - InitMsg json.RawMessage `json:"init_msg" yaml:"init_msg"` - InitFunds sdk.Coins `json:"init_funds" yaml:"init_funds"` -} - -func (s InstantiateProposalJsonReq) Content() gov.Content { - return types.InstantiateContractProposal{ - WasmProposal: types.WasmProposal{Title: s.Title, Description: s.Description}, - RunAs: s.RunAs, - Admin: s.Admin, - CodeID: s.Code, - Label: s.Label, - InitMsg: s.InitMsg, - InitFunds: s.InitFunds, - } -} -func (s InstantiateProposalJsonReq) GetProposer() sdk.AccAddress { - return s.Proposer -} -func (s InstantiateProposalJsonReq) GetDeposit() sdk.Coins { - return s.Deposit -} -func (s InstantiateProposalJsonReq) GetBaseReq() rest.BaseReq { - return s.BaseReq -} - -func InstantiateProposalHandler(cliCtx context.CLIContext) govrest.ProposalRESTHandler { - return govrest.ProposalRESTHandler{ - SubRoute: "wasm_instantiate", - Handler: func(w http.ResponseWriter, r *http.Request) { - var req InstantiateProposalJsonReq - if !rest.ReadRESTReq(w, r, cliCtx.Codec, &req) { - return - } - toStdTxResponse(cliCtx, w, req) - }, - } -} - -type MigrateProposalJsonReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - - Title string `json:"title" yaml:"title"` - Description string `json:"description" yaml:"description"` - - Proposer sdk.AccAddress `json:"proposer" yaml:"proposer"` - Deposit sdk.Coins `json:"deposit" yaml:"deposit"` - - Contract sdk.AccAddress `json:"contract" yaml:"contract"` - Code uint64 `json:"code_id" yaml:"code_id"` - MigrateMsg json.RawMessage `json:"msg" yaml:"msg"` - // RunAs is the role that is passed to the contract's environment - RunAs sdk.AccAddress `json:"run_as" yaml:"run_as"` -} - -func (s MigrateProposalJsonReq) Content() gov.Content { - return types.MigrateContractProposal{ - WasmProposal: types.WasmProposal{Title: s.Title, Description: s.Description}, - Contract: s.Contract, - CodeID: s.Code, - MigrateMsg: s.MigrateMsg, - RunAs: s.RunAs, - } -} -func (s MigrateProposalJsonReq) GetProposer() sdk.AccAddress { - return s.Proposer -} -func (s MigrateProposalJsonReq) GetDeposit() sdk.Coins { - return s.Deposit -} -func (s MigrateProposalJsonReq) GetBaseReq() rest.BaseReq { - return s.BaseReq -} -func MigrateProposalHandler(cliCtx context.CLIContext) govrest.ProposalRESTHandler { - return govrest.ProposalRESTHandler{ - SubRoute: "wasm_migrate", - Handler: func(w http.ResponseWriter, r *http.Request) { - var req MigrateProposalJsonReq - if !rest.ReadRESTReq(w, r, cliCtx.Codec, &req) { - return - } - toStdTxResponse(cliCtx, w, req) - }, - } -} - -type UpdateAdminJsonReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - - Title string `json:"title" yaml:"title"` - Description string `json:"description" yaml:"description"` - - Proposer sdk.AccAddress `json:"proposer" yaml:"proposer"` - Deposit sdk.Coins `json:"deposit" yaml:"deposit"` - - NewAdmin sdk.AccAddress `json:"new_admin" yaml:"new_admin"` - Contract sdk.AccAddress `json:"contract" yaml:"contract"` -} - -func (s UpdateAdminJsonReq) Content() gov.Content { - return types.UpdateAdminProposal{ - WasmProposal: types.WasmProposal{Title: s.Title, Description: s.Description}, - Contract: s.Contract, - NewAdmin: s.NewAdmin, - } -} -func (s UpdateAdminJsonReq) GetProposer() sdk.AccAddress { - return s.Proposer -} -func (s UpdateAdminJsonReq) GetDeposit() sdk.Coins { - return s.Deposit -} -func (s UpdateAdminJsonReq) GetBaseReq() rest.BaseReq { - return s.BaseReq -} -func UpdateContractAdminProposalHandler(cliCtx context.CLIContext) govrest.ProposalRESTHandler { - return govrest.ProposalRESTHandler{ - SubRoute: "wasm_update_admin", - Handler: func(w http.ResponseWriter, r *http.Request) { - var req UpdateAdminJsonReq - if !rest.ReadRESTReq(w, r, cliCtx.Codec, &req) { - return - } - toStdTxResponse(cliCtx, w, req) - }, - } -} - -type ClearAdminJsonReq struct { - BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` - - Title string `json:"title" yaml:"title"` - Description string `json:"description" yaml:"description"` - - Proposer sdk.AccAddress `json:"proposer" yaml:"proposer"` - Deposit sdk.Coins `json:"deposit" yaml:"deposit"` - - Contract sdk.AccAddress `json:"contract" yaml:"contract"` -} - -func (s ClearAdminJsonReq) Content() gov.Content { - return types.ClearAdminProposal{ - WasmProposal: types.WasmProposal{Title: s.Title, Description: s.Description}, - Contract: s.Contract, - } -} -func (s ClearAdminJsonReq) GetProposer() sdk.AccAddress { - return s.Proposer -} -func (s ClearAdminJsonReq) GetDeposit() sdk.Coins { - return s.Deposit -} -func (s ClearAdminJsonReq) GetBaseReq() rest.BaseReq { - return s.BaseReq -} -func ClearContractAdminProposalHandler(cliCtx context.CLIContext) govrest.ProposalRESTHandler { - return govrest.ProposalRESTHandler{ - SubRoute: "wasm_clear_admin", - Handler: func(w http.ResponseWriter, r *http.Request) { - var req ClearAdminJsonReq - if !rest.ReadRESTReq(w, r, cliCtx.Codec, &req) { - return - } - toStdTxResponse(cliCtx, w, req) - }, - } -} - -type wasmProposalData interface { - Content() gov.Content - GetProposer() sdk.AccAddress - GetDeposit() sdk.Coins - GetBaseReq() rest.BaseReq -} - -func toStdTxResponse(cliCtx context.CLIContext, w http.ResponseWriter, data wasmProposalData) { - msg := gov.NewMsgSubmitProposal(data.Content(), data.GetDeposit(), data.GetProposer()) - if err := msg.ValidateBasic(); err != nil { - rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) - return - } - baseReq := data.GetBaseReq().Sanitize() - if !baseReq.ValidateBasic(w) { - return - } - utils.WriteGenerateStdTxResponse(w, cliCtx, baseReq, []sdk.Msg{msg}) -} -*/ diff --git a/x/compute/client/rest/query.go b/x/compute/client/rest/query.go index 8c582fea8..1dfaeca34 100644 --- a/x/compute/client/rest/query.go +++ b/x/compute/client/rest/query.go @@ -305,31 +305,6 @@ func queryContractHashHandlerFn(cliCtx client.Context) http.HandlerFunc { } } -/* -func queryContractHistoryFn(cliCtx context.CLIContext) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - addr, err := sdk.AccAddressFromBech32(mux.Vars(r)["contractAddr"]) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } - cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) - if !ok { - return - } - - route := fmt.Sprintf("custom/%s/%s/%s", types.QuerierRoute, keeper.QueryContractHistory, addr.String()) - res, height, err := cliCtx.Query(route) - if err != nil { - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) - return - } - cliCtx = cliCtx.WithHeight(height) - rest.PostProcessResponse(w, cliCtx, json.RawMessage(res)) - } -} -*/ - type argumentDecoder struct { // dec is the default decoder dec func(string) ([]byte, error) diff --git a/x/compute/client/rest/tx.go b/x/compute/client/rest/tx.go index d630e09c9..518948ee6 100644 --- a/x/compute/client/rest/tx.go +++ b/x/compute/client/rest/tx.go @@ -32,8 +32,7 @@ type storeCodeReq struct { type instantiateContractReq struct { BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"` Deposit sdk.Coins `json:"deposit" yaml:"deposit"` - // Admin sdk.AccAddress `json:"admin,omitempty" yaml:"admin"` - InitMsg []byte `json:"init_msg" yaml:"init_msg"` + InitMsg []byte `json:"init_msg" yaml:"init_msg"` } type executeContractReq struct { @@ -120,7 +119,6 @@ func instantiateContractHandlerFn(cliCtx client.Context) http.HandlerFunc { CallbackCodeHash: "", InitFunds: req.Deposit, InitMsg: req.InitMsg, - // Admin: req.Admin, } err = msg.ValidateBasic() diff --git a/x/compute/handler.go b/x/compute/handler.go index 1521b8ef1..3009828e6 100644 --- a/x/compute/handler.go +++ b/x/compute/handler.go @@ -135,54 +135,3 @@ func handleExecute(ctx sdk.Context, k Keeper, msg *MsgExecuteContract) (*sdk.Res return res, nil } - -/* -func handleMigration(ctx sdk.Context, k Keeper, msg *MsgMigrateContract) (*sdk.Result, error) { - res, err := k.Migrate(ctx, msg.Contract, msg.Sender, msg.CodeID, msg.MigrateMsg) // for MsgMigrateContract, there is only one signer which is msg.Sender (https://github.com/enigmampc/SecretNetwork/blob/d7813792fa07b93a10f0885eaa4c5e0a0a698854/x/compute/internal/types/msg.go#L228-L230) - if err != nil { - return nil, err - } - - events := filteredMessageEvents(ctx.EventManager()) - ourEvent := sdk.NewEvent( - sdk.EventTypeMessage, - sdk.NewAttribute(sdk.AttributeKeyModule, ModuleName), - sdk.NewAttribute(types.AttributeKeySigner, msg.Sender.String()), - sdk.NewAttribute(types.AttributeKeyContract, msg.Contract.String()), - ) - res.Events = append(events, ourEvent) - return res, nil -} - -func handleUpdateContractAdmin(ctx sdk.Context, k Keeper, msg *MsgUpdateAdmin) (*sdk.Result, error) { - if err := k.UpdateContractAdmin(ctx, msg.Contract, msg.Sender, msg.NewAdmin); err != nil { - return nil, err - } - events := ctx.EventManager().Events() - ourEvent := sdk.NewEvent( - sdk.EventTypeMessage, - sdk.NewAttribute(sdk.AttributeKeyModule, ModuleName), - sdk.NewAttribute(types.AttributeKeySigner, msg.Sender.String()), - sdk.NewAttribute(types.AttributeKeyContract, msg.Contract.String()), - ) - return &sdk.Result{ - Events: append(events, ourEvent), - }, nil -} - -func handleClearContractAdmin(ctx sdk.Context, k Keeper, msg *MsgClearAdmin) (*sdk.Result, error) { - if err := k.ClearContractAdmin(ctx, msg.Contract, msg.Sender); err != nil { - return nil, err - } - events := ctx.EventManager().Events() - ourEvent := sdk.NewEvent( - sdk.EventTypeMessage, - sdk.NewAttribute(sdk.AttributeKeyModule, ModuleName), - sdk.NewAttribute(types.AttributeKeySigner, msg.Sender.String()), - sdk.NewAttribute(types.AttributeKeyContract, msg.Contract.String()), - ) - return &sdk.Result{ - Events: append(events, ourEvent), - }, nil -} -*/ diff --git a/x/compute/internal/keeper/keeper_test.go b/x/compute/internal/keeper/keeper_test.go index ac3977fd7..46ed374c0 100644 --- a/x/compute/internal/keeper/keeper_test.go +++ b/x/compute/internal/keeper/keeper_test.go @@ -261,8 +261,7 @@ func TestInstantiate(t *testing.T) { require.NoError(t, err) instantiateMsg := types.MsgInstantiateContract{ - Sender: creator, - // Admin: nil, + Sender: creator, CodeID: contractID, Label: "demo contract 1", InitMsg: initMsgBz, @@ -294,16 +293,6 @@ func TestInstantiate(t *testing.T) { // test that creating again with the same label will fail _, _, err = keeper.Instantiate(ctx, contractID, creator /* , nil */, initMsgBz, "demo contract 1", nil, nil) require.Error(t, err) - - /* - exp := []types.ContractCodeHistoryEntry{{ - Operation: types.InitContractCodeHistoryType, - CodeID: contractID, - Updated: types.NewAbsoluteTxPosition(ctx), - Msg: json.RawMessage(initMsgBz), - }} - assert.Equal(t, exp, keeper.GetContractHistory(ctx, contractAddr)) - */ } func TestInstantiateWithDeposit(t *testing.T) { @@ -388,8 +377,7 @@ func TestInstantiateWithNonExistingCodeID(t *testing.T) { require.NoError(t, err) instantiateMsg := types.MsgInstantiateContract{ - Sender: creator, - // Admin: nil, + Sender: creator, CodeID: nonExistingCodeID, Label: "demo contract 1", InitMsg: initMsgBz, @@ -738,8 +726,7 @@ func TestExecuteWithCpuLoop(t *testing.T) { require.NoError(t, err) instantiateMsg := types.MsgInstantiateContract{ - Sender: creator, - // Admin: nil, + Sender: creator, CodeID: contractID, Label: "demo contract 1", InitMsg: msgBz, @@ -882,245 +869,6 @@ func TestExecuteWithStorageLoop(t *testing.T) { require.True(t, false, "We must panic before this line") } -/* -func TestMigrate(t *testing.T) { - t.SkipNow() // secret network does not support migrate - tempDir, err := os.MkdirTemp("", "wasm") - require.NoError(t, err) - defer os.RemoveAll(tempDir) - ctx, keepers := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil) - accKeeper, keeper := keepers.AccountKeeper, keepers.WasmKeeper - - deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator, _ := CreateFakeFundedAccount(ctx, accKeeper, deposit.Add(deposit...)) - fred, _ := CreateFakeFundedAccount(ctx, accKeeper, sdk.NewCoins(sdk.NewInt64Coin("denom", 5000))) - - wasmCode, err := os.ReadFile("./testdata/contract.wasm") - require.NoError(t, err) - - originalCodeID, err := keeper.Create(ctx, creator, wasmCode, "", "") - require.NoError(t, err) - newCodeID, err := keeper.Create(ctx, creator, wasmCode, "", "") - require.NoError(t, err) - require.NotEqual(t, originalCodeID, newCodeID) - - _, _, anyAddr := keyPubAddr() - _, _, newVerifierAddr := keyPubAddr() - initMsg := InitMsg{ - Verifier: fred, - Beneficiary: anyAddr, - } - initMsgBz, err := json.Marshal(initMsg) - require.NoError(t, err) - initMsgBz, err = wasmCtx.Encrypt(initMsgBz) - require.NoError(t, err) - - migMsg := struct { - Verifier sdk.AccAddress `json:"verifier"` - }{Verifier: newVerifierAddr} - migMsgBz, err := json.Marshal(migMsg) - require.NoError(t, err) - - specs := map[string]struct { - admin sdk.AccAddress - overrideContractAddr sdk.AccAddress - caller sdk.AccAddress - codeID uint64 - migrateMsg []byte - expErr *sdkerrors.Error - expVerifier sdk.AccAddress - }{ - "all good with same code id": { - admin: creator, - caller: creator, - codeID: originalCodeID, - migrateMsg: migMsgBz, - expVerifier: newVerifierAddr, - }, - "all good with different code id": { - admin: creator, - caller: creator, - codeID: newCodeID, - migrateMsg: migMsgBz, - expVerifier: newVerifierAddr, - }, - "all good with admin set": { - admin: fred, - caller: fred, - codeID: newCodeID, - migrateMsg: migMsgBz, - expVerifier: newVerifierAddr, - }, - "prevent migration when admin was not set on instantiate": { - caller: creator, - codeID: originalCodeID, - expErr: sdkerrors.ErrUnauthorized, - }, - "prevent migration when not sent by admin": { - caller: creator, - admin: fred, - codeID: originalCodeID, - expErr: sdkerrors.ErrUnauthorized, - }, - "fail with non existing code id": { - admin: creator, - caller: creator, - codeID: 99999, - expErr: sdkerrors.ErrInvalidRequest, - }, - "fail with non existing contract addr": { - admin: creator, - caller: creator, - overrideContractAddr: anyAddr, - codeID: originalCodeID, - expErr: sdkerrors.ErrInvalidRequest, - }, - "fail in contract with invalid migrate msg": { - admin: creator, - caller: creator, - codeID: originalCodeID, - migrateMsg: bytes.Repeat([]byte{0x1}, 7), - expErr: types.ErrMigrationFailed, - }, - "fail in contract without migrate msg": { - admin: creator, - caller: creator, - codeID: originalCodeID, - expErr: types.ErrMigrationFailed, - }, - } - - for msg, spec := range specs { - t.Run(msg, func(t *testing.T) { - ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) - contractAddr, err := keeper.Instantiate(ctx, originalCodeID, creator, spec.admin, initMsgBz, "demo contract", nil, nil) - require.NoError(t, err) - if spec.overrideContractAddr != nil { - contractAddr = spec.overrideContractAddr - } - _, err = keeper.Migrate(ctx, contractAddr, spec.caller, spec.codeID, spec.migrateMsg) - require.True(t, spec.expErr.Is(err), "expected %v but got %+v", spec.expErr, err) - if spec.expErr != nil { - return - } - cInfo := keeper.GetContractInfo(ctx, contractAddr) - assert.Equal(t, spec.codeID, cInfo.CodeID) - - expHistory := []types.ContractCodeHistoryEntry{{ - Operation: types.InitContractCodeHistoryType, - CodeID: originalCodeID, - Updated: types.NewAbsoluteTxPosition(ctx), - Msg: initMsgBz, - }, { - Operation: types.MigrateContractCodeHistoryType, - CodeID: spec.codeID, - Updated: types.NewAbsoluteTxPosition(ctx), - Msg: spec.migrateMsg, - }} - assert.Equal(t, expHistory, keeper.GetContractHistory(ctx, contractAddr)) - - m := keeper.QueryRaw(ctx, contractAddr, []byte("config")) - require.Len(t, m, 1) - var stored map[string][]byte - require.NoError(t, json.Unmarshal(m[0].Value, &stored)) - require.Contains(t, stored, "verifier") - require.NoError(t, err) - assert.Equal(t, spec.expVerifier, sdk.AccAddress(stored["verifier"])) - }) - } -} - -func TestMigrateWithDispatchedMessage(t *testing.T) { - t.SkipNow() // secret network does not support migrate - tempDir, err := os.MkdirTemp("", "wasm") - require.NoError(t, err) - defer os.RemoveAll(tempDir) - ctx, keepers := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil) - accKeeper, keeper := keepers.AccountKeeper, keepers.WasmKeeper - - deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - creator, _ := CreateFakeFundedAccount(ctx, accKeeper, deposit.Add(deposit...)) - fred, _ := CreateFakeFundedAccount(ctx, accKeeper, sdk.NewCoins(sdk.NewInt64Coin("denom", 5000))) - - wasmCode, err := os.ReadFile("./testdata/contract.wasm") - require.NoError(t, err) - burnerCode, err := os.ReadFile("./testdata/burner.wasm") - require.NoError(t, err) - - originalContractID, err := keeper.Create(ctx, creator, wasmCode, "", "") - require.NoError(t, err) - burnerContractID, err := keeper.Create(ctx, creator, burnerCode, "", "") - require.NoError(t, err) - require.NotEqual(t, originalContractID, burnerContractID) - - _, _, myPayoutAddr := keyPubAddr() - initMsg := InitMsg{ - Verifier: fred, - Beneficiary: fred, - } - initMsgBz, err := json.Marshal(initMsg) - require.NoError(t, err) - initMsgBz, err = wasmCtx.Encrypt(initMsgBz) - require.NoError(t, err) - - ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) - contractAddr, err := keeper.Instantiate(ctx, originalContractID, creator, fred, initMsgBz, "demo contract", deposit, nil) - require.NoError(t, err) - - migMsg := struct { - Payout sdk.AccAddress `json:"payout"` - }{Payout: myPayoutAddr} - migMsgBz, err := json.Marshal(migMsg) - require.NoError(t, err) - ctx = ctx.WithEventManager(sdk.NewEventManager()).WithBlockHeight(ctx.BlockHeight() + 1) - res, err := keeper.Migrate(ctx, contractAddr, fred, burnerContractID, migMsgBz) - require.NoError(t, err) - assert.Equal(t, "burnt 1 keys", string(res.Data)) - assert.Equal(t, "", res.Log) - type dict map[string]interface{} - expEvents := []dict{ - { - "Type": "wasm", - "Attr": []dict{ - {"contract_address": contractAddr}, - {"action": "burn"}, - {"payout": myPayoutAddr}, - }, - }, - { - "Type": "transfer", - "Attr": []dict{ - {"recipient": myPayoutAddr}, - {"sender": contractAddr}, - {"amount": "100000denom"}, - }, - }, - { - "Type": "message", - "Attr": []dict{ - {"sender": contractAddr}, - }, - }, - { - "Type": "message", - "Attr": []dict{ - {"module": "bank"}, - }, - }, - } - expJsonEvts := string(mustMarshal(t, expEvents)) - assert.JSONEq(t, expJsonEvts, prettyEvents(t, ctx.EventManager().Events())) - - // all persistent data cleared - m := keeper.QueryRaw(ctx, contractAddr, []byte("config")) - require.Len(t, m, 0) - - // and all deposit tokens sent to myPayoutAddr - balance := accKeeper.GetAccount(ctx, myPayoutAddr).GetCoins() - assert.Equal(t, deposit, balance) -} -*/ - func prettyEvents(t *testing.T, events sdk.Events) string { t.Helper() type prettyEvent struct { @@ -1146,154 +894,6 @@ func mustMarshal(t *testing.T, r interface{}) []byte { return bz } -/* -func TestUpdateContractAdmin(t *testing.T) { - t.SkipNow() // secret network does not support migrate - tempDir, err := os.MkdirTemp("", "wasm") - require.NoError(t, err) - defer os.RemoveAll(tempDir) - ctx, keepers := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil) - accKeeper, keeper := keepers.AccountKeeper, keepers.WasmKeeper - - deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) - creator, _ := CreateFakeFundedAccount(ctx, accKeeper, deposit.Add(deposit...)) - fred, _ := CreateFakeFundedAccount(ctx, accKeeper, topUp) - - wasmCode, err := os.ReadFile("./testdata/contract.wasm") - require.NoError(t, err) - - originalContractID, err := keeper.Create(ctx, creator, wasmCode, "", "") - require.NoError(t, err) - - _, _, anyAddr := keyPubAddr() - initMsg := InitMsg{ - Verifier: fred, - Beneficiary: anyAddr, - } - initMsgBz, err := json.Marshal(initMsg) - require.NoError(t, err) - initMsgBz, err = wasmCtx.Encrypt(initMsgBz) - require.NoError(t, err) - specs := map[string]struct { - instAdmin sdk.AccAddress - newAdmin sdk.AccAddress - overrideContractAddr sdk.AccAddress - caller sdk.AccAddress - expErr *sdkerrors.Error - }{ - "all good with admin set": { - instAdmin: fred, - newAdmin: anyAddr, - caller: fred, - }, - "prevent update when admin was not set on instantiate": { - caller: creator, - newAdmin: fred, - expErr: sdkerrors.ErrUnauthorized, - }, - "prevent updates from non admin address": { - instAdmin: creator, - newAdmin: fred, - caller: fred, - expErr: sdkerrors.ErrUnauthorized, - }, - "fail with non existing contract addr": { - instAdmin: creator, - newAdmin: anyAddr, - caller: creator, - overrideContractAddr: anyAddr, - expErr: sdkerrors.ErrInvalidRequest, - }, - } - for msg, spec := range specs { - t.Run(msg, func(t *testing.T) { - addr, err := keeper.Instantiate(ctx, originalContractID, creator, spec.instAdmin, initMsgBz, "demo contract", nil, nil) - require.NoError(t, err) - if spec.overrideContractAddr != nil { - addr = spec.overrideContractAddr - } - err = keeper.UpdateContractAdmin(ctx, addr, spec.caller, spec.newAdmin) - require.True(t, spec.expErr.Is(err), "expected %v but got %+v", spec.expErr, err) - if spec.expErr != nil { - return - } - cInfo := keeper.GetContractInfo(ctx, addr) - assert.Equal(t, spec.newAdmin, cInfo.Admin) - }) - } -} - -func TestClearContractAdmin(t *testing.T) { - tempDir, err := os.MkdirTemp("", "wasm") - require.NoError(t, err) - defer os.RemoveAll(tempDir) - ctx, keepers := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil) - accKeeper, keeper := keepers.AccountKeeper, keepers.WasmKeeper - - deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000)) - topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000)) - creator := CreateFakeFundedAccount(ctx, accKeeper, deposit.Add(deposit...)) - fred := CreateFakeFundedAccount(ctx, accKeeper, topUp) - - wasmCode, err := os.ReadFile("./testdata/contract.wasm") - require.NoError(t, err) - - originalContractID, err := keeper.Create(ctx, creator, wasmCode, "", "") - require.NoError(t, err) - - _, _, anyAddr := keyPubAddr() - initMsg := InitMsg{ - Verifier: fred, - Beneficiary: anyAddr, - } - initMsgBz, err := json.Marshal(initMsg) - require.NoError(t, err) - specs := map[string]struct { - instAdmin sdk.AccAddress - overrideContractAddr sdk.AccAddress - caller sdk.AccAddress - expErr *sdkerrors.Error - }{ - "all good when called by proper admin": { - instAdmin: fred, - caller: fred, - }, - "prevent update when admin was not set on instantiate": { - caller: creator, - expErr: sdkerrors.ErrUnauthorized, - }, - "prevent updates from non admin address": { - instAdmin: creator, - caller: fred, - expErr: sdkerrors.ErrUnauthorized, - }, - "fail with non existing contract addr": { - instAdmin: creator, - caller: creator, - overrideContractAddr: anyAddr, - expErr: sdkerrors.ErrInvalidRequest, - }, - } - for msg, spec := range specs { - t.Run(msg, func(t *testing.T) { - addr, err := keeper.Instantiate(ctx, originalContractID, creator, spec.instAdmin, initMsgBz, "demo contract", nil) - require.NoError(t, err) - if spec.overrideContractAddr != nil { - addr = spec.overrideContractAddr - } - err = keeper.ClearContractAdmin(ctx, addr, spec.caller) - require.True(t, spec.expErr.Is(err), "expected %v but got %+v", spec.expErr, err) - if spec.expErr != nil { - return - } - cInfo := keeper.GetContractInfo(ctx, addr) - assert.Empty(t, cInfo.Admin) - }) - } -} -*/ - type InitMsg struct { Verifier sdk.AccAddress `json:"verifier"` Beneficiary sdk.AccAddress `json:"beneficiary"` diff --git a/x/compute/internal/keeper/migrations.go b/x/compute/internal/keeper/migrations.go new file mode 100644 index 000000000..92902cbad --- /dev/null +++ b/x/compute/internal/keeper/migrations.go @@ -0,0 +1,11 @@ +package keeper + +// Migrator is a struct for handling in-place store migrations. +type Migrator struct { + keeper Keeper +} + +// NewMigrator returns a new Migrator. +func NewMigrator(keeper Keeper) Migrator { + return Migrator{keeper: keeper} +} diff --git a/x/compute/internal/keeper/querier_test.go b/x/compute/internal/keeper/querier_test.go index 04b5aa722..17a609b07 100644 --- a/x/compute/internal/keeper/querier_test.go +++ b/x/compute/internal/keeper/querier_test.go @@ -330,8 +330,7 @@ func TestListContractByCodeOrdering(t *testing.T) { require.NoError(t, err) instantiateMsg := types.MsgInstantiateContract{ - Sender: creator, - // Admin: nil, + Sender: creator, CodeID: codeID, Label: fmt.Sprintf("contract %d", i), InitMsg: initMsgBz, @@ -369,106 +368,3 @@ func TestListContractByCodeOrdering(t *testing.T) { assert.Nil(t, contract.Created) } } - -/* -func TestQueryContractHistory(t *testing.T) { - tempDir, err := os.MkdirTemp("", "wasm") - require.NoError(t, err) - defer os.RemoveAll(tempDir) - ctx, keepers := CreateTestInput(t, false, tempDir, SupportedFeatures, nil, nil) - keeper := keepers.WasmKeeper - - var ( - otherAddr sdk.AccAddress = bytes.Repeat([]byte{0x2}, sdk.AddrLen) - ) - - specs := map[string]struct { - srcQueryAddr sdk.AccAddress - srcHistory []types.ContractCodeHistoryEntry - expContent []types.ContractCodeHistoryEntry - }{ - "response with internal fields cleared": { - srcHistory: []types.ContractCodeHistoryEntry{{ - Operation: types.GenesisContractCodeHistoryType, - CodeID: 1, - Updated: types.NewAbsoluteTxPosition(ctx), - Msg: []byte(`"init message"`), - }}, - expContent: []types.ContractCodeHistoryEntry{{ - Operation: types.GenesisContractCodeHistoryType, - CodeID: 1, - Msg: []byte(`"init message"`), - }}, - }, - "response with multiple entries": { - srcHistory: []types.ContractCodeHistoryEntry{{ - Operation: types.InitContractCodeHistoryType, - CodeID: 1, - Updated: types.NewAbsoluteTxPosition(ctx), - Msg: []byte(`"init message"`), - }, { - Operation: types.MigrateContractCodeHistoryType, - CodeID: 2, - Updated: types.NewAbsoluteTxPosition(ctx), - Msg: []byte(`"migrate message 1"`), - }, { - Operation: types.MigrateContractCodeHistoryType, - CodeID: 3, - Updated: types.NewAbsoluteTxPosition(ctx), - Msg: []byte(`"migrate message 2"`), - }}, - expContent: []types.ContractCodeHistoryEntry{{ - Operation: types.InitContractCodeHistoryType, - CodeID: 1, - Msg: []byte(`"init message"`), - }, { - Operation: types.MigrateContractCodeHistoryType, - CodeID: 2, - Msg: []byte(`"migrate message 1"`), - }, { - Operation: types.MigrateContractCodeHistoryType, - CodeID: 3, - Msg: []byte(`"migrate message 2"`), - }}, - }, - "unknown contract address": { - srcQueryAddr: otherAddr, - srcHistory: []types.ContractCodeHistoryEntry{{ - Operation: types.GenesisContractCodeHistoryType, - CodeID: 1, - Updated: types.NewAbsoluteTxPosition(ctx), - Msg: []byte(`"init message"`), - }}, - expContent: nil, - }, - } - for msg, spec := range specs { - t.Run(msg, func(t *testing.T) { - _, _, myContractAddr := keyPubAddr() - keeper.appendToContractHistory(ctx, myContractAddr, spec.srcHistory...) - q := NewQuerier(keeper) - queryContractAddr := spec.srcQueryAddr - if queryContractAddr == nil { - queryContractAddr = myContractAddr - } - - // when - query := []string{QueryContractHistory, queryContractAddr.String()} - data := abci.RequestQuery{} - resData, err := q(ctx, query, data) - - // then - require.NoError(t, err) - if spec.expContent == nil { - require.Nil(t, resData) - return - } - var got []types.ContractCodeHistoryEntry - err = json.Unmarshal(resData, &got) - require.NoError(t, err) - - assert.Equal(t, spec.expContent, got) - }) - } -} -*/ diff --git a/x/compute/internal/keeper/test_common.go b/x/compute/internal/keeper/test_common.go index f75880a42..388873bc0 100644 --- a/x/compute/internal/keeper/test_common.go +++ b/x/compute/internal/keeper/test_common.go @@ -513,7 +513,7 @@ func TestHandler(k Keeper) sdk.Handler { } func handleInstantiate(ctx sdk.Context, k Keeper, msg *wasmtypes.MsgInstantiateContract) (*sdk.Result, error) { - contractAddr, data, err := k.Instantiate(ctx, msg.CodeID, msg.Sender /* msg.Admin, */, msg.InitMsg, msg.Label, msg.InitFunds, msg.CallbackSig) + contractAddr, data, err := k.Instantiate(ctx, msg.CodeID, msg.Sender, msg.InitMsg, msg.Label, msg.InitFunds, msg.CallbackSig) if err != nil { result := sdk.Result{} result.Data = data diff --git a/x/compute/internal/keeper/test_fuzz.go b/x/compute/internal/keeper/test_fuzz.go index c5d625beb..d64c52c81 100644 --- a/x/compute/internal/keeper/test_fuzz.go +++ b/x/compute/internal/keeper/test_fuzz.go @@ -7,7 +7,7 @@ import ( tmBytes "github.com/tendermint/tendermint/libs/bytes" ) -var ModelFuzzers = []interface{}{FuzzAddr, FuzzAbsoluteTxPosition, FuzzContractInfo, FuzzStateModel /*FuzzAccessType, FuzzAccessConfig FuzzContractCodeHistory */} +var ModelFuzzers = []interface{}{FuzzAddr, FuzzAbsoluteTxPosition, FuzzContractInfo, FuzzStateModel} func FuzzAddr(m *sdk.AccAddress, c fuzz.Continue) { *m = make([]byte, 20) @@ -22,46 +22,11 @@ func FuzzAbsoluteTxPosition(m *types.AbsoluteTxPosition, c fuzz.Continue) { func FuzzContractInfo(m *types.ContractInfo, c fuzz.Continue) { m.CodeID = c.RandUint64() FuzzAddr(&m.Creator, c) - // FuzzAddr(&m.Admin, c) m.Label = c.RandString() c.Fuzz(&m.Created) } -/* -func FuzzContractCodeHistory(m *types.ContractCodeHistoryEntry, c fuzz.Continue) { - const maxMsgSize = 128 - m.CodeID = c.RandUint64() - msg := make([]byte, c.RandUint64()%maxMsgSize) - c.Read(msg) - var err error - if m.Msg, err = json.Marshal(msg); err != nil { - panic(err) - } - c.Fuzz(&m.Updated) - m.Operation = types.AllCodeHistoryTypes[c.Int()%len(types.AllCodeHistoryTypes)] -} -*/ - func FuzzStateModel(m *types.Model, c fuzz.Continue) { m.Key = tmBytes.HexBytes(c.RandString()) c.Fuzz(&m.Value) } - -/* -func FuzzAccessType(m *types.AccessType, c fuzz.Continue) { - pos := c.Int() % len(types.AllAccessTypes) - for k, _ := range types.AllAccessTypes { - if pos == 0 { - *m = k - return - } - pos-- - } -} -func FuzzAccessConfig(m *types.AccessConfig, c fuzz.Continue) { - FuzzAccessType(&m.Type, c) - var add sdk.AccAddress - FuzzAddr(&add, c) - *m = m.Type.With(add) -} -*/ diff --git a/x/compute/internal/types/msg_test.go b/x/compute/internal/types/msg_test.go index 3ab8fa108..dfd010557 100644 --- a/x/compute/internal/types/msg_test.go +++ b/x/compute/internal/types/msg_test.go @@ -345,212 +345,3 @@ func TestExecuteContractValidation(t *testing.T) { }) } } - -/* -func TestMsgUpdateAdministrator(t *testing.T) { - badAddress, err := sdk.AccAddressFromHex("012345") - require.NoError(t, err) - // proper address size - goodAddress := sdk.AccAddress(make([]byte, 20)) - otherGoodAddress := sdk.AccAddress(bytes.Repeat([]byte{0x1}, 20)) - anotherGoodAddress := sdk.AccAddress(bytes.Repeat([]byte{0x2}, 20)) - - specs := map[string]struct { - src MsgUpdateAdmin - expErr bool - }{ - "all good": { - src: MsgUpdateAdmin{ - Sender: goodAddress, - NewAdmin: otherGoodAddress, - Contract: anotherGoodAddress, - }, - }, - "new admin required": { - src: MsgUpdateAdmin{ - Sender: goodAddress, - Contract: anotherGoodAddress, - }, - expErr: true, - }, - "bad sender": { - src: MsgUpdateAdmin{ - Sender: badAddress, - NewAdmin: otherGoodAddress, - Contract: anotherGoodAddress, - }, - expErr: true, - }, - "bad new admin": { - src: MsgUpdateAdmin{ - Sender: goodAddress, - NewAdmin: badAddress, - Contract: anotherGoodAddress, - }, - expErr: true, - }, - "bad contract addr": { - src: MsgUpdateAdmin{ - Sender: goodAddress, - NewAdmin: otherGoodAddress, - Contract: badAddress, - }, - expErr: true, - }, - "new admin same as old admin": { - src: MsgUpdateAdmin{ - Sender: goodAddress, - NewAdmin: goodAddress, - Contract: anotherGoodAddress, - }, - expErr: true, - }, - } - for msg, spec := range specs { - t.Run(msg, func(t *testing.T) { - err := spec.src.ValidateBasic() - if spec.expErr { - require.Error(t, err) - return - } - require.NoError(t, err) - }) - } -} - -func TestMsgClearAdministrator(t *testing.T) { - badAddress, err := sdk.AccAddressFromHex("012345") - require.NoError(t, err) - // proper address size - goodAddress := sdk.AccAddress(make([]byte, 20)) - anotherGoodAddress := sdk.AccAddress(bytes.Repeat([]byte{0x2}, 20)) - - specs := map[string]struct { - src MsgClearAdmin - expErr bool - }{ - "all good": { - src: MsgClearAdmin{ - Sender: goodAddress, - Contract: anotherGoodAddress, - }, - }, - "bad sender": { - src: MsgClearAdmin{ - Sender: badAddress, - Contract: anotherGoodAddress, - }, - expErr: true, - }, - "bad contract addr": { - src: MsgClearAdmin{ - Sender: goodAddress, - Contract: badAddress, - }, - expErr: true, - }, - "contract missing": { - src: MsgClearAdmin{ - Sender: goodAddress, - }, - expErr: true, - }, - } - for msg, spec := range specs { - t.Run(msg, func(t *testing.T) { - err := spec.src.ValidateBasic() - if spec.expErr { - require.Error(t, err) - return - } - require.NoError(t, err) - }) - } -} - -func TestMsgMigrateContract(t *testing.T) { - badAddress, err := sdk.AccAddressFromHex("012345") - require.NoError(t, err) - // proper address size - goodAddress := sdk.AccAddress(make([]byte, 20)) - anotherGoodAddress := sdk.AccAddress(bytes.Repeat([]byte{0x2}, 20)) - - specs := map[string]struct { - src MsgMigrateContract - expErr bool - }{ - "all good": { - src: MsgMigrateContract{ - Sender: goodAddress, - Contract: anotherGoodAddress, - CodeID: 1, - MigrateMsg: []byte("{}"), - }, - }, - "bad sender": { - src: MsgMigrateContract{ - Sender: badAddress, - Contract: anotherGoodAddress, - CodeID: 1, - }, - expErr: true, - }, - "empty sender": { - src: MsgMigrateContract{ - Contract: anotherGoodAddress, - CodeID: 1, - }, - expErr: true, - }, - "empty code": { - src: MsgMigrateContract{ - Sender: goodAddress, - Contract: anotherGoodAddress, - }, - expErr: true, - }, - "bad contract addr": { - src: MsgMigrateContract{ - Sender: goodAddress, - Contract: badAddress, - CodeID: 1, - }, - expErr: true, - }, - "empty contract addr": { - src: MsgMigrateContract{ - Sender: goodAddress, - CodeID: 1, - }, - expErr: true, - }, - "non json migrateMsg": { - src: MsgMigrateContract{ - Sender: goodAddress, - Contract: anotherGoodAddress, - CodeID: 1, - MigrateMsg: []byte("invalid json"), - }, - expErr: true, - }, - "empty migrateMsg": { - src: MsgMigrateContract{ - Sender: goodAddress, - Contract: anotherGoodAddress, - CodeID: 1, - }, - expErr: true, - }, - } - for msg, spec := range specs { - t.Run(msg, func(t *testing.T) { - err := spec.src.ValidateBasic() - if spec.expErr { - require.Error(t, err) - return - } - require.NoError(t, err) - }) - } -} -*/ diff --git a/x/compute/internal/types/test_fixtures.go b/x/compute/internal/types/test_fixtures.go index 6526a27c6..bc7ec726a 100644 --- a/x/compute/internal/types/test_fixtures.go +++ b/x/compute/internal/types/test_fixtures.go @@ -109,135 +109,3 @@ func WithSHA256CodeHash(wasmCode []byte) func(info *CodeInfo) { info.CodeHash = codeHash[:] } } - -/* -func StoreCodeProposalFixture(mutators ...func(*StoreCodeProposal)) StoreCodeProposal { - var anyValidAddress sdk.AccAddress = bytes.Repeat([]byte{0x1}, sdk.AddrLen) - p := StoreCodeProposal{ - WasmProposal: WasmProposal{ - Title: "Foo", - Description: "Bar", - }, - RunAs: anyValidAddress, - WASMByteCode: []byte{0x0}, - Source: "https://example.com/code", - Builder: "foo/bar:latest", - } - for _, m := range mutators { - m(&p) - } - return p -} - -func InstantiateContractProposalFixture(mutators ...func(p *InstantiateContractProposal)) InstantiateContractProposal { - var ( - anyValidAddress sdk.AccAddress = bytes.Repeat([]byte{0x1}, sdk.AddrLen) - - initMsg = struct { - Verifier sdk.AccAddress `json:"verifier"` - Beneficiary sdk.AccAddress `json:"beneficiary"` - }{ - Verifier: anyValidAddress, - Beneficiary: anyValidAddress, - } - ) - - initMsgBz, err := json.Marshal(initMsg) - if err != nil { - panic(err) - } - p := InstantiateContractProposal{ - WasmProposal: WasmProposal{ - Title: "Foo", - Description: "Bar", - }, - RunAs: anyValidAddress, - Admin: anyValidAddress, - CodeID: 1, - Label: "testing", - InitMsg: initMsgBz, - InitFunds: nil, - } - - for _, m := range mutators { - m(&p) - } - return p -} - -func MigrateContractProposalFixture(mutators ...func(p *MigrateContractProposal)) MigrateContractProposal { - var ( - anyValidAddress sdk.AccAddress = bytes.Repeat([]byte{0x1}, sdk.AddrLen) - - migMsg = struct { - Verifier sdk.AccAddress `json:"verifier"` - }{Verifier: anyValidAddress} - ) - - migMsgBz, err := json.Marshal(migMsg) - if err != nil { - panic(err) - } - contractAddr, err := sdk.AccAddressFromBech32("cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5") - if err != nil { - panic(err) - } - - p := MigrateContractProposal{ - WasmProposal: WasmProposal{ - Title: "Foo", - Description: "Bar", - }, - Contract: contractAddr, - CodeID: 1, - MigrateMsg: migMsgBz, - RunAs: anyValidAddress, - } - - for _, m := range mutators { - m(&p) - } - return p -} - -func UpdateAdminProposalFixture(mutators ...func(p *UpdateAdminProposal)) UpdateAdminProposal { - var anyValidAddress sdk.AccAddress = bytes.Repeat([]byte{0x1}, sdk.AddrLen) - - contractAddr, err := sdk.AccAddressFromBech32("cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5") - if err != nil { - panic(err) - } - - p := UpdateAdminProposal{ - WasmProposal: WasmProposal{ - Title: "Foo", - Description: "Bar", - }, - NewAdmin: anyValidAddress, - Contract: contractAddr, - } - for _, m := range mutators { - m(&p) - } - return p -} - -func ClearAdminProposalFixture(mutators ...func(p *ClearAdminProposal)) ClearAdminProposal { - contractAddr, err := sdk.AccAddressFromBech32("cosmos18vd8fpwxzck93qlwghaj6arh4p7c5n89uzcee5") - if err != nil { - panic(err) - } - - p := ClearAdminProposal{ - WasmProposal: WasmProposal{ - Title: "Foo", - Description: "Bar", - }, - Contract: contractAddr, - } - for _, m := range mutators { - m(&p) - } - return p -} -*/ diff --git a/x/compute/internal/types/types.go b/x/compute/internal/types/types.go index 7af9aeb99..26dd46676 100644 --- a/x/compute/internal/types/types.go +++ b/x/compute/internal/types/types.go @@ -82,18 +82,6 @@ func (c *ContractInfo) ValidateBasic() error { return nil } -/* -// ResetFromGenesis resets contracts timestamp and history. -func (c *ContractInfo) ResetFromGenesis(ctx sdk.Context) ContractCodeHistoryEntry { - c.Created = NewAbsoluteTxPosition(ctx) - return ContractCodeHistoryEntry{ - Operation: GenesisContractCodeHistoryType, - CodeID: c.CodeID, - Updated: c.Created, - } -} -*/ - // LessThan can be used to sort func (a *AbsoluteTxPosition) LessThan(b *AbsoluteTxPosition) bool { if a == nil { diff --git a/x/compute/internal/types/types_test.go b/x/compute/internal/types/types_test.go index ba9a5c92c..0ab28cf45 100644 --- a/x/compute/internal/types/types_test.go +++ b/x/compute/internal/types/types_test.go @@ -25,16 +25,6 @@ func TestContractInfoValidateBasic(t *testing.T) { srcMutator: func(c *ContractInfo) { c.Creator = make([]byte, 1000) }, expError: true, }, - /* - "admin empty": { - srcMutator: func(c *ContractInfo) { c.Admin = nil }, - expError: false, - }, - "admin not an address": { - srcMutator: func(c *ContractInfo) { c.Admin = make([]byte, sdk.AddrLen-1) }, - expError: true, - }, - */ "label empty": { srcMutator: func(c *ContractInfo) { c.Label = "" }, expError: true, diff --git a/x/compute/migrations/v1/types.go b/x/compute/migrations/v1/types.go new file mode 100644 index 000000000..80461c8cc --- /dev/null +++ b/x/compute/migrations/v1/types.go @@ -0,0 +1,3 @@ +package v1 + +// if needed legacy types go here diff --git a/x/compute/migrations/v2/store.go b/x/compute/migrations/v2/store.go new file mode 100644 index 000000000..81e5dfb2c --- /dev/null +++ b/x/compute/migrations/v2/store.go @@ -0,0 +1,28 @@ +package v2 + +// example migration + +// import ( +// "github.com/cosmos/cosmos-sdk/codec" +// storetypes "github.com/cosmos/cosmos-sdk/store/types" +// sdk "github.com/cosmos/cosmos-sdk/types" +// ) + +// // migrateSomething migrates the supply to be stored by denom key instead in a +// // single blob. +// // ref: https://github.com/cosmos/cosmos-sdk/issues/7092 +// func migrateSomething(store sdk.KVStore, cdc codec.BinaryCodec) error { +// return nil +// } + +// // MigrateStore performs in-place store migrations from v1 to v2. The +// // migration includes: +// func MigrateStore(ctx sdk.Context, storeKey storetypes.StoreKey, cdc codec.BinaryCodec) error { +// store := ctx.KVStore(storeKey) + +// if err := migrateSomething(store, cdc); err != nil { +// return err +// } + +// return nil +// } diff --git a/x/compute/module.go b/x/compute/module.go index ca3d85f64..789f7b8ca 100644 --- a/x/compute/module.go +++ b/x/compute/module.go @@ -105,7 +105,14 @@ func (AppModule) ConsensusVersion() uint64 { return 1 } func (am AppModule) RegisterServices(configurator module.Configurator) { types.RegisterMsgServer(configurator.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) types.RegisterQueryServer(configurator.QueryServer(), NewQuerier(am.keeper)) - // TODO register migrations here if needed + + // migrations go here (in the future when we have any) + // example: + + // m := keeper.NewMigrator(am.keeper) + // if err := configurator.RegisterMigration(types.ModuleName, 1, m.Migrate1to2); err != nil { + // panic(fmt.Sprintf("failed to migrate x/compute from version 1 to 2: %v", err)) + // } } func (am AppModule) LegacyQuerierHandler(amino *codec.LegacyAmino) sdk.Querier {