Skip to content

Commit 99c8d7d

Browse files
authored
feat: ASI upgrade manifest (#350)
1 parent bfbf0a8 commit 99c8d7d

File tree

2 files changed

+71
-4
lines changed

2 files changed

+71
-4
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package cmd
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"github.com/cosmos/cosmos-sdk/types"
7+
config2 "github.com/tendermint/tendermint/config"
8+
"os"
9+
"path"
10+
)
11+
12+
type ASIUpgradeTransfer struct {
13+
From string `json:"from"`
14+
Amount types.Coins `json:"amount"`
15+
}
16+
17+
type ASIUpgradeTransfers struct {
18+
Transfer []ASIUpgradeTransfer `json:"transfer"`
19+
To string `json:"to"`
20+
}
21+
22+
type ASIUpgradeManifest struct {
23+
IBC *ASIUpgradeTransfers `json:"ibc,omitempty"`
24+
Reconciliation *ASIUpgradeTransfers `json:"reconciliation,omitempty"`
25+
}
26+
27+
func SaveASIManifest(manifest *ASIUpgradeManifest, config *config2.Config) error {
28+
var serialisedManifest []byte
29+
var err error
30+
if serialisedManifest, err = json.MarshalIndent(manifest, "", "\t"); err != nil {
31+
return fmt.Errorf("failed to marshal manifest: %w", err)
32+
}
33+
34+
var f *os.File
35+
const manifestFilename = "asi_upgrade_manifest.json"
36+
genesisFilePath := config.GenesisFile()
37+
manifestFilePath := path.Join(path.Dir(genesisFilePath), manifestFilename)
38+
if f, err = os.Create(manifestFilePath); err != nil {
39+
return fmt.Errorf("failed to create file \"%s\": %w", manifestFilePath, err)
40+
}
41+
defer f.Close()
42+
43+
if _, err = f.Write(serialisedManifest); err != nil {
44+
return fmt.Errorf("failed to write manifest to the \"%s\" file : %w", manifestFilePath, err)
45+
}
46+
47+
return nil
48+
}

cmd/fetchd/cmd/genasiupgrade.go

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,14 +125,16 @@ func ASIGenesisUpgradeCmd(defaultNodeHome string) *cobra.Command {
125125
ASIGenesisUpgradeReplaceBridgeAdmin(jsonData, networkConfig)
126126
}
127127

128+
manifest := ASIUpgradeManifest{}
129+
128130
// withdraw balances from IBC channels
129-
if err = ASIGenesisUpgradeWithdrawIBCChannelsBalances(jsonData, networkConfig); err != nil {
131+
if err = ASIGenesisUpgradeWithdrawIBCChannelsBalances(jsonData, networkConfig, &manifest); err != nil {
130132
return err
131133
}
132134

133135
// withdraw balances from reconciliation addresses
134136
if networkConfig.ReconciliationTargetAddr != nil {
135-
if err = ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData, networkConfig); err != nil {
137+
if err = ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData, networkConfig, &manifest); err != nil {
136138
return err
137139
}
138140
}
@@ -146,6 +148,10 @@ func ASIGenesisUpgradeCmd(defaultNodeHome string) *cobra.Command {
146148
// replace addresses across the genesis file
147149
ASIGenesisUpgradeReplaceAddresses(jsonData, networkConfig)
148150

151+
if err = SaveASIManifest(&manifest, config); err != nil {
152+
return err
153+
}
154+
149155
var encodedAppState []byte
150156
if encodedAppState, err = json.Marshal(jsonData); err != nil {
151157
return err
@@ -287,12 +293,16 @@ func replaceAddresses(addressTypePrefix string, jsonData map[string]interface{},
287293
})
288294
}
289295

290-
func ASIGenesisUpgradeWithdrawIBCChannelsBalances(jsonData map[string]interface{}, networkInfo NetworkConfig) error {
296+
func ASIGenesisUpgradeWithdrawIBCChannelsBalances(jsonData map[string]interface{}, networkInfo NetworkConfig, manifest *ASIUpgradeManifest) error {
291297
bank := jsonData[banktypes.ModuleName].(map[string]interface{})
292298
balances := bank["balances"].([]interface{})
293299
balanceMap := getGenesisBalancesMap(balances)
294300
ibcWithdrawalAddress := networkInfo.IbcTargetAddr
295301

302+
manifest.IBC = &ASIUpgradeTransfers{
303+
Transfer: []ASIUpgradeTransfer{},
304+
To: ibcWithdrawAddress,
305+
}
296306
withdrawalBalanceIdx, ok := (*balanceMap)[ibcWithdrawalAddress]
297307
if !ok {
298308
fmt.Println("failed to find Ibc withdrawal address in genesis balances - have addresses already been converted?")
@@ -322,6 +332,8 @@ func ASIGenesisUpgradeWithdrawIBCChannelsBalances(jsonData map[string]interface{
322332
channelBalanceCoins := getCoinsFromInterfaceSlice(balances[balanceIdx])
323333
withdrawalBalanceCoins := getCoinsFromInterfaceSlice(balances[withdrawalBalanceIdx])
324334

335+
manifest.IBC.Transfer = append(manifest.IBC.Transfer, ASIUpgradeTransfer{From: channelAddr, Amount: channelBalanceCoins})
336+
325337
// add channel balance to withdrawal balance
326338
newWithdrawalBalanceCoins := withdrawalBalanceCoins.Add(channelBalanceCoins...)
327339
balances[withdrawalBalanceIdx].(map[string]interface{})["coins"] = getInterfaceSliceFromCoins(newWithdrawalBalanceCoins)
@@ -358,7 +370,7 @@ func getGenesisAccountSequenceMap(accounts []interface{}) *map[string]int {
358370
return &accountMap
359371
}
360372

361-
func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interface{}, networkInfo NetworkConfig) error {
373+
func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interface{}, networkInfo NetworkConfig, manifest *ASIUpgradeManifest) error {
362374
bank := jsonData[banktypes.ModuleName].(map[string]interface{})
363375
balances := bank["balances"].([]interface{})
364376
reconciliationWithdrawAddress := networkInfo.ReconciliationTargetAddr
@@ -381,6 +393,11 @@ func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interfa
381393
return fmt.Errorf("no match in genesis for reconciliation address: %s", *reconciliationWithdrawAddress)
382394
}
383395

396+
manifest.Reconciliation = &ASIUpgradeTransfers{
397+
Transfer: []ASIUpgradeTransfer{},
398+
To: ReconciliationWithdrawAddress,
399+
}
400+
384401
for _, row := range items {
385402
addr := row[2]
386403

@@ -411,6 +428,8 @@ func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interfa
411428
newReconciliationBalanceCoins := reconciliationBalanceCoins.Add(accBalanceCoins...)
412429
reconciliationBalance.(map[string]interface{})["coins"] = getInterfaceSliceFromCoins(newReconciliationBalanceCoins)
413430

431+
manifest.Reconciliation.Transfer = append(manifest.Reconciliation.Transfer, ASIUpgradeTransfer{From: addr, Amount: accBalanceCoins})
432+
414433
// zero out the reconciliation account balance
415434
balances[balanceIdx].(map[string]interface{})["coins"] = []interface{}{}
416435
}

0 commit comments

Comments
 (0)