What do I need?
A terminal with curl (built into macOS, Linux and Windows 10+) or Python 3 — or just a browser for the explorer. The commands below are written for a Unix-style shell (macOS, Linux, Git Bash on Windows); in PowerShell the quoting differs.
| Endpoint | Address | Gives you | Tier |
|---|---|---|---|
| Official RPC | https://rpc.pulsechain.com |
Blocks, balances, contract reads (JSON-RPC) | 1 |
| Explorer | https://scan.pulsechain.com |
Verified source, contract state, holders | 1 |
| Otterscan | https://otter.pulsechain.com |
Readable transaction traces | 1 |
| PulseX subgraphs | https://graph.pulsechain.com/subgraphs/name/pulsechain/pulsex and …/pulsexv2 |
Pairs, swaps, liquidity (GraphQL) | 1 |
| Beacon API | any PulseChain consensus node, e.g. base URL https://rpc-pulsechain.g4mm4.io/beacon-api plus an endpoint path (community-run node) |
Validators, epochs, genesis | 1 |
All of them were reachable on 2026-10-17. Results come back in hexadecimal; python3 -c "print(int('0x171', 16))" converts one to a normal number.
How do I check I am talking to PulseChain?
curl -s -X POST https://rpc.pulsechain.com -H "Content-Type: application/json" \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}'
The answer is {"jsonrpc":"2.0","id":1,"result":"0x171"} — 0x171 is 369, PulseChain’s chain ID. Any RPC that answers differently is not PulseChain mainnet.
How do I look at the fork block?
Block 17,233,000 is 0x106f468 in hexadecimal:
curl -s -X POST https://rpc.pulsechain.com -H "Content-Type: application/json" \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_getBlockByNumber","params":["0x106f468",false]}'
| Field | Result on 2026-10-17 | Meaning |
|---|---|---|
difficulty |
0x20000 |
131,072 — the one Proof-of-Work block, exactly the constant in go-pulse |
timestamp |
0x645c2043 |
1683759171 = 2023-05-10 22:52:51 UTC |
hash |
0x9c8280d1182c2648af6390d8ea4a00d5f4bb8d44bf39161cd8983ea5a5fb9fd0 |
The block’s identity; it differs from Ethereum’s block 17,233,000 |
Ask an Ethereum RPC for the same block number and you get a different hash and a timestamp of 22:36:23 UTC. The shared history ends at block 17,232,999; from 17,233,000 on, each chain has its own blocks. Background: How PulseChain works.
How do I read who owns a contract?
Most admin-controlled contracts have an owner() function. Its call data is the four-byte selector 0x8da5cb5b:
curl -s -X POST https://rpc.pulsechain.com -H "Content-Type: application/json" \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x95B303987A60C71504D99Aa1b13B4DA07b0790ab","data":"0x8da5cb5b"},"latest"]}'
The result is a 32-byte word; the last 40 hex characters are the address. For PLSX (0x95B303987A60C71504D99Aa1b13B4DA07b0790ab) it is all zeros: ownership is renounced, so its owner-only mint() can never be called again. The same call on INC (0x2fa878Ab3F87CC1C9737Fc071108F904c0B0C95d) returns …b2ca4a66d3e57a5a9a12043b6bad28249fe302d4 — the PulseX MasterChef, the only contract allowed to mint INC. Both results match what we read on 2026-10-17.
Without a terminal: open the contract on scan.pulsechain.com, tab Contract → Read contract (for proxies: Read proxy). It runs the same calls.
How do I read a token’s supply?
totalSupply() has the selector 0x18160ddd. Use the command above with that data instead of 0x8da5cb5b. The result is in the token’s smallest unit; divide by 10¹⁸ for tokens with 18 decimals. For PLSX it returned 141323024240766671117891079599742 on 2026-10-19 (block 27,837,219), which is 141,323,024,240,766.671117891079599742 PLSX.
How do I see how much PLS a block burned?
Each block’s burn is its baseFeePerGas times its gasUsed. This Python script needs nothing beyond the standard library:
import json, urllib.request
def rpc(url, method, params):
body = json.dumps({"jsonrpc": "2.0", "id": 1, "method": method, "params": params}).encode()
req = urllib.request.Request(url, body, {"Content-Type": "application/json", "User-Agent": "verify-script"})
return json.load(urllib.request.urlopen(req))["result"]
b = rpc("https://rpc.pulsechain.com", "eth_getBlockByNumber", ["latest", False])
burned = int(b["baseFeePerGas"], 16) * int(b["gasUsed"], 16)
print("block", int(b["number"], 16), "burned", burned / 10**18, "PLS")
Replace "latest" with a hex block number to look at any other block, or loop over a range to add up a day. Why the base fee is burned: Where do transaction fees go?
How do I check a contract is the same code on both chains?
Hash the deployed bytecode on each chain and compare. Add these lines to the script above:
import hashlib
HEX = "0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39"
for url in ("https://rpc.pulsechain.com", "https://ethereum-rpc.publicnode.com"):
code = rpc(url, "eth_getCode", [HEX, "latest"])
print(url, hashlib.sha256(bytes.fromhex(code[2:])).hexdigest())
For HEX both lines print 331e6384b4acbab47e393ee5f85290cbdd8783be817b52643441c02bc0164511: HEX on PulseChain runs byte-for-byte the code of HEX(eth) on Ethereum. If the address has no code, eth_getCode returns 0x and the script prints e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 — the SHA-256 of empty input. That marks a plain wallet, as for the bridge’s admin keys described on The bridge.
How do I check the verified source?
Open the address on scan.pulsechain.com (PulseChain) or etherscan.io (Ethereum) and select Contract. The explorer compiles the published source and compares it with the deployed bytecode.
- Full match — source and compiler metadata match. HEX is fully verified on PulseScan, and the Ethereum side of the bridge is a full match on Sourcify.
- Partial match — the executable code matches, but the embedded metadata hash (which also covers comments, file names and settings) does not. PulseScan shows PLSX, INC, WPLS, the PulseX MasterChef, factories and routers this way: the logic you read is the logic that runs.
The list of contracts with links: Source code.
How do I check the bridge’s settings?
Open the PulseChain-side message bridge 0x6ef79FD6f9f840264332884240539Ed7A2dA8b2b on PulseScan, Contract → Read proxy:
The settings that decide whether the validators are really in charge sit in two more contracts:
If a mediator ever points somewhere else, the validators no longer decide what it releases or mints. The fee managers answer getFee() for each direction and token; a value of 10¹⁸ means 100 %. Our readings, with the block numbers, are on The bridge.
How do I read PulseX numbers?
The official subgraphs answer GraphQL queries:
curl -s -X POST https://graph.pulsechain.com/subgraphs/name/pulsechain/pulsex \
-H "Content-Type: application/json" \
--data '{"query":"{ pulseXFactories { totalPairs totalLiquidityUSD } }"}'
Swap pulsex for pulsexv2 to query the v2 factory. Pair counts change with every new pool (65,440 for v1 and 191,227 for v2 on 2026-10-19, block 27,837,246); dollar values are derived from pool prices, so treat them as estimates.
How do I read validator data?
From the beacon API of a consensus node:
curl -s https://rpc-pulsechain.g4mm4.io/beacon-api/eth/v1/beacon/genesis
The answer includes "genesis_fork_version":"0x00000369", the fork version set in PulseChain’s consensus configuration — proof you are on PulseChain’s beacon chain. The validator list is at /eth/v1/beacon/states/head/validators (add ?id=0 to fetch a single validator; the full list is a large download — about 52 MB on 2026-10-19, the active-only filter about 23 MB). Filtered with ?status=active_ongoing,active_exiting,active_slashed at slot 10,862,693 (2026-10-19) it returned 46,644 active validators; see Validators. Run your own node for an endpoint you control.
How do I check the sacrifice credits?
The credits the client writes into the fork block come from a published file. Download the official compressed-allocations repository at tag Mainnet: its data/credits.bin has the SHA-256 hash 6a8b1890c13c65b2b08e8eb4af7d4707ac73b7bd5e5332c23992381493ba79e1, identical to the file embedded in go-pulse, and the repository’s decoder turns it back into a list of addresses and amounts.