{"id":36883657,"url":"https://github.com/31z4/ipc-explorer","last_synced_at":"2026-01-12T15:27:44.548Z","repository":{"id":228018438,"uuid":"767909294","full_name":"31z4/ipc-explorer","owner":"31z4","description":"Browse and explore InterPlanetary Consensus (IPC) subnets","archived":false,"fork":false,"pushed_at":"2024-05-17T13:25:52.000Z","size":4826,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-05-20T22:18:16.485Z","etag":null,"topics":["filecoin","fvm","ipc","web3"],"latest_commit_sha":null,"homepage":"https://ipcexplorer.com","language":"JavaScript","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/31z4.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}},"created_at":"2024-03-06T05:43:54.000Z","updated_at":"2024-05-17T13:25:56.000Z","dependencies_parsed_at":"2024-04-02T06:28:10.741Z","dependency_job_id":"b63f5974-8177-40e9-9e53-4ebeb26fa408","html_url":"https://github.com/31z4/ipc-explorer","commit_stats":null,"previous_names":["31z4/ipc-explorer"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/31z4/ipc-explorer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/31z4%2Fipc-explorer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/31z4%2Fipc-explorer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/31z4%2Fipc-explorer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/31z4%2Fipc-explorer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/31z4","download_url":"https://codeload.github.com/31z4/ipc-explorer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/31z4%2Fipc-explorer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28340746,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-12T12:22:26.515Z","status":"ssl_error","status_checked_at":"2026-01-12T12:22:10.856Z","response_time":98,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["filecoin","fvm","ipc","web3"],"created_at":"2026-01-12T15:27:43.082Z","updated_at":"2026-01-12T15:27:44.539Z","avatar_url":"https://github.com/31z4.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# IPC Explorer\n\nThe goal of this project was to build a minimum viable product (MVP) of the IPC explorer. See [what's next](#whats-next) after the MVP.\n\n\u003e InterPlanetary Consensus (IPC) is a revolutionary blockchain technology that powers planetary-scale web3 apps.\n\nYou can learn more about this technology at [https://www.ipc.space](https://www.ipc.space).\n\nUsing IPC Explorer you can:\n\n- [x] Browse subnets.\n- [x] View subnet configuration.\n- [x] View the last committed bottom-up checkpoint of a subnet.\n- [x] View subnet genesis validators.\n- [x] View recent subnet deposits.\n- [x] View recent subnet withdrawals.\n- [x] View recent subnet transactions.\n\nCheck out IPC Explorer [website](https://ipcexplorer.com) or run the application [locally](#running-locally).\n\n## How it's made\n\n- To narrow the scope of the MVP the decision was made to not build an indexing backend at this stage.\n- The application relies on [public Filecoin RPC providers](https://docs.filecoin.io/networks/calibration/rpcs).\n- IPC Explorer is a single page application (SPA) built using [React](https://react.dev).\n- The application uses [ethers.js](https://ethers.org) to:\n  - Call various methods of the IPC Subnet Actor (ISA) and the IPC Gateway Actor (IGA) smart contracts to collect various information about subnets.\n  - Fetch blocks, transactions, and events from the root network and its child subnets.\n\n## Known issues and limitations\n\n- **Listing subnet withdrawals may not work.**\n  It relies on the `NewBottomUpMsgBatch` event of the IPC Gateway Actor smart contract.\n  But for some reason, I do not observe such events via a local subnet RPC during manual testing.\n- **Connecting to a subnet RPC provider is subject to [same-origin policy](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy)**.\n  Therefore, you can only connect to a local subnet RPC provider from a [locally running application](#running-locally).\n  Connecting to a public subnet RPC provider is possible if the provider explicitly allows it by setting corresponding [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) headers.\n- **Not displaying when the last bottom-up checkpoint of a subnet was committed to the parent**. Finding in what parent block a subnet committed its last bottom-up checkpoint is inefficient without having an indexing backend. In the worst-case scenario, you'd have to scan the parent from its current block down to the subnet's genesis block to find the last checkpoint transaction.\n- **L3+ subnets are not supported**.\n  Nested subnets would require different application architecture and more sophisticated UX. It is simply out of scope of the MVP.\n\n## Why building from scratch?\n\nSince the [Filecoin Virtual Machine](https://fvm.filecoin.io) used by IPC is an EVM-compatible runtime, you may wonder, can't we just use some existing open-source blockchain explorer like [Blockscout](https://www.blockscout.com)?\nAnd the short answer is yes, we can.\nBut, the user experience will be poor out-of-the-box.\n\n- Blockscout doesn't support simultaneously connecting to multiple RPC providers.\n  This means you either look at a parent or a child IPC network at a time.\n  Or have to deploy a separate Blockscout instance for every subnet.\n  Which seems inefficient.\n- Blockscout is a general-purpose blockchain explorer and knows nothing about IPC subnets.\n  Even if you upload and verify IPC-specific smart contracts into it, this will improve visibility into subnets just a little.\n  And the UX will remain poor.\n  Because you still need to manually call a set of Gateway and Subnet Actor methods to gather info about subnets.\n\nSo for the best visibility into subnets and a good user experience you either fork and extend something like Blockscout or build your own IPC explorer from scratch.\nFor this MVP I chose the latter.\n\n## What's next?\n\nBefore the IPC General Availability launch (planned for 2024 Q3) I want to build a production-ready IPC explorer.\nThe key difference from the current MVP will be having an indexing backend.\nThis backend will greatly improve the UX of the explorer and enable new features.\nTo name a few:\n\n- Full history of transactions, messages, events, etc. is available and searchable.\n- Various charts and analytics based on real-time and historical data.\n- Quicker application load times.\n\nAnother useful feature will be the ability to connect your Metamask wallet to a subnet.\n\n## Development\n\n### Running locally\n\nFirst, clone the repository and `cd` into its directory:\n\n```sh\ngit clone git@github.com:31z4/ipc-explorer.git\ncd ipc-explorer\n```\n\nNow, simply run the following commands to install all required packages and run a development server:\n\n```sh\nnpm install\nnpm run dev\n```\n\nThe application is running at [http://localhost:5173](http://localhost:5173).\n\n#### Connecting to a local subnet RPC\n\nYou can only connect to a local subnet RPC from a locally running application due to [same-origin policy](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy). You also need a workaround because [Fendermint Ethereum API Facade](https://github.com/consensus-shipyard/ipc/tree/fbe598d0d2f908a3bddbcd4e7d3e5a31cd3a26d9/fendermint/eth/api) doesn't set CORS headers that would allow such connection from your browser.\n\nThe suggested workaround is to run a reverse proxy that sets required CORS headers.\nIn the following instruction, it's assumed that you're already running a subnet with Ethereum API Facade listening on `http://localhost:8545`. This should be the case if you followed [the official instruction](https://docs.ipc.space/quickstarts/deploy-a-subnet) about deploying a subnet.\n\n1. Install [mitmproxy](https://mitmproxy.org).\n2. Run it with a custom [cors.py](mitmproxy/cors.py) module:\n\n```sh\nmitmdump --mode reverse:http://localhost:8545 --listen-host localhost --listen-port 9545 -s mitmproxy/cors.py\n```\n\nNow you should be able to connect to subnet RPC from the locally running application. Note the non-standard provider URL (which is our reverse proxy) that you must enter after you click on the \"Connect\" button in the application:\n\n```\nhttp://localhost:9545\n```\n\n### Manual testing using ipc-cli\n\nThe following is a simplified and limited version of [the official documentation](https://docs.ipc.space/quickstarts/deploy-a-subnet) about deploying a subnet.\nIf you need a fully operational subnet follow the official instructions instead.\n\n1. First, you need to build a Docker image for `ipc-cli`:\n\n```sh\nmake build-ipc-cli-docker\n```\n\n2. Initialize your `ipc-cli` config:\n\n```sh\nmkdir .ipc\n\ncat \u003c\u003c EOF \u003e .ipc/config.toml\nkeystore_path = \"~/.ipc-keystore\"\n\n[[subnets]]\nid = \"/r314159\"\n\n[subnets.config]\nnetwork_type = \"fevm\"\nprovider_http = \"https://api.calibration.node.glif.io/rpc/v1\"\ngateway_addr = \"`curl -s https://raw.githubusercontent.com/consensus-shipyard/ipc/cd/contracts/deployments/r314159.json | jq -r '.gateway_addr'`\"\nregistry_addr = \"`curl -s https://raw.githubusercontent.com/consensus-shipyard/ipc/cd/contracts/deployments/r314159.json | jq -r '.registry_addr'`\"\nEOF\n```\n\nNote the non-default `keystore_path`.\nThis is the path where a Docker volume will be mounted to persist wallet keys for the `ipc-cli` container.\n\n3. Set up a new wallet.\n\n```sh\nmake ipc-cli-new-wallet\n```\n\nMake note of the address of the wallet you created.\nAnd set it as your default wallet:\n\n```sh\nwallet=NEW_WALLET_ADDRESS make ipc-cli-set-default-wallet\n```\n\n4. Go to the [Calibration faucet](https://faucet.calibnet.chainsafe-fil.io/) and get some funds sent to this new wallet.\n\n#### Create a child subnet\n\n```sh\nmake ipc-cli-create-subnet\n```\n\nMake a note of the address of the subnet you created.\n\n#### Join the subnet from your validator (i.e., the wallet you created earlier)\n\nFirst, get the public key of your wallet and note it down:\n\n```sh\nwallet=NEW_WALLET_ADDRESS make ipc-cli-wallet-pub-key\n```\n\nNow, join the subnet:\n\n```sh\nsubnet=NEW_SUBNET_ID pubkey=NEW_WALLET_PUBKEY make ipc-cli-join-subnet\n```\n\n#### Deposit funds\n\n```sh\nsubnet=NEW_SUBNET_ID amount=0.01 make ipc-cli-fund\n```\n\n#### Withdraw funds\n\nWithdrawing funds requires a running subnet.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F31z4%2Fipc-explorer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F31z4%2Fipc-explorer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F31z4%2Fipc-explorer/lists"}