From f1c0e788ef44ee3ba7305a9f7925026f31c885a3 Mon Sep 17 00:00:00 2001 From: Jiri Date: Mon, 21 Oct 2024 11:21:51 +0200 Subject: [PATCH 1/5] Manifest rework --- app/upgrade_cudos.go | 44 +++++++++++++++++++++++-- app/upgrade_cudos_distribution.go | 20 +++++++++++- app/upgrade_v_11_4_manifest.go | 3 +- cmd/fetchd/cmd/cudos_merge.go | 54 ++++++------------------------- 4 files changed, 73 insertions(+), 48 deletions(-) diff --git a/app/upgrade_cudos.go b/app/upgrade_cudos.go index 11da0fbb..b0d1be7b 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.BondedStakingBalance = bondedBalance + upgradeBalance.BankBalance = upgradeBalance.BankBalance.Sub(bondedBalance) + } + upgradeBalances = append(upgradeBalances, upgradeBalance) } @@ -275,7 +309,7 @@ func writeInitialBalancesToManifest(genesisData *GenesisData, manifest *UpgradeM upgradeBalance.UnbondedStakingBalance = 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.DelegatorRewards = 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..54e0427d 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 + outstandingReward := distributionInfo.OutstandingRewards.MustGet(validatorOperatorAddr) + endingPeriod := UpdateValidatorData(distributionInfo, validator) for _, delegatorAddr := range delegatorStartInfo.Keys() { @@ -269,8 +276,19 @@ func aggregateRewards(distributionInfo *DistributionInfo, validators *OrderedMap delegatorRewards, _ := distributionInfo.Rewards.GetOrSetDefault(delegatorAddr, NewOrderedMap[string, sdk.DecCoins]()) delegatorRewards.SetNew(validatorOperatorAddr, rewardsRaw) + + rewards := rewardsRaw.Intersect(outstandingReward) + outstandingReward = outstandingReward.Sub(rewards) + } + validatorAccountAddress, err := convertOperatorAddressToAccount(validatorOperatorAddr) + if err != nil { + return err + } + + distributionInfo.ValidatorRewards.Set(validatorAccountAddress, outstandingReward) + } return nil diff --git a/app/upgrade_v_11_4_manifest.go b/app/upgrade_v_11_4_manifest.go index 27e03a32..1c10b4af 100644 --- a/app/upgrade_v_11_4_manifest.go +++ b/app/upgrade_v_11_4_manifest.go @@ -195,7 +195,8 @@ type UpgradeBalances struct { 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"` + DelegatorRewards types.Coins `json:"delegator_rewards,omitempty"` + ValidatorRewards types.Coins `json:"validator_rewards,omitempty"` Memo string `json:"memo,omitempty"` } 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 } From f65b20827aa77e226593c73b1c841852a9c0efa9 Mon Sep 17 00:00:00 2001 From: Jiri Date: Mon, 21 Oct 2024 11:53:29 +0200 Subject: [PATCH 2/5] Refactor --- app/upgrade_cudos_distribution.go | 7 +++---- app/upgrade_v_11_4_manifest.go | 24 +++++++++--------------- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/app/upgrade_cudos_distribution.go b/app/upgrade_cudos_distribution.go index 54e0427d..eab1dc6a 100644 --- a/app/upgrade_cudos_distribution.go +++ b/app/upgrade_cudos_distribution.go @@ -262,7 +262,7 @@ func aggregateRewards(distributionInfo *DistributionInfo, validators *OrderedMap validator := validators.MustGet(validatorOperatorAddr) // Get initial outstanding reward - outstandingReward := distributionInfo.OutstandingRewards.MustGet(validatorOperatorAddr) + outstandingRewards := distributionInfo.OutstandingRewards.MustGet(validatorOperatorAddr) endingPeriod := UpdateValidatorData(distributionInfo, validator) @@ -277,8 +277,7 @@ func aggregateRewards(distributionInfo *DistributionInfo, validators *OrderedMap delegatorRewards, _ := distributionInfo.Rewards.GetOrSetDefault(delegatorAddr, NewOrderedMap[string, sdk.DecCoins]()) delegatorRewards.SetNew(validatorOperatorAddr, rewardsRaw) - rewards := rewardsRaw.Intersect(outstandingReward) - outstandingReward = outstandingReward.Sub(rewards) + outstandingRewards = outstandingRewards.Sub(rewardsRaw.Intersect(outstandingRewards)) } @@ -287,7 +286,7 @@ func aggregateRewards(distributionInfo *DistributionInfo, validators *OrderedMap return err } - distributionInfo.ValidatorRewards.Set(validatorAccountAddress, outstandingReward) + distributionInfo.ValidatorRewards.Set(validatorAccountAddress, outstandingRewards) } diff --git a/app/upgrade_v_11_4_manifest.go b/app/upgrade_v_11_4_manifest.go index 1c10b4af..ce039120 100644 --- a/app/upgrade_v_11_4_manifest.go +++ b/app/upgrade_v_11_4_manifest.go @@ -189,21 +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"` - DelegatorRewards types.Coins `json:"delegator_rewards,omitempty"` - ValidatorRewards types.Coins `json:"validator_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 From 5fe7fc023ae4386d37b9734b4148a3574a749dd0 Mon Sep 17 00:00:00 2001 From: Jiri Date: Mon, 21 Oct 2024 12:41:08 +0200 Subject: [PATCH 3/5] fix --- app/upgrade_cudos.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/upgrade_cudos.go b/app/upgrade_cudos.go index b0d1be7b..f5c2cc08 100644 --- a/app/upgrade_cudos.go +++ b/app/upgrade_cudos.go @@ -247,7 +247,7 @@ func writeMovedBalancesToManifest(genesisData *GenesisData, manifest *UpgradeMan delegatedBalance := sdk.NewCoin(genesisData.BondDenom, delegatedAmount) bondedBalance = bondedBalance.Add(delegatedBalance) } - upgradeBalance.BondedStakingBalance = bondedBalance + upgradeBalance.BondedStakingBalancesAggr = bondedBalance upgradeBalance.BankBalance = upgradeBalance.BankBalance.Sub(bondedBalance) } @@ -284,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 @@ -295,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 @@ -306,7 +306,7 @@ 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 delegator rewards @@ -319,7 +319,7 @@ func writeInitialBalancesToManifest(genesisData *GenesisData, manifest *UpgradeM totalBalance = totalBalance.Add(rewardAmount...) } } - upgradeBalance.DelegatorRewards = totalBalance + upgradeBalance.DelegatorRewardsAggr = totalBalance } // Get distribution module validator rewards From b1a191d23830156cdf05f77f4e404dda3e2a49d5 Mon Sep 17 00:00:00 2001 From: Jiri Date: Mon, 21 Oct 2024 12:55:02 +0200 Subject: [PATCH 4/5] Additional lists --- app/upgrade_cudos.go | 16 ++++++++++++---- app/upgrade_v_11_4_manifest.go | 10 ++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/app/upgrade_cudos.go b/app/upgrade_cudos.go index f5c2cc08..5f6fd540 100644 --- a/app/upgrade_cudos.go +++ b/app/upgrade_cudos.go @@ -280,9 +280,12 @@ func writeInitialBalancesToManifest(genesisData *GenesisData, manifest *UpgradeM if delegations, exists := genesisData.Delegations.Get(address); exists { totalBalance := sdk.Coins{} for i := range delegations.Iterate() { - _, delegatedAmount := i.Key, i.Value + validatorOperatorAddr, delegatedAmount := i.Key, i.Value delegatedBalance := sdk.NewCoin(genesisData.BondDenom, delegatedAmount) totalBalance = totalBalance.Add(delegatedBalance) + + upgradeBalance.BondedStakingBalances = append(upgradeBalance.BondedStakingBalances, ValidatorBalance{Validator: validatorOperatorAddr, Balance: sdk.NewCoins(delegatedBalance)}) + } upgradeBalance.BondedStakingBalancesAggr = totalBalance } @@ -291,9 +294,10 @@ func writeInitialBalancesToManifest(genesisData *GenesisData, manifest *UpgradeM if delegations, exists := genesisData.UnbondingDelegations.Get(address); exists { totalBalance := sdk.Coins{} for i := range delegations.Iterate() { - _, delegatedAmount := i.Key, i.Value + validatorOperatorAddr, delegatedAmount := i.Key, i.Value delegatedBalance := sdk.NewCoin(genesisData.BondDenom, delegatedAmount) totalBalance = totalBalance.Add(delegatedBalance) + upgradeBalance.UnbondingStakingBalances = append(upgradeBalance.UnbondingStakingBalances, ValidatorBalance{Validator: validatorOperatorAddr, Balance: sdk.NewCoins(delegatedBalance)}) } upgradeBalance.UnbondingStakingBalancesAggr = totalBalance } @@ -302,9 +306,11 @@ func writeInitialBalancesToManifest(genesisData *GenesisData, manifest *UpgradeM if delegations, exists := genesisData.UnbondedDelegations.Get(address); exists { totalBalance := sdk.Coins{} for i := range delegations.Iterate() { - _, delegatedAmount := i.Key, i.Value + validatorOperatorAddr, delegatedAmount := i.Key, i.Value delegatedBalance := sdk.NewCoin(genesisData.BondDenom, delegatedAmount) totalBalance = totalBalance.Add(delegatedBalance) + upgradeBalance.UnbondedStakingBalances = append(upgradeBalance.UnbondedStakingBalances, ValidatorBalance{Validator: validatorOperatorAddr, Balance: sdk.NewCoins(delegatedBalance)}) + } upgradeBalance.UnbondedStakingBalancesAggr = totalBalance } @@ -313,11 +319,13 @@ func writeInitialBalancesToManifest(genesisData *GenesisData, manifest *UpgradeM if DelegatorRewards, exists := genesisData.DistributionInfo.Rewards.Get(address); exists { totalBalance := sdk.Coins{} for j := range DelegatorRewards.Iterate() { - _, rewardDecAmount := j.Key, j.Value + validatorOperatorAddr, rewardDecAmount := j.Key, j.Value rewardAmount, _ := rewardDecAmount.TruncateDecimal() if !rewardAmount.IsZero() { totalBalance = totalBalance.Add(rewardAmount...) + upgradeBalance.DelegatorRewards = append(upgradeBalance.DelegatorRewards, ValidatorBalance{Validator: validatorOperatorAddr, Balance: rewardAmount}) } + } upgradeBalance.DelegatorRewardsAggr = totalBalance } diff --git a/app/upgrade_v_11_4_manifest.go b/app/upgrade_v_11_4_manifest.go index ce039120..dbda7c66 100644 --- a/app/upgrade_v_11_4_manifest.go +++ b/app/upgrade_v_11_4_manifest.go @@ -188,6 +188,11 @@ type UpgradeAccountCreation struct { Reason string `json:"reason"` } +type ValidatorBalance struct { + Validator string `json:"validator"` + Balance types.Coins `json:"balance"` +} + type UpgradeBalances struct { Address string `json:"address"` BankBalance types.Coins `json:"bank_balance"` @@ -197,6 +202,11 @@ type UpgradeBalances struct { UnbondingStakingBalancesAggr types.Coins `json:"unbonding_staking_balances_aggr,omitempty"` DelegatorRewardsAggr types.Coins `json:"delegator_rewards_aggr,omitempty"` ValidatorRewards types.Coins `json:"validator_rewards,omitempty"` + + BondedStakingBalances []ValidatorBalance `json:"bonded_staking_balances,omitempty"` + UnbondedStakingBalances []ValidatorBalance `json:"unbonded_staking_balances,omitempty"` + UnbondingStakingBalances []ValidatorBalance `json:"unbonding_staking_balances,omitempty"` + DelegatorRewards []ValidatorBalance `json:"delegator_rewards,omitempty"` } func getManifestFilePath(app *App, prefix string) (string, error) { From fef2eff7c1e8b8d02f9b65b576c15aa8c3e32805 Mon Sep 17 00:00:00 2001 From: Jiri Date: Mon, 21 Oct 2024 12:57:10 +0200 Subject: [PATCH 5/5] Moved balance list --- app/upgrade_cudos.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/upgrade_cudos.go b/app/upgrade_cudos.go index 5f6fd540..d81e7611 100644 --- a/app/upgrade_cudos.go +++ b/app/upgrade_cudos.go @@ -243,11 +243,14 @@ func writeMovedBalancesToManifest(genesisData *GenesisData, manifest *UpgradeMan if delegations, exists := genesisData.Delegations.Get(address); exists { bondedBalance := sdk.Coins{} for i := range delegations.Iterate() { - _, delegatedAmount := i.Key, i.Value + validatorOperatorAddr, delegatedAmount := i.Key, i.Value delegatedBalance := sdk.NewCoin(genesisData.BondDenom, delegatedAmount) bondedBalance = bondedBalance.Add(delegatedBalance) + upgradeBalance.BondedStakingBalances = append(upgradeBalance.BondedStakingBalances, ValidatorBalance{Validator: validatorOperatorAddr, Balance: sdk.NewCoins(delegatedBalance)}) } + upgradeBalance.BondedStakingBalancesAggr = bondedBalance + // Bonded balance is part of the bank balance in this case, so we need to subtract it upgradeBalance.BankBalance = upgradeBalance.BankBalance.Sub(bondedBalance) }