Wallet tests as separate mutations (#2385)
* Rename mutation to UPSERT_WALLET_RECEIVE_LND_GRPC * Move wallet typedefs into individual sections * Split wallet tests into separate mutation --------- Co-authored-by: Keyan <34140557+huumn@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									21532509fb
								
							
						
					
					
						commit
						7c6a65c332
					
				@ -1,8 +1,6 @@
 | 
			
		||||
import { gql } from 'graphql-tag'
 | 
			
		||||
 | 
			
		||||
const sharedSend = 'walletId: ID, templateName: ID, enabled: Boolean!'
 | 
			
		||||
 | 
			
		||||
const sharedRecv = `${sharedSend}, networkTests: Boolean`
 | 
			
		||||
const shared = 'walletId: ID, templateName: ID, enabled: Boolean!'
 | 
			
		||||
 | 
			
		||||
const typeDefs = gql`
 | 
			
		||||
  extend type Query {
 | 
			
		||||
@ -24,78 +22,76 @@ const typeDefs = gql`
 | 
			
		||||
    sendToLnAddr(addr: String!, amount: Int!, maxFee: Int!, comment: String, identifier: Boolean, name: String, email: String): Withdrawl!
 | 
			
		||||
    cancelInvoice(hash: String!, hmac: String, userCancel: Boolean): Invoice!
 | 
			
		||||
    dropBolt11(hash: String!): Boolean
 | 
			
		||||
    removeWallet(id: ID!): Boolean
 | 
			
		||||
    deleteWalletLogs(protocolId: Int, debug: Boolean): Boolean
 | 
			
		||||
    setWalletPriorities(priorities: [WalletPriorityUpdate!]!): Boolean
 | 
			
		||||
    buyCredits(credits: Int!): BuyCreditsPaidAction!
 | 
			
		||||
 | 
			
		||||
    # upserts
 | 
			
		||||
    upsertWalletSendLNbits(
 | 
			
		||||
      ${sharedSend},
 | 
			
		||||
      ${shared},
 | 
			
		||||
      url: String!,
 | 
			
		||||
      apiKey: VaultEntryInput!
 | 
			
		||||
    ): WalletSendLNbits!
 | 
			
		||||
 | 
			
		||||
    upsertWalletRecvLNbits(
 | 
			
		||||
      ${sharedRecv},
 | 
			
		||||
      ${shared},
 | 
			
		||||
      url: String!,
 | 
			
		||||
      apiKey: String!
 | 
			
		||||
    ): WalletRecvLNbits!
 | 
			
		||||
 | 
			
		||||
    upsertWalletSendPhoenixd(
 | 
			
		||||
      ${sharedSend},
 | 
			
		||||
      ${shared},
 | 
			
		||||
      url: String!,
 | 
			
		||||
      apiKey: VaultEntryInput!
 | 
			
		||||
    ): WalletSendPhoenixd!
 | 
			
		||||
 | 
			
		||||
    upsertWalletRecvPhoenixd(
 | 
			
		||||
      ${sharedRecv},
 | 
			
		||||
      ${shared},
 | 
			
		||||
      url: String!,
 | 
			
		||||
      apiKey: String!
 | 
			
		||||
    ): WalletRecvPhoenixd!
 | 
			
		||||
 | 
			
		||||
    upsertWalletSendBlink(
 | 
			
		||||
      ${sharedSend},
 | 
			
		||||
      ${shared},
 | 
			
		||||
      currency: VaultEntryInput!,
 | 
			
		||||
      apiKey: VaultEntryInput!
 | 
			
		||||
    ): WalletSendBlink!
 | 
			
		||||
 | 
			
		||||
    upsertWalletRecvBlink(
 | 
			
		||||
      ${sharedRecv},
 | 
			
		||||
      ${shared},
 | 
			
		||||
      currency: String!,
 | 
			
		||||
      apiKey: String!
 | 
			
		||||
    ): WalletRecvBlink!
 | 
			
		||||
 | 
			
		||||
    upsertWalletRecvLightningAddress(
 | 
			
		||||
      ${sharedRecv},
 | 
			
		||||
      ${shared},
 | 
			
		||||
      address: String!
 | 
			
		||||
    ): WalletRecvLightningAddress!
 | 
			
		||||
 | 
			
		||||
    upsertWalletSendNWC(
 | 
			
		||||
      ${sharedSend},
 | 
			
		||||
      ${shared},
 | 
			
		||||
      url: VaultEntryInput!
 | 
			
		||||
    ): WalletSendNWC!
 | 
			
		||||
 | 
			
		||||
    upsertWalletRecvNWC(
 | 
			
		||||
      ${sharedRecv},
 | 
			
		||||
      ${shared},
 | 
			
		||||
      url: String!
 | 
			
		||||
    ): WalletRecvNWC!
 | 
			
		||||
 | 
			
		||||
    upsertWalletRecvCLNRest(
 | 
			
		||||
      ${sharedRecv},
 | 
			
		||||
      ${shared},
 | 
			
		||||
      socket: String!,
 | 
			
		||||
      rune: String!,
 | 
			
		||||
      cert: String
 | 
			
		||||
    ): WalletRecvCLNRest!
 | 
			
		||||
 | 
			
		||||
    upsertWalletRecvLNDGRPC(
 | 
			
		||||
      ${sharedRecv},
 | 
			
		||||
      ${shared},
 | 
			
		||||
      socket: String!,
 | 
			
		||||
      macaroon: String!,
 | 
			
		||||
      cert: String
 | 
			
		||||
    ): WalletRecvLNDGRPC!
 | 
			
		||||
 | 
			
		||||
    upsertWalletSendLNC(
 | 
			
		||||
      ${sharedSend},
 | 
			
		||||
      ${shared},
 | 
			
		||||
      pairingPhrase: VaultEntryInput!,
 | 
			
		||||
      localKey: VaultEntryInput!,
 | 
			
		||||
      remoteKey: VaultEntryInput!,
 | 
			
		||||
@ -103,16 +99,62 @@ const typeDefs = gql`
 | 
			
		||||
    ): WalletSendLNC!
 | 
			
		||||
 | 
			
		||||
    upsertWalletSendWebLN(
 | 
			
		||||
      ${sharedSend}
 | 
			
		||||
      ${shared}
 | 
			
		||||
    ): WalletSendWebLN!
 | 
			
		||||
 | 
			
		||||
    # tests
 | 
			
		||||
    testWalletRecvNWC(
 | 
			
		||||
      url: String!
 | 
			
		||||
    ): Boolean!
 | 
			
		||||
 | 
			
		||||
    testWalletRecvLightningAddress(
 | 
			
		||||
      address: String!
 | 
			
		||||
    ): Boolean!
 | 
			
		||||
 | 
			
		||||
    testWalletRecvCLNRest(
 | 
			
		||||
      socket: String!,
 | 
			
		||||
      rune: String!,
 | 
			
		||||
      cert: String
 | 
			
		||||
    ): Boolean!
 | 
			
		||||
 | 
			
		||||
    testWalletRecvLNDGRPC(
 | 
			
		||||
      socket: String!,
 | 
			
		||||
      macaroon: String!,
 | 
			
		||||
      cert: String
 | 
			
		||||
    ): Boolean!
 | 
			
		||||
 | 
			
		||||
    testWalletRecvPhoenixd(
 | 
			
		||||
      url: String!
 | 
			
		||||
      apiKey: String!
 | 
			
		||||
    ): Boolean!
 | 
			
		||||
 | 
			
		||||
    testWalletRecvLNbits(
 | 
			
		||||
      url: String!
 | 
			
		||||
      apiKey: String!
 | 
			
		||||
    ): Boolean!
 | 
			
		||||
 | 
			
		||||
    testWalletRecvBlink(
 | 
			
		||||
      currency: String!
 | 
			
		||||
      apiKey: String!
 | 
			
		||||
    ): Boolean!
 | 
			
		||||
 | 
			
		||||
    # delete
 | 
			
		||||
    removeWallet(id: ID!): Boolean
 | 
			
		||||
    removeWalletProtocol(id: ID!): Boolean
 | 
			
		||||
 | 
			
		||||
    # crypto
 | 
			
		||||
    updateWalletEncryption(keyHash: String!, wallets: [WalletEncryptionUpdate!]!): Boolean
 | 
			
		||||
    updateKeyHash(keyHash: String!): Boolean
 | 
			
		||||
    resetWallets(newKeyHash: String!): Boolean
 | 
			
		||||
    disablePassphraseExport: Boolean
 | 
			
		||||
 | 
			
		||||
    # settings
 | 
			
		||||
    setWalletSettings(settings: WalletSettingsInput!): Boolean
 | 
			
		||||
    setWalletPriorities(priorities: [WalletPriorityUpdate!]!): Boolean
 | 
			
		||||
 | 
			
		||||
    # logs
 | 
			
		||||
    addWalletLog(protocolId: Int, level: String!, message: String!, timestamp: Date!, invoiceId: Int): Boolean
 | 
			
		||||
    deleteWalletLogs(protocolId: Int, debug: Boolean): Boolean
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  type BuyCreditsResult {
 | 
			
		||||
 | 
			
		||||
@ -291,7 +291,7 @@ index 26c292d9..3ac88ae1 100644
 | 
			
		||||
- add GraphQL type
 | 
			
		||||
- add GraphQL type to `WalletProtocolConfig` union
 | 
			
		||||
- add GraphQL type to `WalletProtocolFields` fragment via spread operator (...)
 | 
			
		||||
- add GraphQL mutation to upsert protocol
 | 
			
		||||
- add GraphQL mutation to upsert and test protocol
 | 
			
		||||
- resolve GraphQL type in `mapWalletResolveTypes` function
 | 
			
		||||
 | 
			
		||||
<details>
 | 
			
		||||
@ -303,10 +303,10 @@ index 3c1fffd1..af3858a5 100644
 | 
			
		||||
--- a/api/typeDefs/wallet.js
 | 
			
		||||
+++ b/api/typeDefs/wallet.js
 | 
			
		||||
@@ -38,6 +38,7 @@ const typeDefs = gql`
 | 
			
		||||
     upsertWalletRecvLNDGRPC(walletId: ID, templateId: ID, enabled: Boolean!, networkTests: Boolean, socket: String!, macaroon: String!, cert: String): WalletRecvLNDGRPC!
 | 
			
		||||
     upsertWalletRecvLNDGRPC(walletId: ID, templateId: ID, enabled: Boolean!, socket: String!, macaroon: String!, cert: String): WalletRecvLNDGRPC!
 | 
			
		||||
     upsertWalletSendLNC(walletId: ID, templateId: ID, enabled: Boolean!, pairingPhrase: VaultEntryInput!, localKey: VaultEntryInput!, remoteKey: VaultEntryInput!, serverHost: VaultEntryInput!): WalletSendLNC!
 | 
			
		||||
     upsertWalletSendWebLN(walletId: ID, templateId: ID, enabled: Boolean!): WalletSendWebLN!
 | 
			
		||||
+    upsertWalletRecvBolt12(walletId: ID, templateId: ID, enabled: Boolean!, networkTests: Boolean, offer: String!): WalletRecvBolt12!
 | 
			
		||||
+    upsertWalletRecvBolt12(walletId: ID, templateId: ID, enabled: Boolean!, offer: String!): WalletRecvBolt12!
 | 
			
		||||
     removeWalletProtocol(id: ID!): Boolean
 | 
			
		||||
     updateWalletEncryption(keyHash: String!, wallets: [WalletEncryptionUpdate!]!): Boolean
 | 
			
		||||
     updateKeyHash(keyHash: String!): Boolean
 | 
			
		||||
@ -340,8 +340,8 @@ index d1a65ff4..138d1a62 100644
 | 
			
		||||
 `
 | 
			
		||||
+
 | 
			
		||||
+export const UPSERT_WALLET_RECEIVE_BOLT12 = gql`
 | 
			
		||||
+  mutation upsertWalletRecvBolt12($walletId: ID, $templateId: ID, $enabled: Boolean!, $networkTests: Boolean, $offer: String!) {
 | 
			
		||||
+    upsertWalletRecvBolt12(walletId: $walletId, templateId: $templateId, enabled: $enabled, networkTests: $networkTests, offer: $offer) {
 | 
			
		||||
+  mutation upsertWalletRecvBolt12($walletId: ID, $templateId: ID, $enabled: Boolean!, $offer: String!) {
 | 
			
		||||
+    upsertWalletRecvBolt12(walletId: $walletId, templateId: $templateId, enabled: $enabled, offer: $offer) {
 | 
			
		||||
+      id
 | 
			
		||||
+    }
 | 
			
		||||
+  }
 | 
			
		||||
 | 
			
		||||
@ -1,29 +1,26 @@
 | 
			
		||||
import { gql } from '@apollo/client'
 | 
			
		||||
 | 
			
		||||
const sharedSend = {
 | 
			
		||||
const shared = {
 | 
			
		||||
  variables: '$walletId: ID, $templateName: ID, $enabled: Boolean!',
 | 
			
		||||
  arguments: 'walletId: $walletId, templateName: $templateName, enabled: $enabled'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const sharedRecv = {
 | 
			
		||||
  variables: `${sharedSend.variables}, $networkTests: Boolean`,
 | 
			
		||||
  arguments: `${sharedSend.arguments}, networkTests: $networkTests`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const REMOVE_WALLET_PROTOCOL = gql`
 | 
			
		||||
  mutation removeWalletProtocol($id: ID!) {
 | 
			
		||||
    removeWalletProtocol(id: $id)
 | 
			
		||||
  }
 | 
			
		||||
`
 | 
			
		||||
 | 
			
		||||
// upserts
 | 
			
		||||
 | 
			
		||||
export const UPSERT_WALLET_SEND_LNBITS = gql`
 | 
			
		||||
  mutation upsertWalletSendLNbits(
 | 
			
		||||
    ${sharedSend.variables},
 | 
			
		||||
    ${shared.variables},
 | 
			
		||||
    $url: String!,
 | 
			
		||||
    $apiKey: VaultEntryInput!
 | 
			
		||||
  ) {
 | 
			
		||||
    upsertWalletSendLNbits(
 | 
			
		||||
      ${sharedSend.arguments}
 | 
			
		||||
      ${shared.arguments}
 | 
			
		||||
      url: $url,
 | 
			
		||||
      apiKey: $apiKey
 | 
			
		||||
    ) {
 | 
			
		||||
@ -34,12 +31,12 @@ export const UPSERT_WALLET_SEND_LNBITS = gql`
 | 
			
		||||
 | 
			
		||||
export const UPSERT_WALLET_RECEIVE_LNBITS = gql`
 | 
			
		||||
  mutation upsertWalletRecvLNbits(
 | 
			
		||||
    ${sharedRecv.variables},
 | 
			
		||||
    ${shared.variables},
 | 
			
		||||
    $url: String!,
 | 
			
		||||
    $apiKey: String!
 | 
			
		||||
  ) {
 | 
			
		||||
    upsertWalletRecvLNbits(
 | 
			
		||||
      ${sharedRecv.arguments},
 | 
			
		||||
      ${shared.arguments},
 | 
			
		||||
      url: $url,
 | 
			
		||||
      apiKey: $apiKey
 | 
			
		||||
    ) {
 | 
			
		||||
@ -50,12 +47,12 @@ export const UPSERT_WALLET_RECEIVE_LNBITS = gql`
 | 
			
		||||
 | 
			
		||||
export const UPSERT_WALLET_SEND_PHOENIXD = gql`
 | 
			
		||||
  mutation upsertWalletSendPhoenixd(
 | 
			
		||||
    ${sharedSend.variables},
 | 
			
		||||
    ${shared.variables},
 | 
			
		||||
    $url: String!,
 | 
			
		||||
    $apiKey: VaultEntryInput!
 | 
			
		||||
  ) {
 | 
			
		||||
    upsertWalletSendPhoenixd(
 | 
			
		||||
      ${sharedSend.arguments},
 | 
			
		||||
      ${shared.arguments},
 | 
			
		||||
      url: $url,
 | 
			
		||||
      apiKey: $apiKey
 | 
			
		||||
    ) {
 | 
			
		||||
@ -66,12 +63,12 @@ export const UPSERT_WALLET_SEND_PHOENIXD = gql`
 | 
			
		||||
 | 
			
		||||
export const UPSERT_WALLET_RECEIVE_PHOENIXD = gql`
 | 
			
		||||
  mutation upsertWalletRecvPhoenixd(
 | 
			
		||||
    ${sharedRecv.variables},
 | 
			
		||||
    ${shared.variables},
 | 
			
		||||
    $url: String!,
 | 
			
		||||
    $apiKey: String!
 | 
			
		||||
  ) {
 | 
			
		||||
    upsertWalletRecvPhoenixd(
 | 
			
		||||
      ${sharedRecv.arguments},
 | 
			
		||||
      ${shared.arguments},
 | 
			
		||||
      url: $url,
 | 
			
		||||
      apiKey: $apiKey
 | 
			
		||||
    ) {
 | 
			
		||||
@ -82,12 +79,12 @@ export const UPSERT_WALLET_RECEIVE_PHOENIXD = gql`
 | 
			
		||||
 | 
			
		||||
export const UPSERT_WALLET_SEND_BLINK = gql`
 | 
			
		||||
  mutation upsertWalletSendBlink(
 | 
			
		||||
    ${sharedSend.variables},
 | 
			
		||||
    ${shared.variables},
 | 
			
		||||
    $currency: VaultEntryInput!,
 | 
			
		||||
    $apiKey: VaultEntryInput!
 | 
			
		||||
  ) {
 | 
			
		||||
    upsertWalletSendBlink(
 | 
			
		||||
      ${sharedSend.arguments},
 | 
			
		||||
      ${shared.arguments},
 | 
			
		||||
      currency: $currency,
 | 
			
		||||
      apiKey: $apiKey
 | 
			
		||||
    ) {
 | 
			
		||||
@ -98,12 +95,12 @@ export const UPSERT_WALLET_SEND_BLINK = gql`
 | 
			
		||||
 | 
			
		||||
export const UPSERT_WALLET_RECEIVE_BLINK = gql`
 | 
			
		||||
  mutation upsertWalletRecvBlink(
 | 
			
		||||
    ${sharedRecv.variables},
 | 
			
		||||
    ${shared.variables},
 | 
			
		||||
    $currency: String!,
 | 
			
		||||
    $apiKey: String!
 | 
			
		||||
  ) {
 | 
			
		||||
    upsertWalletRecvBlink(
 | 
			
		||||
      ${sharedRecv.arguments},
 | 
			
		||||
      ${shared.arguments},
 | 
			
		||||
      currency: $currency,
 | 
			
		||||
      apiKey: $apiKey
 | 
			
		||||
    ) {
 | 
			
		||||
@ -114,11 +111,11 @@ export const UPSERT_WALLET_RECEIVE_BLINK = gql`
 | 
			
		||||
 | 
			
		||||
export const UPSERT_WALLET_RECEIVE_LIGHTNING_ADDRESS = gql`
 | 
			
		||||
  mutation upsertWalletRecvLightningAddress(
 | 
			
		||||
    ${sharedRecv.variables},
 | 
			
		||||
    ${shared.variables},
 | 
			
		||||
    $address: String!
 | 
			
		||||
  ) {
 | 
			
		||||
    upsertWalletRecvLightningAddress(
 | 
			
		||||
      ${sharedRecv.arguments},
 | 
			
		||||
      ${shared.arguments},
 | 
			
		||||
      address: $address
 | 
			
		||||
    ) {
 | 
			
		||||
      id
 | 
			
		||||
@ -128,11 +125,11 @@ export const UPSERT_WALLET_RECEIVE_LIGHTNING_ADDRESS = gql`
 | 
			
		||||
 | 
			
		||||
export const UPSERT_WALLET_SEND_NWC = gql`
 | 
			
		||||
  mutation upsertWalletSendNWC(
 | 
			
		||||
    ${sharedSend.variables},
 | 
			
		||||
    ${shared.variables},
 | 
			
		||||
    $url: VaultEntryInput!
 | 
			
		||||
  ) {
 | 
			
		||||
    upsertWalletSendNWC(
 | 
			
		||||
      ${sharedSend.arguments},
 | 
			
		||||
      ${shared.arguments},
 | 
			
		||||
      url: $url
 | 
			
		||||
    ) {
 | 
			
		||||
      id
 | 
			
		||||
@ -142,11 +139,11 @@ export const UPSERT_WALLET_SEND_NWC = gql`
 | 
			
		||||
 | 
			
		||||
export const UPSERT_WALLET_RECEIVE_NWC = gql`
 | 
			
		||||
  mutation upsertWalletRecvNWC(
 | 
			
		||||
    ${sharedRecv.variables},
 | 
			
		||||
    ${shared.variables},
 | 
			
		||||
    $url: String!
 | 
			
		||||
  ) {
 | 
			
		||||
    upsertWalletRecvNWC(
 | 
			
		||||
      ${sharedRecv.arguments},
 | 
			
		||||
      ${shared.arguments},
 | 
			
		||||
      url: $url
 | 
			
		||||
    ) {
 | 
			
		||||
      id
 | 
			
		||||
@ -156,13 +153,13 @@ export const UPSERT_WALLET_RECEIVE_NWC = gql`
 | 
			
		||||
 | 
			
		||||
export const UPSERT_WALLET_RECEIVE_CLN_REST = gql`
 | 
			
		||||
  mutation upsertWalletRecvCLNRest(
 | 
			
		||||
    ${sharedRecv.variables},
 | 
			
		||||
    ${shared.variables},
 | 
			
		||||
    $socket: String!,
 | 
			
		||||
    $rune: String!,
 | 
			
		||||
    $cert: String
 | 
			
		||||
  ) {
 | 
			
		||||
    upsertWalletRecvCLNRest(
 | 
			
		||||
      ${sharedRecv.arguments},
 | 
			
		||||
      ${shared.arguments},
 | 
			
		||||
      socket: $socket,
 | 
			
		||||
      rune: $rune,
 | 
			
		||||
      cert: $cert
 | 
			
		||||
@ -174,13 +171,13 @@ export const UPSERT_WALLET_RECEIVE_CLN_REST = gql`
 | 
			
		||||
 | 
			
		||||
export const UPSERT_WALLET_RECEIVE_LND_GRPC = gql`
 | 
			
		||||
  mutation upsertWalletRecvLNDGRPC(
 | 
			
		||||
    ${sharedRecv.variables},
 | 
			
		||||
    ${shared.variables},
 | 
			
		||||
    $socket: String!,
 | 
			
		||||
    $macaroon: String!,
 | 
			
		||||
    $cert: String
 | 
			
		||||
  ) {
 | 
			
		||||
    upsertWalletRecvLNDGRPC(
 | 
			
		||||
      ${sharedRecv.arguments},
 | 
			
		||||
      ${shared.arguments},
 | 
			
		||||
      socket: $socket,
 | 
			
		||||
      macaroon: $macaroon,
 | 
			
		||||
      cert: $cert
 | 
			
		||||
@ -192,14 +189,14 @@ export const UPSERT_WALLET_RECEIVE_LND_GRPC = gql`
 | 
			
		||||
 | 
			
		||||
export const UPSERT_WALLET_SEND_LNC = gql`
 | 
			
		||||
  mutation upsertWalletSendLNC(
 | 
			
		||||
    ${sharedSend.variables},
 | 
			
		||||
    ${shared.variables},
 | 
			
		||||
    $pairingPhrase: VaultEntryInput!,
 | 
			
		||||
    $localKey: VaultEntryInput!,
 | 
			
		||||
    $remoteKey: VaultEntryInput!,
 | 
			
		||||
    $serverHost: VaultEntryInput!
 | 
			
		||||
  ) {
 | 
			
		||||
    upsertWalletSendLNC(
 | 
			
		||||
      ${sharedSend.arguments},
 | 
			
		||||
      ${shared.arguments},
 | 
			
		||||
      pairingPhrase: $pairingPhrase,
 | 
			
		||||
      localKey: $localKey,
 | 
			
		||||
      remoteKey: $remoteKey,
 | 
			
		||||
@ -212,12 +209,56 @@ export const UPSERT_WALLET_SEND_LNC = gql`
 | 
			
		||||
 | 
			
		||||
export const UPSERT_WALLET_SEND_WEBLN = gql`
 | 
			
		||||
  mutation upsertWalletSendWebLN(
 | 
			
		||||
    ${sharedSend.variables}
 | 
			
		||||
    ${shared.variables}
 | 
			
		||||
  ) {
 | 
			
		||||
    upsertWalletSendWebLN(
 | 
			
		||||
      ${sharedSend.arguments}
 | 
			
		||||
      ${shared.arguments}
 | 
			
		||||
    ) {
 | 
			
		||||
      id
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
`
 | 
			
		||||
 | 
			
		||||
// tests
 | 
			
		||||
 | 
			
		||||
export const TEST_WALLET_RECEIVE_NWC = gql`
 | 
			
		||||
  mutation testWalletRecvNWC($url: String!) {
 | 
			
		||||
    testWalletRecvNWC(url: $url)
 | 
			
		||||
  }
 | 
			
		||||
`
 | 
			
		||||
 | 
			
		||||
export const TEST_WALLET_RECEIVE_LIGHTNING_ADDRESS = gql`
 | 
			
		||||
  mutation testWalletRecvLightningAddress($address: String!) {
 | 
			
		||||
    testWalletRecvLightningAddress(address: $address)
 | 
			
		||||
  }
 | 
			
		||||
`
 | 
			
		||||
 | 
			
		||||
export const TEST_WALLET_RECEIVE_CLN_REST = gql`
 | 
			
		||||
  mutation testWalletRecvCLNRest($socket: String!, $rune: String!, $cert: String) {
 | 
			
		||||
    testWalletRecvCLNRest(socket: $socket, rune: $rune, cert: $cert)
 | 
			
		||||
  }
 | 
			
		||||
`
 | 
			
		||||
 | 
			
		||||
export const TEST_WALLET_RECEIVE_LND_GRPC = gql`
 | 
			
		||||
  mutation testWalletRecvLNDGRPC($socket: String!, $macaroon: String!, $cert: String) {
 | 
			
		||||
    testWalletRecvLNDGRPC(socket: $socket, macaroon: $macaroon, cert: $cert)
 | 
			
		||||
  }
 | 
			
		||||
`
 | 
			
		||||
 | 
			
		||||
export const TEST_WALLET_RECEIVE_PHOENIXD = gql`
 | 
			
		||||
  mutation testWalletRecvPhoenixd($url: String!, $apiKey: String!) {
 | 
			
		||||
    testWalletRecvPhoenixd(url: $url, apiKey: $apiKey)
 | 
			
		||||
  }
 | 
			
		||||
`
 | 
			
		||||
 | 
			
		||||
export const TEST_WALLET_RECEIVE_LNBITS = gql`
 | 
			
		||||
  mutation testWalletRecvLNbits($url: String!, $apiKey: String!) {
 | 
			
		||||
    testWalletRecvLNbits(url: $url, apiKey: $apiKey)
 | 
			
		||||
  }
 | 
			
		||||
`
 | 
			
		||||
 | 
			
		||||
export const TEST_WALLET_RECEIVE_BLINK = gql`
 | 
			
		||||
  mutation testWalletRecvBlink($currency: String!, $apiKey: String!) {
 | 
			
		||||
    testWalletRecvBlink(currency: $currency, apiKey: $apiKey)
 | 
			
		||||
  }
 | 
			
		||||
`
 | 
			
		||||
 | 
			
		||||
@ -19,9 +19,16 @@ import {
 | 
			
		||||
  RESET_WALLETS,
 | 
			
		||||
  DISABLE_PASSPHRASE_EXPORT,
 | 
			
		||||
  SET_WALLET_PRIORITIES,
 | 
			
		||||
  UPDATE_KEY_HASH
 | 
			
		||||
  UPDATE_KEY_HASH,
 | 
			
		||||
  TEST_WALLET_RECEIVE_LNBITS,
 | 
			
		||||
  TEST_WALLET_RECEIVE_PHOENIXD,
 | 
			
		||||
  TEST_WALLET_RECEIVE_BLINK,
 | 
			
		||||
  TEST_WALLET_RECEIVE_LIGHTNING_ADDRESS,
 | 
			
		||||
  TEST_WALLET_RECEIVE_NWC,
 | 
			
		||||
  TEST_WALLET_RECEIVE_CLN_REST,
 | 
			
		||||
  TEST_WALLET_RECEIVE_LND_GRPC
 | 
			
		||||
} from '@/wallets/client/fragments'
 | 
			
		||||
import { useApolloClient, useMutation, useQuery } from '@apollo/client'
 | 
			
		||||
import { gql, useApolloClient, useMutation, useQuery } from '@apollo/client'
 | 
			
		||||
import { useDecryption, useEncryption, useSetKey, useWalletLogger, useWalletsUpdatedAt, WalletStatus } from '@/wallets/client/hooks'
 | 
			
		||||
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
 | 
			
		||||
import {
 | 
			
		||||
@ -144,10 +151,11 @@ export function useWalletQuery ({ id, name }) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function useWalletProtocolUpsert (wallet, protocol) {
 | 
			
		||||
  const mutation = getWalletProtocolMutation(protocol)
 | 
			
		||||
  const mutation = getWalletProtocolUpsertMutation(protocol)
 | 
			
		||||
  const [mutate] = useMutation(mutation)
 | 
			
		||||
  const { encryptConfig } = useEncryptConfig(protocol)
 | 
			
		||||
  const testSendPayment = useTestSendPayment(protocol)
 | 
			
		||||
  const testCreateInvoice = useTestCreateInvoice(protocol)
 | 
			
		||||
  const logger = useWalletLogger(protocol)
 | 
			
		||||
 | 
			
		||||
  return useCallback(async (values) => {
 | 
			
		||||
@ -158,11 +166,14 @@ export function useWalletProtocolUpsert (wallet, protocol) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // skip network tests if we're disabling the wallet
 | 
			
		||||
    const networkTests = values.enabled
 | 
			
		||||
    if (networkTests) {
 | 
			
		||||
    if (values.enabled) {
 | 
			
		||||
      try {
 | 
			
		||||
        const additionalValues = await testSendPayment(values)
 | 
			
		||||
        values = { ...values, ...additionalValues }
 | 
			
		||||
        if (protocol.send) {
 | 
			
		||||
          const additionalValues = await testSendPayment(values)
 | 
			
		||||
          values = { ...values, ...additionalValues }
 | 
			
		||||
        } else {
 | 
			
		||||
          await testCreateInvoice(values)
 | 
			
		||||
        }
 | 
			
		||||
      } catch (err) {
 | 
			
		||||
        logger.error(err.message)
 | 
			
		||||
        throw err
 | 
			
		||||
@ -172,9 +183,6 @@ export function useWalletProtocolUpsert (wallet, protocol) {
 | 
			
		||||
    const encrypted = await encryptConfig(values)
 | 
			
		||||
 | 
			
		||||
    const variables = encrypted
 | 
			
		||||
    if (!protocol.send) {
 | 
			
		||||
      variables.networkTests = networkTests
 | 
			
		||||
    }
 | 
			
		||||
    if (isWallet(wallet)) {
 | 
			
		||||
      variables.walletId = wallet.id
 | 
			
		||||
    } else {
 | 
			
		||||
@ -194,7 +202,7 @@ export function useWalletProtocolUpsert (wallet, protocol) {
 | 
			
		||||
    requestPersistentStorage()
 | 
			
		||||
 | 
			
		||||
    return updatedWallet
 | 
			
		||||
  }, [wallet, protocol, logger, testSendPayment, encryptConfig, mutate])
 | 
			
		||||
  }, [wallet, protocol, logger, testSendPayment, testCreateInvoice, encryptConfig, mutate])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function useLightningAddressUpsert () {
 | 
			
		||||
@ -286,7 +294,12 @@ export function useSetWalletPriorities () {
 | 
			
		||||
  }, [mutate, toaster])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getWalletProtocolMutation (protocol) {
 | 
			
		||||
// we only have test mutations for receive protocols and useMutation throws if we pass null to it,
 | 
			
		||||
// so we use this placeholder mutation in such cases to respect the rules of hooks.
 | 
			
		||||
// (the mutation would throw if called but we make sure to never call it.)
 | 
			
		||||
const NOOP_MUTATION = gql`mutation noop { noop }`
 | 
			
		||||
 | 
			
		||||
function getWalletProtocolUpsertMutation (protocol) {
 | 
			
		||||
  switch (protocol.name) {
 | 
			
		||||
    case 'LNBITS':
 | 
			
		||||
      return protocol.send ? UPSERT_WALLET_SEND_LNBITS : UPSERT_WALLET_RECEIVE_LNBITS
 | 
			
		||||
@ -295,26 +308,47 @@ function getWalletProtocolMutation (protocol) {
 | 
			
		||||
    case 'BLINK':
 | 
			
		||||
      return protocol.send ? UPSERT_WALLET_SEND_BLINK : UPSERT_WALLET_RECEIVE_BLINK
 | 
			
		||||
    case 'LN_ADDR':
 | 
			
		||||
      return protocol.send ? null : UPSERT_WALLET_RECEIVE_LIGHTNING_ADDRESS
 | 
			
		||||
      return protocol.send ? NOOP_MUTATION : UPSERT_WALLET_RECEIVE_LIGHTNING_ADDRESS
 | 
			
		||||
    case 'NWC':
 | 
			
		||||
      return protocol.send ? UPSERT_WALLET_SEND_NWC : UPSERT_WALLET_RECEIVE_NWC
 | 
			
		||||
    case 'CLN_REST':
 | 
			
		||||
      return protocol.send ? null : UPSERT_WALLET_RECEIVE_CLN_REST
 | 
			
		||||
      return protocol.send ? NOOP_MUTATION : UPSERT_WALLET_RECEIVE_CLN_REST
 | 
			
		||||
    case 'LND_GRPC':
 | 
			
		||||
      return protocol.send ? null : UPSERT_WALLET_RECEIVE_LND_GRPC
 | 
			
		||||
      return protocol.send ? NOOP_MUTATION : UPSERT_WALLET_RECEIVE_LND_GRPC
 | 
			
		||||
    case 'LNC':
 | 
			
		||||
      return protocol.send ? UPSERT_WALLET_SEND_LNC : null
 | 
			
		||||
      return protocol.send ? UPSERT_WALLET_SEND_LNC : NOOP_MUTATION
 | 
			
		||||
    case 'WEBLN':
 | 
			
		||||
      return protocol.send ? UPSERT_WALLET_SEND_WEBLN : null
 | 
			
		||||
      return protocol.send ? UPSERT_WALLET_SEND_WEBLN : NOOP_MUTATION
 | 
			
		||||
    default:
 | 
			
		||||
      return null
 | 
			
		||||
      return NOOP_MUTATION
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getWalletProtocolTestMutation (protocol) {
 | 
			
		||||
  if (protocol.send) return NOOP_MUTATION
 | 
			
		||||
 | 
			
		||||
  switch (protocol.name) {
 | 
			
		||||
    case 'LNBITS':
 | 
			
		||||
      return TEST_WALLET_RECEIVE_LNBITS
 | 
			
		||||
    case 'PHOENIXD':
 | 
			
		||||
      return TEST_WALLET_RECEIVE_PHOENIXD
 | 
			
		||||
    case 'BLINK':
 | 
			
		||||
      return TEST_WALLET_RECEIVE_BLINK
 | 
			
		||||
    case 'LN_ADDR':
 | 
			
		||||
      return TEST_WALLET_RECEIVE_LIGHTNING_ADDRESS
 | 
			
		||||
    case 'NWC':
 | 
			
		||||
      return TEST_WALLET_RECEIVE_NWC
 | 
			
		||||
    case 'CLN_REST':
 | 
			
		||||
      return TEST_WALLET_RECEIVE_CLN_REST
 | 
			
		||||
    case 'LND_GRPC':
 | 
			
		||||
      return TEST_WALLET_RECEIVE_LND_GRPC
 | 
			
		||||
    default:
 | 
			
		||||
      return NOOP_MUTATION
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function useTestSendPayment (protocol) {
 | 
			
		||||
  return useCallback(async (values) => {
 | 
			
		||||
    if (!protocol.send) return
 | 
			
		||||
 | 
			
		||||
    return await protocolTestSendPayment(
 | 
			
		||||
      protocol,
 | 
			
		||||
      values,
 | 
			
		||||
@ -323,6 +357,15 @@ function useTestSendPayment (protocol) {
 | 
			
		||||
  }, [protocol])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function useTestCreateInvoice (protocol) {
 | 
			
		||||
  const mutation = getWalletProtocolTestMutation(protocol)
 | 
			
		||||
  const [testCreateInvoice] = useMutation(mutation)
 | 
			
		||||
 | 
			
		||||
  return useCallback(async (values) => {
 | 
			
		||||
    return await testCreateInvoice({ variables: values })
 | 
			
		||||
  }, [testCreateInvoice])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function useWalletDecryption () {
 | 
			
		||||
  const { decryptConfig, ready } = useDecryptConfig()
 | 
			
		||||
 | 
			
		||||
@ -452,7 +495,7 @@ export function useWalletMigrationMutation () {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    await client.mutate({
 | 
			
		||||
      mutation: getWalletProtocolMutation(protocol),
 | 
			
		||||
      mutation: getWalletProtocolUpsertMutation(protocol),
 | 
			
		||||
      variables: {
 | 
			
		||||
        ...(walletId ? { walletId } : { templateName }),
 | 
			
		||||
        enabled,
 | 
			
		||||
 | 
			
		||||
@ -76,6 +76,11 @@ export function protocolMutationName ({ name, send }) {
 | 
			
		||||
  return `upsert${relationName.charAt(0).toUpperCase() + relationName.slice(1)}`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function protocolTestMutationName ({ name, send }) {
 | 
			
		||||
  const relationName = protocolRelationName({ name, send })
 | 
			
		||||
  return `test${relationName.charAt(0).toUpperCase() + relationName.slice(1)}`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function protocolFields ({ name, send }) {
 | 
			
		||||
  return protocol({ name, send })?.fields || []
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
import { GqlAuthenticationError, GqlInputError } from '@/lib/error'
 | 
			
		||||
import { validateSchema } from '@/lib/validate'
 | 
			
		||||
import protocols from '@/wallets/lib/protocols'
 | 
			
		||||
import { protocolRelationName, isEncryptedField, protocolMutationName, protocolServerSchema } from '@/wallets/lib/util'
 | 
			
		||||
import { protocolRelationName, isEncryptedField, protocolMutationName, protocolServerSchema, protocolTestMutationName } from '@/wallets/lib/util'
 | 
			
		||||
import { mapWalletResolveTypes } from '@/wallets/server/resolvers/util'
 | 
			
		||||
import { protocolTestCreateInvoice } from '@/wallets/server/protocols'
 | 
			
		||||
import { timeoutSignal, withTimeout } from '@/lib/time'
 | 
			
		||||
@ -43,12 +43,23 @@ export const resolvers = {
 | 
			
		||||
  },
 | 
			
		||||
  Mutation: {
 | 
			
		||||
    ...Object.fromEntries(
 | 
			
		||||
      protocols.map(protocol => {
 | 
			
		||||
      protocols.reduce((acc, protocol) => {
 | 
			
		||||
        return [
 | 
			
		||||
          protocolMutationName(protocol),
 | 
			
		||||
          upsertWalletProtocol(protocol)
 | 
			
		||||
          ...acc,
 | 
			
		||||
          [
 | 
			
		||||
            protocolMutationName(protocol),
 | 
			
		||||
            upsertWalletProtocol(protocol)
 | 
			
		||||
          ],
 | 
			
		||||
          ...(protocol.send
 | 
			
		||||
            ? []
 | 
			
		||||
            : [
 | 
			
		||||
                [
 | 
			
		||||
                  protocolTestMutationName(protocol),
 | 
			
		||||
                  testWalletProtocol(protocol)
 | 
			
		||||
                ]
 | 
			
		||||
              ])
 | 
			
		||||
        ]
 | 
			
		||||
      })
 | 
			
		||||
      }, [])
 | 
			
		||||
    ),
 | 
			
		||||
    addWalletLog,
 | 
			
		||||
    removeWalletProtocol,
 | 
			
		||||
@ -56,12 +67,43 @@ export const resolvers = {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function testWalletProtocol (protocol) {
 | 
			
		||||
  return async (parent, args, { me, models, tx }) => {
 | 
			
		||||
    if (!me) {
 | 
			
		||||
      throw new GqlAuthenticationError()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (protocol.send) {
 | 
			
		||||
      throw new GqlInputError('can only test receive protocols')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let invoice
 | 
			
		||||
    try {
 | 
			
		||||
      invoice = await withTimeout(
 | 
			
		||||
        protocolTestCreateInvoice(
 | 
			
		||||
          protocol,
 | 
			
		||||
          args,
 | 
			
		||||
          { signal: timeoutSignal(WALLET_CREATE_INVOICE_TIMEOUT_MS) }
 | 
			
		||||
        ),
 | 
			
		||||
        WALLET_CREATE_INVOICE_TIMEOUT_MS
 | 
			
		||||
      )
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      throw new GqlInputError('failed to create invoice: ' + e.message)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!invoice || !invoice.startsWith('lnbc')) {
 | 
			
		||||
      throw new GqlInputError('wallet returned invalid invoice')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return true
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function upsertWalletProtocol (protocol) {
 | 
			
		||||
  return async (parent, {
 | 
			
		||||
    walletId,
 | 
			
		||||
    templateName,
 | 
			
		||||
    enabled,
 | 
			
		||||
    networkTests = true,
 | 
			
		||||
    ignoreKeyHash = false,
 | 
			
		||||
    ...args
 | 
			
		||||
  }, { me, models, tx }) => {
 | 
			
		||||
@ -84,22 +126,6 @@ export function upsertWalletProtocol (protocol) {
 | 
			
		||||
      throw new GqlInputError(e.message)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!protocol.send && networkTests) {
 | 
			
		||||
      let invoice
 | 
			
		||||
      try {
 | 
			
		||||
        invoice = await withTimeout(
 | 
			
		||||
          protocolTestCreateInvoice(protocol, args, { signal: timeoutSignal(WALLET_CREATE_INVOICE_TIMEOUT_MS) }),
 | 
			
		||||
          WALLET_CREATE_INVOICE_TIMEOUT_MS
 | 
			
		||||
        )
 | 
			
		||||
      } catch (e) {
 | 
			
		||||
        throw new GqlInputError('failed to create test invoice: ' + e.message)
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (!invoice || !invoice.startsWith('lnbc')) {
 | 
			
		||||
        throw new GqlInputError('wallet returned invalid invoice')
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const relation = protocolRelationName(protocol)
 | 
			
		||||
 | 
			
		||||
    function dataFragment (args, type) {
 | 
			
		||||
 | 
			
		||||
@ -134,7 +134,7 @@ async function updateWalletEncryption (parent, { keyHash, wallets }, { me, model
 | 
			
		||||
    for (const { id: walletId, protocols } of wallets) {
 | 
			
		||||
      for (const { name, send, config } of protocols) {
 | 
			
		||||
        const mutation = upsertWalletProtocol({ name, send })
 | 
			
		||||
        await mutation(parent, { walletId, networkTests: false, ignoreKeyHash: true, ...config }, { me, models: tx, tx })
 | 
			
		||||
        await mutation(parent, { walletId, ignoreKeyHash: true, ...config }, { me, models: tx, tx })
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user