diff --git a/wallets/README.md b/wallets/README.md index aee02959..bb45e5d0 100644 --- a/wallets/README.md +++ b/wallets/README.md @@ -62,7 +62,9 @@ That's it! ## How to add a new protocol -**1. Update prisma.schema** +### 1. Update db schema + +**1.1 Update prisma.schema** - add enum value to `WalletProtocolName` enum - add enum value to `WalletRecvProtocolName` or `WalletSendProtocolName` @@ -70,169 +72,195 @@ That's it! - run `npx prisma migrate dev --create-only` - **for send protocols, it is important that the names for encrypted columns end with `vaultId`** -
-Example +**1.2 Update migration file** -```diff -diff --git a/prisma/schema.prisma b/prisma/schema.prisma -index 9a113797..12505333 100644 ---- a/prisma/schema.prisma -+++ b/prisma/schema.prisma -@@ -1199,6 +1199,7 @@ enum WalletProtocolName { - LNC - CLN_REST - LND_GRPC -+ BOLT12 - } - - enum WalletSendProtocolName { -@@ -1218,6 +1219,7 @@ enum WalletRecvProtocolName { - LN_ADDR - CLN_REST - LND_GRPC -+ BOLT12 - } - - enum WalletProtocolStatus { -@@ -1288,6 +1290,7 @@ model WalletProtocol { - walletRecvLightningAddress WalletRecvLightningAddress? - walletRecvCLNRest WalletRecvCLNRest? - walletRecvLNDGRPC WalletRecvLNDGRPC? -+ walletRecvBolt12 WalletRecvBolt12? - - @@unique(name: "WalletProtocol_walletId_send_name_key", [walletId, send, name]) - } -@@ -1429,3 +1432,12 @@ model WalletRecvLNDGRPC { - macaroon String - cert String? - } -+ -+model WalletRecvBolt12 { -+ id Int @id @default(autoincrement()) -+ createdAt DateTime @default(now()) @map("created_at") -+ updatedAt DateTime @default(now()) @updatedAt @map("updated_at") -+ protocolId Int @unique -+ protocol WalletProtocol @relation(fields: [protocolId], references: [id], onDelete: Cascade) -+ offer String -+} -``` - -
- -
- -**2. Update migration file** - -- add required triggers (`wallet_to_jsonb` and `wallet_clear_vault` if send protocol) to migration file +- add `COMMIT` after statements to add enum values +- add required triggers: `wallet_to_jsonb` and if send protocol, also `wallet_clear_vault` - run `npx prisma migrate dev`
Example -```sql --- AlterEnum -ALTER TYPE "WalletProtocolName" ADD VALUE 'BOLT12'; +```diff +commit 0834650e84e3c0ba86f881f0f3643e87b26108e7 +Author: ekzyis +Date: Tue Sep 23 07:24:37 2025 +0200 --- AlterEnum -ALTER TYPE "WalletRecvProtocolName" ADD VALUE 'BOLT12'; + DB schema for Spark --- CreateTable -CREATE TABLE "WalletRecvBolt12" ( - "id" SERIAL NOT NULL, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "protocolId" INTEGER NOT NULL, - "offer" TEXT NOT NULL, +diff --git a/prisma/migrations/20250923052230_spark/migration.sql b/prisma/migrations/20250923052230_spark/migration.sql +new file mode 100644 +index 00000000..04ff1847 +--- /dev/null ++++ b/prisma/migrations/20250923052230_spark/migration.sql +@@ -0,0 +1,64 @@ ++-- AlterEnum ++ALTER TYPE "WalletName" ADD VALUE 'SPARK'; COMMIT; ++ ++-- AlterEnum ++ALTER TYPE "WalletProtocolName" ADD VALUE 'SPARK'; COMMIT; ++ ++-- AlterEnum ++ALTER TYPE "WalletRecvProtocolName" ADD VALUE 'SPARK'; COMMIT; ++ ++-- AlterEnum ++ALTER TYPE "WalletSendProtocolName" ADD VALUE 'SPARK'; COMMIT; ++ ++INSERT INTO "WalletTemplate" ("name", "sendProtocols", "recvProtocols") ++VALUES ('SPARK', '{SPARK}', '{SPARK}'); ++ ++-- CreateTable ++CREATE TABLE "WalletSendSpark" ( ++ "id" SERIAL NOT NULL, ++ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, ++ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, ++ "protocolId" INTEGER NOT NULL, ++ "mnemonicVaultId" INTEGER NOT NULL, ++ ++ CONSTRAINT "WalletSendSpark_pkey" PRIMARY KEY ("id") ++); ++ ++-- CreateTable ++CREATE TABLE "WalletRecvSpark" ( ++ "id" SERIAL NOT NULL, ++ "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, ++ "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, ++ "protocolId" INTEGER NOT NULL, ++ "address" TEXT NOT NULL, ++ ++ CONSTRAINT "WalletRecvSpark_pkey" PRIMARY KEY ("id") ++); ++ ++-- CreateIndex ++CREATE UNIQUE INDEX "WalletSendSpark_protocolId_key" ON "WalletSendSpark"("protocolId"); ++ ++-- CreateIndex ++CREATE UNIQUE INDEX "WalletSendSpark_mnemonicVaultId_key" ON "WalletSendSpark"("mnemonicVaultId"); ++ ++-- CreateIndex ++CREATE UNIQUE INDEX "WalletRecvSpark_protocolId_key" ON "WalletRecvSpark"("protocolId"); ++ ++-- AddForeignKey ++ALTER TABLE "WalletSendSpark" ADD CONSTRAINT "WalletSendSpark_protocolId_fkey" FOREIGN KEY ("protocolId") REFERENCES "WalletProtocol"("id") ON DELETE CASCADE ON UPDATE CASCADE; ++ ++-- AddForeignKey ++ALTER TABLE "WalletSendSpark" ADD CONSTRAINT "WalletSendSpark_mnemonicVaultId_fkey" FOREIGN KEY ("mnemonicVaultId") REFERENCES "Vault"("id") ON DELETE RESTRICT ON UPDATE CASCADE; ++ ++-- AddForeignKey ++ALTER TABLE "WalletRecvSpark" ADD CONSTRAINT "WalletRecvSpark_protocolId_fkey" FOREIGN KEY ("protocolId") REFERENCES "WalletProtocol"("id") ON DELETE CASCADE ON UPDATE CASCADE; ++ ++CREATE TRIGGER wallet_to_jsonb ++ AFTER INSERT OR UPDATE ON "WalletSendSpark" ++ FOR EACH ROW ++ EXECUTE PROCEDURE wallet_to_jsonb(); ++ ++CREATE TRIGGER wallet_clear_vault ++ AFTER DELETE ON "WalletSendSpark" ++ FOR EACH ROW ++ EXECUTE PROCEDURE wallet_clear_vault(); +diff --git a/prisma/schema.prisma b/prisma/schema.prisma +index 4f3cb9e2..c25c0fc8 100644 +--- a/prisma/schema.prisma ++++ b/prisma/schema.prisma +@@ -221,6 +221,7 @@ model Vault { + walletSendLNCRemoteKey WalletSendLNC? @relation("lncRemoteKey") + walletSendLNCServerHost WalletSendLNC? @relation("lncServerHost") + walletSendCLNRestRune WalletSendCLNRest? @relation("clnRune") ++ walletSendSparkMnemonic WalletSendSpark? @relation("sparkMnemonic") + } - CONSTRAINT "WalletRecvBolt12_pkey" PRIMARY KEY ("id") -); + model WalletLog { +@@ -1214,6 +1215,7 @@ enum WalletProtocolName { + CLN_REST + LND_GRPC + CLINK ++ SPARK + } --- CreateIndex -CREATE UNIQUE INDEX "WalletRecvBolt12_protocolId_key" ON "WalletRecvBolt12"("protocolId"); + enum WalletSendProtocolName { +@@ -1224,6 +1226,7 @@ enum WalletSendProtocolName { + WEBLN + LNC + CLN_REST ++ SPARK + } --- AddForeignKey -ALTER TABLE "WalletRecvBolt12" ADD CONSTRAINT "WalletRecvBolt12_protocolId_fkey" FOREIGN KEY ("protocolId") REFERENCES "WalletProtocol"("id") ON DELETE CASCADE ON UPDATE CASCADE; + enum WalletRecvProtocolName { +@@ -1235,6 +1238,7 @@ enum WalletRecvProtocolName { + CLN_REST + LND_GRPC + CLINK ++ SPARK + } --- vvv Add trigger below manually vvv + enum WalletProtocolStatus { +@@ -1270,6 +1274,7 @@ enum WalletName { + LN_ADDR + CASH_APP + BLITZ ++ SPARK + } -CREATE TRIGGER wallet_to_jsonb - AFTER INSERT OR UPDATE ON "WalletRecvBolt12" - FOR EACH ROW - EXECUTE PROCEDURE wallet_to_jsonb(); + model WalletTemplate { +@@ -1327,6 +1332,7 @@ model WalletProtocol { + walletSendWebLN WalletSendWebLN? + walletSendLNC WalletSendLNC? + walletSendCLNRest WalletSendCLNRest? ++ walletSendSpark WalletSendSpark? + walletRecvNWC WalletRecvNWC? + walletRecvLNbits WalletRecvLNbits? +@@ -1336,6 +1342,7 @@ model WalletProtocol { + walletRecvCLNRest WalletRecvCLNRest? + walletRecvLNDGRPC WalletRecvLNDGRPC? + walletRecvClink WalletRecvClink? ++ walletRecvSpark WalletRecvSpark? --- if protocol is for sending you also need to add the wallet_clear_vault trigger: --- CREATE TRIGGER wallet_clear_vault --- AFTER DELETE ON "WalletSendClinkDebit" --- FOR EACH ROW --- EXECUTE PROCEDURE wallet_clear_vault(); + @@unique(name: "WalletProtocol_walletId_send_name_key", [walletId, send, name]) + @@index([walletId]) +@@ -1420,6 +1427,16 @@ model WalletSendCLNRest { + rune Vault? @relation("clnRune", fields: [runeVaultId], references: [id]) + } + ++model WalletSendSpark { ++ id Int @id @default(autoincrement()) ++ createdAt DateTime @default(now()) @map("created_at") ++ updatedAt DateTime @default(now()) @updatedAt @map("updated_at") ++ protocolId Int @unique ++ protocol WalletProtocol @relation(fields: [protocolId], references: [id], onDelete: Cascade) ++ mnemonicVaultId Int @unique ++ mnemonic Vault? @relation("sparkMnemonic", fields: [mnemonicVaultId], references: [id]) ++} ++ + model WalletRecvNWC { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) @map("created_at") +@@ -1498,3 +1515,12 @@ model WalletRecvClink { + protocol WalletProtocol @relation(fields: [protocolId], references: [id], onDelete: Cascade) + noffer String + } ++ ++model WalletRecvSpark { ++ id Int @id @default(autoincrement()) ++ createdAt DateTime @default(now()) @map("created_at") ++ updatedAt DateTime @default(now()) @updatedAt @map("updated_at") ++ protocolId Int @unique ++ protocol WalletProtocol @relation(fields: [protocolId], references: [id], onDelete: Cascade) ++ address String ++} ```
-
+### 2. Update JS code -**3. Add protocol lib file** +**2.1 Add protocol lib file** - add file to [wallets/lib/protocols](/wallets/lib/protocols) (see [JSDoc](/wallets/lib/protocols/index.js) for details) - import in index.js file and add to default export -
-Example - -```js -// wallets/lib/protocols/bolt12.js - -export default [ - { - // same as enum value we added - name: 'BOLT12', - displayName: 'BOLT12', - send: false, - fields: [ - { - name: 'offer', - type: 'text', - label: 'offer', - placeholder: 'lno...', - validate: offerValidator, - required: true, - } - ], - relationName: 'walletRecvBolt12' - } -] -``` - -```diff -diff --git a/wallets/lib/protocols/index.js b/wallets/lib/protocols/index.js -index 8caa5f52..58f5ab86 100644 ---- a/wallets/lib/protocols/index.js -+++ b/wallets/lib/protocols/index.js -@@ -7,6 +7,7 @@ import lnbitsSuite from './lnbits' - import phoenixdSuite from './phoenixd' - import blinkSuite from './blink' - import webln from './webln' -+import bolt12 from './bolt12' - - /** - * Protocol names as used in the database -@@ -44,5 +45,6 @@ export default [ - ...phoenixdSuite, - ...lnbitsSuite, - ...blinkSuite, -- webln -+ webln, -+ bolt12 - ] -``` - -
- -
- -**4. Add protocol method file** +**2.2 Add protocol method file** - if protocol to receive payments: Add file to [wallets/server/protocols](/wallets/server/protocols) (see [JSDoc](/wallets/server/protocols/index.js) for details) - if protocol to send payments: Add file to [wallets/client/protocols](/wallets/client/protocols) (see [JSDoc](/wallets/client/protocols/index.js) for details) @@ -241,53 +269,173 @@ index 8caa5f52..58f5ab86 100644
Example -```js -// wallets/server/protocols/bolt12.js - -// same as enum value we added -export const name = 'BOLT12' - -export async function createInvoice ({ msats, description, expiry }, config, { signal }) { - /* ... code to create invoice using protocol config ... */ -} - -export async function testCreateInvoice ({ url }, { signal }) { - return await createInvoice( - { msats: 1000, description: 'SN test invoice', expiry: 1 }, - { url }, - { signal } - ) -} -``` - ```diff -diff --git a/wallets/server/protocols/index.js b/wallets/server/protocols/index.js -index 26c292d9..3ac88ae1 100644 ---- a/wallets/server/protocols/index.js -+++ b/wallets/server/protocols/index.js -@@ -5,6 +5,7 @@ import * as clnRest from './clnRest' - import * as phoenixd from './phoenixd' - import * as blink from './blink' - import * as lndGrpc from './lndGrpc' -+import * as bolt12 from './bolt12' +commit 4fd125fcad91dc5bee31f076785c0b97337311a8 +Author: ekzyis +Date: Tue Sep 23 07:41:47 2025 +0200 + + JS code for Spark + +diff --git a/wallets/client/protocols/index.js b/wallets/client/protocols/index.js +index c25805f7..3d6b00f6 100644 +--- a/wallets/client/protocols/index.js ++++ b/wallets/client/protocols/index.js +@@ -5,6 +5,7 @@ import * as blink from './blink' + import * as webln from './webln' + import * as lnc from './lnc' + import * as clnRest from './clnRest' ++import * as spark from './spark' export * from './util' -@@ -56,5 +57,6 @@ export default [ - clnRest, +@@ -54,5 +55,6 @@ export default [ + blink, + webln, + lnc, +- clnRest ++ clnRest, ++ spark + ] +diff --git a/wallets/client/protocols/spark.js b/wallets/client/protocols/spark.js +new file mode 100644 +index 00000000..ef3209e6 +--- /dev/null ++++ b/wallets/client/protocols/spark.js +@@ -0,0 +1,7 @@ ++export const name = 'SPARK' ++ ++export async function sendPayment (bolt11, { mnemonic }, { signal }) { ++ // TODO: implement ++} ++ ++export async function testSendPayment (config, { signal }) {} +diff --git a/wallets/lib/protocols/index.js b/wallets/lib/protocols/index.js +index 5a944124..633659c5 100644 +--- a/wallets/lib/protocols/index.js ++++ b/wallets/lib/protocols/index.js +@@ -8,6 +8,7 @@ import phoenixdSuite from './phoenixd' + import blinkSuite from './blink' + import webln from './webln' + import clink from './clink' ++import sparkSuite from './spark' + + /** + * Protocol names as used in the database +@@ -47,5 +48,6 @@ export default [ + ...lnbitsSuite, + ...blinkSuite, + webln, +- clink ++ clink, ++ ...sparkSuite + ] +diff --git a/wallets/lib/protocols/spark.js b/wallets/lib/protocols/spark.js +new file mode 100644 +index 00000000..b1b05608 +--- /dev/null ++++ b/wallets/lib/protocols/spark.js +@@ -0,0 +1,41 @@ ++import { bip39Validator, externalLightningAddressValidator } from '@/wallets/lib/validate' ++ ++// Spark ++// https://github.com/breez/spark-sdk ++// https://sdk-doc-spark.breez.technology/ ++ ++export default [ ++ { ++ name: 'SPARK', ++ send: true, ++ displayName: 'Spark', ++ fields: [ ++ { ++ name: 'mnemonic', ++ label: 'mnemonic', ++ type: 'password', ++ required: true, ++ validate: bip39Validator(), ++ encrypt: true ++ } ++ ], ++ relationName: 'walletSendSpark' ++ }, ++ { ++ name: 'SPARK', ++ send: false, ++ displayName: 'Spark', ++ fields: [ ++ { ++ name: 'address', ++ label: 'address', ++ type: 'text', ++ required: true, ++ validate: externalLightningAddressValidator ++ } ++ ], ++ relationName: 'walletRecvSpark' ++ } ++] +diff --git a/wallets/lib/wallets.json b/wallets/lib/wallets.json +index 1975a9d2..98fe5bf8 100644 +--- a/wallets/lib/wallets.json ++++ b/wallets/lib/wallets.json +@@ -168,5 +168,9 @@ + "displayName": "Blitz Wallet", + "image": "/wallets/blitz.png", + "url": "https://blitz-wallet.com/" ++ }, ++ { ++ "name": "SPARK", ++ "displayName": "Spark" + } + ] +diff --git a/wallets/server/protocols/index.js b/wallets/server/protocols/index.js +index 6bf8ca04..6151e217 100644 +--- a/wallets/server/protocols/index.js ++++ b/wallets/server/protocols/index.js +@@ -6,6 +6,7 @@ import * as phoenixd from './phoenixd' + import * as blink from './blink' + import * as lndGrpc from './lndGrpc' + import * as clink from './clink' ++import * as spark from './spark' + + export * from './util' + +@@ -58,5 +59,6 @@ export default [ phoenixd, blink, -- lndGrpc -+ lndGrpc, -+ bolt12 + lndGrpc, +- clink ++ clink, ++ spark ] +diff --git a/wallets/server/protocols/spark.js b/wallets/server/protocols/spark.js +new file mode 100644 +index 00000000..abc610ac +--- /dev/null ++++ b/wallets/server/protocols/spark.js +@@ -0,0 +1,16 @@ ++export const name = 'SPARK' ++ ++export async function createInvoice ( ++ { msats, description, descriptionHash, expiry }, ++ { address }, ++ { signal } ++) { ++ // TODO: implement ++} ++ ++export async function testCreateInvoice ({ address }, { signal }) { ++ return await createInvoice( ++ { msats: 1000, description: 'SN test invoice', expiry: 1 }, ++ { address }, ++ { signal }) ++} + ```
-
- -**5. Update GraphQL code** +### 3. Update GraphQL code - add GraphQL type - add GraphQL type to `WalletProtocolConfig` union @@ -299,82 +447,221 @@ index 26c292d9..3ac88ae1 100644 Example ```diff +commit 72c9d3a46928775d66ac93ed1e66294f435bbcb7 +Author: ekzyis +Date: Tue Sep 23 07:55:17 2025 +0200 + + GraphQL code for Spark + diff --git a/api/typeDefs/wallet.js b/api/typeDefs/wallet.js -index 3c1fffd1..af3858a5 100644 +index 6284b821..7420ec15 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!, 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!, offer: String!): WalletRecvBolt12! - removeWalletProtocol(id: ID!): Boolean - updateWalletEncryption(keyHash: String!, wallets: [WalletEncryptionUpdate!]!): Boolean - updateKeyHash(keyHash: String!): Boolean -@@ -111,6 +112,7 @@ const typeDefs = gql` - | WalletRecvLightningAddress +@@ -108,6 +108,16 @@ const typeDefs = gql` + ${shared} + ): WalletSendWebLN! + ++ upsertWalletSendSpark( ++ ${shared}, ++ mnemonic: VaultEntryInput! ++ ): WalletSendSpark! ++ ++ upsertWalletRecvSpark( ++ ${shared}, ++ address: String! ++ ): WalletRecvSpark! ++ + upsertWalletRecvClink( + ${shared}, + noffer: String! +@@ -153,6 +163,10 @@ const typeDefs = gql` + noffer: String! + ): Boolean! + ++ testWalletRecvSpark( ++ address: String! ++ ): Boolean! ++ + # delete + deleteWallet(id: ID!): Boolean + +@@ -228,6 +242,7 @@ const typeDefs = gql` + | WalletSendWebLN + | WalletSendLNC + | WalletSendCLNRest ++ | WalletSendSpark + | WalletRecvNWC + | WalletRecvLNbits + | WalletRecvPhoenixd +@@ -236,6 +251,7 @@ const typeDefs = gql` | WalletRecvCLNRest | WalletRecvLNDGRPC -+ | WalletRecvBolt12 + | WalletRecvClink ++ | WalletRecvSpark type WalletSettings { receiveCreditsBelowSats: Int! -@@ -207,6 +209,11 @@ const typeDefs = gql` - cert: String +@@ -296,6 +312,11 @@ const typeDefs = gql` + rune: VaultEntry! } -+ type WalletRecvBolt12 { ++ type WalletSendSpark { + id: ID! -+ offer: String! ++ mnemonic: VaultEntry! ++ } ++ + type WalletRecvNWC { + id: ID! + url: String! +@@ -343,6 +364,11 @@ const typeDefs = gql` + noffer: String! + } + ++ type WalletRecvSpark { ++ id: ID! ++ address: String! + } + input AutowithdrawSettings { autoWithdrawThreshold: Int! autoWithdrawMaxFeePercent: Float! diff --git a/wallets/client/fragments/protocol.js b/wallets/client/fragments/protocol.js -index d1a65ff4..138d1a62 100644 +index 8b132e82..38586def 100644 --- a/wallets/client/fragments/protocol.js +++ b/wallets/client/fragments/protocol.js -@@ -109,3 +109,11 @@ export const UPSERT_WALLET_SEND_WEBLN = gql` - } +@@ -249,6 +249,34 @@ export const UPSERT_WALLET_RECEIVE_CLINK = gql` } ` -+ -+export const UPSERT_WALLET_RECEIVE_BOLT12 = gql` -+ mutation upsertWalletRecvBolt12($walletId: ID, $templateId: ID, $enabled: Boolean!, $offer: String!) { -+ upsertWalletRecvBolt12(walletId: $walletId, templateId: $templateId, enabled: $enabled, offer: $offer) { + ++export const UPSERT_WALLET_SEND_SPARK = gql` ++ mutation upsertWalletSendSpark( ++ ${shared.variables}, ++ $mnemonic: VaultEntryInput! ++ ) { ++ upsertWalletSendSpark( ++ ${shared.arguments}, ++ mnemonic: $mnemonic ++ ) { + id + } + } +` ++ ++export const UPSERT_WALLET_RECEIVE_SPARK = gql` ++ mutation upsertWalletRecvSpark( ++ ${shared.variables}, ++ $address: String! ++ ) { ++ upsertWalletRecvSpark( ++ ${shared.arguments}, ++ address: $address ++ ) { ++ id ++ } ++ } ++` ++ + // tests + + export const TEST_WALLET_RECEIVE_NWC = gql` +@@ -298,3 +326,9 @@ export const TEST_WALLET_RECEIVE_CLINK = gql` + testWalletRecvClink(noffer: $noffer) + } + ` ++ ++export const TEST_WALLET_RECEIVE_SPARK = gql` ++ mutation testWalletRecvSpark($address: String!) { ++ testWalletRecvSpark(address: $address) ++ } ++` diff --git a/wallets/client/fragments/wallet.js b/wallets/client/fragments/wallet.js -index c301f5c1..73d59e6d 100644 +index 6d8676cc..b646c890 100644 --- a/wallets/client/fragments/wallet.js +++ b/wallets/client/fragments/wallet.js -@@ -106,6 +106,10 @@ const WALLET_PROTOCOL_FIELDS = gql` - macaroon - cert +@@ -78,6 +78,12 @@ const WALLET_PROTOCOL_FIELDS = gql` + ...VaultEntryFields + } } -+ ... on WalletRecvBolt12 { ++ ... on WalletSendSpark { + id -+ offer ++ encryptedMnemonic: mnemonic { ++ ...VaultEntryFields ++ } ++ } + ... on WalletRecvNWC { + id + url +@@ -117,6 +123,10 @@ const WALLET_PROTOCOL_FIELDS = gql` + id + noffer + } ++ ... on WalletRecvSpark { ++ id ++ address + } } } ` +diff --git a/wallets/client/hooks/query.js b/wallets/client/hooks/query.js +index 51cf44b0..37169a69 100644 +--- a/wallets/client/hooks/query.js ++++ b/wallets/client/hooks/query.js +@@ -13,6 +13,7 @@ import { + UPSERT_WALLET_RECEIVE_NWC, + UPSERT_WALLET_RECEIVE_PHOENIXD, + UPSERT_WALLET_RECEIVE_CLINK, ++ UPSERT_WALLET_RECEIVE_SPARK, + UPSERT_WALLET_SEND_BLINK, + UPSERT_WALLET_SEND_LNBITS, + UPSERT_WALLET_SEND_LNC, +@@ -20,6 +21,7 @@ import { + UPSERT_WALLET_SEND_PHOENIXD, + UPSERT_WALLET_SEND_WEBLN, + UPSERT_WALLET_SEND_CLN_REST, ++ UPSERT_WALLET_SEND_SPARK, + WALLETS, + UPDATE_WALLET_ENCRYPTION, + RESET_WALLETS, +@@ -34,6 +36,7 @@ import { + TEST_WALLET_RECEIVE_CLN_REST, + TEST_WALLET_RECEIVE_LND_GRPC, + TEST_WALLET_RECEIVE_CLINK, ++ TEST_WALLET_RECEIVE_SPARK, + DELETE_WALLET + } from '@/wallets/client/fragments' + import { gql, useApolloClient, useMutation, useQuery } from '@apollo/client' +@@ -320,6 +323,8 @@ function protocolUpsertMutation (protocol) { + return protocol.send ? UPSERT_WALLET_SEND_WEBLN : NOOP_MUTATION + case 'CLINK': + return protocol.send ? NOOP_MUTATION : UPSERT_WALLET_RECEIVE_CLINK ++ case 'SPARK': ++ return protocol.send ? UPSERT_WALLET_SEND_SPARK : UPSERT_WALLET_RECEIVE_SPARK + default: + return NOOP_MUTATION + } +@@ -345,6 +350,8 @@ function protocolTestMutation (protocol) { + return TEST_WALLET_RECEIVE_LND_GRPC + case 'CLINK': + return TEST_WALLET_RECEIVE_CLINK ++ case 'SPARK': ++ return TEST_WALLET_RECEIVE_SPARK + default: + return NOOP_MUTATION + } diff --git a/wallets/server/resolvers/util.js b/wallets/server/resolvers/util.js -index 0155a422..ced4b399 100644 +index e11ee3e1..6d3741bc 100644 --- a/wallets/server/resolvers/util.js +++ b/wallets/server/resolvers/util.js -@@ -19,6 +19,8 @@ export function mapWalletResolveTypes (wallet) { - return 'WalletRecvCLNRest' - case 'LND_GRPC': +@@ -21,6 +21,8 @@ export function mapWalletResolveTypes (wallet) { return 'WalletRecvLNDGRPC' -+ case 'BOLT12': -+ return 'WalletRecvBolt12' + case 'CLINK': + return 'WalletRecvClink' ++ case 'SPARK': ++ return send ? 'WalletSendSpark' : 'WalletRecvSpark' default: return null } + ```