mirror of
https://github.com/apotdevin/thunderhub.git
synced 2025-02-24 14:50:38 +01:00
* feat: ✨ channel stats * chore: 🔧 add node resolver * chore: 🔧 add monitored time * chore: 🔧 and queries to front * fix: 🐛 floats to ints * chore: 🔧 add progress bars * chore: 🔧 add channel resolver * chore: 🔧 refactor forwards frontend * refactor: ♻️ channel resolvers * chore: 🔧 refactor channel queries * refactor: ♻️ peer resolver * refactor: ♻️ peer query * fix: 🐛 small changes * fix: 🐛 typo * chore: 🔧 stats view wip * chore: 🔧 add update script * chore: 🔧 improve ui * chore: 🔧 move buttons * fix: 🐛 home path * chore: 🔧 add public key to node resolver * refactor: ♻️ resume resolver * chore: 🔧 remove test account * chore: 🔧 change logger for lnpay * feat: ✨ github version Co-authored-by: apotdevin <apotdevincab@gmail.com>
132 lines
3.6 KiB
TypeScript
132 lines
3.6 KiB
TypeScript
import { getChannels, getChannel, getWalletInfo } from 'ln-service';
|
|
import { getCorrectAuth, getAuthLnd } from 'server/helpers/helpers';
|
|
import { requestLimiter } from 'server/helpers/rateLimiter';
|
|
import { to, toWithError } from 'server/helpers/async';
|
|
import { logger } from 'server/helpers/logger';
|
|
import { ContextType } from 'server/types/apiTypes';
|
|
import { getFeeScore, getAverage, getMyFeeScore } from '../helpers';
|
|
|
|
type ChannelFeesType = {
|
|
id: string;
|
|
publicKey: string;
|
|
partnerBaseFee: number;
|
|
partnerFeeRate: number;
|
|
myBaseFee: number;
|
|
myFeeRate: number;
|
|
};
|
|
|
|
export default async (_: undefined, params: any, context: ContextType) => {
|
|
await requestLimiter(context.ip, 'getFeeHealth');
|
|
|
|
const auth = getCorrectAuth(params.auth, context);
|
|
const lnd = getAuthLnd(auth);
|
|
|
|
const { public_key } = await to(getWalletInfo({ lnd }));
|
|
const { channels } = await to(getChannels({ lnd }));
|
|
|
|
const getChannelList = () =>
|
|
Promise.all(
|
|
channels
|
|
.map(async channel => {
|
|
const { id, partner_public_key: publicKey } = channel;
|
|
const [{ policies }, channelError] = await toWithError(
|
|
getChannel({
|
|
lnd,
|
|
id,
|
|
})
|
|
);
|
|
|
|
if (channelError) {
|
|
logger.debug(
|
|
`Error getting channel with id ${id}: %o`,
|
|
channelError
|
|
);
|
|
return;
|
|
}
|
|
|
|
let partnerBaseFee = 0;
|
|
let partnerFeeRate = 0;
|
|
let myBaseFee = 0;
|
|
let myFeeRate = 0;
|
|
|
|
if (!channelError && policies) {
|
|
for (let i = 0; i < policies.length; i++) {
|
|
const policy = policies[i];
|
|
|
|
if (policy.public_key === public_key) {
|
|
myBaseFee = Number(policy.base_fee_mtokens);
|
|
myFeeRate = policy.fee_rate;
|
|
} else {
|
|
partnerBaseFee = Number(policy.base_fee_mtokens);
|
|
partnerFeeRate = policy.fee_rate;
|
|
}
|
|
}
|
|
}
|
|
|
|
return {
|
|
id,
|
|
publicKey,
|
|
partnerBaseFee,
|
|
partnerFeeRate,
|
|
myBaseFee,
|
|
myFeeRate,
|
|
};
|
|
})
|
|
.filter(Boolean)
|
|
);
|
|
|
|
const list = await getChannelList();
|
|
|
|
const health = list.map((channel: ChannelFeesType) => {
|
|
const partnerRateScore = getFeeScore(2000, channel.partnerFeeRate);
|
|
const partnerBaseScore = getFeeScore(100000, channel.partnerBaseFee);
|
|
const myRateScore = getMyFeeScore(2000, channel.myFeeRate, 200);
|
|
const myBaseScore = getMyFeeScore(100000, channel.myBaseFee, 1000);
|
|
|
|
const partnerScore = Math.round(
|
|
getAverage([partnerBaseScore, partnerRateScore])
|
|
);
|
|
const myScore = Math.round(
|
|
getAverage([myRateScore.score, myBaseScore.score])
|
|
);
|
|
|
|
const mySide = {
|
|
score: myScore,
|
|
rate: channel.myFeeRate,
|
|
base: Math.round(channel.myBaseFee / 1000),
|
|
rateScore: myRateScore.score,
|
|
baseScore: myBaseScore.score,
|
|
rateOver: myRateScore.over,
|
|
baseOver: myBaseScore.over,
|
|
};
|
|
|
|
const partnerSide = {
|
|
score: partnerScore,
|
|
rate: channel.partnerFeeRate,
|
|
base: Math.round(channel.partnerBaseFee / 1000),
|
|
rateScore: partnerRateScore,
|
|
baseScore: partnerBaseScore,
|
|
rateOver: true,
|
|
baseOver: true,
|
|
};
|
|
|
|
return {
|
|
id: channel.id,
|
|
partnerSide,
|
|
mySide,
|
|
partner: { publicKey: channel.publicKey, lnd },
|
|
};
|
|
});
|
|
|
|
const score = Math.round(
|
|
getAverage([
|
|
...health.map(c => c.partnerSide.score),
|
|
...health.map(c => c.mySide.score),
|
|
])
|
|
);
|
|
|
|
return {
|
|
score,
|
|
channels: health,
|
|
};
|
|
};
|