Project Introduction
PortalNode is a keeper for Portaldot staking. Every era it sends the payout that pays validators and their nominators, from its own fee-only key, about a minute after the era closes. It proves each claim from a finalized block, writes each validator’s paid-through era to a Solidity contract any dApp can read, and lets anyone claim for any validator or nominator from their own wallet. It also tracks node liveness the way the chain counts it, and sends Telegram alerts that include the fix.
Problem Solved
Portaldot pays staking rewards only when someone sends a payout transaction, and an era nobody claims is lost after 84 eras. Anyone may send it; usually nobody does. On mainnet today (8 Nov, block 2,762,407) an estimated 253,656 POT sits unclaimed in the 84-era window, 10,872 POT of it expires within the next 7 days, and 8 of 10 validators have not claimed a single era in that window. Their nominators lose that money without knowing it.
Link
Live Web / Demo Video: https://portalnode.timidan.xyz · https://youtu.be/jJg5hGhqhWE
Pitch Deck: portalnode/docs/PortalNode-deck.pdf at main · Timidan/portalnode · GitHub
Technical Highlights
1. It sends the payouts, unattended, on the V3 testnet
Real staking.payoutStakersByPage transactions from a fee-only keeper key. Since 18 Oct it has sent 210 payouts, 374.81 tPOT to the validators, each about a minute after its era closed, and no era has expired. Every receipt is re-checked live against its finalized block: https://portalnode.timidan.xyz/api/receipts
2. Crash-safe and provable
Each attempt is saved before it is broadcast and counted only from a finalized receipt, so a crash or a dropped connection never claims twice or loses track. On 31 Oct the public V3 endpoint served a different chain for about 45 minutes: PortalNode raised a critical alert with its fix, the keeper refused to sign on that chain, and it carried on once the right chain came back.
3. Paid-through eras on chain (pallet-revive + Solidity)
Each era the keeper writes every validator’s last fully paid era and its liveness to ValidatorHealth at 0x072a1022f537a0da496801239725539101a41bb2, and any contract can call isHealthy(). It has reported every era since era 50. The source in the repo recompiles to the deployed code, apart from the immutable reporter address.
4. Anyone can claim, on V3 or mainnet
Paste a validator or nominator address: PortalNode lists the unpaid eras, builds the payout batch oldest era first, and opens it in Portaldot’s Node Console for your own wallet to sign. Your keys never leave your wallet.
5. Alerts that include the fix
Liveness as pallet-im-online counts it (a block or a heartbeat), a session-key check, and Telegram or Discord alerts: one message when a problem starts and one when it clears, each with the step that fixes it. Screenshots from the live bot are in the README. A setup wizard puts bond, session keys and validate into one utility.batchAll to sign in Node Console.
Team
Solo build by Timidan
- GitHub: github.com/Timidan
- X: x.com/timidan_x
- Project nature: a solo build for the Node Operations & Tooling track, aimed at the staking rewards Portaldot validators and nominators lose every era
Judges & Voting Fit
For Judges: Running on the V3 testnet since 18 Oct with 210 payouts, each re-verified against its finalized block; a deployed Solidity contract updated every era; public receipts anyone can re-check; MIT open source; and a read-only mainnet view that shows what unclaimed rewards cost right now.
For Community Voters: If you nominate on Portaldot, rewards you earned may be expiring right now. Paste your address at https://portalnode.timidan.xyz to see your unpaid eras and claim them from your own wallet in one batch.