github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/wasm/keeper/msg_server.go (about)

     1  package keeper
     2  
     3  import (
     4  	"context"
     5  
     6  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     7  	sdkerrors "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/errors"
     8  
     9  	"github.com/fibonacci-chain/fbc/x/wasm/types"
    10  )
    11  
    12  var _ types.MsgServer = msgServer{}
    13  
    14  type msgServer struct {
    15  	keeper types.ContractOpsKeeper
    16  }
    17  
    18  func NewMsgServerImpl(k types.ContractOpsKeeper) types.MsgServer {
    19  	return &msgServer{keeper: k}
    20  }
    21  
    22  func (m msgServer) StoreCode(goCtx context.Context, msg *types.MsgStoreCode) (*types.MsgStoreCodeResponse, error) {
    23  	ctx := sdk.UnwrapSDKContext(goCtx)
    24  	senderAddr, err := sdk.AccAddressFromBech32(msg.Sender)
    25  	if err != nil {
    26  		return nil, sdkerrors.Wrap(err, "sender")
    27  	}
    28  
    29  	ctx.EventManager().EmitEvent(sdk.NewEvent(
    30  		sdk.EventTypeMessage,
    31  		sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName),
    32  		sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender),
    33  	))
    34  
    35  	codeID, err := m.keeper.Create(ctx, senderAddr, msg.WASMByteCode, msg.InstantiatePermission)
    36  	if err != nil {
    37  		return nil, err
    38  	}
    39  
    40  	return &types.MsgStoreCodeResponse{
    41  		CodeID: codeID,
    42  	}, nil
    43  }
    44  
    45  func (m msgServer) InstantiateContract(goCtx context.Context, msg *types.MsgInstantiateContract) (*types.MsgInstantiateContractResponse, error) {
    46  	ctx := sdk.UnwrapSDKContext(goCtx)
    47  
    48  	senderAddr, err := sdk.AccAddressFromBech32(msg.Sender)
    49  	if err != nil {
    50  		return nil, sdkerrors.Wrap(err, "sender")
    51  	}
    52  	var adminAddr sdk.AccAddress
    53  	if msg.Admin != "" {
    54  		if adminAddr, err = sdk.AccAddressFromBech32(msg.Admin); err != nil {
    55  			return nil, sdkerrors.Wrap(err, "admin")
    56  		}
    57  	}
    58  
    59  	ctx.EventManager().EmitEvent(sdk.NewEvent(
    60  		sdk.EventTypeMessage,
    61  		sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName),
    62  		sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender),
    63  	))
    64  
    65  	contractAddr, data, err := m.keeper.Instantiate(ctx, msg.CodeID, senderAddr, adminAddr, msg.Msg, msg.Label, sdk.CoinAdaptersToCoins(msg.Funds))
    66  	if err != nil {
    67  		return nil, err
    68  	}
    69  
    70  	return &types.MsgInstantiateContractResponse{
    71  		Address: contractAddr.String(),
    72  		Data:    data,
    73  	}, nil
    74  }
    75  
    76  func (m msgServer) ExecuteContract(goCtx context.Context, msg *types.MsgExecuteContract) (*types.MsgExecuteContractResponse, error) {
    77  	ctx := sdk.UnwrapSDKContext(goCtx)
    78  	senderAddr, err := sdk.AccAddressFromBech32(msg.Sender)
    79  	if err != nil {
    80  		return nil, sdkerrors.Wrap(err, "sender")
    81  	}
    82  	contractAddr, err := sdk.AccAddressFromBech32(msg.Contract)
    83  	if err != nil {
    84  		return nil, sdkerrors.Wrap(err, "contract")
    85  	}
    86  
    87  	ctx.EventManager().EmitEvent(sdk.NewEvent(
    88  		sdk.EventTypeMessage,
    89  		sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName),
    90  		sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender),
    91  	))
    92  
    93  	data, err := m.keeper.Execute(ctx, contractAddr, senderAddr, msg.Msg, sdk.CoinAdaptersToCoins(msg.Funds))
    94  	if err != nil {
    95  		return nil, err
    96  	}
    97  
    98  	return &types.MsgExecuteContractResponse{
    99  		Data: data,
   100  	}, nil
   101  }
   102  
   103  func (m msgServer) MigrateContract(goCtx context.Context, msg *types.MsgMigrateContract) (*types.MsgMigrateContractResponse, error) {
   104  	ctx := sdk.UnwrapSDKContext(goCtx)
   105  	senderAddr, err := sdk.AccAddressFromBech32(msg.Sender)
   106  	if err != nil {
   107  		return nil, sdkerrors.Wrap(err, "sender")
   108  	}
   109  	contractAddr, err := sdk.AccAddressFromBech32(msg.Contract)
   110  	if err != nil {
   111  		return nil, sdkerrors.Wrap(err, "contract")
   112  	}
   113  
   114  	ctx.EventManager().EmitEvent(sdk.NewEvent(
   115  		sdk.EventTypeMessage,
   116  		sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName),
   117  		sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender),
   118  	))
   119  
   120  	data, err := m.keeper.Migrate(ctx, contractAddr, senderAddr, msg.CodeID, msg.Msg)
   121  	if err != nil {
   122  		return nil, err
   123  	}
   124  
   125  	return &types.MsgMigrateContractResponse{
   126  		Data: data,
   127  	}, nil
   128  }
   129  
   130  func (m msgServer) UpdateAdmin(goCtx context.Context, msg *types.MsgUpdateAdmin) (*types.MsgUpdateAdminResponse, error) {
   131  	ctx := sdk.UnwrapSDKContext(goCtx)
   132  	senderAddr, err := sdk.AccAddressFromBech32(msg.Sender)
   133  	if err != nil {
   134  		return nil, sdkerrors.Wrap(err, "sender")
   135  	}
   136  	contractAddr, err := sdk.AccAddressFromBech32(msg.Contract)
   137  	if err != nil {
   138  		return nil, sdkerrors.Wrap(err, "contract")
   139  	}
   140  	newAdminAddr, err := sdk.AccAddressFromBech32(msg.NewAdmin)
   141  	if err != nil {
   142  		return nil, sdkerrors.Wrap(err, "new admin")
   143  	}
   144  
   145  	ctx.EventManager().EmitEvent(sdk.NewEvent(
   146  		sdk.EventTypeMessage,
   147  		sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName),
   148  		sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender),
   149  	))
   150  
   151  	if err := m.keeper.UpdateContractAdmin(ctx, contractAddr, senderAddr, newAdminAddr); err != nil {
   152  		return nil, err
   153  	}
   154  
   155  	return &types.MsgUpdateAdminResponse{}, nil
   156  }
   157  
   158  func (m msgServer) ClearAdmin(goCtx context.Context, msg *types.MsgClearAdmin) (*types.MsgClearAdminResponse, error) {
   159  	ctx := sdk.UnwrapSDKContext(goCtx)
   160  	senderAddr, err := sdk.AccAddressFromBech32(msg.Sender)
   161  	if err != nil {
   162  		return nil, sdkerrors.Wrap(err, "sender")
   163  	}
   164  	contractAddr, err := sdk.AccAddressFromBech32(msg.Contract)
   165  	if err != nil {
   166  		return nil, sdkerrors.Wrap(err, "contract")
   167  	}
   168  
   169  	ctx.EventManager().EmitEvent(sdk.NewEvent(
   170  		sdk.EventTypeMessage,
   171  		sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName),
   172  		sdk.NewAttribute(sdk.AttributeKeySender, msg.Sender),
   173  	))
   174  
   175  	if err := m.keeper.ClearContractAdmin(ctx, contractAddr, senderAddr); err != nil {
   176  		return nil, err
   177  	}
   178  
   179  	return &types.MsgClearAdminResponse{}, nil
   180  }