From 53a44eb4d7de37a3d43d09ce28b4ecdfd8da4440 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Fri, 21 Jan 2022 14:37:53 +0100 Subject: [PATCH] Wire up proposal handlers --- x/wasm/keeper/contract_keeper.go | 5 ++ x/wasm/keeper/proposal_handler.go | 89 ++++++++++++++----------------- x/wasm/types/exported_keepers.go | 3 ++ 3 files changed, 49 insertions(+), 48 deletions(-) diff --git a/x/wasm/keeper/contract_keeper.go b/x/wasm/keeper/contract_keeper.go index cd84c97d..ffdcc918 100644 --- a/x/wasm/keeper/contract_keeper.go +++ b/x/wasm/keeper/contract_keeper.go @@ -17,6 +17,7 @@ type decoratedKeeper interface { pinCode(ctx sdk.Context, codeID uint64) error unpinCode(ctx sdk.Context, codeID uint64) error execute(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, msg []byte, coins sdk.Coins) ([]byte, error) + Sudo(ctx sdk.Context, contractAddress sdk.AccAddress, msg []byte) ([]byte, error) setContractInfoExtension(ctx sdk.Context, contract sdk.AccAddress, extra types.ContractInfoExtension) error } @@ -53,6 +54,10 @@ func (p PermissionedKeeper) Migrate(ctx sdk.Context, contractAddress sdk.AccAddr return p.nested.migrate(ctx, contractAddress, caller, newCodeID, msg, p.authZPolicy) } +func (p PermissionedKeeper) Sudo(ctx sdk.Context, contractAddress sdk.AccAddress, msg []byte) ([]byte, error) { + return p.nested.Sudo(ctx, contractAddress, msg) +} + func (p PermissionedKeeper) UpdateContractAdmin(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, newAdmin sdk.AccAddress) error { return p.nested.setContractAdmin(ctx, contractAddress, caller, newAdmin, p.authZPolicy) } diff --git a/x/wasm/keeper/proposal_handler.go b/x/wasm/keeper/proposal_handler.go index 810fd6ca..1a0369d0 100644 --- a/x/wasm/keeper/proposal_handler.go +++ b/x/wasm/keeper/proposal_handler.go @@ -2,8 +2,6 @@ package keeper import ( "encoding/hex" - "fmt" - sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" @@ -121,55 +119,50 @@ func handleMigrateProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types.M } func handleSudoProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types.SudoContractProposal) error { - return fmt.Errorf("Not implemented") - //if err := p.ValidateBasic(); err != nil { - // return err - //} - // - //contractAddr, err := sdk.AccAddressFromBech32(p.Contract) - //if err != nil { - // return sdkerrors.Wrap(err, "contract") - //} - //runAsAddr, err := sdk.AccAddressFromBech32(p.RunAs) - //if err != nil { - // return sdkerrors.Wrap(err, "run as address") - //} - //data, err := k.Migrate(ctx, contractAddr, runAsAddr, p.CodeID, p.Msg) - //if err != nil { - // return err - //} - // - //ctx.EventManager().EmitEvent(sdk.NewEvent( - // types.EventTypeGovContractResult, - // sdk.NewAttribute(types.AttributeKeyResultDataHex, hex.EncodeToString(data)), - //)) - //return nil + if err := p.ValidateBasic(); err != nil { + return err + } + + contractAddr, err := sdk.AccAddressFromBech32(p.Contract) + if err != nil { + return sdkerrors.Wrap(err, "contract") + } + data, err := k.Sudo(ctx, contractAddr, p.Msg) + if err != nil { + return err + } + + ctx.EventManager().EmitEvent(sdk.NewEvent( + types.EventTypeGovContractResult, + sdk.NewAttribute(types.AttributeKeyResultDataHex, hex.EncodeToString(data)), + )) + return nil } func handleExecuteProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types.ExecuteContractProposal) error { - return fmt.Errorf("Not implemented") - //if err := p.ValidateBasic(); err != nil { - // return err - //} - // - //contractAddr, err := sdk.AccAddressFromBech32(p.Contract) - //if err != nil { - // return sdkerrors.Wrap(err, "contract") - //} - //runAsAddr, err := sdk.AccAddressFromBech32(p.RunAs) - //if err != nil { - // return sdkerrors.Wrap(err, "run as address") - //} - //data, err := k.Migrate(ctx, contractAddr, runAsAddr, p.CodeID, p.Msg) - //if err != nil { - // return err - //} - // - //ctx.EventManager().EmitEvent(sdk.NewEvent( - // types.EventTypeGovContractResult, - // sdk.NewAttribute(types.AttributeKeyResultDataHex, hex.EncodeToString(data)), - //)) - //return nil + if err := p.ValidateBasic(); err != nil { + return err + } + + contractAddr, err := sdk.AccAddressFromBech32(p.Contract) + if err != nil { + return sdkerrors.Wrap(err, "contract") + } + runAsAddr, err := sdk.AccAddressFromBech32(p.RunAs) + if err != nil { + return sdkerrors.Wrap(err, "run as address") + } + // we currently don't support sending tokens as part of an execute proposal. should we? from which account? + data, err := k.Execute(ctx, contractAddr, runAsAddr, p.Msg, nil) + if err != nil { + return err + } + + ctx.EventManager().EmitEvent(sdk.NewEvent( + types.EventTypeGovContractResult, + sdk.NewAttribute(types.AttributeKeyResultDataHex, hex.EncodeToString(data)), + )) + return nil } func handleUpdateAdminProposal(ctx sdk.Context, k types.ContractOpsKeeper, p types.UpdateAdminProposal) error { diff --git a/x/wasm/types/exported_keepers.go b/x/wasm/types/exported_keepers.go index 02f22764..525d2194 100644 --- a/x/wasm/types/exported_keepers.go +++ b/x/wasm/types/exported_keepers.go @@ -36,6 +36,9 @@ type ContractOpsKeeper interface { // Migrate allows to upgrade a contract to a new code with data migration. Migrate(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, newCodeID uint64, msg []byte) ([]byte, error) + // Sudo allows to call privileged entry point of a contract. + Sudo(ctx sdk.Context, contractAddress sdk.AccAddress, msg []byte) ([]byte, error) + // UpdateContractAdmin sets the admin value on the ContractInfo. It must be a valid address (use ClearContractAdmin to remove it) UpdateContractAdmin(ctx sdk.Context, contractAddress sdk.AccAddress, caller sdk.AccAddress, newAdmin sdk.AccAddress) error