feat: Add zap command for sending Bitcoin Lightning tips

- Implemented the `zap` command in the CLI to allow users to send sats to a user, event, or snippet using a NIP-60 wallet.
- Created a new `zap.ts` file to handle the command logic and integrated it into the MCP server.
- Added wallet balance command to check the balance of a user's wallet.
- Enhanced the MCP server to register the new zap command and wallet balance command.
- Introduced caching for wallets to optimize performance and reduce redundant network requests.
- Updated database schema to include snippets table for storing code snippets.
- Improved logging functionality for better debugging and tracking of operations.
- Added functionality to save snippets to the database upon retrieval.
- Updated project overview documentation to reflect new features and structure.
- Refactored existing commands and logic for better modularity and maintainability.
This commit is contained in:
pablof7z
2025-04-08 18:10:16 +01:00
parent f74736191a
commit 10fbca0824
19 changed files with 723 additions and 35 deletions

View File

@@ -1,9 +1,12 @@
import NDK, { NDKPrivateKeySigner, NDKUser, NDKEvent } from "@nostr-dev-kit/ndk";
import { NDKCashuWallet } from "@nostr-dev-kit/ndk-wallet";
import { NDKCashuMintList } from "@nostr-dev-kit/ndk";
import { getWallet } from "../lib/cache/wallets.js";
import { z } from "zod";
import { getUser, saveUser } from "../config.js";
import { log } from "../lib/utils/log.js";
import { ndk } from "../ndk.js";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
export async function createPubkey({
username,
@@ -44,6 +47,27 @@ export async function createPubkey({
// Publish the event
await event.publish();
// --- Setup Cashu Wallet (NIP-60/NIP-61) ---
log(`Setting up Cashu wallet for ${username}...`);
try {
// Use getWallet to retrieve or create a wallet for the new pubkey
const wallet = await getWallet(signer.pubkey);
if (wallet) {
log(`Cashu wallet setup complete for ${username}.`);
log(` -> P2PK: ${wallet.p2pk}`);
log(` -> Mints: ${wallet.mints.join(', ')}`);
} else {
throw new Error("Failed to create wallet");
}
} catch (walletError) {
console.error(`Failed to set up Cashu wallet for ${username}:`, walletError);
// Decide if this should be a fatal error for pubkey creation
// For now, log the error and continue
}
// --- End Cashu Wallet Setup ---
// Save the user to the config
saveUser(username, {
nsec: signer.privateKey,
@@ -59,7 +83,7 @@ export async function createPubkey({
return {
user,
message: `Created pubkey for ${username} with npub ${user.npub}`,
message: `Created pubkey for ${username} with npub ${user.npub} and a NIP-60 Cashu wallet for nutzaps`,
};
} catch (error: unknown) {
const errorMessage =