From 2ea148d27469997ad77073912620d9e7c059373b Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Tue, 4 Jun 2024 22:50:05 +0100 Subject: [PATCH 01/26] Reconciliation contract admin --- cmd/fetchd/cmd/genesis-asi-upgrade.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index ee4f5ae5..6250ec15 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -104,7 +104,8 @@ var networkInfos = map[string]NetworkConfig{ NewAdmin: "fetch15p3rl5aavw9rtu86tna5lgxfkz67zzr6ed4yhw", }, Reconciliation: &Reconciliation{ - Addr: "fetch1tynmzk68pq6kzawqffrqdhquq475gw9ccmlf9gk24mxjjy6ugl3q70aeyd", + Addr: "fetch1tynmzk68pq6kzawqffrqdhquq475gw9ccmlf9gk24mxjjy6ugl3q70aeyd", + NewAdmin: "fetch15p3rl5aavw9rtu86tna5lgxfkz67zzr6ed4yhw", }, FccCw20: &FccCw20{ Addr: "fetch1vsarnyag5d2c72k86yh2aq4l5jxhwz8fms6yralxqggxzmmwnq4q0avxv7", @@ -1055,5 +1056,6 @@ type FccIssuance struct { } type Reconciliation struct { - Addr string + Addr string + NewAdmin string } From f40a11225c021f6a48866eefeb63eb83bcd1ec8f Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Wed, 5 Jun 2024 13:03:08 +0100 Subject: [PATCH 02/26] Preliminary implemenetation --- cmd/fetchd/cmd/gen_asi_upgrade_manifest.go | 17 ++++-- cmd/fetchd/cmd/genesis-asi-upgrade.go | 61 ++++++++++++++++++++-- 2 files changed, 71 insertions(+), 7 deletions(-) diff --git a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go index 680920dc..27d2c8aa 100644 --- a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go +++ b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go @@ -19,6 +19,17 @@ type ASIUpgradeTransfers struct { To string `json:"to"` } +type ASIUpgradeReconciliationTransfer struct { + From string `json:"from"` + EthAddr string `json:"eth_addr"` + Amount types.Coins `json:"amount"` +} + +type ASIUpgradeReconciliationTransfers struct { + Transfer []ASIUpgradeReconciliationTransfer `json:"transfer"` + To string `json:"to"` +} + type ASIUpgradeSupply struct { LandingAddress string `json:"landing_address"` MintedAmount types.Coins `json:"minted_amount"` @@ -26,9 +37,9 @@ type ASIUpgradeSupply struct { } type ASIUpgradeManifest struct { - Supply *ASIUpgradeSupply `json:"supply,omitempty"` - IBC *ASIUpgradeTransfers `json:"ibc,omitempty"` - Reconciliation *ASIUpgradeTransfers `json:"reconciliation,omitempty"` + Supply *ASIUpgradeSupply `json:"supply,omitempty"` + IBC *ASIUpgradeTransfers `json:"ibc,omitempty"` + Reconciliation *ASIUpgradeReconciliationTransfers `json:"reconciliation,omitempty"` } func SaveASIManifest(manifest *ASIUpgradeManifest, config *config2.Config) error { diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index 6250ec15..e54ef62e 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -44,6 +44,8 @@ const ( ) var ( + // Reconciliation balances contract state key + reconciliationBalancesKey = prefixStringWithLength("balances") // Mobix staking contract keys stakesKey = prefixStringWithLength("stakes") unbondEntriesKey = prefixStringWithLength("unbond_entries") @@ -515,6 +517,7 @@ func prefixStringWithLength(val string) []byte { return buffer.Bytes() } + func replaceAddressInContractStateKey(keyBytes []byte, prefix []byte) string { newAddr, err := convertAddressToASI(string(keyBytes[len(prefix):]), AccAddressPrefix) if err != nil { @@ -525,6 +528,42 @@ func replaceAddressInContractStateKey(keyBytes []byte, prefix []byte) string { return hex.EncodeToString(key) } +func reconciliationStateBalancesRecord(ethAddr string, coins sdk.Coins, networkConfig *NetworkConfig) *map[string]string { + for _, coin := range coins { + if coin.Denom != networkConfig.DenomInfo.OldDenom { + continue + } + + var buffer bytes.Buffer + writer := bufio.NewWriter(&buffer) + + if _, err := writer.Write(reconciliationBalancesKey); err != nil { + panic(err) + } + if _, err := writer.WriteString(ethAddr); err != nil { + panic(err) + } + if err := writer.Flush(); err != nil { + panic(err) + } + + amount := coin.Amount + + if amount.IsNegative() { + panic(fmt.Errorf("netgative amount value for ethereum '%s' address", ethAddr)) + } + + balanceRecord := map[string]string{ + "key": hex.EncodeToString(buffer.Bytes()), + "value": base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("\"%s\"", amount.String()))), + } + + return &balanceRecord + } + + return nil +} + func ASIGenesisUpgradeReplaceDenomMetadata(jsonData map[string]interface{}, networkInfo NetworkConfig) { type jsonMap map[string]interface{} @@ -806,12 +845,16 @@ func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interfa panic("no match in genesis for reconciliation withdraw address") } - manifest.Reconciliation = &ASIUpgradeTransfers{ - Transfer: []ASIUpgradeTransfer{}, + reconciliationContract := getContractFromAddr(reconciliationWithdrawAddress, jsonData) + var reconciliationContractState []interface{} + + manifest.Reconciliation = &ASIUpgradeReconciliationTransfers{ + Transfer: []ASIUpgradeReconciliationTransfer{}, To: reconciliationWithdrawAddress, } for _, row := range networkInfo.ReconciliationInfo.InputCSVRecords { + ethAddr := row[0] addr := row[2] accSequence, ok := (*accountSequenceMap)[addr] @@ -825,6 +868,7 @@ func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interfa } accBalance := balances[balanceIdx] + // Function below sanitise returned coins = removes zero balances & sorts coins based on denom accBalanceCoins := getCoinsFromInterfaceSlice(accBalance) reconciliationBalance := balances[reconciliationBalanceIdx] @@ -839,11 +883,18 @@ 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{}{} + + newContractStateBalancesRecord := reconciliationStateBalancesRecord(ethAddr, accBalanceCoins, &networkInfo) + if newContractStateBalancesRecord != nil { + reconciliationContractState = append(reconciliationContractState, *newContractStateBalancesRecord) + } + + manifest.Reconciliation.Transfer = append(manifest.Reconciliation.Transfer, ASIUpgradeReconciliationTransfer{From: addr, EthAddr: ethAddr, Amount: accBalanceCoins}) } + + reconciliationContract["contract_state"] = reconciliationContractState } func ASIGenesisUpgradeASISupply(jsonData map[string]interface{}, networkInfo NetworkConfig, manifest *ASIUpgradeManifest) { @@ -969,6 +1020,8 @@ func getCoinsFromInterfaceSlice(data interface{}) sdk.Coins { } balanceCoins = append(balanceCoins, sdk.NewCoin(coinDenom, coinAmount)) } + + balanceCoins = sdk.NewCoins(balanceCoins...) return balanceCoins } From 249980bfafdffb264f95b512a77e7aaa5d97a181 Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Wed, 5 Jun 2024 13:09:08 +0100 Subject: [PATCH 03/26] Utilising std.Coins.AmountOfNoDenomValidation(...) --- cmd/fetchd/cmd/genesis-asi-upgrade.go | 50 ++++++++++++--------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index e54ef62e..752f18bb 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -529,39 +529,33 @@ func replaceAddressInContractStateKey(keyBytes []byte, prefix []byte) string { } func reconciliationStateBalancesRecord(ethAddr string, coins sdk.Coins, networkConfig *NetworkConfig) *map[string]string { - for _, coin := range coins { - if coin.Denom != networkConfig.DenomInfo.OldDenom { - continue - } - - var buffer bytes.Buffer - writer := bufio.NewWriter(&buffer) - - if _, err := writer.Write(reconciliationBalancesKey); err != nil { - panic(err) - } - if _, err := writer.WriteString(ethAddr); err != nil { - panic(err) - } - if err := writer.Flush(); err != nil { - panic(err) - } - - amount := coin.Amount + amount := coins.AmountOfNoDenomValidation(networkConfig.DenomInfo.OldDenom) + if amount.IsZero() { + return nil + } + if amount.IsNegative() { + panic(fmt.Errorf("netgative amount value for ethereum '%s' address", ethAddr)) + } - if amount.IsNegative() { - panic(fmt.Errorf("netgative amount value for ethereum '%s' address", ethAddr)) - } + var buffer bytes.Buffer + writer := bufio.NewWriter(&buffer) - balanceRecord := map[string]string{ - "key": hex.EncodeToString(buffer.Bytes()), - "value": base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("\"%s\"", amount.String()))), - } + if _, err := writer.Write(reconciliationBalancesKey); err != nil { + panic(err) + } + if _, err := writer.WriteString(ethAddr); err != nil { + panic(err) + } + if err := writer.Flush(); err != nil { + panic(err) + } - return &balanceRecord + balanceRecord := map[string]string{ + "key": hex.EncodeToString(buffer.Bytes()), + "value": base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("\"%s\"", amount.String()))), } - return nil + return &balanceRecord } func ASIGenesisUpgradeReplaceDenomMetadata(jsonData map[string]interface{}, networkInfo NetworkConfig) { From 1f4f231bda0542aba235dc9c9411444447dab7df Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Wed, 5 Jun 2024 14:06:08 +0100 Subject: [PATCH 04/26] Extending manifest with reconciliation state record and aggr. values --- cmd/fetchd/cmd/gen_asi_upgrade_manifest.go | 27 +++++++++++++---- cmd/fetchd/cmd/genesis-asi-upgrade.go | 35 ++++++++++++++-------- 2 files changed, 45 insertions(+), 17 deletions(-) diff --git a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go index 27d2c8aa..db99d6f6 100644 --- a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go +++ b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go @@ -26,8 +26,25 @@ type ASIUpgradeReconciliationTransfer struct { } type ASIUpgradeReconciliationTransfers struct { - Transfer []ASIUpgradeReconciliationTransfer `json:"transfer"` - To string `json:"to"` + Transfers []ASIUpgradeReconciliationTransfer `json:"transfers"` + To string `json:"to"` + AggregatedBalancesAmount types.Coins `json:"aggregated_transferred_amount"` + NumberOfTransfers int `json:"number_of_transfers"` +} + +type ASIUpgradeReconciliationContractStateBalanceRecord struct { + EthAddr string `json:"eth_addr"` + Amount types.Int `json:"amount"` +} + +type ASIUpgradeReconciliationContractState struct { + Balances []ASIUpgradeReconciliationContractStateBalanceRecord `json:"balances"` + AggregatedBalancesAmount types.Int `json:"aggregated_balances_amount"` + NumberOfBalanceRecords int `json:"number_of_balance_records"` +} +type ASIUpgradeReconciliation struct { + Transfers ASIUpgradeReconciliationTransfers `json:"transfers"` + ContractState ASIUpgradeReconciliationContractState `json:"contract_state"` } type ASIUpgradeSupply struct { @@ -37,9 +54,9 @@ type ASIUpgradeSupply struct { } type ASIUpgradeManifest struct { - Supply *ASIUpgradeSupply `json:"supply,omitempty"` - IBC *ASIUpgradeTransfers `json:"ibc,omitempty"` - Reconciliation *ASIUpgradeReconciliationTransfers `json:"reconciliation,omitempty"` + Supply *ASIUpgradeSupply `json:"supply,omitempty"` + IBC *ASIUpgradeTransfers `json:"ibc,omitempty"` + Reconciliation *ASIUpgradeReconciliation `json:"reconciliation,omitempty"` } func SaveASIManifest(manifest *ASIUpgradeManifest, config *config2.Config) error { diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index 752f18bb..15d36685 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -528,10 +528,10 @@ func replaceAddressInContractStateKey(keyBytes []byte, prefix []byte) string { return hex.EncodeToString(key) } -func reconciliationStateBalancesRecord(ethAddr string, coins sdk.Coins, networkConfig *NetworkConfig) *map[string]string { +func reconciliationContractStateBalancesRecord(ethAddr string, coins sdk.Coins, networkConfig *NetworkConfig) (*map[string]string, sdk.Int) { amount := coins.AmountOfNoDenomValidation(networkConfig.DenomInfo.OldDenom) if amount.IsZero() { - return nil + return nil, amount } if amount.IsNegative() { panic(fmt.Errorf("netgative amount value for ethereum '%s' address", ethAddr)) @@ -555,7 +555,17 @@ func reconciliationStateBalancesRecord(ethAddr string, coins sdk.Coins, networkC "value": base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("\"%s\"", amount.String()))), } - return &balanceRecord + return &balanceRecord, amount +} + +func addReconciliationContractStateBalancesRecord(contractStateRecords *[]interface{}, ethAddr string, coins sdk.Coins, networkConfig *NetworkConfig, manifest *ASIUpgradeManifest) { + newContractStateBalancesRecord, amount := reconciliationContractStateBalancesRecord(ethAddr, coins, networkConfig) + if newContractStateBalancesRecord != nil { + *contractStateRecords = append(*contractStateRecords, *newContractStateBalancesRecord) + manifest.Reconciliation.ContractState.Balances = append(manifest.Reconciliation.ContractState.Balances, ASIUpgradeReconciliationContractStateBalanceRecord{EthAddr: ethAddr, Amount: amount}) + manifest.Reconciliation.ContractState.AggregatedBalancesAmount = manifest.Reconciliation.ContractState.AggregatedBalancesAmount.Add(amount) + manifest.Reconciliation.ContractState.NumberOfBalanceRecords += 1 + } } func ASIGenesisUpgradeReplaceDenomMetadata(jsonData map[string]interface{}, networkInfo NetworkConfig) { @@ -842,9 +852,11 @@ func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interfa reconciliationContract := getContractFromAddr(reconciliationWithdrawAddress, jsonData) var reconciliationContractState []interface{} - manifest.Reconciliation = &ASIUpgradeReconciliationTransfers{ - Transfer: []ASIUpgradeReconciliationTransfer{}, - To: reconciliationWithdrawAddress, + manifest.Reconciliation = &ASIUpgradeReconciliation{ + Transfers: ASIUpgradeReconciliationTransfers{ + To: reconciliationWithdrawAddress, + }, + ContractState: ASIUpgradeReconciliationContractState{}, } for _, row := range networkInfo.ReconciliationInfo.InputCSVRecords { @@ -862,7 +874,7 @@ func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interfa } accBalance := balances[balanceIdx] - // Function below sanitise returned coins = removes zero balances & sorts coins based on denom + // Function below sanitises returned coins = removes zero balances & sorts coins based on denom accBalanceCoins := getCoinsFromInterfaceSlice(accBalance) reconciliationBalance := balances[reconciliationBalanceIdx] @@ -880,12 +892,11 @@ func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interfa // zero out the reconciliation account balance balances[balanceIdx].(map[string]interface{})["coins"] = []interface{}{} - newContractStateBalancesRecord := reconciliationStateBalancesRecord(ethAddr, accBalanceCoins, &networkInfo) - if newContractStateBalancesRecord != nil { - reconciliationContractState = append(reconciliationContractState, *newContractStateBalancesRecord) - } + manifest.Reconciliation.Transfers.Transfers = append(manifest.Reconciliation.Transfers.Transfers, ASIUpgradeReconciliationTransfer{From: addr, EthAddr: ethAddr, Amount: accBalanceCoins}) + manifest.Reconciliation.Transfers.NumberOfTransfers += 1 + manifest.Reconciliation.Transfers.AggregatedBalancesAmount = manifest.Reconciliation.Transfers.AggregatedBalancesAmount.Add(accBalanceCoins...) - manifest.Reconciliation.Transfer = append(manifest.Reconciliation.Transfer, ASIUpgradeReconciliationTransfer{From: addr, EthAddr: ethAddr, Amount: accBalanceCoins}) + addReconciliationContractStateBalancesRecord(&reconciliationContractState, ethAddr, accBalanceCoins, &networkInfo, manifest) } reconciliationContract["contract_state"] = reconciliationContractState From aee6ea95b110d6429bb826b275039aaa63640feb Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Wed, 5 Jun 2024 15:13:02 +0100 Subject: [PATCH 05/26] Reconciliation contract: Adding setup of Item<...> states --- cmd/fetchd/cmd/genesis-asi-upgrade.go | 44 ++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index 15d36685..ec761ddd 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -45,7 +45,11 @@ const ( var ( // Reconciliation balances contract state key - reconciliationBalancesKey = prefixStringWithLength("balances") + reconciliationBalancesKey = prefixStringWithLength("balances") + reconciliationTotalBalanceKey = []byte("total_balance") + reconciliationNOutstandingAddressesKey = []byte("n_outstanding_addresses") + reconciliationStatesKey = []byte("state") + // Mobix staking contract keys stakesKey = prefixStringWithLength("stakes") unbondEntriesKey = prefixStringWithLength("unbond_entries") @@ -568,6 +572,38 @@ func addReconciliationContractStateBalancesRecord(contractStateRecords *[]interf } } +func addReconciliationContractState(contractStateRecords *[]interface{}, networkConfig *NetworkConfig, manifest *ASIUpgradeManifest) { + totalBalanceRecordEnc := map[string]string{ + "key": hex.EncodeToString(reconciliationTotalBalanceKey), + "value": base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("\"%s\"", manifest.Reconciliation.ContractState.AggregatedBalancesAmount.String()))), + } + + nOutstandingAddressesRecordEnc := map[string]string{ + "key": hex.EncodeToString(reconciliationNOutstandingAddressesKey), + "value": base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%v", manifest.Reconciliation.ContractState.NumberOfBalanceRecords))), + } + + stateRecord := ReconciliationContractStateRecord{ + Denom: networkConfig.DenomInfo.NewDenom, + Paused: true, + } + + var err error + var stateRecordJSONStr []byte + stateRecordJSONStr, err = json.Marshal(stateRecord) + if err == nil { + panic(err) + } + stateRecordEnc := map[string]string{ + "key": hex.EncodeToString(reconciliationStatesKey), + "value": base64.StdEncoding.EncodeToString(stateRecordJSONStr), + } + + *contractStateRecords = append(*contractStateRecords, totalBalanceRecordEnc) + *contractStateRecords = append(*contractStateRecords, nOutstandingAddressesRecordEnc) + *contractStateRecords = append(*contractStateRecords, stateRecordEnc) +} + func ASIGenesisUpgradeReplaceDenomMetadata(jsonData map[string]interface{}, networkInfo NetworkConfig) { type jsonMap map[string]interface{} @@ -899,6 +935,7 @@ func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interfa addReconciliationContractStateBalancesRecord(&reconciliationContractState, ethAddr, accBalanceCoins, &networkInfo, manifest) } + addReconciliationContractState(&reconciliationContractState, &networkInfo, manifest) reconciliationContract["contract_state"] = reconciliationContractState } @@ -1117,3 +1154,8 @@ type Reconciliation struct { Addr string NewAdmin string } + +type ReconciliationContractStateRecord struct { + Denom string `json:"denom"` + Paused bool `json:"paused"` +} From 0a00997e53c08b14568cb8caedce0f61729a1588 Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Wed, 5 Jun 2024 15:49:04 +0100 Subject: [PATCH 06/26] Refactoring admin update code --- cmd/fetchd/cmd/genesis-asi-upgrade.go | 54 ++++++++++++++++----------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index 6250ec15..a928bedc 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -91,21 +91,21 @@ var networkInfos = map[string]NetworkConfig{ }, Contracts: &Contracts{ Almanac: &Almanac{ - StagingAddr: "fetch1mezzhfj7qgveewzwzdk6lz5sae4dunpmmsjr9u7z0tpmdsae8zmquq3y0y", + ProdAddr: "fetch1mezzhfj7qgveewzwzdk6lz5sae4dunpmmsjr9u7z0tpmdsae8zmquq3y0y", }, AName: &AName{ - StagingAddr: "fetch1479lwv5vy8skute5cycuz727e55spkhxut0valrcm38x9caa2x8q99ef0q", + ProdAddr: "fetch1479lwv5vy8skute5cycuz727e55spkhxut0valrcm38x9caa2x8q99ef0q", }, MobixStaking: &MobixStaking{ Addresses: []string{"fetch174kgn5rtw4kf6f938wm7kwh70h2v4vcfcnfkl0", "fetch1sh36qn08g4cqg685cfzmyxqv2952q6r8actxru"}, }, TokenBridge: &TokenBridge{ Addr: "fetch1qxxlalvsdjd07p07y3rc5fu6ll8k4tmetpha8n", - NewAdmin: "fetch15p3rl5aavw9rtu86tna5lgxfkz67zzr6ed4yhw", + NewAdmin: getStringPtr("fetch15p3rl5aavw9rtu86tna5lgxfkz67zzr6ed4yhw"), }, Reconciliation: &Reconciliation{ Addr: "fetch1tynmzk68pq6kzawqffrqdhquq475gw9ccmlf9gk24mxjjy6ugl3q70aeyd", - NewAdmin: "fetch15p3rl5aavw9rtu86tna5lgxfkz67zzr6ed4yhw", + NewAdmin: getStringPtr("fetch15p3rl5aavw9rtu86tna5lgxfkz67zzr6ed4yhw"), }, FccCw20: &FccCw20{ Addr: "fetch1vsarnyag5d2c72k86yh2aq4l5jxhwz8fms6yralxqggxzmmwnq4q0avxv7", @@ -132,12 +132,12 @@ var networkInfos = map[string]NetworkConfig{ }, Contracts: &Contracts{ Almanac: &Almanac{ - StagingAddr: "fetch1tjagw8g8nn4cwuw00cf0m5tl4l6wfw9c0ue507fhx9e3yrsck8zs0l3q4w", // testnet STAGING contract, - DevAddr: "fetch135h26ys2nwqealykzey532gamw4l4s07aewpwc0cyd8z6m92vyhsplf0vp", // testnet DEVELOPMENT contract, + ProdAddr: "fetch1tjagw8g8nn4cwuw00cf0m5tl4l6wfw9c0ue507fhx9e3yrsck8zs0l3q4w", + DevAddr: "fetch135h26ys2nwqealykzey532gamw4l4s07aewpwc0cyd8z6m92vyhsplf0vp", }, AName: &AName{ - DevAddr: "fetch1kewgfwxwtuxcnppr547wj6sd0e5fkckyp48dazsh89hll59epgpspmh0tn", // testnet DEVELOPMENT contract, - StagingAddr: "fetch1mxz8kn3l5ksaftx8a9pj9a6prpzk2uhxnqdkwuqvuh37tw80xu6qges77l", // testnet STAGING contract, + ProdAddr: "fetch1mxz8kn3l5ksaftx8a9pj9a6prpzk2uhxnqdkwuqvuh37tw80xu6qges77l", + DevAddr: "fetch1kewgfwxwtuxcnppr547wj6sd0e5fkckyp48dazsh89hll59epgpspmh0tn", }, MobixStaking: &MobixStaking{ Addresses: []string{"fetch1xr3rq8yvd7qplsw5yx90ftsr2zdhg4e9z60h5duusgxpv72hud3szdul6e"}, @@ -590,17 +590,14 @@ func ASIGenesisUpgradeReplaceChainID(genesisData *types.GenesisDoc, networkInfo } func ASIGenesisUpgradeReplaceBridgeAdmin(jsonData map[string]interface{}, networkInfo NetworkConfig) { - if networkInfo.Contracts == nil || networkInfo.Contracts.TokenBridge == nil || networkInfo.Contracts.TokenBridge.NewAdmin == "" { + if networkInfo.Contracts == nil || networkInfo.Contracts.TokenBridge == nil { return } tokenBridgeContractAddress := networkInfo.Contracts.TokenBridge.Addr tokenBridgeContract := getContractFromAddr(tokenBridgeContractAddress, jsonData) - // replace token bridge admin - contractInfo := tokenBridgeContract["contract_info"].(map[string]interface{}) - contractInfo["admin"] = networkInfo.Contracts.TokenBridge.NewAdmin - return + replaceContractAdmin(tokenBridgeContract, networkInfo.Contracts.TokenBridge.NewAdmin) } func ASIGenesisUpgradeReplaceDenom(jsonData map[string]interface{}, networkInfo NetworkConfig) { @@ -624,7 +621,7 @@ func ASIGenesisUpgradeReplaceAlmanacState(jsonData map[string]interface{}, netwo return } - for _, addr := range []string{networkInfo.Contracts.Almanac.StagingAddr, networkInfo.Contracts.Almanac.DevAddr} { + for _, addr := range []string{networkInfo.Contracts.Almanac.ProdAddr, networkInfo.Contracts.Almanac.DevAddr} { if addr == "" { continue } @@ -643,6 +640,8 @@ func ASIGenesisUpgradeReplaceReconciliationState(jsonData map[string]interface{} reconciliationContract := getContractFromAddr(config.Contracts.Reconciliation.Addr, jsonData) reconciliationContract["contract_state"] = []interface{}{} + + replaceContractAdmin(reconciliationContract, config.Contracts.Reconciliation.NewAdmin) } func ASIGenesisUpgradeReplaceANameState(jsonData map[string]interface{}, networkInfo NetworkConfig) { @@ -650,7 +649,7 @@ func ASIGenesisUpgradeReplaceANameState(jsonData map[string]interface{}, network return } - for _, addr := range []string{networkInfo.Contracts.AName.StagingAddr, networkInfo.Contracts.AName.DevAddr} { + for _, addr := range []string{networkInfo.Contracts.AName.ProdAddr, networkInfo.Contracts.AName.DevAddr} { if addr == "" { continue } @@ -923,6 +922,15 @@ func convertAddressToASI(addr string, addressPrefix string) (string, error) { return newAddress, nil } +func replaceContractAdmin(genesisContractStruct map[string]interface{}, newAdmin *string) { + if newAdmin == nil { + return + } + + contractInfo := genesisContractStruct["contract_info"].(map[string]interface{}) + contractInfo["admin"] = newAdmin +} + func crawlJson(key string, value interface{}, idx int, strHandler func(string, interface{}, int) interface{}) interface{} { switch val := value.(type) { case string: @@ -992,6 +1000,10 @@ func readInputReconciliationData(csvData []byte) [][]string { return records } +func getStringPtr(val string) *string { + return &val +} + type NetworkConfig struct { NewChainID string NewDescription string @@ -1030,17 +1042,17 @@ type Contracts struct { type TokenBridge struct { Addr string - NewAdmin string + NewAdmin *string } type Almanac struct { - DevAddr string - StagingAddr string + DevAddr string + ProdAddr string } type AName struct { - DevAddr string - StagingAddr string + DevAddr string + ProdAddr string } type MobixStaking struct { @@ -1057,5 +1069,5 @@ type FccIssuance struct { type Reconciliation struct { Addr string - NewAdmin string + NewAdmin *string } From c02525998eb9710b22c4563477a58ef813115949 Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Wed, 5 Jun 2024 17:26:35 +0100 Subject: [PATCH 07/26] Reconciliation: Separating transfers and contract state handling --- cmd/fetchd/cmd/gen_asi_upgrade_manifest.go | 4 +-- cmd/fetchd/cmd/genesis-asi-upgrade.go | 40 +++++++++++----------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go index db99d6f6..8f2709d4 100644 --- a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go +++ b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go @@ -43,8 +43,8 @@ type ASIUpgradeReconciliationContractState struct { NumberOfBalanceRecords int `json:"number_of_balance_records"` } type ASIUpgradeReconciliation struct { - Transfers ASIUpgradeReconciliationTransfers `json:"transfers"` - ContractState ASIUpgradeReconciliationContractState `json:"contract_state"` + Transfers ASIUpgradeReconciliationTransfers `json:"transfers"` + ContractState *ASIUpgradeReconciliationContractState `json:"contract_state"` } type ASIUpgradeSupply struct { diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index 4be30578..93f218ca 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -229,9 +229,6 @@ func ASIGenesisUpgradeCmd(defaultNodeHome string) *cobra.Command { // update fcc issuance contract ASIGenesisUpgradeUpdateFccIssuanceContract(jsonData, networkConfig) - // replace reconciliation contract state - ASIGenesisUpgradeReplaceReconciliationState(jsonData, networkConfig) - // withdraw balances from IBC channels ASIGenesisUpgradeWithdrawIBCChannelsBalances(jsonData, networkConfig, &manifest) @@ -712,15 +709,25 @@ func ASIGenesisUpgradeReplaceAlmanacState(jsonData map[string]interface{}, netwo } } -func ASIGenesisUpgradeReplaceReconciliationState(jsonData map[string]interface{}, config NetworkConfig) { - if config.Contracts == nil || config.Contracts.Reconciliation == nil { +func ASIGenesisUpgradeReplaceReconciliationState(jsonData map[string]interface{}, networkConfig NetworkConfig, manifest *ASIUpgradeManifest) { + if networkConfig.Contracts == nil || networkConfig.Contracts.Reconciliation == nil || networkConfig.Contracts.Reconciliation.Addr != "" || len(manifest.Reconciliation.Transfers.Transfers) < 1 { return } - reconciliationContract := getContractFromAddr(config.Contracts.Reconciliation.Addr, jsonData) - reconciliationContract["contract_state"] = []interface{}{} + reconciliationContract := getContractFromAddr(networkConfig.Contracts.Reconciliation.Addr, jsonData) + var reconciliationContractState []interface{} + + contractStateManifest := ASIUpgradeReconciliationContractState{} + manifest.Reconciliation.ContractState = &contractStateManifest + + replaceContractAdmin(reconciliationContract, networkConfig.Contracts.Reconciliation.NewAdmin) + + for _, transfer := range manifest.Reconciliation.Transfers.Transfers { + addReconciliationContractStateBalancesRecord(&reconciliationContractState, transfer.EthAddr, transfer.Amount, &networkConfig, manifest) + } - replaceContractAdmin(reconciliationContract, config.Contracts.Reconciliation.NewAdmin) + addReconciliationContractState(&reconciliationContractState, &networkConfig, manifest) + reconciliationContract["contract_state"] = reconciliationContractState } func ASIGenesisUpgradeReplaceANameState(jsonData map[string]interface{}, networkInfo NetworkConfig) { @@ -864,14 +871,14 @@ func getGenesisAccountSequenceMap(accounts []interface{}) *map[string]int { return &accountMap } -func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interface{}, networkInfo NetworkConfig, manifest *ASIUpgradeManifest) { - if networkInfo.ReconciliationInfo == nil { +func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interface{}, networkConfig NetworkConfig, manifest *ASIUpgradeManifest) { + if networkConfig.ReconciliationInfo == nil { return } bank := jsonData[banktypes.ModuleName].(map[string]interface{}) balances := bank["balances"].([]interface{}) - reconciliationWithdrawAddress := networkInfo.ReconciliationInfo.TargetAddress + reconciliationWithdrawAddress := networkConfig.ReconciliationInfo.TargetAddress balanceMap := getGenesisBalancesMap(balances) @@ -884,17 +891,13 @@ func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interfa panic("no match in genesis for reconciliation withdraw address") } - reconciliationContract := getContractFromAddr(reconciliationWithdrawAddress, jsonData) - var reconciliationContractState []interface{} - manifest.Reconciliation = &ASIUpgradeReconciliation{ Transfers: ASIUpgradeReconciliationTransfers{ To: reconciliationWithdrawAddress, }, - ContractState: ASIUpgradeReconciliationContractState{}, } - for _, row := range networkInfo.ReconciliationInfo.InputCSVRecords { + for _, row := range networkConfig.ReconciliationInfo.InputCSVRecords { ethAddr := row[0] addr := row[2] @@ -930,12 +933,9 @@ func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interfa manifest.Reconciliation.Transfers.Transfers = append(manifest.Reconciliation.Transfers.Transfers, ASIUpgradeReconciliationTransfer{From: addr, EthAddr: ethAddr, Amount: accBalanceCoins}) manifest.Reconciliation.Transfers.NumberOfTransfers += 1 manifest.Reconciliation.Transfers.AggregatedBalancesAmount = manifest.Reconciliation.Transfers.AggregatedBalancesAmount.Add(accBalanceCoins...) - - addReconciliationContractStateBalancesRecord(&reconciliationContractState, ethAddr, accBalanceCoins, &networkInfo, manifest) } - addReconciliationContractState(&reconciliationContractState, &networkInfo, manifest) - reconciliationContract["contract_state"] = reconciliationContractState + ASIGenesisUpgradeReplaceReconciliationState(jsonData, networkConfig, manifest) } func ASIGenesisUpgradeASISupply(jsonData map[string]interface{}, networkInfo NetworkConfig, manifest *ASIUpgradeManifest) { From a25bf6c0d858b4b3aa6078382b8344263d0c24dd Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Wed, 5 Jun 2024 18:08:14 +0100 Subject: [PATCH 08/26] Adding ethereum addresses & pub keys to reconciliation .csv file --- cmd/fetchd/cmd/reconciliation_data_testnet.csv | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/fetchd/cmd/reconciliation_data_testnet.csv b/cmd/fetchd/cmd/reconciliation_data_testnet.csv index 1a7ed10f..91aefebb 100644 --- a/cmd/fetchd/cmd/reconciliation_data_testnet.csv +++ b/cmd/fetchd/cmd/reconciliation_data_testnet.csv @@ -1,3 +1,3 @@ -,,fetch1uvye96zkp86egcwrnsff22ama3c0m8h2aemmsd,,, -,,fetch1kydzrk0ylc60zt34m00qttev5h3dgz72scl79d,,, -,,fetch1753h55um54pnskd77x0pfpv3le2e4cdhf3dhqc,,, +0x0b3777b5Dbea0C579c05898E7160351F114B9E08,0490657da13c62de6495a39958aa864d0a1beff1f4cf65ad1a86c67362b94eb1f35eff0eb1f9ccba919d909707adda21531d286fdff74f9a94f2d63e7979ce26c5,fetch1uvye96zkp86egcwrnsff22ama3c0m8h2aemmsd,,, +0x6ACBEDc7616dA8AB5Cf0bB04fC3aA8CbB2629675,04b049b9a4e0745990f1dd2f95c0940f6ef6e34e6a61735de007faef914698ccdc9d0503cf00558819f744554bfd33895aeada4357b2a6bfb44332b08da8a52c14,fetch1kydzrk0ylc60zt34m00qttev5h3dgz72scl79d,,, +0x3Ffa3598647e93136cf02434629b500E5a40473A,04f40cc694aa1f42b5eaa97ba9500001573f5aa4ef06114837bc972538bf0a67a93d9507472d4562532d9344767bffa20db3034653f34f20958aef135d97afc622,fetch1753h55um54pnskd77x0pfpv3le2e4cdhf3dhqc,,, From a8175c3a8e49b489c00deb55150eb95439c97c20 Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Wed, 5 Jun 2024 20:19:41 +0100 Subject: [PATCH 09/26] Fix of inverted boolean operator in reconciliation state update --- cmd/fetchd/cmd/genesis-asi-upgrade.go | 2 +- scripts/Pipfile.lock | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index 93f218ca..1b70ce9d 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -710,7 +710,7 @@ func ASIGenesisUpgradeReplaceAlmanacState(jsonData map[string]interface{}, netwo } func ASIGenesisUpgradeReplaceReconciliationState(jsonData map[string]interface{}, networkConfig NetworkConfig, manifest *ASIUpgradeManifest) { - if networkConfig.Contracts == nil || networkConfig.Contracts.Reconciliation == nil || networkConfig.Contracts.Reconciliation.Addr != "" || len(manifest.Reconciliation.Transfers.Transfers) < 1 { + if networkConfig.Contracts == nil || networkConfig.Contracts.Reconciliation == nil || networkConfig.Contracts.Reconciliation.Addr == "" || len(manifest.Reconciliation.Transfers.Transfers) < 1 { return } diff --git a/scripts/Pipfile.lock b/scripts/Pipfile.lock index 3a09c2a6..dd5018cf 100644 --- a/scripts/Pipfile.lock +++ b/scripts/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "f2b8eeb1a921ec4c11835fe2c6e7df9e0113fb0a8fbeb560d8119aa620f56a05" + "sha256": "13bcef5d82a9adfa90f8d8e29320825cda45b13c40955ff296f788b2ee2164f7" }, "pipfile-spec": 6, "requires": { @@ -22,7 +22,6 @@ "sha256:990dc8e5a5e4feabbdf55207b5315fdd9b73db40be294a19b3752cde9e79d981" ], "index": "pypi", - "markers": "python_version >= '3.5'", "version": "==1.2.0" } }, From a9c7f3a2048d46c7a0e9504439dfe961ae7d2a26 Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Wed, 5 Jun 2024 21:47:45 +0100 Subject: [PATCH 10/26] Fix uninitialised sdk.Int instance --- cmd/fetchd/cmd/gen_asi_upgrade_manifest.go | 5 +++++ cmd/fetchd/cmd/genesis-asi-upgrade.go | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go index 8f2709d4..8ca7aed9 100644 --- a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go +++ b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go @@ -42,6 +42,11 @@ type ASIUpgradeReconciliationContractState struct { AggregatedBalancesAmount types.Int `json:"aggregated_balances_amount"` NumberOfBalanceRecords int `json:"number_of_balance_records"` } + +func NewASIUpgradeReconciliationContractState() *ASIUpgradeReconciliationContractState { + return &ASIUpgradeReconciliationContractState{AggregatedBalancesAmount: types.Int{}} +} + type ASIUpgradeReconciliation struct { Transfers ASIUpgradeReconciliationTransfers `json:"transfers"` ContractState *ASIUpgradeReconciliationContractState `json:"contract_state"` diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index 1b70ce9d..bf88af10 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -717,8 +717,7 @@ func ASIGenesisUpgradeReplaceReconciliationState(jsonData map[string]interface{} reconciliationContract := getContractFromAddr(networkConfig.Contracts.Reconciliation.Addr, jsonData) var reconciliationContractState []interface{} - contractStateManifest := ASIUpgradeReconciliationContractState{} - manifest.Reconciliation.ContractState = &contractStateManifest + manifest.Reconciliation.ContractState = NewASIUpgradeReconciliationContractState() replaceContractAdmin(reconciliationContract, networkConfig.Contracts.Reconciliation.NewAdmin) From 30f9d97c5704c5989b9ef0f1ea653f5233584a2b Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Wed, 5 Jun 2024 21:55:15 +0100 Subject: [PATCH 11/26] Yet another fix of uninitialised sdk.Int instance --- cmd/fetchd/cmd/gen_asi_upgrade_manifest.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go index 8ca7aed9..c2023a3a 100644 --- a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go +++ b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go @@ -44,7 +44,7 @@ type ASIUpgradeReconciliationContractState struct { } func NewASIUpgradeReconciliationContractState() *ASIUpgradeReconciliationContractState { - return &ASIUpgradeReconciliationContractState{AggregatedBalancesAmount: types.Int{}} + return &ASIUpgradeReconciliationContractState{AggregatedBalancesAmount: types.ZeroInt()} } type ASIUpgradeReconciliation struct { From f84fbc117d0a51979347c74d8ffb8f181281f5f9 Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Wed, 5 Jun 2024 21:59:48 +0100 Subject: [PATCH 12/26] Fix for nil err check inverted unintentionally by copy-paste --- cmd/fetchd/cmd/genesis-asi-upgrade.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index bf88af10..5b2a7999 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -588,7 +588,7 @@ func addReconciliationContractState(contractStateRecords *[]interface{}, network var err error var stateRecordJSONStr []byte stateRecordJSONStr, err = json.Marshal(stateRecord) - if err == nil { + if err != nil { panic(err) } stateRecordEnc := map[string]string{ From 9fc4795671ab112d295db25341b9f945ac31c00c Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Wed, 5 Jun 2024 23:53:16 +0100 Subject: [PATCH 13/26] Fix unprocesed admin addresses + reconcil. contract label update --- cmd/fetchd/cmd/genesis-asi-upgrade.go | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index 5b2a7999..a1bde81a 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -112,6 +112,7 @@ var networkInfos = map[string]NetworkConfig{ Reconciliation: &Reconciliation{ Addr: "fetch1tynmzk68pq6kzawqffrqdhquq475gw9ccmlf9gk24mxjjy6ugl3q70aeyd", NewAdmin: getStringPtr("fetch15p3rl5aavw9rtu86tna5lgxfkz67zzr6ed4yhw"), + NewLabel: getStringPtr("reconciliation-contract"), }, FccCw20: &FccCw20{ Addr: "fetch1vsarnyag5d2c72k86yh2aq4l5jxhwz8fms6yralxqggxzmmwnq4q0avxv7", @@ -673,7 +674,7 @@ func ASIGenesisUpgradeReplaceBridgeAdmin(jsonData map[string]interface{}, networ tokenBridgeContractAddress := networkInfo.Contracts.TokenBridge.Addr tokenBridgeContract := getContractFromAddr(tokenBridgeContractAddress, jsonData) - replaceContractAdmin(tokenBridgeContract, networkInfo.Contracts.TokenBridge.NewAdmin) + replaceContractAdminAndLabel(tokenBridgeContract, networkInfo.Contracts.TokenBridge.NewAdmin, nil) } func ASIGenesisUpgradeReplaceDenom(jsonData map[string]interface{}, networkInfo NetworkConfig) { @@ -709,7 +710,7 @@ func ASIGenesisUpgradeReplaceAlmanacState(jsonData map[string]interface{}, netwo } } -func ASIGenesisUpgradeReplaceReconciliationState(jsonData map[string]interface{}, networkConfig NetworkConfig, manifest *ASIUpgradeManifest) { +func ASIGenesisUpgradeReplaceReconciliationContractState(jsonData map[string]interface{}, networkConfig NetworkConfig, manifest *ASIUpgradeManifest) { if networkConfig.Contracts == nil || networkConfig.Contracts.Reconciliation == nil || networkConfig.Contracts.Reconciliation.Addr == "" || len(manifest.Reconciliation.Transfers.Transfers) < 1 { return } @@ -719,7 +720,7 @@ func ASIGenesisUpgradeReplaceReconciliationState(jsonData map[string]interface{} manifest.Reconciliation.ContractState = NewASIUpgradeReconciliationContractState() - replaceContractAdmin(reconciliationContract, networkConfig.Contracts.Reconciliation.NewAdmin) + replaceContractAdminAndLabel(reconciliationContract, networkConfig.Contracts.Reconciliation.NewAdmin, networkConfig.Contracts.Reconciliation.NewLabel) for _, transfer := range manifest.Reconciliation.Transfers.Transfers { addReconciliationContractStateBalancesRecord(&reconciliationContractState, transfer.EthAddr, transfer.Amount, &networkConfig, manifest) @@ -934,7 +935,7 @@ func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interfa manifest.Reconciliation.Transfers.AggregatedBalancesAmount = manifest.Reconciliation.Transfers.AggregatedBalancesAmount.Add(accBalanceCoins...) } - ASIGenesisUpgradeReplaceReconciliationState(jsonData, networkConfig, manifest) + ASIGenesisUpgradeReplaceReconciliationContractState(jsonData, networkConfig, manifest) } func ASIGenesisUpgradeASISupply(jsonData map[string]interface{}, networkInfo NetworkConfig, manifest *ASIUpgradeManifest) { @@ -1014,13 +1015,14 @@ func convertAddressToASI(addr string, addressPrefix string) (string, error) { return newAddress, nil } -func replaceContractAdmin(genesisContractStruct map[string]interface{}, newAdmin *string) { - if newAdmin == nil { - return - } - +func replaceContractAdminAndLabel(genesisContractStruct map[string]interface{}, newAdmin *string, newLabel *string) { contractInfo := genesisContractStruct["contract_info"].(map[string]interface{}) - contractInfo["admin"] = newAdmin + if newAdmin != nil { + contractInfo["admin"] = *newAdmin + } + if newLabel != nil { + contractInfo["label"] = *newLabel + } } func crawlJson(key string, value interface{}, idx int, strHandler func(string, interface{}, int) interface{}) interface{} { @@ -1164,6 +1166,7 @@ type FccIssuance struct { type Reconciliation struct { Addr string NewAdmin *string + NewLabel *string } type ReconciliationContractStateRecord struct { From c6cceae33bd86424b3ab2b999a6a44a434cb41da Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Thu, 6 Jun 2024 00:31:25 +0100 Subject: [PATCH 14/26] IBC transfers: Extending manifest --- cmd/fetchd/cmd/gen_asi_upgrade_manifest.go | 25 ++++++++++++---------- cmd/fetchd/cmd/genesis-asi-upgrade.go | 13 +++++------ 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go index c2023a3a..52010430 100644 --- a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go +++ b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go @@ -9,14 +9,17 @@ import ( "path" ) -type ASIUpgradeTransfer struct { - From string `json:"from"` - Amount types.Coins `json:"amount"` +type ASIUpgradeIBCTransfer struct { + From string `json:"from"` + ChannelID string `json:"channel_id"` + Amount types.Coins `json:"amount"` } -type ASIUpgradeTransfers struct { - Transfer []ASIUpgradeTransfer `json:"transfer"` - To string `json:"to"` +type ASIUpgradeIBCTransfers struct { + Transfers []ASIUpgradeIBCTransfer `json:"transfer"` + To string `json:"to"` + AggregatedTransferredAmount types.Coins `json:"aggregated_transferred_amount"` + NumberOfTransfers int `json:"number_of_transfers"` } type ASIUpgradeReconciliationTransfer struct { @@ -26,10 +29,10 @@ type ASIUpgradeReconciliationTransfer struct { } type ASIUpgradeReconciliationTransfers struct { - Transfers []ASIUpgradeReconciliationTransfer `json:"transfers"` - To string `json:"to"` - AggregatedBalancesAmount types.Coins `json:"aggregated_transferred_amount"` - NumberOfTransfers int `json:"number_of_transfers"` + Transfers []ASIUpgradeReconciliationTransfer `json:"transfers"` + To string `json:"to"` + AggregatedTransferredAmount types.Coins `json:"aggregated_transferred_amount"` + NumberOfTransfers int `json:"number_of_transfers"` } type ASIUpgradeReconciliationContractStateBalanceRecord struct { @@ -60,7 +63,7 @@ type ASIUpgradeSupply struct { type ASIUpgradeManifest struct { Supply *ASIUpgradeSupply `json:"supply,omitempty"` - IBC *ASIUpgradeTransfers `json:"ibc,omitempty"` + IBC *ASIUpgradeIBCTransfers `json:"ibc,omitempty"` Reconciliation *ASIUpgradeReconciliation `json:"reconciliation,omitempty"` } diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index a1bde81a..fa8e863c 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -797,9 +797,8 @@ func ASIGenesisUpgradeWithdrawIBCChannelsBalances(jsonData map[string]interface{ balanceMap := getGenesisBalancesMap(balances) ibcWithdrawalAddress := networkInfo.IbcTargetAddr - manifest.IBC = &ASIUpgradeTransfers{ - Transfer: []ASIUpgradeTransfer{}, - To: ibcWithdrawalAddress, + manifest.IBC = &ASIUpgradeIBCTransfers{ + To: ibcWithdrawalAddress, } withdrawalBalanceIdx, ok := (*balanceMap)[ibcWithdrawalAddress] if !ok { @@ -833,14 +832,16 @@ 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) // zero out the channel balance balances[balanceIdx].(map[string]interface{})["coins"] = []interface{}{} + + manifest.IBC.Transfers = append(manifest.IBC.Transfers, ASIUpgradeIBCTransfer{From: channelAddr, ChannelID: fmt.Sprintf("%s/%s", portId, channelId), Amount: channelBalanceCoins}) + manifest.IBC.AggregatedTransferredAmount = manifest.IBC.AggregatedTransferredAmount.Add(channelBalanceCoins...) + manifest.IBC.NumberOfTransfers += 1 } } @@ -932,7 +933,7 @@ func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interfa manifest.Reconciliation.Transfers.Transfers = append(manifest.Reconciliation.Transfers.Transfers, ASIUpgradeReconciliationTransfer{From: addr, EthAddr: ethAddr, Amount: accBalanceCoins}) manifest.Reconciliation.Transfers.NumberOfTransfers += 1 - manifest.Reconciliation.Transfers.AggregatedBalancesAmount = manifest.Reconciliation.Transfers.AggregatedBalancesAmount.Add(accBalanceCoins...) + manifest.Reconciliation.Transfers.AggregatedTransferredAmount = manifest.Reconciliation.Transfers.AggregatedTransferredAmount.Add(accBalanceCoins...) } ASIGenesisUpgradeReplaceReconciliationContractState(jsonData, networkConfig, manifest) From 58d82152b449e5b56389da5eff3c718e0f2be8cf Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Thu, 6 Jun 2024 01:12:49 +0100 Subject: [PATCH 15/26] Extending manifest by contract cleaned, label and admin updated --- cmd/fetchd/cmd/gen_asi_upgrade_manifest.go | 15 +++++++-- cmd/fetchd/cmd/genesis-asi-upgrade.go | 39 ++++++++++++---------- 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go index 52010430..4a45eead 100644 --- a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go +++ b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go @@ -61,10 +61,19 @@ type ASIUpgradeSupply struct { ResultingSupplyTotal types.Coins `json:"resulting_supply_total"` } +type ContractValueUpdate struct { + Address string `json:"address"` + From string `json:"from"` + To string `json:"to"` +} + type ASIUpgradeManifest struct { - Supply *ASIUpgradeSupply `json:"supply,omitempty"` - IBC *ASIUpgradeIBCTransfers `json:"ibc,omitempty"` - Reconciliation *ASIUpgradeReconciliation `json:"reconciliation,omitempty"` + Supply *ASIUpgradeSupply `json:"supply,omitempty"` + IBC *ASIUpgradeIBCTransfers `json:"ibc,omitempty"` + Reconciliation *ASIUpgradeReconciliation `json:"reconciliation,omitempty"` + ContractsStateCleaned []string `json:"contracts_state_cleaned,omitempty"` + ContractsAdminUpdated []ContractValueUpdate `json:"contracts_admin_updated,omitempty"` + ContractsLabelUpdated []ContractValueUpdate `json:"contracts_label_updated,omitempty"` } func SaveASIManifest(manifest *ASIUpgradeManifest, config *config2.Config) error { diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index fa8e863c..ab34bc38 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -213,7 +213,7 @@ func ASIGenesisUpgradeCmd(defaultNodeHome string) *cobra.Command { ASIGenesisUpgradeReplaceChainID(genDoc, networkConfig) // replace bridge contract admin - ASIGenesisUpgradeReplaceBridgeAdmin(jsonData, networkConfig) + ASIGenesisUpgradeReplaceBridgeAdmin(jsonData, networkConfig, &manifest) // update mobix staking contract ASIGenesisUpgradeUpdateMobixStakingContract(jsonData, networkConfig) @@ -222,10 +222,10 @@ func ASIGenesisUpgradeCmd(defaultNodeHome string) *cobra.Command { ASIGenesisUpgradeUpdateFccCw20Contract(jsonData, networkConfig) // replace almanac contract state - ASIGenesisUpgradeReplaceAlmanacState(jsonData, networkConfig) + ASIGenesisUpgradeReplaceAlmanacState(jsonData, networkConfig, &manifest) // replace aname contract state - ASIGenesisUpgradeReplaceANameState(jsonData, networkConfig) + ASIGenesisUpgradeReplaceANameState(jsonData, networkConfig, &manifest) // update fcc issuance contract ASIGenesisUpgradeUpdateFccIssuanceContract(jsonData, networkConfig) @@ -666,7 +666,7 @@ func ASIGenesisUpgradeReplaceChainID(genesisData *types.GenesisDoc, networkInfo genesisData.ChainID = networkInfo.NewChainID } -func ASIGenesisUpgradeReplaceBridgeAdmin(jsonData map[string]interface{}, networkInfo NetworkConfig) { +func ASIGenesisUpgradeReplaceBridgeAdmin(jsonData map[string]interface{}, networkInfo NetworkConfig, manifest *ASIUpgradeManifest) { if networkInfo.Contracts == nil || networkInfo.Contracts.TokenBridge == nil { return } @@ -674,7 +674,7 @@ func ASIGenesisUpgradeReplaceBridgeAdmin(jsonData map[string]interface{}, networ tokenBridgeContractAddress := networkInfo.Contracts.TokenBridge.Addr tokenBridgeContract := getContractFromAddr(tokenBridgeContractAddress, jsonData) - replaceContractAdminAndLabel(tokenBridgeContract, networkInfo.Contracts.TokenBridge.NewAdmin, nil) + replaceContractAdminAndLabel(tokenBridgeContract, networkInfo.Contracts.TokenBridge.NewAdmin, nil, manifest) } func ASIGenesisUpgradeReplaceDenom(jsonData map[string]interface{}, networkInfo NetworkConfig) { @@ -693,7 +693,7 @@ func ASIGenesisUpgradeReplaceDenom(jsonData map[string]interface{}, networkInfo }) } -func ASIGenesisUpgradeReplaceAlmanacState(jsonData map[string]interface{}, networkInfo NetworkConfig) { +func ASIGenesisUpgradeReplaceAlmanacState(jsonData map[string]interface{}, networkInfo NetworkConfig, manifest *ASIUpgradeManifest) { if networkInfo.Contracts == nil || networkInfo.Contracts.Almanac == nil { return } @@ -703,10 +703,7 @@ func ASIGenesisUpgradeReplaceAlmanacState(jsonData map[string]interface{}, netwo continue } - almanacContract := getContractFromAddr(addr, jsonData) - - // empty the almanac contract state - almanacContract["contract_state"] = []interface{}{} + deleteContractState(getContractFromAddr(addr, jsonData), manifest) } } @@ -720,7 +717,7 @@ func ASIGenesisUpgradeReplaceReconciliationContractState(jsonData map[string]int manifest.Reconciliation.ContractState = NewASIUpgradeReconciliationContractState() - replaceContractAdminAndLabel(reconciliationContract, networkConfig.Contracts.Reconciliation.NewAdmin, networkConfig.Contracts.Reconciliation.NewLabel) + replaceContractAdminAndLabel(reconciliationContract, networkConfig.Contracts.Reconciliation.NewAdmin, networkConfig.Contracts.Reconciliation.NewLabel, manifest) for _, transfer := range manifest.Reconciliation.Transfers.Transfers { addReconciliationContractStateBalancesRecord(&reconciliationContractState, transfer.EthAddr, transfer.Amount, &networkConfig, manifest) @@ -730,7 +727,7 @@ func ASIGenesisUpgradeReplaceReconciliationContractState(jsonData map[string]int reconciliationContract["contract_state"] = reconciliationContractState } -func ASIGenesisUpgradeReplaceANameState(jsonData map[string]interface{}, networkInfo NetworkConfig) { +func ASIGenesisUpgradeReplaceANameState(jsonData map[string]interface{}, networkInfo NetworkConfig, manifest *ASIUpgradeManifest) { if networkInfo.Contracts == nil || networkInfo.Contracts.AName == nil { return } @@ -740,10 +737,7 @@ func ASIGenesisUpgradeReplaceANameState(jsonData map[string]interface{}, network continue } - anameContract := getContractFromAddr(addr, jsonData) - - // empty the AName contract state - anameContract["contract_state"] = []interface{}{} + deleteContractState(getContractFromAddr(addr, jsonData), manifest) } } @@ -1016,16 +1010,27 @@ func convertAddressToASI(addr string, addressPrefix string) (string, error) { return newAddress, nil } -func replaceContractAdminAndLabel(genesisContractStruct map[string]interface{}, newAdmin *string, newLabel *string) { +func replaceContractAdminAndLabel(genesisContractStruct map[string]interface{}, newAdmin *string, newLabel *string, manifest *ASIUpgradeManifest) { + contractAddress := genesisContractStruct["contract_address"].(string) contractInfo := genesisContractStruct["contract_info"].(map[string]interface{}) if newAdmin != nil { + oldAdmin := contractInfo["admin"].(string) contractInfo["admin"] = *newAdmin + manifest.ContractsAdminUpdated = append(manifest.ContractsAdminUpdated, ContractValueUpdate{Address: contractAddress, From: oldAdmin, To: *newAdmin}) } if newLabel != nil { + oldLabel := contractInfo["label"].(string) contractInfo["label"] = *newLabel + manifest.ContractsLabelUpdated = append(manifest.ContractsLabelUpdated, ContractValueUpdate{Address: contractAddress, From: oldLabel, To: *newLabel}) } } +func deleteContractState(genesisContractStruct map[string]interface{}, manifest *ASIUpgradeManifest) { + contractAddress := genesisContractStruct["contract_address"].(string) + genesisContractStruct["contract_state"] = []interface{}{} + manifest.ContractsStateCleaned = append(manifest.ContractsStateCleaned, contractAddress) +} + func crawlJson(key string, value interface{}, idx int, strHandler func(string, interface{}, int) interface{}) interface{} { switch val := value.(type) { case string: From c34d5d158d829258e85084741e0870d5b4674d3e Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Thu, 6 Jun 2024 01:36:31 +0100 Subject: [PATCH 16/26] Cosmetic: namin/reformulation in code handling supply --- cmd/fetchd/cmd/gen_asi_upgrade_manifest.go | 2 +- cmd/fetchd/cmd/genesis-asi-upgrade.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go index 4a45eead..f4bce09d 100644 --- a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go +++ b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go @@ -58,7 +58,7 @@ type ASIUpgradeReconciliation struct { type ASIUpgradeSupply struct { LandingAddress string `json:"landing_address"` MintedAmount types.Coins `json:"minted_amount"` - ResultingSupplyTotal types.Coins `json:"resulting_supply_total"` + ResultingTotalSupply types.Coins `json:"resulting_total_supply"` } type ContractValueUpdate struct { diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index ab34bc38..98d5c279 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -943,8 +943,8 @@ func ASIGenesisUpgradeASISupply(jsonData map[string]interface{}, networkInfo Net if additionalSupply.IsZero() { return - } else if additionalSupply.LT(sdk.ZeroInt()) { - panic("asi upgrade update supply: additional supply value is negative") + } else if additionalSupply.IsNegative() { + panic("asi upgrade update supply: new supply amount for minting is negative") } bank := jsonData[banktypes.ModuleName].(map[string]interface{}) @@ -982,7 +982,7 @@ func ASIGenesisUpgradeASISupply(jsonData map[string]interface{}, networkInfo Net supplyRecord := ASIUpgradeSupply{ LandingAddress: supplyInfo.UpdatedSupplyOverflowAddr, MintedAmount: sdk.NewCoins(additionalSupplyCoin), - ResultingSupplyTotal: sdk.NewCoins(newSupplyCoins), + ResultingTotalSupply: sdk.NewCoins(newSupplyCoins), } manifest.Supply = &supplyRecord From 52c765a8fadc243c67ac0f0ee08327ab8bcdf4b7 Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Thu, 6 Jun 2024 12:56:40 +0100 Subject: [PATCH 17/26] Refactoring reconciliation to completelly 2 independet functions --- cmd/fetchd/cmd/genesis-asi-upgrade.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index 98d5c279..bcacf4f3 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -233,8 +233,8 @@ func ASIGenesisUpgradeCmd(defaultNodeHome string) *cobra.Command { // withdraw balances from IBC channels ASIGenesisUpgradeWithdrawIBCChannelsBalances(jsonData, networkConfig, &manifest) - // withdraw balances from reconciliation addresses - ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData, networkConfig, &manifest) + // handles reconciliation + ASIGenesisUpgradeReconciliation(jsonData, networkConfig, &manifest) // set denom metadata in bank module ASIGenesisUpgradeReplaceDenomMetadata(jsonData, networkConfig) @@ -929,7 +929,10 @@ func ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData map[string]interfa manifest.Reconciliation.Transfers.NumberOfTransfers += 1 manifest.Reconciliation.Transfers.AggregatedTransferredAmount = manifest.Reconciliation.Transfers.AggregatedTransferredAmount.Add(accBalanceCoins...) } +} +func ASIGenesisUpgradeReconciliation(jsonData map[string]interface{}, networkConfig NetworkConfig, manifest *ASIUpgradeManifest) { + ASIGenesisUpgradeWithdrawReconciliationBalances(jsonData, networkConfig, manifest) ASIGenesisUpgradeReplaceReconciliationContractState(jsonData, networkConfig, manifest) } From 30c7c6cccc20c8649758ade27fbf73bfe140db5a Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Thu, 6 Jun 2024 13:49:14 +0100 Subject: [PATCH 18/26] Fixing eth address encoding to binary in contract map key --- cmd/fetchd/cmd/genesis-asi-upgrade.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index 14506496..d2e6e1a7 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -567,9 +567,15 @@ func reconciliationContractStateBalancesRecord(ethAddr string, coins sdk.Coins, if _, err := writer.Write(reconciliationBalancesKey); err != nil { panic(err) } - if _, err := writer.WriteString(ethAddr); err != nil { + + if ethAddrRaw, err := hex.DecodeString(ethAddr); err != nil { + if _, err := writer.Write(ethAddrRaw); err != nil { + panic(err) + } + } else { panic(err) } + if err := writer.Flush(); err != nil { panic(err) } From 7a1928ad2ba008ef991066e1099a6645ae1beb9d Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Thu, 6 Jun 2024 14:37:44 +0100 Subject: [PATCH 19/26] Fix hex decoding issue for '0x' prefixed hex string data --- cmd/fetchd/cmd/genesis-asi-upgrade.go | 28 ++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index d2e6e1a7..26144039 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -287,6 +287,22 @@ func (a Bytes) StartsWith(with []byte) bool { return len(a) >= len(with) && bytes.Compare(a[0:len(with)], with) == 0 } +func DropHexPrefix(hexEncodedData string) string { + if len(hexEncodedData) < 2 { + return hexEncodedData + } + + if strings.ToLower(string(hexEncodedData[:2])) == "0x" { + return hexEncodedData[2:] + } + + if strings.ToLower(string(hexEncodedData[:1])) == "x" { + return hexEncodedData[1:] + } + + return hexEncodedData +} + func replaceAddressInContractStateKey2(keyBytes []byte, prefix []byte) string { address1StartIdx := len(prefix) + 2 address1Len := int(binary.BigEndian.Uint16(keyBytes[len(prefix):address1StartIdx])) @@ -552,15 +568,17 @@ func replaceAddressInContractStateKey(keyBytes []byte, prefix []byte) string { return hex.EncodeToString(key) } -func reconciliationContractStateBalancesRecord(ethAddr string, coins sdk.Coins, networkConfig *NetworkConfig) (*map[string]string, sdk.Int) { +func reconciliationContractStateBalancesRecord(ethAddrHex string, coins sdk.Coins, networkConfig *NetworkConfig) (*map[string]string, sdk.Int) { amount := coins.AmountOfNoDenomValidation(networkConfig.DenomInfo.OldDenom) if amount.IsZero() { return nil, amount } if amount.IsNegative() { - panic(fmt.Errorf("netgative amount value for ethereum '%s' address", ethAddr)) + panic(fmt.Errorf("netgative amount value for ethereum '%s' address", ethAddrHex)) } + ethAddrHexNoPrefix := DropHexPrefix(ethAddrHex) + var buffer bytes.Buffer writer := bufio.NewWriter(&buffer) @@ -568,12 +586,12 @@ func reconciliationContractStateBalancesRecord(ethAddr string, coins sdk.Coins, panic(err) } - if ethAddrRaw, err := hex.DecodeString(ethAddr); err != nil { + if ethAddrRaw, err := hex.DecodeString(ethAddrHexNoPrefix); err != nil { + panic(err) + } else { if _, err := writer.Write(ethAddrRaw); err != nil { panic(err) } - } else { - panic(err) } if err := writer.Flush(); err != nil { From 02795c219747a8a0c77f5169980e4faee99585aa Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Mon, 10 Jun 2024 16:03:02 +0100 Subject: [PATCH 20/26] Reconciliation: Reworking balances map to support multiple coins --- cmd/fetchd/cmd/gen_asi_upgrade_manifest.go | 12 +++---- cmd/fetchd/cmd/genesis-asi-upgrade.go | 38 ++++++++++++++-------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go index 5faf6a59..809b6f93 100644 --- a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go +++ b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go @@ -36,20 +36,16 @@ type ASIUpgradeReconciliationTransfers struct { } type ASIUpgradeReconciliationContractStateBalanceRecord struct { - EthAddr string `json:"eth_addr"` - Amount types.Int `json:"amount"` + EthAddr string `json:"eth_addr"` + Balances types.Coins `json:"balances"` } type ASIUpgradeReconciliationContractState struct { Balances []ASIUpgradeReconciliationContractStateBalanceRecord `json:"balances"` - AggregatedBalancesAmount types.Int `json:"aggregated_balances_amount"` + AggregatedBalancesAmount types.Coins `json:"aggregated_balances_amount"` NumberOfBalanceRecords int `json:"number_of_balance_records"` } -func NewASIUpgradeReconciliationContractState() *ASIUpgradeReconciliationContractState { - return &ASIUpgradeReconciliationContractState{AggregatedBalancesAmount: types.ZeroInt()} -} - type ASIUpgradeReconciliation struct { Transfers ASIUpgradeReconciliationTransfers `json:"transfers"` ContractState *ASIUpgradeReconciliationContractState `json:"contract_state"` @@ -80,7 +76,7 @@ type MainParams struct { } type ASIUpgradeManifest struct { - Main *MainParams `json:"main,omitempty"` + Main *MainParams `json:"main,omitempty"` IBC *ASIUpgradeIBCTransfers `json:"ibc,omitempty"` Reconciliation *ASIUpgradeReconciliation `json:"reconciliation,omitempty"` ContractsStateCleaned []string `json:"contracts_state_cleaned,omitempty"` diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index 874f2b2b..bdae966a 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -575,15 +575,20 @@ func replaceAddressInContractStateKey(keyBytes []byte, prefix []byte) string { return hex.EncodeToString(key) } -func reconciliationContractStateBalancesRecord(ethAddrHex string, coins sdk.Coins, networkConfig *NetworkConfig) (*map[string]string, sdk.Int) { - amount := coins.AmountOfNoDenomValidation(networkConfig.DenomInfo.OldDenom) - if amount.IsZero() { - return nil, amount +func reconciliationContractStateBalancesRecord(ethAddrHex string, coins sdk.Coins, networkConfig *NetworkConfig) (*map[string]string, sdk.Coins) { + resCoins := sdk.Coins{} + for _, coin := range coins { + if coin.IsPositive() { + resCoins.Add(coin) + } } - if amount.IsNegative() { - panic(fmt.Errorf("netgative amount value for ethereum '%s' address", ethAddrHex)) + + if resCoins.Empty() { + return nil, resCoins } + resCoins.Sort() + ethAddrHexNoPrefix := DropHexPrefix(ethAddrHex) var buffer bytes.Buffer @@ -605,20 +610,25 @@ func reconciliationContractStateBalancesRecord(ethAddrHex string, coins sdk.Coin panic(err) } - balanceRecord := map[string]string{ - "key": hex.EncodeToString(buffer.Bytes()), - "value": base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("\"%s\"", amount.String()))), + if value, err := resCoins.MarshalJSON(); err != nil { + balanceRecord := map[string]string{ + "key": hex.EncodeToString(buffer.Bytes()), + "value": base64.StdEncoding.EncodeToString(value), + } + return &balanceRecord, resCoins + } else { + panic(err) } - return &balanceRecord, amount + return nil, sdk.Coins{} } func addReconciliationContractStateBalancesRecord(contractStateRecords *[]interface{}, ethAddr string, coins sdk.Coins, networkConfig *NetworkConfig, manifest *ASIUpgradeManifest) { - newContractStateBalancesRecord, amount := reconciliationContractStateBalancesRecord(ethAddr, coins, networkConfig) + newContractStateBalancesRecord, coins := reconciliationContractStateBalancesRecord(ethAddr, coins, networkConfig) if newContractStateBalancesRecord != nil { *contractStateRecords = append(*contractStateRecords, *newContractStateBalancesRecord) - manifest.Reconciliation.ContractState.Balances = append(manifest.Reconciliation.ContractState.Balances, ASIUpgradeReconciliationContractStateBalanceRecord{EthAddr: ethAddr, Amount: amount}) - manifest.Reconciliation.ContractState.AggregatedBalancesAmount = manifest.Reconciliation.ContractState.AggregatedBalancesAmount.Add(amount) + manifest.Reconciliation.ContractState.Balances = append(manifest.Reconciliation.ContractState.Balances, ASIUpgradeReconciliationContractStateBalanceRecord{EthAddr: ethAddr, Balances: coins}) + manifest.Reconciliation.ContractState.AggregatedBalancesAmount = manifest.Reconciliation.ContractState.AggregatedBalancesAmount.Add(coins...) manifest.Reconciliation.ContractState.NumberOfBalanceRecords += 1 } } @@ -773,7 +783,7 @@ func ASIGenesisUpgradeReplaceReconciliationContractState(jsonData map[string]int reconciliationContract := getContractFromAddr(networkConfig.Contracts.Reconciliation.Addr, jsonData) var reconciliationContractState []interface{} - manifest.Reconciliation.ContractState = NewASIUpgradeReconciliationContractState() + manifest.Reconciliation.ContractState = &ASIUpgradeReconciliationContractState{} replaceContractAdminAndLabel(reconciliationContract, networkConfig.Contracts.Reconciliation.NewAdmin, networkConfig.Contracts.Reconciliation.NewLabel, manifest) From f26582060775807bd8738c46e080f1bed94e9624 Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Mon, 10 Jun 2024 16:20:46 +0100 Subject: [PATCH 21/26] Reconciliation: Dropping `Denom` from the `ReconciliationContractStateRecord` --- cmd/fetchd/cmd/genesis-asi-upgrade.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index bdae966a..0dc88361 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -645,7 +645,6 @@ func addReconciliationContractState(contractStateRecords *[]interface{}, network } stateRecord := ReconciliationContractStateRecord{ - Denom: networkConfig.DenomInfo.NewDenom, Paused: true, } @@ -1252,6 +1251,5 @@ type Reconciliation struct { } type ReconciliationContractStateRecord struct { - Denom string `json:"denom"` - Paused bool `json:"paused"` + Paused bool `json:"paused"` } From 8c3a144e500604df169401c351d986a75657f87c Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Mon, 10 Jun 2024 16:47:04 +0100 Subject: [PATCH 22/26] Reconciliation: Fixing handling os state structures --- cmd/fetchd/cmd/gen_asi_upgrade_manifest.go | 6 ++++++ cmd/fetchd/cmd/genesis-asi-upgrade.go | 14 +++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go index 809b6f93..b8a5f3db 100644 --- a/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go +++ b/cmd/fetchd/cmd/gen_asi_upgrade_manifest.go @@ -46,6 +46,12 @@ type ASIUpgradeReconciliationContractState struct { NumberOfBalanceRecords int `json:"number_of_balance_records"` } +func NewASIUpgradeReconciliationContractState() *ASIUpgradeReconciliationContractState { + return &ASIUpgradeReconciliationContractState{ + Balances: make([]ASIUpgradeReconciliationContractStateBalanceRecord, 0), + } +} + type ASIUpgradeReconciliation struct { Transfers ASIUpgradeReconciliationTransfers `json:"transfers"` ContractState *ASIUpgradeReconciliationContractState `json:"contract_state"` diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index 0dc88361..556ae890 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -52,7 +52,7 @@ var ( reconciliationBalancesKey = prefixStringWithLength("balances") reconciliationTotalBalanceKey = []byte("total_balance") reconciliationNOutstandingAddressesKey = []byte("n_outstanding_addresses") - reconciliationStatesKey = []byte("state") + reconciliationStateKey = []byte("state") // Mobix staking contract keys stakesKey = prefixStringWithLength("stakes") @@ -634,9 +634,14 @@ func addReconciliationContractStateBalancesRecord(contractStateRecords *[]interf } func addReconciliationContractState(contractStateRecords *[]interface{}, networkConfig *NetworkConfig, manifest *ASIUpgradeManifest) { + var totalBalanceRecord []byte + var err error + if totalBalanceRecord, err = manifest.Reconciliation.ContractState.AggregatedBalancesAmount.MarshalJSON(); err != nil { + panic(err) + } totalBalanceRecordEnc := map[string]string{ "key": hex.EncodeToString(reconciliationTotalBalanceKey), - "value": base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("\"%s\"", manifest.Reconciliation.ContractState.AggregatedBalancesAmount.String()))), + "value": base64.StdEncoding.EncodeToString(totalBalanceRecord), } nOutstandingAddressesRecordEnc := map[string]string{ @@ -648,14 +653,13 @@ func addReconciliationContractState(contractStateRecords *[]interface{}, network Paused: true, } - var err error var stateRecordJSONStr []byte stateRecordJSONStr, err = json.Marshal(stateRecord) if err != nil { panic(err) } stateRecordEnc := map[string]string{ - "key": hex.EncodeToString(reconciliationStatesKey), + "key": hex.EncodeToString(reconciliationStateKey), "value": base64.StdEncoding.EncodeToString(stateRecordJSONStr), } @@ -782,7 +786,7 @@ func ASIGenesisUpgradeReplaceReconciliationContractState(jsonData map[string]int reconciliationContract := getContractFromAddr(networkConfig.Contracts.Reconciliation.Addr, jsonData) var reconciliationContractState []interface{} - manifest.Reconciliation.ContractState = &ASIUpgradeReconciliationContractState{} + manifest.Reconciliation.ContractState = NewASIUpgradeReconciliationContractState() replaceContractAdminAndLabel(reconciliationContract, networkConfig.Contracts.Reconciliation.NewAdmin, networkConfig.Contracts.Reconciliation.NewLabel, manifest) From 12a0a77bb2c959a4d0092f760c775321ed6e5abf Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Mon, 10 Jun 2024 17:09:08 +0100 Subject: [PATCH 23/26] Reconciliation: Fix wrongly expected in-place Coin.Add(...) behaviour --- cmd/fetchd/cmd/genesis-asi-upgrade.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index 556ae890..303df4e0 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -579,7 +579,7 @@ func reconciliationContractStateBalancesRecord(ethAddrHex string, coins sdk.Coin resCoins := sdk.Coins{} for _, coin := range coins { if coin.IsPositive() { - resCoins.Add(coin) + resCoins = resCoins.Add(coin) } } @@ -620,7 +620,7 @@ func reconciliationContractStateBalancesRecord(ethAddrHex string, coins sdk.Coin panic(err) } - return nil, sdk.Coins{} + // return nil, sdk.Coins{} } func addReconciliationContractStateBalancesRecord(contractStateRecords *[]interface{}, ethAddr string, coins sdk.Coins, networkConfig *NetworkConfig, manifest *ASIUpgradeManifest) { From b65e9bfb135d6b7fffaa055095023bf0b5144272 Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Mon, 10 Jun 2024 17:24:17 +0100 Subject: [PATCH 24/26] Reconciliation: Fix bumb inverse boolean logic brain fart --- cmd/fetchd/cmd/genesis-asi-upgrade.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index 303df4e0..34ce8b49 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -611,13 +611,13 @@ func reconciliationContractStateBalancesRecord(ethAddrHex string, coins sdk.Coin } if value, err := resCoins.MarshalJSON(); err != nil { + panic(err) + } else { balanceRecord := map[string]string{ "key": hex.EncodeToString(buffer.Bytes()), "value": base64.StdEncoding.EncodeToString(value), } return &balanceRecord, resCoins - } else { - panic(err) } // return nil, sdk.Coins{} From e3406762dca2b5f1697891d90c0cdf9173386fc7 Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Mon, 10 Jun 2024 17:29:17 +0100 Subject: [PATCH 25/26] Cosmetic --- cmd/fetchd/cmd/genesis-asi-upgrade.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index 34ce8b49..d399649a 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -619,8 +619,6 @@ func reconciliationContractStateBalancesRecord(ethAddrHex string, coins sdk.Coin } return &balanceRecord, resCoins } - - // return nil, sdk.Coins{} } func addReconciliationContractStateBalancesRecord(contractStateRecords *[]interface{}, ethAddr string, coins sdk.Coins, networkConfig *NetworkConfig, manifest *ASIUpgradeManifest) { From 8478dc2fec0213c99910ec15b3406139a3a4b2f5 Mon Sep 17 00:00:00 2001 From: Peter Bukva Date: Tue, 11 Jun 2024 13:14:06 +0100 Subject: [PATCH 26/26] Refactoring `DropHexPrefix(...)` function --- cmd/fetchd/cmd/genesis-asi-upgrade.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index d399649a..32538516 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -290,15 +290,21 @@ func (a Bytes) StartsWith(with []byte) bool { } func DropHexPrefix(hexEncodedData string) string { - if len(hexEncodedData) < 2 { + strLen := len(hexEncodedData) + if strLen < 1 { return hexEncodedData } - if strings.ToLower(string(hexEncodedData[:2])) == "0x" { - return hexEncodedData[2:] + prefixEstimateLen := 1 + if strLen > 1 { + prefixEstimateLen = 2 } - if strings.ToLower(string(hexEncodedData[:1])) == "x" { + prefixEstimate := strings.ToLower(hexEncodedData[:prefixEstimateLen]) + + if strings.HasPrefix(prefixEstimate, "0x") { + return hexEncodedData[2:] + } else if strings.HasPrefix(prefixEstimate, "x") { return hexEncodedData[1:] }