diff --git a/src/components/ClaimRewards.js b/src/components/ClaimRewards.js index 6fed81cd..ada069ce 100644 --- a/src/components/ClaimRewards.js +++ b/src/components/ClaimRewards.js @@ -3,7 +3,7 @@ import Coins from './Coins' import { coin } from '@cosmjs/stargate' -import { MsgWithdrawDelegatorReward } from "cosmjs-types/cosmos/distribution/v1beta1/tx"; +import { MsgWithdrawDelegatorReward, MsgWithdrawValidatorCommission } from "cosmjs-types/cosmos/distribution/v1beta1/tx"; import { MsgDelegate } from "cosmjs-types/cosmos/staking/v1beta1/tx"; import { @@ -41,7 +41,7 @@ function ClaimRewards(props) { signAndBroadcast = props.stargateClient.signAndBroadcastWithoutBalanceCheck - if(adjustedValidatorRewards.some(validatorReward => validatorReward.reward <= 0)) { + if(!props.commission && adjustedValidatorRewards.some(validatorReward => validatorReward.reward <= 0)) { props.setLoading(false) props.setError('Reward is too low') return @@ -80,6 +80,15 @@ function ClaimRewards(props) { validatorAddress: validatorReward.validatorAddress }) }) + + if (props.commission) { + valMessages.push({ + typeUrl: "/cosmos.distribution.v1beta1.MsgWithdrawValidatorCommission", + value: MsgWithdrawValidatorCommission.fromPartial({ + validatorAddress: validatorReward.validatorAddress + }) + }) + } if(props.restake){ valMessages.push({ @@ -96,13 +105,21 @@ function ClaimRewards(props) { }).flat() } + function buttonText() { + if(props.restake){ + return 'Manual Compound' + }else if(props.commission){ + return 'Claim Commission' + }else{ + return 'Claim Rewards' + } + } + return ( <> - {props.validatorRewards.length > 0 && ( - claim()}> - {props.restake ? 'Manual Compound' : 'Claim Rewards'} - - )} + claim()}> + {buttonText()} + ) } diff --git a/src/components/Delegations.js b/src/components/Delegations.js index 68ffb093..2cfa9ca5 100644 --- a/src/components/Delegations.js +++ b/src/components/Delegations.js @@ -1,5 +1,6 @@ import React from "react"; import _ from "lodash"; +import { Bech32 } from '@cosmjs/encoding' import AlertMessage from "./AlertMessage"; import Coins from "./Coins"; import ClaimRewards from "./ClaimRewards"; @@ -337,6 +338,14 @@ class Delegations extends React.Component { ); } + isValidatorOperator(validator) { + if(!this.props.address || !validator || !window.atob) return false; + + const prefix = this.props.network.prefix + const validatorOperator = Bech32.encode(prefix, Bech32.decode(validator.operator_address).data) + return validatorOperator === this.props.address + } + totalRewards(validators) { if (!this.state.rewards) return; @@ -386,6 +395,7 @@ class Delegations extends React.Component { renderValidator(validatorAddress, delegation) { const validator = this.props.validators[validatorAddress]; + const isValidatorOperator = this.isValidatorOperator(validator) if (validator) { const rewards = this.state.rewards && this.state.rewards[validatorAddress]; @@ -398,6 +408,8 @@ class Delegations extends React.Component { : "table-warning" : undefined; + if(isValidatorOperator) rowVariant = 'table-info' + const delegationBalance = (delegation && delegation.balance) || { amount: 0, denom: this.props.network.denom, @@ -579,6 +591,23 @@ class Delegations extends React.Component { } setError={this.setError} /> + {isValidatorOperator && ( + <> +
+ + this.setValidatorLoading(validatorAddress, loading) + } + setError={this.setError} + /> + + )}