diff --git a/src/app/modules/main/chat_section/controller.nim b/src/app/modules/main/chat_section/controller.nim index 478cf2efb41..d8d55b31749 100644 --- a/src/app/modules/main/chat_section/controller.nim +++ b/src/app/modules/main/chat_section/controller.nim @@ -691,9 +691,9 @@ proc getContractAddressesForToken*(self: Controller, symbol: string): Table[int, let token = self.tokenService.findTokenBySymbol(symbol) if token != nil: for addrPerChain in token.addressPerChainId: - # depending on areTestNetworksEnabled (in getNetwork), contractAddresses will + # depending on areTestNetworksEnabled (in getNetworkByChainId), contractAddresses will # contain mainnets or testnets only - let network = self.networkService.getNetwork(addrPerChain.chainId) + let network = self.networkService.getNetworkByChainId(addrPerChain.chainId) if network == nil: continue contractAddresses[addrPerChain.chainId] = addrPerChain.address diff --git a/src/app/modules/main/communities/controller.nim b/src/app/modules/main/communities/controller.nim index 2a85b787365..d3f386ae0d8 100644 --- a/src/app/modules/main/communities/controller.nim +++ b/src/app/modules/main/communities/controller.nim @@ -372,8 +372,8 @@ proc getCommunityTokens*(self: Controller, communityId: string): seq[CommunityTo proc getAllCommunityTokens*(self: Controller): seq[CommunityTokenDto] = self.communityTokensService.getAllCommunityTokens() -proc getNetwork*(self:Controller, chainId: int): NetworkDto = - self.networksService.getNetwork(chainId) +proc getNetworkByChainId*(self:Controller, chainId: int): NetworkDto = + self.networksService.getNetworkByChainId(chainId) proc getTokenBySymbolList*(self: Controller): seq[TokenBySymbolItem] = return self.tokenService.getTokenBySymbolList() diff --git a/src/app/modules/main/communities/tokens/controller.nim b/src/app/modules/main/communities/tokens/controller.nim index 9bda7d781a6..bae96d3dea8 100644 --- a/src/app/modules/main/communities/tokens/controller.nim +++ b/src/app/modules/main/communities/tokens/controller.nim @@ -157,8 +157,8 @@ proc findContractByUniqueId*(self: Controller, contractUniqueKey: string): Commu proc computeBurnFee*(self: Controller, contractUniqueKey: string, amount: Uint256, addressFrom: string, requestId: string) = self.communityTokensService.computeBurnFee(contractUniqueKey, amount, addressFrom, requestId) -proc getNetwork*(self:Controller, chainId: int): NetworkDto = - self.networksService.getNetwork(chainId) +proc getNetworkByChainId*(self:Controller, chainId: int): NetworkDto = + self.networksService.getNetworkByChainId(chainId) proc getOwnerToken*(self: Controller, communityId: string): CommunityTokenDto = return self.communityTokensService.getOwnerToken(communityId) diff --git a/src/app/modules/main/communities/tokens/module.nim b/src/app/modules/main/communities/tokens/module.nim index fc89e12aee4..3f11d06ca66 100644 --- a/src/app/modules/main/communities/tokens/module.nim +++ b/src/app/modules/main/communities/tokens/module.nim @@ -299,11 +299,11 @@ method computeBurnFee*(self: Module, contractUniqueKey: string, amount: string, self.controller.computeBurnFee(contractUniqueKey, amount.parse(Uint256), addressFrom, requestId) proc createUrl(self: Module, chainId: int, transactionHash: string): string = - let network = self.controller.getNetwork(chainId) + let network = self.controller.getNetworkByChainId(chainId) result = if network != nil: network.blockExplorerURL & "/tx/" & transactionHash else: "" proc getChainName(self: Module, chainId: int): string = - let network = self.controller.getNetwork(chainId) + let network = self.controller.getNetworkByChainId(chainId) result = if network != nil: network.chainName else: "" method onCommunityTokenDeployStateChanged*(self: Module, communityId: string, chainId: int, transactionHash: string, deployState: DeployState) = diff --git a/src/app/modules/main/controller.nim b/src/app/modules/main/controller.nim index 9206f7e67d8..6ade273ad37 100644 --- a/src/app/modules/main/controller.nim +++ b/src/app/modules/main/controller.nim @@ -572,8 +572,8 @@ proc getRemainingSupply*(self: Controller, chainId: int, contractAddress: string proc getRemoteDestructedAmount*(self: Controller, chainId: int, contractAddress: string): Uint256 = return self.communityTokensService.getRemoteDestructedAmount(chainId, contractAddress) -proc getNetwork*(self:Controller, chainId: int): NetworkDto = - self.networksService.getNetwork(chainId) +proc getNetworkByChainId*(self:Controller, chainId: int): NetworkDto = + self.networksService.getNetworkByChainId(chainId) proc getAppNetwork*(self:Controller): NetworkDto = self.networksService.getAppNetwork() diff --git a/src/app/modules/main/module.nim b/src/app/modules/main/module.nim index f431a52956f..684b884ac0a 100644 --- a/src/app/modules/main/module.nim +++ b/src/app/modules/main/module.nim @@ -266,7 +266,7 @@ method onAppNetworkChanged*[T](self: Module[T]) = self.view.emitAppNetworkChangedSignal() proc createTokenItem[T](self: Module[T], tokenDto: CommunityTokenDto) : token_item.TokenItem = - let network = self.controller.getNetwork(tokenDto.chainId) + let network = self.controller.getNetworkByChainId(tokenDto.chainId) let tokenOwners = self.controller.getCommunityTokenOwners(tokenDto.communityId, tokenDto.chainId, tokenDto.address) let ownerAddressName = if len(tokenDto.deployer) > 0: self.controller.getCommunityTokenOwnerName(tokenDto.deployer) else: "" let remainingSupply = if tokenDto.infiniteSupply: stint.parse("0", Uint256) else: self.controller.getRemainingSupply(tokenDto.chainId, tokenDto.address) @@ -277,7 +277,7 @@ proc createTokenItem[T](self: Module[T], tokenDto: CommunityTokenDto) : token_it proc createTokenItemImproved[T](self: Module[T], tokenDto: CommunityTokenDto, communityTokenJsonItems: JsonNode) : token_item.TokenItem = # These 3 values come from local caches so they can be done sync - let network = self.controller.getNetwork(tokenDto.chainId) + let network = self.controller.getNetworkByChainId(tokenDto.chainId) let tokenOwners = self.controller.getCommunityTokenOwners(tokenDto.communityId, tokenDto.chainId, tokenDto.address) let ownerAddressName = if len(tokenDto.deployer) > 0: self.controller.getCommunityTokenOwnerName(tokenDto.deployer) else: "" diff --git a/src/app/modules/main/wallet_section/networks/combined_item.nim b/src/app/modules/main/wallet_section/networks/combined_item.nim new file mode 100644 index 00000000000..b018b354c7b --- /dev/null +++ b/src/app/modules/main/wallet_section/networks/combined_item.nim @@ -0,0 +1,46 @@ +import strformat + +import ./item + +type + CombinedItem* = object + prod: Item + test: Item + layer: int + +proc initCombinedItem*( + prod: Item, + test: Item, + layer: int +): CombinedItem = + result.prod = prod + result.test = test + result.layer = layer + +proc `$`*(self: CombinedItem): string = + result = fmt"""CombinedItem( + prod: {self.prod}, + test: {self.test}, + layer: {self.layer}, + ]""" + +proc getProd*(self: CombinedItem): Item = + return self.prod + +proc getTest*(self: CombinedItem): Item = + return self.test + +proc getLayer*(self: CombinedItem): int = + return self.layer + +proc getShortName*(self: CombinedItem, areTestNetworksEnabled: bool): string = + if areTestNetworksEnabled: + return self.test.getShortName() + else: + return self.prod.getShortName() + +proc getChainId*(self: CombinedItem, areTestNetworksEnabled: bool): int = + if areTestNetworksEnabled: + return self.test.getChainId() + else: + return self.prod.getChainId() diff --git a/src/app/modules/main/wallet_section/networks/combined_model.nim b/src/app/modules/main/wallet_section/networks/combined_model.nim new file mode 100644 index 00000000000..6ee46b5b039 --- /dev/null +++ b/src/app/modules/main/wallet_section/networks/combined_model.nim @@ -0,0 +1,89 @@ +import NimQml, Tables, strutils, strformat + +import ./combined_item + +type + ModelRole* {.pure.} = enum + Prod = UserRole + 1, + Test + Layer + +QtObject: + type + CombinedModel* = ref object of QAbstractListModel + items: seq[CombinedItem] + + proc delete(self: CombinedModel) = + self.items = @[] + self.QAbstractListModel.delete + + proc setup(self: CombinedModel) = + self.QAbstractListModel.setup + + proc newCombinedModel*(): CombinedModel = + new(result, delete) + result.setup + + proc `$`*(self: CombinedModel): string = + for i in 0 ..< self.items.len: + result &= fmt"""[{i}]:({$self.items[i]})""" + + proc countChanged(self: CombinedModel) {.signal.} + + proc getCount(self: CombinedModel): int {.slot.} = + self.items.len + + QtProperty[int] count: + read = getCount + notify = countChanged + + method rowCount*(self: CombinedModel, index: QModelIndex = nil): int = + return self.items.len + + method roleNames(self: CombinedModel): Table[int, string] = + { + ModelRole.Prod.int:"prod", + ModelRole.Test.int:"test", + ModelRole.Layer.int:"layer", + }.toTable + + method data(self: CombinedModel, index: QModelIndex, role: int): QVariant = + if (not index.isValid): + return + + if (index.row < 0 or index.row >= self.items.len): + return + + let item = self.items[index.row] + let enumRole = role.ModelRole + + case enumRole: + of ModelRole.Prod: + result = newQVariant(item.getProd()) + of ModelRole.Test: + result = newQVariant(item.getTest()) + of ModelRole.Layer: + result = newQVariant(item.getLayer()) + + proc setItems*(self: CombinedModel, items: seq[CombinedItem]) = + self.beginResetModel() + self.items = items + self.endResetModel() + self.countChanged() + + proc getAllNetworksChainIds*(self: CombinedModel, areTestNetworksEnabled: bool): string = + var networks: seq[int] = @[] + for item in self.items: + networks.add(item.getChainId(areTestNetworksEnabled)) + return networks.join(":") + + proc getNetworkShortNames*(self: CombinedModel, preferredNetworks: string, areTestNetworksEnabled: bool): string = + var networkString = "" + let networks = preferredNetworks.split(":") + for nw in networks: + for item in self.items: + if $item.getChainId(areTestNetworksEnabled) == nw: + networkString = networkString & $item.getShortName(areTestNetworksEnabled) & ':' + break + return networkString + diff --git a/src/app/modules/main/wallet_section/networks/controller.nim b/src/app/modules/main/wallet_section/networks/controller.nim index 86d5699d1f1..4751518b284 100644 --- a/src/app/modules/main/wallet_section/networks/controller.nim +++ b/src/app/modules/main/wallet_section/networks/controller.nim @@ -34,9 +34,12 @@ proc init*(self: Controller) = self.events.on(SIGNAL_WALLET_ACCOUNT_NETWORK_ENABLED_UPDATED) do(e: Args): self.delegate.refreshNetworks() -proc getFlatNetworks*(self: Controller): seq[NetworkDto] = +proc getFlatNetworks*(self: Controller): var seq[NetworkDto] = return self.networkService.getFlatNetworks() +proc getCombinedNetworks*(self: Controller): seq[CombinedNetworkDto] = + return self.networkService.getCombinedNetworks() + proc setNetworksState*(self: Controller, chainIds: seq[int], enabled: bool) = self.walletAccountService.setNetworksState(chainIds, enabled) diff --git a/src/app/modules/main/wallet_section/networks/io_interface.nim b/src/app/modules/main/wallet_section/networks/io_interface.nim index 04d088c1722..877f04a10b5 100644 --- a/src/app/modules/main/wallet_section/networks/io_interface.nim +++ b/src/app/modules/main/wallet_section/networks/io_interface.nim @@ -1,3 +1,10 @@ +import app_service/service/network/dto + +type + NetworksDataSource* = tuple[ + getFlatNetworksList: proc(): var seq[NetworkDto] + ] + type AccessInterface* {.pure inheritable.} = ref object of RootObj ## Abstract class for any input/interaction with this module. @@ -25,3 +32,6 @@ method refreshNetworks*(self: AccessInterface) {.base.} = method getNetworkLayer*(self: AccessInterface, chainId: int): string {.base.} = raise newException(ValueError, "No implementation available") + +method getNetworksDataSource*(self: AccessInterface): NetworksDataSource {.base.} = + raise newException(ValueError, "No implementation available") diff --git a/src/app/modules/main/wallet_section/networks/item.nim b/src/app/modules/main/wallet_section/networks/item.nim index 242dce6b0f8..e8fd6ef9c32 100644 --- a/src/app/modules/main/wallet_section/networks/item.nim +++ b/src/app/modules/main/wallet_section/networks/item.nim @@ -1,4 +1,4 @@ -import strformat +import NimQml, strformat type UxEnabledState* {.pure.} = enum @@ -6,110 +6,228 @@ type AllEnabled Disabled -type - Item* = object - chainId: int - nativeCurrencyDecimals: int - layer: int - chainName: string - rpcURL: string - blockExplorerURL: string - nativeCurrencyName: string - nativeCurrencySymbol: string - isTest: bool - isEnabled: bool - iconUrl: string - chainColor: string - shortName: string - enabledState: UxEnabledState - -proc initItem*( - chainId: int, - nativeCurrencyDecimals: int, - layer: int, - chainName: string, - rpcURL: string, - blockExplorerURL: string, - nativeCurrencyName: string, - nativeCurrencySymbol: string, - isTest: bool, - isEnabled: bool, - iconUrl: string, - chainColor: string, - shortName: string, - enabledState: UxEnabledState, -): Item = - result.chainId = chainId - result.nativeCurrencyDecimals = nativeCurrencyDecimals - result.layer = layer - result.chainName = chainName - result.rpcURL = rpcURL - result.blockExplorerURL = blockExplorerURL - result.nativeCurrencyName = nativeCurrencyName - result.nativeCurrencySymbol = nativeCurrencySymbol - result.isTest = isTest - result.isEnabled = isEnabled - result.iconUrl = iconUrl - result.chainColor = chainColor - result.shortName = shortName - result.enabledState = enabledState - -proc `$`*(self: Item): string = - result = fmt"""NetworkItem( - chainId: {self.chainId}, - chainName: {self.chainName}, - layer: {self.layer}, - nativeCurrencyDecimals: {self.nativeCurrencyDecimals}, - rpcURL: {self.rpcURL}, - blockExplorerURL:{self.blockExplorerURL}, - nativeCurrencyName:{self.nativeCurrencyName}, - nativeCurrencySymbol:{self.nativeCurrencySymbol}, - isTest:{self.isTest}, - isEnabled:{self.isEnabled}, - iconUrl:{self.iconUrl}, - shortName: {self.shortName}, - chainColor: {self.chainColor}, - enabledState: {self.enabledState} - ]""" - -proc getChainId*(self: Item): int = - return self.chainId - -proc getNativeCurrencyDecimals*(self: Item): int = - return self.nativeCurrencyDecimals - -proc getLayer*(self: Item): int = - return self.layer - -proc getChainName*(self: Item): string = - return self.chainName - -proc getRpcURL*(self: Item): string = - return self.rpcURL - -proc getBlockExplorerURL*(self: Item): string = - return self.blockExplorerURL - -proc getNativeCurrencyName*(self: Item): string = - return self.nativeCurrencyName - -proc getNativeCurrencySymbol*(self: Item): string = - return self.nativeCurrencySymbol - -proc getIsTest*(self: Item): bool = - return self.isTest - -proc getIsEnabled*(self: Item): bool = - return self.isEnabled - -proc getIconURL*(self: Item): string = - return self.iconUrl - -proc getShortName*(self: Item): string = - return self.shortName - -proc getChainColor*(self: Item): string = - return self.chainColor - -proc getEnabledState*(self: Item): UxEnabledState = - return self.enabledState +QtObject: + type + Item* = ref object of QObject + chainId: int + nativeCurrencyDecimals: int + layer: int + chainName: string + rpcURL: string + blockExplorerURL: string + nativeCurrencyName: string + nativeCurrencySymbol: string + isTest: bool + isEnabled: bool + iconUrl: string + chainColor: string + shortName: string + enabledState: UxEnabledState + fallbackURL: string + originalRpcURL: string + originalFallbackURL: string + + proc setup*(self: Item, + chainId: int, + nativeCurrencyDecimals: int, + layer: int, + chainName: string, + rpcURL: string, + blockExplorerURL: string, + nativeCurrencyName: string, + nativeCurrencySymbol: string, + isTest: bool, + isEnabled: bool, + iconUrl: string, + chainColor: string, + shortName: string, + enabledState: UxEnabledState, + fallbackURL: string, + originalRpcURL: string, + originalFallbackURL: string + ) = + self.QObject.setup + self.chainId = chainId + self.nativeCurrencyDecimals = nativeCurrencyDecimals + self.layer = layer + self.chainName = chainName + self.rpcURL = rpcURL + self.blockExplorerURL = blockExplorerURL + self.nativeCurrencyName = nativeCurrencyName + self.nativeCurrencySymbol = nativeCurrencySymbol + self.isTest = isTest + self.isEnabled = isEnabled + self.iconUrl = iconUrl + self.chainColor = chainColor + self.shortName = shortName + self.enabledState = enabledState + self.fallbackURL = fallbackURL + self.originalRpcURL = originalRpcURL + self.originalFallbackURL = originalFallbackURL + + proc delete*(self: Item) = + self.QObject.delete + + proc initItem*( + chainId: int, + nativeCurrencyDecimals: int, + layer: int, + chainName: string, + rpcURL: string, + blockExplorerURL: string, + nativeCurrencyName: string, + nativeCurrencySymbol: string, + isTest: bool, + isEnabled: bool, + iconUrl: string, + chainColor: string, + shortName: string, + enabledState: UxEnabledState, + fallbackURL: string, + originalRpcURL: string, + originalFallbackURL: string + ): Item = + new(result, delete) + result.setup(chainId, nativeCurrencyDecimals, layer, chainName, rpcURL, blockExplorerURL, + nativeCurrencyName, nativeCurrencySymbol, isTest, isEnabled, iconUrl, chainColor, + shortName, enabledState, fallbackURL, originalRpcURL, originalFallbackURL) + + proc `$`*(self: Item): string = + result = fmt"""NetworkItem( + chainId: {self.chainId}, + chainName: {self.chainName}, + layer: {self.layer}, + nativeCurrencyDecimals: {self.nativeCurrencyDecimals}, + rpcURL: {self.rpcURL}, + blockExplorerURL:{self.blockExplorerURL}, + nativeCurrencyName:{self.nativeCurrencyName}, + nativeCurrencySymbol:{self.nativeCurrencySymbol}, + isTest:{self.isTest}, + isEnabled:{self.isEnabled}, + iconUrl:{self.iconUrl}, + shortName: {self.shortName}, + chainColor: {self.chainColor}, + enabledState: {self.enabledState}, + fallbackURL: {self.fallbackURL}, + originalRpcURL: {self.originalRpcURL}, + originalFallbackURL: {self.originalFallbackURL} + ]""" + + proc chainIdChanged*(self: Item) {.signal.} + proc getChainId*(self: Item): int = + return self.chainId + QtProperty[int] chainId: + read = getChainId + notify = chainIdChanged + + proc nativeCurrencyDecimalsChanged*(self: Item) {.signal.} + proc getNativeCurrencyDecimals*(self: Item): int = + return self.nativeCurrencyDecimals + QtProperty[int] nativeCurrencyDecimals: + read = getNativeCurrencyDecimals + notify = nativeCurrencyDecimalsChanged + + proc layerChanged*(self: Item) {.signal.} + proc getLayer*(self: Item): int = + return self.layer + QtProperty[int] layer: + read = getLayer + notify = layerChanged + + proc chainNameChanged*(self: Item) {.signal.} + proc getChainName*(self: Item): string = + return self.chainName + QtProperty[string] chainName: + read = getChainName + notify = chainNameChanged + + proc rpcURLChanged*(self: Item) {.signal.} + proc getRpcURL*(self: Item): string = + return self.rpcURL + QtProperty[string] rpcURL: + read = getRpcURL + notify = rpcURLChanged + + proc blockExplorerURLChanged*(self: Item) {.signal.} + proc getBlockExplorerURL*(self: Item): string = + return self.blockExplorerURL + QtProperty[string] blockExplorerURL: + read = getBlockExplorerURL + notify = blockExplorerURLChanged + + proc nativeCurrencyNameChanged*(self: Item) {.signal.} + proc getNativeCurrencyName*(self: Item): string = + return self.nativeCurrencyName + QtProperty[string] nativeCurrencyName: + read = getNativeCurrencyName + notify = nativeCurrencyNameChanged + + proc nativeCurrencySymbolChanged*(self: Item) {.signal.} + proc getNativeCurrencySymbol*(self: Item): string = + return self.nativeCurrencySymbol + QtProperty[string] nativeCurrencySymbol: + read = getNativeCurrencySymbol + notify = nativeCurrencySymbolChanged + + proc isTestChanged*(self: Item) {.signal.} + proc getIsTest*(self: Item): bool = + return self.isTest + QtProperty[bool] isTest: + read = getIsTest + notify = isTestChanged + + proc isEnabledChanged*(self: Item) {.signal.} + proc getIsEnabled*(self: Item): bool = + return self.isEnabled + QtProperty[bool] isEnabled: + read = getIsEnabled + notify = isEnabledChanged + + proc iconUrlChanged*(self: Item) {.signal.} + proc getIconURL*(self: Item): string = + return self.iconUrl + QtProperty[string] iconUrl: + read = getIconURL + notify = iconUrlChanged + + proc shortNameChanged*(self: Item) {.signal.} + proc getShortName*(self: Item): string = + return self.shortName + QtProperty[string] shortName: + read = getShortName + notify = shortNameChanged + + proc chainColorChanged*(self: Item) {.signal.} + proc getChainColor*(self: Item): string = + return self.chainColor + QtProperty[string] chainColor: + read = getChainColor + notify = chainColorChanged + + proc enabledStateChanged*(self: Item) {.signal.} + proc getEnabledState*(self: Item): int = + return self.enabledState.int + QtProperty[int] enabledState: + read = getEnabledState + notify = enabledStateChanged + + proc fallbackURLChanged*(self: Item) {.signal.} + proc fallbackURL*(self: Item): string {.slot.} = + return self.fallbackURL + QtProperty[string] fallbackURL: + read = fallbackURL + notify = fallbackURLChanged + + proc originalRpcURLChanged*(self: Item) {.signal.} + proc originalRpcURL*(self: Item): string {.slot.} = + return self.originalRpcURL + QtProperty[string] originalRpcURL: + read = originalRpcURL + notify = originalRpcURLChanged + + proc originalFallbackURLChanged*(self: Item) {.signal.} + proc originalFallbackURL*(self: Item): string {.slot.} = + return self.originalFallbackURL + QtProperty[string] originalFallbackURL: + read = originalFallbackURL + notify = originalFallbackURLChanged diff --git a/src/app/modules/main/wallet_section/networks/model.nim b/src/app/modules/main/wallet_section/networks/model.nim index c3ad326b0e4..35b4e58216d 100644 --- a/src/app/modules/main/wallet_section/networks/model.nim +++ b/src/app/modules/main/wallet_section/networks/model.nim @@ -1,7 +1,7 @@ import NimQml, Tables, strutils, strformat, sequtils, sugar import app_service/service/network/types -import ./item +import ./item, ./io_interface const EXPLORER_TX_PREFIX* = "/tx/" @@ -25,34 +25,30 @@ type QtObject: type Model* = ref object of QAbstractListModel - items: seq[Item] + delegate: io_interface.NetworksDataSource proc delete(self: Model) = - self.items = @[] self.QAbstractListModel.delete proc setup(self: Model) = self.QAbstractListModel.setup - proc newModel*(): Model = + proc newModel*(delegate: io_interface.NetworksDataSource): Model = new(result, delete) result.setup - - proc `$`*(self: Model): string = - for i in 0 ..< self.items.len: - result &= fmt"""[{i}]:({$self.items[i]})""" + result.delegate = delegate proc countChanged(self: Model) {.signal.} proc getCount(self: Model): int {.slot.} = - self.items.len + return self.delegate.getFlatNetworksList().len QtProperty[int] count: read = getCount notify = countChanged method rowCount*(self: Model, index: QModelIndex = nil): int = - return self.items.len + return self.delegate.getFlatNetworksList().len method roleNames(self: Model): Table[int, string] = { @@ -76,139 +72,138 @@ QtObject: if (not index.isValid): return - if (index.row < 0 or index.row >= self.items.len): + if (index.row < 0 or index.row >= self.rowCount()): return - let item = self.items[index.row] + let item = self.delegate.getFlatNetworksList()[index.row] let enumRole = role.ModelRole case enumRole: of ModelRole.ChainId: - result = newQVariant(item.getChainId()) + result = newQVariant(item.chainId) of ModelRole.NativeCurrencyDecimals: - result = newQVariant(item.getNativeCurrencyDecimals()) + result = newQVariant(item.nativeCurrencyDecimals) of ModelRole.Layer: - result = newQVariant(item.getLayer()) + result = newQVariant(item.layer) of ModelRole.ChainName: - result = newQVariant(item.getChainName()) + result = newQVariant(item.chainName) of ModelRole.RpcURL: - result = newQVariant(item.getRpcURL()) + result = newQVariant(item.rpcURL) of ModelRole.BlockExplorerURL: - result = newQVariant(item.getBlockExplorerURL()) + result = newQVariant(item.blockExplorerURL) of ModelRole.NativeCurrencyName: - result = newQVariant(item.getNativeCurrencyName()) + result = newQVariant(item.nativeCurrencyName) of ModelRole.NativeCurrencySymbol: - result = newQVariant(item.getNativeCurrencySymbol()) + result = newQVariant(item.nativeCurrencySymbol) of ModelRole.IsTest: - result = newQVariant(item.getIsTest()) + result = newQVariant(item.isTest) of ModelRole.IsEnabled: - result = newQVariant(item.getIsEnabled()) + result = newQVariant(item.enabled) of ModelRole.IconUrl: - result = newQVariant(item.getIconURL()) + result = newQVariant(item.iconURL) of ModelRole.ShortName: - result = newQVariant(item.getShortName()) + result = newQVariant(item.shortName) of ModelRole.ChainColor: - result = newQVariant(item.getChainColor()) + result = newQVariant(item.chainColor) of ModelRole.EnabledState: - result = newQVariant(item.getEnabledState().int) + result = newQVariant("")#item.enabledState) proc rowData*(self: Model, index: int, column: string): string {.slot.} = - if (index >= self.items.len): + if (index >= self.rowCount()): return - let item = self.items[index] + let item = self.delegate.getFlatNetworksList()[index] case column: - of "chainId": result = $item.getChainId() - of "nativeCurrencyDecimals": result = $item.getNativeCurrencyDecimals() - of "layer": result = $item.getLayer() - of "chainName": result = $item.getChainName() - of "rpcURL": result = $item.getRpcURL() - of "blockExplorerURL": result = $item.getBlockExplorerURL() - of "nativeCurrencyName": result = $item.getNativeCurrencyName() - of "nativeCurrencySymbol": result = $item.getNativeCurrencySymbol() - of "isTest": result = $item.getIsTest() - of "isEnabled": result = $item.getIsEnabled() - of "iconUrl": result = $item.getIconURL() - of "chainColor": result = $item.getChainColor() - of "shortName": result = $item.getShortName() - of "enabledState": result = $item.getEnabledState().int + of "chainId": result = $item.chainId + of "nativeCurrencyDecimals": result = $item.nativeCurrencyDecimals + of "layer": result = $item.layer + of "chainName": result = $item.chainName + of "rpcURL": result = $item.rpcURL + of "blockExplorerURL": result = $item.blockExplorerURL + of "nativeCurrencyName": result = $item.nativeCurrencyName + of "nativeCurrencySymbol": result = $item.nativeCurrencySymbol + of "isTest": result = $item.isTest + of "isEnabled": result = $item.enabled + of "iconUrl": result = $item.iconURL + of "chainColor": result = $item.chainColor + of "shortName": result = $item.shortName +# of "enabledState": result = $item.enabledState proc setItems*(self: Model, items: seq[Item]) = self.beginResetModel() - self.items = items self.endResetModel() self.countChanged() proc getChainColor*(self: Model, chainId: int): string {.slot.} = - for item in self.items: - if(item.getChainId() == chainId): - return item.getChainColor() + for item in self.delegate.getFlatNetworksList(): + if(item.chainId == chainId): + return item.chainColor return "" proc getIconUrl*(self: Model, chainId: int): string {.slot.} = - for item in self.items: - if(item.getChainId() == chainId): - return item.getIconURL() + for item in self.delegate.getFlatNetworksList(): + if(item.chainId == chainId): + return item.iconURL return "" proc getNetworkShortName*(self: Model, chainId: int): string {.slot.} = - for item in self.items: - if(item.getChainId() == chainId): - return item.getShortName() + for item in self.delegate.getFlatNetworksList(): + if(item.chainId == chainId): + return item.shortName return "" proc getNetworkFullName*(self: Model, chainId: int): string {.slot.} = - for item in self.items: - if(item.getChainId() == chainId): - return item.getChainName() + for item in self.delegate.getFlatNetworksList(): + if(item.chainId == chainId): + return item.chainName return "" proc getNetworkLayer*(self: Model, chainId: int): string {.slot.} = - for item in self.items: - if(item.getChainId() == chainId): - return $item.getLayer() + for item in self.delegate.getFlatNetworksList(): + if(item.chainId == chainId): + return $item.layer return "" proc getNetworkIconUrl*(self: Model, shortName: string): string {.slot.} = - for item in self.items: - if cmpIgnoreCase(item.getShortName(), shortName) == 0: - return item.getIconURL() + for item in self.delegate.getFlatNetworksList(): + if cmpIgnoreCase(item.shortName, shortName) == 0: + return item.iconURL return "" proc getNetworkName*(self: Model, shortName: string): string {.slot.} = - for item in self.items: - if cmpIgnoreCase(item.getShortName(), shortName) == 0: - return item.getChainName() + for item in self.delegate.getFlatNetworksList(): + if cmpIgnoreCase(item.shortName, shortName) == 0: + return item.chainName return "" proc getNetworkColor*(self: Model, shortName: string): string {.slot.} = - for item in self.items: - if cmpIgnoreCase(item.getShortName(), shortName) == 0: - return item.getChainColor() + for item in self.delegate.getFlatNetworksList(): + if cmpIgnoreCase(item.shortName, shortName) == 0: + return item.chainColor return "" proc getNetworkChainId*(self: Model, shortName: string): int {.slot.} = - for item in self.items: - if cmpIgnoreCase(item.getShortName(), shortName) == 0: - return item.getChainId() + for item in self.delegate.getFlatNetworksList(): + if cmpIgnoreCase(item.shortName, shortName) == 0: + return item.chainId return 0 proc getLayer1Network*(self: Model, testNet: bool): int = - for item in self.items: - if item.getLayer() == NETWORK_LAYER_1 and item.getIsTest() == testNet: - return item.getChainId() + for item in self.delegate.getFlatNetworksList(): + if item.layer == NETWORK_LAYER_1 and item.isTest == testNet: + return item.chainId return 0 proc getBlockExplorerURL*(self: Model, chainId: int): string {.slot.} = - for item in self.items: - if(item.getChainId() == chainId): - return item.getBlockExplorerURL() & EXPLORER_TX_PREFIX + for item in self.delegate.getFlatNetworksList(): + if(item.chainId == chainId): + return item.blockExplorerURL & EXPLORER_TX_PREFIX return "" - proc getEnabledState*(self: Model, chainId: int): UxEnabledState = - for item in self.items: - if(item.getChainId() == chainId): - return item.getEnabledState() - return UxEnabledState.Disabled +# proc getEnabledState*(self: Model, chainId: int): UxEnabledState = +# for item in self.delegate.getFlatNetworksList(): +# if(item.chainId == chainId): +# return UxEnabledState(item.enabledState) +# return UxEnabledState.Disabled # Returns the chains that need to be enabled or disabled (the second return value) # to satisty the transitions: all enabled to only chainId enabled and @@ -216,29 +211,29 @@ QtObject: proc networksToChangeStateOnUserActionFor*(self: Model, chainId: int): (seq[int], bool) = var chainIds: seq[int] = @[] var enable = false - case self.getEnabledState(chainId): - of UxEnabledState.Enabled: - # Iterate to check for the only chainId enabled case ... - for item in self.items: - if item.getEnabledState() == UxEnabledState.Enabled and item.getChainId() != chainId: - # ... as soon as we find another enabled chain mark this by adding it to the list - chainIds.add(chainId) - break - - # ... if no other chains are enabled, then it's a transition from only chainId enabled to all enabled - if chainIds.len == 0: - for item in self.items: - if item.getChainId() != chainId: - chainIds.add(item.getChainId()) - enable = true - of UxEnabledState.Disabled: - chainIds.add(chainId) - enable = true - of UxEnabledState.AllEnabled: - # disable all but chainId - for item in self.items: - if item.getChainId() != chainId: - chainIds.add(item.getChainId()) +# case self.getEnabledState(chainId): +# of UxEnabledState.Enabled: +# # Iterate to check for the only chainId enabled case ... +# for item in self.delegate.getFlatNetworksList(): +# if UxEnabledState(item.enabledState) == UxEnabledState.Enabled and item.chainId != chainId: +# # ... as soon as we find another enabled chain mark this by adding it to the list +# chainIds.add(chainId) +# break + +# # ... if no other chains are enabled, then it's a transition from only chainId enabled to all enabled +# if chainIds.len == 0: +# for item in self.delegate.getFlatNetworksList(): +# if item.chainId != chainId: +# chainIds.add(item.chainId) +# enable = true +# of UxEnabledState.Disabled: +# chainIds.add(chainId) +# enable = true +# of UxEnabledState.AllEnabled: +# # disable all but chainId +# for item in self.delegate.getFlatNetworksList(): +# if item.chainId != chainId: +# chainIds.add(item.chainId) return (chainIds, enable) @@ -246,9 +241,9 @@ QtObject: var networkString = "" let networks = preferredNetworks.split(":") for nw in networks: - for item in self.items: - if $item.getChainId() == nw: - networkString = networkString & item.getShortName() & ':' + for item in self.delegate.getFlatNetworksList(): + if $item.chainId == nw: + networkString = networkString & item.shortName & ':' break return networkString @@ -256,11 +251,11 @@ QtObject: var networkIds = "" let networksNames = shortNames.split(":") for name in networksNames: - for item in self.items: - if item.getShortName() == name: - networkIds = networkIds & $item.getChainId() & ':' + for item in self.delegate.getFlatNetworksList(): + if item.shortName == name: + networkIds = networkIds & $item.chainId & ':' break return networkIds proc getAllNetworksChainIds*(self: Model): string = - return self.items.map(x => x.getChainId()).join(":") + return self.delegate.getFlatNetworksList().map(x => x.chainId).join(":") diff --git a/src/app/modules/main/wallet_section/networks/module.nim b/src/app/modules/main/wallet_section/networks/module.nim index e0fa69d8601..8f3cbaee3e9 100644 --- a/src/app/modules/main/wallet_section/networks/module.nim +++ b/src/app/modules/main/wallet_section/networks/module.nim @@ -1,6 +1,6 @@ -import NimQml +import NimQml, sequtils, sugar import ../io_interface as delegate_interface -import io_interface, view, controller +import io_interface, view, controller, combined_item, item import ../../../../global/global_singleton import ../../../../core/eventemitter import ../../../../../app_service/service/network/service as network_service @@ -38,9 +38,68 @@ method delete*(self: Module) = self.viewVariant.delete self.controller.delete + +proc networkEnabledToUxEnabledState(enabled: bool, allEnabled: bool): UxEnabledState = + return if allEnabled: + UxEnabledState.AllEnabled + elif enabled: + UxEnabledState.Enabled + else: + UxEnabledState.Disabled + +proc areAllEnabled(networks: seq[NetworkDto]): bool = + return networks.allIt(it.enabled) + method refreshNetworks*(self: Module) = self.view.setAreTestNetworksEnabled(self.controller.areTestNetworksEnabled()) - self.view.setItems(self.controller.getFlatNetworks()) + let combinedNetworks = self.controller.getCombinedNetworks() + let allProdEnabled = areAllEnabled(combinedNetworks.map(n => n.prod)) + let allTestEnabled = areAllEnabled(combinedNetworks.map(n => n.test)) + var items: seq[Item] = @[] + var combinedItems: seq[CombinedItem] = @[] + for n in combinedNetworks: + var prod = initItem( + n.prod.chainId, + n.prod.nativeCurrencyDecimals, + n.prod.layer, + n.prod.chainName, + n.prod.rpcURL, + n.prod.blockExplorerURL, + n.prod.nativeCurrencyName, + n.prod.nativeCurrencySymbol, + n.prod.isTest, + n.prod.enabled, + n.prod.iconUrl, + n.prod.chainColor, + n.prod.shortName, + networkEnabledToUxEnabledState(n.prod.enabled, allProdEnabled), + n.prod.fallbackURL, + n.prod.originalRpcURL, + n.prod.originalFallbackURL + ) + var test = initItem( + n.test.chainId, + n.test.nativeCurrencyDecimals, + n.test.layer, + n.test.chainName, + n.test.rpcURL, + n.test.blockExplorerURL, + n.test.nativeCurrencyName, + n.test.nativeCurrencySymbol, + n.test.isTest, + n.test.enabled, + n.test.iconUrl, + n.test.chainColor, + n.test.shortName, + networkEnabledToUxEnabledState(n.test.enabled, allTestEnabled), + n.test.fallbackURL, + n.test.originalRpcURL, + n.test.originalFallbackURL + ) + items.add(test) + items.add(prod) + combinedItems.add(initCombinedItem(prod, test, n.prod.layer)) + self.view.setItems(items, combinedItems) method load*(self: Module) = self.controller.init() @@ -65,3 +124,10 @@ method setNetworksState*(self: Module, chainIds: seq[int], enabled: bool) = method getNetworkLayer*(self: Module, chainId: int): string = return self.view.getNetworkLayer(chainId) + +# Interfaces for getting lists from the service files into the abstract models + +method getNetworksDataSource*(self: Module): NetworksDataSource = + return ( + getFlatNetworksList: proc(): var seq[NetworkDto] = self.controller.getFlatNetworks() + ) diff --git a/src/app/modules/main/wallet_section/networks/view.nim b/src/app/modules/main/wallet_section/networks/view.nim index 691a4fb9c60..5e035527183 100644 --- a/src/app/modules/main/wallet_section/networks/view.nim +++ b/src/app/modules/main/wallet_section/networks/view.nim @@ -4,9 +4,8 @@ import app_service/service/network/[dto, types] import ./io_interface import ./model import ./item - -proc networkEnabledToUxEnabledState(enabled: bool, allEnabled: bool): UxEnabledState -proc areAllEnabled(networks: seq[NetworkDto]): bool +import ./combined_model +import ./combined_item QtObject: type @@ -17,6 +16,7 @@ QtObject: layer1: Model layer2: Model flatNetworks: Model + combinedNetworks: CombinedModel areTestNetworksEnabled: bool enabledChainIds: string @@ -25,15 +25,17 @@ QtObject: proc delete*(self: View) = self.QObject.delete + self.combinedNetworks.delete proc newView*(delegate: io_interface.AccessInterface): View = new(result, delete) result.delegate = delegate - result.all = newModel() - result.layer1 = newModel() - result.layer2 = newModel() - result.enabled = newModel() - result.flatNetworks = newModel() + result.all = newModel(delegate.getNetworksDataSource()) + result.layer1 = newModel(delegate.getNetworksDataSource()) + result.layer2 = newModel(delegate.getNetworksDataSource()) + result.enabled = newModel(delegate.getNetworksDataSource()) + result.flatNetworks = newModel(delegate.getNetworksDataSource()) + result.combinedNetworks = newCombinedModel() result.enabledChainIds = "" result.setup() @@ -101,30 +103,17 @@ QtObject: read = getEnabledChainIds notify = enabledChainIdsChanged - proc setItems*(self: View, networks: seq[NetworkDto]) = - var items: seq[Item] = @[] - let allEnabled = areAllEnabled(networks) - for n in networks: - items.add(initItem( - n.chainId, - n.nativeCurrencyDecimals, - n.layer, - n.chainName, - n.rpcURL, - n.blockExplorerURL, - n.nativeCurrencyName, - n.nativeCurrencySymbol, - n.isTest, - n.enabled, - n.iconUrl, - n.chainColor, - n.shortName, - # Ensure we mark all as enabled if all are enabled - networkEnabledToUxEnabledState(n.enabled, allEnabled) - )) - - let filteredItems = items.filter(i => i.getIsTest() == self.areTestNetworksEnabled) - self.flatNetworks.setItems(items) + proc combinedNetworksChanged*(self: View) {.signal.} + proc getCombinedNetworks(self: View): QVariant {.slot.} = + return newQVariant(self.combinedNetworks) + QtProperty[QVariant] combinedNetworks: + read = getCombinedNetworks + notify = combinedNetworksChanged + + proc setItems*(self: View, networks: seq[Item], combinedItems: seq[CombinedItem]) = + self.combinedNetworks.setItems(combinedItems) + let filteredItems = networks.filter(i => i.getIsTest() == self.areTestNetworksEnabled) + self.flatNetworks.setItems(networks) self.all.setItems(filteredItems) self.layer1.setItems(filteredItems.filter(i => i.getLayer() == NETWORK_LAYER_1)) self.layer2.setItems(filteredItems.filter(i => i.getLayer() == NETWORK_LAYER_2)) @@ -156,14 +145,6 @@ QtObject: proc getAllNetworksChainIds*(self: View): string {.slot.} = return self.all.getAllNetworksChainIds() -proc networkEnabledToUxEnabledState(enabled: bool, allEnabled: bool): UxEnabledState = - return if allEnabled: - UxEnabledState.AllEnabled - elif enabled: - UxEnabledState.Enabled - else: - UxEnabledState.Disabled - proc areAllEnabled(networks: seq[NetworkDto]): bool = return networks.allIt(it.enabled) diff --git a/src/app/modules/shared_modules/collectible_details/controller.nim b/src/app/modules/shared_modules/collectible_details/controller.nim index cb569d5c25c..60d11220da2 100644 --- a/src/app/modules/shared_modules/collectible_details/controller.nim +++ b/src/app/modules/shared_modules/collectible_details/controller.nim @@ -54,7 +54,7 @@ QtObject: notify = isDetailedEntryLoadingChanged proc getExtraData(self: Controller, chainID: int): ExtraData = - let network = self.networkService.getNetwork(chainID) + let network = self.networkService.getNetworkByChainId(chainID) return getExtraData(network) proc processGetCollectiblesDetailsResponse(self: Controller, response: JsonNode) = diff --git a/src/app/modules/shared_modules/collectibles/controller.nim b/src/app/modules/shared_modules/collectibles/controller.nim index 2728d456cbf..fd0c03260a6 100644 --- a/src/app/modules/shared_modules/collectibles/controller.nim +++ b/src/app/modules/shared_modules/collectibles/controller.nim @@ -147,7 +147,7 @@ QtObject: self.loadMoreItems() proc getExtraData(self: Controller, chainID: int): ExtraData = - let network = self.networkService.getNetwork(chainID) + let network = self.networkService.getNetworkByChainId(chainID) return getExtraData(network) proc setTempItems(self: Controller, newItems: seq[CollectiblesEntry], offset: int) = diff --git a/src/app_service/service/network/service.nim b/src/app_service/service/network/service.nim index 20643fbbe13..63a01b32cd0 100644 --- a/src/app_service/service/network/service.nim +++ b/src/app_service/service/network/service.nim @@ -1,4 +1,4 @@ -import json, json_serialization, chronicles, atomics +import json, json_serialization, chronicles, atomics, sugar, sequtils import ../../../app/core/eventemitter import ../../../backend/backend as backend @@ -22,11 +22,9 @@ type Service* = ref object of RootObj events: EventEmitter networks: seq[CombinedNetworkDto] - networksInited: bool - dirty: Atomic[bool] + flatNetworks: seq[NetworkDto] settingsService: settings_service.Service - proc delete*(self: Service) = discard @@ -35,48 +33,37 @@ proc newService*(events: EventEmitter, settingsService: settings_service.Service result.events = events result.settingsService = settingsService -proc init*(self: Service) = - discard +proc fetchNetworks*(self: Service) = + let response = backend.getEthereumChains() + if not response.error.isNil: + raise newException(Exception, "Error getting networks: " & response.error.message) + self.networks = if response.result.isNil or response.result.kind == JNull: @[] + else: Json.decode($response.result, seq[CombinedNetworkDto], allowUnknownFields = true) + self.flatNetworks = @[] + for network in self.networks: + self.flatNetworks.add(network.test) + self.flatNetworks.add(network.prod) -proc fetchNetworks*(self: Service, useCached: bool = true): seq[CombinedNetworkDto] = - let cacheIsDirty = not self.networksInited or self.dirty.load - if useCached and not cacheIsDirty: - result = self.networks - else: - let response = backend.getEthereumChains() - if not response.error.isNil: - raise newException(Exception, "Error getting networks: " & response.error.message) - result = if response.result.isNil or response.result.kind == JNull: @[] - else: Json.decode($response.result, seq[CombinedNetworkDto], allowUnknownFields = true) - self.dirty.store(false) - self.networks = result - self.networksInited = true +proc init*(self: Service) = + self.fetchNetworks() proc resetNetworks*(self: Service) = - discard self.fetchNetworks(useCached = false) + self.fetchNetworks() proc getCombinedNetworks*(self: Service): seq[CombinedNetworkDto] = - return self.fetchNetworks() + return self.networks # TODO:: update the networks service to unify the model exposed from this service # We currently have 3 types: combined, test/mainet and flat and probably can be optimized # follow up task https://github.com/status-im/status-desktop/issues/12717 -proc getFlatNetworks*(self: Service): seq[NetworkDto] = - for network in self.fetchNetworks(): - result.add(network.test) - result.add(network.prod) +proc getFlatNetworks*(self: Service): var seq[NetworkDto] = + return self.flatNetworks proc getNetworks*(self: Service): seq[NetworkDto] = - let testNetworksEnabled = self.settingsService.areTestNetworksEnabled() - - for network in self.fetchNetworks(): - if testNetworksEnabled: - result.add(network.test) - else: - result.add(network.prod) + self.flatNetworks.filter(n => n.isTest == self.settingsService.areTestNetworksEnabled()) proc getAllNetworkChainIds*(self: Service): seq[int] = - for network in self.fetchNetworks(): + for network in self.networks: result.add(network.test.chainId) result.add(network.prod.chainId) @@ -100,48 +87,30 @@ proc upsertNetwork*(self: Service, network: NetworkDto): bool = shortName: network.shortName, relatedChainID: network.relatedChainID, )) - self.dirty.store(true) return response.error == nil proc deleteNetwork*(self: Service, network: NetworkDto) = discard backend.deleteEthereumChain(network.chainId) - self.dirty.store(true) -proc getNetwork*(self: Service, chainId: int): NetworkDto = +proc getNetworkByChainId*(self: Service, chainId: int): NetworkDto = let testNetworksEnabled = self.settingsService.areTestNetworksEnabled() - for network in self.fetchNetworks(): + for network in self.networks: let net = if testNetworksEnabled: network.test else: network.prod if chainId == net.chainId: return net - -proc getNetworkByChainId*(self: Service, chainId: int): NetworkDto = - for network in self.fetchNetworks(): - if chainId == network.prod.chainId: - return network.prod - elif chainId == network.test.chainId: - return network.test - -proc getNetwork*(self: Service, networkType: NetworkType): NetworkDto = - let testNetworksEnabled = self.settingsService.areTestNetworksEnabled() - for network in self.fetchNetworks(): - let net = if testNetworksEnabled: network.test - else: network.prod - if networkType.toChainId() == net.chainId: - return net - - # Will be removed, this is used in case of legacy chain Id - return NetworkDto(chainId: networkType.toChainId()) + return nil proc setNetworksState*(self: Service, chainIds: seq[int], enabled: bool) = for chainId in chainIds: - let network = self.getNetwork(chainId) + let network = self.getNetworkByChainId(chainId) - if network.enabled == enabled: - continue + if not network.isNil: + if network.enabled == enabled: + continue - network.enabled = enabled - discard self.upsertNetwork(network) + network.enabled = enabled + discard self.upsertNetwork(network) ## This procedure retuns the network to be used based on the app mode (testnet/mainnet). ## We don't need to check if retuned network is nil cause it should never be, but if somehow it is, the app will be closed. @@ -159,7 +128,7 @@ proc getAppNetwork*(self: Service): NetworkDto = networkId = Sepolia if self.settingsService.isGoerliEnabled(): networkId = Goerli - let network = self.getNetwork(networkId) + let network = self.getNetworkByChainId(networkId) if network.isNil: # we should not be here ever error "the app network cannot be resolved" @@ -169,11 +138,12 @@ proc getAppNetwork*(self: Service): NetworkDto = proc updateNetworkEndPointValues*(self: Service, chainId: int, newMainRpcInput, newFailoverRpcUrl: string, revertToDefault: bool) = let network = self.getNetworkByChainId(chainId) - if network.rpcURL != newMainRpcInput: - network.rpcURL = newMainRpcInput + if not network.isNil: + if network.rpcURL != newMainRpcInput: + network.rpcURL = newMainRpcInput - if network.fallbackURL != newFailoverRpcUrl: - network.fallbackURL = newFailoverRpcUrl + if network.fallbackURL != newFailoverRpcUrl: + network.fallbackURL = newFailoverRpcUrl - if self.upsertNetwork(network): - self.events.emit(SIGNAL_NETWORK_ENDPOINT_UPDATED, NetworkEndpointUpdatedArgs(isTest: network.isTest, networkName: network.chainName, revertedToDefault: revertToDefault)) + if self.upsertNetwork(network): + self.events.emit(SIGNAL_NETWORK_ENDPOINT_UPDATED, NetworkEndpointUpdatedArgs(isTest: network.isTest, networkName: network.chainName, revertedToDefault: revertToDefault)) diff --git a/src/app_service/service/transaction/service.nim b/src/app_service/service/transaction/service.nim index 93e4c4b4c21..ebe4c573e2f 100644 --- a/src/app_service/service/transaction/service.nim +++ b/src/app_service/service/transaction/service.nim @@ -487,8 +487,8 @@ QtObject: if token != nil: tokenSymbol = token.symbol - let network = self.networkService.getNetwork(chainID) - if network.nativeCurrencySymbol == tokenSymbol: + let network = self.networkService.getNetworkByChainId(chainID) + if not network.isNil and network.nativeCurrencySymbol == tokenSymbol: isEthTx = true if(isEthTx):