Skip to content

Commit

Permalink
feat: asi denom replacement (#342)
Browse files Browse the repository at this point in the history
  • Loading branch information
Jonathansumner committed Apr 18, 2024
1 parent 22f1b62 commit 2730a94
Showing 1 changed file with 83 additions and 7 deletions.
90 changes: 83 additions & 7 deletions cmd/fetchd/cmd/genasiupgrade.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/spf13/cobra"
"github.com/tendermint/tendermint/types"
"regexp"
"strings"
)

const (
Expand Down Expand Up @@ -71,6 +72,15 @@ func ASIGenesisUpgradeCmd(defaultNodeHome string) *cobra.Command {
// replace addresses across the genesis file
ASIGenesisUpgradeReplaceAddresses(jsonData)

// set denom metadata in bank module
err = ASIGenesisUpgradeReplaceDenomMetadata(jsonData)
if err != nil {
return fmt.Errorf("failed to replace denom metadata: %w", err)
}

// replace denom across the genesis file
ASIGenesisUpgradeReplaceDenom(jsonData)

// replace chain-id
ASIGenesisUpgradeReplaceChainID(genDoc)

Expand All @@ -92,15 +102,81 @@ func ASIGenesisUpgradeCmd(defaultNodeHome string) *cobra.Command {
return cmd
}

func ASIGenesisUpgradeReplaceDenomMetadata() {}
func ASIGenesisUpgradeReplaceDenomMetadata(jsonData map[string]interface{}) error {
type jsonMap map[string]interface{}

NewBaseDenomUpper := strings.ToUpper(NewBaseDenom)

newMetadata := jsonMap{
"base": NewDenom,
"denom_units": []jsonMap{
{
"denom": NewBaseDenomUpper,
"exponent": 18,
},
{
"denom": fmt.Sprintf("m%s", NewBaseDenom),
"exponent": 15,
},
{
"denom": fmt.Sprintf("u%s", NewBaseDenom),
"exponent": 12,
},
{
"denom": fmt.Sprintf("n%s", NewBaseDenom),
"exponent": 9,
},
{
"denom": fmt.Sprintf("p%s", NewBaseDenom),
"exponent": 6,
},
{
"denom": fmt.Sprintf("f%s", NewBaseDenom),
"exponent": 3,
},
{
"denom": fmt.Sprintf("a%s", NewBaseDenom),
"exponent": 0,
},
},
"description": NewDescription,
"display": NewBaseDenomUpper,
"name": NewBaseDenomUpper,
"symbol": NewBaseDenomUpper,
}

bank := jsonData["bank"].(map[string]interface{})
denomMetadata := bank["denom_metadata"].([]interface{})

for i, metadata := range denomMetadata {
denomUnit := metadata.(map[string]interface{})
if denomUnit["base"] == OldDenom {
denomMetadata[i] = newMetadata
break
}
}
return nil
}

func ASIGenesisUpgradeReplaceChainID(genesisData *types.GenesisDoc) {
genesisData.ChainID = NewChainId
}

func ASIGenesisUpgradeReplaceBridgeAdmin() {}

func ASIGenesisUpgradeReplaceDenom() {}
func ASIGenesisUpgradeReplaceDenom(jsonData map[string]interface{}) {
targets := map[string]struct{}{"denom": {}, "bond_denom": {}, "mint_denom": {}, "base_denom": {}, "base": {}}

crawlJson("", jsonData, -1, func(key string, value interface{}, idx int) interface{} {
if str, ok := value.(string); ok {
_, isInTargets := targets[key]
if str == OldDenom && isInTargets {
return NewDenom
}
}
return value
})
}

func ASIGenesisUpgradeReplaceAddresses(jsonData map[string]interface{}) {
// account addresses
Expand All @@ -116,7 +192,7 @@ func ASIGenesisUpgradeReplaceAddresses(jsonData map[string]interface{}) {
func replaceAddresses(addressTypePrefix string, jsonData map[string]interface{}, dataLength int) {
re := regexp.MustCompile(fmt.Sprintf(`^%s%s1([%s]{%d})$`, OldAddrPrefix, addressTypePrefix, Bech32Chars, dataLength))

crawlJson(nil, jsonData, func(key interface{}, value interface{}) interface{} {
crawlJson("", jsonData, -1, func(key string, value interface{}, idx int) interface{} {
if str, ok := value.(string); ok {
if !re.MatchString(str) {
return value
Expand All @@ -136,19 +212,19 @@ func ASIGenesisUpgradeWithdrawIBCChannelsBalances() {}

func ASIGenesisUpgradeWithdrawReconciliationBalances() {}

func crawlJson(key interface{}, value interface{}, strHandler func(interface{}, interface{}) interface{}) interface{} {
func crawlJson(key string, value interface{}, idx int, strHandler func(string, interface{}, int) interface{}) interface{} {
switch val := value.(type) {
case string:
if strHandler != nil {
return strHandler(key, val)
return strHandler(key, val, idx)
}
case []interface{}:
for i := range val {
val[i] = crawlJson(nil, val[i], strHandler)
val[i] = crawlJson("", val[i], i, strHandler)
}
case map[string]interface{}:
for k, v := range val {
val[k] = crawlJson(k, v, strHandler)
val[k] = crawlJson(k, v, -1, strHandler)
}
}
return value
Expand Down

0 comments on commit 2730a94

Please sign in to comment.