From 8f6423172d39b54f33edd216ee5770ef5102240d Mon Sep 17 00:00:00 2001 From: wireless_purple Date: Sun, 14 Jul 2024 14:50:03 +0000 Subject: [PATCH] initial commit --- .env.example | 1 + .gitignore | 11 ++ .npmrc | 1 + README.md | 5 + biome.json | 21 +++ bun.lockb | Bin 0 -> 56291 bytes package.json | 27 +++ src/app.html | 13 ++ src/lib/formatPrice.js | 60 ++++++ src/lib/server/context.js | 88 +++++++++ src/routes/+layout.js | 6 + src/routes/+layout.server.js | 6 + src/routes/+layout.svelte | 121 ++++++++++++ src/routes/+page.server.js | 6 + src/routes/+page.svelte | 202 +++++++++++++++++++++ src/routes/market/[market]/+page.server.js | 16 ++ src/routes/market/[market]/+page.svelte | 138 ++++++++++++++ src/routes/markets/+page.svelte | 1 + src/routes/trades/+page.svelte | 1 + static/haveno_logo_icon.png | Bin 0 -> 16359 bytes static/monero-symbol-on-white-1280.png | Bin 0 -> 27802 bytes svelte.config.js | 12 ++ vite.config.js | 6 + 23 files changed, 742 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 README.md create mode 100644 biome.json create mode 100755 bun.lockb create mode 100644 package.json create mode 100644 src/app.html create mode 100644 src/lib/formatPrice.js create mode 100644 src/lib/server/context.js create mode 100644 src/routes/+layout.js create mode 100644 src/routes/+layout.server.js create mode 100644 src/routes/+layout.svelte create mode 100644 src/routes/+page.server.js create mode 100644 src/routes/+page.svelte create mode 100644 src/routes/market/[market]/+page.server.js create mode 100644 src/routes/market/[market]/+page.svelte create mode 100644 src/routes/markets/+page.svelte create mode 100644 src/routes/trades/+page.svelte create mode 100644 static/haveno_logo_icon.png create mode 100644 static/monero-symbol-on-white-1280.png create mode 100644 svelte.config.js create mode 100644 vite.config.js diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..6467f34 --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +VITE_DB_PATH= # absolute path to the haveno_statistics/xmr_mainnet/db/ folder generate by the haveno-statsnode \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8ae61f8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example +vite.config.js.timestamp-* +vite.config.ts.timestamp-* +src/lib/data \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/README.md b/README.md new file mode 100644 index 0000000..895e8d8 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# haveno-markets +## Requirements +* Haveno +* ./haveno-statsnode --dumpStatistics=true +* bun \ No newline at end of file diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..c7a339c --- /dev/null +++ b/biome.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.7.3/schema.json", + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "style": { + "useNodejsImportProtocol": "off", + "useConst": "off" + } + } + }, + "overrides": [ + { + "include": ["*.svelte"] + } + ] +} diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..8e9af19e9fc89f95622f1fae9f3bf57aa5fb215d GIT binary patch literal 56291 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 + + + + + Haveno Markets + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/src/lib/formatPrice.js b/src/lib/formatPrice.js new file mode 100644 index 0000000..ded7f5f --- /dev/null +++ b/src/lib/formatPrice.js @@ -0,0 +1,60 @@ +import { get, writable } from "svelte/store"; + +const crypto = writable([]); +const fiat = writable([]); + +const isMoneroQuote = (currency) => { + return !!get(crypto).find((e) => e.code === currency); +}; + +const getAsset = (currency) => { + return ( + get(crypto).find((e) => e.code === currency) || + get(fiat).find((e) => e.code === currency) + ); +}; + +const getSignificantDigits = (price) => { + const avg = + price.length > 0 ? price.reduce((a, b) => a + b) / price.length : price; + let i = -4; + for (; i < 20; i++) { + if (Math.floor(avg * 10 ** i) >= 1000) break; + } + if (i <= 1) i = 2; + return i; +}; + +const getPrice = (price, currency = "XMR", useQuote = true) => { + return isMoneroQuote(currency) && useQuote + ? 10 ** getAsset(currency).precision / price + : price / 10 ** getAsset(currency).precision; +}; + +const formatPrice = ( + price, + currency = "XMR", + showSign = false, + useQuote = true, +) => { + const calculatedPrice = getPrice(price, currency, useQuote); + return ( + (showSign + ? getAsset(isMoneroQuote(currency) ? "XMR" : currency).sign || "" + : "") + + calculatedPrice.toLocaleString(undefined, { + minimumFractionDigits: getSignificantDigits(calculatedPrice), + maximumFractionDigits: getSignificantDigits(calculatedPrice), + }) + ); +}; + +export { + formatPrice, + getPrice, + getSignificantDigits, + getAsset, + isMoneroQuote, + crypto, + fiat, +}; diff --git a/src/lib/server/context.js b/src/lib/server/context.js new file mode 100644 index 0000000..9f4f5f5 --- /dev/null +++ b/src/lib/server/context.js @@ -0,0 +1,88 @@ +import { watch } from "fs"; +import { writable } from "svelte/store"; + +const offers = writable([]); +const trades = writable([]); +const crypto = writable([]); +const fiat = writable([]); + +const formatTrades = (e) => { + return e.map((e) => { + const crypto = e.primaryMarketTradeVolume === e.tradeAmount; + + return { + currency: e.currency, + price: e.tradePrice, + xmrAmount: e.tradeAmount, + amount: crypto ? e.primaryMarketTradeAmount : e.primaryMarketTradeVolume, + date: e.tradeDate, + }; + }); +}; +const formatOffers = (e) => { + return Object.groupBy(e, ({ currencyCode }) => currencyCode); +}; +const formatCrypto = (e) => { + e[e.findIndex((e) => e.code === "XMR")].precision = 12; + e[e.findIndex((e) => e.code === "XMR")].sign = "ɱ"; + return e; +}; +const formatFiat = (e) => { + e[e.findIndex((e) => e.code === "USD")].sign = "$"; + e[e.findIndex((e) => e.code === "EUR")].sign = "€"; + e[e.findIndex((e) => e.code === "GBP")].sign = "£"; + e[e.findIndex((e) => e.code === "AUD")].sign = "$"; + e[e.findIndex((e) => e.code === "CAD")].sign = "$"; + e[e.findIndex((e) => e.code === "SEK")].sign = "kr"; + return e; +}; + +Bun.file(`${import.meta.env.VITE_DB_PATH}offers_statistics.json`) + .json() + .then((j) => { + offers.set(formatOffers(j)); + }); +Bun.file(`${import.meta.env.VITE_DB_PATH}trade_statistics.json`) + .json() + .then((j) => { + trades.set(formatTrades(j)); + }); +Bun.file(`${import.meta.env.VITE_DB_PATH}crypto_currency_list.json`) + .json() + .then((j) => { + crypto.set(formatCrypto(j)); + }); +Bun.file(`${import.meta.env.VITE_DB_PATH}/traditional_currency_list.json`) + .json() + .then((j) => { + fiat.set(formatFiat(j)); + }); + +const watcher = watch(import.meta.env.VITE_DB_PATH, async (_, filename) => { + const file = Bun.file(import.meta.env.VITE_DB_PATH + filename); + const contents = await file.json(); + switch (filename) { + case "offers_statistics.json": + offers.set(formatOffers(contents)); + break; + case "trade_statistics.json": + trades.set(formatTrades(contents)); + break; + case "crypto_currency_list.json": + crypto.set(formatCrypto(contents)); + break; + case "traditional_currency_list.json": + fiat.set(formatFiat(contents)); + break; + } +}); + +process.on("SIGINT", () => { + // close watcher when Ctrl-C is pressed + console.log("Closing watcher..."); + watcher.close(); + + process.exit(0); +}); + +export { offers, trades, crypto, fiat }; diff --git a/src/routes/+layout.js b/src/routes/+layout.js new file mode 100644 index 0000000..51b6cc2 --- /dev/null +++ b/src/routes/+layout.js @@ -0,0 +1,6 @@ +import { crypto, fiat } from "$lib/formatPrice"; + +export function load({ data }) { + crypto.set(data.crypto); + fiat.set(data.fiat); +} diff --git a/src/routes/+layout.server.js b/src/routes/+layout.server.js new file mode 100644 index 0000000..4b56f77 --- /dev/null +++ b/src/routes/+layout.server.js @@ -0,0 +1,6 @@ +import { crypto, fiat } from "$lib/server/context"; +import { get } from "svelte/store"; + +export function load() { + return { crypto: get(crypto), fiat: get(fiat) }; +} diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte new file mode 100644 index 0000000..04feee7 --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,121 @@ + + \ No newline at end of file diff --git a/src/routes/+page.server.js b/src/routes/+page.server.js new file mode 100644 index 0000000..84f7fa0 --- /dev/null +++ b/src/routes/+page.server.js @@ -0,0 +1,6 @@ +import { offers, trades } from "$lib/server/context"; +import { get } from "svelte/store"; + +export function load() { + return { trades: get(trades), offers: get(offers) }; +} diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte new file mode 100644 index 0000000..0be8b67 --- /dev/null +++ b/src/routes/+page.svelte @@ -0,0 +1,202 @@ + + + + Haveno Markets + + +
+
+

XMR/USD

+ {formatPrice(grouped["USD"][0].price, "USD", true)} +
+
+

Liquidity

+ {formatPrice(liquidity, "XMR", true, false)} +
+
+ +
+
+

Price XMR/

+ + + + + +
+
+

+ Volume

+ + + + + + + + + +
+
+
+
+

Markets

+ + + + + + + {#each Object.values(Object.groupBy(data.trades, ({currency}) => currency)).toSorted((a,b) => b.length - a.length || (b[0].currency < a[0].currency ? 1 : -1)).slice(0, 16) as market} + + + + + + {/each} +
CurrencyPriceTrades
{getAsset(market[0].currency).name} ({market[0].currency}){formatPrice(market[0].price, market[0].currency, true, false)}{market.length}
+

View more »

+
+
+

Trades

+ + + + + + + {#each data.trades.slice(0, 16) as trade} + + + + + + {/each} +
DateAmount (XMR)Amount
{new Date(trade.date).toISOString().replace("T", " ").replace(/\.\d*Z/, "")}{formatPrice(trade.xmrAmount, "XMR", false, false)}{formatPrice(trade.amount, trade.currency, false, false)} {trade.currency}
+

View more »

+
+
\ No newline at end of file diff --git a/src/routes/market/[market]/+page.server.js b/src/routes/market/[market]/+page.server.js new file mode 100644 index 0000000..5cc064a --- /dev/null +++ b/src/routes/market/[market]/+page.server.js @@ -0,0 +1,16 @@ +import { offers, trades } from "$lib/server/context"; +import { get } from "svelte/store"; + +export async function load({ params }) { + let groupedOffers = { BUY: [], SELL: [] }; + if (get(offers)[params.market]?.length > 0) { + groupedOffers = Object.groupBy( + get(offers)[params.market], + ({ direction }) => direction, + ); + } + return { + trades: get(trades).filter(({ currency }) => currency === params.market), + offers: groupedOffers, + }; +} diff --git a/src/routes/market/[market]/+page.svelte b/src/routes/market/[market]/+page.svelte new file mode 100644 index 0000000..1640179 --- /dev/null +++ b/src/routes/market/[market]/+page.svelte @@ -0,0 +1,138 @@ + + + {marketPair} - Haveno Markets + +
+
+

{marketPair}

+ {formatPrice(data.trades?.[0]?.price, market, true, false)} + + + + +
+
+
+
+

Buy Offers

+ + + + + + + {#each data.offers["BUY"]?.toSorted((a,b) => a.price < b.price ? 1 : -1)||[] as offer} + + + + + + {/each} +
PriceAmount (XMR)Amount ({market})
{formatPrice(offer.price, market, false, false)}{formatPrice(offer.amount, "XMR", false, false)}{formatPrice(offer.primaryMarketAmount, market, false, false)}
+
+
+

Sell Offers

+ + + + + + + {#each data.offers["SELL"]?.toSorted((a,b) => a.price > b.price ? 1 : -1)||[] as offer} + + + + + + {/each} +
PriceAmount (XMR)Amount ({market})
{formatPrice(offer.price, market, false, false)}{formatPrice(offer.amount, "XMR", false, false)}{formatPrice(offer.primaryMarketAmount, market, false, false)}
+
+
+
+
+

Last Trades

+ + + + + + + + {#each data.trades as trade} + + + + + + + {/each} +
DatePriceAmount (XMR)Amount ({market})
{new Date(trade.date).toISOString().replace("T", " ").replace(/\.\d*Z/, "")}{formatPrice(trade.price, trade.currency, false, false)}{formatPrice(trade.xmrAmount, "XMR", false, false)}{formatPrice(trade.amount, trade.currency, false, false)}
+
+
\ No newline at end of file diff --git a/src/routes/markets/+page.svelte b/src/routes/markets/+page.svelte new file mode 100644 index 0000000..b9c4d8d --- /dev/null +++ b/src/routes/markets/+page.svelte @@ -0,0 +1 @@ +Under construction \ No newline at end of file diff --git a/src/routes/trades/+page.svelte b/src/routes/trades/+page.svelte new file mode 100644 index 0000000..b9c4d8d --- /dev/null +++ b/src/routes/trades/+page.svelte @@ -0,0 +1 @@ +Under construction \ No newline at end of file diff --git a/static/haveno_logo_icon.png b/static/haveno_logo_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c031b779772d1085ee4274e5911490c2a89b472e GIT binary patch literal 16359 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 literal 0 HcmV?d00001 diff --git a/static/monero-symbol-on-white-1280.png b/static/monero-symbol-on-white-1280.png new file mode 100644 index 0000000000000000000000000000000000000000..65360cb3dd2b04186e76fc45e980e9c067bcf77e GIT binary patch literal 27802 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 literal 0 HcmV?d00001 diff --git a/svelte.config.js b/svelte.config.js new file mode 100644 index 0000000..f6c3133 --- /dev/null +++ b/svelte.config.js @@ -0,0 +1,12 @@ +import adapter from "svelte-adapter-bun"; +import preprocess from "svelte-preprocess"; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + kit: { + adapter: adapter(), + }, + preprocess: [preprocess()], +}; + +export default config; diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..6b9eb5d --- /dev/null +++ b/vite.config.js @@ -0,0 +1,6 @@ +import { sveltekit } from "@sveltejs/kit/vite"; +import { defineConfig } from "vite"; + +export default defineConfig({ + plugins: [sveltekit()], +});