diff --git a/src/app/modules/main/wallet_section/wallet_connect/controller.nim b/src/app/modules/main/wallet_section/wallet_connect/controller.nim index 8c5359e320..084b2b0131 100644 --- a/src/app/modules/main/wallet_section/wallet_connect/controller.nim +++ b/src/app/modules/main/wallet_section/wallet_connect/controller.nim @@ -74,6 +74,13 @@ QtObject: if not self.hasActivePairings.get(false): self.hasActivePairings = some(true) + proc deletePairing(self: Controller, topic: string) {.slot.} = + if backend.deletePairing(topic): + if self.hasActivePairings.get(false): + self.hasActivePairings = some(backend.hasActivePairings()) + else: + error "Failed to delete pairing" + proc getHasActivePairings*(self: Controller): bool {.slot.} = if self.hasActivePairings.isNone: self.hasActivePairings = some(backend.hasActivePairings()) diff --git a/src/backend/wallet_connect.nim b/src/backend/wallet_connect.nim index 565e0e18bc..15ee50c621 100644 --- a/src/backend/wallet_connect.nim +++ b/src/backend/wallet_connect.nim @@ -31,6 +31,10 @@ rpc(wCPairSessionProposal, "wallet"): rpc(wCRecordSuccessfulPairing, "wallet"): sessionProposalJson: string +rpc(wCChangePairingState, "wallet"): + topic: string + active: bool + rpc(wCHasActivePairings, "wallet"): discard @@ -39,9 +43,7 @@ rpc(wCSessionRequest, "wallet"): proc isErrorResponse(rpcResponse: RpcResponse[JsonNode]): bool = - if not rpcResponse.error.isNil: - return true - return false + return not rpcResponse.error.isNil proc prepareResponse(res: var JsonNode, rpcResponse: RpcResponse[JsonNode]): string = if isErrorResponse(rpcResponse): @@ -99,6 +101,14 @@ proc recordSuccessfulPairing*(sessionProposalJson: string): bool = warn e.msg return false +proc deletePairing*(topic: string): bool = + try: + let response = wCChangePairingState(topic, false) + return not isErrorResponse(response) + except Exception as e: + warn e.msg + return false + proc hasActivePairings*(): bool = try: let response = wCHasActivePairings() diff --git a/storybook/pages/WalletConnectPage.qml b/storybook/pages/WalletConnectPage.qml index a933b26f0a..9970908f11 100644 --- a/storybook/pages/WalletConnectPage.qml +++ b/storybook/pages/WalletConnectPage.qml @@ -34,9 +34,46 @@ Item { controller: WalletConnectController { pairSessionProposal: function(sessionProposalJson) { - proposeUserPair(sessionProposalJson, `{"eip155":{"methods":["eth_sendTransaction","personal_sign"],"chains":["eip155:5"],"events":["accountsChanged","chainChanged"],"accounts":["eip155:5:0x53780d79E83876dAA21beB8AFa87fd64CC29990b","eip155:5:0xBd54A96c0Ae19a220C8E1234f54c940DFAB34639","eip155:5:0x5D7905390b77A937Ae8c444aA8BF7Fa9a6A7DBA0"]}}`) + proposeUserPair(sessionProposalJson, `{"eip155":{"methods":[ + "personal_sign", + "eth_sendTransaction", + "eth_signTransaction", + "eth_sign", + "eth_signTypedData", + "eth_signTypedData_v4" + ], + "chains":["eip155:5"], + "events":[ + "chainChanged", + "accountsChanged" + ], + "accounts":["eip155:5:0xBd54A96c0Ae19a220C8E1234f54c940DFAB34639"]}}`) } + recordSuccessfulPairing: function(sessionProposalJson) { + const sessionProposal = JSON.parse(sessionProposalJson) + + pairingsModel.append({ + topic: sessionProposal.params.pairingTopic, + expiry: sessionProposal.params.expiry, + active: true, + }) + root.saveListModel(pairingsModel) + } + deletePairing: function(pairingTopic) { + var found = false + for (var i = 0; i < pairingsModel.count; i++) { + if (pairingsModel.get(i).topic === pairingTopic) { + pairingsModel.get.active = false + found = true + break; + } + } + if (!found) { + console.error("Mock Controller: pairing not found", pairingTopic) + } + root.saveListModel(pairingsModel) + } sessionRequest: function(sessionRequestJson, password) { const signedJson = "0x1234567890" this.respondSessionRequest(sessionRequestJson, signedJson, respondError.checked) @@ -74,6 +111,7 @@ Item { checked: wc.sdk.webEngineLoader.active enabled: false } + RowLayout { id: optionsHeader @@ -95,14 +133,64 @@ Item { checked: false } + StatusBaseText { text: "Pairings History"; font.bold: true } + StatusButton { + text: "Clear" + onClicked: { pairingsModel.clear(); root.saveListModel(pairingsModel); } + } + Pairings { + id: pairingsView + + Layout.fillWidth: true + Layout.minimumWidth: count > 0 ? 400 : 0 + Layout.preferredHeight: contentHeight + Layout.maximumHeight: 300 + + onDisconnect: function(pairingTopic) { + wc.sdk.disconnectPairing(pairingTopic) + } + + model: ListModel { + id: pairingsModel + } + clip: true + } + // spacer ColumnLayout {} } } + + Settings { id: settings + property bool hasActivePairings: hasActivePairingsCheckBox.checked + property string pairingsHistory: "" + } + + Component.onCompleted: { + loadListModel(pairingsModel) + } + + function saveListModel(model) { + var listArray = []; + for (var i = 0; i < model.count; i++) { + listArray.push(model.get(i)); + } + settings.pairingsHistory = JSON.stringify(listArray); + } + + function loadListModel(model) { + pairingsModel.clear(); + if (!settings.pairingsHistory) { + return; + } + var listArray = JSON.parse(settings.pairingsHistory); + listArray.forEach(function(entry) { + pairingsModel.append(entry); + }); } } diff --git a/storybook/stubs/nim/WalletConnectController.qml b/storybook/stubs/nim/WalletConnectController.qml index 6708e2a58d..a9fb3525aa 100644 --- a/storybook/stubs/nim/WalletConnectController.qml +++ b/storybook/stubs/nim/WalletConnectController.qml @@ -10,6 +10,10 @@ Item { // function pairSessionProposal(/*string*/ sessionProposalJson) required property var pairSessionProposal + // function pairSessionRequest(/*string*/ sessionRequestJson) + required property var recordSuccessfulPairing + // function deletePairing(/*string*/ topic) + required property var deletePairing signal respondSessionRequest(string sessionRequestJson, string signedJson, bool error) diff --git a/test/go/test-wallet_connect/go.sum b/test/go/test-wallet_connect/go.sum index dfd63fdfeb..ad57ef40ec 100644 --- a/test/go/test-wallet_connect/go.sum +++ b/test/go/test-wallet_connect/go.sum @@ -1988,8 +1988,8 @@ github.com/status-im/gomoji v1.1.3-0.20220213022530-e5ac4a8732d4/go.mod h1:hmpnZ github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= github.com/status-im/keycard-go v0.0.0-20200402102358-957c09536969 h1:Oo2KZNP70KE0+IUJSidPj/BFS/RXNHmKIJOdckzml2E= github.com/status-im/keycard-go v0.0.0-20200402102358-957c09536969/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= -github.com/status-im/markdown v0.0.0-20230314100416-26c6f74522d5 h1:Mie/nQtRrI/+qqyV4j5ydesjoPh6v6KF583NOPLKFQY= -github.com/status-im/markdown v0.0.0-20230314100416-26c6f74522d5/go.mod h1:5rjPyv3KffPNVbFjnsVy0NGj9+JeW40WvXLdxH1VKuE= +github.com/status-im/markdown v0.0.0-20231114210825-6c2d15b5dc57 h1:AuJFXERIFVzUjf9rrTb8vamFubB6Ks/e8aUasDr4pOM= +github.com/status-im/markdown v0.0.0-20231114210825-6c2d15b5dc57/go.mod h1:5rjPyv3KffPNVbFjnsVy0NGj9+JeW40WvXLdxH1VKuE= github.com/status-im/migrate/v4 v4.6.2-status.2/go.mod h1:c/kc90n47GZu/58nnz1OMLTf7uE4Da4gZP5qmU+A/v8= github.com/status-im/migrate/v4 v4.6.2-status.3 h1:Khwjb59NzniloUr5i9s9AtkEyqBbQFt1lkoAu66sAu0= github.com/status-im/migrate/v4 v4.6.2-status.3/go.mod h1:c/kc90n47GZu/58nnz1OMLTf7uE4Da4gZP5qmU+A/v8= diff --git a/test/go/test-wallet_connect/helpers.go b/test/go/test-wallet_connect/helpers.go index b61d823097..d6e5a9be49 100644 --- a/test/go/test-wallet_connect/helpers.go +++ b/test/go/test-wallet_connect/helpers.go @@ -91,8 +91,9 @@ func callPrivateMethod(method string, params []interface{}) string { } type Config struct { - HashedPassword string `json:"hashedPassword"` - NodeConfigFile string `json:"nodeConfigFile"` + HashedPassword string `json:"hashedPassword"` + NodeConfigFile string `json:"nodeConfigFile"` + DataDir *string `json:"dataDir,omitempty"` } func processConfigArgs() (config *Config, nodeConfigJson string, userFolder string, err error) { @@ -128,6 +129,11 @@ func processConfigArgs() (config *Config, nodeConfigJson string, userFolder stri if err == nil { nodeConfigJson = string(nodeConfigData) } + + if config.DataDir != nil { + userFolder = *config.DataDir + } + return } diff --git a/test/go/test-wallet_connect/index.html b/test/go/test-wallet_connect/index.html index cfd19d361b..83b96b0188 100644 --- a/test/go/test-wallet_connect/index.html +++ b/test/go/test-wallet_connect/index.html @@ -9,6 +9,8 @@