github.com/Finschia/finschia-sdk@v0.48.1/x/distribution/client/common/common.go (about) 1 package common 2 3 import ( 4 "fmt" 5 6 "github.com/Finschia/finschia-sdk/client" 7 sdk "github.com/Finschia/finschia-sdk/types" 8 "github.com/Finschia/finschia-sdk/x/distribution/types" 9 ) 10 11 // QueryDelegationRewards queries a delegation rewards between a delegator and a 12 // validator. 13 func QueryDelegationRewards(clientCtx client.Context, delAddr, valAddr string) ([]byte, int64, error) { 14 delegatorAddr, err := sdk.AccAddressFromBech32(delAddr) 15 if err != nil { 16 return nil, 0, err 17 } 18 19 validatorAddr, err := sdk.ValAddressFromBech32(valAddr) 20 if err != nil { 21 return nil, 0, err 22 } 23 24 params := types.NewQueryDelegationRewardsParams(delegatorAddr, validatorAddr) 25 bz, err := clientCtx.LegacyAmino.MarshalJSON(params) 26 if err != nil { 27 return nil, 0, fmt.Errorf("failed to marshal params: %w", err) 28 } 29 30 route := fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryDelegationRewards) 31 return clientCtx.QueryWithData(route, bz) 32 } 33 34 // QueryDelegatorValidators returns delegator's list of validators 35 // it submitted delegations to. 36 func QueryDelegatorValidators(clientCtx client.Context, delegatorAddr sdk.AccAddress) ([]byte, error) { 37 res, _, err := clientCtx.QueryWithData( 38 fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryDelegatorValidators), 39 clientCtx.LegacyAmino.MustMarshalJSON(types.NewQueryDelegatorParams(delegatorAddr)), 40 ) 41 return res, err 42 } 43 44 // QueryValidatorCommission returns a validator's commission. 45 func QueryValidatorCommission(clientCtx client.Context, validatorAddr sdk.ValAddress) ([]byte, error) { 46 res, _, err := clientCtx.QueryWithData( 47 fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryValidatorCommission), 48 clientCtx.LegacyAmino.MustMarshalJSON(types.NewQueryValidatorCommissionParams(validatorAddr)), 49 ) 50 return res, err 51 } 52 53 // WithdrawAllDelegatorRewards builds a multi-message slice to be used 54 // to withdraw all delegations rewards for the given delegator. 55 func WithdrawAllDelegatorRewards(clientCtx client.Context, delegatorAddr sdk.AccAddress) ([]sdk.Msg, error) { 56 // retrieve the comprehensive list of all validators which the 57 // delegator had submitted delegations to 58 bz, err := QueryDelegatorValidators(clientCtx, delegatorAddr) 59 if err != nil { 60 return nil, err 61 } 62 63 var validators []sdk.ValAddress 64 if err := clientCtx.LegacyAmino.UnmarshalJSON(bz, &validators); err != nil { 65 return nil, err 66 } 67 68 // build multi-message transaction 69 msgs := make([]sdk.Msg, 0, len(validators)) 70 for _, valAddr := range validators { 71 msg := types.NewMsgWithdrawDelegatorReward(delegatorAddr, valAddr) 72 if err := msg.ValidateBasic(); err != nil { 73 return nil, err 74 } 75 msgs = append(msgs, msg) 76 } 77 78 return msgs, nil 79 } 80 81 // WithdrawValidatorRewardsAndCommission builds a two-message message slice to be 82 // used to withdraw both validation's commission and self-delegation reward. 83 func WithdrawValidatorRewardsAndCommission(validatorAddr sdk.ValAddress) ([]sdk.Msg, error) { 84 commissionMsg := types.NewMsgWithdrawValidatorCommission(validatorAddr) 85 if err := commissionMsg.ValidateBasic(); err != nil { 86 return nil, err 87 } 88 89 // build and validate MsgWithdrawDelegatorReward 90 rewardMsg := types.NewMsgWithdrawDelegatorReward(sdk.AccAddress(validatorAddr.Bytes()), validatorAddr) 91 if err := rewardMsg.ValidateBasic(); err != nil { 92 return nil, err 93 } 94 95 return []sdk.Msg{commissionMsg, rewardMsg}, nil 96 }