From fb13465f6dff30bfe156ba1bf561a0e9aa29d5f1 Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Wed, 15 May 2024 16:12:08 +0100 Subject: [PATCH 1/2] Fist take on ASI manifest impl. --- cmd/fetchd/cmd/gen_asi_upgrade_manifest.go | 43 ++++++++++++++++++++++ cmd/fetchd/cmd/genasiupgrade.go | 28 ++++++++++++-- 2 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 cmd/fetchd/cmd/gen_asi_upgrade_manifest.go diff --git a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go new file mode 100644 index 00000000..2596be14 --- /dev/null +++ b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go @@ -0,0 +1,43 @@ +package cmd + +import ( + "encoding/json" + "fmt" + "github.com/cosmos/cosmos-sdk/types" + "os" +) + +type ASIUpgradeTransfer struct { + From string `json:"from"` + Amount types.Coins `json:"amount"` +} + +type ASIUpgradeTransfers struct { + Transfer []ASIUpgradeTransfer `json:"transfer"` + To string `json:"to"` +} + +type ASIUpgradeManifest struct { + IBC *ASIUpgradeTransfers `json:"ibc"` + Reconciliation *ASIUpgradeTransfers `json:"reconciliation"` +} + +func SaveASIManifest(manifest *ASIUpgradeManifest) error { + var serialised_manifest []byte + var err error + if serialised_manifest, err = json.MarshalIndent(manifest, "", "\t"); err != nil { + return fmt.Errorf("failed to marshal manifest: %w", err) + } + + var f *os.File + const manifestFilePath = "asi_upgrade_manifest.json" + if f, err = os.Create(manifestFilePath); err != nil { + return fmt.Errorf("failed to create file \"%s\": %w", manifestFilePath, err) + } + defer f.Close() + if _, err = f.Write(serialised_manifest); err != nil { + return fmt.Errorf("failed to write manifest to the \"%s\" file : %w", manifestFilePath, err) + } + + return nil +} diff --git a/cmd/fetchd/cmd/genasiupgrade.go b/cmd/fetchd/cmd/genasiupgrade.go index 03be8764..d3752067 100644 --- a/cmd/fetchd/cmd/genasiupgrade.go +++ b/cmd/fetchd/cmd/genasiupgrade.go @@ -96,13 +96,15 @@ func ASIGenesisUpgradeCmd(defaultNodeHome string) *cobra.Command { // replace bridge contract admin ASIGenesisUpgradeReplaceBridgeAdmin(jsonData) + manifest := ASIUpgradeManifest{} + // withdraw balances from IBC channels - if err = ASIGenesisUpgradeWithdrawIBCChannelsBalances(jsonData); err != nil { + if err = ASIGenesisUpgradeWithdrawIBCChannelsBalances(jsonData, &manifest); err != nil { return err } // withdraw balances from reconciliation addresses - if err = ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData); err != nil { + if err = ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData, &manifest); err != nil { return err } @@ -115,6 +117,10 @@ func ASIGenesisUpgradeCmd(defaultNodeHome string) *cobra.Command { // replace addresses across the genesis file ASIGenesisUpgradeReplaceAddresses(jsonData) + if err = SaveASIManifest(&manifest); err != nil { + return err + } + var encodedAppState []byte if encodedAppState, err = json.Marshal(jsonData); err != nil { return err @@ -249,11 +255,16 @@ func replaceAddresses(addressTypePrefix string, jsonData map[string]interface{}, }) } -func ASIGenesisUpgradeWithdrawIBCChannelsBalances(jsonData map[string]interface{}) error { +func ASIGenesisUpgradeWithdrawIBCChannelsBalances(jsonData map[string]interface{}, manifest *ASIUpgradeManifest) error { bank := jsonData[banktypes.ModuleName].(map[string]interface{}) balances := bank["balances"].([]interface{}) balanceMap := getGenesisBalancesMap(balances) + manifest.IBC = &ASIUpgradeTransfers{ + Transfer: []ASIUpgradeTransfer{}, + To: IbcWithdrawAddress, + } + withdrawalBalanceIdx, ok := (*balanceMap)[IbcWithdrawAddress] if !ok { fmt.Println("failed to find Ibc withdrawal address in genesis balances - have addresses already been converted?") @@ -283,6 +294,8 @@ func ASIGenesisUpgradeWithdrawIBCChannelsBalances(jsonData map[string]interface{ channelBalanceCoins := getCoinsFromInterfaceSlice(balances[balanceIdx]) withdrawalBalanceCoins := getCoinsFromInterfaceSlice(balances[withdrawalBalanceIdx]) + manifest.IBC.Transfer = append(manifest.IBC.Transfer, ASIUpgradeTransfer{From: channelAddr, Amount: channelBalanceCoins}) + // add channel balance to withdrawal balance newWithdrawalBalanceCoins := withdrawalBalanceCoins.Add(channelBalanceCoins...) balances[withdrawalBalanceIdx].(map[string]interface{})["coins"] = getInterfaceSliceFromCoins(newWithdrawalBalanceCoins) @@ -319,7 +332,7 @@ func getGenesisAccountSequenceMap(accounts []interface{}) *map[string]int { return &accountMap } -func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interface{}) error { +func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interface{}, manifest *ASIUpgradeManifest) error { bank := jsonData[banktypes.ModuleName].(map[string]interface{}) balances := bank["balances"].([]interface{}) @@ -341,6 +354,11 @@ func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interfa return fmt.Errorf("no genesis match for reconciliation address: %s", ReconciliationWithdrawAddress) } + manifest.Reconciliation = &ASIUpgradeTransfers{ + Transfer: []ASIUpgradeTransfer{}, + To: ReconciliationWithdrawAddress, + } + for _, row := range items { addr := row[2] @@ -371,6 +389,8 @@ func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interfa newReconciliationBalanceCoins := reconciliationBalanceCoins.Add(accBalanceCoins...) reconciliationBalance.(map[string]interface{})["coins"] = getInterfaceSliceFromCoins(newReconciliationBalanceCoins) + manifest.Reconciliation.Transfer = append(manifest.Reconciliation.Transfer, ASIUpgradeTransfer{From: addr, Amount: accBalanceCoins}) + // zero out the reconciliation account balance balances[balanceIdx].(map[string]interface{})["coins"] = []interface{}{} } From 372f133c159efcad4aa6497a0406d3eac962eaf2 Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Wed, 15 May 2024 17:18:05 +0100 Subject: [PATCH 2/2] Specifying location for manifest json file --- cmd/fetchd/cmd/gen_asi_upgrade_manifest.go | 19 ++++++++++++------- cmd/fetchd/cmd/genasiupgrade.go | 2 +- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go index 2596be14..6527c083 100644 --- a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go +++ b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go @@ -4,7 +4,9 @@ import ( "encoding/json" "fmt" "github.com/cosmos/cosmos-sdk/types" + config2 "github.com/tendermint/tendermint/config" "os" + "path" ) type ASIUpgradeTransfer struct { @@ -18,24 +20,27 @@ type ASIUpgradeTransfers struct { } type ASIUpgradeManifest struct { - IBC *ASIUpgradeTransfers `json:"ibc"` - Reconciliation *ASIUpgradeTransfers `json:"reconciliation"` + IBC *ASIUpgradeTransfers `json:"ibc,omitempty"` + Reconciliation *ASIUpgradeTransfers `json:"reconciliation,omitempty"` } -func SaveASIManifest(manifest *ASIUpgradeManifest) error { - var serialised_manifest []byte +func SaveASIManifest(manifest *ASIUpgradeManifest, config *config2.Config) error { + var serialisedManifest []byte var err error - if serialised_manifest, err = json.MarshalIndent(manifest, "", "\t"); err != nil { + if serialisedManifest, err = json.MarshalIndent(manifest, "", "\t"); err != nil { return fmt.Errorf("failed to marshal manifest: %w", err) } var f *os.File - const manifestFilePath = "asi_upgrade_manifest.json" + const manifestFilename = "asi_upgrade_manifest.json" + genesisFilePath := config.GenesisFile() + manifestFilePath := path.Join(path.Dir(genesisFilePath), manifestFilename) if f, err = os.Create(manifestFilePath); err != nil { return fmt.Errorf("failed to create file \"%s\": %w", manifestFilePath, err) } defer f.Close() - if _, err = f.Write(serialised_manifest); err != nil { + + if _, err = f.Write(serialisedManifest); err != nil { return fmt.Errorf("failed to write manifest to the \"%s\" file : %w", manifestFilePath, err) } diff --git a/cmd/fetchd/cmd/genasiupgrade.go b/cmd/fetchd/cmd/genasiupgrade.go index d3752067..cb56f7f4 100644 --- a/cmd/fetchd/cmd/genasiupgrade.go +++ b/cmd/fetchd/cmd/genasiupgrade.go @@ -117,7 +117,7 @@ func ASIGenesisUpgradeCmd(defaultNodeHome string) *cobra.Command { // replace addresses across the genesis file ASIGenesisUpgradeReplaceAddresses(jsonData) - if err = SaveASIManifest(&manifest); err != nil { + if err = SaveASIManifest(&manifest, config); err != nil { return err }