Add Solana market data to wallet tracker

This commit is contained in:
2024-01-28 22:23:08 +01:00
parent 6afd518f58
commit bff72ff5b5
9 changed files with 626 additions and 29 deletions

View File

@@ -1,21 +1,23 @@
const express = require('express');
const { createMetrics } = require('./metrics');
const { loadWalletBalance, loadUSDCBalance, extractWalletBalance, extractUSDCBalance } = require('./solana');
const { loadWalletBalance, loadUSDCBalance, loadSolanaMarketData, extractWalletBalance, extractUSDCBalance, extractSOLPrice } = require('./solana');
const WALLET_ADDRESS = process.env.WALLET_ADDRESS;
const [registry, usdcBalanceMetric, solBalanceMetric] = createMetrics();
const [registry, usdcBalanceMetric, solBalanceMetric, solUsdcBalanceMetric] = createMetrics();
const app = express();
app.get('/metrics', async (req, res) => {
res.setHeader('Content-Type', registry.contentType);
let [solBalance, usdcBalance] = await Promise.all([
let [solBalance, usdcBalance, marketData] = await Promise.all([
loadWalletBalance(WALLET_ADDRESS),
loadUSDCBalance(WALLET_ADDRESS)]);
solBalanceMetric.set(extractWalletBalance(solBalance));
usdcBalanceMetric.set(extractUSDCBalance(usdcBalance));
loadUSDCBalance(WALLET_ADDRESS),
loadSolanaMarketData()]);
solBalanceMetric.set({ wallet: WALLET_ADDRESS}, extractWalletBalance(solBalance));
usdcBalanceMetric.set({ wallet: WALLET_ADDRESS}, extractUSDCBalance(usdcBalance));
solUsdcBalanceMetric.set({ wallet: WALLET_ADDRESS}, extractWalletBalance(solBalance) * extractSOLPrice(marketData));
res.send(await registry.metrics());
});

View File

@@ -6,16 +6,24 @@ const createMetrics = () => {
const solBalanceMetric = new client.Gauge({
name: "sol_balance",
help: "SOL Balance",
labelNames: ['wallet']
});
const usdcBalanceMetric = new client.Gauge({
name: "usdc_balance",
help: "USDC Balance",
labelNames: ['wallet']
});
const solUsdcBalanceMetric = new client.Gauge({
name: "sol_usdc_balance",
help: "SOL Balance in USDC",
labelNames: ['wallet']
});
registry.registerMetric(usdcBalanceMetric);
registry.registerMetric(solBalanceMetric);
registry.registerMetric(solUsdcBalanceMetric);
return [registry, usdcBalanceMetric, solBalanceMetric];
return [registry, usdcBalanceMetric, solBalanceMetric, solUsdcBalanceMetric];
};
module.exports = {

View File

@@ -39,6 +39,12 @@ async function loadUSDCBalance(walletAddress) {
return json;
}
async function loadSolanaMarketData() {
const response = await fetch("https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&ids=solana");
const json = await response.json();
return json;
}
// extract wallet balance
function extractWalletBalance(walletBalance) {
return walletBalance.result.value / LAMPORTS_PER_SOL;
@@ -49,10 +55,17 @@ function extractUSDCBalance(usdcBalance) {
return usdcBalance.result.value[0].account.data.parsed.info.tokenAmount.uiAmount;
}
// extract SOL price
function extractSOLPrice(marketData) {
return marketData[0].current_price;
}
// export functions
module.exports = {
loadWalletBalance,
loadUSDCBalance,
loadSolanaMarketData,
extractWalletBalance,
extractUSDCBalance
extractUSDCBalance,
extractSOLPrice
};