Handle string zap platform fee inputs

This commit is contained in:
thePR0M3TH3AN committed 2025-10-05 21:48:39 -04:00
1 parent d84dbe5fae
commit c0ffde6462
2 files changed
+90 -2

No files matched your search

+53 -2
View File
@@ -23,8 +23,57 @@ const DEFAULT_DEPS = Object.freeze({
platformAddress: Object.freeze({ getPlatformLightningAddress }),
});
function parsePercentValue(value) {
if (typeof value === "number") {
return Number.isFinite(value) ? value : NaN;
}
if (typeof value === "bigint") {
return Number(value);
}
if (typeof value === "string") {
const trimmed = value.trim();
if (!trimmed) {
return NaN;
}
if (trimmed.includes("/")) {
const [firstRaw, secondRaw] = trimmed.split("/").map((part) => part.trim());
if (firstRaw && secondRaw) {
const first = Number(firstRaw);
const second = Number(secondRaw);
if (Number.isFinite(first) && Number.isFinite(second) && first >= 0 && second >= 0) {
const total = first + second;
if (total > 0) {
return (second / total) * 100;
}
}
}
}
const percentStripped = trimmed.endsWith("%")
? trimmed.slice(0, -1).trim()
: trimmed;
const directNumeric = Number(percentStripped);
if (Number.isFinite(directNumeric)) {
return directNumeric;
}
const match = percentStripped.match(/-?\d+(?:\.\d+)?/);
if (match) {
const fallback = Number(match[0]);
return Number.isFinite(fallback) ? fallback : NaN;
}
return NaN;
}
return Number.isFinite(value) ? Number(value) : NaN;
}
function getOverridePlatformFee() {
const override = globalThis?.__BITVID_PLATFORM_FEE_OVERRIDE__;
const override = parsePercentValue(globalThis?.__BITVID_PLATFORM_FEE_OVERRIDE__);
if (Number.isFinite(override)) {
return override;
}
@@ -32,7 +81,7 @@ function getOverridePlatformFee() {
}
function clampPercent(value) {
const numeric = Number(value);
const numeric = parsePercentValue(value);
if (!Number.isFinite(numeric)) {
return 0;
}
@@ -341,4 +390,6 @@ export const __TESTING__ = Object.freeze({
determineRecipientPubkey,
derivePointerTag,
mergeDependencies,
parsePercentValue,
clampPercent,
});
+37
View File
@@ -180,6 +180,42 @@ async function testSplitMath() {
delete globalThis.__BITVID_PLATFORM_FEE_OVERRIDE__;
}
async function testStringFeeOverride() {
const videoEvent = {
id: "event-id",
pubkey: "c".repeat(64),
lightningAddress: "[email protected]",
tags: [["d", "pointer"]],
kind: 30078,
};
globalThis.__BITVID_PLATFORM_FEE_OVERRIDE__ = "70/30";
const seventyThirty = createDeps();
const ratioResult = await splitAndZap(
{ videoEvent, amountSats: 1000, comment: "Great video!" },
seventyThirty.deps
);
assert.equal(ratioResult.creatorShare, 700);
assert.equal(ratioResult.platformShare, 300);
const ratioSendCalls = seventyThirty.getSendCalls();
assert.equal(ratioSendCalls.length, 2, "should send two payments for ratio");
assert.equal(ratioSendCalls[0].amountSats, 700);
assert.equal(ratioSendCalls[1].amountSats, 300);
globalThis.__BITVID_PLATFORM_FEE_OVERRIDE__ = "30%";
const percentOverride = createDeps();
const percentResult = await splitAndZap(
{ videoEvent, amountSats: 200, comment: "Another zap" },
percentOverride.deps
);
assert.equal(percentResult.creatorShare, 140);
assert.equal(percentResult.platformShare, 60);
delete globalThis.__BITVID_PLATFORM_FEE_OVERRIDE__;
}
async function testLnurlBounds() {
globalThis.__BITVID_PLATFORM_FEE_OVERRIDE__ = 0;
const depsWrapper = createDeps({ minSendable: 5_000 });
@@ -265,5 +301,6 @@ await testSplitMath();
await testLnurlBounds();
await testMissingAddress();
await testWalletFailure();
await testStringFeeOverride();
console.log("zap-split tests passed");