diff --git a/packages/app/src/Components/Event/Create/NoteCreator.tsx b/packages/app/src/Components/Event/Create/NoteCreator.tsx index 39e9121f..248299cd 100644 --- a/packages/app/src/Components/Event/Create/NoteCreator.tsx +++ b/packages/app/src/Components/Event/Create/NoteCreator.tsx @@ -2,6 +2,7 @@ import { fetchNip05Pubkey, unixNow } from "@snort/shared"; import { EventBuilder, EventKind, NostrLink, NostrPrefix, TaggedNostrEvent, tryParseNostrLink } from "@snort/system"; import { useUserProfile } from "@snort/system-react"; +import { ZapTarget } from "@snort/wallet"; import { Menu, MenuItem } from "@szhsin/react-menu"; import classNames from "classnames"; import { ClipboardEventHandler, DragEvent, useEffect } from "react"; @@ -29,7 +30,6 @@ import { useNoteCreator } from "@/State/NoteCreator"; import { openFile, trackEvent } from "@/Utils"; import useFileUpload, { addExtensionToNip94Url, nip94TagsToIMeta, readNip94Tags } from "@/Utils/Upload"; import { GetPowWorker } from "@/Utils/wasm"; -import { ZapTarget } from "@/Utils/Zapper"; import { OkResponseRow } from "./OkResponseRow"; diff --git a/packages/app/src/Components/Event/Note/NoteFooter/FooterZapButton.tsx b/packages/app/src/Components/Event/Note/NoteFooter/FooterZapButton.tsx index 99f64730..aefa36f4 100644 --- a/packages/app/src/Components/Event/Note/NoteFooter/FooterZapButton.tsx +++ b/packages/app/src/Components/Event/Note/NoteFooter/FooterZapButton.tsx @@ -1,6 +1,7 @@ import { barrierQueue } from "@snort/shared"; import { NostrLink, ParsedZap, TaggedNostrEvent } from "@snort/system"; import { useUserProfile } from "@snort/system-react"; +import { Zapper, ZapTarget } from "@snort/wallet"; import React, { useEffect, useState } from "react"; import { useIntl } from "react-intl"; import { useLongPress } from "use-long-press"; @@ -13,7 +14,6 @@ import useEventPublisher from "@/Hooks/useEventPublisher"; import useLogin from "@/Hooks/useLogin"; import usePreferences from "@/Hooks/usePreferences"; import { getDisplayName } from "@/Utils"; -import { Zapper, ZapTarget } from "@/Utils/Zapper"; import { ZapPoolController } from "@/Utils/ZapPoolController"; import { useWallet } from "@/Wallet"; @@ -140,13 +140,7 @@ export const FooterZapButton = ({ ev, zaps, onClickZappers }: ZapIconProps) => { {})} /> {showZapModal && ( - setShowZapModal(false)} - note={ev.id} - show={true} - allocatePool={true} - /> + setShowZapModal(false)} show={true} allocatePool={true} /> )} )} diff --git a/packages/app/src/Components/Event/ZapButton.tsx b/packages/app/src/Components/Event/ZapButton.tsx index aa1e8312..b0aa607d 100644 --- a/packages/app/src/Components/Event/ZapButton.tsx +++ b/packages/app/src/Components/Event/ZapButton.tsx @@ -2,11 +2,11 @@ import "./ZapButton.css"; import { HexKey, NostrLink } from "@snort/system"; import { useUserProfile } from "@snort/system-react"; +import { ZapTarget } from "@snort/wallet"; import { useState } from "react"; import Icon from "@/Components/Icons/Icon"; import ZapModal from "@/Components/ZapModal/ZapModal"; -import { ZapTarget } from "@/Utils/Zapper"; const ZapButton = ({ pubkey, diff --git a/packages/app/src/Components/Event/ZapGoal.tsx b/packages/app/src/Components/Event/ZapGoal.tsx index 7269b868..0815d897 100644 --- a/packages/app/src/Components/Event/ZapGoal.tsx +++ b/packages/app/src/Components/Event/ZapGoal.tsx @@ -1,6 +1,7 @@ import "./ZapGoal.css"; import { NostrEvent, NostrLink } from "@snort/system"; +import { Zapper } from "@snort/wallet"; import { useState } from "react"; import { FormattedNumber } from "react-intl"; @@ -10,7 +11,6 @@ import ZapModal from "@/Components/ZapModal/ZapModal"; import useZapsFeed from "@/Feed/ZapsFeed"; import { findTag } from "@/Utils"; import { formatShort } from "@/Utils/Number"; -import { Zapper } from "@/Utils/Zapper"; export function ZapGoal({ ev }: { ev: NostrEvent }) { const [zap, setZap] = useState(false); diff --git a/packages/app/src/Components/ZapModal/ZapModal.tsx b/packages/app/src/Components/ZapModal/ZapModal.tsx index a1a0a4a3..83b06003 100644 --- a/packages/app/src/Components/ZapModal/ZapModal.tsx +++ b/packages/app/src/Components/ZapModal/ZapModal.tsx @@ -1,6 +1,7 @@ import "./ZapModal.css"; import { LNURLSuccessAction } from "@snort/shared"; +import { Zapper, ZapTarget, ZapTargetResult } from "@snort/wallet"; import { ReactNode, useEffect, useState } from "react"; import CloseButton from "@/Components/Button/CloseButton"; @@ -12,7 +13,6 @@ import { ZapModalTitle } from "@/Components/ZapModal/ZapModalTitle"; import { ZapType } from "@/Components/ZapModal/ZapType"; import useEventPublisher from "@/Hooks/useEventPublisher"; import { debounce } from "@/Utils"; -import { Zapper, ZapTarget, ZapTargetResult } from "@/Utils/Zapper"; import { useWallet } from "@/Wallet"; export interface SendSatsProps { diff --git a/packages/app/src/Components/ZapModal/ZapModalInput.tsx b/packages/app/src/Components/ZapModal/ZapModalInput.tsx index 015829ba..fcde6d2a 100644 --- a/packages/app/src/Components/ZapModal/ZapModalInput.tsx +++ b/packages/app/src/Components/ZapModal/ZapModalInput.tsx @@ -1,3 +1,4 @@ +import { Zapper } from "@snort/wallet"; import React, { useEffect, useState } from "react"; import { FormattedMessage, useIntl } from "react-intl"; @@ -9,7 +10,6 @@ import { ZapTypeSelector } from "@/Components/ZapModal/ZapTypeSelector"; import useLogin from "@/Hooks/useLogin"; import usePreferences from "@/Hooks/usePreferences"; import { formatShort } from "@/Utils/Number"; -import { Zapper } from "@/Utils/Zapper"; export interface SendSatsInputSelection { amount: number; diff --git a/packages/app/src/Components/ZapModal/ZapModalInvoice.tsx b/packages/app/src/Components/ZapModal/ZapModalInvoice.tsx index a708ec8a..083791a1 100644 --- a/packages/app/src/Components/ZapModal/ZapModalInvoice.tsx +++ b/packages/app/src/Components/ZapModal/ZapModalInvoice.tsx @@ -1,10 +1,9 @@ -import { LNWallet } from "@snort/wallet"; +import { LNWallet, ZapTargetResult } from "@snort/wallet"; import { ReactNode } from "react"; import { FormattedMessage } from "react-intl"; import Copy from "@/Components/Copy/Copy"; import QrCode from "@/Components/QrCode"; -import { ZapTargetResult } from "@/Utils/Zapper"; export function ZapModalInvoice(props: { invoice: Array; diff --git a/packages/app/src/Components/ZapModal/ZapModalTitle.tsx b/packages/app/src/Components/ZapModal/ZapModalTitle.tsx index 131b77fe..891478ef 100644 --- a/packages/app/src/Components/ZapModal/ZapModalTitle.tsx +++ b/packages/app/src/Components/ZapModal/ZapModalTitle.tsx @@ -1,10 +1,9 @@ -import React from "react"; +import { Zapper, ZapTarget } from "@snort/wallet"; import { FormattedMessage } from "react-intl"; import ProfileImage from "@/Components/User/ProfileImage"; import { SendSatsInputSelection } from "@/Components/ZapModal/ZapModalInput"; import { formatShort } from "@/Utils/Number"; -import { Zapper, ZapTarget } from "@/Utils/Zapper"; export function ZapModalTitle({ targets, diff --git a/packages/app/src/Pages/Profile/AvatarSection.tsx b/packages/app/src/Pages/Profile/AvatarSection.tsx index 6fb0ab78..83f3a082 100644 --- a/packages/app/src/Pages/Profile/AvatarSection.tsx +++ b/packages/app/src/Pages/Profile/AvatarSection.tsx @@ -1,5 +1,6 @@ import { LNURL } from "@snort/shared"; import { CachedMetadata, encodeTLVEntries, NostrLink, NostrPrefix, TLVEntryType } from "@snort/system"; +import { ZapTarget } from "@snort/wallet"; import React, { useMemo, useState } from "react"; import { FormattedMessage, useIntl } from "react-intl"; import { Link, useNavigate } from "react-router-dom"; @@ -19,7 +20,6 @@ import ZapModal from "@/Components/ZapModal/ZapModal"; import useModeration from "@/Hooks/useModeration"; import { hexToBech32 } from "@/Utils"; import { LoginSessionType, LoginStore } from "@/Utils/Login"; -import { ZapTarget } from "@/Utils/Zapper"; const AvatarSection = ({ user, diff --git a/packages/app/src/State/NoteCreator.ts b/packages/app/src/State/NoteCreator.ts index 3a2d1b72..47622445 100644 --- a/packages/app/src/State/NoteCreator.ts +++ b/packages/app/src/State/NoteCreator.ts @@ -1,9 +1,8 @@ import { ExternalStore } from "@snort/shared"; import { NostrEvent, TaggedNostrEvent } from "@snort/system"; +import { ZapTarget } from "@snort/wallet"; import { useSyncExternalStoreWithSelector } from "use-sync-external-store/with-selector"; -import { ZapTarget } from "@/Utils/Zapper"; - interface NoteCreatorDataSnapshot { show: boolean; note: string; diff --git a/packages/system-react/package.json b/packages/system-react/package.json index 8aaff443..557017ef 100644 --- a/packages/system-react/package.json +++ b/packages/system-react/package.json @@ -17,7 +17,7 @@ ], "dependencies": { "@snort/shared": "^1.0.17", - "@snort/system": "^1.5.0", + "@snort/system": "^1.5.1", "react": "^18.2.0" }, "devDependencies": { diff --git a/packages/system/package.json b/packages/system/package.json index cff1c601..3296b9cb 100644 --- a/packages/system/package.json +++ b/packages/system/package.json @@ -1,6 +1,6 @@ { "name": "@snort/system", - "version": "1.5.0", + "version": "1.5.1", "description": "Snort nostr system package", "type": "module", "main": "dist/index.js", diff --git a/packages/system/src/event-publisher.ts b/packages/system/src/event-publisher.ts index 0de5f41b..5cd888e5 100644 --- a/packages/system/src/event-publisher.ts +++ b/packages/system/src/event-publisher.ts @@ -59,7 +59,7 @@ export class EventPublisher { /** * Create an EventPublisher for a private key */ - static privateKey(privateKey: string) { + static privateKey(privateKey: string | Uint8Array) { const signer = new PrivateKeySigner(privateKey); return new EventPublisher(signer, signer.getPubKey()); } diff --git a/packages/wallet/package.json b/packages/wallet/package.json index 84814ba1..e2265cb0 100644 --- a/packages/wallet/package.json +++ b/packages/wallet/package.json @@ -1,6 +1,6 @@ { "name": "@snort/wallet", - "version": "0.1.8", + "version": "0.2.0", "description": "Snort wallet system package", "type": "module", "main": "dist/index.js", @@ -23,7 +23,7 @@ "@lightninglabs/lnc-web": "^0.3.1-alpha", "@scure/base": "^1.1.6", "@snort/shared": "^1.0.17", - "@snort/system": "^1.5.0", + "@snort/system": "^1.5.1", "debug": "^4.3.4", "eventemitter3": "^5.0.1" }, diff --git a/packages/wallet/src/index.ts b/packages/wallet/src/index.ts index c5b3e903..44bfc883 100644 --- a/packages/wallet/src/index.ts +++ b/packages/wallet/src/index.ts @@ -7,6 +7,8 @@ import { NostrConnectWallet } from "./NostrWalletConnect"; import { WebLNWallet } from "./WebLN"; import EventEmitter from "eventemitter3"; +export * from "./zapper"; + export const enum WalletKind { LNDHub = 1, LNC = 2, diff --git a/packages/app/src/Utils/Zapper.ts b/packages/wallet/src/zapper.ts similarity index 95% rename from packages/app/src/Utils/Zapper.ts rename to packages/wallet/src/zapper.ts index 6256908d..68583423 100644 --- a/packages/app/src/Utils/Zapper.ts +++ b/packages/wallet/src/zapper.ts @@ -1,8 +1,6 @@ import { isHex, LNURL } from "@snort/shared"; import { EventPublisher, NostrEvent, NostrLink, SystemInterface } from "@snort/system"; -import { LNWallet, WalletInvoiceState } from "@snort/wallet"; - -import { generateRandomKey } from "@/Utils/Login"; +import { LNWallet, WalletInvoiceState } from "."; export interface ZapTarget { type: "lnurl" | "pubkey"; @@ -105,7 +103,12 @@ export class Zapper { throw new Error(`Failed to get invoice from ${t.value}`); } const relays = [...this.system.pool].filter(([, v]) => !v.ephemeral).map(([k]) => k); - const pub = t.zap?.anon ?? false ? EventPublisher.privateKey(generateRandomKey().privateKey) : this.publisher; + let pub = this.publisher; + if (t.zap?.anon ?? false) { + const newKey = new Uint8Array(32); + crypto.getRandomValues(newKey); + pub = EventPublisher.privateKey(newKey); + } const zap = t.zap && svc.canZap ? await pub?.zap(toSend * 1000, t.zap.pubkey, relays, t.zap?.event, t.memo, eb => {