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 }