Foundatio
FoundatioFx/Foundatio
A skill your agent uses when working with Foundatio infrastructure abstractions for .NET -- caching, queuing, messaging, file storage, distributed locking, or background jobs.
Help users close the state gap when a snap sync pivot moves mid-flight, using snap/2 Block Access Lists (BAL) with Nethereum (.NET) — instead of re-streaming already-fetched ranges.
$ npx skills add Nethereum/Nethereum --skill devp2p-bal-sync -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Nethereum/Nethereum devp2p-bal-sync --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Nethereum/Nethereum.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/nethereum-skills/skills/devp2p-bal-sync .claude/skills/devp2p-bal-sync && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "devp2p-bal-sync" agent skill from https://github.com/Nethereum/Nethereum/tree/master/plugins/nethereum-skills/skills/devp2p-bal-sync into .claude/skills/devp2p-bal-sync/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "devp2p-bal-sync", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Nethereum/Nethereum/tree/master/plugins/nethereum-skills/skills/devp2p-bal-syncType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Nethereum/Nethereum --skill devp2p-bal-sync -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Nethereum/Nethereum devp2p-bal-sync --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Nethereum/Nethereum.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/nethereum-skills/skills/devp2p-bal-sync .agents/skills/devp2p-bal-sync && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "devp2p-bal-sync" agent skill from https://github.com/Nethereum/Nethereum/tree/master/plugins/nethereum-skills/skills/devp2p-bal-sync into .agents/skills/devp2p-bal-sync/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "devp2p-bal-sync", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Nethereum/Nethereum --skill devp2p-bal-sync -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Nethereum/Nethereum devp2p-bal-sync --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Nethereum/Nethereum.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/nethereum-skills/skills/devp2p-bal-sync .cursor/skills/devp2p-bal-sync && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "devp2p-bal-sync" agent skill from https://github.com/Nethereum/Nethereum/tree/master/plugins/nethereum-skills/skills/devp2p-bal-sync into .cursor/skills/devp2p-bal-sync/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "devp2p-bal-sync", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Nethereum/Nethereum.git --path plugins/nethereum-skills/skills/devp2p-bal-sync--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Nethereum/Nethereum --skill devp2p-bal-sync -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Nethereum/Nethereum devp2p-bal-sync --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Nethereum/Nethereum.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/nethereum-skills/skills/devp2p-bal-sync .gemini/skills/devp2p-bal-sync && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "devp2p-bal-sync" agent skill from https://github.com/Nethereum/Nethereum/tree/master/plugins/nethereum-skills/skills/devp2p-bal-sync into .gemini/skills/devp2p-bal-sync/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "devp2p-bal-sync", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Nethereum/Nethereum devp2p-bal-syncInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Nethereum/Nethereum --skill devp2p-bal-sync -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Nethereum/Nethereum.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/nethereum-skills/skills/devp2p-bal-sync .github/skills/devp2p-bal-sync && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "devp2p-bal-sync" agent skill from https://github.com/Nethereum/Nethereum/tree/master/plugins/nethereum-skills/skills/devp2p-bal-sync into .github/skills/devp2p-bal-sync/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "devp2p-bal-sync", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Nethereum/Nethereum --skill devp2p-bal-sync -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Nethereum/Nethereum devp2p-bal-sync --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Nethereum/Nethereum.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/nethereum-skills/skills/devp2p-bal-sync .opencode/skills/devp2p-bal-sync && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "devp2p-bal-sync" agent skill from https://github.com/Nethereum/Nethereum/tree/master/plugins/nethereum-skills/skills/devp2p-bal-sync into .opencode/skills/devp2p-bal-sync/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "devp2p-bal-sync", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
devp2p-bal-syncHelp users close the state gap when a snap sync pivot moves mid-flight, using snap/2 Block Access Lists (BAL) with Nethereum (.NET) — instead of re-streaming already-fetched ranges.
Devp2p Bal Sync is an agent skill from Nethereum/Nethereum. Help users close the state gap when a snap sync pivot moves mid-flight, using snap/2 Block Access Lists (BAL) with Nethereum (.NET) — instead of re-streaming already-fetched ranges. Use this skill whenever the user mentions block access list, BAL heal, snap/2, snap-v2, heal while the pivot moves, BalHealEnabled, BlockAccessListFetcher/Verifier/Applier, or patching state deltas during snap sync on Amsterdam or later.
Its SKILL.md is about 2.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Backend & APIs. It works with .NET. The repository describes itself as: Ethereum .Net cross platform integration library. The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 229f278. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
dotnetFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
docs.nethereum.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Devp2p Bal Sync loads about 2.2k tokens when it runs. Until then it costs about 109 tokens; SKILL.md has 944 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Nethereum/Nethereum at commit 229f278, republished under its MIT licence (© Nethereum). 944 words, ~2,201 tokens.
.claude/skills/devp2p-bal-sync/SKILL.md (or your agent's skills folder).Snap sync (devp2p-snap-sync) follows a rolling pivot as the chain advances, and Phase 3 heal re-fetches missing trie nodes when the root doesn't match. But there's a gap those mechanisms don't close by themselves: while Phase 2/3 is still streaming or healing, the live chain keeps producing blocks — and the account/storage ranges you already fetched at the old pivot are now stale relative to the new one. Re-streaming those ranges from scratch would waste everything already downloaded. Snap-v2's Block Access List (BAL) — a per-block account/storage/code/nonce/balance change set — lets you patch just the deltas instead. This is an advanced, opt-in path: everything here sits behind SnapSyncOrchestratorOptions.BalHealEnabled, which defaults to false.
dotnet add package Nethereum.DevP2P.SyncThis skill assumes you've already read devp2p-snap-sync — BAL heal is a supplement to Phase 2/3, not a replacement. You also need peers advertising snap/2 — devp2p-peer-connect covers DevP2PConfig.AdvertiseSnap2, the flag that puts snap/2 in your own Hello.
Everything Phase 2 has already fetched has a frontier — the boundary of account/storage ranges already covered. When the pivot moves mid-flight, Snap/CatchUp's job is narrow and specific:
This is the same trustless-fetch discipline as the rest of the sync engine (devp2p-full-sync, devp2p-snap-sync): nothing gets applied to state without being checked against a cryptographic commitment first.
IBlockAccessListFetcher (concrete: BlockAccessListFetcher) fetches raw BAL entries for a set of block references from serviceable peers, retrying and redistributing across peers on refusal, hash mismatch, or a stateless response:
// IBlockAccessListFetcher.FetchAsync — Snap/CatchUp/IBlockAccessListFetcher.cs:10
Task<IReadOnlyList<IReadOnlyList<AccountChanges>>> FetchAsync(
IReadOnlyList<BalBlockRef> blocks, CancellationToken ct);Each BalBlockRef is (byte[] BlockHash, byte[] BlockAccessListHash) — the block's identity plus the commitment the fetched entry must hash-match. The fetcher batches at most MaxHashesPerRequest (28) blocks per request within a ResponseByteBudget of 2 MiB, and throws InvalidOperationException if a block becomes unobtainable from every serviceable peer — there's no silent partial result to accidentally apply.
BlockAccessListVerifier.Verify(expectedBalHashes, rawEntries) Keccak-hashes each raw entry against its expected commitment and decodes it via BlockAccessListRLPEncoder, returning one VerifiedBlockAccessList per entry:
VerifiedBlockAccessList.Status (enum BlockAccessListStatus) is one of Verified / Unavailable / HashMismatch.Verified does the result carry a decoded IReadOnlyList<AccountChanges> — an Unavailable or HashMismatch result carries nothing to apply.This is the checkpoint that keeps a malicious or buggy peer from injecting fabricated balance/storage changes: a mismatched hash is discarded, not applied.
IBlockAccessListApplier (concrete: BlockAccessListApplier) is where verified changes actually land in storage:
// IBlockAccessListApplier.ApplyAsync — Snap/CatchUp/IBlockAccessListApplier.cs:10
Task ApplyAsync(IReadOnlyList<AccountChanges> blockAccessList, ISnapTaskFrontier frontier, CancellationToken ct = default);ApplyAsync applies a verified block's AccountChanges — balance, nonce, code, and storage — into flat state (ISnapFlatStateWriter, plus IStateStore for code), and, when supplied, into the in-progress trie via IHealedStateWriter. Empty accounts are deleted, matching Ethereum's account-clearing rule. Within one account's changes, conflicting writes at different points in the block resolve last-writer-wins by BlockAccessIndex — not by list order:
Given balance changes at indices
3(→ 500) and0(→ 100) submitted in that order, the applied balance is 500 — the change with the higherBlockAccessIndexwins, regardless of which one appears first in the list.
Confirmed in tests/Nethereum.DevP2P.Sync.UnitTests/CatchUp/BlockAccessListApplierTests.cs:24 (Given_BalanceAndNonceChanges_When_Applied_Then_PostValuesAreLastWriteByIndexNotByListOrder).
ISnapTaskFrontier (concrete: SnapTaskFrontier) is what makes "only patch state already fetched" possible — it answers two questions the applier asks before writing anything:
IsAccountFetched(accountHash)IsStorageFetched(accountHash, slotHash)If an account or slot falls outside the Phase-2 range-task frontier, the applier skips it — that range hasn't been streamed yet, so applying a delta to it now would create state that's inconsistent with everything around it. It'll be picked up correctly once Phase 2 actually reaches that range.
IBlockAccessListPeerSource (concrete: PeerPoolBlockAccessListPeerSource) filters your existing peer pool down to sessions where SyncPeerSession.SupportsSnap2 is true — you don't maintain a separate BAL-capable peer list; it's derived from the same pool devp2p-peer-connect and devp2p-peer-discovery built up.
BAL heal is opt-in for a reason — it's additional machinery most syncs don't need. Enable it via the orchestrator option (devp2p-snap-sync):
var options = new SnapSyncOrchestratorOptions { BalHealEnabled = true };Gotcha — the flag alone isn't enough. Setting BalHealEnabled = true has no effect unless the block's active hardfork is Amsterdam or later — SnapBootstrapper.ShouldBalHeal gates on both the option and the fork schedule. Enabling the flag against a pre-Amsterdam chain silently does nothing; there's no error, because BAL simply isn't part of the wire protocol yet at that fork.
Verified in tests/Nethereum.DevP2P.Sync.UnitTests/SnapBalHealGapCloserTests.cs:36-53 (ShouldBalHeal_DisabledByConfig_ReturnsFalse, ShouldBalHeal_EnabledButPreAmsterdam_ReturnsFalse, ShouldBalHeal_EnabledAndAmsterdamActive_ReturnsTrue); default false is set in SnapSyncOrchestratorOptions.cs:39.
| Symptom | Cause | Fix |
|---|---|---|
BalHealEnabled = true but nothing happens | Pre-Amsterdam fork active at the pivot | Confirm IChainActivations resolves Amsterdam or later at the relevant block |
BlockAccessListFetcher.FetchAsync throws InvalidOperationException | Every serviceable (snap/2-supporting) peer refused, mismatched, or went stateless for at least one requested block | Widen the peer pool, or check whether any peers actually advertise snap/2 (DevP2PConfig.AdvertiseSnap2) |
| A verified BAL entry doesn't change state | The affected account/slot fell outside ISnapTaskFrontier's already-fetched range | Expected — that range will be covered correctly once Phase 2 reaches it |
| Conflicting values for the same account after apply | Assumed list order determines the winner | It doesn't — highest BlockAccessIndex wins, regardless of list position |
| Situation | Action |
|---|---|
| Pivot is stable, Phase 2/3 keeps up on its own | Leave BalHealEnabled at its default (false) — no need for this machinery |
| Pivot moves faster than heal converges, chain is on/after Amsterdam | Enable BalHealEnabled; peers must advertise snap/2 |
| Pivot moves but chain is pre-Amsterdam | BAL heal is unavailable at this fork — rely on TrieHealer's own pivot-follow instead (see devp2p-snap-sync) |
For full documentation, see: https://docs.nethereum.com/docs/devp2p/guide-block-access-lists
© Nethereum, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in plugins/nethereum-skills/skills/devp2p-bal-sync of Nethereum/Nethereum.
Open the folder on GitHubat commit 229f278
Devp2p Bal Sync next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Devp2p Bal Sync this skillNethereum/Nethereum | 2.3k | — | ~2.2k | Automated safety check: Pass | MIT | |
| FoundatioFoundatioFx/Foundatio | 2.1k | — | ~3.9k | Automated safety check: Pass | Apache-2.0 | |
| Aspnet Corefanslead/ReverseProxy.Store | 163 | 2 repos | ~1.4k | Automated safety check: Pass | Apache-2.0 | |
| .NET API Compatibility DesignAaronontheweb/dotnet-skills | 1.2k | 2 repos | ~2.7k | Automated safety check: Pass | MIT | |
| Msal Auth Code FlowAzureAD/microsoft-authentication-library-for-dotnet | 1.5k | — | ~917 | Automated safety check: Pass | MIT | |
| Tsp Csharpquerylenshq/ef-querylens | 225 | — | ~1.3k | Automated safety check: Pass | MIT |
FoundatioFx/Foundatio
A skill your agent uses when working with Foundatio infrastructure abstractions for .NET -- caching, queuing, messaging, file storage, distributed locking, or background jobs.
fanslead/ReverseProxy.Store
Build, review, refactor, or architect ASP.NET Core web applications using current official guidance for .NET web development.
Aaronontheweb/dotnet-skills
Applies extend-only design rules to NuGet packages and distributed systems, covering source, binary and wire compatibility and how to deprecate members safely.
AzureAD/microsoft-authentication-library-for-dotnet
Authorization Code Flow for web applications using MSAL.NET confidential client to sign in users and access APIs on their behalf
querylenshq/ef-querylens
Comprehensive C and .NET development skill for TSP projects.
AzureAD/microsoft-authentication-library-for-dotnet
Client Credentials Flow for service-to-service (daemon) authentication in MSAL.NET without user involvement
Nethereum/Nethereum
Help users batch multiple calls into a single UserOperation and sponsor gas with paymasters using Nethereum Account Abstraction.
Nethereum/Nethereum
Help users run an ERC-4337 bundler using Nethereum — set up in-process or standalone bundlers with mempool, validation, reputation, and JSON-RPC server.
Nethereum/Nethereum
Encode and decode Ethereum ABI data with Nethereum. An agent skill from Nethereum/Nethereum.
Nethereum/Nethereum
Fetch contract ABIs from Sourcify, Etherscan, and 4Byte Directory using the composite ABIInfoStorage pattern (.NET/C).
Nethereum/Nethereum
Help users implement ERC-4337 Account Abstraction with Nethereum — send UserOperations, use smart accounts, route contract calls through a bundler, enable gasless transactions, or work with AA in…
Nethereum/Nethereum
Validate and format Ethereum addresses with Nethereum. An agent skill from Nethereum/Nethereum.
Works with
Categories
Help users close the state gap when a snap sync pivot moves mid-flight, using snap/2 Block Access Lists (BAL) with Nethereum (.NET) — instead of re-streaming already-fetched ranges. Devp2p Bal Sync is an agent skill from Nethereum/Nethereum.NET) — instead of re-streaming already-fetched ranges.
Devp2p Bal Sync fits situations like: the user mentions block access list; heal while the pivot moves; blockAccessListFetcher/Verifier/Applier; patching state deltas during snap sync on Amsterdam.
Run `npx skills add Nethereum/Nethereum --skill devp2p-bal-sync -a claude-code`. Or copy the skill folder (plugins/nethereum-skills/skills/devp2p-bal-sync in Nethereum/Nethereum) into .claude/skills/devp2p-bal-sync in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Nethereum/Nethereum --skill devp2p-bal-sync -a codex`. Or copy the skill folder (plugins/nethereum-skills/skills/devp2p-bal-sync in Nethereum/Nethereum) into .agents/skills/devp2p-bal-sync in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Nethereum/Nethereum --skill devp2p-bal-sync -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/devp2p-bal-sync, .gemini/skills/devp2p-bal-sync, .github/skills/devp2p-bal-sync and .opencode/skills/devp2p-bal-sync in your project.
Going by SKILL.md and its folder, Devp2p Bal Sync needs the command-line tools its instructions call (dotnet).
SKILL.md names 1 domain. As links in the text: docs.nethereum.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Devp2p Bal Sync is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.2k tokens (SKILL.md is roughly 8.8k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Devp2p Bal Sync: Foundatio (FoundatioFx/Foundatio, 2.1k stars), Aspnet Core (fanslead/ReverseProxy.Store, 163 stars), .NET API Compatibility Design (Aaronontheweb/dotnet-skills, 1.2k stars) and Msal Auth Code Flow (AzureAD/microsoft-authentication-library-for-dotnet, 1.5k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Nethereum (a GitHub organization) maintains it in Nethereum/Nethereum, which has 2,260 GitHub stars. The repository holds 71 skills in this directory. The repository was last updated on October 5, 2026.
Source: Nethereum/Nethereum on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.