github.com/Finschia/finschia-sdk@v0.49.1/x/fbridge/keeper/msg_server.go (about)

     1  package keeper
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	sdk "github.com/Finschia/finschia-sdk/types"
     8  	sdkerrors "github.com/Finschia/finschia-sdk/types/errors"
     9  	"github.com/Finschia/finschia-sdk/x/fbridge/types"
    10  )
    11  
    12  type msgServer struct {
    13  	Keeper
    14  }
    15  
    16  var _ types.MsgServer = msgServer{}
    17  
    18  func NewMsgServer(k Keeper) types.MsgServer {
    19  	return &msgServer{k}
    20  }
    21  
    22  func (m msgServer) UpdateParams(goCtx context.Context, msg *types.MsgUpdateParams) (*types.MsgUpdateParamsResponse, error) {
    23  	ctx := sdk.UnwrapSDKContext(goCtx)
    24  
    25  	if msg.Authority != m.Keeper.GetAuthority() {
    26  		return nil, fmt.Errorf(
    27  			"invalid authority; expected %s, got %s",
    28  			m.Keeper.GetAuthority(), msg.Authority)
    29  	}
    30  
    31  	if err := m.Keeper.SetParams(ctx, msg.Params); err != nil {
    32  		return nil, err
    33  	}
    34  
    35  	if err := ctx.EventManager().EmitTypedEvent(&types.EventUpdateParams{
    36  		Params: msg.Params,
    37  	}); err != nil {
    38  		panic(err)
    39  	}
    40  
    41  	return &types.MsgUpdateParamsResponse{}, nil
    42  }
    43  
    44  func (m msgServer) Transfer(goCtx context.Context, msg *types.MsgTransfer) (*types.MsgTransferResponse, error) {
    45  	ctx := sdk.UnwrapSDKContext(goCtx)
    46  
    47  	if m.IsBridgeHalted(ctx) {
    48  		return nil, types.ErrInactiveBridge
    49  	}
    50  
    51  	from, err := sdk.AccAddressFromBech32(msg.Sender)
    52  	if err != nil {
    53  		return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid sender address (%s)", err)
    54  	}
    55  
    56  	if err := IsValidEthereumAddress(msg.Receiver); err != nil {
    57  		return nil, sdkerrors.Wrap(err, "invalid receiver address")
    58  	}
    59  
    60  	seq, err := m.handleBridgeTransfer(ctx, from, msg.Amount)
    61  	if err != nil {
    62  		return nil, err
    63  	}
    64  
    65  	if err := ctx.EventManager().EmitTypedEvent(&types.EventTransfer{
    66  		Sender:   msg.Sender,
    67  		Receiver: msg.Receiver,
    68  		Amount:   msg.Amount.String(),
    69  		Seq:      seq,
    70  	}); err != nil {
    71  		panic(err)
    72  	}
    73  
    74  	return &types.MsgTransferResponse{}, nil
    75  }
    76  
    77  func (m msgServer) Provision(ctx context.Context, msg *types.MsgProvision) (*types.MsgProvisionResponse, error) {
    78  	panic(sdkerrors.ErrNotSupported)
    79  }
    80  
    81  func (m msgServer) HoldTransfer(ctx context.Context, msg *types.MsgHoldTransfer) (*types.MsgHoldTransferResponse, error) {
    82  	panic(sdkerrors.ErrNotSupported)
    83  }
    84  
    85  func (m msgServer) ReleaseTransfer(ctx context.Context, msg *types.MsgReleaseTransfer) (*types.MsgReleaseTransferResponse, error) {
    86  	panic(sdkerrors.ErrNotSupported)
    87  }
    88  
    89  func (m msgServer) RemoveProvision(ctx context.Context, msg *types.MsgRemoveProvision) (*types.MsgRemoveProvisionResponse, error) {
    90  	panic(sdkerrors.ErrNotSupported)
    91  }
    92  
    93  func (m msgServer) ClaimBatch(ctx context.Context, msg *types.MsgClaimBatch) (*types.MsgClaimBatchResponse, error) {
    94  	panic(sdkerrors.ErrNotSupported)
    95  }
    96  
    97  func (m msgServer) Claim(ctx context.Context, msg *types.MsgClaim) (*types.MsgClaimResponse, error) {
    98  	panic(sdkerrors.ErrNotSupported)
    99  }
   100  
   101  func (m msgServer) SuggestRole(goCtx context.Context, msg *types.MsgSuggestRole) (*types.MsgSuggestRoleResponse, error) {
   102  	ctx := sdk.UnwrapSDKContext(goCtx)
   103  
   104  	proposer, err := sdk.AccAddressFromBech32(msg.From)
   105  	if err != nil {
   106  		return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid proposer address (%s)", err)
   107  	}
   108  
   109  	target, err := sdk.AccAddressFromBech32(msg.Target)
   110  	if err != nil {
   111  		return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid target address (%s)", err)
   112  	}
   113  
   114  	if err := types.IsValidRole(msg.Role); err != nil {
   115  		return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, err.Error())
   116  	}
   117  
   118  	proposal, err := m.RegisterRoleProposal(ctx, proposer, target, msg.Role)
   119  	if err != nil {
   120  		return nil, err
   121  	}
   122  
   123  	if err := ctx.EventManager().EmitTypedEvent(&types.EventSuggestRole{
   124  		Proposal: proposal,
   125  	}); err != nil {
   126  		panic(err)
   127  	}
   128  
   129  	return &types.MsgSuggestRoleResponse{}, nil
   130  }
   131  
   132  func (m msgServer) AddVoteForRole(goCtx context.Context, msg *types.MsgAddVoteForRole) (*types.MsgAddVoteForRoleResponse, error) {
   133  	ctx := sdk.UnwrapSDKContext(goCtx)
   134  
   135  	voter, err := sdk.AccAddressFromBech32(msg.From)
   136  	if err != nil {
   137  		return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid proposer address (%s)", err)
   138  	}
   139  
   140  	if err := m.addVote(ctx, msg.ProposalId, voter, msg.Option); err != nil {
   141  		return nil, err
   142  	}
   143  
   144  	if err := ctx.EventManager().EmitTypedEvent(&types.EventAddVoteForRole{
   145  		Voter:      msg.From,
   146  		ProposalId: msg.ProposalId,
   147  		Option:     msg.Option,
   148  	}); err != nil {
   149  		panic(err)
   150  	}
   151  
   152  	return &types.MsgAddVoteForRoleResponse{}, nil
   153  }
   154  
   155  func (m msgServer) SetBridgeStatus(goCtx context.Context, msg *types.MsgSetBridgeStatus) (*types.MsgSetBridgeStatusResponse, error) {
   156  	ctx := sdk.UnwrapSDKContext(goCtx)
   157  
   158  	addr, err := sdk.AccAddressFromBech32(msg.Guardian)
   159  	if err != nil {
   160  		return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid guardian address (%s)", err)
   161  	}
   162  
   163  	if err := m.updateBridgeSwitch(ctx, addr, msg.Status); err != nil {
   164  		return nil, err
   165  	}
   166  
   167  	if err := ctx.EventManager().EmitTypedEvent(&types.EventSetBridgeStatus{
   168  		Guardian: msg.Guardian,
   169  		Status:   msg.Status,
   170  	}); err != nil {
   171  		panic(err)
   172  	}
   173  
   174  	return &types.MsgSetBridgeStatusResponse{}, nil
   175  }