From df004820a5784ea9b378f2173982d9bbbae187eb Mon Sep 17 00:00:00 2001 From: AzenKain Date: Tue, 22 Jul 2025 11:26:14 +0700 Subject: [PATCH] init --- .gitea/workflows/build.yml | 25 + .gitignore | 35 + Dockerfile | 9 + README.md | 73 ++ bun.lock | 223 +++++ cache.json | 1646 ++++++++++++++++++++++++++++++++++++ docker-compose.yml | 15 + package.json | 21 + rpcChecker.ts | 75 ++ server.ts | 60 ++ tsconfig.json | 28 + 11 files changed, 2210 insertions(+) create mode 100644 .gitea/workflows/build.yml create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 bun.lock create mode 100644 cache.json create mode 100644 docker-compose.yml create mode 100644 package.json create mode 100644 rpcChecker.ts create mode 100644 server.ts create mode 100644 tsconfig.json diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml new file mode 100644 index 0000000..6181b12 --- /dev/null +++ b/.gitea/workflows/build.yml @@ -0,0 +1,25 @@ +name: Gitea Auto Deploy +run-name: ${{ gitea.actor }} pushed code 🚀 + +on: [push] + +jobs: + Deploy-Container: + runs-on: ubuntu-latest + + steps: + - name: Check out latest code + uses: actions/checkout@v4 + + - name: Stop and remove old containers + run: | + docker compose down || true + + - name: Remove unused Docker resources + run: | + docker system prune -a --volumes -f + + - name: Build and restart containers + run: | + docker compose pull + docker compose up -d --build \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c9f96e8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +# dependencies (bun install) +node_modules + +# output +.history/ +out +dist +*.tgz + +# code coverage +coverage +*.lcov + +# logs +logs +_.log +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# caches +.eslintcache +.cache +*.tsbuildinfo + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4eb4da8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM oven/bun:canary-alpine AS base + +WORKDIR /app + +COPY . . + +RUN bun install + +CMD ["bun", "server.ts"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..9895cc7 --- /dev/null +++ b/README.md @@ -0,0 +1,73 @@ +Dưới đây là phiên bản đã được chỉnh sửa và hoàn chỉnh hơn của README: + +--- + +# 🚀 rpc-check + +A simple Bun-powered server to check the availability of Cosmos-style RPC endpoints via JSON-RPC `status` requests. + +## 📦 Install dependencies + +```bash +bun install +``` + +## ▶️ Run the server + +```bash +bun run start +``` + +This will start an Express server (default port: `3344`) with a `/rpc-check` POST endpoint. + +## 📮 API Usage + +**Endpoint:** `POST /rpc-check` +**Content-Type:** `application/json` + +### Request body: + +```json +{ + "chains": ["namada"] +} +``` + +### Response: + +```json +{ + "namada": [ + { + "chain": "namada", + "url": "https://rpc.namada.validatus.com", + "latency": 710, + "status": "OK" + }, + { + "chain": "namada", + "url": "https://namada.itudou.xyz", + "latency": 718, + "status": "OK" + }, + { + "chain": "namada", + "url": "https://rpc.namada.stakepool.dev.br", + "latency": null, + "status": "FAIL", + "message": "timeout of 5000ms exceeded" + } + ] +} +``` + +## 🛠 Built with + +* [Bun](https://bun.sh) v1.2.11 — Fast all-in-one JS runtime +* Express — For routing and JSON handling +* Axios — For sending JSON-RPC requests +* CORS — Enabled for all origins + +--- + +Let me know if bạn cần thêm hướng dẫn Docker hoặc ví dụ cURL test nhé. diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..e1bb529 --- /dev/null +++ b/bun.lock @@ -0,0 +1,223 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "rpc-check", + "dependencies": { + "axios": "^1.10.0", + "chain-registry": "^2.0.28", + "cors": "^2.8.5", + "express": "^5.1.0", + }, + "devDependencies": { + "@types/bun": "latest", + "@types/cors": "^2.8.19", + "@types/express": "^5.0.3", + }, + "peerDependencies": { + "typescript": "^5", + }, + }, + }, + "packages": { + "@chain-registry/types": ["@chain-registry/types@2.0.28", "", {}, "sha512-o8SKdXEj40HtjF6erOikpn8nj7lOO7/peU5tKK62JjCv2BtMnlxuCeU5q/GmjLZwhRQ93u3/AHtU892DPIA3IA=="], + + "@types/body-parser": ["@types/body-parser@1.19.6", "", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g=="], + + "@types/bun": ["@types/bun@1.2.19", "", { "dependencies": { "bun-types": "1.2.19" } }, "sha512-d9ZCmrH3CJ2uYKXQIUuZ/pUnTqIvLDS0SK7pFmbx8ma+ziH/FRMoAq5bYpRG7y+w1gl+HgyNZbtqgMq4W4e2Lg=="], + + "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], + + "@types/cors": ["@types/cors@2.8.19", "", { "dependencies": { "@types/node": "*" } }, "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg=="], + + "@types/express": ["@types/express@5.0.3", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^5.0.0", "@types/serve-static": "*" } }, "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw=="], + + "@types/express-serve-static-core": ["@types/express-serve-static-core@5.0.7", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ=="], + + "@types/http-errors": ["@types/http-errors@2.0.5", "", {}, "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg=="], + + "@types/mime": ["@types/mime@1.3.5", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="], + + "@types/node": ["@types/node@24.0.15", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-oaeTSbCef7U/z7rDeJA138xpG3NuKc64/rZ2qmUFkFJmnMsAPaluIifqyWd8hSSMxyP9oie3dLAqYPblag9KgA=="], + + "@types/qs": ["@types/qs@6.14.0", "", {}, "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ=="], + + "@types/range-parser": ["@types/range-parser@1.2.7", "", {}, "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="], + + "@types/react": ["@types/react@19.1.8", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g=="], + + "@types/send": ["@types/send@0.17.5", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w=="], + + "@types/serve-static": ["@types/serve-static@1.15.8", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "*" } }, "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg=="], + + "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "axios": ["axios@1.10.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw=="], + + "body-parser": ["body-parser@2.2.0", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.0", "http-errors": "^2.0.0", "iconv-lite": "^0.6.3", "on-finished": "^2.4.1", "qs": "^6.14.0", "raw-body": "^3.0.0", "type-is": "^2.0.0" } }, "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg=="], + + "bun-types": ["bun-types@1.2.19", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-uAOTaZSPuYsWIXRpj7o56Let0g/wjihKCkeRqUBhlLVM/Bt+Fj9xTo+LhC1OV1XDaGkz4hNC80et5xgy+9KTHQ=="], + + "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "chain-registry": ["chain-registry@2.0.28", "", { "dependencies": { "@chain-registry/types": "^2.0.28" } }, "sha512-+QggaB7fpB+bpgo/CCa1CMZooLqRDq24k25adXAFar7dOTFIGEE+9DC8BWChCtJngCz8fV093uCsEcFhOXJf4g=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "content-disposition": ["content-disposition@1.0.0", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg=="], + + "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + + "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], + + "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], + + "cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "express": ["express@5.1.0", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA=="], + + "finalhandler": ["finalhandler@2.1.0", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q=="], + + "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], + + "form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], + + "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + + "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + + "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + + "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], + + "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], + + "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "path-to-regexp": ["path-to-regexp@8.2.0", "", {}, "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ=="], + + "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + + "qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], + + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "raw-body": ["raw-body@3.0.0", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.6.3", "unpipe": "1.0.0" } }, "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g=="], + + "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "send": ["send@1.2.0", "", { "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.0", "mime-types": "^3.0.1", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.1" } }, "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw=="], + + "serve-static": ["serve-static@2.2.0", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], + + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "http-errors/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + } +} diff --git a/cache.json b/cache.json new file mode 100644 index 0000000..063c01a --- /dev/null +++ b/cache.json @@ -0,0 +1,1646 @@ +{ + "ethereum": [], + "namada": [ + { + "chain": "namada", + "url": "https://rpc.namada.validatus.com", + "latency": 710, + "status": "OK" + }, + { + "chain": "namada", + "url": "https://namada.itudou.xyz", + "latency": 718, + "status": "OK" + }, + { + "chain": "namada", + "url": "https://namada-main.stakesystems.io", + "latency": 729, + "status": "OK" + }, + { + "chain": "namada", + "url": "https://namada.rpc.decentrio.ventures", + "latency": 746, + "status": "OK" + }, + { + "chain": "namada", + "url": "https://rpc.papadritta.com", + "latency": 757, + "status": "OK" + }, + { + "chain": "namada", + "url": "https://namada-mainnet-rpc.itrocket.net", + "latency": 814, + "status": "OK" + }, + { + "chain": "namada", + "url": "https://rpc-namada.5elementsnodes.com", + "latency": 835, + "status": "OK" + }, + { + "chain": "namada", + "url": "https://namada.loserboy.xyz", + "latency": 899, + "status": "OK" + }, + { + "chain": "namada", + "url": "https://namada-rpc.mandragora.io", + "latency": 928, + "status": "OK" + }, + { + "chain": "namada", + "url": "https://namada-rpc.zenode.app", + "latency": 945, + "status": "OK" + }, + { + "chain": "namada", + "url": "https://rpc.namada.tududes.com", + "latency": 953, + "status": "OK" + }, + { + "chain": "namada", + "url": "https://namada-mainnet.rpc.l0vd.com:443", + "latency": 1047, + "status": "OK" + }, + { + "chain": "namada", + "url": "https://namada-rpc.synergynodes.com", + "latency": 1110, + "status": "OK" + }, + { + "chain": "namada", + "url": "https://rpc.namadascan.io", + "latency": 1155, + "status": "OK" + }, + { + "chain": "namada", + "url": "https://namada-rpc.sproutstake.space", + "latency": 1168, + "status": "OK" + }, + { + "chain": "namada", + "url": "https://namadam.powerstaking.tech", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 502" + }, + { + "chain": "namada", + "url": "https://rpc.namada.stakepool.dev.br", + "latency": null, + "status": "FAIL", + "message": "timeout of 5000ms exceeded" + } + ], + "rootstock": [], + "solana": [], + "ton": [], + "tron": [], + "aaronetwork": [ + { + "chain": "aaronetwork", + "url": "https://mainnet-rpc.aaronetwork.xyz", + "latency": 510, + "status": "OK" + }, + { + "chain": "aaronetwork", + "url": "https://rpc-aaronetwork.sychonix.com/", + "latency": 693, + "status": "OK" + }, + { + "chain": "aaronetwork", + "url": "https://rpc-aaronetwork.vinjan.xyz/", + "latency": 716, + "status": "OK" + }, + { + "chain": "aaronetwork", + "url": "https://aaronetwork_mainnet_rpc.chain.whenmoonwhenlambo.money", + "latency": 1083, + "status": "OK" + }, + { + "chain": "aaronetwork", + "url": "https://rpc.aaronetwork.indonode.net", + "latency": null, + "status": "FAIL", + "message": "timeout of 5000ms exceeded" + } + ], + "acrechain": [ + { + "chain": "acrechain", + "url": "https://rpc-acre.synergynodes.com", + "latency": 1057, + "status": "OK" + }, + { + "chain": "acrechain", + "url": "https://acred-rpc.staketab.org:443", + "latency": 1300, + "status": "OK" + }, + { + "chain": "acrechain", + "url": "https://acrechain-mainnet-rpc.autostake.com:443", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 404" + }, + { + "chain": "acrechain", + "url": "https://rpc.acre.tcnetwork.io", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "acrechain", + "url": "https://mainnet-acre-rpc.konsortech.xyz", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + } + ], + "agoric": [ + { + "chain": "agoric", + "url": "https://agoric-rpc.polkachu.com", + "latency": 612, + "status": "OK" + }, + { + "chain": "agoric", + "url": "https://rpc.agoric.stakewith.us", + "latency": 706, + "status": "OK" + }, + { + "chain": "agoric", + "url": "https://agoric-rpc.w3coins.io", + "latency": 757, + "status": "OK" + }, + { + "chain": "agoric", + "url": "https://rpc.agoric.bronbro.io:443", + "latency": 774, + "status": "OK" + }, + { + "chain": "agoric", + "url": "https://main.rpc.agoric.net:443", + "latency": 815, + "status": "OK" + }, + { + "chain": "agoric", + "url": "https://rpc-agoric-01.stakeflow.io", + "latency": 850, + "status": "OK" + }, + { + "chain": "agoric", + "url": "https://agoric-rpc.stakeandrelax.net", + "latency": 868, + "status": "OK" + }, + { + "chain": "agoric", + "url": "https://agoric.rpc.kjnodes.com", + "latency": 884, + "status": "OK" + }, + { + "chain": "agoric", + "url": "https://agoric-rpc.stakeangle.com", + "latency": 1202, + "status": "OK" + }, + { + "chain": "agoric", + "url": "https://agoric-mainnet-rpc.autostake.com:443", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 404" + }, + { + "chain": "agoric", + "url": "https://agoric-rpc.0base.dev", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "agoric", + "url": "https://rpc-agoric-ia.cosmosia.notional.ventures", + "latency": null, + "status": "FAIL", + "message": "timeout of 5000ms exceeded" + } + ], + "aioz": [ + { + "chain": "aioz", + "url": "https://rpc-dataseed.aioz.network:443", + "latency": 382, + "status": "OK" + } + ], + "akash": [ + { + "chain": "akash", + "url": "https://akash-rpc.polkachu.com", + "latency": 562, + "status": "OK" + }, + { + "chain": "akash", + "url": "https://akash-rpc.w3coins.io", + "latency": 606, + "status": "OK" + }, + { + "chain": "akash", + "url": "https://akash-mainnet-rpc.cosmonautstakes.com:443", + "latency": 697, + "status": "OK" + }, + { + "chain": "akash", + "url": "https://akash-rpc.publicnode.com:443", + "latency": 784, + "status": "OK" + }, + { + "chain": "akash", + "url": "https://rpc-akash.ecostake.com:443", + "latency": 880, + "status": "OK" + }, + { + "chain": "akash", + "url": "https://akash.rpc.arcturian.tech/", + "latency": 1180, + "status": "OK" + }, + { + "chain": "akash", + "url": "https://akash-rpc.kleomedes.network", + "latency": 1364, + "status": "OK" + } + ], + "allora": [ + { + "chain": "allora", + "url": "https://allora-rpc.mainnet.allora.network", + "latency": 975, + "status": "OK" + } + ], + "althea": [ + { + "chain": "althea", + "url": "https://rpc.lavenderfive.com:443/althea", + "latency": 725, + "status": "OK" + }, + { + "chain": "althea", + "url": "https://althea.rpc.m.stavr.tech", + "latency": 755, + "status": "OK" + }, + { + "chain": "althea", + "url": "https://nodes.chandrastation.com/rpc/althea/", + "latency": 839, + "status": "OK" + }, + { + "chain": "althea", + "url": "https://althea_mainnet_rpc.chain.whenmoonwhenlambo.money", + "latency": 1078, + "status": "OK" + } + ], + "andromeda": [ + { + "chain": "andromeda", + "url": "https://rpc.lavenderfive.com:443/andromeda", + "latency": 241, + "status": "OK" + }, + { + "chain": "andromeda", + "url": "https://andromeda.rpc.liveraven.net", + "latency": 710, + "status": "OK" + }, + { + "chain": "andromeda", + "url": "https://andro.rpc.m.stavr.tech/", + "latency": 761, + "status": "OK" + }, + { + "chain": "andromeda", + "url": "https://andromeda-rpc.stakerhouse.com:443", + "latency": 1387, + "status": "OK" + }, + { + "chain": "andromeda", + "url": "https://rpc.andromeda-1.andromeda.aviaone.com", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "andromeda", + "url": "https://andromeda.rpc.kjnodes.com", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 503" + }, + { + "chain": "andromeda", + "url": "https://andromeda.rpc.nodex.one", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 503" + }, + { + "chain": "andromeda", + "url": "https://andromeda-mainnet-rpc.autostake.com:443", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 404" + }, + { + "chain": "andromeda", + "url": "https://andromeda-rpc.highstakes.ch", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "andromeda", + "url": "https://andromeda-rpc.genznodes.dev", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "andromeda", + "url": "https://andromeda.rpc.kjnodes.com", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 503" + }, + { + "chain": "andromeda", + "url": "andromeda-rpc.noders.services", + "latency": null, + "status": "FAIL", + "message": "\"andromeda-rpc.noders.services/status\" cannot be parsed as a URL." + } + ], + "archway": [ + { + "chain": "archway", + "url": "https://rpc-archway.mzonder.com", + "latency": 185, + "status": "OK" + }, + { + "chain": "archway", + "url": "https://rpc.lavenderfive.com:443/archway", + "latency": 276, + "status": "OK" + }, + { + "chain": "archway", + "url": "https://rpc.mainnet.archway.io", + "latency": 597, + "status": "OK" + }, + { + "chain": "archway", + "url": "https://archway-rpc.0base.dev", + "latency": 769, + "status": "OK" + }, + { + "chain": "archway", + "url": "https://rpc-1.archway.nodes.guru", + "latency": 838, + "status": "OK" + }, + { + "chain": "archway", + "url": "https://archway.rpc.kjnodes.com", + "latency": 857, + "status": "OK" + }, + { + "chain": "archway", + "url": "https://rpc-archway.mzonder.com", + "latency": 919, + "status": "OK" + }, + { + "chain": "archway", + "url": "https://rpc.archway.stakeup.tech", + "latency": 951, + "status": "OK" + }, + { + "chain": "archway", + "url": "https://rpc-archway.theamsolutions.info", + "latency": 1102, + "status": "OK" + }, + { + "chain": "archway", + "url": "https://rpc-archway.luckyfriday.io/", + "latency": 1787, + "status": "OK" + }, + { + "chain": "archway", + "url": "https://archway-mainnet-archive.allthatnode.com:26657", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "archway", + "url": "https://m-archway.rpc.utsa.tech", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "archway", + "url": "https://archway.rpc.silknodes.io/", + "latency": null, + "status": "FAIL", + "message": "timeout of 5000ms exceeded" + }, + { + "chain": "archway", + "url": "https://rpc-archway.cryptech.com.ua", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "archway", + "url": "https://archway-rpc.w3coins.io", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 502" + }, + { + "chain": "archway", + "url": "https://m-archway.rpc.utsa.tech", + "latency": null, + "status": "FAIL", + "message": "Was there a typo in the url or port?" + }, + { + "chain": "archway", + "url": "https://rpc-archway.mms.team", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "archway", + "url": "https://rpc.archway.lgns.net", + "latency": null, + "status": "FAIL", + "message": "timeout of 5000ms exceeded" + }, + { + "chain": "archway", + "url": "https://archway-rpc.stake-town.com", + "latency": null, + "status": "FAIL", + "message": "timeout of 5000ms exceeded" + }, + { + "chain": "archway", + "url": "https://archway-mainnet.rpc.l0vd.com", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 502" + }, + { + "chain": "archway", + "url": "https://archway-rpc.openbitlab.com", + "latency": null, + "status": "FAIL", + "message": "ERR_TLS_CERT_ALTNAME_INVALID fetching \"https://archway-rpc.openbitlab.com/status\". For more information, pass `verbose: true` in the second argument to fetch()" + }, + { + "chain": "archway", + "url": "https://rpc-archway.mainnet.validatrium.club", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "archway", + "url": "https://archway-rpc.stakeandrelax.net", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 502" + }, + { + "chain": "archway", + "url": "https://rpc.archway.bronbro.io:443", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "archway", + "url": "https://archway-rpc.noders.services", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "archway", + "url": "https://archway-rpc.chainroot.io", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 521" + } + ], + "arkeo": [ + { + "chain": "arkeo", + "url": "https://rpc-seed.arkeo.network", + "latency": 705, + "status": "OK" + }, + { + "chain": "arkeo", + "url": "https://arkeo_mainnet_rpc.chain.whenmoonwhenlambo.money", + "latency": 1085, + "status": "OK" + }, + { + "chain": "arkeo", + "url": "https://rpc.arkeo.roomit.xyz", + "latency": 1211, + "status": "OK" + }, + { + "chain": "arkeo", + "url": "https://rpc.arkeo.nodestake.org", + "latency": 2006, + "status": "OK" + }, + { + "chain": "arkeo", + "url": "https://arkeo-mainnet-rpc.autostake.com:443", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 404" + } + ], + "arkh": [ + { + "chain": "arkh", + "url": "https://arkhadian-mainnet-rpc.bonynode.online/", + "latency": 869, + "status": "OK" + }, + { + "chain": "arkh", + "url": "http://arkh.rpc.wellnode.net:26657/", + "latency": 1203, + "status": "OK" + } + ], + "assetmantle": [ + { + "chain": "assetmantle", + "url": "https://assetmantle-rpc.polkachu.com", + "latency": 565, + "status": "OK" + }, + { + "chain": "assetmantle", + "url": "https://assetmantle-rpc.publicnode.com:443", + "latency": 784, + "status": "OK" + }, + { + "chain": "assetmantle", + "url": "https://assetmantle-rpc.stakerhouse.com", + "latency": 1095, + "status": "OK" + }, + { + "chain": "assetmantle", + "url": "https://rpc.assetmantle.one", + "latency": 1714, + "status": "OK" + }, + { + "chain": "assetmantle", + "url": "https://rpc-assetmantle-ia.cosmosia.notional.ventures/", + "latency": null, + "status": "FAIL", + "message": "timeout of 5000ms exceeded" + }, + { + "chain": "assetmantle", + "url": "https://rpc.mantle.paranorm.pro:443", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + } + ], + "atomone": [ + { + "chain": "atomone", + "url": "https://rpc-atomone.nodeist.net", + "latency": 662, + "status": "OK" + }, + { + "chain": "atomone", + "url": "https://atomone-mainnet-rpc.shazoes.xyz", + "latency": 662, + "status": "OK" + }, + { + "chain": "atomone", + "url": "https://rpc.atomone-1.atomone.aviaone.com:443", + "latency": 678, + "status": "OK" + }, + { + "chain": "atomone", + "url": "https://rpc-atone.vinjan.xyz", + "latency": 725, + "status": "OK" + }, + { + "chain": "atomone", + "url": "https://atomone-rpc.publicnode.com:443", + "latency": 729, + "status": "OK" + }, + { + "chain": "atomone", + "url": "https://atomone.rpc.m.stavr.tech:443", + "latency": 738, + "status": "OK" + }, + { + "chain": "atomone", + "url": "https://rpc-atomone.ecostake.com", + "latency": 772, + "status": "OK" + }, + { + "chain": "atomone", + "url": "https://m-atomone.rpc.utsa.tech/", + "latency": 776, + "status": "OK" + }, + { + "chain": "atomone", + "url": "https://atomone-mainnet-rpc.itrocket.net:443", + "latency": 786, + "status": "OK" + }, + { + "chain": "atomone", + "url": "https://rpc.atomone.roomit.xyz", + "latency": 817, + "status": "OK" + }, + { + "chain": "atomone", + "url": "https://community.nuxian-node.ch:6797/atomone/trpc", + "latency": 831, + "status": "OK" + }, + { + "chain": "atomone", + "url": "https://rpc.atomone.citizenweb3.com:443", + "latency": 841, + "status": "OK" + }, + { + "chain": "atomone", + "url": "https://atomone-rpc.allinbits.com:443", + "latency": 1023, + "status": "OK" + }, + { + "chain": "atomone", + "url": "https://atomone_mainnet_rpc.chain.whenmoonwhenlambo.money", + "latency": 1049, + "status": "OK" + }, + { + "chain": "atomone", + "url": "https://rpc-atomone-1.cros-nest.com:443", + "latency": 1093, + "status": "OK" + }, + { + "chain": "atomone", + "url": "https://atomone-rpc.ibs.team:443", + "latency": 1112, + "status": "OK" + }, + { + "chain": "atomone", + "url": "https://atomone.rpc.nodeshub.online:443", + "latency": 1199, + "status": "OK" + }, + { + "chain": "atomone", + "url": "https://atomone-mainnet-rpc.bonynode.online", + "latency": 1210, + "status": "OK" + }, + { + "chain": "atomone", + "url": "https://rpc.atomone.chaintools.tech", + "latency": 1425, + "status": "OK" + }, + { + "chain": "atomone", + "url": "https://atomone-rpc.cogwheel.zone", + "latency": null, + "status": "FAIL", + "message": "timeout of 5000ms exceeded" + }, + { + "chain": "atomone", + "url": "https://atomone-mainnet-rpc.autostake.com:443", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 404" + } + ], + "aura": [ + { + "chain": "aura", + "url": "https://rpc.aura.network/", + "latency": 229, + "status": "OK" + }, + { + "chain": "aura", + "url": "https://rpc.lavenderfive.com:443/aura", + "latency": 239, + "status": "OK" + }, + { + "chain": "aura", + "url": "https://m-aura.rpc.utsa.tech", + "latency": 771, + "status": "OK" + }, + { + "chain": "aura", + "url": "https://aura-rpc.stake-town.com", + "latency": 820, + "status": "OK" + }, + { + "chain": "aura", + "url": "https://aura-rpc.noders.services", + "latency": 877, + "status": "OK" + }, + { + "chain": "aura", + "url": "https://mainnet-aura-rpc.konsortech.xyz", + "latency": 925, + "status": "OK" + }, + { + "chain": "aura", + "url": "https://rpc.aura.silentvalidator.com", + "latency": 992, + "status": "OK" + }, + { + "chain": "aura", + "url": "https://aura-rpc.staketab.org:443", + "latency": 1249, + "status": "OK" + }, + { + "chain": "aura", + "url": "http://aura.rpc.m.stavr.tech:11047", + "latency": 1558, + "status": "OK" + }, + { + "chain": "aura", + "url": "https://aura.rpc.srv.stakr.space", + "latency": 1653, + "status": "OK" + }, + { + "chain": "aura", + "url": "https://aura-rpc.ramuchi.tech", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "aura", + "url": "https://aura.rpc.kjnodes.com", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 503" + }, + { + "chain": "aura", + "url": "https://rpc-aura.mms.team", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "aura", + "url": "https://aura-rpc.palamar.io", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "aura", + "url": "https://aura-rpc.highstakes.ch", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 502" + } + ], + "axelar": [ + { + "chain": "axelar", + "url": "https://rpc.axelar.bh.rocks", + "latency": 665, + "status": "OK" + }, + { + "chain": "axelar", + "url": "https://axelar-rpc.polkachu.com", + "latency": 713, + "status": "OK" + }, + { + "chain": "axelar", + "url": "https://rpc-1.axelar.nodes.guru:443", + "latency": 733, + "status": "OK" + }, + { + "chain": "axelar", + "url": "https://axelar-rpc.publicnode.com:443", + "latency": 736, + "status": "OK" + }, + { + "chain": "axelar", + "url": "https://rpc-axelar.imperator.co:443", + "latency": 743, + "status": "OK" + }, + { + "chain": "axelar", + "url": "https://axelar-rpc.pops.one:443", + "latency": 768, + "status": "OK" + }, + { + "chain": "axelar", + "url": "https://rpc-axelar-01.stakeflow.io", + "latency": 843, + "status": "OK" + }, + { + "chain": "axelar", + "url": "https://axelar-rpc.staketab.org:443", + "latency": 877, + "status": "OK" + }, + { + "chain": "axelar", + "url": "https://axelar-rpc.qubelabs.io:443", + "latency": 883, + "status": "OK" + }, + { + "chain": "axelar", + "url": "https://axelar-rpc.quickapi.com:443", + "latency": 911, + "status": "OK" + }, + { + "chain": "axelar", + "url": "https://axelar.rpc.stakin-nodes.com", + "latency": 935, + "status": "OK" + }, + { + "chain": "axelar", + "url": "https://axelar-rpc.rockrpc.net/", + "latency": 973, + "status": "OK" + }, + { + "chain": "axelar", + "url": "https://axelar.rpc.quantnode.xyz/", + "latency": 1105, + "status": "OK" + }, + { + "chain": "axelar", + "url": "https://axelar-rpc.ibs.team", + "latency": 1113, + "status": "OK" + }, + { + "chain": "axelar", + "url": "https://rpc-axelar.cosmos-spaces.cloud", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "axelar", + "url": "https://rpc-axelar-ia.cosmosia.notional.ventures/", + "latency": null, + "status": "FAIL", + "message": "timeout of 5000ms exceeded" + }, + { + "chain": "axelar", + "url": "https://axelar-rpc.validatrium.club", + "latency": null, + "status": "FAIL", + "message": "unable to verify the first certificate" + }, + { + "chain": "axelar", + "url": "https://rpc-axelar.whispernode.com:443", + "latency": null, + "status": "FAIL", + "message": "timeout of 5000ms exceeded" + }, + { + "chain": "axelar", + "url": "https://axelar-mainnet-rpc.autostake.com:443", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 404" + }, + { + "chain": "axelar", + "url": "https://axelar-rpc.w3coins.io", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 502" + }, + { + "chain": "axelar", + "url": "https://axelar.drpc.org", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 404" + } + ], + "axone": [ + { + "chain": "axone", + "url": "https://axone.rpc.bccnodes.com", + "latency": 809, + "status": "OK" + }, + { + "chain": "axone", + "url": "https://rpc.axone.nodestake.org", + "latency": 1010, + "status": "OK" + }, + { + "chain": "axone", + "url": "https://axone-rpc.highstakes.ch", + "latency": 1239, + "status": "OK" + }, + { + "chain": "axone", + "url": "https://rpc.axone.cumulo.com.es", + "latency": 1495, + "status": "OK" + } + ], + "babylon": [ + { + "chain": "babylon", + "url": "https://babylon-rpc.polkachu.com", + "latency": 521, + "status": "OK" + }, + { + "chain": "babylon", + "url": "https://babylon-archive-rpc.polkachu.com", + "latency": 712, + "status": "OK" + }, + { + "chain": "babylon", + "url": "https://babylon-mainnet-rpc.shazoes.xyz", + "latency": 729, + "status": "OK" + }, + { + "chain": "babylon", + "url": "https://community.nuxian-node.ch:6797/babylon/trpc", + "latency": 772, + "status": "OK" + }, + { + "chain": "babylon", + "url": "https://babylon-archive.nodes.guru/rpc", + "latency": 1098, + "status": "OK" + }, + { + "chain": "babylon", + "url": "https://babylon-rpc.publicnode.com:443", + "latency": 1196, + "status": "OK" + }, + { + "chain": "babylon", + "url": "https://babylon.nodes.guru/rpc", + "latency": 1219, + "status": "OK" + }, + { + "chain": "babylon", + "url": "https://babylon-mainnet-rpc.autostake.com:443", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 404" + }, + { + "chain": "babylon", + "url": "https://babylon-mainnet-rpc.shazoe.xyz", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "babylon", + "url": "https://babylon.rpc.nodeshub.online:443", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + } + ], + "bandchain": [ + { + "chain": "bandchain", + "url": "http://rpc.laozi1.bandchain.org:80", + "latency": 508, + "status": "OK" + }, + { + "chain": "bandchain", + "url": "https://band-rpc.w3coins.io", + "latency": 614, + "status": "OK" + }, + { + "chain": "bandchain", + "url": "https://band-rpc.noders.services", + "latency": 755, + "status": "OK" + }, + { + "chain": "bandchain", + "url": "https://public.stakewolle.com/cosmos/bandchain/rpc", + "latency": 813, + "status": "OK" + }, + { + "chain": "bandchain", + "url": "https://rpc-band-01.stakeflow.io", + "latency": 943, + "status": "OK" + }, + { + "chain": "bandchain", + "url": "https://band-rpc.ibs.team/", + "latency": 1106, + "status": "OK" + }, + { + "chain": "bandchain", + "url": "https://bandprotocol-rpc.highstakes.ch", + "latency": 1190, + "status": "OK" + }, + { + "chain": "bandchain", + "url": "https://rpc-bandchain-ia.cosmosia.notional.ventures/", + "latency": null, + "status": "FAIL", + "message": "timeout of 5000ms exceeded" + }, + { + "chain": "bandchain", + "url": "https://bandchain-mainnet-rpc.autostake.com:443", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 404" + }, + { + "chain": "bandchain", + "url": "https://band.rpc.m.stavr.tech:443", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "bandchain", + "url": "https://rpc-band.cosmos-spaces.cloud", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "bandchain", + "url": "https://rpc.band.bronbro.io/", + "latency": null, + "status": "FAIL", + "message": "timeout of 5000ms exceeded" + }, + { + "chain": "bandchain", + "url": "https://rpc.band.roomit.xyz/", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + } + ], + "beezee": [ + { + "chain": "beezee", + "url": "https://rpc-1.getbze.com", + "latency": 714, + "status": "OK" + }, + { + "chain": "beezee", + "url": "https://rpc-2.getbze.com", + "latency": 738, + "status": "OK" + }, + { + "chain": "beezee", + "url": "https://rpc.getbze.com", + "latency": 799, + "status": "OK" + }, + { + "chain": "beezee", + "url": "https://beezee_mainnet_rpc.chain.whenmoonwhenlambo.money", + "latency": 1064, + "status": "OK" + } + ], + "bitbadges": [ + { + "chain": "bitbadges", + "url": "http://134.122.12.165:26657", + "latency": 519, + "status": "OK" + }, + { + "chain": "bitbadges", + "url": "https://bitbadges_mainnet_rpc.chain.whenmoonwhenlambo.money", + "latency": 1055, + "status": "OK" + } + ], + "bitcanna": [ + { + "chain": "bitcanna", + "url": "https://bitcanna-rpc.polkachu.com", + "latency": 590, + "status": "OK" + }, + { + "chain": "bitcanna", + "url": "https://bitcanna-rpc.bluestake.net", + "latency": 605, + "status": "OK" + }, + { + "chain": "bitcanna", + "url": "https://bitcanna.rpc.m.stavr.tech/", + "latency": 772, + "status": "OK" + }, + { + "chain": "bitcanna", + "url": "https://bitcanna-rpc.kalia.network/", + "latency": 810, + "status": "OK" + }, + { + "chain": "bitcanna", + "url": "https://mainnet-bitcanna-rpc.konsortech.xyz/", + "latency": 841, + "status": "OK" + }, + { + "chain": "bitcanna", + "url": "https://bcna.rpc.arcturian.tech/", + "latency": 880, + "status": "OK" + }, + { + "chain": "bitcanna", + "url": "https://bitcanna-mainnet.rpc.l0vd.com/", + "latency": 968, + "status": "OK" + }, + { + "chain": "bitcanna", + "url": "https://bitcanna_mainnet_rpc.chain.whenmoonwhenlambo.money", + "latency": 1186, + "status": "OK" + }, + { + "chain": "bitcanna", + "url": "https://bitcanna.rpc.m.anode.team/", + "latency": 2853, + "status": "OK" + }, + { + "chain": "bitcanna", + "url": "https://rpc.bitcanna.io/", + "latency": null, + "status": "FAIL", + "message": "timeout of 5000ms exceeded" + }, + { + "chain": "bitcanna", + "url": "https://rpc.bitcanna.sgtstake.com/", + "latency": null, + "status": "FAIL", + "message": "timeout of 5000ms exceeded" + }, + { + "chain": "bitcanna", + "url": "https://rpc-bcna.kjinc.io/", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "bitcanna", + "url": "https://bitcanna.rpc.kjnodes.com/", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 503" + }, + { + "chain": "bitcanna", + "url": "https://bitcanna-rpc.genznodes.dev/", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "bitcanna", + "url": "https://rpc.bitcanna-1.bitcanna.aviaone.com/", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "bitcanna", + "url": "https://rpc.bitcanna-mainnet.hexnodes.one/", + "latency": null, + "status": "FAIL", + "message": "timeout of 5000ms exceeded" + }, + { + "chain": "bitcanna", + "url": "https://rpc.bitcanna.citizenweb3.com/", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "bitcanna", + "url": "https://bitcanna.nodejumper.io:443", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "bitcanna", + "url": "https://rpc.bitcanna.indonode.net/", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "bitcanna", + "url": "https://rpc-bitcanna.mms.team:443", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "bitcanna", + "url": "https://bitcanna-rpc.validatornode.com", + "latency": null, + "status": "FAIL", + "message": "timeout of 5000ms exceeded" + }, + { + "chain": "bitcanna", + "url": "https://bitcanna.rpc.nodex.one", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 503" + }, + { + "chain": "bitcanna", + "url": "https://rpc.bitcanna.bh.rocks", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "bitcanna", + "url": "https://rpc-bitcanna.cryptech.com.ua", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + } + ], + "bitsong": [ + { + "chain": "bitsong", + "url": "https://rpc.bitsong.mathnodes.com", + "latency": 473, + "status": "OK" + }, + { + "chain": "bitsong", + "url": "https://bitsong-rpc.polkachu.com:443", + "latency": 601, + "status": "OK" + }, + { + "chain": "bitsong", + "url": "https://bitsong.tdrsys.com:2053", + "latency": 642, + "status": "OK" + }, + { + "chain": "bitsong", + "url": "https://bitsong-rpc.bluestake.net:443", + "latency": 727, + "status": "OK" + }, + { + "chain": "bitsong", + "url": "https://bitsong.rpc.m.stavr.tech:443", + "latency": 761, + "status": "OK" + }, + { + "chain": "bitsong", + "url": "https://bitsong-rpc.tothemars.network:443", + "latency": 805, + "status": "OK" + }, + { + "chain": "bitsong", + "url": "https://rpc.bitsong.quokkastake.io", + "latency": 812, + "status": "OK" + }, + { + "chain": "bitsong", + "url": "https://rpc-bitsong.architectnodes.com", + "latency": 816, + "status": "OK" + }, + { + "chain": "bitsong", + "url": "https://rpc.explorebitsong.com", + "latency": 842, + "status": "OK" + }, + { + "chain": "bitsong", + "url": "https://bitsong-rpc.panthea.eu", + "latency": 861, + "status": "OK" + }, + { + "chain": "bitsong", + "url": "https://rpc.bitsong.chaintools.tech/", + "latency": 1395, + "status": "OK" + }, + { + "chain": "bitsong", + "url": "https://bitsong-rpc.noders.services", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + } + ], + "blockx": [ + { + "chain": "blockx", + "url": "https://blockx_mainnet_rpc.chain.whenmoonwhenlambo.money", + "latency": 1062, + "status": "OK" + }, + { + "chain": "blockx", + "url": "https://rpc-blockx.nodeist.net", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 404" + } + ], + "bluechip": [], + "bluzelle": [ + { + "chain": "bluzelle", + "url": "https://a.client.sentry.net.bluzelle.com:26657", + "latency": 391, + "status": "OK" + }, + { + "chain": "bluzelle", + "url": "https://b.client.sentry.net.bluzelle.com:26657", + "latency": 921, + "status": "OK" + }, + { + "chain": "bluzelle", + "url": "https://bluzelle_mainnet_rpc.chain.whenmoonwhenlambo.money", + "latency": 1059, + "status": "OK" + }, + { + "chain": "bluzelle", + "url": "https://c.client.sentry.net.bluzelle.com:26657", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + } + ], + "bostrom": [ + { + "chain": "bostrom", + "url": "https://rpc.cyber.bronbro.io:443", + "latency": 805, + "status": "OK" + }, + { + "chain": "bostrom", + "url": "https://rpc.bostrom.cybernode.ai", + "latency": 989, + "status": "OK" + }, + { + "chain": "bostrom", + "url": "https://rpc-cyber-ia.cosmosia.notional.ventures/", + "latency": null, + "status": "FAIL", + "message": "timeout of 5000ms exceeded" + } + ], + "bouachain": [ + { + "chain": "bouachain", + "url": "https://rpc.bouachain.com", + "latency": null, + "status": "FAIL", + "message": "timeout of 5000ms exceeded" + } + ], + "buycex": [ + { + "chain": "buycex", + "url": "https://endpoint.buycex.net", + "latency": 1004, + "status": "OK" + } + ], + "canto": [ + { + "chain": "canto", + "url": "https://canto-rpc.polkachu.com", + "latency": 608, + "status": "OK" + }, + { + "chain": "canto", + "url": "https://canto.gravitychain.io:26657", + "latency": 1176, + "status": "OK" + }, + { + "chain": "canto", + "url": "https://rpc.canto.silentvalidator.com/", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + }, + { + "chain": "canto", + "url": "https://canto-mainnet-rpc.autostake.com:443", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 404" + }, + { + "chain": "canto", + "url": "https://rpc-canto.kewrnode.com", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + } + ], + "carbon": [ + { + "chain": "carbon", + "url": "https://tm-api.carbon.network", + "latency": 151, + "status": "OK" + }, + { + "chain": "carbon", + "url": "https://rpc.lavenderfive.com:443/carbon", + "latency": 240, + "status": "OK" + }, + { + "chain": "carbon", + "url": "https://carbon-mainnet-rpc.autostake.com:443", + "latency": null, + "status": "FAIL", + "message": "Request failed with status code 404" + }, + { + "chain": "carbon", + "url": "https://rpc.carbon.blockhunters.org", + "latency": null, + "status": "FAIL", + "message": "Unable to connect. Is the computer able to access the url?" + } + ] +} \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..9b4376f --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,15 @@ +services: + rpc-checker-vc-pay: + build: . + container_name: rpc-checker-vc-pay + ports: + - "3455:3344" + volumes: + - ./cache.json:/app/cache.json + restart: unless-stopped + networks: + - vc-pay-net + +networks: + vc-pay-net: + driver: bridge diff --git a/package.json b/package.json new file mode 100644 index 0000000..0246203 --- /dev/null +++ b/package.json @@ -0,0 +1,21 @@ +{ + "name": "rpc-check", + "private": true, + "devDependencies": { + "@types/bun": "latest", + "@types/cors": "^2.8.19", + "@types/express": "^5.0.3" + }, + "scripts": { + "start": "bun server.ts" + }, + "peerDependencies": { + "typescript": "^5" + }, + "dependencies": { + "axios": "^1.10.0", + "chain-registry": "^2.0.28", + "cors": "^2.8.5", + "express": "^5.1.0" + } +} diff --git a/rpcChecker.ts b/rpcChecker.ts new file mode 100644 index 0000000..fb99d5b --- /dev/null +++ b/rpcChecker.ts @@ -0,0 +1,75 @@ +import axios from "axios"; +import mainnet from "chain-registry/mainnet"; +import testnet from "chain-registry/testnet"; +import fs from "fs"; +import path from "path"; + +export type RpcResult = { + chain: string; + url: string; + latency: number | null; + status: "OK" | "ERROR" | "FAIL"; + message?: string; +}; + +export type RpcCache = Record; + +const CACHE_FILE = path.join(__dirname, "cache.json"); + +function saveCacheToFile(cache: RpcCache) { + fs.writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2), "utf-8"); +} + +async function checkRpcLatency(chain: string, url: string): Promise { + const start = Date.now(); + try { + const response = await axios.get(`${url}/status`, { timeout: 5000 }); + const latency = Date.now() - start; + if (response.status === 200) { + return { chain, url, latency, status: "OK" }; + } else { + return { + chain, + url, + latency, + status: "ERROR", + message: `Status code ${response.status}`, + }; + } + } catch (error: any) { + return { chain, url, latency: null, status: "FAIL", message: error.message }; + } +} + +export async function generateRpcCache(updateCallback?: (chain: string, result: RpcResult[]) => void): Promise { + const results: RpcCache = {}; + + const chains = [...mainnet.chains, ...testnet.chains]; + + for (const chain of chains) { + const chainName = chain.chainName; + const rpcs = chain.apis?.rpc?.map((rpc) => rpc.address) || []; + + const chainResults: RpcResult[] = []; + + for (const url of rpcs) { + const res = await checkRpcLatency(chainName, url); + chainResults.push(res); + } + + chainResults.sort((a, b) => { + if (a.latency === null) return 1; + if (b.latency === null) return -1; + return a.latency - b.latency; + }); + + results[chainName] = chainResults; + + if (updateCallback) { + updateCallback(chainName, chainResults); + } + saveCacheToFile(results); + } + + return results; +} diff --git a/server.ts b/server.ts new file mode 100644 index 0000000..9d2b1ea --- /dev/null +++ b/server.ts @@ -0,0 +1,60 @@ +import express from "express"; +import { generateRpcCache, type RpcCache } from "./rpcChecker"; +import fs from "fs"; +import path from "path"; +import corsLib from "cors"; + +const app = express(); +const PORT = 3344; + +app.use(express.json()); +app.use(corsLib()); + +let rpcCache: RpcCache = {}; + +const CACHE_FILE = path.join(__dirname, "cache.json"); + +function loadCacheFromFile() { + if (fs.existsSync(CACHE_FILE)) { + const raw = fs.readFileSync(CACHE_FILE, "utf-8"); + rpcCache = JSON.parse(raw); + } +} + +async function refreshRpcCache() { + console.log("🔄 Refreshing RPC data..."); + await generateRpcCache((chain, data) => { + rpcCache[chain] = data; + }); + + console.log("✅ RPC data refreshed."); +} + +setInterval(refreshRpcCache, 12 * 60 * 60 * 1000); + +app.post("/rpc-check", (req, res) => { + if (!req.body || typeof req.body !== "object") { + return res.status(400).json({ error: "Invalid JSON body" }); + } + + const { chains } = req.body; + if (!Array.isArray(chains)) { + return res.status(400).json({ error: "Missing chains: string[]" }); + } + + const data: RpcCache = {}; + for (const name of chains) { + if (rpcCache[name]) { + data[name] = rpcCache[name]; + } + } + + return res.json(data); +}); + +app.listen(PORT, async () => { + console.log(`🚀 RPC check server running on http://localhost:${PORT}`); + loadCacheFromFile(); + await refreshRpcCache(); +}); + diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..9c62f74 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + // Environment setup & latest features + "lib": ["ESNext"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +}