feat(@wallet): multi network history

This commit is contained in:
Anthony Laibe 2022-06-07 15:57:09 +02:00 committed by Anthony Laibe
parent c296fa21bc
commit ce7340b9a5
64 changed files with 234 additions and 1235 deletions

View File

@ -133,7 +133,7 @@ proc newAppController*(statusFoundation: StatusFoundation): AppController =
result.accountsService = accounts_service.newService(statusFoundation.fleetConfiguration)
result.networkService = network_service.newService(statusFoundation.events, result.settingsService)
result.contactsService = contacts_service.newService(
statusFoundation.events, statusFoundation.threadpool, result.settingsService
statusFoundation.events, statusFoundation.threadpool, result.networkService
)
result.chatService = chat_service.newService(statusFoundation.events, result.contactsService)
result.communityService = community_service.newService(statusFoundation.events,
@ -151,8 +151,7 @@ proc newAppController*(statusFoundation: StatusFoundation): AppController =
result.messageService = message_service.newService(
statusFoundation.events, statusFoundation.threadpool, result.contactsService, result.tokenService, result.walletAccountService, result.networkService
)
result.transactionService = transaction_service.newService(statusFoundation.events, statusFoundation.threadpool,
result.walletAccountService, result.networkService, result.settingsService, result.tokenService)
result.transactionService = transaction_service.newService(statusFoundation.events, statusFoundation.threadpool, result.networkService, result.settingsService, result.tokenService)
result.bookmarkService = bookmark_service.newService(statusFoundation.events)
result.profileService = profile_service.newService(result.contactsService, result.settingsService)
result.stickersService = stickers_service.newService(

View File

@ -18,7 +18,6 @@ const LSS_KEY_EXPAND_USERS_LIST* = "expandUsersList"
const DEFAULT_EXPAND_USERS_LIST = true
const LSS_KEY_IS_GIF_WIDGET_ENABLED* = "isGifWidgetEnabled"
const DEFAULT_IS_GIF_WIDGET_ENABLED = true
const LSS_KEY_IS_MULTI_NETWORK_ENABLED* = "isMultiNetworkEnabled"
const DEFAULT_IS_MULTI_NETWORK_ENABLED = false
const LSS_KEY_IS_TENOR_WARNING_ACCEPTED* = "isTenorWarningAccepted"
const DEFAULT_IS_TENOR_WARNING_ACCEPTED = false
@ -267,18 +266,6 @@ QtObject:
write = setIsGifWidgetEnabled
notify = isGifWidgetEnabledChanged
proc isMultiNetworkEnabledChanged*(self: LocalAccountSensitiveSettings) {.signal.}
proc getIsMultiNetworkEnabled*(self: LocalAccountSensitiveSettings): bool {.slot.} =
getSettingsProp[bool](self, LSS_KEY_IS_MULTI_NETWORK_ENABLED, newQVariant(DEFAULT_IS_MULTI_NETWORK_ENABLED))
proc setIsMultiNetworkEnabled*(self: LocalAccountSensitiveSettings, value: bool) {.slot.} =
setSettingsProp(self, LSS_KEY_IS_MULTI_NETWORK_ENABLED, newQVariant(value)):
self.isMultiNetworkEnabledChanged()
QtProperty[bool] isMultiNetworkEnabled:
read = getIsMultiNetworkEnabled
write = setIsMultiNetworkEnabled
notify = isMultiNetworkEnabledChanged
proc isTenorWarningAcceptedChanged*(self: LocalAccountSensitiveSettings) {.signal.}
proc getIsTenorWarningAccepted*(self: LocalAccountSensitiveSettings): bool {.slot.} =
getSettingsProp[bool](self, LSS_KEY_IS_TENOR_WARNING_ACCEPTED, newQVariant(DEFAULT_IS_TENOR_WARNING_ACCEPTED))
@ -758,7 +745,6 @@ QtObject:
of LSS_KEY_SHOW_ONLINE_USERS: self.showOnlineUsersChanged()
of LSS_KEY_EXPAND_USERS_LIST: self.expandUsersListChanged()
of LSS_KEY_IS_GIF_WIDGET_ENABLED: self.isGifWidgetEnabledChanged()
of LSS_KEY_IS_MULTI_NETWORK_ENABLED: self.isMultiNetworkEnabledChanged()
of LSS_KEY_IS_TENOR_WARNING_ACCEPTED: self.isTenorWarningAcceptedChanged()
of LSS_KEY_DISPLAY_CHAT_IMAGES: self.displayChatImagesChanged()
of LSS_KEY_RECENT_EMOJIS: self.recentEmojisChanged()

View File

@ -10,6 +10,7 @@ import dapps/module as dapps_module
import current_account/module as current_account_module
import ../../../../app_service/service/bookmarks/service as bookmark_service
import ../../../../app_service/service/settings/service as settings_service
import ../../../../app_service/service/network/service as network_service
import ../../../../app_service/service/dapp_permissions/service as dapp_permissions_service
import ../../../../app_service/service/provider/service as provider_service
import ../../../../app_service/service/wallet_account/service as wallet_account_service
@ -32,6 +33,7 @@ proc newModule*(delegate: delegate_interface.AccessInterface,
events: EventEmitter,
bookmarkService: bookmark_service.Service,
settingsService: settings_service.Service,
networkService: network_service.Service,
dappPermissionsService: dapp_permissions_service.Service,
providerService: provider_service.Service,
walletAccountService: wallet_account_service.Service): Module =
@ -41,7 +43,7 @@ proc newModule*(delegate: delegate_interface.AccessInterface,
result.view = view.newView(result)
result.viewVariant = newQVariant(result.view)
result.moduleLoaded = false
result.providerModule = provider_module.newModule(result, events, settingsService, providerService)
result.providerModule = provider_module.newModule(result, events, settingsService, networkService, providerService)
result.bookmarkModule = bookmark_module.newModule(result, events, bookmarkService)
result.dappsModule = dapps_module.newModule(result, dappPermissionsService, walletAccountService)
result.currentAccountModule = current_account_module.newModule(result, events, walletAccountService)

View File

@ -2,36 +2,47 @@ import strutils
import io_interface
import ../../../../core/eventemitter
import ../../../../../app_service/service/network/service as network_service
import ../../../../../app_service/service/settings/service as settings_service
import ../../../../../app_service/service/provider/service as provider_service
import ../../../../../app_service/service/wallet_account/service
type
Controller* = ref object of RootObj
delegate: io_interface.AccessInterface
events: EventEmitter
settingsService: settings_service.Service
networkService: network_service.Service
providerService: provider_service.Service
proc newController*(
delegate: io_interface.AccessInterface,
events: EventEmitter,
settingsService: settings_service.Service,
providerService: provider_service.Service
networkService: network_service.Service,
providerService: provider_service.Service,
): Controller =
result = Controller()
result.events = events
result.delegate = delegate
result.settingsService = settingsService
result.networkService = networkService
result.providerService = providerService
proc delete*(self: Controller) =
discard
proc getNetwork*(self: Controller): NetworkDto =
return self.networkService.getNetworkForBrowser()
proc init*(self: Controller) =
self.events.on(PROVIDER_SIGNAL_ON_POST_MESSAGE) do(e:Args):
let args = OnPostMessageArgs(e)
self.delegate.onPostMessage(args.payloadMethod, args.result)
self.events.on(SIGNAL_WALLET_ACCOUNT_NETWORK_ENABLED_UPDATED) do(e: Args):
self.delegate.updateNetwork(self.getNetwork())
proc getDappsAddress*(self: Controller): string =
return self.settingsService.getDappsAddress()
@ -39,12 +50,6 @@ proc setDappsAddress*(self: Controller, address: string) =
if self.settingsService.saveDappsAddress(address):
self.delegate.onDappAddressChanged(address)
proc getCurrentNetworkId*(self: Controller): int =
return self.settingsService.getCurrentNetworkId()
proc getCurrentNetwork*(self: Controller): string =
return self.settingsService.getCurrentNetwork()
proc postMessage*(self: Controller, payloadMethod: string, requestType: string, message: string) =
self.providerService.postMessage(payloadMethod, requestType, message)

View File

@ -1,3 +1,5 @@
import ../../../../../app_service/service/network/service
type
AccessInterface* {.pure inheritable.} = ref object of RootObj
@ -30,3 +32,6 @@ method onPostMessage*(self: AccessInterface, payloadMethod: string, result: stri
method viewDidLoad*(self: AccessInterface) {.base.} =
raise newException(ValueError, "No implementation available")
method updateNetwork*(self: AccessInterface, network: NetworkDto) {.base.} =
raise newException(ValueError, "No implementation available")

View File

@ -6,6 +6,7 @@ import ../../../../core/eventemitter
import ../io_interface as delegate_interface
import ../../../../../app_service/service/settings/service as settings_service
import ../../../../../app_service/service/network/service as network_service
import ../../../../../app_service/service/provider/service as provider_service
import ../../../../global/global_singleton
export io_interface
@ -22,6 +23,7 @@ proc newModule*(
delegate: delegate_interface.AccessInterface,
events: EventEmitter,
settingsService: settings_service.Service,
networkService: network_service.Service,
providerService: provider_service.Service
): Module =
result = Module()
@ -29,7 +31,7 @@ proc newModule*(
result.view = newView(result)
result.viewVariant = newQVariant(result.view)
result.moduleLoaded = false
result.controller = controller.newController(result, events, settingsService, providerService)
result.controller = controller.newController(result, events, settingsService, networkService, providerService)
method delete*(self: Module) =
self.controller.delete
@ -39,8 +41,9 @@ method delete*(self: Module) =
method load*(self: Module) =
singletonInstance.engine.setRootContextProperty("providerModule", self.viewVariant)
self.view.dappsAddress = self.controller.getDappsAddress()
self.view.networkId = self.controller.getCurrentNetworkId()
self.view.currentNetwork = self.controller.getCurrentNetwork()
let network = self.controller.getNetwork()
self.view.chainId = network.chainId
self.view.chainName = network.chainName
self.view.load()
self.controller.init()
@ -65,3 +68,7 @@ method onPostMessage*(self: Module, payloadMethod: string, result: string) =
method ensResourceURL*(self: Module, ens: string, url: string): (string, string, string, string, bool) =
return self.controller.ensResourceURL(ens, url)
method updateNetwork*(self: Module, network: NetworkDto) =
self.view.chainId = network.chainId
self.view.chainName = network.chainName

View File

@ -7,8 +7,8 @@ QtObject:
View* = ref object of QObject
delegate: io_interface.AccessInterface
dappsAddress: string
networkId: int
currentNetwork: string
chainId: int
chainName: string
proc delete*(self: View) =
self.QObject.delete
@ -38,31 +38,31 @@ QtObject:
write = setDappsAddress
notify = dappsAddressChanged
proc networkIdChanged(self: View, networkId: int) {.signal.}
proc chainIdChanged(self: View, chainId: int) {.signal.}
proc `networkId=`*(self: View, value: int) =
self.networkId = value
self.networkIdChanged(value)
proc `chainId=`*(self: View, value: int) =
self.chainId = value
self.chainIdChanged(value)
proc networkId*(self: View): int {.slot.} =
result = self.networkId
proc chainId*(self: View): int {.slot.} =
result = self.chainId
QtProperty[int] networkId:
read = networkId
notify = networkIdChanged
QtProperty[int] chainId:
read = chainId
notify = chainIdChanged
proc currentNetworkChanged(self: View) {.signal.}
proc chainNameChanged(self: View) {.signal.}
proc `currentNetwork=`*(self: View, value: string) =
self.currentNetwork = value
self.currentNetworkChanged()
proc `chainName=`*(self: View, value: string) =
self.chainName = value
self.chainNameChanged()
proc currentNetwork*(self: View): string {.slot.} =
result = self.currentNetwork
proc chainName*(self: View): string {.slot.} =
result = self.chainName
QtProperty[string] currentNetwork:
read = currentNetwork
notify = currentNetworkChanged
QtProperty[string] chainName:
read = chainName
notify = chainNameChanged
proc replaceHostByENS*(self: View, url: string, ens: string): string {.slot.} =
result = url_replaceHostAndAddPath(url, ens)

View File

@ -147,8 +147,10 @@ proc newModule*[T](
transactionService, collectible_service, walletAccountService,
settingsService, savedAddressService, networkService,
)
result.browserSectionModule = browser_section_module.newModule(result, events, bookmarkService, settingsService,
dappPermissionsService, providerService, walletAccountService)
result.browserSectionModule = browser_section_module.newModule(
result, events, bookmarkService, settingsService, networkService,
dappPermissionsService, providerService, walletAccountService
)
result.profileSectionModule = profile_section_module.newModule(
result, events, accountsService, settingsService, stickersService,
profileService, contactsService, aboutService, languageService, privacyService, nodeConfigurationService,

View File

@ -35,19 +35,6 @@ proc delete*(self: Controller) =
proc init*(self: Controller) =
discard
proc getCurrentNetworkDetails*(self: Controller): settings_service.Network =
self.settingsService.getCurrentNetworkDetails()
proc changeCurrentNetworkTo*(self: Controller, network: string) =
if (not self.nodeConfigurationService.setNetwork(network)):
# in the future we may do a call from here to show a popup about this error
error "an error occurred, we couldn't change network"
return
self.stickersService.clearRecentStickers()
self.delegate.onCurrentNetworkSet()
proc getFleet*(self: Controller): string =
self.settingsService.getFleetAsString()
@ -149,17 +136,6 @@ proc toggleDebug*(self: Controller) =
self.delegate.onDebugToggled()
proc getCustomNetworks*(self: Controller): seq[settings_service.Network] =
return self.settingsService.getAvailableCustomNetworks()
proc addCustomNetwork*(self: Controller, network: settings_service.Network) =
if (not self.settingsService.addCustomNetwork(network)):
# in the future we may do a call from here to show a popup about this error
error "an error occurred, we couldn't add a custom network"
return
self.delegate.onCustomNetworkAdded(network)
proc toggleCommunitiesPortalSection*(self: Controller) =
self.events.emit(TOGGLE_SECTION, ToggleSectionArgs(sectionType: SectionType.CommunitiesPortal))

View File

@ -1,61 +0,0 @@
import NimQml, Tables, strformat
type
ModelRole {.pure.} = enum
Id = UserRole + 1
Name
QtObject:
type
Model* = ref object of QAbstractListModel
items: seq[tuple[id: string, name: string]]
proc delete*(self: Model) =
self.items = @[]
self.QAbstractListModel.delete
proc setup(self: Model) =
self.QAbstractListModel.setup
proc newModel*(): Model =
new(result, delete)
result.setup
proc `$`*(self: Model): string =
for i in 0 ..< self.items.len:
result &= fmt"""
[{i}]:(id: {self.items[i].id}, name: {self.items[i].name})
"""
method rowCount(self: Model, index: QModelIndex = nil): int =
return self.items.len
method roleNames(self: Model): Table[int, string] =
{
ModelRole.Id.int:"id",
ModelRole.Name.int:"name",
}.toTable
method data(self: Model, 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.Id:
result = newQVariant(item.id)
of ModelRole.Name:
result = newQVariant(item.name)
proc add*(self: Model, id: string, name: string) =
let parentModelIndex = newQModelIndex()
defer: parentModelIndex.delete
self.beginInsertRows(parentModelIndex, self.items.len, self.items.len)
self.items.add((id: id, name: name))
self.endInsertRows()

View File

@ -1,7 +1,5 @@
import NimQml
import ../../../../../app_service/service/settings/dto/settings as settings_service_type
type
AccessInterface* {.pure inheritable.} = ref object of RootObj
@ -17,9 +15,6 @@ method isLoaded*(self: AccessInterface): bool {.base.} =
method getModuleAsVariant*(self: AccessInterface): QVariant {.base.} =
raise newException(ValueError, "No implementation available")
method onCurrentNetworkSet*(self: AccessInterface) {.base.} =
raise newException(ValueError, "No implementation available")
method onFleetSet*(self: AccessInterface) {.base.} =
raise newException(ValueError, "No implementation available")
@ -41,24 +36,9 @@ method onAutoMessageToggled*(self: AccessInterface) {.base.} =
method onDebugToggled*(self: AccessInterface) {.base.} =
raise newException(ValueError, "No implementation available")
method onCustomNetworkAdded*(self: AccessInterface, network: settings_service_type.Network) {.base.} =
raise newException(ValueError, "No implementation available")
method viewDidLoad*(self: AccessInterface) {.base.} =
raise newException(ValueError, "No implementation available")
method getCurrentNetworkName*(self: AccessInterface): string {.base.} =
raise newException(ValueError, "No implementation available")
method getCurrentNetworkId*(self: AccessInterface): string {.base.} =
raise newException(ValueError, "No implementation available")
method getCurrentChainId*(self: AccessInterface): int {.base.} =
raise newException(ValueError, "No implementation available")
method setCurrentNetwork*(self: AccessInterface, network: string) {.base.} =
raise newException(ValueError, "No implementation available")
method getFleet*(self: AccessInterface): string {.base.} =
raise newException(ValueError, "No implementation available")
@ -98,10 +78,6 @@ method isDebugEnabled*(self: AccessInterface): bool {.base.} =
method toggleDebug*(self: AccessInterface) {.base.} =
raise newException(ValueError, "No implementation available")
method addCustomNetwork*(self: AccessInterface, name: string, endpoint: string, networkId: int, networkType: string)
{.slot.} =
raise newException(ValueError, "No implementation available")
method toggleCommunitiesPortalSection*(self: AccessInterface) {.base.} =
raise newException(ValueError, "No implementation available")

View File

@ -1,7 +1,7 @@
import NimQml, chronicles, uuids
import io_interface
import ../io_interface as delegate_interface
import view, controller, custom_networks_model
import view, controller
import ../../../../../constants
import ../../../../core/eventemitter
@ -47,32 +47,12 @@ method isLoaded*(self: Module): bool =
return self.moduleLoaded
method viewDidLoad*(self: Module) =
let customNetworks = self.controller.getCustomNetworks()
for n in customNetworks:
self.view.customNetworksModel().add(n.id, n.name)
self.moduleLoaded = true
self.delegate.advancedModuleDidLoad()
method getModuleAsVariant*(self: Module): QVariant =
return self.viewVariant
method getCurrentNetworkName*(self: Module): string =
return self.controller.getCurrentNetworkDetails().name
method getCurrentNetworkId*(self: Module): string =
return self.controller.getCurrentNetworkDetails().id
method getCurrentChainId*(self: Module): int =
return self.controller.getCurrentNetworkDetails().config.NetworkId
method setCurrentNetwork*(self: Module, network: string) =
self.controller.changeCurrentNetworkTo(network)
method onCurrentNetworkSet*(self: Module) =
info "quit the app because of successful network change"
quit(QuitSuccess) # quits the app TODO: change this to logout instead when supported
method getFleet*(self: Module): string =
return self.controller.getFleet()
@ -136,20 +116,6 @@ method toggleDebug*(self: Module) =
method onDebugToggled*(self: Module) =
self.view.isDebugEnabledChanged()
method addCustomNetwork*(self: Module, name: string, endpoint: string, networkId: int, networkType: string) =
var network: settings_service.Network
network.id = $genUUID()
network.name = name
network.config.NetworkId = networkId
network.config.DataDir = "/ethereum/" & networkType
network.config.UpstreamConfig.Enabled = true
network.config.UpstreamConfig.URL = endpoint
self.controller.addCustomNetwork(network)
method onCustomNetworkAdded*(self: Module, network: settings_service.Network) =
self.view.customNetworksModel().add(network.id, network.name)
method toggleWalletSection*(self: Module) =
self.controller.toggleWalletSection()

View File

@ -1,55 +1,22 @@
import NimQml
import io_interface
import custom_networks_model
QtObject:
type
View* = ref object of QObject
delegate: io_interface.AccessInterface
customNetworksModel: Model
customNetworksModelVariant: QVariant
proc delete*(self: View) =
self.customNetworksModel.delete
self.customNetworksModelVariant.delete
self.QObject.delete
proc newView*(delegate: io_interface.AccessInterface): View =
new(result, delete)
result.QObject.setup
result.delegate = delegate
result.customNetworksModel = newModel()
result.customNetworksModelVariant = newQVariant(result.customNetworksModel)
proc load*(self: View) =
self.delegate.viewDidLoad()
proc currentNetworkChanged*(self: View) {.signal.}
proc getCurrentNetworkName*(self: View): string {.slot.} =
return self.delegate.getCurrentNetworkName()
QtProperty[string] currentNetworkName:
read = getCurrentNetworkName
notify = currentNetworkChanged
proc setNetworkName*(self: View, network: string) {.slot.} =
self.delegate.setCurrentNetwork(network)
# include this if we decide to not quit the app on network change
# proc emitNetworkSignal*(self: View) =
# self.currentNetworkChanged()
proc getCurrentNetworkId*(self: View): string {.slot.} =
return self.delegate.getCurrentNetworkId()
QtProperty[string] currentNetworkId:
read = getCurrentNetworkId
notify = currentNetworkChanged
proc getCurrentChainId*(self: View): int {.slot.} =
return self.delegate.getCurrentChainId()
QtProperty[int] currentChainId:
read = getCurrentChainId
notify = currentNetworkChanged
proc fleetChanged*(self: View) {.signal.}
proc getFleet*(self: View): string {.slot.} =
return self.delegate.getFleet()
@ -148,19 +115,6 @@ QtObject:
proc toggleDebug*(self: View) {.slot.} =
self.delegate.toggleDebug()
proc customNetworksModel*(self: View): Model =
return self.customNetworksModel
proc customNetworksModelChanged*(self: View) {.signal.}
proc getCustomNetworksModel(self: View): QVariant {.slot.} =
return self.customNetworksModelVariant
QtProperty[QVariant] customNetworksModel:
read = getCustomNetworksModel
notify = customNetworksModelChanged
proc addCustomNetwork*(self: View, name: string, endpoint: string, networkId: int, networkType: string) {.slot.} =
self.delegate.addCustomNetwork(name, endpoint, networkId, networkType)
proc toggleWalletSection*(self: View) {.slot.} =
self.delegate.toggleWalletSection()

View File

@ -73,9 +73,6 @@ proc setPubKey*(self: Controller, ensUsername: string, address: string, gas: str
maxPriorityFeePerGas: string, maxFeePerGas: string, password: string, eip1559Enabled: bool): string =
return self.ensService.setPubKey(ensUsername, address, gas, gasPrice, maxPriorityFeePerGas, maxFeePerGas, password, eip1559Enabled)
proc getCurrentNetworkDetails*(self: Controller): Network =
return self.settingsService.getCurrentNetworkDetails()
proc getSigningPhrase*(self: Controller): string =
return self.settingsService.getSigningPhrase()
@ -130,5 +127,5 @@ proc getStatusToken*(self: Controller): string =
}
return $jsonObj
proc getChainIdForEns*(self: Controller): int =
return self.networkService.getNetworkForEns().chainId
proc getNetwork*(self: Controller): NetworkDto =
return self.networkService.getNetworkForEns()

View File

@ -1,61 +0,0 @@
import NimQml, Tables, strformat
type
ModelRole {.pure.} = enum
Id = UserRole + 1
Name
QtObject:
type
Model* = ref object of QAbstractListModel
items: seq[tuple[id: string, name: string]]
proc delete*(self: Model) =
self.items = @[]
self.QAbstractListModel.delete
proc setup(self: Model) =
self.QAbstractListModel.setup
proc newModel*(): Model =
new(result, delete)
result.setup
proc `$`*(self: Model): string =
for i in 0 ..< self.items.len:
result &= fmt"""
[{i}]:(id: {self.items[i].id}, name: {self.items[i].name})
"""
method rowCount(self: Model, index: QModelIndex = nil): int =
return self.items.len
method roleNames(self: Model): Table[int, string] =
{
ModelRole.Id.int:"id",
ModelRole.Name.int:"name",
}.toTable
method data(self: Model, 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.Id:
result = newQVariant(item.id)
of ModelRole.Name:
result = newQVariant(item.name)
proc add*(self: Model, id: string, name: string) =
let parentModelIndex = newQModelIndex()
defer: parentModelIndex.delete
self.beginInsertRows(parentModelIndex, self.items.len, self.items.len)
self.items.add((id: id, name: name))
self.endInsertRows()

View File

@ -49,8 +49,7 @@ method load*(self: Module) =
self.controller.init()
let signingPhrase = self.controller.getSigningPhrase()
let network = self.controller.getCurrentNetworkDetails()
var link = network.etherscanLink.replace("/address", "/tx")
let link = self.controller.getNetwork().blockExplorerUrl & "/tx/"
self.view.load(link, signingPhrase)
method isLoaded*(self: Module): bool =
@ -236,7 +235,7 @@ method getStatusToken*(self: Module): string =
return self.controller.getStatusToken()
method getChainIdForEns*(self: Module): int =
return self.controller.getChainIdForEns()
return self.controller.getNetwork().chainId
method setPrefferedEnsUsername*(self: Module, ensUsername: string) =
self.controller.setPreferredName(ensUsername)

View File

@ -69,7 +69,7 @@ proc checkPendingTransactions*(self: Controller) =
self.transactionService.checkPendingTransactions()
proc checkRecentHistory*(self: Controller) =
self.transactionService.checkRecentHistory()
self.walletAccountService.checkRecentHistory()
proc getWalletAccounts*(self: Controller): seq[WalletAccountDto] =
self.walletAccountService.getWalletAccounts()
@ -107,5 +107,5 @@ proc getChainIdForChat*(self: Controller): int =
proc getChainIdForBrowser*(self: Controller): int =
return self.networkService.getNetworkForBrowser().chainId
proc getEstimatedTime*(self: Controller, priorityFeePerGas: string, maxFeePerGas: string): EstimatedTime =
return self.transactionService.getEstimatedTime(priorityFeePerGas, maxFeePerGas)
proc getEstimatedTime*(self: Controller, chainId: int, priorityFeePerGas: string, maxFeePerGas: string): EstimatedTime =
return self.transactionService.getEstimatedTime(chainId, priorityFeePerGas, maxFeePerGas)

View File

@ -64,7 +64,7 @@ method getChainIdForChat*(self: AccessInterface): int =
method getChainIdForBrowser*(self: AccessInterface): int =
raise newException(ValueError, "No implementation available")
method getEstimatedTime*(self: AccessInterface, priorityFeePerGas: string, maxFeePerGas: string): int {.base.} =
method getEstimatedTime*(self: AccessInterface, chainId: int, priorityFeePerGas: string, maxFeePerGas: string): int {.base.} =
raise newException(ValueError, "No implementation available")
# View Delegate Interface

View File

@ -111,5 +111,5 @@ method getChainIdForChat*(self: Module): int =
method getChainIdForBrowser*(self: Module): int =
return self.controller.getChainIdForBrowser()
method getEstimatedTime*(self: Module, priorityFeePerGas: string, maxFeePerGas: string): int =
return self.controller.getEstimatedTime(priorityFeePerGas, maxFeePerGas).int
method getEstimatedTime*(self: Module, chainId: int, priorityFeePerGas: string, maxFeePerGas: string): int =
return self.controller.getEstimatedTime(chainId, priorityFeePerGas, maxFeePerGas).int

View File

@ -141,5 +141,5 @@ QtObject:
proc getChainIdForBrowser*(self: View): int {.slot.} =
return self.delegate.getChainIdForBrowser()
proc getEstimatedTime*(self: View, priorityFeePerGas: string, maxFeePerGas: string): int {.slot.} =
return self.delegate.getEstimatedTime(priorityFeePerGas, maxFeePerGas)
proc getEstimatedTime*(self: View, chainId: int, priorityFeePerGas: string, maxFeePerGas: string): int {.slot.} =
return self.delegate.getEstimatedTime(chainId, priorityFeePerGas, maxFeePerGas)

View File

@ -1,4 +1,4 @@
import json, os, chronicles, utils
import json, os, chronicles
import ../../constants as main_constants
# set via `nim c` param `-d:INFURA_TOKEN:[token]`; should be set in CI/release builds
@ -27,88 +27,6 @@ let DEFAULT_TORRENT_CONFIG_DATADIR* = joinPath(main_constants.defaultDataDir(),
let DEFAULT_TORRENT_CONFIG_TORRENTDIR* = joinPath(main_constants.defaultDataDir(), "data", "torrents")
const DEFAULT_NETWORK_NAME* = "mainnet_rpc"
const DEFAULT_NETWORKS_IDS* = @["mainnet_rpc", "testnet_rpc", "rinkeby_rpc", "goerli_rpc", "xdai_rpc", "poa_rpc" ]
let DEFAULT_NETWORKS* = %* [
{
"id": "testnet_rpc",
"etherscan-link": "https://ropsten.etherscan.io/address/",
"name": "Ropsten with upstream RPC",
"config": {
"NetworkId": 3,
"DataDir": "/ethereum/testnet_rpc",
"UpstreamConfig": {
"Enabled": true,
"URL": "https://ropsten.infura.io/v3/" & INFURA_TOKEN_RESOLVED
}
}
},
{
"id": "rinkeby_rpc",
"etherscan-link": "https://rinkeby.etherscan.io/address/",
"name": "Rinkeby with upstream RPC",
"config": {
"NetworkId": 4,
"DataDir": "/ethereum/rinkeby_rpc",
"UpstreamConfig": {
"Enabled": true,
"URL": "https://rinkeby.infura.io/v3/" & INFURA_TOKEN_RESOLVED
}
}
},
{
"id": "goerli_rpc",
"etherscan-link": "https://goerli.etherscan.io/address/",
"name": "Goerli with upstream RPC",
"config": {
"NetworkId": 5,
"DataDir": "/ethereum/goerli_rpc",
"UpstreamConfig": {
"Enabled": true,
"URL": "https://goerli.blockscout.com/"
}
}
},
{
"id": "mainnet_rpc",
"etherscan-link": "https://etherscan.io/address/",
"name": "Mainnet with upstream RPC",
"config": {
"NetworkId": 1,
"DataDir": "/ethereum/mainnet_rpc",
"UpstreamConfig": {
"Enabled": true,
"URL": "https://mainnet.infura.io/v3/" & INFURA_TOKEN_RESOLVED
}
}
},
{
"id": "xdai_rpc",
"name": "xDai Chain",
"config": {
"NetworkId": 100,
"DataDir": "/ethereum/xdai_rpc",
"UpstreamConfig": {
"Enabled": true,
"URL": "https://dai.poa.network"
}
}
},
{
"id": "poa_rpc",
"name": "POA Network",
"config": {
"NetworkId": 99,
"DataDir": "/ethereum/poa_rpc",
"UpstreamConfig": {
"Enabled": true,
"URL": "https://core.poa.network"
}
}
}
]
let NETWORKS* = %* [
{
"chainId": 1,
@ -322,7 +240,4 @@ var NODE_CONFIG* = %* {
"DataDir": DEFAULT_TORRENT_CONFIG_DATADIR,
"TorrentDir": DEFAULT_TORRENT_CONFIG_TORRENTDIR
}
}
proc getNetworkConfig*(currentNetwork: string): JsonNode =
result = DEFAULT_NETWORKS.first("id", currentNetwork)
}

View File

@ -221,14 +221,12 @@ proc prepareAccountSettingsJsonObject(self: Service, account: GeneratedAccountDt
"signing-phrase": generateSigningPhrase(3),
"log-level": $LogLevel.INFO,
"latest-derived-path": 0,
"networks/networks": DEFAULT_NETWORKS,
"currency": "usd",
"networks/networks": @[],
"networks/current-network": "",
"wallet/visible-tokens": {},
"waku-enabled": true,
"wallet/visible-tokens": {
DEFAULT_NETWORK_NAME: ["SNT"]
},
"appearance": 0,
"networks/current-network": DEFAULT_NETWORK_NAME,
"installation-id": installationId
}
@ -244,12 +242,8 @@ proc getAccountSettings(self: Service, accountId: string,
return self.prepareAccountSettingsJsonObject(self.importedAccount, installationId, displayName)
proc getDefaultNodeConfig*(self: Service, installationId: string): JsonNode =
let networkConfig = getNetworkConfig(DEFAULT_NETWORK_NAME)
let upstreamUrl = networkConfig["config"]["UpstreamConfig"]["URL"]
let fleet = Fleet.Prod
var newDataDir = networkConfig["config"]["DataDir"].getStr
newDataDir.removeSuffix("_rpc")
result = NODE_CONFIG.copy()
result["ClusterConfig"]["Fleet"] = newJString($fleet)
result["ClusterConfig"]["BootNodes"] = %* self.fleetConfiguration.getNodes(fleet, FleetNodes.Bootnodes)
@ -257,10 +251,10 @@ proc getDefaultNodeConfig*(self: Service, installationId: string): JsonNode =
result["ClusterConfig"]["StaticNodes"] = %* self.fleetConfiguration.getNodes(fleet, FleetNodes.Whisper)
result["ClusterConfig"]["RendezvousNodes"] = %* self.fleetConfiguration.getNodes(fleet, FleetNodes.Rendezvous)
result["ClusterConfig"]["DiscV5BootstrapNodes"] = %* (@[]) # TODO: set default status.prod enr
result["NetworkId"] = networkConfig["config"]["NetworkId"]
result["DataDir"] = newDataDir.newJString()
result["UpstreamConfig"]["Enabled"] = networkConfig["config"]["UpstreamConfig"]["Enabled"]
result["UpstreamConfig"]["URL"] = upstreamUrl
result["NetworkId"] = NETWORKS[0]{"chainId"}
result["DataDir"] = "ethereum".newJString()
result["UpstreamConfig"]["Enabled"] = true.newJBool()
result["UpstreamConfig"]["URL"] = NETWORKS[0]{"rpcUrl"}
result["ShhextConfig"]["InstallationID"] = newJString(installationId)
# TODO: fleet.status.im should have different sections depending on the node type

View File

@ -5,7 +5,7 @@ import ../../../app/core/signals/types
import ../../../app/core/eventemitter
import ../../../app/core/tasks/[qt, threadpool]
import ../settings/service as settings_service
import ../network/service as network_service
import ./dto/contacts as contacts_dto
import ./dto/status_update as status_update_dto
import ./dto/contact_details
@ -66,7 +66,7 @@ type
QtObject:
type Service* = ref object of QObject
threadpool: ThreadPool
settingsService: settings_service.Service
networkService: network_service.Service
contacts: Table[string, ContactsDto] # [contact_id, ContactsDto]
contactsStatus: Table[string, StatusUpdateDto] # [contact_id, StatusUpdateDto]
events: EventEmitter
@ -87,13 +87,13 @@ QtObject:
proc newService*(
events: EventEmitter,
threadpool: ThreadPool,
settingsService: settings_service.Service
networkService: network_service.Service
): Service =
new(result, delete)
result.QObject.setup
result.closingApp = false
result.events = events
result.settingsService = settingsService
result.networkService = networkService
result.threadpool = threadpool
result.contacts = initTable[string, ContactsDto]()
@ -417,7 +417,7 @@ QtObject:
vptr: cast[ByteAddress](self.vptr),
slot: "ensResolved",
value: value,
chainId: self.settingsService.getCurrentNetworkId(),
chainId: self.networkService.getNetworkForEns().chainId,
uuid: uuid,
reason: reason
)

View File

@ -262,8 +262,10 @@ QtObject:
let hash = resp.result.getStr
let resolverAddress = status_ens.resolver(chainId, ensUsername.addDomain()).result.getStr
self.transactionService.trackPendingTransaction(hash, $address, resolverAddress,
$PendingTransactionTypeDto.SetPubKey, ensUsername)
self.transactionService.trackPendingTransaction(
hash, $address, resolverAddress,
$PendingTransactionTypeDto.SetPubKey, ensUsername, chainId
)
self.pendingEnsUsernames.incl(ensUsername)
result = $(%* { "result": hash, "success": true })
@ -305,8 +307,10 @@ QtObject:
let hash = resp.result.getStr
let ensUsernamesAddress = self.getEnsRegisteredAddress()
self.transactionService.trackPendingTransaction(hash, address, ensUsernamesAddress,
$PendingTransactionTypeDto.ReleaseENS, ensUsername)
self.transactionService.trackPendingTransaction(
hash, address, ensUsernamesAddress,
$PendingTransactionTypeDto.ReleaseENS, ensUsername, chainId
)
self.pendingEnsUsernames.excl(ensUsername)
result = $(%* { "result": hash, "success": true })
@ -354,8 +358,11 @@ QtObject:
let hash = resp.result.getStr
let sntContract = self.getStatusToken()
let ensUsername = self.formatUsername(username, true)
self.transactionService.trackPendingTransaction(hash, address, $sntContract.address,
$PendingTransactionTypeDto.RegisterEns, ensUsername)
self.transactionService.trackPendingTransaction(
hash, address, $sntContract.address,
$PendingTransactionTypeDto.RegisterEns, ensUsername,
chainId
)
self.pendingEnsUsernames.incl(ensUsername)
result = $(%* { "result": hash, "success": true })

View File

@ -291,14 +291,22 @@ QtObject:
return self.pinnedMsgCursor[chatId]
proc getTransactionDetails*(self: Service, message: MessageDto): (string, string) =
# TODO(alaibe): handle multi network
let networkDto = self.networkService.getNetworks()[0]
let ethereum = newTokenDto("Ethereum", networkDto.chainId, parseAddress(ZERO_ADDRESS), "ETH", 18, true)
let tokenContract = if message.transactionParameters.contract == "" : ethereum else: self.tokenService.findTokenByAddress(networkDto, parseAddress(message.transactionParameters.contract))
let tokenContractStr = if tokenContract == nil: "{}" else: $(Json.encode(tokenContract))
var weiStr = if tokenContract == nil: "0" else: service_conversion.wei2Eth(message.transactionParameters.value, tokenContract.decimals)
let networksDto = self.networkService.getNetworks()
var token = newTokenDto(networksDto[0].nativeCurrencyName, networksDto[0].chainId, parseAddress(ZERO_ADDRESS), networksDto[0].nativeCurrencySymbol, networksDto[0].nativeCurrencyDecimals, true)
if message.transactionParameters.contract != "":
for networkDto in networksDto:
let tokenFound = self.tokenService.findTokenByAddress(networkDto, parseAddress(message.transactionParameters.contract))
if tokenFound == nil:
continue
token = tokenFound
break
let tokenStr = $(Json.encode(token))
var weiStr = service_conversion.wei2Eth(message.transactionParameters.value, token.decimals)
weiStr.trimZeros()
return (tokenContractStr, weiStr)
return (tokenStr, weiStr)
proc onAsyncLoadMoreMessagesForChat*(self: Service, response: string) {.slot.} =
let responseObj = response.parseJson

View File

@ -1,7 +1,6 @@
import json, json_serialization, chronicles, atomics
import ../../../app/core/eventemitter
import ../../../app/global/global_singleton
import ../../../backend/backend as backend
import ../settings/service as settings_service
@ -98,10 +97,6 @@ proc toggleNetwork*(self: Service, chainId: int) =
self.upsertNetwork(network)
proc getNetworkForEns*(self: Service): NetworkDto =
if not singletonInstance.localAccountSensitiveSettings.getIsMultiNetworkEnabled():
let networkType = self.settingsService.getCurrentNetwork().toNetworkType()
return self.getNetwork(networkType)
if self.settingsService.areTestNetworksEnabled():
return self.getNetwork(Ropsten)
@ -117,10 +112,6 @@ proc getNetworkForChat*(self: Service): NetworkDto =
return self.getNetworkForEns()
proc getNetworkForCollectibles*(self: Service): NetworkDto =
if not singletonInstance.localAccountSensitiveSettings.getIsMultiNetworkEnabled():
let networkType = self.settingsService.getCurrentNetwork().toNetworkType()
return self.getNetwork(networkType)
if self.settingsService.areTestNetworksEnabled():
return self.getNetwork(Rinkeby)

View File

@ -31,11 +31,7 @@ proc newService*(fleetConfiguration: FleetConfiguration, settingsService: settin
result.settingsService = settingsService
proc adaptNodeSettingsForTheAppNeed(self: Service) =
let currentNetworkDetails = self.settingsService.getCurrentNetworkDetails()
var dataDir = currentNetworkDetails.config.DataDir
dataDir.removeSuffix("_rpc")
self.configuration.DataDir = dataDir
self.configuration.DataDir = "./ethereum"
self.configuration.KeyStoreDir = "./keystore"
self.configuration.LogFile = "./geth.log"
self.configuration.ShhextConfig.BackupDisabledDataDir = "./"
@ -139,22 +135,6 @@ proc setWakuVersion*(self: Service, wakuVersion: int): bool =
method isCommunityHistoryArchiveSupportEnabled*(self: Service): bool =
return self.configuration.TorrentConfig.Enabled
proc setNetwork*(self: Service, network: string): bool =
if(not self.settingsService.saveCurrentNetwork(network)):
error "error saving network ", network, procName="setNetwork"
return false
let currentNetworkDetails = self.settingsService.getCurrentNetworkDetails()
var dataDir = currentNetworkDetails.config.DataDir
dataDir.removeSuffix("_rpc")
var newConfiguration = self.configuration
newConfiguration.NetworkId = currentNetworkDetails.config.NetworkId
newConfiguration.DataDir = dataDir
newConfiguration.UpstreamConfig.Enabled = currentNetworkDetails.config.UpstreamConfig.Enabled
newConfiguration.UpstreamConfig.URL = currentNetworkDetails.config.UpstreamConfig.URL
return self.saveConfiguration(newConfiguration)
proc setBloomFilterMode*(self: Service, bloomFilterMode: bool): bool =
if(not self.settingsService.saveWakuBloomFilterMode(bloomFilterMode)):
error "error saving waku bloom filter mode ", procName="setBloomFilterMode"

View File

@ -59,7 +59,7 @@ QtObject:
proc getDefaultAccount(self: Service): string =
try:
let response = status_eth.getEthAccounts()
let response = status_eth.getAccounts()
if(response.result.kind != JArray):
error "error: ", procName="getDefaultAccount", errDesription = "response is not an array"

View File

@ -1,4 +1,4 @@
import Tables, json, options, tables, strutils, marshal
import Tables, json, options, tables, strutils
import ../../stickers/dto/stickers
include ../../../common/json_utils
@ -6,8 +6,6 @@ include ../../../common/json_utils
# Setting keys:
const KEY_ADDRESS* = "address"
const KEY_CURRENCY* = "currency"
const KEY_NETWORKS_CURRENT_NETWORK* = "networks/current-network"
const KEY_NETWORKS_ALL_NETWORKS* = "networks/networks"
const KEY_DAPPS_ADDRESS* = "dapps-address"
const KEY_EIP1581_ADDRESS* = "eip1581-address"
const KEY_INSTALLATION_ID* = "installation-id"
@ -32,7 +30,6 @@ const KEY_USE_MAILSERVERS* = "use-mailservers?"
const KEY_WALLET_ROOT_ADDRESS* = "wallet-root-address"
const KEY_SEND_STATUS_UPDATES* = "send-status-updates?"
const KEY_TELEMETRY_SERVER_URL* = "telemetry-server-url"
const KEY_WALLET_VISIBLE_TOKENS* = "wallet/visible-tokens"
const KEY_PINNED_MAILSERVERS* = "pinned-mailservers"
const KEY_CURRENT_USER_STATUS* = "current-user-status"
const KEY_RECENT_STICKERS* = "stickers/recent-stickers"
@ -66,17 +63,6 @@ type UpstreamConfig* = object
Enabled*: bool
URL*: string
type Config* = object
NetworkId*: int
DataDir*: string
UpstreamConfig*: UpstreamConfig
type Network* = object
id*: string
etherscanLink*: string
name*: string
config*: Config
type PinnedMailserver* = object
ethProd*: string
ethStaging*: string
@ -101,8 +87,6 @@ type
SettingsDto* = object # There is no point to keep all these info as settings, but we must follow status-go response
address*: string
currency*: string
currentNetwork*: string
availableNetworks*: seq[Network]
dappsAddress*: string
eip1581Address*: string
installationId*: string
@ -138,27 +122,6 @@ type
gifFavorites*: JsonNode
testNetworksEnabled*: bool
proc toUpstreamConfig*(jsonObj: JsonNode): UpstreamConfig =
discard jsonObj.getProp("Enabled", result.Enabled)
discard jsonObj.getProp("URL", result.URL)
proc toConfig*(jsonObj: JsonNode): Config =
discard jsonObj.getProp("NetworkId", result.NetworkId)
discard jsonObj.getProp("DataDir", result.DataDir)
var upstreamConfigObj: JsonNode
if(jsonObj.getProp("UpstreamConfig", upstreamConfigObj)):
result.UpstreamConfig = toUpstreamConfig(upstreamConfigObj)
proc toNetwork*(jsonObj: JsonNode): Network =
discard jsonObj.getProp("id", result.id)
discard jsonObj.getProp("etherscan-link", result.etherscanLink)
discard jsonObj.getProp("name", result.name)
var configObj: JsonNode
if(jsonObj.getProp("config", configObj)):
result.config = toConfig(configObj)
proc toPinnedMailserver*(jsonObj: JsonNode): PinnedMailserver =
# we maintain pinned mailserver per fleet
discard jsonObj.getProp("eth.prod", result.ethProd)
@ -189,14 +152,6 @@ proc toSettingsFieldDto*(jsonObj: JsonNode): SettingsFieldDto =
proc toSettingsDto*(jsonObj: JsonNode): SettingsDto =
discard jsonObj.getProp(KEY_ADDRESS, result.address)
discard jsonObj.getProp(KEY_CURRENCY, result.currency)
discard jsonObj.getProp(KEY_NETWORKS_CURRENT_NETWORK, result.currentNetwork)
var networksArr: JsonNode
if(jsonObj.getProp(KEY_NETWORKS_ALL_NETWORKS, networksArr)):
if(networksArr.kind == JArray):
for networkObj in networksArr:
result.availableNetworks.add(toNetwork(networkObj))
discard jsonObj.getProp(KEY_DAPPS_ADDRESS, result.dappsAddress)
discard jsonObj.getProp(KEY_EIP1581_ADDRESS, result.eip1581Address)
discard jsonObj.getProp(KEY_INSTALLATION_ID, result.installationId)
@ -244,26 +199,6 @@ proc toSettingsDto*(jsonObj: JsonNode): SettingsDto =
for username in usernamesArr:
result.ensUsernames.add(username.getStr)
proc configToJsonNode*(config: Config): JsonNode =
let configAsString = $$config
result = parseJson(configAsString)
proc networkToJsonNode*(network: Network): JsonNode =
## we cannot use the same technique as we did for `configToJsonNode` cause we cannot have
## variable name with a dash in order to map `etherscan-link` appropriatelly
return %*{
"id": network.id,
"etherscan-link": network.etherscanLink,
"name": network.name,
"config": configToJsonNode(network.config)
}
proc availableNetworksToJsonNode*(networks: seq[Network]): JsonNode =
var availableNetworksAsJson = newJArray()
for n in networks:
availableNetworksAsJson.add(networkToJsonNode(n))
return availableNetworksAsJson
proc pinnedMailserverToJsonNode*(mailserver: PinnedMailserver): JsonNode =
return %*{
"eth.prod": mailserver.ethProd,

View File

@ -15,7 +15,6 @@ export settings_dto
export stickers_dto
# Default values:
const DEFAULT_CURRENT_NETWORK* = "mainnet_rpc"
const DEFAULT_CURRENCY* = "usd"
const DEFAULT_TELEMETRY_SERVER_URL* = "https://telemetry.status.im"
const DEFAULT_FLEET* = $Fleet.Prod
@ -108,18 +107,6 @@ QtObject:
return self.settings.currency
proc saveCurrentNetwork*(self: Service, value: string): bool =
if(self.saveSetting(KEY_NETWORKS_CURRENT_NETWORK, value)):
self.settings.currentNetwork = value
return true
return false
proc getCurrentNetwork*(self: Service): string =
if(self.settings.currentNetwork.len == 0):
self.settings.currentNetwork = DEFAULT_CURRENT_NETWORK
return self.settings.currentNetwork
proc saveDappsAddress*(self: Service, value: string): bool =
if(self.saveSetting(KEY_DAPPS_ADDRESS, value)):
self.settings.dappsAddress = value
@ -378,33 +365,6 @@ QtObject:
let fleet = parseEnum[Fleet](fleetAsString)
return fleet
proc getAvailableNetworks*(self: Service): seq[Network] =
return self.settings.availableNetworks
proc getAvailableCustomNetworks*(self: Service): seq[Network] =
return self.settings.availableNetworks.filterIt(it.id notin DEFAULT_NETWORKS_IDS)
proc getCurrentNetworkDetails*(self: Service): Network =
for n in self.settings.availableNetworks:
if(n.id == self.getCurrentNetwork()):
return n
# we should never be here
error "error: current network is not among available networks"
proc addCustomNetwork*(self: Service, network: Network): bool =
var newAvailableNetworks = self.settings.availableNetworks
newAvailableNetworks.add(network)
let availableNetworksAsJson = availableNetworksToJsonNode(newAvailableNetworks)
if(self.saveSetting(KEY_NETWORKS_ALL_NETWORKS, availableNetworksAsJson)):
self.settings.availableNetworks = newAvailableNetworks
return true
return false
proc getCurrentNetworkId*(self: Service): int =
self.getCurrentNetworkDetails().config.NetworkId
proc getCurrentUserStatus*(self: Service): CurrentUserStatus =
self.settings.currentUserStatus

View File

@ -213,7 +213,8 @@ QtObject:
address,
$sntContract.address,
$PendingTransactionTypeDto.BuyStickerPack,
packId
packId,
chainId,
)
return (txHash: transactionHash, error: "")
except ValueError:

View File

@ -4,6 +4,7 @@
type
LoadTransactionsTaskArg* = ref object of QObjectTaskArg
chainId: int
address: string
toBlock: Uint256
limit: int
@ -15,7 +16,8 @@ const loadTransactionsTask*: Task = proc(argEncoded: string) {.gcsafe, nimcall.}
limitAsHex = "0x" & eth_utils.stripLeadingZeros(arg.limit.toHex)
output = %*{
"address": arg.address,
"history": transactions.getTransfersByAddress(arg.address, arg.toBlock, limitAsHex, arg.loadMore),
"chainId": arg.chainId,
"history": transactions.getTransfersByAddress(arg.chainId, arg.address, arg.toBlock, limitAsHex, arg.loadMore),
"loadMore": arg.loadMore
}
arg.finish(output)

View File

@ -29,6 +29,7 @@ type
value*: string
fromAddress*: string
to*: string
chainId*: int
proc toTransactionDto*(jsonObj: JsonNode): TransactionDto =
result = TransactionDto()
@ -47,6 +48,8 @@ proc toTransactionDto*(jsonObj: JsonNode): TransactionDto =
discard jsonObj.getProp("value", result.value)
discard jsonObj.getProp("from", result.fromAddress)
discard jsonObj.getProp("to", result.to)
discard jsonObj.getProp("networkId", result.chainId)
proc cmpTransactions*(x, y: TransactionDto): int =
# Sort proc to compare transactions from a single account.

View File

@ -44,6 +44,7 @@ type
TransactionMinedArgs* = ref object of Args
data*: string
transactionHash*: string
chainId*: int
success*: bool
revertReason*: string
@ -74,7 +75,6 @@ QtObject:
type Service* = ref object of QObject
events: EventEmitter
threadpool: ThreadPool
walletAccountService: wallet_account_service.Service
networkService: network_service.Service
settingsService: settings_service.Service
tokenService: token_service.Service
@ -89,7 +89,6 @@ QtObject:
proc newService*(
events: EventEmitter,
threadpool: ThreadPool,
walletAccountService: wallet_account_service.Service,
networkService: network_service.Service,
settingsService: settings_service.Service,
tokenService: token_service.Service,
@ -98,7 +97,6 @@ QtObject:
result.QObject.setup
result.events = events
result.threadpool = threadpool
result.walletAccountService = walletAccountService
result.networkService = networkService
result.settingsService = settingsService
result.tokenService = tokenService
@ -112,39 +110,31 @@ QtObject:
proc init*(self: Service) =
self.doConnect()
proc checkRecentHistory*(self: Service) =
try:
let addresses = self.walletAccountService.getWalletAccounts().map(a => a.address)
transactions.checkRecentHistory(addresses)
except Exception as e:
let errDescription = e.msg
error "error: ", errDescription
return
proc getTransactionReceipt*(self: Service, transactionHash: string): JsonNode =
proc getTransactionReceipt*(self: Service, chainId: int, transactionHash: string): JsonNode =
try:
let response = transactions.getTransactionReceipt(transactionHash)
result = response.result
let response = transactions.getTransactionReceipt(chainId, transactionHash)
result = response.result
except Exception as e:
let errDescription = e.msg
error "error getting transaction receipt: ", errDescription
proc deletePendingTransaction*(self: Service, transactionHash: string) =
proc deletePendingTransaction*(self: Service, chainId: int, transactionHash: string) =
try:
discard transactions.deletePendingTransaction(transactionHash)
discard transactions.deletePendingTransaction(chainId, transactionHash)
except Exception as e:
let errDescription = e.msg
error "error deleting pending transaction: ", errDescription
proc confirmTransactionStatus(self: Service, pendingTransactions: JsonNode) =
for trx in pendingTransactions.getElems():
let transactionReceipt = self.getTransactionReceipt(trx["hash"].getStr)
let transactionReceipt = self.getTransactionReceipt(trx["network_id"].getInt, trx["hash"].getStr)
if transactionReceipt.kind != JNull:
self.deletePendingTransaction(trx["hash"].getStr)
self.deletePendingTransaction(trx["network_id"].getInt, trx["hash"].getStr)
let ev = TransactionMinedArgs(
data: trx["additionalData"].getStr,
transactionHash: trx["hash"].getStr,
chainId: trx["network_id"].getInt,
success: transactionReceipt{"status"}.getStr == "0x1",
revertReason: ""
)
@ -152,9 +142,8 @@ QtObject:
proc getPendingTransactions*(self: Service): JsonNode =
try:
# this may be improved (need to add some checkings) but due to removing `status-lib` dependencies, channges made
# in this go are as minimal as possible
let response = backend.getPendingTransactions()
let chainIds = self.networkService.getNetworks().map(a => a.chainId)
let response = backend.getPendingTransactionsByChainIDs(chainIds)
return response.result
except Exception as e:
let errDescription = e.msg
@ -163,7 +152,8 @@ QtObject:
proc getPendingOutboundTransactionsByAddress*(self: Service, address: string): JsonNode =
try:
result = transactions.getPendingOutboundTransactionsByAddress(address).result
let chainIds = self.networkService.getNetworks().map(a => a.chainId)
result = transactions.getPendingOutboundTransactionsByAddress(chainIds, address).result
except Exception as e:
let errDescription = e.msg
error "error getting pending txs by address: ", errDescription, address
@ -178,27 +168,13 @@ QtObject:
self.confirmTransactionStatus(self.getPendingOutboundTransactionsByAddress(address))
proc trackPendingTransaction*(self: Service, hash: string, fromAddress: string, toAddress: string, trxType: string,
data: string) =
data: string, chainId: int) =
try:
discard transactions.trackPendingTransaction(hash, fromAddress, toAddress, trxType, data)
discard transactions.trackPendingTransaction(hash, fromAddress, toAddress, trxType, data, chainId)
except Exception as e:
let errDescription = e.msg
error "error: ", errDescription
proc getTransfersByAddress*(self: Service, address: string, toBlock: Uint256, limit: int, loadMore: bool = false): seq[TransactionDto] =
try:
let limitAsHex = "0x" & eth_utils.stripLeadingZeros(limit.toHex)
let response = transactions.getTransfersByAddress(address, toBlock, limitAsHex, loadMore)
result = map(
response.result.getElems(),
proc(x: JsonNode): TransactionDto = x.toTransactionDto()
)
except Exception as e:
let errDescription = e.msg
error "error: ", errDescription
return
proc setTrxHistoryResult*(self: Service, historyJSON: string) {.slot.} =
let historyData = parseJson(historyJSON)
let address = historyData["address"].getStr
@ -215,17 +191,19 @@ QtObject:
))
proc loadTransactions*(self: Service, address: string, toBlock: Uint256, limit: int = 20, loadMore: bool = false) =
let arg = LoadTransactionsTaskArg(
address: address,
tptr: cast[ByteAddress](loadTransactionsTask),
vptr: cast[ByteAddress](self.vptr),
slot: "setTrxHistoryResult",
toBlock: toBlock,
limit: limit,
loadMore: loadMore
)
self.threadpool.start(arg)
for networks in self.networkService.getNetworks():
let arg = LoadTransactionsTaskArg(
address: address,
tptr: cast[ByteAddress](loadTransactionsTask),
vptr: cast[ByteAddress](self.vptr),
slot: "setTrxHistoryResult",
toBlock: toBlock,
limit: limit,
loadMore: loadMore,
chainId: networks.chainId,
)
self.threadpool.start(arg)
proc estimateGas*(
self: Service,
from_addr: string,
@ -302,8 +280,11 @@ QtObject:
let output = %* { "result": response.result.getStr, "success": %(response.error.isNil), "uuid": %uuid }
self.events.emit(SIGNAL_TRANSACTION_SENT, TransactionSentArgs(result: $output))
self.trackPendingTransaction(response.result.getStr, from_addr, to_addr,
$PendingTransactionTypeDto.WalletTransfer, data = "")
# TODO ADD READ CHAIN
self.trackPendingTransaction(
response.result.getStr, from_addr, to_addr,
$PendingTransactionTypeDto.WalletTransfer, data = "", 1
)
except Exception as e:
error "Error sending eth transfer transaction", msg = e.msg
return false
@ -343,8 +324,11 @@ QtObject:
let output = %* { "result": txHash, "success": %success, "uuid": %uuid }
self.events.emit(SIGNAL_TRANSACTION_SENT, TransactionSentArgs(result: $output))
self.trackPendingTransaction(txHash, from_addr, to_addr,
$PendingTransactionTypeDto.WalletTransfer, data = "")
self.trackPendingTransaction(
txHash, from_addr, to_addr,
$PendingTransactionTypeDto.WalletTransfer, data = "",
network.chainId
)
except Exception as e:
error "Error sending token transfer transaction", msg = e.msg
return false
@ -412,7 +396,7 @@ QtObject:
if gasPrice < myTip:
numOfTransactionWithTipLessThanMine.inc
proc getEstimatedTime*(self: Service, priorityFeePerGas: string, maxFeePerGas: string): EstimatedTime =
proc getEstimatedTime*(self: Service, chainId: int, priorityFeePerGas: string, maxFeePerGas: string): EstimatedTime =
let priorityFeePerGasF = priorityFeePerGas.parseFloat
let maxFeePerGasF = maxFeePerGas.parseFloat
var transactionsProcessed = 0
@ -420,7 +404,7 @@ QtObject:
var latestBlockNumber: Option[Uint256]
var expectedBaseFeeForNextBlock: float
try:
let response = eth.getBlockByNumber("latest", true)
let response = eth.getBlockByNumber(chainId, "latest", true)
if response.error.isNil:
let transactionsJson = response.result{"transactions"}
self.addToAllTransactionsAndSetNewMinMax(priorityFeePerGasF, numOfTransactionWithTipLessThanMine, transactionsJson)
@ -451,7 +435,7 @@ QtObject:
blockNumber = blockNumber - 1
try:
let hexPrevNum = "0x" & stint.toHex(blockNumber)
let response = getBlockByNumber(hexPrevNum, true)
let response = getBlockByNumber(chainId, hexPrevNum, true)
let transactionsJson = response.result{"transactions"}
self.addToAllTransactionsAndSetNewMinMax(priorityFeePerGasF, numOfTransactionWithTipLessThanMine, transactionsJson)
transactionsProcessed += transactionsJson.len

View File

@ -16,6 +16,7 @@ import ../../../app/core/tasks/[qt, threadpool]
import ../../../backend/accounts as status_go_accounts
import ../../../backend/backend as backend
import ../../../backend/eth as status_go_eth
import ../../../backend/transactions as status_go_transactions
import ../../../backend/cache
export dto
@ -178,6 +179,16 @@ QtObject:
if(accounts[i].address == address):
return i
proc checkRecentHistory*(self: Service) =
try:
let addresses = self.getWalletAccounts().map(a => a.address)
let chainIds = self.networkService.getNetworks().map(a => a.chainId)
status_go_transactions.checkRecentHistory(chainIds, addresses)
except Exception as e:
let errDescription = e.msg
error "error: ", errDescription
return
proc getCurrencyBalance*(self: Service): float64 =
return self.getWalletAccounts().map(a => a.getCurrencyBalance()).foldl(a + b, 0.0)
@ -274,6 +285,7 @@ QtObject:
discard self.settingsService.toggleTestNetworksEnabled()
self.tokenService.init()
self.buildAllTokens()
self.checkRecentHistory()
self.events.emit(SIGNAL_WALLET_ACCOUNT_NETWORK_ENABLED_UPDATED, NetwordkEnabledToggled())
proc updateWalletAccount*(self: Service, address: string, accountName: string, color: string, emoji: string) =

View File

@ -97,8 +97,8 @@ rpc(discoverToken, "wallet"):
chainId: int
address: string
rpc(getPendingTransactions, "wallet"):
discard
rpc(getPendingTransactionsByChainIDs, "wallet"):
chainIds: seq[int]
rpc(toggleVisibleToken, "wallet"):
chainId: int

View File

@ -1,4 +1,4 @@
import json, strutils
import json
import core, utils
import response_type
import ./backend

View File

@ -6,9 +6,9 @@ export response_type
proc getAccounts*(): RpcResponse[JsonNode] {.raises: [Exception].} =
return core.callPrivateRPC("eth_accounts")
proc getBlockByNumber*(blockNumber: string, fullTransactionObject = false): RpcResponse[JsonNode] {.raises: [Exception].} =
proc getBlockByNumber*(chainId: int, blockNumber: string, fullTransactionObject = false): RpcResponse[JsonNode] {.raises: [Exception].} =
let payload = %* [blockNumber, fullTransactionObject]
return core.callPrivateRPC("eth_getBlockByNumber", payload)
return core.callPrivateRPCWithChainId("eth_getBlockByNumber", chainId, payload)
proc getNativeChainBalance*(chainId: int, address: string): RpcResponse[JsonNode] {.raises: [Exception].} =
let payload = %* [address, "latest"]
@ -24,9 +24,6 @@ proc doEthCall*(payload = %* []): RpcResponse[JsonNode] {.raises: [Exception].}
proc estimateGas*(chainId: int, payload = %* []): RpcResponse[JsonNode] {.raises: [Exception].} =
core.callPrivateRPCWithChainId("eth_estimateGas", chainId, payload)
proc getEthAccounts*(): RpcResponse[JsonNode] {.raises: [Exception].} =
return core.callPrivateRPC("eth_accounts")
proc suggestedFees*(chainId: int): RpcResponse[JsonNode] {.raises: [Exception].} =
let payload = %* [chainId]
return core.callPrivateRPC("wallet_getSuggestedFees", payload)

View File

@ -5,7 +5,7 @@ import ./core
logScope:
topics = "provider"
proc providerRequest*(requestType: string, message:string): RpcResponse[JsonNode] =
proc providerRequest*(requestType: string, message: string): RpcResponse[JsonNode] =
let jsonMessage = message.parseJson
if requestType == "web3-send-async-read-only" and jsonMessage.hasKey("payload") and jsonMessage["payload"].hasKey("password"):
jsonMessage["payload"]["password"] = newJString(hashPassword(jsonMessage["payload"]["password"].getStr()))

View File

@ -2,17 +2,17 @@ import json, stint, chronicles
import ./core as core
proc checkRecentHistory*(addresses: seq[string]) {.raises: [Exception].} =
let payload = %* [addresses]
discard callPrivateRPC("wallet_checkRecentHistory", payload)
proc checkRecentHistory*(chainIds: seq[int], addresses: seq[string]) {.raises: [Exception].} =
let payload = %* [chainIds, addresses]
discard core.callPrivateRPC("wallet_checkRecentHistoryForChainIDs", payload)
proc getTransfersByAddress*(address: string, toBlock: Uint256, limitAsHexWithoutLeadingZeros: string,
proc getTransfersByAddress*(chainId: int, address: string, toBlock: Uint256, limitAsHexWithoutLeadingZeros: string,
loadMore: bool = false): RpcResponse[JsonNode] {.raises: [Exception].} =
let toBlockParsed = if not loadMore: newJNull() else: %("0x" & stint.toHex(toBlock))
callPrivateRPC("wallet_getTransfersByAddress", %* [address, toBlockParsed, limitAsHexWithoutLeadingZeros, loadMore])
core.callPrivateRPC("wallet_getTransfersByAddressAndChainID", %* [chainId, address, toBlockParsed, limitAsHexWithoutLeadingZeros, loadMore])
proc trackPendingTransaction*(hash: string, fromAddress: string, toAddress: string, trxType: string, data: string):
proc trackPendingTransaction*(hash: string, fromAddress: string, toAddress: string, trxType: string, data: string, chainId: int):
RpcResponse[JsonNode] {.raises: [Exception].} =
let payload = %* [{
"hash": hash,
@ -24,20 +24,21 @@ proc trackPendingTransaction*(hash: string, fromAddress: string, toAddress: stri
"value": 0,
"timestamp": 0,
"gasPrice": 0,
"gasLimit": 0
"gasLimit": 0,
"network_id": chainId
}]
callPrivateRPC("wallet_storePendingTransaction", payload)
core.callPrivateRPC("wallet_storePendingTransaction", payload)
proc getTransactionReceipt*(transactionHash: string): RpcResponse[JsonNode] {.raises: [Exception].} =
callPrivateRPC("eth_getTransactionReceipt", %* [transactionHash])
proc getTransactionReceipt*(chainId: int, transactionHash: string): RpcResponse[JsonNode] {.raises: [Exception].} =
core.callPrivateRPCWithChainId("eth_getTransactionReceipt", chainId, %* [transactionHash])
proc deletePendingTransaction*(transactionHash: string): RpcResponse[JsonNode] {.raises: [Exception].} =
let payload = %* [transactionHash]
result = callPrivateRPC("wallet_deletePendingTransaction", payload)
proc deletePendingTransaction*(chainId: int, transactionHash: string): RpcResponse[JsonNode] {.raises: [Exception].} =
let payload = %* [chainId, transactionHash]
result = core.callPrivateRPC("wallet_deletePendingTransactionByChainID", payload)
proc getPendingOutboundTransactionsByAddress*(address: string): RpcResponse[JsonNode] {.raises: [Exception].} =
let payload = %* [address]
result = callPrivateRPC("wallet_getPendingOutboundTransactionsByAddress", payload)
proc getPendingOutboundTransactionsByAddress*(chainIds: seq[int], address: string): RpcResponse[JsonNode] {.raises: [Exception].} =
let payload = %* [chainIds, address]
result = core.callPrivateRPC("wallet_getPendingOutboundTransactionsByAddressAndChainIDs", payload)
proc fetchCryptoServices*(): RpcResponse[JsonNode] {.raises: [Exception].} =
result = core.callPrivateRPC("wallet_getCryptoOnRamps", %* [])

View File

@ -854,7 +854,7 @@ You may add additional accurate notices of copyright ownership.
backend.web3Response.connect(onMessage);
window.ethereum.on("connected", () => {}); // TODO: Dummy event. Will need to be replaced once connecte/disconnected provider logic is implemented in status-go
window.ethereum.emit("connected", {"chainId": backend.networkId.toString()});
window.ethereum.emit("connected", {"chainId": backend.chainId.toString()});
window.ethereum.on("accountsChanged", () => {});
});
@ -958,9 +958,9 @@ You may add additional accurate notices of copyright ownership.
} else if (payload.method == "eth_coinbase" && (typeof window.statusAppcurrentAccountAddress !== "undefined")) {
return web3Response(payload, window.statusAppcurrentAccountAddress)
} else if (payload.method == "net_version"){
return web3Response(payload, backend.networkId.toString())
return web3Response(payload, backend.chainId.toString())
} else if (payload.method == "eth_chainId"){
return web3Response(payload, "0x" + backend.networkId.toString(16))
return web3Response(payload, "0x" + backend.chainId.toString(16))
} else if (payload.method == "eth_uninstallFilter"){
return web3Response(payload, true);
} else {

View File

@ -58,10 +58,10 @@ Popup {
height: 8
radius: width / 2
color: {
switch (Web3ProviderStore.currentNetwork) {
case Constants.networkMainnet: return Style.current.green;
case Constants.networkRopsten: return Style.current.turquoise;
default: return Style.current.red
switch (Web3ProviderStore.chainName) {
case Constants.networkMainnet: return Style.current.green;
case Constants.networkRopsten: return Style.current.turquoise;
default: return Style.current.red
}
}
anchors.verticalCenter: parent.verticalCenter
@ -70,10 +70,10 @@ Popup {
StatusBaseText {
id: networkText
text: {
switch (Web3ProviderStore.currentNetwork) {
case Constants.networkMainnet: return qsTr("Mainnet");
case Constants.networkRopsten: return qsTr("Ropsten");
default: return qsTrId("Unknown")
switch (Web3ProviderStore.chainName) {
case Constants.networkMainnet: return qsTr("Mainnet");
case Constants.networkRopsten: return qsTr("Ropsten");
default: return qsTrId("Unknown")
}
}
font.pixelSize: 15

View File

@ -10,8 +10,8 @@ QtObject {
property var web3ProviderInst: providerModule
property var urlENSDictionary: ({})
property int networkId: providerModule.networkId
property string currentNetwork: providerModule.currentNetwork
property int chainId: providerModule.chainId
property string chainName: providerModule.chainName
function disconnectAddress(dappName, address){
dappPermissionsModule.disconnectAddress(dappName, address)

View File

@ -16,7 +16,7 @@ QtObject {
property var showSendingError: function(){}
property var showSigningError: function(){}
property var showToastMessage: function(){}
property int networkId: (Web3ProviderStore && Web3ProviderStore.networkId) || -1
property int chainId: (Web3ProviderStore && Web3ProviderStore.chainId) || 1
signal web3Response(string data);
@ -64,6 +64,10 @@ QtObject {
return;
}
request.address = WalletStore.dappBrowserAccount.address
if (!request.payload) {
request.payload = {}
}
request.payload.chainId = provider.chainId
var ensAddr = Web3ProviderStore.urlENSDictionary[request.hostname];
if (ensAddr) {
@ -129,7 +133,7 @@ QtObject {
} else if (request.type === Constants.web3DisconnectAccount) {
web3Response(data);
} else {
Web3ProviderStore.web3ProviderInst.postMessage(request.payload.method, requestType, data);
Web3ProviderStore.web3ProviderInst.postMessage(request.payload.method, requestType, JSON.stringify(request));
}
}

View File

@ -1,47 +0,0 @@
import QtQuick 2.13
import QtQuick.Controls 2.13
import QtQuick.Layouts 1.13
import utils 1.0
import shared.popups 1.0
import shared.controls 1.0
RadioButtonSelector {
id: root
property var advancedStore
property string network: ""
property string networkName: ""
property string newNetwork: ""
title: networkName == "" ? Utils.getNetworkName(network) : networkName
checked: root.advancedStore.currentNetworkName === root.title
onCheckedChanged: {
if (checked) {
if (root.advancedStore.currentNetworkName === root.title)
return
root.newNetwork = root.network;
Global.openPopup(confirmDialogComponent)
}
}
Component {
id: confirmDialogComponent
ConfirmationDialog {
id: confirmDialog
//% "Warning!"
header.title: qsTrId("close-app-title")
//% "The account will be logged out. When you unlock it again, the selected network will be used"
confirmationText: qsTrId("logout-app-content")
onConfirmButtonClicked: {
root.advancedStore.setNetworkName(root.newNetwork)
}
onClosed: {
destroy()
}
}
}
}

View File

@ -1,172 +0,0 @@
import QtQuick 2.13
import QtQuick.Controls 2.13
import QtQuick.Layouts 1.13
import utils 1.0
import shared 1.0
import shared.panels 1.0
import shared.popups 1.0
import shared.status 1.0
import "../controls"
import "../panels"
import StatusQ.Controls 0.1 as StatusQControls
// TODO: replace with StatusQ component
ModalPopup {
id: popup
//% "Network"
title: qsTrId("network")
property var advancedStore
ScrollView {
id: svNetworks
width: parent.width
height: 300
clip: true
ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
ScrollBar.vertical.policy: ScrollBar.AlwaysOn
Column {
id: column
spacing: Style.current.padding
width: parent.width
ButtonGroup { id: networkSettings }
Item {
id: addNetwork
width: parent.width
height: addButton.height
StatusQControls.StatusRoundButton {
id: addButton
width: 40
height: 40
icon.name: "add"
type: StatusQControls.StatusRoundButton.Type.Secondary
anchors.verticalCenter: parent.verticalCenter
}
StyledText {
id: usernameText
//% "Add network"
text: qsTrId("add-network")
color: Style.current.blue
anchors.left: addButton.right
anchors.leftMargin: Style.current.padding
anchors.verticalCenter: addButton.verticalCenter
font.pixelSize: 15
}
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: Global.openPopup(addNetworkPopupComponent)
}
}
Component {
id: addNetworkPopupComponent
NewCustomNetworkModal {
anchors.centerIn: parent
advancedStore: popup.advancedStore
onClosed: {
destroy()
}
}
}
Column {
spacing: Style.current.smallPadding
anchors.left: parent.left
anchors.right: parent.right
anchors.leftMargin: Style.current.padding
anchors.rightMargin: Style.current.padding
ButtonGroup {
id: radioGroup
}
StatusSectionHeadline {
//% "Main networks"
text: qsTrId("main-networks")
}
NetworkRadioSelector {
advancedStore: popup.advancedStore
network: Constants.networkMainnet
buttonGroup: radioGroup
}
NetworkRadioSelector {
advancedStore: popup.advancedStore
network: Constants.networkPOA
buttonGroup: radioGroup
}
NetworkRadioSelector {
advancedStore: popup.advancedStore
network: Constants.networkXDai
buttonGroup: radioGroup
}
StatusSectionHeadline {
//% "Test networks"
text: qsTrId("test-networks")
anchors.leftMargin: -Style.current.padding
anchors.rightMargin: -Style.current.padding
}
NetworkRadioSelector {
advancedStore: popup.advancedStore
network: Constants.networkGoerli
buttonGroup: radioGroup
}
NetworkRadioSelector {
advancedStore: popup.advancedStore
network: Constants.networkRinkeby
buttonGroup: radioGroup
}
NetworkRadioSelector {
advancedStore: popup.advancedStore
network: Constants.networkRopsten
buttonGroup: radioGroup
}
StatusSectionHeadline {
//% "Custom Networks"
text: qsTrId("custom-networks")
anchors.leftMargin: -Style.current.padding
anchors.rightMargin: -Style.current.padding
}
Repeater {
model: popup.advancedStore.customNetworksModel
delegate: NetworkRadioSelector {
advancedStore: popup.advancedStore
networkName: model.name
network: model.id
buttonGroup: radioGroup
}
}
}
}
}
StyledText {
anchors.top: svNetworks.bottom
anchors.topMargin: Style.current.padding
//% "Under development\nNOTE: You will be logged out and all installed\nsticker packs will be removed and will\nneed to be reinstalled. Purchased sticker\npacks will not need to be re-purchased."
text: qsTrId("under-development-nnote--you-will-be-logged-out-and-all-installed-nsticker-packs-will-be-removed-and-will-nneed-to-be-reinstalled--purchased-sticker-npacks-will-not-need-to-be-re-purchased-")
}
}

View File

@ -1,209 +0,0 @@
import QtQuick 2.13
import QtQuick.Controls 2.13
import utils 1.0
import shared.status 1.0
import shared.controls 1.0
import StatusQ.Popups 0.1
import StatusQ.Controls 0.1
StatusModal {
id: addNetworkPopup
//% "Add network"
header.title: qsTrId("add-network")
height: 644
property var advancedStore
property string nameValidationError: ""
property string rpcValidationError: ""
property string networkValidationError: ""
property int networkId: 1;
property string networkType: Constants.networkMainnet
function validate() {
nameValidationError = ""
rpcValidationError = ""
networkValidationError = "";
if (nameInput.text === "") {
//% "You need to enter a name"
nameValidationError = qsTrId("you-need-to-enter-a-name")
}
if (rpcInput.text === "") {
//% "You need to enter the RPC endpoint URL"
rpcValidationError = qsTrId("you-need-to-enter-the-rpc-endpoint-url")
} else if(!Utils.isURL(rpcInput.text)) {
//% "Invalid URL"
rpcValidationError = qsTrId("invalid-url")
}
if (customRadioBtn.checked) {
if (networkInput.text === "") {
//% "You need to enter the network id"
networkValidationError = qsTrId("you-need-to-enter-the-network-id")
} else if (isNaN(networkInput.text)){
//% "Should be a number"
networkValidationError = qsTrId("should-be-a-number");
} else if (parseInt(networkInput.text, 10) <= 4){
//% "Invalid network id"
networkValidationError = qsTrId("invalid-network-id");
}
}
return !nameValidationError && !rpcValidationError && !networkValidationError
}
onOpened: {
nameInput.text = "";
rpcInput.text = "";
networkInput.text = "";
mainnetRadioBtn.checked = true;
addNetworkPopup.networkId = 1;
addNetworkPopup.networkType = Constants.networkMainnet;
nameValidationError = "";
rpcValidationError = "";
networkValidationError = "";
}
rightButtons: [
StatusButton {
//% "Save"
text: qsTrId("save")
enabled: nameInput.text !== "" && rpcInput.text !== ""
onClicked: {
if (!addNetworkPopup.validate()) {
return;
}
if (customRadioBtn.checked){
addNetworkPopup.networkId = parseInt(networkInput.text, 10);
}
addNetworkPopup.advancedStore.addCustomNetwork(nameInput.text,
rpcInput.text,
addNetworkPopup.networkId,
addNetworkPopup.networkType)
addNetworkPopup.close()
}
}
]
contentItem: Item {
anchors.fill: parent
anchors {
topMargin: (Style.current.padding + addNetworkPopup.topPadding)
leftMargin: Style.current.padding
rightMargin: Style.current.padding
bottomMargin: (Style.current.padding + addNetworkPopup.bottomPadding)
}
Input {
id: nameInput
//% "Name"
label: qsTrId("name")
//% "Specify a name"
placeholderText: qsTrId("specify-name")
validationError: addNetworkPopup.nameValidationError
}
Input {
id: rpcInput
//% "RPC URL"
label: qsTrId("rpc-url")
//% "Specify a RPC URL"
placeholderText: qsTrId("specify-rpc-url")
validationError: addNetworkPopup.rpcValidationError
anchors.top: nameInput.bottom
anchors.topMargin: Style.current.padding
}
StatusSectionHeadline {
id: networkChainHeadline
//% "Network chain"
text: qsTrId("network-chain")
anchors.top: rpcInput.bottom
anchors.topMargin: Style.current.padding
}
Column {
id: radioButtonsColumn
anchors.top: networkChainHeadline.bottom
anchors.left: parent.left
anchors.right: parent.right
anchors.rightMargin: Style.current.padding
anchors.leftMargin: Style.current.padding
spacing: 0
ButtonGroup {
id: networkChainGroup
}
RadioButtonSelector {
id: mainnetRadioBtn
//% "Main network"
objectName: "main"
title: qsTrId("mainnet-network")
buttonGroup: networkChainGroup
checked: true
onCheckedChanged: {
if (checked) {
addNetworkPopup.networkId = 1;
addNetworkPopup.networkType = Constants.networkMainnet;
}
}
}
RadioButtonSelector {
//% "Ropsten test network"
title: qsTrId("ropsten-network")
buttonGroup: networkChainGroup
onCheckedChanged: {
if (checked) {
addNetworkPopup.networkId = 3;
addNetworkPopup.networkType = Constants.networkRopsten;
}
}
}
RadioButtonSelector {
//% "Rinkeby test network"
title: qsTrId("rinkeby-network")
buttonGroup: networkChainGroup
onCheckedChanged: {
if (checked) {
addNetworkPopup.networkId = 4;
addNetworkPopup.networkType = Constants.networkRinkeby;
}
}
}
RadioButtonSelector {
id: customRadioBtn
//% "Custom"
objectName: "custom"
title: qsTrId("custom")
buttonGroup: networkChainGroup
onCheckedChanged: {
if (checked) {
addNetworkPopup.networkType = "";
}
networkInput.visible = checked;
}
}
}
Input {
id: networkInput
anchors.top: radioButtonsColumn.bottom
anchors.topMargin: Style.current.halfPadding
visible: false
//% "Network Id"
label: qsTrId("network-id")
//% "Specify the network id"
placeholderText: qsTrId("specify-the-network-id")
validationError: addNetworkPopup.networkValidationError
}
}
}

View File

@ -7,8 +7,6 @@ QtObject {
property var advancedModule
// Advanced Module Properties
property string currentNetworkName: advancedModule? advancedModule.currentNetworkName : ""
property string currentNetworkId: advancedModule? advancedModule.currentNetworkId : ""
property string currentChainId: advancedModule? advancedModule.currentChainId : 0
property string fleet: advancedModule? advancedModule.fleet : ""
property string bloomLevel: advancedModule? advancedModule.bloomLevel : ""
@ -34,24 +32,10 @@ QtObject {
readonly property string onlineUsers: "onlineUsers"
readonly property string gifWidget: "gifWidget"
readonly property string keycard: "keycard"
readonly property string multiNetwork: "multiNetwork"
readonly property string communityHistoryArchiveSupport: "communityHistoryArchiveSupport"
readonly property string communitiesPortal: "communitiesPortal"
}
function setGlobalNetworkId() {
Global.currentNetworkId = currentNetworkId
Global.currentChainId = currentChainId
}
Component.onCompleted: {
setGlobalNetworkId()
}
onCurrentNetworkIdChanged: {
setGlobalNetworkId()
}
function logDir() {
if(!root.advancedModule)
return ""
@ -115,13 +99,6 @@ QtObject {
root.advancedModule.enableDeveloperFeatures()
}
function addCustomNetwork(name, endpoint, networkId, networkType) {
if(!root.advancedModule)
return
root.advancedModule.addCustomNetwork(name, endpoint, networkId, networkType)
}
function toggleExperimentalFeature(feature) {
if(!root.advancedModule)
return
@ -157,9 +134,6 @@ QtObject {
else if (feature === experimentalFeatures.keycard) {
localAccountSettings.isKeycardEnabled = !localAccountSettings.isKeycardEnabled
}
else if (feature === experimentalFeatures.multiNetwork) {
localAccountSensitiveSettings.isMultiNetworkEnabled = !localAccountSensitiveSettings.isMultiNetworkEnabled
}
}
}

View File

@ -6,7 +6,6 @@ QtObject {
id: root
property var accountSensitiveSettings: localAccountSensitiveSettings
property bool isMultiNetworkEnabled: accountSensitiveSettings.isMultiNetworkEnabled
property var areTestNetworksEnabled: networksModule.areTestNetworksEnabled
property var layer1Networks: networksModule.layer1

View File

@ -30,17 +30,6 @@ SettingsContentBase {
anchors.left: parent.left
width: root.contentWidth
// TODO: replace with StatusQ component
StatusSettingsLineButton {
anchors.leftMargin: 0
anchors.rightMargin: 0
//% "Network"
text: qsTrId("network")
visible: !localAccountSensitiveSettings.isMultiNetworkEnabled
currentValue: root.advancedStore.currentNetworkName
onClicked: networksModal.open()
}
// TODO: replace with StatusQ component
StatusSettingsLineButton {
anchors.leftMargin: 0
@ -179,23 +168,6 @@ SettingsContentBase {
}
}
// TODO: replace with StatusQ component
StatusSettingsLineButton {
anchors.leftMargin: 0
anchors.rightMargin: 0
text: qsTr("Multi network")
isSwitch: true
switchChecked: localAccountSensitiveSettings.isMultiNetworkEnabled
onClicked: {
if (localAccountSensitiveSettings.isMultiNetworkEnabled) {
root.advancedStore.toggleExperimentalFeature(root.advancedStore.experimentalFeatures.multiNetwork)
} else {
confirmationPopup.experimentalFeature = root.advancedStore.experimentalFeatures.multiNetwork
confirmationPopup.open()
}
}
}
// TODO: replace with StatusQ component
StatusSettingsLineButton {
anchors.leftMargin: 0
@ -458,24 +430,6 @@ SettingsContentBase {
Global.openPopup(enableAutoMessageConfirmationDialogComponent)
}
}
// TODO: replace with StatusQ component
StatusSettingsLineButton {
anchors.leftMargin: 0
anchors.rightMargin: 0
text: qsTr("Stickers/ENS on ropsten")
visible: !localAccountSensitiveSettings.isMultiNetworkEnabled && root.advancedStore.currentNetworkId === Constants.networkRopsten
isSwitch: true
switchChecked: localAccountSensitiveSettings.stickersEnsRopsten
onClicked: {
localAccountSensitiveSettings.stickersEnsRopsten = !localAccountSensitiveSettings.stickersEnsRopsten
}
}
}
NetworksModal {
id: networksModal
advancedStore: root.advancedStore
}
FleetsModal {

View File

@ -30,7 +30,7 @@ Item {
signal goToList();
function goToStart(){
if(ensView.ensUsernamesStore.ensUsernamesModel.count > 0 && Global.networkGuarded){
if(ensView.ensUsernamesStore.ensUsernamesModel.count > 0){
goToList();
} else {
goToWelcome();

View File

@ -297,7 +297,6 @@ Item {
anchors.bottom: parent.bottom
anchors.bottomMargin: Style.current.padding
anchors.horizontalCenter: parent.horizontalCenter
enabled: Global.networkGuarded
//% "Start"
text: enabled ?
qsTrId("start") :

View File

@ -85,7 +85,6 @@ Column {
Separator {
height: 17
visible: root.walletStore.isMultiNetworkEnabled
}
StatusDescriptionListItem {

View File

@ -72,7 +72,6 @@ Item {
NetworkFilter {
id: networkFilter
visible: walletHeader.walletStore.isMultiNetworkEnabled
anchors.top: parent.top
anchors.topMargin: 56
anchors.right: parent.right

View File

@ -107,7 +107,6 @@ StatusModal {
}
StatusSwitchTabButton {
text: qsTr("Multichain")
enabled: localAccountSensitiveSettings.isMultiNetworkEnabled
}
}

View File

@ -13,7 +13,6 @@ QtObject {
property var accountSensitiveSettings: localAccountSensitiveSettings
property string locale: appSettings.locale
property bool hideSignPhraseModal: accountSensitiveSettings.hideSignPhraseModal
property bool isMultiNetworkEnabled: accountSensitiveSettings.isMultiNetworkEnabled
property string currentCurrency: walletSection.currentCurrency
property string totalCurrencyBalance: walletSection.totalCurrencyBalance

View File

@ -52,7 +52,6 @@ QtObject {
property var walletSectionTransactionsInst: walletSectionTransactions
property bool isMultiNetworkEnabled: localAccountSensitiveSettings.isMultiNetworkEnabled
property var savedAddressesModel: walletSectionSavedAddresses.model
@ -100,8 +99,8 @@ QtObject {
return JSON.parse(walletSectionTransactions.suggestedFees(chainId))
}
function getEstimatedTime(priorityFeePerGas, maxFeePerGas) {
return walletSectionTransactions.getEstimatedTime(priorityFeePerGas, maxFeePerGas)
function getEstimatedTime(chainId, priorityFeePerGas, maxFeePerGas) {
return walletSectionTransactions.getEstimatedTime(chainId, priorityFeePerGas, maxFeePerGas)
}
function getChainIdForChat() {

View File

@ -28,6 +28,7 @@ Item {
property string defaultGasLimit: "0"
property string maxFiatFees: selectedGasFiatValue + root.defaultCurrency.toUpperCase()
property int estimatedTxTimeFlag: Constants.transactionEstimatedTime.unknown
property int chainId: 1
property alias selectedTipLimit: inputPerGasTipLimit.text
@ -66,12 +67,11 @@ Item {
}
Qt.callLater(function () {
let ethValue = root.getGasEthValue(inputGasPrice.text, inputGasLimit.text)
let fiatValue = root.getFiatValue(ethValue, "ETH", root.defaultCurrency)
selectedGasEthValue = ethValue
selectedGasFiatValue = fiatValue
root.estimatedTxTimeFlag = root.getEstimatedTime(inputPerGasTipLimit.text, inputGasPrice.text)
let ethValue = root.getGasEthValue(inputGasPrice.text, inputGasLimit.text)
let fiatValue = root.getFiatValue(ethValue, "ETH", root.defaultCurrency)
selectedGasEthValue = ethValue
selectedGasFiatValue = fiatValue
root.estimatedTxTimeFlag = root.getEstimatedTime(root.chainId, inputPerGasTipLimit.text, inputGasPrice.text)
})
}
@ -117,11 +117,6 @@ Item {
}
}
Component.onCompleted: {
updateGasEthValue()
checkLimits()
}
function validate() {
// causes error on application load without a null check
if (!inputGasLimit || !inputGasPrice || !inputPerGasTipLimit) {
@ -173,8 +168,7 @@ Item {
if (root.suggestedFees.eip1559Enabled && inputTipLimit <= 0.00) {
inputPerGasTipLimit.validationError = root.greaterThan0ErrorMessage
}
const isInputValid = inputGasLimit.validationError === "" && inputGasPrice.validationError === "" && (!root.suggestedFees.eip1559Enabled || (root.suggestedFees.eip1559Enabled && inputPerGasTipLimit.validationError === ""))
return isInputValid
return inputGasLimit.validationError === "" && inputGasPrice.validationError === "" && (!root.suggestedFees.eip1559Enabled || (root.suggestedFees.eip1559Enabled && inputPerGasTipLimit.validationError === ""))
}

View File

@ -56,10 +56,6 @@ StatusModal {
}
property var recalculateRoutesAndFees: Backpressure.debounce(popup, 600, function() {
if (!popup.store.isMultiNetworkEnabled) {
return
}
networkSelector.suggestedRoutes = popup.store.suggestedRoutes(
advancedHeader.accountSelector.selectedAccount.address, advancedHeader.amountToSendInput.text, advancedHeader.assetSelector.selectedAsset.symbol
)
@ -97,12 +93,7 @@ StatusModal {
}
}
if (popup.store.isMultiNetworkEnabled) {
popup.recalculateRoutesAndFees()
} else {
gasSelector.suggestedFees = popup.store.suggestedFees(Global.currentChainId)
gasSelector.checkOptimal()
}
popup.recalculateRoutesAndFees()
}
@ -165,9 +156,9 @@ StatusModal {
anchors.top: addressSelector.bottom
anchors.right: parent.right
anchors.left: parent.left
visible: popup.store.isMultiNetworkEnabled
onNetworkChanged: function(chainId) {
gasSelector.suggestedFees = popup.store.suggestedFees(chainId)
gasSelector.updateGasEthValue()
}
}
@ -178,7 +169,7 @@ StatusModal {
getFiatValue: popup.store.getFiatValue
getEstimatedTime: popup.store.getEstimatedTime
defaultCurrency: popup.store.currentCurrency
chainId: networkSelector.selectedNetwork.chainId
width: stack.width
property var estimateGas: Backpressure.debounce(gasSelector, 600, function() {
if (!(advancedHeader.accountSelector.selectedAccount && advancedHeader.accountSelector.selectedAccount.address &&

View File

@ -1253,7 +1253,7 @@ Rectangle {
anchors.bottom: parent.bottom
icon.name: "stickers"
type: StatusQ.StatusFlatRoundButton.Type.Tertiary
visible: !isEdit && Global.networkGuarded && emojiBtn.visible
visible: !isEdit && emojiBtn.visible
color: "transparent"
onClicked: togglePopup(stickersPopup, stickersBtn)
}

View File

@ -260,12 +260,8 @@ QtObject {
readonly property string zeroAddress: "0x0000000000000000000000000000000000000000"
readonly property string networkMainnet: "mainnet_rpc"
readonly property string networkPOA: "poa_rpc"
readonly property string networkXDai: "xdai_rpc"
readonly property string networkGoerli: "goerli_rpc"
readonly property string networkRinkeby: "rinkeby_rpc"
readonly property string networkRopsten: "testnet_rpc"
readonly property string networkMainnet: "Mainnet"
readonly property string networkRopsten: "Ropsten"
readonly property string api_request: "api-request"
readonly property string web3SendAsyncReadOnly: "web3-send-async-read-only"

View File

@ -15,10 +15,6 @@ QtObject {
property var mainModuleInst
property var privacyModuleInst
property bool profilePopupOpened: false
property string currentNetworkId: ""
property int currentChainId: 0
property bool networkGuarded: localAccountSensitiveSettings.isMultiNetworkEnabled || (root.currentNetworkId === Constants.networkMainnet ||
(root.currentNetworkId === Constants.networkRopsten && localAccountSensitiveSettings.stickersEnsRopsten))
signal openImagePopup(var image, var contextMenu)
signal openLinkInBrowser(string link)

View File

@ -455,23 +455,6 @@ QtObject {
return Date.now().toString(36) + Math.random().toString(36).substr(2, 5)
}
function getNetworkName(network){
switch(network){
//% "Mainnet with upstream RPC"
case Constants.networkMainnet: return qsTrId("mainnet-with-upstream-rpc")
//% "POA Network"
case Constants.networkPOA: return qsTrId("poa-network")
//% "xDai Chain"
case Constants.networkXDai: return qsTrId("xdai-chain")
//% "Goerli with upstream RPC"
case Constants.networkGoerli: return qsTrId("goerli-with-upstream-rpc")
//% "Rinkeby with upstream RPC"
case Constants.networkRinkeby: return qsTrId("rinkeby-with-upstream-rpc")
//% "Ropsten with upstream RPC"
case Constants.networkRopsten: return qsTrId("ropsten-with-upstream-rpc")
default: return network
}
}
function validatePasswords(item, firstPasswordField, repeatPasswordField) {
switch (item) {

2
vendor/status-go vendored

@ -1 +1 @@
Subproject commit 23d745fe0a61501b847af9c54479d5fa763a51d0
Subproject commit 4a3c4ad0cadbda41a655c86c53c09fcf59c8bc60