Skip to content

Commit

Permalink
fix(testnetify): fix token balance flow in testnetify genesis
Browse files Browse the repository at this point in the history
Signed-off-by: Artur Troian <[email protected]>
  • Loading branch information
troian committed Jun 7, 2023
1 parent 674812c commit 53e8be2
Show file tree
Hide file tree
Showing 4 changed files with 159 additions and 50 deletions.
12 changes: 9 additions & 3 deletions cmd/akash/cmd/testnetify/accounts.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package testnetify

import (
"fmt"

"github.com/theckman/yacspin"

"github.com/cosmos/cosmos-sdk/codec"
Expand All @@ -14,12 +12,20 @@ func (ga *GenesisState) modifyAccounts(sp *yacspin.Spinner, cdc codec.Codec, cfg
return err
}

if err := ga.IncreaseSupply(cdc, acc.Coins.ToSDK()...); err != nil {
return err
}

if err := ga.IncreaseBalances(cdc, acc.Address.AccAddress, acc.Coins.ToSDK()); err != nil {
return err
}
}

sp.Message(fmt.Sprintf("added new accounts"))
if err := ga.validateBalances(); err != nil {
return err
}

sp.Message("added new accounts")

return nil
}
4 changes: 4 additions & 0 deletions cmd/akash/cmd/testnetify/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,12 @@ func Cmd() *cobra.Command {
}
_ = spinner.Stop()

spinner.Message(fmt.Sprintf("preparing genesis state"))
spinner.StopMessage(fmt.Sprintf("prepared genesis state"))
_ = spinner.Start()
gState, err = NewGenesisState(spinner, appState, genDoc)
if err != nil {
spinner.StopFailMessage(fmt.Sprintf("failed to prepare genesis state: %s", err.Error()))
return err
}
}
Expand Down
188 changes: 146 additions & 42 deletions cmd/akash/cmd/testnetify/state.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,10 @@ import (
"github.com/akash-network/node/x/provider"
)

type GenesisValidators []tmtypes.GenesisValidator
type StakingValidators []stakingtypes.Validator
type (
GenesisValidators []tmtypes.GenesisValidator
StakingValidators []stakingtypes.Validator
)

type iState interface {
pack(cdc codec.Codec) error
Expand All @@ -51,19 +53,23 @@ type iState interface {
func (u GenesisValidators) Len() int {
return len(u)
}

func (u GenesisValidators) Swap(i, j int) {
u[i], u[j] = u[j], u[i]
}

func (u GenesisValidators) Less(i, j int) bool {
return u[i].Power < u[j].Power
}

func (u StakingValidators) Len() int {
return len(u)
}

func (u StakingValidators) Swap(i, j int) {
u[i], u[j] = u[j], u[i]
}

func (u StakingValidators) Less(i, j int) bool {
return u[i].DelegatorShares.LT(u[j].DelegatorShares)
}
Expand Down Expand Up @@ -148,19 +154,21 @@ type ProviderState struct {
once sync.Once
}

var _ iState = (*AuthState)(nil)
var _ iState = (*BankState)(nil)
var _ iState = (*DistributionState)(nil)
var _ iState = (*IBCState)(nil)
var _ iState = (*GovState)(nil)
var _ iState = (*StakingState)(nil)
var _ iState = (*SlashingState)(nil)
var _ iState = (*AuditState)(nil)
var _ iState = (*CertState)(nil)
var _ iState = (*DeploymentState)(nil)
var _ iState = (*EscrowState)(nil)
var _ iState = (*MarketState)(nil)
var _ iState = (*ProviderState)(nil)
var (
_ iState = (*AuthState)(nil)
_ iState = (*BankState)(nil)
_ iState = (*DistributionState)(nil)
_ iState = (*IBCState)(nil)
_ iState = (*GovState)(nil)
_ iState = (*StakingState)(nil)
_ iState = (*SlashingState)(nil)
_ iState = (*AuditState)(nil)
_ iState = (*CertState)(nil)
_ iState = (*DeploymentState)(nil)
_ iState = (*EscrowState)(nil)
_ iState = (*MarketState)(nil)
_ iState = (*ProviderState)(nil)
)

type GenesisState struct {
doc *tmtypes.GenesisDoc
Expand Down Expand Up @@ -214,12 +222,12 @@ func NewGenesisState(sp *yacspin.Spinner, state map[string]json.RawMessage, doc
_ = sp.Start()

var err error
st.moduleAddresses.bondedPool, err = st.findModuleAccount(cdc, "bonded_tokens_pool")
st.moduleAddresses.bondedPool, err = st.findModuleAccount(cdc, stakingtypes.BondedPoolName)
if err != nil {
return nil, fmt.Errorf("couldn't find bonded_tokens_pool account") // nolint: goerr113
}

st.moduleAddresses.notBondedPool, err = st.findModuleAccount(cdc, "not_bonded_tokens_pool")
st.moduleAddresses.notBondedPool, err = st.findModuleAccount(cdc, stakingtypes.NotBondedPoolName)
if err != nil {
return nil, fmt.Errorf("couldn't find not_bonded_tokens_pool account") // nolint: goerr113
}
Expand All @@ -229,12 +237,81 @@ func NewGenesisState(sp *yacspin.Spinner, state map[string]json.RawMessage, doc
return nil, fmt.Errorf("couldn't find distribution account") // nolint: goerr113
}

if err = st.app.BankState.unpack(cdc); err != nil {
return nil, err
}

if err = st.app.StakingState.unpack(cdc); err != nil {
return nil, err
}

if err = st.validateBalances(); err != nil {
return nil, err
}

_ = sp.Stop()

return st, nil
}

func (ga *GenesisState) validateBalances() error {
bondedTokens := sdk.ZeroInt()
notBondedTokens := sdk.ZeroInt()

for _, val := range ga.app.StakingState.state.Validators {
switch val.GetStatus() {
case stakingtypes.Bonded:
bondedTokens = bondedTokens.Add(val.GetTokens())
case stakingtypes.Unbonding, stakingtypes.Unbonded:
notBondedTokens = notBondedTokens.Add(val.GetTokens())
default:
return fmt.Errorf("invalid validator status") // nolint: goerr113
}
}

for _, ubd := range ga.app.StakingState.state.UnbondingDelegations {
for _, entry := range ubd.Entries {
notBondedTokens = notBondedTokens.Add(entry.Balance)
}
}

bondedCoins := sdk.NewCoins(sdk.NewCoin(ga.app.StakingState.state.Params.BondDenom, bondedTokens))
notBondedCoins := sdk.NewCoins(sdk.NewCoin(ga.app.StakingState.state.Params.BondDenom, notBondedTokens))

var bondedBalance sdk.Coins
var notBondedBalance sdk.Coins

for _, balance := range ga.app.BankState.state.Balances {
if balance.Address == ga.moduleAddresses.bondedPool.String() {
bondedBalance = bondedBalance.Add(balance.Coins...)
}
}

for _, balance := range ga.app.BankState.state.Balances {
if balance.Address == ga.moduleAddresses.notBondedPool.String() {
notBondedBalance = notBondedBalance.Add(balance.Coins...)
}
}

bondedBalance.Sort()
notBondedBalance.Sort()

if !bondedBalance.IsEqual(bondedCoins) {
return fmt.Errorf("bonded pool balance is different from bonded coins: %s <-> %s", notBondedBalance, notBondedCoins) // nolint: goerr113
}

// if !notBondedBalance.IsEqual(notBondedCoins) {
// return fmt.Errorf("not bonded pool balance is different from not bonded coins: %s <-> %s", notBondedBalance, notBondedCoins) // nolint: goerr113
// }

return nil
}

func (ga *GenesisState) pack(cdc codec.Codec) error {
if err := ga.validateBalances(); err != nil {
return err
}

if err := ga.ensureActiveSet(cdc); err != nil {
return err
}
Expand Down Expand Up @@ -707,7 +784,7 @@ func (ga *GenesisState) createCoin(cdc codec.Codec, coin sdk.Coin) error {
return nil
}

func (ga *GenesisState) increaseSupply(cdc codec.Codec, coins ...sdk.Coin) error {
func (ga *GenesisState) IncreaseSupply(cdc codec.Codec, coins ...sdk.Coin) error {
if err := ga.app.BankState.unpack(cdc); err != nil {
return nil
}
Expand All @@ -732,7 +809,7 @@ func (ga *GenesisState) increaseSupply(cdc codec.Codec, coins ...sdk.Coin) error
return nil
}

func (ga *GenesisState) decreaseSupply(cdc codec.Codec, coins ...sdk.Coin) error {
func (ga *GenesisState) DecreaseSupply(cdc codec.Codec, coins ...sdk.Coin) error {
if err := ga.app.BankState.unpack(cdc); err != nil {
return nil
}
Expand All @@ -755,6 +832,30 @@ func (ga *GenesisState) decreaseSupply(cdc codec.Codec, coins ...sdk.Coin) error
return nil
}

func (ga *GenesisState) SendFromModuleToModule(cdc codec.Codec, from, to sdk.AccAddress, amt sdk.Coins) error {
if err := ga.DecreaseBalances(cdc, from, amt); err != nil {
return err
}

if err := ga.IncreaseBalances(cdc, to, amt); err != nil {
return err
}

return nil
}

func (ga *GenesisState) DelegateToPool(cdc codec.Codec, from, to sdk.AccAddress, amt sdk.Coins) error {
if err := ga.DecreaseBalances(cdc, from, amt); err != nil {
return err
}

if err := ga.IncreaseBalances(cdc, to, amt); err != nil {
return err
}

return nil
}

// IncreaseBalances increases the balance of an account
// and the overall supply of corresponding token by the same amount
func (ga *GenesisState) IncreaseBalances(cdc codec.Codec, addr sdk.AccAddress, coins sdk.Coins) error {
Expand All @@ -767,6 +868,7 @@ func (ga *GenesisState) IncreaseBalances(cdc codec.Codec, addr sdk.AccAddress, c
for idx := range ga.app.BankState.state.Balances {
if ga.app.BankState.state.Balances[idx].GetAddress().Equals(addr) {
balance = &ga.app.BankState.state.Balances[idx]
break
}
}

Expand All @@ -791,10 +893,6 @@ func (ga *GenesisState) IncreaseBalances(cdc codec.Codec, addr sdk.AccAddress, c

balance.Coins = balance.Coins.Sort()

if err := ga.increaseSupply(cdc, coins...); err != nil {
return err
}

return nil
}

Expand All @@ -808,6 +906,7 @@ func (ga *GenesisState) DecreaseBalances(cdc codec.Codec, addr sdk.AccAddress, c
for idx := range ga.app.BankState.state.Balances {
if ga.app.BankState.state.Balances[idx].GetAddress().Equals(addr) {
balance = &ga.app.BankState.state.Balances[idx]
break
}
}

Expand All @@ -824,10 +923,6 @@ func (ga *GenesisState) DecreaseBalances(cdc codec.Codec, addr sdk.AccAddress, c
}
}

if err := ga.decreaseSupply(cdc, coins...); err != nil {
return err
}

return nil
}

Expand Down Expand Up @@ -906,7 +1001,18 @@ func (ga *GenesisState) IncreaseDelegatorStake(
info.StartingInfo.Stake = stake
delegation.Shares = stake

if err := ga.sortValidatorsByShares(); err != nil {
var err error
if sVal.IsBonded() {
err = ga.DelegateToPool(cdc, addr, ga.moduleAddresses.bondedPool, coins)
} else {
err = ga.DelegateToPool(cdc, addr, ga.moduleAddresses.notBondedPool, coins)
}

if err != nil {
return err
}

if err = ga.sortValidatorsByShares(); err != nil {
return err
}

Expand Down Expand Up @@ -941,7 +1047,7 @@ func (ga *GenesisState) ensureActiveSet(cdc codec.Codec) error {
totalPower := int64(0)

for i, val := range sVals {
power := val.GetDelegatorShares().QuoInt64(denomDecimalPlaces).RoundInt64()
coins := sdk.NewCoins(sdk.NewCoin(ga.app.StakingState.state.Params.BondDenom, val.Tokens))

if uint32(len(vals)) < vCount {
if val.IsJailed() {
Expand All @@ -950,10 +1056,12 @@ func (ga *GenesisState) ensureActiveSet(cdc codec.Codec) error {

if !val.IsBonded() {
sVals[i].Status = stakingtypes.Bonded
}

// bonded.Add(val.Tokens)
totalPower += power
err := ga.SendFromModuleToModule(cdc, ga.moduleAddresses.notBondedPool, ga.moduleAddresses.bondedPool, coins)
if err != nil {
return err
}
}

pubkey, _ := val.ConsPubKey()

Expand All @@ -962,6 +1070,9 @@ func (ga *GenesisState) ensureActiveSet(cdc codec.Codec) error {
return err
}

power := val.GetDelegatorShares().QuoInt64(denomDecimalPlaces).RoundInt64()
totalPower += power

vals = append(vals, tmtypes.GenesisValidator{
Address: tmPk.Address(),
PubKey: tmPk,
Expand All @@ -973,16 +1084,10 @@ func (ga *GenesisState) ensureActiveSet(cdc codec.Codec) error {
Address: val.OperatorAddress,
Power: power,
})

} else if val.IsBonded() {
sVals[i].Status = stakingtypes.Unbonding
coins := sdk.NewCoins(sdk.NewCoin("uakt", val.DelegatorShares.RoundInt()))
err := ga.DecreaseBalances(cdc, ga.moduleAddresses.bondedPool, coins)
if err != nil {
return err
}

err = ga.IncreaseBalances(cdc, ga.moduleAddresses.notBondedPool, coins)
sVals[i].UnbondingHeight = ga.doc.InitialHeight
err := ga.SendFromModuleToModule(cdc, ga.moduleAddresses.bondedPool, ga.moduleAddresses.notBondedPool, coins)
if err != nil {
return err
}
Expand Down Expand Up @@ -1033,8 +1138,7 @@ func (ga *GenesisState) AddNewAccount(cdc codec.Codec, addr sdk.AccAddress, pubk
return fmt.Errorf("account (%s) already exists", addr.String()) // nolint: goerr113
}

var genAccount authtypes.GenesisAccount
genAccount = authtypes.NewBaseAccount(addr, pubkey, ga.app.AuthState.nextAccountNumber(), 0)
genAccount := authtypes.NewBaseAccount(addr, pubkey, ga.app.AuthState.nextAccountNumber(), 0)

if err := genAccount.Validate(); err != nil {
return fmt.Errorf("failed to validate new genesis account: %s", err.Error()) // nolint: goerr113
Expand Down
5 changes: 0 additions & 5 deletions cmd/akash/cmd/testnetify/validators.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,6 @@ func (ga *GenesisState) modifyValidators(cdc codec.Codec, cfg *ValidatorsConfig)
}

for _, delegator := range val.Delegators {
// increase amount of bonded coins
if err = ga.IncreaseBalances(cdc, ga.moduleAddresses.bondedPool, delegator.Coins.ToSDK()); err != nil {
return err
}

err = ga.IncreaseDelegatorStake(
cdc,
delegator.Address.AccAddress,
Expand Down

0 comments on commit 53e8be2

Please sign in to comment.