Files
wasmd/x/wasm/internal/keeper/proposal_handler.go
Alexander Peters 8a547179d2 Gov proposal types and handler (#173)
* Gov proposal types and handler

* Review feedback

* Store code proposal and test

* Accept only valid proposals

* Complete proposal types
2020-07-07 17:55:11 +02:00

142 lines
4.4 KiB
Go

package keeper
import (
"fmt"
"github.com/CosmWasm/wasmd/x/wasm/internal/types"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
)
const ( // TODO: same as in handler
AttributeKeyContract = "contract_address"
AttributeKeyCodeID = "code_id"
AttributeSigner = "signer"
)
// NewWasmProposalHandler creates a new governance Handler for wasm proposals
func NewWasmProposalHandler(k Keeper, enabledTypes map[string]struct{}) govtypes.Handler {
return func(ctx sdk.Context, content govtypes.Content) error {
if content == nil {
return sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, "content must not be empty")
}
if _, ok := enabledTypes[content.ProposalType()]; !ok {
return sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unsupported wasm proposal content type: %q", content.ProposalType())
}
switch c := content.(type) {
case *types.StoreCodeProposal:
return handleStoreCodeProposal(ctx, k, *c)
case *types.InstantiateContractProposal:
return handleInstantiateProposal(ctx, k, *c)
case *types.MigrateContractProposal:
return handleMigrateProposal(ctx, k, *c)
case *types.UpdateAdminProposal:
return handleUpdateAdminProposal(ctx, k, *c)
case *types.ClearAdminProposal:
return handleClearAdminProposal(ctx, k, *c)
default:
return sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unrecognized wasm proposal content type: %T", c)
}
}
}
func handleStoreCodeProposal(ctx sdk.Context, k Keeper, p types.StoreCodeProposal) error {
if err := p.ValidateBasic(); err != nil {
return err
}
codeID, err := k.Create(ctx, p.Creator, p.WASMByteCode, p.Source, p.Builder)
if err != nil {
return err
}
ourEvent := sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName),
//sdk.NewAttribute(AttributeSigner, p.Creator.String()), // todo: creator is not signer. rename attribute?
sdk.NewAttribute(AttributeKeyCodeID, fmt.Sprintf("%d", codeID)),
)
ctx.EventManager().EmitEvent(ourEvent)
return nil
}
func handleInstantiateProposal(ctx sdk.Context, k Keeper, p types.InstantiateContractProposal) error {
if err := p.ValidateBasic(); err != nil {
return err
}
contractAddr, err := k.Instantiate(ctx, p.Code, p.Creator, p.Admin, p.InitMsg, p.Label, p.InitFunds)
if err != nil {
return err
}
ourEvent := sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName),
//sdk.NewAttribute(AttributeSigner, p.Creator.String()),
sdk.NewAttribute(AttributeKeyCodeID, fmt.Sprintf("%d", p.Code)),
sdk.NewAttribute(AttributeKeyContract, contractAddr.String()),
)
ctx.EventManager().EmitEvent(ourEvent)
return nil
}
func handleMigrateProposal(ctx sdk.Context, k Keeper, p types.MigrateContractProposal) error {
if err := p.ValidateBasic(); err != nil {
return err
}
res, err := k.migrate(ctx, p.Contract, p.Sender, p.Code, p.MigrateMsg, GovAuthorizationPolicy{})
if err != nil {
return err
}
ourEvent := sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName),
//sdk.NewAttribute(AttributeSigner, p.Creator.String()),
sdk.NewAttribute(AttributeKeyContract, p.Contract.String()),
)
ctx.EventManager().EmitEvents(append(res.Events, ourEvent))
return nil
}
func handleUpdateAdminProposal(ctx sdk.Context, k Keeper, p types.UpdateAdminProposal) error {
if err := p.ValidateBasic(); err != nil {
return err
}
if err := k.setContractAdmin(ctx, p.Contract, p.Sender, p.NewAdmin, GovAuthorizationPolicy{}); err != nil {
return err
}
ourEvent := sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName),
//sdk.NewAttribute(AttributeSigner, p.Creator.String()),
sdk.NewAttribute(AttributeKeyContract, p.Contract.String()),
)
ctx.EventManager().EmitEvent(ourEvent)
return nil
}
func handleClearAdminProposal(ctx sdk.Context, k Keeper, p types.ClearAdminProposal) error {
if err := p.ValidateBasic(); err != nil {
return err
}
if err := k.setContractAdmin(ctx, p.Contract, p.Sender, nil, GovAuthorizationPolicy{}); err != nil {
return err
}
ourEvent := sdk.NewEvent(
sdk.EventTypeMessage,
sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName),
//sdk.NewAttribute(AttributeSigner, p.Creator.String()),
sdk.NewAttribute(AttributeKeyContract, p.Contract.String()),
)
ctx.EventManager().EmitEvent(ourEvent)
return nil
}