mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-18 10:50:44 +00:00
Add reward calculate rates for masternode, voters and foudation wallet address
This commit is contained in:
parent
f51efe2fe6
commit
7184da404f
1 changed files with 54 additions and 9 deletions
|
|
@ -15,7 +15,11 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
HexSignMethod = "2fb1b25f"
|
HexSignMethod = "2fb1b25f"
|
||||||
|
RewardMasterPercent = 30
|
||||||
|
RewardVoterPercent = 60
|
||||||
|
RewardFoundationPercent = 10
|
||||||
|
FoudationWalletAddr = "0x0000000000000000000000000000000000000068"
|
||||||
)
|
)
|
||||||
|
|
||||||
type rewardLog struct {
|
type rewardLog struct {
|
||||||
|
|
@ -112,11 +116,18 @@ func GetRewardForCheckpoint(blockSignerAddr common.Address, number uint64, rChec
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get validator.
|
||||||
|
validator, err := contract2.NewXDCValidator(common.HexToAddress(common.XDCValidator), client)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("Fail get instance of XDC Validator", "error", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
// Get Owner for signers.
|
// Get Owner for signers.
|
||||||
owners := make(map[common.Address]*rewardLog)
|
owners := make(map[common.Address]*rewardLog)
|
||||||
if len(signers) > 0 {
|
if len(signers) > 0 {
|
||||||
for addr, log := range signers {
|
for addr, log := range signers {
|
||||||
owner, err := GetCandidatesOwnerByAddress(client, addr)
|
owner, err := GetCandidatesOwnerByAddress(validator, addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
owner = addr
|
owner = addr
|
||||||
}
|
}
|
||||||
|
|
@ -157,15 +168,10 @@ func CalculateReward(chainReward *big.Int, signers map[common.Address]*rewardLog
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get candidate owner by address.
|
// Get candidate owner by address.
|
||||||
func GetCandidatesOwnerByAddress(client bind.ContractBackend, addr common.Address) (common.Address, error) {
|
func GetCandidatesOwnerByAddress(validator *contract2.XDCValidator, addr common.Address) (common.Address, error) {
|
||||||
owner := common.Address{}
|
owner := common.Address{}
|
||||||
validator, err := contract2.NewXDCValidator(common.HexToAddress(common.XDCValidator), client)
|
|
||||||
if err != nil {
|
|
||||||
log.Error("Fail get instance of XDC Validator", "error", err)
|
|
||||||
return owner, err
|
|
||||||
}
|
|
||||||
opts := new(bind.CallOpts)
|
opts := new(bind.CallOpts)
|
||||||
owner, err = validator.GetCandidateOwner(opts, addr)
|
owner, err := validator.GetCandidateOwner(opts, addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Fail get candidate owner", "error", err)
|
log.Error("Fail get candidate owner", "error", err)
|
||||||
return owner, err
|
return owner, err
|
||||||
|
|
@ -173,3 +179,42 @@ func GetCandidatesOwnerByAddress(client bind.ContractBackend, addr common.Addres
|
||||||
|
|
||||||
return owner, nil
|
return owner, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get reward balance rates.
|
||||||
|
func GetRewardBalancesRate(masterAddr common.Address, totalReward *big.Int, validator *contract2.XDCValidator) (map[common.Address]*big.Int, error) {
|
||||||
|
balances := make(map[common.Address]*big.Int)
|
||||||
|
rewardMaster := new(big.Int).Mul(totalReward, new(big.Int).SetInt64(RewardMasterPercent/100))
|
||||||
|
balances[masterAddr] = rewardMaster
|
||||||
|
// Get voters for masternode.
|
||||||
|
opts := new(bind.CallOpts)
|
||||||
|
voters, err := validator.GetVoters(opts, masterAddr)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("Fail to get voters", "error", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(voters) > 0 {
|
||||||
|
totalVoterReward := new(big.Int).Mul(totalReward, new(big.Int).SetInt64(RewardVoterPercent/100))
|
||||||
|
totalCap := new(big.Int)
|
||||||
|
// Get voters capacities.
|
||||||
|
voterCaps := make(map[common.Address]*big.Int)
|
||||||
|
for _, voteAddr := range voters {
|
||||||
|
cap, err := validator.GetVoterCap(opts, masterAddr, voteAddr)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("Fail to get vote capacity", "error", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
totalCap.Add(totalCap, cap)
|
||||||
|
voterCaps[voteAddr] = cap
|
||||||
|
}
|
||||||
|
for addr, voteCap := range voterCaps {
|
||||||
|
balances[addr] = new(big.Int).Mul(totalVoterReward, voteCap)
|
||||||
|
balances[addr] = new(big.Int).Div(balances[addr], totalCap)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
balances[common.HexToAddress(FoudationWalletAddr)] =
|
||||||
|
new(big.Int).Mul(totalReward, new(big.Int).SetInt64(RewardFoundationPercent/100))
|
||||||
|
|
||||||
|
return balances, nil
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue