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  }