Skip to content

feat(onchain-monitor): watch wallets and contracts on Robinhood Chain - #1244

Merged
aaronjmars merged 3 commits into
aeonfun:mainfrom
sentinelhood:feat/onchain-monitor-robinhood
Oct 20, 2026
Merged

aaronjmars merged 3 commits into
aeonfun:mainfrom
sentinelhood:feat/onchain-monitor-robinhood

Conversation

@sentinelhood

@sentinelhood sentinelhood commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

What

Teaches onchain-monitor to watch wallets and contracts on Robinhood Chain (chainId 4663), with a keyless path that actually returns data.

Why

onchain-monitor only accepted ethereum | base | arbitrum | optimism | polygon. Replying 0x… robinhood to the add-address force-reply silently saved the watch as ethereum. Robinhood Chain already has 13 live Aeon fleet hooks (univ4-hooks) and deploy-uni-hook / submit-hook target it, so the monitoring side was the gap.

Just adding the name is not enough: Etherscan v2's free tier refuses chainid=4663 ("Free API access is not supported for this chain", checked for txlist, getLogs, proxy). A keyless operator would get nothing. Hence a third path.

Changes (skills/onchain-monitor/SKILL.md)

  • robinhood added to the allowlist (config example + step-0 case), Alchemy slug map (robinhood=robinhood-mainnet), chainid map (robinhood=4663), explorer list (robinhoodchain.blockscout.com).
  • Path C — Robinhood public RPC (keyless fallback, robinhood only): ERC-20 Transfer logs with the watch as recipient, then as sender, via eth_getLogs on rpc.mainnet.chain.robinhood.com. That RPC caps queries without an address filter at 30,000 blocks, so the range is walked in 30,000-block windows. symbol()/decimals() via eth_call. Footer reports path=rpc (erc20 only).
  • First-run window: current_block − 280000 on robinhood (~0.103s blocks), the same ≈8h as the existing ETH default.
  • Path A wording corrected: Alchemy allows any range while the response is < 10,000 logs, or unlimited logs for ≤ 5,000 blocks. The old "~10k block ranges" fails on busy Robinhood contracts (v4 PoolManager emits ~8.6k logs per 5,000 blocks, under 10 minutes).
  • eyebrowlock.json: only the onchain-monitor entry changes — new hashes + the one new egress host rpc.mainnet.chain.robinhood.com.

Verified (live, mainnet)

  • Path C snippet run verbatim against a real trading wallet: 21 in / 25 out in one 30,000-block window; ~8h = 20 calls, ~6s; ~29h = 68 calls, ~21s. symbol()/decimals() decode. A 30,001-block window is rejected by the RPC (cap confirmed).
  • Path A with a real Alchemy key on robinhood-mainnet: alchemy_getAssetTransfers both directions → 50 transfers each (ERC-20 + external ETH, withMetadata timestamps); eth_getLogs by address at 2,000 blocks → 3,507 logs; 10,000 blocks → Log response size exceeded.
  • Step-0 add-address bash extracted verbatim and run in a temp dir with a stub ./notify: robinhood and Robinhood accepted, duplicate address → "Already watching", unknown chain still falls back to ethereum.
  • eyebrow verify --ci (v0.5.6, same as CI): fails without the lock update (capability expansion), passes with it. scripts/skill-scan.sh PASS; lock coverage step OK; validate-skill-packs.mjs, validate-readme-catalog.mjs, validate-config.js OK; git diff --check clean.

Known limits (stated so nothing surprises a reviewer)

  • Pricing: CoinGecko has the robinhood asset platform, but the Robinhood memecoins I tested return {} from simple/token_price/robinhood. Those events become UNPRICED per the existing step 3 (logged, not notified). Alerts on Robinhood are therefore strongest for priced assets / native ETH (Path A).
  • Path C sees ERC-20 transfers only, not native ETH; this is written in the skill and surfaced in the footer.

Type of change

  • Core fix (dashboard / scripts / workflows / docs)

Core fix (dashboard / scripts / workflows / docs)

  • Change is focused — one concern (Robinhood Chain support in onchain-monitor), no unrelated refactor
  • Touched code follows the existing pattern in the file (same Path A/B structure, curl for the public keyless endpoint as in the Network note)
  • Relevant CI gates pass locally (eyebrow verify --ci, skill-scan, lock coverage, validators)
  • Touched apps/**? — n/a

View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

sentinelhood and others added 2 commits October 18, 2026 18:32
Adds robinhood (chainId 4663) to the chain allowlist, Alchemy slug, chainid map and explorer list. Etherscan v2's free tier refuses chainid 4663, so a keyless robinhood watch gets Path C: ERC-20 Transfer logs from the public RPC in 30,000-block windows (the RPC's cap for unfiltered-address queries). First-run window scaled for ~0.1s blocks. eyebrowlock.json refreshed for the one new egress host.

@aaronjmars aaronjmars left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checked live: chain id 4663, the 30k-block cap, the Alchemy getLogs limits, and CoinGecko pricing. I pushed one maintainer commit (aa1e257). Alchemy rejects the internal category on robinhood-mainnet, so Path A now drops it there. It also notes that Path C windows are 0x-hex and fixes the window count. Thanks.

@aaronjmars

Copy link
Copy Markdown
Collaborator

checked it again live, holds up. merging. 3 small follow-ups for a next PR:

  1. wallet windows can also hit logs matched by query exceeds limit of 10000 on a busy address (the v4 PoolManager does inside one 30k-block window), so the split rule should cover wallets too, not just contracts
  2. ERC-721 Transfer has the same topic0 and matches the wallet filters (4 topics, empty data). keep 3-topic logs as erc20, skip or tag the 4-topic ones
  3. docs/community-skill-packs.md:288 still says onchain-monitor doesn't cover Robinhood Chain

thanks

@Svector-anu Svector-anu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dogfooded this against our own onchain-monitor (it's installed on my fork) and ran path c live on robinhood mainnet. holds up — chainid 4663, blockscout resolves, the 30k-block cap is real. approving.

two things worth the next-pr list @aaronjmars started:

1. the erc-721 collision is live, not theoretical. ran path c's exact wallet filter (topic0=Transfer, no address) over a 60-block window just now: 318 Transfer logs, 5 of them 4-topic with empty data — real nft moves on rh right this minute. and it's worse than mis-tagging: erc-721 has no decimals(), so a 4-topic log that slips the filter makes the decimals() eth_call revert and the amount math divide by 10^0 — it'd report the raw tokenId as the transfer size. your topic-count skip kills both; just flagging it should land before this hits a real wallet.

2. catch-up window blow-up on ~0.1s blocks. github drops most */5 ticks and the scheduler catches up to 12h late. on robinhood a 12h gap is ~400k blocks = ~14 windows/direction/watch, so one late run across a few rh watches fires 50-100+ sequential rpc calls, every one eligible for the 429 path. worth clamping the first-fetch span to the ~280k first-run default so a delayed run degrades to "last ~8h" instead of walking the whole gap.

minor: path c has no WebFetch fallback the way path a/b do — on a non-429 rpc failure it just marks fail. fine for now, noting for parity.

+1 on the docs line — community-skill-packs.md:288 is the Sentinel Pack row, still says onchain-monitor "does not cover" robinhood. one-liner once this merges.

nice work.

@sentinelhood

Copy link
Copy Markdown
Contributor Author

Thanks both for the reviews. The follow-ups are ready on my side: bisect on the 10k-log limit for wallets too, ERC-721 vs ERC-20 by topic count, the docs row fix, plus Svector-anu's 280k catch-up clamp and the WebFetch retry. I'll open them as a separate PR once this one is in.

@aaronjmars
aaronjmars merged commit 24f2442 into aeonfun:main Oct 20, 2026
6 checks passed
@aaronjmars aaronjmars mentioned this pull request Oct 20, 2026
6 tasks done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants