From c8b79c00f5b507587f9286d53d219d915196b75e Mon Sep 17 00:00:00 2001 From: jonathansumner Date: Thu, 23 May 2024 15:59:04 +0100 Subject: [PATCH 1/2] feat: replace FCC issuance states --- cmd/fetchd/cmd/genesis-asi-upgrade.go | 75 ++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index b1550b80..6f0349ac 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -44,9 +44,16 @@ const ( ) var ( + // Mobix staking contract keys stakesKey = prefixStringWithLength("stakes") unbondEntriesKey = prefixStringWithLength("unbond_entries") configKey = []byte("config") + + // Fcc issuance contract keys + claimsKey = prefixStringWithLength("claims") + issuerAddressKey = []byte("issuer_address") + sourceOfFundsAddressKey = []byte("source_of_funds_address") + cw20AddressKey = []byte("cw20_address") ) var ReconciliationTargetAddr = "fetch1rhrlzsx9z865dqen8t4v47r99dw6y4va4uph0x" @@ -110,6 +117,9 @@ var networkInfos = map[string]NetworkConfig{ Addr: "fetch1kewgfwxwtuxcnppr547wj6sd0e5fkckyp48dazsh89hll59epgpspmh0tn", NewAdmin: "fetch15p3rl5aavw9rtu86tna5lgxfkz67zzr6ed4yhw", }, + FccIssuance: &FccIssuance{ + Addr: "fetch17z773v8ree3e75s5sme38vvenlcyavcfs2ct3y6w77rwa5ag3srslelug5", + }, }, }, } @@ -167,7 +177,7 @@ func ASIGenesisUpgradeCmd(defaultNodeHome string) *cobra.Command { ASIGenesisUpgradeReplaceBridgeAdmin(jsonData, networkConfig) } - // update mobix staking contract, if address present + // update mobix staking contract, if address present TODO: include all contract checks within the functions themselves if networkConfig.Contracts != nil && networkConfig.Contracts.MobixStaking != nil { ASIGenesisUpgradeUpdateMobixStakingContract(jsonData, networkConfig) } @@ -184,6 +194,11 @@ func ASIGenesisUpgradeCmd(defaultNodeHome string) *cobra.Command { ASIGenesisUpgradeReplaceANameState(jsonData, networkConfig) } + // update fcc issuance contract + if networkConfig.Contracts != nil && networkConfig.Contracts.FccIssuance != nil { + ASIGenesisUpgradeUpdateFccIssuanceContract(jsonData, networkConfig) + } + // withdraw balances from IBC channels if err = ASIGenesisUpgradeWithdrawIBCChannelsBalances(jsonData, networkConfig, &manifest); err != nil { return err @@ -235,6 +250,59 @@ func (a Bytes) StartsWith(with []byte) bool { return len(a) >= len(with) && bytes.Compare(a[0:len(with)], with) == 0 } +func ASIGenesisUpgradeUpdateFccIssuanceContract(jsonData map[string]interface{}, networkInfo NetworkConfig) { + FccIssuanceContractAddr := networkInfo.Contracts.FccIssuance.Addr + FccIssuanceContract := getContractFromAddr(FccIssuanceContractAddr, jsonData) + re := regexp.MustCompile(fmt.Sprintf(`%s%s1([%s]{%d,%d})`, OldAddrPrefix, "", Bech32Chars, AddrDataLength+AddrChecksumLength, MaxAddrDataLength)) + + replaceContractValueString := func(value string) string { + newVal := re.ReplaceAllStringFunc(value, func(match string) string { + newAddr, err := convertAddressToASI(match, AccAddressPrefix) + if err != nil { + panic(err) + } + return newAddr + }) + return base64.StdEncoding.EncodeToString([]byte(newVal)) + } + + for _, val := range FccIssuanceContract["contract_state"].([]interface{}) { + state := val.(map[string]interface{}) + hexKey := state["key"].(string) + b64Value := state["value"].(string) + + valueBytes, err := base64.StdEncoding.DecodeString(b64Value) + if err != nil { + panic(err) + } + + keyBytes, err := hex.DecodeString(hexKey) + if err != nil { + panic(err) + } + + updatedKey := hexKey + updatedValue := b64Value + + _keyBytes := Bytes(keyBytes) + switch { + case _keyBytes.StartsWith(claimsKey): + updatedKey = replaceAddressInContractStateKey(keyBytes, claimsKey) + case _keyBytes.StartsWith(issuerAddressKey): + updatedValue = replaceContractValueString(string(valueBytes)) + case _keyBytes.StartsWith(sourceOfFundsAddressKey): + updatedValue = replaceContractValueString(string(valueBytes)) + case _keyBytes.StartsWith(cw20AddressKey): + updatedValue = replaceContractValueString(string(valueBytes)) + } + + val = map[string]interface{}{ + "key": updatedKey, + "value": updatedValue, + } + } +} + func ASIGenesisUpgradeUpdateMobixStakingContract(jsonData map[string]interface{}, networkInfo NetworkConfig) { contracts := jsonData["wasm"].(map[string]interface{})["contracts"].([]interface{}) MobixStakingContractAddress := networkInfo.Contracts.MobixStaking.Addr @@ -781,6 +849,7 @@ type Contracts struct { Almanac *Almanac AName *AName MobixStaking *MobixStaking + FccIssuance *FccIssuance } type TokenBridge struct { @@ -799,3 +868,7 @@ type AName struct { type MobixStaking struct { Addr string } + +type FccIssuance struct { + Addr string +} From ed1dfafb70784308e6049f93c8f5bf582c3a5c57 Mon Sep 17 00:00:00 2001 From: jonathansumner Date: Fri, 24 May 2024 14:21:09 +0100 Subject: [PATCH 2/2] feat: include replacement for issuance & old source of funds addr --- cmd/fetchd/cmd/genesis-asi-upgrade.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cmd/fetchd/cmd/genesis-asi-upgrade.go b/cmd/fetchd/cmd/genesis-asi-upgrade.go index 6f0349ac..ea6a476d 100644 --- a/cmd/fetchd/cmd/genesis-asi-upgrade.go +++ b/cmd/fetchd/cmd/genesis-asi-upgrade.go @@ -51,9 +51,11 @@ var ( // Fcc issuance contract keys claimsKey = prefixStringWithLength("claims") + issuanceKey = prefixStringWithLength("issuance") issuerAddressKey = []byte("issuer_address") sourceOfFundsAddressKey = []byte("source_of_funds_address") cw20AddressKey = []byte("cw20_address") + issuanceFccAddressKey = []byte("issuance_fcc_address") ) var ReconciliationTargetAddr = "fetch1rhrlzsx9z865dqen8t4v47r99dw6y4va4uph0x" @@ -290,10 +292,14 @@ func ASIGenesisUpgradeUpdateFccIssuanceContract(jsonData map[string]interface{}, updatedKey = replaceAddressInContractStateKey(keyBytes, claimsKey) case _keyBytes.StartsWith(issuerAddressKey): updatedValue = replaceContractValueString(string(valueBytes)) + case _keyBytes.StartsWith(issuanceKey): + updatedKey = replaceAddressInContractStateKey(keyBytes, issuanceKey) case _keyBytes.StartsWith(sourceOfFundsAddressKey): updatedValue = replaceContractValueString(string(valueBytes)) case _keyBytes.StartsWith(cw20AddressKey): updatedValue = replaceContractValueString(string(valueBytes)) + case _keyBytes.StartsWith(issuanceFccAddressKey): + updatedValue = replaceContractValueString(string(valueBytes)) } val = map[string]interface{}{