mirror of
https://github.com/status-im/status-desktop.git
synced 2025-02-25 13:06:08 +00:00
feat(@wallet): multi network history
This commit is contained in:
parent
c296fa21bc
commit
ce7340b9a5
@ -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(
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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")
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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,
|
||||
|
@ -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))
|
||||
|
||||
|
@ -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()
|
@ -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")
|
||||
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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()
|
@ -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()
|
@ -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)
|
||||
|
@ -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)
|
@ -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
|
||||
|
@ -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
|
@ -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)
|
@ -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)
|
||||
}
|
@ -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
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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 })
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
||||
|
@ -213,7 +213,8 @@ QtObject:
|
||||
address,
|
||||
$sntContract.address,
|
||||
$PendingTransactionTypeDto.BuyStickerPack,
|
||||
packId
|
||||
packId,
|
||||
chainId,
|
||||
)
|
||||
return (txHash: transactionHash, error: "")
|
||||
except ValueError:
|
||||
|
@ -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)
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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) =
|
||||
|
@ -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
|
||||
|
@ -1,4 +1,4 @@
|
||||
import json, strutils
|
||||
import json
|
||||
import core, utils
|
||||
import response_type
|
||||
import ./backend
|
||||
|
@ -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)
|
||||
|
@ -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()))
|
||||
|
@ -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", %* [])
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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-")
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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 {
|
||||
|
@ -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();
|
||||
|
@ -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") :
|
||||
|
@ -85,7 +85,6 @@ Column {
|
||||
|
||||
Separator {
|
||||
height: 17
|
||||
visible: root.walletStore.isMultiNetworkEnabled
|
||||
}
|
||||
|
||||
StatusDescriptionListItem {
|
||||
|
@ -72,7 +72,6 @@ Item {
|
||||
|
||||
NetworkFilter {
|
||||
id: networkFilter
|
||||
visible: walletHeader.walletStore.isMultiNetworkEnabled
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: 56
|
||||
anchors.right: parent.right
|
||||
|
@ -107,7 +107,6 @@ StatusModal {
|
||||
}
|
||||
StatusSwitchTabButton {
|
||||
text: qsTr("Multichain")
|
||||
enabled: localAccountSensitiveSettings.isMultiNetworkEnabled
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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() {
|
||||
|
@ -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 === ""))
|
||||
}
|
||||
|
||||
|
||||
|
@ -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 &&
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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"
|
||||
|
@ -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)
|
||||
|
@ -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
2
vendor/status-go
vendored
@ -1 +1 @@
|
||||
Subproject commit 23d745fe0a61501b847af9c54479d5fa763a51d0
|
||||
Subproject commit 4a3c4ad0cadbda41a655c86c53c09fcf59c8bc60
|
Loading…
x
Reference in New Issue
Block a user