@nostr-dev-kit/ndk
Version:
NDK - Nostr Development Kit
85 lines (70 loc) • 2.27 kB
text/typescript
import { bech32 } from "@scure/base";
import createDebug from "debug";
import type { NDK } from "../ndk";
import type { Hexpubkey } from "../user";
const d = createDebug("ndk:zapper:ln");
export type NDKZapConfirmationLN = {
preimage: string;
};
export type NDKPaymentConfirmationLN = {
preimage: string;
};
export type LNPaymentRequest = string;
export type LnPaymentInfo = {
pr: LNPaymentRequest;
};
export type NDKLUD18ServicePayerData = Partial<{
name: { mandatory: boolean };
pubkey: { mandatory: boolean };
identifier: { mandatory: boolean };
email: { mandatory: boolean };
auth: {
mandatory: boolean;
k1: string;
};
}> &
Record<string, unknown>;
export type NDKLnUrlData = {
tag: string;
callback: string;
minSendable: number;
maxSendable: number;
metadata: string;
payerData?: NDKLUD18ServicePayerData;
commentAllowed?: number;
/**
* Pubkey of the zapper that should publish zap receipts for this user
*/
nostrPubkey?: Hexpubkey;
allowsNostr?: boolean;
};
export async function getNip57ZapSpecFromLud(
{ lud06, lud16 }: { lud06?: string; lud16?: string },
ndk: NDK
): Promise<NDKLnUrlData | undefined> {
let zapEndpoint: string | undefined;
if (lud16 && !lud16.startsWith("LNURL")) {
const [name, domain] = lud16.split("@");
zapEndpoint = `https://${domain}/.well-known/lnurlp/${name}`;
} else if (lud06) {
const { words } = bech32.decode(lud06 as `${string}1${string}`, 1000);
const data = bech32.fromWords(words);
const utf8Decoder = new TextDecoder("utf-8");
zapEndpoint = utf8Decoder.decode(data);
}
if (!zapEndpoint) {
d("No zap endpoint found %o", { lud06, lud16 });
throw new Error("No zap endpoint found");
}
try {
const _fetch = ndk.httpFetch || fetch;
const response = await _fetch(zapEndpoint);
if (response.status !== 200) {
const text = await response.text();
throw new Error(`Unable to fetch zap endpoint ${zapEndpoint}: ${text}`);
}
return await response.json();
} catch (e) {
throw new Error(`Unable to fetch zap endpoint ${zapEndpoint}: ${e}`);
}
}