+func (s *SettlementReward) getStandbyNodeReward(height uint64) (uint64, error) {
+ voteInfos, err := s.node.GetVoteByHeight(height)
+ if err != nil {
+ return 0, errors.Wrapf(err, "get alternative node reward")
+ }
+
+ voteInfos = common.CalcStandByNodes(voteInfos)
+
+ totalVoteNum, xpubVoteNum := uint64(0), uint64(0)
+ for _, voteInfo := range voteInfos {
+ totalVoteNum += voteInfo.VoteNum
+ if s.rewardCfg.XPub == voteInfo.Vote {
+ xpubVoteNum = voteInfo.VoteNum
+ }
+ }
+
+ if xpubVoteNum == 0 {
+ return 0, errNotStandbyNode
+ }
+
+ amount := big.NewInt(0).SetUint64(standbyNodesRewardForConsensusCycle)
+ rewardRatio := big.NewInt(0).SetUint64(s.rewardCfg.RewardRatio)
+ amount.Mul(amount, rewardRatio).Div(amount, big.NewInt(100))
+ total := big.NewInt(0).SetUint64(totalVoteNum)
+ voteNum := big.NewInt(0).SetUint64(xpubVoteNum)
+ return amount.Mul(amount, voteNum).Div(amount, total).Uint64(), nil
+}
+