diff --git a/app/upgrade_cudos.go b/app/upgrade_cudos.go index 11da0fbb..f5c2cc08 100644 --- a/app/upgrade_cudos.go +++ b/app/upgrade_cudos.go @@ -78,6 +78,27 @@ func convertAddressPrefix(addr string, newPrefix string) (string, error) { return newAddress, nil } +func convertOperatorAddressToAccount(addr string) (string, error) { + prefix, decodedAddrData, err := bech32.DecodeAndConvert(addr) + if err != nil { + return "", err + } + + suffix := "valoper" + if strings.HasSuffix(prefix, suffix) { + prefix = prefix[:len(prefix)-len(suffix)] + } else { + return "", fmt.Errorf("wrong operator address") + } + + newAddress, err := bech32.ConvertAndEncode(prefix, decodedAddrData) + if err != nil { + return "", err + } + + return newAddress, nil +} + func ensureCudosconvertAddressToRaw(addr string, genesisData *GenesisData) (sdk.AccAddress, error) { prefix, decodedAddrData, err := bech32.DecodeAndConvert(addr) @@ -217,6 +238,19 @@ func writeMovedBalancesToManifest(genesisData *GenesisData, manifest *UpgradeMan if account, exists := genesisData.Accounts.Get(address); exists { upgradeBalance.BankBalance = account.Balance } + + // Bonded tokens will be delegated after conversion + if delegations, exists := genesisData.Delegations.Get(address); exists { + bondedBalance := sdk.Coins{} + for i := range delegations.Iterate() { + _, delegatedAmount := i.Key, i.Value + delegatedBalance := sdk.NewCoin(genesisData.BondDenom, delegatedAmount) + bondedBalance = bondedBalance.Add(delegatedBalance) + } + upgradeBalance.BondedStakingBalancesAggr = bondedBalance + upgradeBalance.BankBalance = upgradeBalance.BankBalance.Sub(bondedBalance) + } + upgradeBalances = append(upgradeBalances, upgradeBalance) } @@ -250,7 +284,7 @@ func writeInitialBalancesToManifest(genesisData *GenesisData, manifest *UpgradeM delegatedBalance := sdk.NewCoin(genesisData.BondDenom, delegatedAmount) totalBalance = totalBalance.Add(delegatedBalance) } - upgradeBalance.BondedStakingBalance = totalBalance + upgradeBalance.BondedStakingBalancesAggr = totalBalance } // Unbonding tokens @@ -261,7 +295,7 @@ func writeInitialBalancesToManifest(genesisData *GenesisData, manifest *UpgradeM delegatedBalance := sdk.NewCoin(genesisData.BondDenom, delegatedAmount) totalBalance = totalBalance.Add(delegatedBalance) } - upgradeBalance.UnbondingStakingBalance = totalBalance + upgradeBalance.UnbondingStakingBalancesAggr = totalBalance } // Unbonded tokens @@ -272,10 +306,10 @@ func writeInitialBalancesToManifest(genesisData *GenesisData, manifest *UpgradeM delegatedBalance := sdk.NewCoin(genesisData.BondDenom, delegatedAmount) totalBalance = totalBalance.Add(delegatedBalance) } - upgradeBalance.UnbondedStakingBalance = totalBalance + upgradeBalance.UnbondedStakingBalancesAggr = totalBalance } - // Get distribution module rewards + // Get distribution module delegator rewards if DelegatorRewards, exists := genesisData.DistributionInfo.Rewards.Get(address); exists { totalBalance := sdk.Coins{} for j := range DelegatorRewards.Iterate() { @@ -285,7 +319,13 @@ func writeInitialBalancesToManifest(genesisData *GenesisData, manifest *UpgradeM totalBalance = totalBalance.Add(rewardAmount...) } } - upgradeBalance.DistributionRewards = totalBalance + upgradeBalance.DelegatorRewardsAggr = totalBalance + } + + // Get distribution module validator rewards + if ValidatorDecRewards, exists := genesisData.DistributionInfo.ValidatorRewards.Get(address); exists { + ValidatorRewards, _ := ValidatorDecRewards.TruncateDecimal() + upgradeBalance.ValidatorRewards = ValidatorRewards } upgradeBalances = append(upgradeBalances, upgradeBalance) diff --git a/app/upgrade_cudos_distribution.go b/app/upgrade_cudos_distribution.go index 2c7e2a89..eab1dc6a 100644 --- a/app/upgrade_cudos_distribution.go +++ b/app/upgrade_cudos_distribution.go @@ -52,7 +52,8 @@ type DistributionInfo struct { DistributionModuleAccountAddress string // Aggregated values - Rewards *OrderedMap[string, *OrderedMap[string, sdk.DecCoins]] // delegator_addr -> validator_addr -> reward + Rewards *OrderedMap[string, *OrderedMap[string, sdk.DecCoins]] // delegator_addr -> validator_addr -> reward + ValidatorRewards *OrderedMap[string, sdk.DecCoins] // validator_addr -> validator_rewards } func parseDelegatorStartingInfos(distribution map[string]interface{}) (*OrderedMap[string, *OrderedMap[string, *DelegatorStartingInfo]], error) { @@ -251,12 +252,18 @@ func aggregateRewards(distributionInfo *DistributionInfo, validators *OrderedMap if distributionInfo.Rewards == nil { distributionInfo.Rewards = NewOrderedMap[string, *OrderedMap[string, sdk.DecCoins]]() } + if distributionInfo.ValidatorRewards == nil { + distributionInfo.ValidatorRewards = NewOrderedMap[string, sdk.DecCoins]() + } // Withdraw all delegation rewards for i := range distributionInfo.DelegatorStartingInfos.Iterate() { validatorOperatorAddr, delegatorStartInfo := i.Key, i.Value validator := validators.MustGet(validatorOperatorAddr) + // Get initial outstanding reward + outstandingRewards := distributionInfo.OutstandingRewards.MustGet(validatorOperatorAddr) + endingPeriod := UpdateValidatorData(distributionInfo, validator) for _, delegatorAddr := range delegatorStartInfo.Keys() { @@ -269,8 +276,18 @@ func aggregateRewards(distributionInfo *DistributionInfo, validators *OrderedMap delegatorRewards, _ := distributionInfo.Rewards.GetOrSetDefault(delegatorAddr, NewOrderedMap[string, sdk.DecCoins]()) delegatorRewards.SetNew(validatorOperatorAddr, rewardsRaw) + + outstandingRewards = outstandingRewards.Sub(rewardsRaw.Intersect(outstandingRewards)) + } + validatorAccountAddress, err := convertOperatorAddressToAccount(validatorOperatorAddr) + if err != nil { + return err + } + + distributionInfo.ValidatorRewards.Set(validatorAccountAddress, outstandingRewards) + } return nil diff --git a/app/upgrade_v_11_4_manifest.go b/app/upgrade_v_11_4_manifest.go index 27e03a32..ce039120 100644 --- a/app/upgrade_v_11_4_manifest.go +++ b/app/upgrade_v_11_4_manifest.go @@ -189,20 +189,15 @@ type UpgradeAccountCreation struct { } type UpgradeBalances struct { - Address string `json:"address"` - BankBalance types.Coins `json:"bank_balance"` - VestedBalance types.Coins `json:"vested_balance,omitempty"` - BondedStakingBalance types.Coins `json:"bonded_staking_balance,omitempty"` - UnbondedStakingBalance types.Coins `json:"unbonded_staking_balance,omitempty"` - UnbondingStakingBalance types.Coins `json:"unbonding_staking_balance,omitempty"` - DistributionRewards types.Coins `json:"distribution_rewards,omitempty"` - Memo string `json:"memo,omitempty"` -} - -// app.UpgradeKeeper.GetUpgradeInfoPath() -// if upgradeFilePath, err = app.UpgradeKeeper.GetUpgradeInfoPath(); err != nil { -// return "", err -// } + Address string `json:"address"` + BankBalance types.Coins `json:"bank_balance"` + VestedBalance types.Coins `json:"vested_balance,omitempty"` + BondedStakingBalancesAggr types.Coins `json:"bonded_staking_balances_aggr,omitempty"` + UnbondedStakingBalancesAggr types.Coins `json:"unbonded_staking_balances_aggr,omitempty"` + UnbondingStakingBalancesAggr types.Coins `json:"unbonding_staking_balances_aggr,omitempty"` + DelegatorRewardsAggr types.Coins `json:"delegator_rewards_aggr,omitempty"` + ValidatorRewards types.Coins `json:"validator_rewards,omitempty"` +} func getManifestFilePath(app *App, prefix string) (string, error) { var upgradeFilePath string diff --git a/cmd/fetchd/cmd/cudos_merge.go b/cmd/fetchd/cmd/cudos_merge.go index 3f741382..434eac5b 100644 --- a/cmd/fetchd/cmd/cudos_merge.go +++ b/cmd/fetchd/cmd/cudos_merge.go @@ -120,7 +120,7 @@ func AddCommandManifestAddressInfo(networkMergeCmd *cobra.Command) { cmd := &cobra.Command{ Use: "manifest-address-info [manifest_file_path] [address]", Short: "Extracts balance information for a specific address", - Long: `This command retrieves all balance information for a given address from almanac, including the amount delegated to validators, and rewards.`, + Long: `This command retrieves all balance information for a given address from manifest, including the amount delegated to validators, and rewards.`, Args: cobra.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) error { ctx := client.GetClientContextFromCmd(cmd) @@ -129,7 +129,7 @@ func AddCommandManifestAddressInfo(networkMergeCmd *cobra.Command) { address := args[1] // Call a function to extract address info - err := AlmanacAddressInfo(manifestFilePath, address, ctx) + err := ManifestAddressInfo(manifestFilePath, address, ctx) if err != nil { return err } @@ -463,55 +463,21 @@ func parseManifestData(manifest *app.UpgradeManifest) (*ManifestData, error) { } func printBalancesEntry(upgradeBalances app.UpgradeBalances, ctx client.Context) error { - if !upgradeBalances.BankBalance.IsZero() { - err := ctx.PrintString(fmt.Sprintf("Bank balance: %s\n", upgradeBalances.BankBalance)) - if err != nil { - return err - } - } - - if !upgradeBalances.VestedBalance.IsZero() { - err := ctx.PrintString(fmt.Sprintf("Vested balance: %s\n", upgradeBalances.VestedBalance)) - if err != nil { - return err - } - } - - if !upgradeBalances.BondedStakingBalance.IsZero() { - err := ctx.PrintString(fmt.Sprintf("Bonded staking balance: %s\n", upgradeBalances.BondedStakingBalance)) - if err != nil { - return err - } - } - - if !upgradeBalances.UnbondedStakingBalance.IsZero() { - err := ctx.PrintString(fmt.Sprintf("Unbonded staking balance: %s\n", upgradeBalances.UnbondedStakingBalance)) - if err != nil { - return err - } - } - - if !upgradeBalances.UnbondingStakingBalance.IsZero() { - err := ctx.PrintString(fmt.Sprintf("Unbonding staking balance: %s\n", upgradeBalances.UnbondingStakingBalance)) - if err != nil { - return err - } + data, err := json.MarshalIndent(upgradeBalances, "", " ") + if err != nil { + return err } - - if !upgradeBalances.DistributionRewards.IsZero() { - err := ctx.PrintString(fmt.Sprintf("Distribution rewards: %s\n", upgradeBalances.DistributionRewards)) - if err != nil { - return err - } + err = ctx.PrintString(fmt.Sprintf("%s\n", string(data))) + if err != nil { + return err } - return nil } -func AlmanacAddressInfo(almanacFilePath string, address string, ctx client.Context) error { +func ManifestAddressInfo(manifestFilePath string, address string, ctx client.Context) error { manifest := app.NewUpgradeManifest() - manifest, err := app.LoadManifestFromPath(almanacFilePath) + manifest, err := app.LoadManifestFromPath(manifestFilePath) if err != nil { return err }