{"id":29583866,"url":"https://github.com/paulmillr/esplr","last_synced_at":"2025-07-19T23:39:22.272Z","repository":{"id":281535948,"uuid":"945453568","full_name":"paulmillr/esplr","owner":"paulmillr","description":"Explore Ethereum-like blockchain privately with your RPC URL","archived":false,"fork":false,"pushed_at":"2025-06-24T17:53:16.000Z","size":278,"stargazers_count":86,"open_issues_count":4,"forks_count":10,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-24T18:48:07.119Z","etag":null,"topics":["block","erigon","eth","ethereum","etherscan","explore","explorer","geth","local","nethermind","node","reth","rpc"],"latest_commit_sha":null,"homepage":"https://paulmillr.com/apps/esplr/","language":"Vue","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/paulmillr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-03-09T13:13:45.000Z","updated_at":"2025-06-24T17:53:19.000Z","dependencies_parsed_at":"2025-06-24T18:33:17.815Z","dependency_job_id":"05dc702f-b701-4a58-9ab3-20659ce671f8","html_url":"https://github.com/paulmillr/esplr","commit_stats":null,"previous_names":["paulmillr/esplr"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/paulmillr/esplr","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paulmillr%2Fesplr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paulmillr%2Fesplr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paulmillr%2Fesplr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paulmillr%2Fesplr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/paulmillr","download_url":"https://codeload.github.com/paulmillr/esplr/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paulmillr%2Fesplr/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266042565,"owners_count":23867965,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["block","erigon","eth","ethereum","etherscan","explore","explorer","geth","local","nethermind","node","reth","rpc"],"created_at":"2025-07-19T23:39:21.703Z","updated_at":"2025-07-19T23:39:22.262Z","avatar_url":"https://github.com/paulmillr.png","language":"Vue","readme":"# esprl\n\nExplore Ethereum-like blockchain privately with your RPC URL.\n\n- 🔒 No 3rd party services: only private RPC requests\n- 💹 ETH and token balances, transaction history\n- 💵 On-chain USD price conversion from oracles\n- 📜 Integration with Sourcify for smart contract source code verification\n- 🪶 100KB gzipped. 3 files: 1 html, 1 css, 1 js\n\n![](https://github.com/user-attachments/assets/61bbfb4c-858c-4fee-8a25-ebb3871b8f70)\n\n## Motivation\n\n\u003e How is this better than [Etherscan](https://etherscan.io)?\n\nEtherscan and other other 3rd party block explorers collect and track user data. They create logs every time someone opens an address. Private explorers allow viewing information without logging.\n\n\u003e How is this better than [Otterscan](https://github.com/otterscan/otterscan)?\n\nOtterscan does not support token balances or transfer history, which makes it limited in usefulness. ERC20 / ERC721 / ERC1155 tokens \u0026 NFTs are one of the most popular features of EVM-like blockchains. Besides that, Otterscan can only be used with one client while esplr strives to support all node types.\n\n\u003e Can I verify all network requests?\n\nThe explorer only makes requests to specified RPC URL. To audit this, check `src/App.vue`,\n`handleConnect`. It uses [micro-ftch](https://github.com/paulmillr/micro-ftch) to\nensure no requests are done outside of the URL. You can add custom logging there.\n\n\u003e How are USD prices calculated?\n\nChainlink EVM contract provides onchain prices. No external services are used.\n\n\u003e Are ERC-20 tokens fully supported?\n\nYes. To view full token transfer history for an account, open tx Details tab.\nFirst call can take up to 50 seconds because of [limitations of ETH nodes](#speed).\nSecond call would be cached and instant.\n\n\u003e Are ERC-721 NFTs fully supported?\n\nWork in progress. They will be shown in UI in one of the next updates.\n\n\u003e Do you support local or remote Sourcify integration?\n\nBoth! Check out instructions below to set up your own Sourcify instance.\n\n\u003e Which frontend libraries are used?\n\n[micro-eth-signer](https://github.com/paulmillr/micro-eth-signer) and\n[micro-ftch](https://github.com/paulmillr/micro-ftch) empower data retrieval.\nVue.js is used as UI framework.\n\n## Setup\n\nTo build the app and launch dev server, execute:\n\n```sh\nnpm install \u0026\u0026 npm run dev\n```\n\nTo build for production:\n\n```sh\nnpm install \u0026\u0026 npm run build\n\n# Output is now in `dist/`\n# Example: serve `dist/` directory using built-in Python module\ncd dist \u0026\u0026 python3 -m http.server --bind 127.0.0.1\n```\n\nThe output is 3 files in `dist`: 1 html, 1 js, 1 css.\n\n**(optional) RPC, Sourcify configuration**\n\nYou can have the app automatically point to an RPC URL or SOURCIFY URL provided via env variables: `VITE_RPC_URL`, `VITE_SOURCIFY_URL`.\n\nFor example:\n```sh\nnpm install \u0026\u0026 VITE_RPC_URL=\u003cRPC_URL\u003e VITE_SOURCIFY_URL=\u003cSOURCIFY_URL\u003e npm run dev\n```\n\n## Running RPC backend\n\nEsplr supports all node types.\nUser-ran [Erigon](https://github.com/erigontech/erigon) RPC node is adviced to get 100% of functionality.\n[Reth](https://github.com/paradigmxyz/reth) may achieve feature parity soon. See [details](#reth-geth-nethermind-infura).\n\n1. Download [Erigon](https://github.com/erigontech/erigon/releases) and start it:\n\n```sh\nerigon --datadir=/data/erigon --prune.mode='archive' --torrent.download.rate=\"100mb\" --http --http.api=eth,erigon,web3,net,debug,trace,txpool,ots --ws --http.corsdomain='*'\n```\n\n2. Initial sync will take 8 hours for ETH mainnet on 100Mbps connection (slower ones can still be used). After that RPC will be running on port 8545.\n\nThe RPC will be running locally at 127.0.0.1:8545. There are two ways to make it available to outside internet:\n\n* Redirect e.g. `ethnode.com` to `127.0.0.1:8545`\n    - Can be achieved with NGINX: `proxy_pass http://127.0.0.1:8545`\n    - You will probably need domain and SSL certificate. For example, if domain is `ethnode.com`, you will be able to specify its RPC.\n    - It is suggested to use basic auth (`user:password@ethnode.com`).\n* Or, use SSH tunneling to forward port 8545 to your local machine:\n   `ssh -L 5678:127.0.0.1:8545 root@192.168.1.50` where 5678 is port on your local machine,\n   `root@192.168.1.50` is user + hostname of Erigon3 server.\n\n### Reth, Geth, Nethermind, Infura\n\nSome features are not present outside of Erigon. The app uses archive node API / `trace_filter` extensively.\n\n- Self-hosted Erigon 3 works with `prune.mode=archive` for 100% of features\n- 3rd-party (infura / alchemy / quicknode) Erigon nodes have strict rate limits: tx history is not available\n- Reth nodes do not have tx history because of lack of indexes. They indicated\n  willingness to [fix the issue](https://github.com/paradigmxyz/reth/issues/4799)\n- Geth, Nethermind do not have proper low-resource archive mode, so they are not supported for querying tx history\n\n### Sourcify\n\nesplr supports Sourcify [(sourcify.dev)](https://sourcify.dev) integration.\nSourcify allows to verify smart contract source code for eth. To set it up:\n\n1. Download `manifest.json`\n    - `curl -L -O https://repo-backup.sourcify.dev/manifest.json`\n2. Download all files from `manifest.json`\n    - To fetch chain-specific archives for eth mainnet (chain id 1):\n    - `CHAIN_ID=1; jq -r '.files[].path' manifest.json | grep -E \"(full|partial)_match\\.${CHAIN_ID}\\.\" | xargs -I {} curl -L -O https://repo-backup.sourcify.dev/{}`\n    - Alternatively, there is 260GB+ archive for all chains:\n    - `jq -r '.files[].path' manifest.json | xargs -I {} curl -L -O https://repo-backup.sourcify.dev/{}`\n3. Extract files from archives:\n    - `for file in *.tar.gz; do echo \"Extracting $file...\"; tar -xf \"$file\"; done`\n4. Normalize names of addresses directories:\n    - Copy script\n    - `cp scripts/normalize_addresses.sh /path/to/repository`\n    - Chain-specific normalization (takes 2+ hours):\n    - `./normalize_addresses.sh --chains 1`\n    - Normalization of all chains (takes 24+ hours):\n    - `./normalize_addresses.sh`\n5. Run any static file server with CORS enabled on the repository dir:\n    - `npm install -g http-server@14.1.1`\n    - `http-server /path/to/repository --cors -p 2015`\n6. In esplr settings, specify address and port of the static file server\n\n### Speed\n\nMost requests are instant. Some requests, like seeing token transfer history, rely on\nscanning whole blockchain from scratch. This can take 10-50 seconds.\n\nTo improve this, in the future, archive node developers can add\nadditional indexes into their software. They can also provide a new RPC method\nto query history. Best thing one can do is to ask for this in their bug trackers:\n[reth](https://github.com/paradigmxyz/reth/issues/4799), [erigon](https://github.com/erigontech/erigon/issues).\n\nAddons, like [Trueblocks](https://trueblocks.io), can also speed things up.\nWhile the goal of esplr is to use \"pure\" archive node, we would welcome support for\nan easy trueblocks integration.\n\n### Hardware requirements\n\nAn archive node will need 30Mbps connection \u0026 2.5TB NVME SSD (TLC, not QLC).\nSuch new PC [can cost $570](https://pcpartpicker.com/list/PbHHrM) for 32GB RAM \u0026 4-core CPU.\nHere is another [$650 build](https://pcpartpicker.com/list/zKthBq) with 64GB RAM \u0026 8-core CPU.\n\nSimilar server can be rented from providers like [Hetzner](https://www.hetzner.com) for $60/mo.\nMake sure to [prohibit private IPs in firewall](https://ethereum.stackexchange.com/questions/6386/how-to-prevent-being-blacklisted-for-running-an-ethereum-client/13068).\n\nFully validating non-archive node can have \u003c1TB storage requirements. Check out [Ress](https://www.paradigm.xyz/2025/03/stateless-reth-nodes) and [EIP-7870](https://eips.ethereum.org/EIPS/eip-7870).\n\n## License\n\nMIT License\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaulmillr%2Fesplr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpaulmillr%2Fesplr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaulmillr%2Fesplr/lists"}