general: snapshot

This commit is contained in:
k
2024-07-25 14:43:20 +02:00
parent 0f8d7d5fe2
commit d3d5e7f8d7
27 changed files with 254 additions and 323 deletions
+2
View File
@@ -1,5 +1,7 @@
.DS_Store
/app-next
/app-html
/datasets
/datasets2
/datasets_*
+2 -1
View File
@@ -13,6 +13,7 @@
- Auto fetch prices from the main Satonomics instance if missing instead of only trying Kraken's and Binance's API which are limited to the last 16 hours
- Merged the core of `HeightMap` and `DateMap` structs into `GenericMap`
- Added `Height` struct and many others
- Reorganized outputs of both the parser and the server for ease of use and easier sync compatibility
- CLI
- Added an argument parser for improved UX with several options
- Datasets
@@ -76,7 +77,7 @@
- Run file
- Only run with a watcher if `cargo watch` is available
- Added trigger folder to automatically restart when a new dataset has been added in the parser
- Removed id_to_path file in favor for only `paths.d.ts` in `app/src/types`
## v. 0.2.0 | [851286](https://mempool.space/block/0000000000000000000281ca7f1bf8c50702bfca168c7af1bdc67c977c1ac8ed) - 2024/07/08
+2 -1
View File
@@ -6,4 +6,5 @@ dev-dist
visualizer
# Local Netlify folder
.netlify
.wrangler
.wrangler
paths.d.ts
+2 -2
View File
@@ -1,5 +1,5 @@
<!doctype html>
<html lang="en" class="overflow-hidden">
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Satonomics</title>
@@ -363,7 +363,7 @@
/>
</head>
<body
class="text-high-contrast bg-white dark:bg-black"
class="text-high-contrast overflow-hidden bg-white dark:bg-black"
style="font-size: 15px; line-height: 22px"
>
<noscript>You need to enable JavaScript to run this app.</noscript>
+5 -5
View File
@@ -22,26 +22,26 @@
"@solid-primitives/resize-observer": "^2.0.26",
"lean-qr": "^2.3.4",
"lightweight-charts": "^4.1.7",
"solid-js": "^1.8.18"
"solid-js": "^1.8.19"
},
"devDependencies": {
"@ianvs/prettier-plugin-sort-imports": "^4.3.1",
"@iconify-json/tabler": "^1.1.118",
"@tailwindcss/container-queries": "^0.1.1",
"autoprefixer": "^10.4.19",
"postcss": "^8.4.39",
"postcss": "^8.4.40",
"prettier": "^3.3.3",
"prettier-plugin-tailwindcss": "^0.6.5",
"pwa-asset-generator": "^6.3.1",
"rollup-plugin-visualizer": "^5.12.0",
"tailwindcss": "^3.4.6",
"typescript": "^5.5.4",
"unplugin-auto-import": "^0.18.0",
"unplugin-auto-import": "^0.18.2",
"unplugin-icons": "^0.19.0",
"vite": "^5.3.4",
"vite": "^5.3.5",
"vite-plugin-pwa": "^0.20.0",
"vite-plugin-solid": "^2.10.2",
"workbox-window": "^7.1.0",
"wrangler": "^3.65.1"
"wrangler": "^3.66.0"
}
}
+96 -95
View File
@@ -10,13 +10,13 @@ dependencies:
version: 1.0.14
'@solid-primitives/event-listener':
specifier: ^2.3.3
version: 2.3.3(solid-js@1.8.18)
version: 2.3.3(solid-js@1.8.19)
'@solid-primitives/intersection-observer':
specifier: ^2.1.6
version: 2.1.6(solid-js@1.8.18)
version: 2.1.6(solid-js@1.8.19)
'@solid-primitives/resize-observer':
specifier: ^2.0.26
version: 2.0.26(solid-js@1.8.18)
version: 2.0.26(solid-js@1.8.19)
lean-qr:
specifier: ^2.3.4
version: 2.3.4
@@ -24,8 +24,8 @@ dependencies:
specifier: ^4.1.7
version: 4.1.7
solid-js:
specifier: ^1.8.18
version: 1.8.18
specifier: ^1.8.19
version: 1.8.19
devDependencies:
'@ianvs/prettier-plugin-sort-imports':
@@ -39,10 +39,10 @@ devDependencies:
version: 0.1.1(tailwindcss@3.4.6)
autoprefixer:
specifier: ^10.4.19
version: 10.4.19(postcss@8.4.39)
version: 10.4.19(postcss@8.4.40)
postcss:
specifier: ^8.4.39
version: 8.4.39
specifier: ^8.4.40
version: 8.4.40
prettier:
specifier: ^3.3.3
version: 3.3.3
@@ -62,26 +62,26 @@ devDependencies:
specifier: ^5.5.4
version: 5.5.4
unplugin-auto-import:
specifier: ^0.18.0
version: 0.18.0(rollup@2.79.1)
specifier: ^0.18.2
version: 0.18.2(rollup@2.79.1)
unplugin-icons:
specifier: ^0.19.0
version: 0.19.0
vite:
specifier: ^5.3.4
version: 5.3.4
specifier: ^5.3.5
version: 5.3.5
vite-plugin-pwa:
specifier: ^0.20.0
version: 0.20.0(vite@5.3.4)(workbox-build@7.1.1)(workbox-window@7.1.0)
version: 0.20.0(vite@5.3.5)(workbox-build@7.1.1)(workbox-window@7.1.0)
vite-plugin-solid:
specifier: ^2.10.2
version: 2.10.2(solid-js@1.8.18)(vite@5.3.4)
version: 2.10.2(solid-js@1.8.19)(vite@5.3.5)
workbox-window:
specifier: ^7.1.0
version: 7.1.0
wrangler:
specifier: ^3.65.1
version: 3.65.1
specifier: ^3.66.0
version: 3.66.0
packages:
@@ -2230,60 +2230,60 @@ packages:
dev: true
optional: true
/@solid-primitives/event-listener@2.3.3(solid-js@1.8.18):
/@solid-primitives/event-listener@2.3.3(solid-js@1.8.19):
resolution: {integrity: sha512-DAJbl+F0wrFW2xmcV8dKMBhk9QLVLuBSW+TR4JmIfTaObxd13PuL7nqaXnaYKDWOYa6otB00qcCUIGbuIhSUgQ==}
peerDependencies:
solid-js: ^1.6.12
dependencies:
'@solid-primitives/utils': 6.2.3(solid-js@1.8.18)
solid-js: 1.8.18
'@solid-primitives/utils': 6.2.3(solid-js@1.8.19)
solid-js: 1.8.19
dev: false
/@solid-primitives/intersection-observer@2.1.6(solid-js@1.8.18):
/@solid-primitives/intersection-observer@2.1.6(solid-js@1.8.19):
resolution: {integrity: sha512-SeiCmN/R46Z+o9+5HhIQzSor0DqVPyo4ROLQMvCI8AsGZl/5nHlWzHTTbWPeukVUXTgb04wfC3DUo9IzF/XloA==}
peerDependencies:
solid-js: ^1.6.12
dependencies:
'@solid-primitives/utils': 6.2.3(solid-js@1.8.18)
solid-js: 1.8.18
'@solid-primitives/utils': 6.2.3(solid-js@1.8.19)
solid-js: 1.8.19
dev: false
/@solid-primitives/resize-observer@2.0.26(solid-js@1.8.18):
/@solid-primitives/resize-observer@2.0.26(solid-js@1.8.19):
resolution: {integrity: sha512-KbPhwal6ML9OHeUTZszBbt6PYSMj89d4wVCLxlvDYL4U0+p+xlCEaqz6v9dkCwm/0Lb+Wed7W5T1dQZCP3JUUw==}
peerDependencies:
solid-js: ^1.6.12
dependencies:
'@solid-primitives/event-listener': 2.3.3(solid-js@1.8.18)
'@solid-primitives/rootless': 1.4.5(solid-js@1.8.18)
'@solid-primitives/static-store': 0.0.8(solid-js@1.8.18)
'@solid-primitives/utils': 6.2.3(solid-js@1.8.18)
solid-js: 1.8.18
'@solid-primitives/event-listener': 2.3.3(solid-js@1.8.19)
'@solid-primitives/rootless': 1.4.5(solid-js@1.8.19)
'@solid-primitives/static-store': 0.0.8(solid-js@1.8.19)
'@solid-primitives/utils': 6.2.3(solid-js@1.8.19)
solid-js: 1.8.19
dev: false
/@solid-primitives/rootless@1.4.5(solid-js@1.8.18):
/@solid-primitives/rootless@1.4.5(solid-js@1.8.19):
resolution: {integrity: sha512-GFJE9GC3ojx0aUKqAUZmQPyU8fOVMtnVNrkdk2yS4kd17WqVSpXpoTmo9CnOwA+PG7FTzdIkogvfLQSLs4lrww==}
peerDependencies:
solid-js: ^1.6.12
dependencies:
'@solid-primitives/utils': 6.2.3(solid-js@1.8.18)
solid-js: 1.8.18
'@solid-primitives/utils': 6.2.3(solid-js@1.8.19)
solid-js: 1.8.19
dev: false
/@solid-primitives/static-store@0.0.8(solid-js@1.8.18):
/@solid-primitives/static-store@0.0.8(solid-js@1.8.19):
resolution: {integrity: sha512-ZecE4BqY0oBk0YG00nzaAWO5Mjcny8Fc06CdbXadH9T9lzq/9GefqcSe/5AtdXqjvY/DtJ5C6CkcjPZO0o/eqg==}
peerDependencies:
solid-js: ^1.6.12
dependencies:
'@solid-primitives/utils': 6.2.3(solid-js@1.8.18)
solid-js: 1.8.18
'@solid-primitives/utils': 6.2.3(solid-js@1.8.19)
solid-js: 1.8.19
dev: false
/@solid-primitives/utils@6.2.3(solid-js@1.8.18):
/@solid-primitives/utils@6.2.3(solid-js@1.8.19):
resolution: {integrity: sha512-CqAwKb2T5Vi72+rhebSsqNZ9o67buYRdEJrIFzRXz3U59QqezuuxPsyzTSVCacwS5Pf109VRsgCJQoxKRoECZQ==}
peerDependencies:
solid-js: ^1.6.12
dependencies:
solid-js: 1.8.18
solid-js: 1.8.19
dev: false
/@surma/rollup-plugin-off-main-thread@2.2.3:
@@ -2347,11 +2347,11 @@ packages:
/@types/node-forge@1.3.11:
resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==}
dependencies:
'@types/node': 20.14.11
'@types/node': 20.14.12
dev: true
/@types/node@20.14.11:
resolution: {integrity: sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==}
/@types/node@20.14.12:
resolution: {integrity: sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==}
dependencies:
undici-types: 5.26.5
dev: true
@@ -2372,7 +2372,7 @@ packages:
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
requiresBuild: true
dependencies:
'@types/node': 20.14.11
'@types/node': 20.14.12
dev: true
optional: true
@@ -2499,7 +2499,7 @@ packages:
engines: {node: '>= 4.0.0'}
dev: true
/autoprefixer@10.4.19(postcss@8.4.39):
/autoprefixer@10.4.19(postcss@8.4.40):
resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==}
engines: {node: ^10 || ^12 || >=14}
hasBin: true
@@ -2511,7 +2511,7 @@ packages:
fraction.js: 4.3.7
normalize-range: 0.1.2
picocolors: 1.0.1
postcss: 8.4.39
postcss: 8.4.40
postcss-value-parser: 4.2.0
dev: true
@@ -2522,8 +2522,8 @@ packages:
possible-typed-array-names: 1.0.0
dev: true
/babel-plugin-jsx-dom-expressions@0.37.23(@babel/core@7.24.9):
resolution: {integrity: sha512-Y/r8LyLi/njnwPTaDuPEReWk30FJ1KplloYvcFUhHmiH1F7yVVj5mWojD7mbO/IruKyvOs9OIPUoeMi3Z++J4w==}
/babel-plugin-jsx-dom-expressions@0.38.1(@babel/core@7.24.9):
resolution: {integrity: sha512-4FD4H69Cu4jHx2uLDEvx4YC5T/fC/Dmaafhsm8hXm7SjHYzjr09gBVyHdoFza+91f/g9e6tIzjbLCMkOXwmlew==}
peerDependencies:
'@babel/core': ^7.20.12
dependencies:
@@ -2571,13 +2571,13 @@ packages:
- supports-color
dev: true
/babel-preset-solid@1.8.18(@babel/core@7.24.9):
resolution: {integrity: sha512-ky0FA4cCS9dk+xYBBItHoxtbRnaDIOGpmHLFqKPaR81hpMbJBOiLOZia2hT0JBwx4zn/D2OjMRvRr6kqtRMoUw==}
/babel-preset-solid@1.8.19(@babel/core@7.24.9):
resolution: {integrity: sha512-F3MoUdx3i4znhStnXUBno+5kGSbvhpbGrPgqfRPrS8W7foVJUOSd1/F9QDyd9dgClHfr+J7V14931eu1PEDDMQ==}
peerDependencies:
'@babel/core': ^7.0.0
dependencies:
'@babel/core': 7.24.9
babel-plugin-jsx-dom-expressions: 0.37.23(@babel/core@7.24.9)
babel-plugin-jsx-dom-expressions: 0.38.1(@babel/core@7.24.9)
dev: true
/balanced-match@1.0.2:
@@ -2635,7 +2635,7 @@ packages:
hasBin: true
dependencies:
caniuse-lite: 1.0.30001643
electron-to-chromium: 1.5.0
electron-to-chromium: 1.5.1
node-releases: 2.0.18
update-browserslist-db: 1.1.0(browserslist@4.23.2)
dev: true
@@ -2772,7 +2772,7 @@ packages:
engines: {node: '>=12.13.0'}
hasBin: true
dependencies:
'@types/node': 20.14.11
'@types/node': 20.14.12
escape-string-regexp: 4.0.0
is-wsl: 2.2.0
lighthouse-logger: 1.4.2
@@ -3101,8 +3101,8 @@ packages:
jake: 10.9.2
dev: true
/electron-to-chromium@1.5.0:
resolution: {integrity: sha512-Vb3xHHYnLseK8vlMJQKJYXJ++t4u1/qJ3vykuVrVjvdiOEhYyT1AuP4x03G8EnPmYvYOhe9T+dADTmthjRQMkA==}
/electron-to-chromium@1.5.1:
resolution: {integrity: sha512-FKbOCOQ5QRB3VlIbl1LZQefWIYwszlBloaXcY2rbfpu9ioJnNh3TK03YtIDKDo3WKBi8u+YV4+Fn2CkEozgf4w==}
dev: true
/emoji-regex@8.0.0:
@@ -4625,29 +4625,29 @@ packages:
engines: {node: '>= 0.4'}
dev: true
/postcss-import@15.1.0(postcss@8.4.39):
/postcss-import@15.1.0(postcss@8.4.40):
resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
engines: {node: '>=14.0.0'}
peerDependencies:
postcss: ^8.0.0
dependencies:
postcss: 8.4.39
postcss: 8.4.40
postcss-value-parser: 4.2.0
read-cache: 1.0.0
resolve: 1.22.8
dev: true
/postcss-js@4.0.1(postcss@8.4.39):
/postcss-js@4.0.1(postcss@8.4.40):
resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
engines: {node: ^12 || ^14 || >= 16}
peerDependencies:
postcss: ^8.4.21
dependencies:
camelcase-css: 2.0.1
postcss: 8.4.39
postcss: 8.4.40
dev: true
/postcss-load-config@4.0.2(postcss@8.4.39):
/postcss-load-config@4.0.2(postcss@8.4.40):
resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
engines: {node: '>= 14'}
peerDependencies:
@@ -4660,17 +4660,17 @@ packages:
optional: true
dependencies:
lilconfig: 3.1.2
postcss: 8.4.39
yaml: 2.4.5
postcss: 8.4.40
yaml: 2.5.0
dev: true
/postcss-nested@6.2.0(postcss@8.4.39):
/postcss-nested@6.2.0(postcss@8.4.40):
resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
engines: {node: '>=12.0'}
peerDependencies:
postcss: ^8.2.14
dependencies:
postcss: 8.4.39
postcss: 8.4.40
postcss-selector-parser: 6.1.1
dev: true
@@ -4686,8 +4686,8 @@ packages:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
dev: true
/postcss@8.4.39:
resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==}
/postcss@8.4.40:
resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==}
engines: {node: ^10 || ^12 || >=14}
dependencies:
nanoid: 3.3.7
@@ -5212,14 +5212,14 @@ packages:
resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==}
dev: true
/solid-js@1.8.18:
resolution: {integrity: sha512-cpkxDPvO/AuKBugVv6xKFd1C9VC0XZMu4VtF56IlHoux8HgyW44uqNSWbozMnVcpIzHIhS3vVXPAVZYM26jpWw==}
/solid-js@1.8.19:
resolution: {integrity: sha512-h8z/TvTQYsf894LM9Iau/ZW2iAKrCzAWDwjPhMcXnonmW1OIIihc28wp82b1wwei1p81fH5+gnfNOe8RzLbDRQ==}
dependencies:
csstype: 3.1.3
seroval: 1.1.0
seroval-plugins: 1.1.0(seroval@1.1.0)
/solid-refresh@0.6.3(solid-js@1.8.18):
/solid-refresh@0.6.3(solid-js@1.8.19):
resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==}
peerDependencies:
solid-js: ^1.3
@@ -5227,7 +5227,7 @@ packages:
'@babel/generator': 7.24.10
'@babel/helper-module-imports': 7.24.7
'@babel/types': 7.24.9
solid-js: 1.8.18
solid-js: 1.8.19
transitivePeerDependencies:
- supports-color
dev: true
@@ -5472,11 +5472,11 @@ packages:
normalize-path: 3.0.0
object-hash: 3.0.0
picocolors: 1.0.1
postcss: 8.4.39
postcss-import: 15.1.0(postcss@8.4.39)
postcss-js: 4.0.1(postcss@8.4.39)
postcss-load-config: 4.0.2(postcss@8.4.39)
postcss-nested: 6.2.0(postcss@8.4.39)
postcss: 8.4.40
postcss-import: 15.1.0(postcss@8.4.40)
postcss-js: 4.0.1(postcss@8.4.40)
postcss-load-config: 4.0.2(postcss@8.4.40)
postcss-nested: 6.2.0(postcss@8.4.40)
postcss-selector-parser: 6.1.1
resolve: 1.22.8
sucrase: 3.35.0
@@ -5737,7 +5737,7 @@ packages:
pkg-types: 1.1.3
scule: 1.3.0
strip-literal: 2.1.0
unplugin: 1.11.0
unplugin: 1.12.0
transitivePeerDependencies:
- rollup
dev: true
@@ -5754,8 +5754,8 @@ packages:
engines: {node: '>= 10.0.0'}
dev: true
/unplugin-auto-import@0.18.0(rollup@2.79.1):
resolution: {integrity: sha512-DZcj8tceMpwuZgBPM9hhKd7v05WAYCUc/qYjxV7vGbeVCGsQ8SHWumCyOYBDqYzkPd4FlQkuh+OH0cWgdCjcdw==}
/unplugin-auto-import@0.18.2(rollup@2.79.1):
resolution: {integrity: sha512-Dwb3rAic75harVBrVjwiq6H24PT+nBq2dpxV5BH8NNI6sDFaTytvP+iyo4xy7prQbR3r5K6nMs4f5Wp9PE4g8A==}
engines: {node: '>=14'}
peerDependencies:
'@nuxt/kit': ^3.2.2
@@ -5773,7 +5773,7 @@ packages:
magic-string: 0.30.10
minimatch: 9.0.5
unimport: 3.9.0(rollup@2.79.1)
unplugin: 1.11.0
unplugin: 1.12.0
transitivePeerDependencies:
- rollup
dev: true
@@ -5804,13 +5804,13 @@ packages:
debug: 4.3.5
kolorist: 1.8.0
local-pkg: 0.5.0
unplugin: 1.11.0
unplugin: 1.12.0
transitivePeerDependencies:
- supports-color
dev: true
/unplugin@1.11.0:
resolution: {integrity: sha512-3r7VWZ/webh0SGgJScpWl2/MRCZK5d3ZYFcNaeci/GQ7Teop7zf0Nl2pUuz7G21BwPd9pcUPOC5KmJ2L3WgC5g==}
/unplugin@1.12.0:
resolution: {integrity: sha512-KeczzHl2sATPQUx1gzo+EnUkmN4VmGBYRRVOZSGvGITE9rGHRDGqft6ONceP3vgXcyJ2XjX5axG5jMWUwNCYLw==}
engines: {node: '>=14.0.0'}
dependencies:
acorn: 8.12.1
@@ -5850,7 +5850,7 @@ packages:
spdx-expression-parse: 3.0.1
dev: true
/vite-plugin-pwa@0.20.0(vite@5.3.4)(workbox-build@7.1.1)(workbox-window@7.1.0):
/vite-plugin-pwa@0.20.0(vite@5.3.5)(workbox-build@7.1.1)(workbox-window@7.1.0):
resolution: {integrity: sha512-/kDZyqF8KqoXRpMUQtR5Atri/7BWayW8Gp7Kz/4bfstsV6zSFTxjREbXZYL7zSuRL40HGA+o2hvUAFRmC+bL7g==}
engines: {node: '>=16.0.0'}
peerDependencies:
@@ -5865,14 +5865,14 @@ packages:
debug: 4.3.5
fast-glob: 3.3.2
pretty-bytes: 6.1.1
vite: 5.3.4
vite: 5.3.5
workbox-build: 7.1.1
workbox-window: 7.1.0
transitivePeerDependencies:
- supports-color
dev: true
/vite-plugin-solid@2.10.2(solid-js@1.8.18)(vite@5.3.4):
/vite-plugin-solid@2.10.2(solid-js@1.8.19)(vite@5.3.5):
resolution: {integrity: sha512-AOEtwMe2baBSXMXdo+BUwECC8IFHcKS6WQV/1NEd+Q7vHPap5fmIhLcAzr+DUJ04/KHx/1UBU0l1/GWP+rMAPQ==}
peerDependencies:
'@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.*
@@ -5884,18 +5884,18 @@ packages:
dependencies:
'@babel/core': 7.24.9
'@types/babel__core': 7.20.5
babel-preset-solid: 1.8.18(@babel/core@7.24.9)
babel-preset-solid: 1.8.19(@babel/core@7.24.9)
merge-anything: 5.1.7
solid-js: 1.8.18
solid-refresh: 0.6.3(solid-js@1.8.18)
vite: 5.3.4
vitefu: 0.2.5(vite@5.3.4)
solid-js: 1.8.19
solid-refresh: 0.6.3(solid-js@1.8.19)
vite: 5.3.5
vitefu: 0.2.5(vite@5.3.5)
transitivePeerDependencies:
- supports-color
dev: true
/vite@5.3.4:
resolution: {integrity: sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==}
/vite@5.3.5:
resolution: {integrity: sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
@@ -5923,13 +5923,13 @@ packages:
optional: true
dependencies:
esbuild: 0.21.5
postcss: 8.4.39
postcss: 8.4.40
rollup: 4.19.0
optionalDependencies:
fsevents: 2.3.3
dev: true
/vitefu@0.2.5(vite@5.3.4):
/vitefu@0.2.5(vite@5.3.5):
resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==}
peerDependencies:
vite: ^3.0.0 || ^4.0.0 || ^5.0.0
@@ -5937,7 +5937,7 @@ packages:
vite:
optional: true
dependencies:
vite: 5.3.4
vite: 5.3.5
dev: true
/webidl-conversions@3.0.1:
@@ -6160,8 +6160,8 @@ packages:
'@cloudflare/workerd-windows-64': 1.20240718.0
dev: true
/wrangler@3.65.1:
resolution: {integrity: sha512-Z5NyrbpGMQCpim/6VnI1im0/Weh5+CU1sdep1JbfFxHjn/Jt9K+MeUq+kCns5ubkkdRx2EYsusB/JKyX2JdJ4w==}
/wrangler@3.66.0:
resolution: {integrity: sha512-5fEyXsP8qvrUeR13kCfA3OG1z/ABx+/a8hzIA55nCUM2/tjI67ZkfeN1VdOmG6cipZDvs4HfN8rp7j+e+21nKA==}
engines: {node: '>=16.17.0'}
hasBin: true
peerDependencies:
@@ -6185,6 +6185,7 @@ packages:
selfsigned: 2.4.1
source-map: 0.6.1
unenv: /unenv-nightly@1.10.0-1717606461.a117952
workerd: 1.20240718.0
xxhash-wasm: 1.0.2
optionalDependencies:
fsevents: 2.3.3
@@ -6259,8 +6260,8 @@ packages:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
dev: true
/yaml@2.4.5:
resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==}
/yaml@2.5.0:
resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==}
engines: {node: '>= 14'}
hasBin: true
dev: true
+9 -2
View File
@@ -123,7 +123,9 @@ function TextWrapper({
focused: Accessor<boolean>;
joined: string;
}) {
const seconds = joined.length * 2;
const p = createRWS(undefined as HTMLParagraphElement | undefined);
const seconds = createRWS(joined.length * 2);
const wasOnceOn = createRWS(false);
@@ -133,13 +135,18 @@ function TextWrapper({
}
});
onMount(() => {
seconds.set(Math.round(p()!.clientWidth / 20));
});
return (
<p
ref={p.set}
class="inline-block px-2 text-[5dvh] font-black uppercase leading-none"
style={{
...(wasOnceOn()
? {
animation: `marquee ${seconds}s linear infinite`,
animation: `marquee ${seconds()}s linear infinite`,
"animation-play-state":
focused() && mode.selected() === "Scroll"
? "running"
-38
View File
@@ -1,38 +0,0 @@
import { createResourceDataset } from "./resource";
export { averages } from "./consts/averages";
export function createScaleDatasets<Scale extends ResourceScale>({
scale,
groupedKeysToURLPath,
}: {
scale: Scale;
groupedKeysToURLPath: GroupedKeysToURLPath[Scale];
}) {
type Key = keyof typeof groupedKeysToURLPath;
type ResourceData = ReturnType<typeof createResourceDataset<Scale>>;
type ResourceDatasets = Record<Exclude<Key, "price">, ResourceData>;
const datasets = groupedKeysToURLPath as any as ResourceDatasets;
for (const key in groupedKeysToURLPath) {
if ((key as Key) !== "price") {
datasets[key as unknown as Exclude<Key, "price">] = createResourceDataset(
{
scale,
path: groupedKeysToURLPath[key as Key] as any,
},
);
}
}
const price = createResourceDataset<Scale, OHLC>({
scale,
path: `/${scale}-to-price`,
});
Object.assign(datasets, { price });
return datasets;
}
-36
View File
@@ -1,36 +0,0 @@
import { createResourceDataset } from "./resource";
export { averages } from "./consts/averages";
export function createDateDatasets({
groupedKeysToURLPath,
}: {
groupedKeysToURLPath: GroupedKeysToURLPath["date"];
}) {
type Key = keyof typeof groupedKeysToURLPath;
type ResourceData = ReturnType<typeof createResourceDataset<"date">>;
type ResourceDatasets = Record<Exclude<Key, "price">, ResourceData>;
const datasets = groupedKeysToURLPath as any as ResourceDatasets;
for (const key in groupedKeysToURLPath) {
if ((key as Key) !== "price") {
datasets[key as Exclude<Key, "price">] = createResourceDataset<"date">({
scale: "date",
path: groupedKeysToURLPath[key as Key],
});
}
}
const price = createResourceDataset<"date", OHLC>({
scale: "date",
path: "/date-to-price",
});
Object.assign(datasets, { price });
return datasets as ResourceDatasets & {
price: ResourceDataset<"date", OHLC>;
};
}
-34
View File
@@ -1,34 +0,0 @@
import { createResourceDataset } from "./resource";
export function createHeightDatasets({
groupedKeysToURLPath,
}: {
groupedKeysToURLPath: GroupedKeysToURLPath["height"];
}) {
type Key = keyof typeof groupedKeysToURLPath;
type ResourceData = ReturnType<typeof createResourceDataset<"height">>;
type ResourceDatasets = Record<Exclude<Key, "price">, ResourceData>;
const datasets = groupedKeysToURLPath as any as ResourceDatasets;
for (const key in groupedKeysToURLPath) {
if ((key as Key) !== "price") {
datasets[key as Exclude<Key, "price">] = createResourceDataset<"height">({
scale: "height",
path: groupedKeysToURLPath[key as Key],
});
}
}
const price = createResourceDataset<"height", OHLC>({
scale: "height",
path: "/height-to-price",
});
Object.assign(datasets, { price });
return datasets as ResourceDatasets & {
price: ResourceDataset<"height", OHLC>;
};
}
+2 -2
View File
@@ -5,8 +5,8 @@ export const scales = ["date" as const, "height" as const];
export const HEIGHT_CHUNK_SIZE = 10_000;
export function createDatasets() {
const date = new Map<DateDatasetPath, ResourceDataset<"date">>();
const height = new Map<HeightDatasetPath, ResourceDataset<"height">>();
const date = new Map<DatePath, ResourceDataset<"date">>();
const height = new Map<HeightPath, ResourceDataset<"height">>();
function getOrImport<Scale extends ResourceScale>(
scale: Scale,
+3 -12
View File
@@ -68,17 +68,8 @@ interface OHLC {
close: number;
}
type GroupedKeysToURLPath =
typeof import("/src/../../datasets/grouped_keys_to_url_path.json");
type DateDatasetPath = import("/src/../../datasets/paths").DatePath;
type HeightDatasetPath = import("/src/../../datasets/paths").HeightPath;
type LastDataPath = import("/src/../../datasets/paths").LastPath;
type DatasetPath<Scale extends ResourceScale> = Scale extends "date"
? DateDatasetPath
: HeightDatasetPath;
? DatePath
: HeightPath;
type AnyDatasetPath = DateDatasetPath | HeightDatasetPath;
type AnyDatasetPath = DatePath | HeightPath;
+1 -1
View File
@@ -18,7 +18,7 @@ export function createPresets(scale: ResourceScale) {
title: `Hodl Supply`,
description: "",
icon: IconTablerRipple,
unit: "Bitcoin",
unit: "Percentage",
bottom: [
{
title: `24h`,
@@ -1,4 +1,4 @@
import { averages } from "/src/scripts/datasets/date";
import { averages } from "/src/scripts/datasets/consts/averages";
import { colors } from "/src/scripts/utils/colors";
import { createRatioFolder } from "../../templates/ratio";
-8
View File
@@ -1,11 +1,3 @@
interface Dated {
date: string;
}
interface Heighted {
height: number;
}
interface Valued {
value: number;
}
+2
View File
@@ -8,7 +8,9 @@ flamegraph.svg
/profile.json
/inputs*/
/in
/outputs*/
/out
/snapshots*/
/exports*/
/imports*/
+21 -20
View File
@@ -73,26 +73,6 @@ pub fn iter_blocks(bitcoin_db: &BitcoinDB, block_count: usize) -> color_eyre::Re
let current_block_date = Date::from_timestamp(timestamp);
let current_block_height = height + blocks_loop_i;
if states.address_cohorts_durable_states.is_none()
&& datasets
.address
.needs_durable_states(current_block_height, current_block_date)
{
states.address_cohorts_durable_states =
Some(AddressCohortsDurableStates::init(
&mut databases.address_index_to_address_data,
));
}
if states.utxo_cohorts_durable_states.is_none()
&& datasets
.utxo
.needs_durable_states(current_block_height, current_block_date)
{
states.utxo_cohorts_durable_states =
Some(UTXOCohortsDurableStates::init(&states.date_data_vec));
}
let next_block_date = next_block_opt
.as_ref()
.map(|next_block| Date::from_timestamp(next_block.header.time));
@@ -137,6 +117,27 @@ pub fn iter_blocks(bitcoin_db: &BitcoinDB, block_count: usize) -> color_eyre::Re
blocks_loop_date,
);
if states.address_cohorts_durable_states.is_none()
&& (compute_addresses
|| datasets
.address
.needs_durable_states(current_block_height, current_block_date))
{
states.address_cohorts_durable_states =
Some(AddressCohortsDurableStates::init(
&mut databases.address_index_to_address_data,
));
}
if states.utxo_cohorts_durable_states.is_none()
&& datasets
.utxo
.needs_durable_states(current_block_height, current_block_date)
{
states.utxo_cohorts_durable_states =
Some(UTXOCohortsDurableStates::init(&states.date_data_vec));
}
parse(ParseData {
bitcoin_db,
block: current_block,
+7 -4
View File
@@ -277,13 +277,16 @@ impl AllDatasets {
let datasets_len = path_to_type.len();
Json::export("../datasets/disk_path_to_type.json", &path_to_type)?;
let server_inputs_path = "../server/in";
let server_trigger_path = "../server/.trigger";
fs::create_dir_all(server_inputs_path)?;
fs::create_dir_all(server_trigger_path)?;
Json::export(
&format!("{server_inputs_path}/disk_path_to_type.json"),
&path_to_type,
)?;
let datasets_len_path = format!("{server_trigger_path}/datasets_len.txt");
let datasets_len_path = format!("{server_inputs_path}/datasets_len.txt");
if let Ok(len) = fs::read_to_string(&datasets_len_path) {
if let Ok(len) = len.parse::<usize>() {
+76 -13
View File
@@ -26,6 +26,7 @@ pub struct PriceDatasets {
kraken_daily: Option<BTreeMap<Date, OHLC>>,
kraken_1mn: Option<BTreeMap<u32, OHLC>>,
binance_1mn: Option<BTreeMap<u32, OHLC>>,
binance_daily: Option<BTreeMap<Date, OHLC>>,
binance_har: Option<BTreeMap<u32, OHLC>>,
satonomics_by_height: BTreeMap<HeightMapChunkId, Vec<OHLC>>,
satonomics_by_date: BTreeMap<DateMapChunkId, BTreeMap<Date, OHLC>>,
@@ -89,6 +90,7 @@ impl PriceDatasets {
min_initial_states: MinInitialStates::default(),
binance_1mn: None,
binance_daily: None,
binance_har: None,
kraken_1mn: None,
kraken_daily: None,
@@ -310,8 +312,9 @@ impl PriceDatasets {
Ok(self.ohlcs.date.get(&date).unwrap().to_owned())
} else {
let ohlc = self
.get_from_date_satonomics(&date)
.or_else(|_| self.get_from_daily_kraken(&date))?;
.get_from_daily_kraken(&date)
.or_else(|_| self.get_from_daily_binance(&date))
.or_else(|_| self.get_from_date_satonomics(&date))?;
self.ohlcs.date.insert(date, ohlc);
@@ -323,7 +326,16 @@ impl PriceDatasets {
let chunk_id = date.to_chunk_id();
#[allow(clippy::map_entry)]
if !self.satonomics_by_date.contains_key(&chunk_id) {
if !self.satonomics_by_date.contains_key(&chunk_id)
|| self
.satonomics_by_date
.get(&chunk_id)
.unwrap()
.last_key_value()
.unwrap()
.0
<= date
{
self.satonomics_by_date
.insert(chunk_id, Satonomics::fetch_date_prices(chunk_id)?);
}
@@ -337,9 +349,17 @@ impl PriceDatasets {
}
fn get_from_daily_kraken(&mut self, date: &Date) -> color_eyre::Result<OHLC> {
if self.kraken_daily.is_none() {
self.kraken_daily
.replace(Kraken::fetch_daily_prices().or_else(|_| Binance::fetch_daily_prices())?);
if self.kraken_daily.is_none()
|| self
.kraken_daily
.as_ref()
.unwrap()
.last_key_value()
.unwrap()
.0
<= date
{
self.kraken_daily.replace(Kraken::fetch_daily_prices()?);
}
self.kraken_daily
@@ -350,6 +370,28 @@ impl PriceDatasets {
.ok_or(Error::msg("Couldn't find date"))
}
fn get_from_daily_binance(&mut self, date: &Date) -> color_eyre::Result<OHLC> {
if self.binance_daily.is_none()
|| self
.binance_daily
.as_ref()
.unwrap()
.last_key_value()
.unwrap()
.0
<= date
{
self.binance_daily.replace(Binance::fetch_daily_prices()?);
}
self.binance_daily
.as_ref()
.unwrap()
.get(date)
.cloned()
.ok_or(Error::msg("Couldn't find date"))
}
pub fn get_height_ohlc(
&mut self,
height: Height,
@@ -380,13 +422,13 @@ impl PriceDatasets {
let previous_timestamp = previous_timestamp.map(clean_timestamp);
let ohlc = self
.get_from_height_satonomics(&height)
.get_from_1mn_kraken(timestamp, previous_timestamp)
.unwrap_or_else(|_| {
self.get_from_1mn_kraken(timestamp, previous_timestamp)
self.get_from_1mn_binance(timestamp, previous_timestamp)
.unwrap_or_else(|_| {
self.get_from_1mn_binance(timestamp, previous_timestamp)
self.get_from_har_binance(timestamp, previous_timestamp)
.unwrap_or_else(|_| {
self.get_from_har_binance(timestamp, previous_timestamp)
self.get_from_height_satonomics(&height)
.unwrap_or_else(|_| {
let date = Date::from_timestamp(timestamp);
@@ -419,7 +461,10 @@ How to fix this:
let chunk_id = height.to_chunk_id();
#[allow(clippy::map_entry)]
if !self.satonomics_by_height.contains_key(&chunk_id) {
if !self.satonomics_by_height.contains_key(&chunk_id)
|| ((chunk_id.to_usize() + self.satonomics_by_height.get(&chunk_id).unwrap().len())
<= height.to_usize())
{
self.satonomics_by_height
.insert(chunk_id, Satonomics::fetch_height_prices(chunk_id)?);
}
@@ -437,7 +482,16 @@ How to fix this:
timestamp: u32,
previous_timestamp: Option<u32>,
) -> color_eyre::Result<OHLC> {
if self.kraken_1mn.is_none() {
if self.kraken_1mn.is_none()
|| self
.kraken_1mn
.as_ref()
.unwrap()
.last_key_value()
.unwrap()
.0
<= &timestamp
{
self.kraken_1mn.replace(Kraken::fetch_1mn_prices()?);
}
@@ -449,7 +503,16 @@ How to fix this:
timestamp: u32,
previous_timestamp: Option<u32>,
) -> color_eyre::Result<OHLC> {
if self.binance_1mn.is_none() {
if self.binance_1mn.is_none()
|| self
.binance_1mn
.as_ref()
.unwrap()
.last_key_value()
.unwrap()
.0
<= &timestamp
{
self.binance_1mn.replace(Binance::fetch_1mn_prices()?);
}
+1 -1
View File
@@ -1,2 +1,2 @@
pub const IMPORTS_FOLDER_PATH: &str = "./imports";
pub const INPUTS_FOLDER_PATH: &str = "./in";
pub const OUTPUTS_FOLDER_PATH: &str = "./target/outputs";
+6 -4
View File
@@ -1,6 +1,6 @@
#![allow(dead_code)]
use std::{collections::BTreeMap, path::Path};
use std::{collections::BTreeMap, fs, path::Path};
use color_eyre::eyre::ContextCompat;
use itertools::Itertools;
@@ -8,7 +8,7 @@ use serde_json::Value;
use crate::{
datasets::OHLC,
io::{Json, IMPORTS_FOLDER_PATH},
io::{Json, INPUTS_FOLDER_PATH},
structs::Date,
utils::{log, retry},
};
@@ -19,7 +19,9 @@ impl Binance {
pub fn read_har_file() -> color_eyre::Result<BTreeMap<u32, OHLC>> {
log("binance: read har file");
let path_binance_har = Path::new(IMPORTS_FOLDER_PATH).join("binance.har");
fs::create_dir_all(INPUTS_FOLDER_PATH)?;
let path_binance_har = Path::new(INPUTS_FOLDER_PATH).join("binance.har");
let json: BTreeMap<String, Value> =
Json::import(path_binance_har.to_str().unwrap()).unwrap_or_default();
@@ -195,7 +197,7 @@ impl Binance {
.collect::<BTreeMap<_, _>>())
},
10,
5,
10,
)
}
}
+2 -2
View File
@@ -62,7 +62,7 @@ impl Kraken {
.collect::<BTreeMap<_, _>>())
},
10,
5,
10,
)
}
@@ -117,7 +117,7 @@ impl Kraken {
.collect::<BTreeMap<_, _>>())
},
10,
5,
10,
)
}
}
+5 -5
View File
@@ -21,11 +21,11 @@ const RETRIES: usize = 10;
impl Satonomics {
fn get_base_url(try_index: usize) -> &'static str {
if try_index < RETRIES / 2 {
SATONOMICS_OFFICIAL_URL
} else {
SATONOMICS_OFFICIAL_BACKUP_URL
}
// if try_index < RETRIES / 2 {
SATONOMICS_OFFICIAL_URL
// } else {
// SATONOMICS_OFFICIAL_BACKUP_URL
// }
}
pub fn fetch_height_prices(chunk_id: HeightMapChunkId) -> color_eyre::Result<Vec<OHLC>> {
+1 -1
View File
@@ -1,4 +1,4 @@
/target
.DS_Store
/parser.log
.trigger
/in
+1 -1
View File
@@ -1,5 +1,5 @@
if cargo watch --help &> /dev/null; then
cargo watch --no-vcs-ignores -w "./src" -w "./run.sh" -w ".trigger" -x "run -r"
cargo watch --no-vcs-ignores -w "./src" -w "./run.sh" -w "./in/datasets_len.txt" -x "run -r"
else
cargo run -r
fi
+1 -1
View File
@@ -38,7 +38,7 @@ async fn main() -> color_eyre::Result<()> {
let routes = Routes::build();
routes.generate_front_end_files();
routes.generate_dts_file();
let state = AppState {
routes: Arc::new(routes),
+6 -33
View File
@@ -20,12 +20,13 @@ pub struct Route {
#[derive(Clone, Default, Deref, DerefMut)]
pub struct Routes(pub Grouped<HashMap<String, Route>>);
const DATASETS_PATH: &str = "../datasets";
const INPUTS_PATH: &str = "./in";
const APP_TYPES_PATH: &str = "../app/src/types";
impl Routes {
pub fn build() -> Self {
let path_to_type: BTreeMap<String, String> =
Json::import(&format!("{DATASETS_PATH}/disk_path_to_type.json")).unwrap();
Json::import(&format!("{INPUTS_PATH}/disk_path_to_type.json")).unwrap();
let mut routes = Routes::default();
@@ -99,42 +100,14 @@ impl Routes {
routes
}
pub fn generate_front_end_files(&self) {
self.generate_json_group_files();
self.generate_definition_files();
}
fn generate_json_group_files(&self) {
let map_to_group = |map: &HashMap<String, Route>| -> BTreeMap<String, String> {
map.iter()
.map(|(key, route)| (key.to_owned(), route.url_path.to_owned()))
.collect()
};
let date_group = map_to_group(&self.date);
let height_group = map_to_group(&self.height);
let last_group = map_to_group(&self.last);
let groups = Paths(Grouped {
date: date_group,
height: height_group,
last: last_group,
});
let _ = Json::export(
&format!("{DATASETS_PATH}/grouped_keys_to_url_path.json"),
&groups,
);
}
fn generate_definition_files(&self) {
pub fn generate_dts_file(&self) {
let map_to_type = |name: &str, map: &HashMap<String, Route>| -> String {
let paths = map
.values()
.map(|route| format!("\"{}\"", route.url_path))
.join(" | ");
format!("export type {}Path = {};\n", name, paths)
format!("type {}Path = {};\n", name, paths)
};
let date_type = map_to_type("Date", &self.date);
@@ -144,7 +117,7 @@ impl Routes {
let last_type = map_to_type("Last", &self.last);
fs::write(
format!("{DATASETS_PATH}/paths.d.ts"),
format!("{APP_TYPES_PATH}/paths.d.ts"),
format!("{date_type}\n{height_type}\n{last_type}"),
)
.unwrap();