├── .gitignore ├── public ├── cover.png ├── favicon.ico ├── providers.png ├── reference.png ├── apple-touch-icon.png ├── favicon-masked.svg └── favicon.svg ├── .prettierrc.json ├── vercel.json ├── funding.json ├── src ├── shims.d.ts ├── components │ ├── __common │ │ ├── icon │ │ │ ├── ChevronDown.vue │ │ │ ├── Cross.vue │ │ │ ├── Success.vue │ │ │ ├── provider │ │ │ │ ├── Infura.vue │ │ │ │ ├── Chainstack.vue │ │ │ │ ├── Quicknode.vue │ │ │ │ ├── Tenderly.vue │ │ │ │ ├── Ankr.vue │ │ │ │ ├── Drpc.vue │ │ │ │ ├── IconProvider.vue │ │ │ │ ├── PublicNode.vue │ │ │ │ ├── LlamaNodes.vue │ │ │ │ ├── Blast.vue │ │ │ │ ├── Alchemy.vue │ │ │ │ ├── Cloudflare.vue │ │ │ │ └── OneRpc.vue │ │ │ ├── Clipboard.vue │ │ │ └── chain │ │ │ │ ├── IconChain.vue │ │ │ │ ├── Ethereum.vue │ │ │ │ ├── Polygon.vue │ │ │ │ ├── Optimism.vue │ │ │ │ └── Arbitrum.vue │ │ ├── EthLabel.vue │ │ ├── LoadingIndicator.vue │ │ ├── CopyButton.vue │ │ ├── CodeView.vue │ │ ├── EthInput.vue │ │ ├── EthRadio.vue │ │ ├── EthModal.vue │ │ ├── EthToggle.vue │ │ └── EthSelect.vue │ ├── provider-chain │ │ ├── BannerLimitedSupport.vue │ │ ├── EndpointUrl.vue │ │ ├── MethodList.vue │ │ └── FeatureList.vue │ ├── execution │ │ ├── MethodForm.vue │ │ ├── BannerCustomMethod.vue │ │ ├── MethodEditor.vue │ │ ├── MethodList.vue │ │ ├── MethodFormParam.vue │ │ └── MethodExecution.vue │ ├── providers │ │ ├── FeatureChips.vue │ │ └── CardProvider.vue │ └── _app │ │ └── header │ │ ├── LinkGithub.vue │ │ ├── EthHeader.vue │ │ ├── ProviderSelector.vue │ │ └── BrandLogo.vue ├── composables │ ├── useTarget.ts │ └── useChain.ts ├── main.ts ├── utils │ ├── formatters.ts │ ├── validation.ts │ ├── providers.ts │ └── methods.ts ├── App.vue ├── pages │ ├── Errors.vue │ ├── Providers.vue │ ├── ProviderChain.vue │ └── ExecutionApi.vue └── scripts │ └── fetchProviders.ts ├── vite.config.ts ├── .stylelintrc.json ├── .github └── workflows │ └── ci.yaml ├── tsconfig.json ├── LICENSE ├── README.md ├── package.json ├── index.html └── eslint.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | node_modules/ 3 | .env 4 | .DS_Store 5 | 6 | 7 | -------------------------------------------------------------------------------- /public/cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Destiner/ethereum-json-rpc/HEAD/public/cover.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Destiner/ethereum-json-rpc/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/providers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Destiner/ethereum-json-rpc/HEAD/public/providers.png -------------------------------------------------------------------------------- /public/reference.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Destiner/ethereum-json-rpc/HEAD/public/reference.png -------------------------------------------------------------------------------- /public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Destiner/ethereum-json-rpc/HEAD/public/apple-touch-icon.png -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "all", 3 | "singleQuote": true, 4 | "singleAttributePerLine": true 5 | } 6 | -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "framework": "vite", 3 | "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }] 4 | } 5 | -------------------------------------------------------------------------------- /funding.json: -------------------------------------------------------------------------------- 1 | { 2 | "opRetro": { 3 | "projectId": "0xd9f6ae29c6919e8fdf123f17344ef88917e27774aaaec3df4f082658a35b1469" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /src/shims.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.vue' { 2 | import { ComponentOptions } from 'vue'; 3 | 4 | const component: ComponentOptions; 5 | export default component; 6 | } 7 | 8 | declare module '@fontsource-variable/inter' {} 9 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import vue from '@vitejs/plugin-vue'; 2 | import { defineConfig } from 'vite'; 3 | import VueDevTools from 'vite-plugin-vue-devtools'; 4 | import tsconfigPaths from 'vite-tsconfig-paths'; 5 | 6 | export default defineConfig({ 7 | plugins: [ 8 | tsconfigPaths({ 9 | loose: true, 10 | }), 11 | vue(), 12 | VueDevTools(), 13 | ], 14 | }); 15 | -------------------------------------------------------------------------------- /src/components/__common/icon/ChevronDown.vue: -------------------------------------------------------------------------------- 1 | 18 | -------------------------------------------------------------------------------- /src/components/__common/icon/Cross.vue: -------------------------------------------------------------------------------- 1 | 18 | -------------------------------------------------------------------------------- /src/components/__common/icon/Success.vue: -------------------------------------------------------------------------------- 1 | 18 | -------------------------------------------------------------------------------- /.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "stylelint-config-standard", 4 | "stylelint-config-recommended-vue", 5 | "stylelint-config-property-sort-order-smacss" 6 | ], 7 | "rules": { 8 | "media-feature-name-allowed-list": ["width", "prefers-color-scheme"], 9 | "property-no-vendor-prefix": [ 10 | true, 11 | { 12 | "ignoreProperties": ["user-select"] 13 | } 14 | ] 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/components/provider-chain/BannerLimitedSupport.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 24 | -------------------------------------------------------------------------------- /src/components/__common/icon/provider/Infura.vue: -------------------------------------------------------------------------------- 1 | 15 | -------------------------------------------------------------------------------- /src/components/__common/icon/Clipboard.vue: -------------------------------------------------------------------------------- 1 | 29 | -------------------------------------------------------------------------------- /src/components/__common/icon/chain/IconChain.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 22 | -------------------------------------------------------------------------------- /.github/workflows/ci.yaml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: main 6 | pull_request: 7 | branches: main 8 | 9 | jobs: 10 | run: 11 | name: Run 12 | runs-on: ubuntu-latest 13 | 14 | strategy: 15 | fail-fast: false 16 | 17 | steps: 18 | - name: Checkout repository 19 | uses: actions/checkout@v4 20 | 21 | - name: Setup Bun 22 | uses: oven-sh/setup-bun@v2 23 | 24 | - name: Clean install 25 | run: bun install 26 | 27 | - name: Lint 28 | run: bun run lint 29 | 30 | - name: Type checking 31 | run: bun run typecheck 32 | 33 | - name: Build 34 | run: bun run build 35 | -------------------------------------------------------------------------------- /src/composables/useTarget.ts: -------------------------------------------------------------------------------- 1 | import { type RemovableRef, useStorage } from '@vueuse/core'; 2 | 3 | import { 4 | type Language, 5 | type Library, 6 | LANGUAGE_JSON, 7 | LIBRARY_VANILLA, 8 | } from '@/utils/targets'; 9 | 10 | interface Target { 11 | language: Language; 12 | library: Library; 13 | } 14 | 15 | interface UseTarget { 16 | target: RemovableRef; 17 | } 18 | 19 | const STORAGE_KEY_TARGET = 'target'; 20 | 21 | function useTarget(): UseTarget { 22 | const target = useStorage(STORAGE_KEY_TARGET, { 23 | language: LANGUAGE_JSON, 24 | library: LIBRARY_VANILLA, 25 | }); 26 | 27 | return { 28 | target, 29 | }; 30 | } 31 | 32 | export default useTarget; 33 | -------------------------------------------------------------------------------- /src/components/__common/icon/provider/Chainstack.vue: -------------------------------------------------------------------------------- 1 | 17 | -------------------------------------------------------------------------------- /src/components/__common/EthLabel.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 24 | 25 | 42 | -------------------------------------------------------------------------------- /src/components/__common/LoadingIndicator.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 39 | -------------------------------------------------------------------------------- /src/components/__common/icon/chain/Ethereum.vue: -------------------------------------------------------------------------------- 1 | 33 | -------------------------------------------------------------------------------- /src/components/execution/MethodForm.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 32 | 33 | 40 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Base */ 4 | "esModuleInterop": true, 5 | "skipLibCheck": true, 6 | "target": "ES2022", 7 | "allowJs": true, 8 | "resolveJsonModule": true, 9 | "moduleDetection": "force", 10 | "isolatedModules": true, 11 | /* Strictness */ 12 | "strict": true, 13 | "forceConsistentCasingInFileNames": true, 14 | "noImplicitAny": true, 15 | "noImplicitOverride": true, 16 | "noImplicitReturns": true, 17 | "noImplicitThis": true, 18 | "noFallthroughCasesInSwitch": true, 19 | "noPropertyAccessFromIndexSignature": false, 20 | "noUncheckedSideEffectImports": true, 21 | /* No transpiling */ 22 | "moduleResolution": "Bundler", 23 | "module": "preserve", 24 | "noEmit": true, 25 | /* Erasable syntax */ 26 | "erasableSyntaxOnly": true, 27 | /* Browser-specific */ 28 | "lib": ["ES2022", "DOM", "DOM.Iterable"], 29 | /* Imports */ 30 | "baseUrl": "src", 31 | "paths": { 32 | "@/*": ["*"] 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/components/__common/icon/provider/Quicknode.vue: -------------------------------------------------------------------------------- 1 | 15 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { createHead } from '@unhead/vue/client'; 2 | import { createApp } from 'vue'; 3 | import { createWebHistory, createRouter } from 'vue-router'; 4 | 5 | import App from './App.vue'; 6 | import Errors from './pages/Errors.vue'; 7 | import ExecutionApi from './pages/ExecutionApi.vue'; 8 | import ProviderChain from './pages/ProviderChain.vue'; 9 | import Providers from './pages/Providers.vue'; 10 | 11 | const routerHistory = createWebHistory(); 12 | const router = createRouter({ 13 | history: routerHistory, 14 | routes: [ 15 | { path: '/', name: 'reference', component: ExecutionApi }, 16 | { path: '/providers', name: 'providers', component: Providers }, 17 | { 18 | path: '/provider/:provider-on-:chain', 19 | name: 'provider-chain', 20 | component: ProviderChain, 21 | }, 22 | { path: '/errors', name: 'errors', component: Errors }, 23 | ], 24 | }); 25 | 26 | const app = createApp(App); 27 | const head = createHead(); 28 | 29 | app.use(router); 30 | app.use(head); 31 | 32 | app.mount('#app'); 33 | 34 | export { routerHistory, router }; 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Timur Badretdinov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/components/__common/icon/provider/Tenderly.vue: -------------------------------------------------------------------------------- 1 | 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ethereum JSON-RPC 2 | 3 | _An interactive reference of the Ethereum node API._ 4 | 5 | ## Shortcuts 6 | 7 | - `Command + /`: focus the filter input 8 | - `Up / Down`: navigate between methods (when the filter input is active) 9 | - `Command + Enter`: execute 10 | 11 | 12 | ## Contribution guidelines 13 | 14 | To contribute: 15 | 16 | 1. Fork this repository 17 | 2. Create an [issue](https://github.com/Destiner/ethereum-json-rpc/issues) detailing your proposed updates 18 | 3. Submit a pull request (PR) from your fork to the main branch of this repository 19 | > Reference the issue number in the details of your PR 20 | 21 | ## Build guidelines 22 | 23 | To create a local build: 24 | 25 | 1. Install bun: 26 | `curl -fsSL https://bun.sh/install | bash` 27 | 2. Ensure bun is added to PATH: 28 | 2.1 `nano ~/.zshrc` 29 | 2.2 If required, add `export PATH="$HOME/.bun/bin:$PATH"` 30 | > Verify bun with `bun --help` 31 | 32 | Make your updates, then: 33 | 34 | 3. Run `bun install` 35 | 4. Build site locally with `bun run build` 36 | 5. Install an HTTP server with `bun add serve` 37 | 6. Serve the contents of the /dist folder with `bun run serve dist` 38 | > Navigate to the localhost URL detailed in your terminal 39 | 40 | -------------------------------------------------------------------------------- /src/components/__common/icon/provider/Ankr.vue: -------------------------------------------------------------------------------- 1 | 15 | -------------------------------------------------------------------------------- /src/components/__common/icon/provider/Drpc.vue: -------------------------------------------------------------------------------- 1 | 45 | -------------------------------------------------------------------------------- /src/components/__common/CopyButton.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 43 | 44 | 72 | -------------------------------------------------------------------------------- /src/components/__common/icon/chain/Polygon.vue: -------------------------------------------------------------------------------- 1 | 13 | -------------------------------------------------------------------------------- /src/components/__common/icon/provider/IconProvider.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 52 | -------------------------------------------------------------------------------- /src/components/providers/FeatureChips.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 32 | 33 | 65 | -------------------------------------------------------------------------------- /src/components/execution/BannerCustomMethod.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 30 | 31 | 41 | -------------------------------------------------------------------------------- /public/favicon-masked.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.14, written by Peter Selinger 2001-2017 9 | 10 | 12 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/components/__common/CodeView.vue: -------------------------------------------------------------------------------- 1 |