tag:github.com,2008:https://github.com/Nethereum/Nethereum/releasesRelease notes from Nethereum2026-03-18T08:01:55Ztag:github.com,2008:Repository/46746187/6.0.42026-03-18T10:25:06Z6.0.4<h1>Nethereum 6.0.4</h1>
<p>Nethereum 6.0.4 adds the new <code>nethereum-dapp</code> Aspire template for full-stack dApp development (Solidity + C# + Blazor + EIP-6963 wallet), fixes Explorer ABI auto-discovery from Foundry artifacts, resolves blazor.web.js compatibility with .NET 10 NuGet-packaged Razor components, improves EIP-6963 wallet CSS and interop, adds a parallel NuGet build script, and introduces GitHub Actions CI with prerelease publishing.</p>
<p><a href="https://github.com/Nethereum/Nethereum/compare/6.0.0...6.0.4">Full Changelog</a></p>
<h2>Nethereum.Aspire.TemplatePack — New <code>nethereum-dapp</code> Template</h2>
<p>New full-stack dApp template creating a complete development environment with 9 projects — Solidity contracts (Foundry), C# typed services (code generation), Blazor WebApp with EIP-6963 wallet integration, embedded TDD and E2E tests, and the full DevChain + Indexer + Explorer infrastructure, all orchestrated by .NET Aspire.</p>
<ul>
<li><strong>WebApp</strong> with EIP-6963 wallet discovery, chain validation, and <code>wallet_addEthereumChain</code> switching</li>
<li>Three UI states: not connected → wrong chain → correct chain (deploy/mint/transfer/balance)</li>
<li>Light-themed CSS with card-based layout, form styling, and wallet CSS custom properties</li>
<li><strong>Foundry contracts</strong> project with starter ERC-20 (MyToken + mint), Forge tests, and deploy scripts</li>
<li><strong>ContractServices</strong> with pre-generated C# typed contract access from Solidity ABI</li>
<li><strong>Tests</strong> project with fast TDD using embedded DevChain (no Docker needed)</li>
<li><strong>IntegrationTests</strong> project for E2E testing against the running AppHost</li>
<li><strong>LoadGenerator</strong> with random mint/transfer/ETH send operations</li>
<li>Code generation scripts (<code>generate-csharp.ps1</code> / <code>.sh</code>) invoking <code>Nethereum.Generator.Console</code></li>
<li>AppHost configures Explorer ABI auto-discovery from <code>contracts/out/</code> Foundry artifacts</li>
<li>Local Explorer <code>App.razor</code> override to fix <code>blazor.web.js</code> compatibility with NuGet-packaged Razor components on .NET 10</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/f500fcc0641ebfaa8a97ce92f4ede6b0ccc9821f/hovercard" href="https://github.com/Nethereum/Nethereum/commit/f500fcc0641ebfaa8a97ce92f4ede6b0ccc9821f"><tt>f500fcc</tt></a>, 818cc8af, 9c68e081, 4828ebda</p>
<h2>Nethereum.Aspire.TemplatePack — DevChain Template Fixes</h2>
<ul>
<li>Fixed project references from old <code>NethereumDevChain_</code> prefixed names to clean <code>Projects.DevChain</code>, <code>Projects.Indexer</code>, <code>Projects.Explorer</code></li>
<li>Updated to async <code>MapDevChainEndpointsAsync()</code> matching library API changes</li>
<li>Added local Explorer <code>App.razor</code> override for blazor.web.js .NET 10 compatibility</li>
<li>Updated Aspire version to 13.1.1 in README examples</li>
<li>Updated default Nethereum version to 6.0.4</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/76c796effa1e30ba7e8a0730e7d066efaecf7368/hovercard" href="https://github.com/Nethereum/Nethereum/commit/76c796effa1e30ba7e8a0730e7d066efaecf7368"><tt>76c796e</tt></a>, d348e405, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/60e76cc38315f92dfa1b3815242c321fb77b376c/hovercard" href="https://github.com/Nethereum/Nethereum/commit/60e76cc38315f92dfa1b3815242c321fb77b376c"><tt>60e76cc</tt></a></p>
<h2>Nethereum.Explorer — Runtime Bytecode ABI Matching</h2>
<p>The Explorer now automatically discovers contract ABIs by matching on-chain runtime bytecode against locally loaded Foundry/Hardhat artifacts. Previously, <code>FileSystemABIInfoStorage</code> loaded artifacts but only matched by contract address (which required prior registration). Now the <code>AbiStorageService</code> falls back to bytecode-based matching:</p>
<ol>
<li>Fetch on-chain bytecode via <code>eth_getCode</code></li>
<li>Compare against all loaded Foundry artifacts (stripping metadata suffixes)</li>
<li>On match: bind the ABI to the contract address, persist to the database, and serve decoded function calls</li>
</ol>
<p>This means: deploy a contract from the dApp WebApp or via <code>forge script</code>, navigate to its address in the Explorer, and the ABI is available immediately — no manual upload needed.</p>
<ul>
<li>Added <code>FileSystemABIInfoStorage</code> and <code>IWeb3</code> dependencies to <code>AbiStorageService</code></li>
<li>New bytecode matching fallback in <code>GetContractAbiAsync</code> after address-based and external source lookups fail</li>
<li>Registers matched contract address for future direct lookups via <code>RegisterContractAddress</code></li>
<li>Persists matched ABI to the Contracts database table</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/6e1921f88495cf34132696f48f993b31ee819f35/hovercard" href="https://github.com/Nethereum/Nethereum/commit/6e1921f88495cf34132696f48f993b31ee819f35"><tt>6e1921f</tt></a></p>
<h2>Nethereum.Explorer — Wallet CSS Fix</h2>
<p>Fixed wallet button and dropdown styling in the Explorer when using the <code>EIP6963Wallet</code> component with <code>Theme="None"</code>. The Blazor scoped CSS from <code>EIP6963Wallet.razor.css</code> had higher specificity than the Explorer's unscoped <code>.no-theme</code> overrides, causing oversized fonts and icons in the navbar.</p>
<ul>
<li>Added <code>!important</code> to all <code>.no-theme</code> wallet CSS rules (button, dropdown, icon sizing)</li>
<li>Compact 0.8rem font, 1.25em icons, proper dropdown positioning now wins over scoped styles</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/6e1921f88495cf34132696f48f993b31ee819f35/hovercard" href="https://github.com/Nethereum/Nethereum/commit/6e1921f88495cf34132696f48f993b31ee819f35"><tt>6e1921f</tt></a></p>
<h2>Nethereum.EIP6963WalletInterop — personal_sign Fix</h2>
<p>Fixed <code>personal_sign</code> passing a JSON string instead of the raw address parameter, which caused MetaMask to reject the signing request.</p>
<p>Commits: ce721746</p>
<h2>Nethereum.DevChain — Hosting Improvements</h2>
<ul>
<li>Moved hosting extension types from <code>Nethereum.DevChain.Server</code> to the core <code>Nethereum.DevChain</code> library</li>
<li>Added reusable <code>WebApplicationExtensions</code> for <code>MapDevChainEndpointsAsync()</code> — async endpoint mapping</li>
<li>Enables any ASP.NET Core host to serve DevChain endpoints without depending on the Server package</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/ef3e25eebf94da19f8356460aaf1ca564b4daa3d/hovercard" href="https://github.com/Nethereum/Nethereum/commit/ef3e25eebf94da19f8356460aaf1ca564b4daa3d"><tt>ef3e25e</tt></a></p>
<h2>Contract Deployment Race Condition Fix</h2>
<p>Fixed a race condition where <code>DeployContractAndWaitForReceiptAsync</code> could fail because the contract code wasn't yet available at the deployed address. Now polls <code>eth_getCode</code> to verify the contract is deployed before returning.</p>
<p>Commits: bb5b2209</p>
<h2>Wallet Price Refresh & Overflow Fixes</h2>
<ul>
<li>Price refresh service with two-threshold model for stale/expired prices</li>
<li>Fixed overflow in <code>ValidateUpperBytes</code> preventing incorrect integer decoding</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/5d391e3aba7012671d594c2f4608ee989845852e/hovercard" href="https://github.com/Nethereum/Nethereum/commit/5d391e3aba7012671d594c2f4608ee989845852e"><tt>5d391e3</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/2dcb306c035dc76128ab53f2b38aa2372444354f/hovercard" href="https://github.com/Nethereum/Nethereum/commit/2dcb306c035dc76128ab53f2b38aa2372444354f"><tt>2dcb306</tt></a></p>
<h2>MinimalHdWallet Moved to Nethereum.Accounts</h2>
<p>Moved <code>MinimalHdWallet</code> from standalone package to <code>Nethereum.Accounts</code> for .NET 6+ frameworks, reducing dependency count for common wallet operations.</p>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/fbfcbf64d15f219a02ce82984b1e441049bc77f9/hovercard" href="https://github.com/Nethereum/Nethereum/commit/fbfcbf64d15f219a02ce82984b1e441049bc77f9"><tt>fbfcbf6</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/76e56c0bc6d15f7566371217f0ede6d0f9d8f001/hovercard" href="https://github.com/Nethereum/Nethereum/commit/76e56c0bc6d15f7566371217f0ede6d0f9d8f001"><tt>76e56c0</tt></a></p>
<h2>SparseMerkleTree Optimisations</h2>
<p>Performance improvements to the Sparse Merkle Tree implementation used by the EVM and state verification.</p>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/4026d4a79f1ab57801996769ff7ff6a55b38f7f9/hovercard" href="https://github.com/Nethereum/Nethereum/commit/4026d4a79f1ab57801996769ff7ff6a55b38f7f9"><tt>4026d4a</tt></a></p>
<h2>Build & CI</h2>
<ul>
<li><strong>Version bump</strong>: 6.0.0 → 6.0.4</li>
<li><strong>Herumi native packages</strong>: 6.0.2, 6.0.3, 6.0.4 packed to <code>nativeartifacts/</code></li>
<li><strong>nuget.bat</strong>: Fixed Herumi output path from <code>..\nativeartifacts</code> to <code>..\..\nativeartifacts</code></li>
<li><strong>nuget-fast.ps1</strong>: New parallel PowerShell build script — builds all projects once then packs with <code>--no-build</code> using <code>ForEach-Object -Parallel</code> (PowerShell 7+). Configurable thread count via <code>-MaxParallel</code>.</li>
<li><strong>GitHub Actions</strong>: Updated workflow with .NET 6/8/9/10, MAUI workload, prerelease publishing to GitHub Packages on push to master</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/c5830e83ed97fa134d9c8d57893c1a0d4c2fec67/hovercard" href="https://github.com/Nethereum/Nethereum/commit/c5830e83ed97fa134d9c8d57893c1a0d4c2fec67"><tt>c5830e8</tt></a></p>
<h2>Documentation</h2>
<ul>
<li>New Aspire Templates documentation section with 12 guides covering the complete developer journey:
<ul>
<li>Getting Started: DevChain template, dApp template</li>
<li>Solidity Development: VS Code setup, writing contracts, Forge testing, Forge deploy</li>
<li>C# Integration: code generation, unit testing, integration testing</li>
<li>dApp Development: wallet integration, token interaction UI, Explorer ABI discovery</li>
</ul>
</li>
<li>Plugin skills: <code>aspire-devchain</code>, <code>aspire-dapp</code></li>
<li>Updated global pages: What Do You Want To Do, Component Catalog, Landing Page</li>
<li><code>[NethereumDocExample]</code> attribute and tagged tests for core-foundation README examples</li>
<li>EIP-7702 skill and tagged tests for query-blocks guides</li>
<li>README rewrites across multiple packages</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/23b931ed22f1b2d2e46ae96079e0f7685b140a37/hovercard" href="https://github.com/Nethereum/Nethereum/commit/23b931ed22f1b2d2e46ae96079e0f7685b140a37"><tt>23b931e</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/c4dc7ea32d8340fd617e16653e31ef12dbe57aef/hovercard" href="https://github.com/Nethereum/Nethereum/commit/c4dc7ea32d8340fd617e16653e31ef12dbe57aef"><tt>c4dc7ea</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/a91964fbb46799c26bd3de0ae89b3d9beb87bbcc/hovercard" href="https://github.com/Nethereum/Nethereum/commit/a91964fbb46799c26bd3de0ae89b3d9beb87bbcc"><tt>a91964f</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/ee9f693c2946ea6061b5e8fb10c5f20999ca12b4/hovercard" href="https://github.com/Nethereum/Nethereum/commit/ee9f693c2946ea6061b5e8fb10c5f20999ca12b4"><tt>ee9f693</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/afd0da8a9c99abc9d8f547673e970247d5b8ccd2/hovercard" href="https://github.com/Nethereum/Nethereum/commit/afd0da8a9c99abc9d8f547673e970247d5b8ccd2"><tt>afd0da8</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/cb466c9c58f8cefd619fffe92be8a43c10bcec6b/hovercard" href="https://github.com/Nethereum/Nethereum/commit/cb466c9c58f8cefd619fffe92be8a43c10bcec6b"><tt>cb466c9</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/4d3a7a895de5ce1a5651ffdaf31d097f3a044342/hovercard" href="https://github.com/Nethereum/Nethereum/commit/4d3a7a895de5ce1a5651ffdaf31d097f3a044342"><tt>4d3a7a8</tt></a></p>
<hr>
<h2>All Commits Since 6.0.0</h2>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="4828ebda Fix template README version references to 6.0.4
9c68e081 Aspire Template Pack: Update README with nethereum-dapp template docs, wallet flow, ABI auto-discovery, and troubleshooting
d348e405 DevChain Template: Add local Explorer App.razor to fix blazor.web.js compatibility with NuGet-packaged Razor components
818cc8af Dapp Template: Add local Explorer App.razor to fix blazor.web.js compatibility with NuGet-packaged Razor components, update templates to default NuGet 6.0.4
bb5b2209 Fix contract deployment race condition by polling eth_getCode (#1082)
ce721746 Fix EIP6963 personal_sign passing JSON string instead of address (#1080)
76c796ef DevChain Template: Fix project references, update to async MapDevChainEndpointsAsync, and update Aspire version to 13.1.1 in README
60e76cc3 Remove old template
63e29eb5 update validate documentation section skill
c5830e83 Bump version to 6.0.4, add Herumi native packages, parallel nuget-fast.ps1 build script, fix nuget.bat Herumi output path, and GitHub Actions CI with prerelease publishing to GitHub Packages
6e1921f8 Explorer: Add runtime bytecode ABI matching for Foundry artifacts and fix wallet CSS specificity with !important overrides for scoped Blazor styles
f500fcc0 Aspire Templates: Add nethereum-dapp template with EIP-6963 wallet chain validation, light-themed WebApp UI, and Foundry contract integration; update DevChain template and template pack to 6.0.4
ef3e25ee DevChain: Move hosting types from Server tool to library, add reusable web extensions
5d391e3a Wallet: Price refresh service with two-threshold model and overflow fixes
3a9f214a Update readme
b3fab9b7 update geth and start bat
8127d576 Project folder LightClient Consensus
2bd97f0e skills update
bbafb371 Readme Update
2dcb306c Adding validate UpperBytes to prevent overflows decoding ints
4026d4a7 SparseMerkleTree optimisations
d106e500 Readme updates
fbfcbf64 Moving MinimalHdWallet to Nethereum.Accounts
76e56c0b MinimalHd Wallet moved to Nethereum.Accounts for frameworks 6 and above
4d3a7a89 examples and docs tagging in tests
cb466c9c Aspire Template Pack
afd0da8a Tests: Fix KeyStore doc examples to use DocSection.Signing
ee9f693c Docs: Add EIP-7702 skill and tag tests for query-blocks and EIP-7702 guides
3f6c490c Intial plugin claude skills
3fc3645b update commit and validate docs sections
a91964fb Skills: Add documentation propagation checks to commit skill
c4dc7ea3 Tests: Add [NethereumDocExample] attribute and tagged tests for all core-foundation README examples
23b931ed README rewrite, org profile, and documentation plan
e8a72ed9 Readme Update"><pre class="notranslate"><code>4828ebda Fix template README version references to 6.0.4
9c68e081 Aspire Template Pack: Update README with nethereum-dapp template docs, wallet flow, ABI auto-discovery, and troubleshooting
d348e405 DevChain Template: Add local Explorer App.razor to fix blazor.web.js compatibility with NuGet-packaged Razor components
818cc8af Dapp Template: Add local Explorer App.razor to fix blazor.web.js compatibility with NuGet-packaged Razor components, update templates to default NuGet 6.0.4
bb5b2209 Fix contract deployment race condition by polling eth_getCode (#1082)
ce721746 Fix EIP6963 personal_sign passing JSON string instead of address (#1080)
76c796ef DevChain Template: Fix project references, update to async MapDevChainEndpointsAsync, and update Aspire version to 13.1.1 in README
60e76cc3 Remove old template
63e29eb5 update validate documentation section skill
c5830e83 Bump version to 6.0.4, add Herumi native packages, parallel nuget-fast.ps1 build script, fix nuget.bat Herumi output path, and GitHub Actions CI with prerelease publishing to GitHub Packages
6e1921f8 Explorer: Add runtime bytecode ABI matching for Foundry artifacts and fix wallet CSS specificity with !important overrides for scoped Blazor styles
f500fcc0 Aspire Templates: Add nethereum-dapp template with EIP-6963 wallet chain validation, light-themed WebApp UI, and Foundry contract integration; update DevChain template and template pack to 6.0.4
ef3e25ee DevChain: Move hosting types from Server tool to library, add reusable web extensions
5d391e3a Wallet: Price refresh service with two-threshold model and overflow fixes
3a9f214a Update readme
b3fab9b7 update geth and start bat
8127d576 Project folder LightClient Consensus
2bd97f0e skills update
bbafb371 Readme Update
2dcb306c Adding validate UpperBytes to prevent overflows decoding ints
4026d4a7 SparseMerkleTree optimisations
d106e500 Readme updates
fbfcbf64 Moving MinimalHdWallet to Nethereum.Accounts
76e56c0b MinimalHd Wallet moved to Nethereum.Accounts for frameworks 6 and above
4d3a7a89 examples and docs tagging in tests
cb466c9c Aspire Template Pack
afd0da8a Tests: Fix KeyStore doc examples to use DocSection.Signing
ee9f693c Docs: Add EIP-7702 skill and tag tests for query-blocks and EIP-7702 guides
3f6c490c Intial plugin claude skills
3fc3645b update commit and validate docs sections
a91964fb Skills: Add documentation propagation checks to commit skill
c4dc7ea3 Tests: Add [NethereumDocExample] attribute and tagged tests for all core-foundation README examples
23b931ed README rewrite, org profile, and documentation plan
e8a72ed9 Readme Update
</code></pre></div>juanfranblancotag:github.com,2008:Repository/46746187/6.0.02026-03-07T05:11:20Z6.0.0<h1>Nethereum 6.0.0</h1>
<p>Nethereum 6.0.0 is a major release introducing the CoreChain (full in-process Ethereum node), DevChain (development chain with SQLite persistence), AppChain (multi-node application chain stack), Account Abstraction (ERC-4337 bundler + ERC-7579 modular accounts), a Blazor Server blockchain Explorer, multi-provider blockchain storage (Postgres, SQL Server, SQLite), .NET Aspire orchestration, and significant EVM simulator improvements bringing it closer to full Ethereum specification compliance.</p>
<p><a href="https://github.com/Nethereum/Nethereum/compare/5.8.0...6.0.0">Full Changelog</a></p>
<h2>Nethereum.CoreChain — In-Process Ethereum Node</h2>
<p>New project providing a full in-process Ethereum execution layer node with JSON-RPC support, state management, block production, and transaction processing.</p>
<ul>
<li>Full JSON-RPC handler suite: <code>eth_call</code>, <code>eth_estimateGas</code>, <code>eth_getBalance</code>, <code>eth_getCode</code>, <code>eth_getStorageAt</code>, <code>eth_sendRawTransaction</code>, <code>eth_getTransactionByHash</code>, <code>eth_getTransactionReceipt</code>, <code>eth_getBlockByHash</code>, <code>eth_getBlockByNumber</code>, <code>eth_getBlockReceipts</code>, <code>eth_getLogs</code>, <code>eth_newFilter</code>, <code>eth_getFilterChanges</code>, <code>eth_getFilterLogs</code>, <code>eth_feeHistory</code>, <code>eth_gasPrice</code>, <code>eth_createAccessList</code>, <code>eth_coinbase</code>, <code>eth_mining</code>, <code>eth_syncing</code>, <code>net_listening</code>, <code>net_peerCount</code>, <code>web3_sha3</code></li>
<li><code>debug_traceTransaction</code> and <code>debug_traceCall</code> with opcode and call tracers</li>
<li>Historical state support with state diff tracking and pruning</li>
<li>In-memory and persistent storage backends (via <code>IBlockStore</code>, <code>ITransactionStore</code>, <code>IReceiptStore</code>, <code>ILogStore</code>, <code>IStateStore</code>, <code>IStateDiffStore</code>, <code>IFilterStore</code>)</li>
<li>Block producer with configurable block production options</li>
<li>Transaction pool (<code>TxPool</code>) with gas price ordering</li>
<li>Metrics instrumentation via <code>System.Diagnostics.Metrics</code></li>
<li>P2P interfaces for consensus and synchronisation</li>
<li>WebSocket subscription support (<code>eth_subscribe</code>/<code>eth_unsubscribe</code>)</li>
<li>State root calculation with Patricia Merkle Trie integration</li>
<li>Consensus abstraction interfaces (pluggable PoA, Clique, etc.)</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/652b4b77341d7b9baa35be1cb660cf53eaf64fe4/hovercard" href="https://github.com/Nethereum/Nethereum/commit/652b4b77341d7b9baa35be1cb660cf53eaf64fe4"><tt>652b4b7</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/f6c07772038c70f1c22bff25814c9b1ed4635011/hovercard" href="https://github.com/Nethereum/Nethereum/commit/f6c07772038c70f1c22bff25814c9b1ed4635011"><tt>f6c0777</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/328672f9157503e3059a07b1022e9d8ffdb8f79b/hovercard" href="https://github.com/Nethereum/Nethereum/commit/328672f9157503e3059a07b1022e9d8ffdb8f79b"><tt>328672f</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/b040698658747aaf814836dc11daf2c774800253/hovercard" href="https://github.com/Nethereum/Nethereum/commit/b040698658747aaf814836dc11daf2c774800253"><tt>b040698</tt></a></p>
<h2>Nethereum.CoreChain.RocksDB — Persistent Storage</h2>
<p>RocksDB-backed persistent storage for CoreChain including block, transaction, receipt, log, and state stores. Includes state diff store for historical state reconstruction, message result caching, and bloom filter-based log querying.</p>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/2dcceade71399e0f06ee9830ec32470c5f066459/hovercard" href="https://github.com/Nethereum/Nethereum/commit/2dcceade71399e0f06ee9830ec32470c5f066459"><tt>2dccead</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/2371cba5ca4f477775ec571084338c15040e1092/hovercard" href="https://github.com/Nethereum/Nethereum/commit/2371cba5ca4f477775ec571084338c15040e1092"><tt>2371cba</tt></a></p>
<h2>Nethereum.DevChain — Development Chain</h2>
<p>Full-featured Ethereum development chain built on CoreChain, designed for local development and testing.</p>
<ul>
<li>SQLite persistent storage (default) — chain state survives restarts; in-memory mode also available</li>
<li>Pre-funded dev accounts (10,000 ETH each)</li>
<li>Auto-mine mode (block per transaction)</li>
<li>EIP-1559 transaction support</li>
<li>Thread-safe account impersonation</li>
<li><code>evm_increaseTime</code> and <code>evm_setNextBlockTimestamp</code> dev RPC methods</li>
<li>Hosted service pattern for ASP.NET Core integration</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/652b4b77341d7b9baa35be1cb660cf53eaf64fe4/hovercard" href="https://github.com/Nethereum/Nethereum/commit/652b4b77341d7b9baa35be1cb660cf53eaf64fe4"><tt>652b4b7</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/3bc09399349eb8f73ed132c52ec699761eb9fbc2/hovercard" href="https://github.com/Nethereum/Nethereum/commit/3bc09399349eb8f73ed132c52ec699761eb9fbc2"><tt>3bc0939</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/90bce97bdaf18163f4d8cbbd950cf128e6406e02/hovercard" href="https://github.com/Nethereum/Nethereum/commit/90bce97bdaf18163f4d8cbbd950cf128e6406e02"><tt>90bce97</tt></a></p>
<h2>Nethereum.DevChain.Server — HTTP Server</h2>
<p>ASP.NET Core HTTP server wrapper for DevChain with CORS, health checks, configurable chain ID, and dev account management. Provides the JSON-RPC POST endpoint compatible with MetaMask, Foundry, Hardhat, and any Ethereum tooling.</p>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/90bce97bdaf18163f4d8cbbd950cf128e6406e02/hovercard" href="https://github.com/Nethereum/Nethereum/commit/90bce97bdaf18163f4d8cbbd950cf128e6406e02"><tt>90bce97</tt></a></p>
<h2>Nethereum.AppChain — Application Chain Stack (Preview)</h2>
<p>Nethereum.AppChain extends the CoreChain and DevChain to provide an application-specific chain layer. The idea is that applications can run their own chain as an extension of Ethereum, handling domain-specific data and business rules at this layer while users retain the ability to exit with their data at any time. Financial assets and high-value state remain on L1s and L2s where they benefit from full Ethereum security, while application data — game state, social graphs, content, governance — lives on the AppChain where it can be processed cheaply and with custom rules. This separation lets developers build fully decentralised applications without forcing all data onto expensive shared infrastructure.</p>
<p><strong>This project is currently in Preview.</strong></p>
<ul>
<li>Clique PoA consensus integration</li>
<li>P2P networking with DotNetty transport and security fixes</li>
<li>Sequencer for transaction ordering</li>
<li>L1 anchoring with Postgres persistence for data availability and exit proofs</li>
<li>Policy engine for chain governance and custom transaction validation rules</li>
<li>Sync protocol for multi-node state synchronisation</li>
<li>Account Abstraction integration for AA-native chains (gasless UX, session keys)</li>
<li>Key vault integration via <code>IWeb3</code> constructor overloads</li>
<li>Template support for scaffolding new AppChain projects</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/b1c5806d2291efbc9adfbc99cd93c8cbe5e56fde/hovercard" href="https://github.com/Nethereum/Nethereum/commit/b1c5806d2291efbc9adfbc99cd93c8cbe5e56fde"><tt>b1c5806</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/0677068137ba2ebe2db549556047d411e3ec7398/hovercard" href="https://github.com/Nethereum/Nethereum/commit/0677068137ba2ebe2db549556047d411e3ec7398"><tt>0677068</tt></a></p>
<h2>Nethereum.AccountAbstraction — ERC-4337 + ERC-7579</h2>
<p>Major upgrade to the Account Abstraction stack with full ERC-4337 bundler implementation and ERC-7579 modular smart account support.</p>
<ul>
<li><strong>Bundler</strong>: Full ERC-4337 bundler with user operation validation, mempool management, gas estimation, BLS aggregator support, and reputation tracking</li>
<li><strong>Bundler RPC Server</strong>: Standalone JSON-RPC server for the bundler (<code>eth_sendUserOperation</code>, <code>eth_estimateUserOperationGas</code>, <code>eth_getUserOperationByHash</code>, <code>eth_getUserOperationReceipt</code>, <code>eth_supportedEntryPoints</code>)</li>
<li><strong>Bundler RocksDB Storage</strong>: Persistent mempool and reputation storage using RocksDB</li>
<li><strong>Gas Estimation</strong>: Improved gas estimation for user operations including verification gas, call gas, and pre-verification gas</li>
<li><strong>Validation Helper</strong>: <code>ValidationDataHelper</code> for parsing validation data timestamps and aggregator addresses</li>
<li><strong>ERC-7579 Modular Accounts</strong>: <code>NethereumAccount</code> smart account with modular architecture — validators, executors, hooks, and fallback handlers</li>
<li><strong>Smart Contract Factory</strong>: <code>NethereumAccountFactory</code> with governance controls</li>
<li><strong>Modules</strong>: ECDSAValidator, Rhinestone modules (OwnableValidator, SocialRecovery, DeadmanSwitch, MultiFactor, HookMultiPlexer, OwnableExecutor, RegistryHook), SmartSessions with policies (SudoPolicy, ERC20SpendingLimitPolicy, UniActionPolicy)</li>
<li><strong>Paymaster Contracts</strong>: VerifyingPaymaster, DepositPaymaster, TokenPaymaster, BasePaymaster</li>
<li><strong>Contract Handlers</strong>: <code>IContractHandlerService</code> enabling standard contract services to be switched to AA mode</li>
<li><strong>Batch Call Refactoring</strong>: Improved batch operation support for user operations</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/ce0e537cd2e3dea7f53916240608098e3f8d2f40/hovercard" href="https://github.com/Nethereum/Nethereum/commit/ce0e537cd2e3dea7f53916240608098e3f8d2f40"><tt>ce0e537</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/9aaafa21c594a309b2bf750e9da96caf4e19f0bd/hovercard" href="https://github.com/Nethereum/Nethereum/commit/9aaafa21c594a309b2bf750e9da96caf4e19f0bd"><tt>9aaafa2</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/b844e03a59df54cced1f747552430f1e20cc358a/hovercard" href="https://github.com/Nethereum/Nethereum/commit/b844e03a59df54cced1f747552430f1e20cc358a"><tt>b844e03</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/8ee6c33c5b10a1d49c495c750b321ceb37a38258/hovercard" href="https://github.com/Nethereum/Nethereum/commit/8ee6c33c5b10a1d49c495c750b321ceb37a38258"><tt>8ee6c33</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/e692fc1c26069942274930005d413139b0114ea1/hovercard" href="https://github.com/Nethereum/Nethereum/commit/e692fc1c26069942274930005d413139b0114ea1"><tt>e692fc1</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/bcccaf5e7e433025ec6bedff1d7b13cb1b851761/hovercard" href="https://github.com/Nethereum/Nethereum/commit/bcccaf5e7e433025ec6bedff1d7b13cb1b851761"><tt>bcccaf5</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/b356d6b6900f176d11d9ef98858161e5386deafa/hovercard" href="https://github.com/Nethereum/Nethereum/commit/b356d6b6900f176d11d9ef98858161e5386deafa"><tt>b356d6b</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/bcae91c8e404e5489f881561ea76d25ba4305dee/hovercard" href="https://github.com/Nethereum/Nethereum/commit/bcae91c8e404e5489f881561ea76d25ba4305dee"><tt>bcae91c</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/934d48fcdb066b9a5ffae23ffc30007905586ed4/hovercard" href="https://github.com/Nethereum/Nethereum/commit/934d48fcdb066b9a5ffae23ffc30007905586ed4"><tt>934d48f</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/81f7870792c5b0604838f6cb112ccc3cf0dcf6f8/hovercard" href="https://github.com/Nethereum/Nethereum/commit/81f7870792c5b0604838f6cb112ccc3cf0dcf6f8"><tt>81f7870</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/53c76a246d8ee7796aaa308063e80dbc3f0ec573/hovercard" href="https://github.com/Nethereum/Nethereum/commit/53c76a246d8ee7796aaa308063e80dbc3f0ec573"><tt>53c76a2</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/b8087e8659a4b3bf5b4e603ef89ca4ee809663fa/hovercard" href="https://github.com/Nethereum/Nethereum/commit/b8087e8659a4b3bf5b4e603ef89ca4ee809663fa"><tt>b8087e8</tt></a></p>
<h2>Nethereum.AccountAbstraction Smart Contracts (Solidity)</h2>
<p>New Solidity smart contracts for the Account Abstraction system, compiled with Foundry (Solc 0.8.28, Cancun EVM).</p>
<ul>
<li><code>NethereumAccount.sol</code> — ERC-7579 modular smart account with sentinel-list module management</li>
<li><code>NethereumAccountFactory.sol</code> — CREATE2 factory with governance controls</li>
<li><code>BasePaymaster.sol</code>, <code>VerifyingPaymaster.sol</code>, <code>DepositPaymaster.sol</code>, <code>TokenPaymaster.sol</code> — Paymaster contracts</li>
<li><code>ECDSAValidator.sol</code> — ECDSA signature validation module</li>
<li>Rhinestone module ports: <code>OwnableValidator</code>, <code>SocialRecovery</code>, <code>DeadmanSwitch</code>, <code>MultiFactor</code>, <code>HookMultiPlexer</code>, <code>OwnableExecutor</code>, <code>RegistryHook</code></li>
<li>SmartSessions: <code>SmartSession.sol</code> with <code>SudoPolicy</code>, <code>ERC20SpendingLimitPolicy</code>, <code>UniActionPolicy</code></li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/b356d6b6900f176d11d9ef98858161e5386deafa/hovercard" href="https://github.com/Nethereum/Nethereum/commit/b356d6b6900f176d11d9ef98858161e5386deafa"><tt>b356d6b</tt></a></p>
<h2>Nethereum.Explorer — Blazor Server Blockchain Explorer</h2>
<p>New Blazor Server component library providing a full blockchain explorer UI.</p>
<ul>
<li>Block list and detail pages</li>
<li>Transaction list, detail, and input data decoding with ABI resolution</li>
<li>Log list with event decoding</li>
<li>Account page (balance, transactions, code)</li>
<li>Contract interaction: read/write functions via EIP-6963 wallet integration</li>
<li>Token pages: ERC-20/721/1155 transfers, balances, and metadata</li>
<li>MUD table browser (World addresses, table IDs, records)</li>
<li>ABI resolution (Sourcify, local storage)</li>
<li>Security: CSV injection protection, SQL injection prevention in MUD queries, query bounds validation</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/4468c1b977b554bc57b921837f0288f7b870bfa6/hovercard" href="https://github.com/Nethereum/Nethereum/commit/4468c1b977b554bc57b921837f0288f7b870bfa6"><tt>4468c1b</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/f1e8b001cee6366044ec47b684be9f0e2e488a32/hovercard" href="https://github.com/Nethereum/Nethereum/commit/f1e8b001cee6366044ec47b684be9f0e2e488a32"><tt>f1e8b00</tt></a></p>
<h2>Nethereum.Blazor — Dynamic Contract Interaction Components</h2>
<ul>
<li>New dynamic contract interaction components: <code>DynamicQueryFunction</code>, <code>DynamicTransactionFunction</code>, <code>DynamicContractDeployment</code> — interact with any smart contract using just its ABI, no code generation required</li>
<li><code>DynamicStructInput</code>, <code>DynamicArrayInput</code> — recursive input rendering for complex ABI types</li>
<li><code>DynamicResultOutput</code>, <code>DynamicErrorDisplay</code>, <code>DynamicReceiptDisplay</code>, <code>DynamicGasSettings</code></li>
<li>Typed base classes: <code>QueryFunctionComponentBase</code>, <code>TransactionFunctionComponentBase</code>, <code>ContractDeploymentComponentBase</code>, <code>ResultOutputBase</code></li>
<li>EIP-6963 wallet discovery improvements</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/15a0dd5350ab925cb4835dd84a010d05c359c71d/hovercard" href="https://github.com/Nethereum/Nethereum/commit/15a0dd5350ab925cb4835dd84a010d05c359c71d"><tt>15a0dd5</tt></a></p>
<h2>Nethereum.Blazor.Solidity — EVM Debugger Components</h2>
<p>New Blazor components for EVM-level debugging and Solidity source code viewing.</p>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/d28b638560d6572eb3c87f1f0fc5f3262c427b96/hovercard" href="https://github.com/Nethereum/Nethereum/commit/d28b638560d6572eb3c87f1f0fc5f3262c427b96"><tt>d28b638</tt></a></p>
<h2>Nethereum.EVM — Major EVM Simulator Upgrade</h2>
<p>Significant improvements to the EVM simulator bringing it closer to full Ethereum specification compliance (Prague/Cancun).</p>
<ul>
<li><strong>Prague support</strong>: EIP-7623 gas changes, new precompiles (BLS12-381, KZG Point Evaluation), BN128 curve completed port</li>
<li><strong>Precompiles</strong>: Native implementations for ecRecover, MODEXP, BN128 (add, mul, pairing), BLAKE2f, BLS12-381, KZG Point Evaluation</li>
<li><strong>Call frame tracking</strong>: Proper call stack with <code>InnerCallResult</code> tracking for internal calls, delegate calls, and static calls</li>
<li><strong>Access list tracker</strong>: EIP-2929 warm/cold access tracking for accurate gas calculation</li>
<li><strong>Gas calculation fixes</strong>: EXTCODECOPY stack order, EXP gas calculation, maxinitcode 32000 gas, static call enforcement, revert handling</li>
<li><strong>Debugger</strong>: Async debugger sessions, function dispatch mapping (<code>_functionMaps</code>), safe hex/chainId parsing</li>
<li><strong>State changes extractor</strong>: Extract token balance changes from EVM traces for transaction simulation</li>
<li><strong>Performance</strong>: Cached int types, <code>BinaryPrimitives</code> for direct integer decoding</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/17972bdcf0a4d1769505ba943b1786a27ded320d/hovercard" href="https://github.com/Nethereum/Nethereum/commit/17972bdcf0a4d1769505ba943b1786a27ded320d"><tt>17972bd</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/04d442bc4f892b180058ee5e05971fece59178c7/hovercard" href="https://github.com/Nethereum/Nethereum/commit/04d442bc4f892b180058ee5e05971fece59178c7"><tt>04d442b</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/f3f5be3c93e1d3c0de56e733cbf3a83d9f6b7576/hovercard" href="https://github.com/Nethereum/Nethereum/commit/f3f5be3c93e1d3c0de56e733cbf3a83d9f6b7576"><tt>f3f5be3</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/384ca19f9d3691d54f2c64f7bddd28f76f527168/hovercard" href="https://github.com/Nethereum/Nethereum/commit/384ca19f9d3691d54f2c64f7bddd28f76f527168"><tt>384ca19</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/43f682a9c10ab0c89cdef47234873cf09e23cd1b/hovercard" href="https://github.com/Nethereum/Nethereum/commit/43f682a9c10ab0c89cdef47234873cf09e23cd1b"><tt>43f682a</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/1ad60603d125550bb533c95d60f39c31896a4cf4/hovercard" href="https://github.com/Nethereum/Nethereum/commit/1ad60603d125550bb533c95d60f39c31896a4cf4"><tt>1ad6060</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/291ab5a6941729a597dadfc39cdd4eaf52bad182/hovercard" href="https://github.com/Nethereum/Nethereum/commit/291ab5a6941729a597dadfc39cdd4eaf52bad182"><tt>291ab5a</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/77a315a01d16bece8279700bbf3dc65be2a355f0/hovercard" href="https://github.com/Nethereum/Nethereum/commit/77a315a01d16bece8279700bbf3dc65be2a355f0"><tt>77a315a</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/879125b9709303e02daf610f211cf89c9f14100a/hovercard" href="https://github.com/Nethereum/Nethereum/commit/879125b9709303e02daf610f211cf89c9f14100a"><tt>879125b</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/20dc6749f98b62c92ac8768020240c08a37279ef/hovercard" href="https://github.com/Nethereum/Nethereum/commit/20dc6749f98b62c92ac8768020240c08a37279ef"><tt>20dc674</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/214b1e3f09a282c0b2b98156bd295f89406f918d/hovercard" href="https://github.com/Nethereum/Nethereum/commit/214b1e3f09a282c0b2b98156bd295f89406f918d"><tt>214b1e3</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/54302866c1af6f90eb79d35cc92f350988d6fef7/hovercard" href="https://github.com/Nethereum/Nethereum/commit/54302866c1af6f90eb79d35cc92f350988d6fef7"><tt>5430286</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/b2e2206b4207f2b007af125f5298321ccb86e51f/hovercard" href="https://github.com/Nethereum/Nethereum/commit/b2e2206b4207f2b007af125f5298321ccb86e51f"><tt>b2e2206</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/8d43b6b0b4c3e00f36ccafa916a134110766da23/hovercard" href="https://github.com/Nethereum/Nethereum/commit/8d43b6b0b4c3e00f36ccafa916a134110766da23"><tt>8d43b6b</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/81418a5b21c9566f1e27ac0373ef539f5d13738b/hovercard" href="https://github.com/Nethereum/Nethereum/commit/81418a5b21c9566f1e27ac0373ef539f5d13738b"><tt>81418a5</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/2f853e5bd2eec3fef91dbb325b1b63266a6fcb4d/hovercard" href="https://github.com/Nethereum/Nethereum/commit/2f853e5bd2eec3fef91dbb325b1b63266a6fcb4d"><tt>2f853e5</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/5a7f7438c1de90d420066498d9dd8178b9f21798/hovercard" href="https://github.com/Nethereum/Nethereum/commit/5a7f7438c1de90d420066498d9dd8178b9f21798"><tt>5a7f743</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/6e827045a851d8cf38fcc738c4785b3c0adeabd4/hovercard" href="https://github.com/Nethereum/Nethereum/commit/6e827045a851d8cf38fcc738c4785b3c0adeabd4"><tt>6e82704</tt></a></p>
<h2>BlockchainProcessing — Reorg Detection, Token Indexing, Internal Transactions</h2>
<p>Major upgrade to the blockchain processing pipeline.</p>
<ul>
<li><strong>Reorg detection</strong>: <code>ReorgDetectedException</code> with automatic block rewind and reprocessing</li>
<li><strong>Token transfer indexing</strong>: ERC-20/721/1155 <code>Transfer</code> event processors with dedicated repositories (<code>ITokenTransferLogRepository</code>, <code>ITokenBalanceRepository</code>, <code>ITokenMetadataRepository</code>, <code>INFTInventoryRepository</code>)</li>
<li><strong>Token balance aggregation</strong>: Computes running balances from transfer events</li>
<li><strong>Internal transaction support</strong>: <code>IInternalTransactionRepository</code> with storage step handler for tracing-derived internal calls</li>
<li><strong>Metrics</strong>: Processing rate, block lag, and error counters via <code>System.Diagnostics.Metrics</code></li>
<li><strong>String-to-long migration</strong>: Block numbers and transaction indices changed from <code>string</code> to <code>long</code> for proper sorting and querying in the storage entities</li>
<li><strong>Log storage options</strong>: Configurable log storage with bloom filter-based filtering</li>
<li><strong>Retry runner</strong>: Configurable retry logic for transient failures</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/68f541f63dc32502ca25ed2c83b1c4e484c5b623/hovercard" href="https://github.com/Nethereum/Nethereum/commit/68f541f63dc32502ca25ed2c83b1c4e484c5b623"><tt>68f541f</tt></a></p>
<h2>BlockchainStore — Multi-Provider Database Storage</h2>
<p>Complete rewrite of the blockchain storage layer with a shared EF Core base and provider-specific implementations.</p>
<h3>BlockchainStore.EFCore (Shared Base)</h3>
<ul>
<li><code>IBlockchainDbContextFactory</code> factory pattern for scoped DbContext creation</li>
<li>Full entity model: blocks, transactions, transaction logs, contracts, token transfers, token balances, token metadata, NFT inventory, internal transactions</li>
<li>Block progress tracking for resumable indexing</li>
</ul>
<h3>BlockchainStore.Postgres</h3>
<ul>
<li>PostgreSQL provider using Npgsql with snake_case naming conventions</li>
<li>Optimised for high-throughput indexing with batch operations</li>
</ul>
<h3>BlockchainStore.SqlServer</h3>
<ul>
<li>SQL Server provider with configurable schema support</li>
<li>Full indexed blockchain storage</li>
</ul>
<h3>BlockchainStore.Sqlite</h3>
<ul>
<li>SQLite provider for lightweight/embedded scenarios</li>
<li>Full indexed blockchain storage</li>
</ul>
<h3>BlockchainStorage.Processors (Shared Base)</h3>
<ul>
<li><code>BlockchainProcessingService</code> — orchestrates block/transaction/log processing into the database</li>
<li><code>InternalTransactionProcessingService</code> — processes debug traces into internal transaction records</li>
<li><code>BlockchainProcessingHostedService</code> / <code>InternalTransactionProcessingHostedService</code> — ASP.NET Core hosted service wrappers</li>
<li><code>BlockchainProcessingOptions</code> — configuration binding (connection strings, batch size, confirmations)</li>
</ul>
<h3>BlockchainStorage.Processors.Postgres / SqlServer / Sqlite</h3>
<ul>
<li>Thin DI wiring projects: <code>AddPostgresBlockchainProcessor()</code>, <code>AddSqlServerBlockchainProcessor()</code>, <code>AddSqliteBlockchainProcessor()</code></li>
</ul>
<h3>BlockchainStorage.Token.Postgres</h3>
<ul>
<li>Token processing pipeline: ERC-20/721/1155 transfer log processor, balance aggregator, metadata resolver</li>
<li>Token balance denormaliser for fast query access</li>
<li>Safe tokenId parsing for large ERC-721/1155 IDs</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/4f74d19706378d89d0992ef5b02f006bb2b476f0/hovercard" href="https://github.com/Nethereum/Nethereum/commit/4f74d19706378d89d0992ef5b02f006bb2b476f0"><tt>4f74d19</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/7515761a813f25d945e0c58d9d6f4b731ab94744/hovercard" href="https://github.com/Nethereum/Nethereum/commit/7515761a813f25d945e0c58d9d6f4b731ab94744"><tt>7515761</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/286ebbca55b97a5e60af70d6266cf8a2b2e916c6/hovercard" href="https://github.com/Nethereum/Nethereum/commit/286ebbca55b97a5e60af70d6266cf8a2b2e916c6"><tt>286ebbc</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/2417b18c7657ca4f5acc54c6e6a52e13de291c80/hovercard" href="https://github.com/Nethereum/Nethereum/commit/2417b18c7657ca4f5acc54c6e6a52e13de291c80"><tt>2417b18</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/d075e36f07c0f92f231f3478fd4c93df1385e05b/hovercard" href="https://github.com/Nethereum/Nethereum/commit/d075e36f07c0f92f231f3478fd4c93df1385e05b"><tt>d075e36</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/db97ee04c700cb4de81aa0e14b0f6a6d617e4c77/hovercard" href="https://github.com/Nethereum/Nethereum/commit/db97ee04c700cb4de81aa0e14b0f6a6d617e4c77"><tt>db97ee0</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/f496d9e3d418ef653338ebbc2a7899266a52a1e3/hovercard" href="https://github.com/Nethereum/Nethereum/commit/f496d9e3d418ef653338ebbc2a7899266a52a1e3"><tt>f496d9e</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/7769e13c7af1cf70139ceba9352441f1acb3a533/hovercard" href="https://github.com/Nethereum/Nethereum/commit/7769e13c7af1cf70139ceba9352441f1acb3a533"><tt>7769e13</tt></a></p>
<h2>MUD — Processing Services and Reorg Support</h2>
<ul>
<li>Hosted processing services for MUD World record indexing</li>
<li>Reorg support: detect and rewind MUD records on chain reorganisation</li>
<li>Normaliser: denormalise MUD table records into queryable Postgres tables</li>
<li><code>DynamicTablePredicateBuilder</code> for type-safe MUD table queries</li>
<li><code>INormalisedTableQueryService</code> for querying normalised MUD data</li>
<li>Blazor component refactoring</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/741eb1372e410a3002ff546c58f55b801fb0ab4d/hovercard" href="https://github.com/Nethereum/Nethereum/commit/741eb1372e410a3002ff546c58f55b801fb0ab4d"><tt>741eb13</tt></a></p>
<h2>Nethereum.ABI — Int128/UInt128 Support and StateMutability</h2>
<ul>
<li><strong>Int128/UInt128 decoding and encoding</strong>: Full support for 128-bit integer types in ABI encoding and decoding</li>
<li><strong>Direct integer decoding</strong>: Use <code>BinaryPrimitives</code> for primitive integer types instead of decoding via <code>BigInteger</code> — significant performance improvement</li>
<li><strong>StateMutability support</strong>: <code>FunctionABI</code> and <code>ConstructorABI</code> now include <code>StateMutability</code> field from ABI JSON</li>
<li><strong>String decoder boundary fix</strong>: Prevent out-of-range exceptions on malformed string data</li>
<li><strong>Null-safe JSON parameter conversion</strong>: <code>JsonParameterObjectConvertor</code> handles null values gracefully</li>
<li><strong>ABIJsonDeserialiserSTJ</strong>: System.Text.Json ABI deserialiser improvements</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/c940936efec5160eb3d5f511e1e9af924a4189c2/hovercard" href="https://github.com/Nethereum/Nethereum/commit/c940936efec5160eb3d5f511e1e9af924a4189c2"><tt>c940936</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/a425b5d7dc3aeea3cb5cad49dc34343ac2b5a83a/hovercard" href="https://github.com/Nethereum/Nethereum/commit/a425b5d7dc3aeea3cb5cad49dc34343ac2b5a83a"><tt>a425b5d</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/6e476ac7a8b909b61b067ebbdaf2117c2ab02711/hovercard" href="https://github.com/Nethereum/Nethereum/commit/6e476ac7a8b909b61b067ebbdaf2117c2ab02711"><tt>6e476ac</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/b6efed56047a031396cab6d68e5963d58ec21b74/hovercard" href="https://github.com/Nethereum/Nethereum/commit/b6efed56047a031396cab6d68e5963d58ec21b74"><tt>b6efed5</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/6918a5f3d3cb38e0bc6e833a891867cc88f57ee3/hovercard" href="https://github.com/Nethereum/Nethereum/commit/6918a5f3d3cb38e0bc6e833a891867cc88f57ee3"><tt>6918a5f</tt></a></p>
<h2>Nethereum.Model — EIP-4844/Prague Block Headers and Transaction7702</h2>
<ul>
<li><strong>EIP-4844 block header fields</strong>: <code>BlobGasUsed</code>, <code>ExcessBlobGas</code>, <code>ParentBeaconBlockRoot</code> added to <code>BlockHeader</code></li>
<li><strong>Prague fields</strong>: <code>RequestsHash</code> for the Prague hardfork</li>
<li><strong>Transaction7702</strong>: Full EIP-7702 transaction type support in <code>TransactionFactory</code></li>
<li><strong>Original RLP caching</strong>: Cache the original RLP bytes for hash verification without re-encoding</li>
<li><strong>Defensive fixes</strong>: Clone RLP cache on copy, deduplicate encode paths, reorder type checks for correctness</li>
<li><strong>Log encoding</strong>: Receipt and <code>LogBloomFilter</code> RLP encoding/decoding updates</li>
<li><strong>SignedTransaction extensions</strong>: Improved signed transaction handling</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/96093c58a136efd2e42538a5e46af22b3f9b18c4/hovercard" href="https://github.com/Nethereum/Nethereum/commit/96093c58a136efd2e42538a5e46af22b3f9b18c4"><tt>96093c5</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/69f0ed9699c970db087ddb84040962b4e7d1d5da/hovercard" href="https://github.com/Nethereum/Nethereum/commit/69f0ed9699c970db087ddb84040962b4e7d1d5da"><tt>69f0ed9</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/961cd78abf9439426c1aeba12620f56444486ed8/hovercard" href="https://github.com/Nethereum/Nethereum/commit/961cd78abf9439426c1aeba12620f56444486ed8"><tt>961cd78</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/94651016/hovercard" href="https://github.com/Nethereum/Nethereum/commit/94651016"><tt>94651016</tt></a></p>
<h2>Nethereum.RPC — Shared Debug Tracing and EIP-4844</h2>
<ul>
<li><strong>Debug tracing moved to shared RPC</strong>: <code>DebugTraceTransaction</code>, <code>DebugTraceCall</code>, and all tracer types (CallTracer, OpcodeTracer, PrestateTracer, NoopTracer) moved from <code>Nethereum.Geth</code> to <code>Nethereum.RPC.DebugNode</code> so any node implementation can use them</li>
<li><strong>Tracer DTOs</strong>: <code>TraceConfigDto</code>, <code>TraceCallConfigDto</code>, <code>TracerConfigDto</code>, <code>BlockOverridesDto</code>, <code>StateOverrideDto</code>, <code>TracerLogDto</code></li>
<li><strong>EIP-4844 blob fields</strong>: <code>BlobVersionedHashes</code>, <code>MaxFeePerBlobGas</code> added to transaction DTOs</li>
<li><strong>RpcMessage serialisation</strong>: System.Text.Json server-side serialisation support</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/838319162c5b477070fae30fa63bf2ee61da62d4/hovercard" href="https://github.com/Nethereum/Nethereum/commit/838319162c5b477070fae30fa63bf2ee61da62d4"><tt>8383191</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/69d36000774c86f2b60ee2bafc8856ba6b0b3469/hovercard" href="https://github.com/Nethereum/Nethereum/commit/69d36000774c86f2b60ee2bafc8856ba6b0b3469"><tt>69d3600</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/b3c3015d805cb5510d800fc5ec4d08d8e63f5d51/hovercard" href="https://github.com/Nethereum/Nethereum/commit/b3c3015d805cb5510d800fc5ec4d08d8e63f5d51"><tt>b3c3015</tt></a></p>
<h2>Nethereum.Geth — Tracer Refactoring</h2>
<ul>
<li>Geth-specific tracing types (<code>DebugTraceTransaction</code>, <code>DebugTraceCall</code>, <code>CallTracer</code>, <code>OpcodeTracer</code>, <code>PrestateTracer</code>, <code>NoopTracer</code>, and all DTOs) moved to shared <code>Nethereum.RPC.DebugNode</code> namespace</li>
<li>Remaining Geth-specific tracers updated: <code>BigramTracer</code>, <code>TrigramTracer</code>, <code>UnigramTracer</code>, <code>EvmdisTracer</code>, <code>FourByteTracer</code>, <code>OpcountTracer</code>, <code>CustomTracer</code></li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/69d36000774c86f2b60ee2bafc8856ba6b0b3469/hovercard" href="https://github.com/Nethereum/Nethereum/commit/69d36000774c86f2b60ee2bafc8856ba6b0b3469"><tt>69d3600</tt></a></p>
<h2>Nethereum.Merkle — FrontierMerkleTree, Poseidon, and Fixes</h2>
<ul>
<li><strong>FrontierMerkleTree</strong>: New append-only Merkle tree optimised for blockchain use (stores only the frontier nodes)</li>
<li><strong>LeanIncrementalMerkleTree</strong>: Optimised with cached layers and dirty-node persistence</li>
<li><strong>Poseidon hash provider</strong>: ZK-friendly hash function for sparse Merkle trees</li>
<li><strong>Patricia Merkle Trie</strong>: Dirty node tracking, nibble extension fixes</li>
<li><strong>Fixes</strong>: <code>VerifyProof</code> direction correction, empty root handling, capacity overflow prevention</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/530f723688762a7d8e658ff7eebf09ff1e1e1012/hovercard" href="https://github.com/Nethereum/Nethereum/commit/530f723688762a7d8e658ff7eebf09ff1e1e1012"><tt>530f723</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/9e06cc23091954e160fd55896e15caad745ff77d/hovercard" href="https://github.com/Nethereum/Nethereum/commit/9e06cc23091954e160fd55896e15caad745ff77d"><tt>9e06cc2</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/adeea4569502cf9af321580ebd544281851c3803/hovercard" href="https://github.com/Nethereum/Nethereum/commit/adeea4569502cf9af321580ebd544281851c3803"><tt>adeea45</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/0d3fd5524d30918934740a1c94bcea6280c98ed5/hovercard" href="https://github.com/Nethereum/Nethereum/commit/0d3fd5524d30918934740a1c94bcea6280c98ed5"><tt>0d3fd55</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/6848840a5bd1f080b751ffaf5576eec054b9b5f5/hovercard" href="https://github.com/Nethereum/Nethereum/commit/6848840a5bd1f080b751ffaf5576eec054b9b5f5"><tt>6848840</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/e5ee4d6eb39c546721e6b77b7b915a6ba9be379a/hovercard" href="https://github.com/Nethereum/Nethereum/commit/e5ee4d6eb39c546721e6b77b7b915a6ba9be379a"><tt>e5ee4d6</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/2d3bae3cd06722adaaab06f4d596890d04884a92/hovercard" href="https://github.com/Nethereum/Nethereum/commit/2d3bae3cd06722adaaab06f4d596890d04884a92"><tt>2d3bae3</tt></a></p>
<h2>Nethereum.Wallet — StateChanges Preview and Transaction Executor</h2>
<ul>
<li><strong>StateChangesPreviewService</strong>: Simulate transactions via EVM and display predicted state changes (ETH balance changes, token transfers) before signing</li>
<li><strong>TransactionExecutor</strong>: Unified transaction execution with <code>CallMode</code> option for EVM simulation vs live execution</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/20a1140e89e83a0c2882c1e7ccb48a7b69e5f9e8/hovercard" href="https://github.com/Nethereum/Nethereum/commit/20a1140e89e83a0c2882c1e7ccb48a7b69e5f9e8"><tt>20a1140</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/81418a5b21c9566f1e27ac0373ef539f5d13738b/hovercard" href="https://github.com/Nethereum/Nethereum/commit/81418a5b21c9566f1e27ac0373ef539f5d13738b"><tt>81418a5</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/6f2f8032a2510a6bf196ae678a63190b420be2ef/hovercard" href="https://github.com/Nethereum/Nethereum/commit/6f2f8032a2510a6bf196ae678a63190b420be2ef"><tt>6f2f803</tt></a></p>
<h2>Nethereum.ABI DataServices — Sourcify V2</h2>
<ul>
<li>Sourcify upgrade to V2 APIs</li>
<li>Parquet download support for bulk ABI data</li>
<li>Postgres EF database for ABI storage</li>
<li><code>ABIInfoStorageFactory</code> with composite pattern: cache, Sourcify, Etherscan, 4Byte</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/312c258b7a2a73209834767d02722d4aabd13530/hovercard" href="https://github.com/Nethereum/Nethereum/commit/312c258b7a2a73209834767d02722d4aabd13530"><tt>312c258</tt></a></p>
<h2>Code Generator</h2>
<ul>
<li>Support for <code>referencedTypesNamespaces</code> — when a struct type is shared across contracts (e.g. <code>PackedUserOperation</code>), the code generator skips regenerating it and adds the namespace import instead</li>
<li>JavaScript transpile update</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/3afba9ddbcafbcc78c7a6468ee6bc8e9d97bc70e/hovercard" href="https://github.com/Nethereum/Nethereum/commit/3afba9ddbcafbcc78c7a6468ee6bc8e9d97bc70e"><tt>3afba9d</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/3132ac1a6fabb32b2471012f244f43580525b7f2/hovercard" href="https://github.com/Nethereum/Nethereum/commit/3132ac1a6fabb32b2471012f244f43580525b7f2"><tt>3132ac1</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/f27dc10995802b3d9da06401c030f3f11f5be95f/hovercard" href="https://github.com/Nethereum/Nethereum/commit/f27dc10995802b3d9da06401c030f3f11f5be95f"><tt>f27dc10</tt></a></p>
<h2>.NET Aspire Integration</h2>
<p>New Aspire orchestration for spinning up a complete Ethereum development environment with a single <code>dotnet run</code>.</p>
<ul>
<li><strong>AppHost</strong>: Orchestrates DevChain + PostgreSQL + Indexer + Explorer with service discovery, health checks, and OpenTelemetry</li>
<li><strong>Indexer</strong>: Background worker crawling blocks, transactions, logs, token transfers (ERC-20/721/1155), token balances, and MUD World records into PostgreSQL</li>
<li><strong>Explorer</strong>: Full blockchain explorer UI connected via Aspire service discovery</li>
<li><strong><code>dotnet new nethereum-devchain</code> template</strong>: Generates a standalone Aspire solution using only NuGet packages with configurable <code>--NethereumVersion</code>, <code>--ChainId</code>, and <code>--AspireVersion</code> parameters</li>
<li><strong>ServiceDefaults</strong>: Shared OpenTelemetry, health checks, and resilient HTTP client configuration</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/0b6e91ef5939b76fe4837b236af2cd10518c941f/hovercard" href="https://github.com/Nethereum/Nethereum/commit/0b6e91ef5939b76fe4837b236af2cd10518c941f"><tt>0b6e91e</tt></a></p>
<h2>.NET 10 Target Framework Support</h2>
<ul>
<li><code>Nethereum.Signer</code> and <code>Nethereum.KeyStore</code>: Added <code>net10.0</code> to BouncyCastle conditional framework lists</li>
<li><code>Nethereum.Maui.AndroidUsb</code>: Updated target framework from <code>net9.0</code> to <code>net10.0</code></li>
<li>Wallet UI components: Upgraded target frameworks and packages to .NET 10</li>
<li><code>Microsoft.Extensions.Logging.Abstractions</code>: Version constraint relaxed to support any version above minimum</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/e9459bc93baeb1cbcf21deac59438d7b5a0de279/hovercard" href="https://github.com/Nethereum/Nethereum/commit/e9459bc93baeb1cbcf21deac59438d7b5a0de279"><tt>e9459bc</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/9ab1acab3a3ce4bbf353e469f251fc3abb773023/hovercard" href="https://github.com/Nethereum/Nethereum/commit/9ab1acab3a3ce4bbf353e469f251fc3abb773023"><tt>9ab1aca</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/ee468461b45441087faa6ac1537c1d7d4eb5e197/hovercard" href="https://github.com/Nethereum/Nethereum/commit/ee468461b45441087faa6ac1537c1d7d4eb5e197"><tt>ee46846</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/741a4012fe02656bb2f56f8e9c4cd5db854c153b/hovercard" href="https://github.com/Nethereum/Nethereum/commit/741a4012fe02656bb2f56f8e9c4cd5db854c153b"><tt>741a401</tt></a></p>
<h2>EIP-7702 Support</h2>
<p>Full EIP-7702 (Set EOA Account Code) support across the stack:</p>
<ul>
<li><code>Transaction7702</code> model and encoder</li>
<li><code>TransactionFactory</code> update for 7702 transaction creation</li>
<li>Signer support for 7702 authorisation lists</li>
<li>CoreChain integration tests and spec tests</li>
<li>Bundler validation support for delegated accounts</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/48a9884c596a5840f8303aa6db358d6c13ce714e/hovercard" href="https://github.com/Nethereum/Nethereum/commit/48a9884c596a5840f8303aa6db358d6c13ce714e"><tt>48a9884</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/1aaae6f28a36d4283e9a515a8f24f782718c6590/hovercard" href="https://github.com/Nethereum/Nethereum/commit/1aaae6f28a36d4283e9a515a8f24f782718c6590"><tt>1aaae6f</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/b844e03a59df54cced1f747552430f1e20cc358a/hovercard" href="https://github.com/Nethereum/Nethereum/commit/b844e03a59df54cced1f747552430f1e20cc358a"><tt>b844e03</tt></a></p>
<h2>Test Coverage</h2>
<ul>
<li><strong>EVM specification tests</strong>: stCallCodes, stCreate2, stRefundTest, stBadOpcode, stExtCodeHash, stStaticCall, precompiles test vectors — validated against Ethereum test suite</li>
<li><strong>RLP tests</strong>: Using Geth test vectors for encoding/decoding validation</li>
<li><strong>Signer tests</strong>: EIP-2930 transaction signing with Geth test vectors</li>
<li><strong>Account Abstraction</strong>: Integration tests for ERC-4337 bundler, ERC-7579 modules, gas estimation, and end-to-end user operation flows</li>
<li><strong>CoreChain</strong>: Integration tests for RPC handlers, access list creation, debug tracing, blockchain test vectors</li>
<li><strong>EVM benchmarks</strong>: Performance benchmarking project</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/5a67625e4dfdb1f97568a5cdc1bb1b969ddb743a/hovercard" href="https://github.com/Nethereum/Nethereum/commit/5a67625e4dfdb1f97568a5cdc1bb1b969ddb743a"><tt>5a67625</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/779349bd8e9edb36c4664e896c496ad90a4752fa/hovercard" href="https://github.com/Nethereum/Nethereum/commit/779349bd8e9edb36c4664e896c496ad90a4752fa"><tt>779349b</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/35920bd65e6fad91bdab927ad0114563d4c797f2/hovercard" href="https://github.com/Nethereum/Nethereum/commit/35920bd65e6fad91bdab927ad0114563d4c797f2"><tt>35920bd</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/9b998b1e9566bca7aa1c356dfb7fbd0462c63266/hovercard" href="https://github.com/Nethereum/Nethereum/commit/9b998b1e9566bca7aa1c356dfb7fbd0462c63266"><tt>9b998b1</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/e818b7922d2b9d79610562a3014891bc12324ff0/hovercard" href="https://github.com/Nethereum/Nethereum/commit/e818b7922d2b9d79610562a3014891bc12324ff0"><tt>e818b79</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/6e827045a851d8cf38fcc738c4785b3c0adeabd4/hovercard" href="https://github.com/Nethereum/Nethereum/commit/6e827045a851d8cf38fcc738c4785b3c0adeabd4"><tt>6e82704</tt></a></p>
<h2>Other Changes</h2>
<ul>
<li><strong>Hex extensions</strong>: Small optimisations for hex string operations<br>
Commit: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/e9c5ddb96ca07cc357777c1ce28c7d1eae4e86bb/hovercard" href="https://github.com/Nethereum/Nethereum/commit/e9c5ddb96ca07cc357777c1ce28c7d1eae4e86bb"><tt>e9c5ddb</tt></a></li>
<li><strong>BigDecimal</strong>: Support parsing e-notation (scientific notation)<br>
Commit: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/0ee4b8d054d5449abb37bf2879395639c4341401/hovercard" href="https://github.com/Nethereum/Nethereum/commit/0ee4b8d054d5449abb37bf2879395639c4341401"><tt>0ee4b8d</tt></a></li>
<li><strong>ENS</strong>: Update ADRaffy.ENSNormalize<br>
Commit: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/66e7a773257aa5c17d825330546711ec0778d7c1/hovercard" href="https://github.com/Nethereum/Nethereum/commit/66e7a773257aa5c17d825330546711ec0778d7c1"><tt>66e7a77</tt></a></li>
<li><strong>Poseidon hasher</strong>: <code>Nethereum.Util.PoseidonHasher</code> for ZK-friendly hashing<br>
Commit: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/6848840a5bd1f080b751ffaf5576eec054b9b5f5/hovercard" href="https://github.com/Nethereum/Nethereum/commit/6848840a5bd1f080b751ffaf5576eec054b9b5f5"><tt>6848840</tt></a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/langebo/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/langebo">@langebo</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3705833517" data-permission-text="Title is private" data-url="https://github.com/Nethereum/Nethereum/issues/1093" data-hovercard-type="pull_request" data-hovercard-url="/Nethereum/Nethereum/pull/1093/hovercard" href="https://github.com/Nethereum/Nethereum/pull/1093">#1093</a></li>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/0xInnominatus/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/0xInnominatus">@0xInnominatus</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3948185942" data-permission-text="Title is private" data-url="https://github.com/Nethereum/Nethereum/issues/1100" data-hovercard-type="pull_request" data-hovercard-url="/Nethereum/Nethereum/pull/1100/hovercard" href="https://github.com/Nethereum/Nethereum/pull/1100">#1100</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/Nethereum/Nethereum/compare/5.8.0...6.0.0"><tt>5.8.0...6.0.0</tt></a></p>juanfranblancotag:github.com,2008:Repository/46746187/5.8.02026-01-05T10:25:04Z5.8.0<h1>Nethereum 5.8.0 - 10 Year Anniversary Release</h1>
<p><strong>Celebrating 10 years of .NET Ethereum integration!</strong> (November 2015 - November 2025)</p>
<p>Nethereum was created to enable all .NET developers to build new applications and integrate existing ones with Ethereum.</p>
<p>From the beginning, the thought was simple: Ethereum would not succeed without developers. Not just blockchain specialists, but application developers of all kinds. If Ethereum was going to grow, every developer, regardless of skill set, needed to be able to build on top of it and integrate with it. The same ideas led to the creation of the VS Code Solidity extension… (obviously not just .NET. Java, PHP, Python, JavaScript, any IDE, any developer).</p>
<p>Helping .NET developers was not just about providing an API. Understanding Ethereum was (and still is) complex, so it meant providing support when needed… the blockchain space requires a completely different way of thinking about applications and integration. Now with LLMs this has simplified dramatically the entry point for everyone, and we have seen now there is no much need for community support. Hopefully I have been able to help you all these years. Support to me, it has also meant providing examples and integrations across the entire .NET ecosystem, from backend and enterprise systems to web, mobile, desktop, and gaming, so Ethereum could be part of real applications rather than something separate. And leveraging new innovations… I still think it’s pretty amazing that we can have a Blazor server-side application interacting with the MetaMask extension, a playground compiling and executing in the browser through WASM and interacting with Ethereum that way… seeing those complex games built with MUD, or having full wallets in Blazor and dApp browsers. There are also some projects that never came to an end like the SAP integration examples, or the commerce examples.</p>
<p>When designing Nethereum, I knew developers would need everything a blockchain node client provides, and more. Not just RPC calls, but cryptography, encoding, execution, verification, wallets, indexing, data processing, and application tooling. All of this needed to be available so developers could work at whatever level made sense for their use case, from low-level primitives to high-level abstractions. This will never be finished, as new changes continue to arrive in the EVM, storage, Merkle structures, verification, transaction types, and in .NET itself.</p>
<p>Another goal was that developers fully understand how Ethereum works, while also having simple ways to get started, such as code generation and front-end integration, without needing to learn everything at once. You may have noticed that I have always been obsessed with code generators ... although LLMs might do a lot of work now, the deterministic side is still very important (and those will always be there). We experimented with living documentation (workbooks) but eventually the playground was (I think) the better option. I thought also that gaming, hence my love for Unity will teach anyone what blockchain can achieve, in sometimes much more complex scenarios that any financial DeFi application, creating complete and complex worlds that can simulate rea life without exposure to its dangers, I am pretty glad that Nethereum has helped build some of these fully on chain games.</p>
<p>A longer-term goal was that, once the architecture was in place, any application could stand on its own: using Ethereum primitives directly, acting as a small light client if needed, remaining decentralised, while still integrating easily with the real protocols and smart contracts that make up the Ethereum ecosystem. In this latest release, we now have those verification pieces in place… let’s see how this grows in the future.</p>
<p>Finally another thought was the need to provide another entry point to common smart contracts, to have a real "protocol" or standard, all common languages should be able to interact with it, hence making ENS or smart contract wallets like Gnosis Safe a real protocol and standard, but not just that, but ensuring that we can provide a real Exit or alternative integration (or ui) that provides that real decentralisation.</p>
<p>In the end, Nethereum is many things for many people (and myself :)) depending on how you are going to use it and what you need from it.</p>
<h3><em>Nethereum after 10 years has:</em></h3>
<p><strong>Protocol foundations</strong><br>
Native implementations of RLP, SSZ, Ethereum tries, hashing, Merkle structures, and reusable cryptographic primitives used across execution, indexing, and consensus-related workflows.</p>
<p><strong>Cryptography & verification</strong><br>
Transaction and message signing, EIP-712 typed data, signature recovery, receipt/log/state proof verification, Merkle and Patricia proofs, and execution validation utilities — enabling verification rather than blind trust.</p>
<p><strong>Light client & trust-minimised reads</strong><br>
A .NET light-client direction focused on block, receipt, and state verification, supporting verifiable reads, audit systems, embedded clients, and partial-trust environments.</p>
<p><strong>Execution layer & EVM</strong><br>
A native .NET EVM with opcode-level execution, execution simulation for testing, indexing, validation, and education.</p>
<p><strong>Contracts & ABI tooling</strong><br>
ABI encoding/decoding, typed contract services, event decoding, multicall support, deployment helpers, reflection-based APIs, and code generation that produces real, editable code.</p>
<p><strong>Wallets & identity (full stack)</strong><br>
A complete wallet offering out of the box: mnemonics, HD wallets, keystores, vault-based accounts, view-only accounts, hardware wallet support, external wallets (MetaMask, WalletConnect, EIP-6963, Azure Key Vault, AWS), SIWE, multisig, and Gnosis Safe integration.</p>
<p><strong>Smart-contract ecosystem integration</strong><br>
Established integration patterns for ENS, Uniswap, Safe, ERC standards, x402 and others.</p>
<p><strong>MUD as a full backend</strong><br>
Complete support for MUD: typed Store access, systems, tables, indexing, code generation, and data-driven application backends — usable beyond games as a general on-chain backend model.</p>
<p><strong>Indexing & deterministic data processing</strong><br>
Block, transaction, and log processors; reorg-safe pipelines; deterministic processing; change tracking; and support for multiple databases including PostgreSQL, SQL Server, Azure, and others — designed to integrate with existing systems.</p>
<p><strong>UI & application frameworks</strong><br>
Native support for Blazor, Blazor Hybrid, MAUI, Unity, Avalonia, desktop, and mobile, with reusable components for queries, transactions, deployments, and ABI-driven forms.</p>
<p><strong>Code generation & templates</strong><br>
Multi-format generators producing editable application code (smart contract integration, MUD, unity and blazor front ends) with templates for web, desktop, mobile, games, and playground scenarios.</p>
<p><strong>Production & enterprise readiness</strong><br>
Designed for long-running services, background workers, deterministic execution, auditing, observability hooks, and real-world system and ERP integration.</p>
<h2>Release notes</h2>
<h3>Highlights</h3>
<ul>
<li>Added a full <strong>Ethereum consensus light client + execution state verification</strong> stack (Beacon REST client, SSZ, BLS, light client sync, and verified <code>eth_*</code> reads).</li>
<li>Introduced <strong>Nethereum.Wallet</strong> as a complete, reusable wallet platform: vault storage, account types, chain management, permissions, RPC request handlers, and UI components.</li>
<li>Major <strong>hardware wallet</strong> upgrade with end-to-end <strong>Trezor support</strong>, including EIP-712 signing and Android USB support for MAUI.</li>
<li>Expanded <strong>protocol integrations</strong>, including <em><em>X402</em>, <em>Uniswap (Permit2 + Universal Router)</em></em> and additional ecosystem libraries (Circles, Safe utilities improvements).</li>
<li>Updated and expanded <strong>data services</strong> (ChainList, CoinGecko, Etherscan v2), plus continued improvements across core libraries.</li>
</ul>
<h3>New packages and major additions</h3>
<p><strong>Ethereum Light Client & Verification</strong></p>
<ul>
<li><code>Nethereum.Beaconchain</code> — Beacon Chain REST client with light client endpoints.</li>
<li><code>Nethereum.Consensus.LightClient</code> — light client sync (finality/optimistic/standard), sync committee verification, persistent store abstraction.</li>
<li><code>Nethereum.Consensus.Ssz</code> + <code>Nethereum.Ssz</code> — consensus types and SSZ infrastructure, Merkleization and proof verification.</li>
<li><code>Nethereum.ChainStateVerification</code> — verified execution-layer reads (balance, code, storage, nonce) with an interceptor for transparent Web3 integration.</li>
<li><code>Nethereum.Signer.Bls</code> + <code>Nethereum.Signer.Bls.Herumi</code> — pluggable BLS verification with a production native implementation.</li>
</ul>
<p><strong>Wallet platform</strong></p>
<ul>
<li><code>Nethereum.Wallet</code> — vaults, account management, chain/rpc management, permissions, host provider + interceptor.</li>
<li><code>Nethereum.Wallet.RpcRequests</code> — MetaMask-compatible wallet RPC method handlers (request accounts, send tx, sign, switch/add chain, permissions, etc.).</li>
<li><code>Nethereum.Wallet.UI.Components</code> — framework-agnostic ViewModels with a plugin-based dashboard approach.</li>
<li><code>Nethereum.Wallet.UI.Components.Blazor</code> + <code>...Maui</code> — production UI integration layers.</li>
</ul>
<p><strong>Hardware wallet</strong></p>
<ul>
<li><code>Nethereum.Signer.Trezor</code> — major upgrade (firmware/protobuf updates, EIP-712 signing, cross-platform improvements).</li>
<li><code>Nethereum.Wallet.Trezor</code> + UI integrations (<code>...UI.Components.*.Trezor</code>).</li>
<li><code>Nethereum.Maui.AndroidUsb</code> — Android USB device layer enabling Trezor on Android MAUI.</li>
</ul>
<p><strong>DeFi and protocol integrations</strong></p>
<ul>
<li><code>Nethereum.Uniswap</code> — Permit2 signing + Universal Router command model.</li>
<li><code>Nethereum.X402</code> — HTTP 402 payment flow tooling for paid APIs.</li>
<li><code>Nethereum.Circles</code> — Circles protocol integration on Gnosis Chain.</li>
<li><code>Nethereum.GnosisSafe</code> — utility improvements for hashes/signatures/import-export.</li>
</ul>
<p><strong>Data & utilities</strong></p>
<ul>
<li><code>Nethereum.DataServices</code> — ChainList + CoinGecko integrations; Etherscan v2 and Sourcify v2 updates.</li>
<li><code>Nethereum.KeyStore</code> — generic keystore encryption for arbitrary data.</li>
<li>Continued updates across EIP-712 signing, EIP-6963 interop, MUD change tracking, Merkle utilities, and Unity helpers.</li>
</ul>
<p><strong>Package Readmes</strong><br>
All packages have now a Readme file to help getting started or get LLMs the right introduction to them.</p>
<h3>Compatibility notes</h3>
<ul>
<li>This is a large release with new packages and expanded surface area; if you upgrade from 5.0.0, review any wallet/RPC interception and serializer behaviour changes relevant to your applications.</li>
</ul>
<h1>10 years thanks</h1>
<p>I would like to dedicate this to my father, who passed away 10 years ago. Nethereum, and much of my work since, has been inspired by that event.</p>
<ul>
<li>Many thanks to my family for the support they have provided and the sacrifices that this has meant for them.</li>
<li>To all the friends who have been there and provided emotional support, daily, when needed, or in the background, encouraging and providing help to continue (or sometimes encourage to stop ;) ).</li>
<li>To everyone who has worked directly with Nethereum: Gael, Dave and Kevin</li>
<li>To those who have always been there Caleb, Aaron and Jim</li>
<li>To all the great and small contributors.</li>
<li>To everyone in Gitter, Discord, and the community spaces who has been part of the journey and provided great feedback from the start</li>
<li>To everyone at ConsenSys, Ujo, Maker, Microsoft, Etherscan, CafeCosmos, dev tools community and the wider Ethereum community .... too many to mention, but you know who you are.</li>
</ul>
<p>"The One Piece" was the friends we made along the way.</p>
<p>All the love Juan</p>
<h3>Example of all the wallet components</h3>
<p><a target="_blank" rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/562371/531484523-6c06a82a-f4b9-4aec-9177-9a597cceadbb.gif?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzM5MjI3NDcsIm5iZiI6MTc3MzkyMjQ0NywicGF0aCI6Ii81NjIzNzEvNTMxNDg0NTIzLTZjMDZhODJhLWY0YjktNGFlYy05MTc3LTlhNTk3Y2NlYWRiYi5naWY_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMzE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDMxOVQxMjE0MDdaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0xNDJmZjYwMDA4Nzk2OGQ4N2VmZmY0YmU5ZjQ3Y2UzYjA3NzMyYjhjZTMxNDYyOWU3YjRhNzcxODA0NjdiNTliJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.G8-KQLcVt0quBXDJSYX06YX4TG_2p7o4GmnCHoHgck0"><img src="https://private-user-images.githubusercontent.com/562371/531484523-6c06a82a-f4b9-4aec-9177-9a597cceadbb.gif?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzM5MjI3NDcsIm5iZiI6MTc3MzkyMjQ0NywicGF0aCI6Ii81NjIzNzEvNTMxNDg0NTIzLTZjMDZhODJhLWY0YjktNGFlYy05MTc3LTlhNTk3Y2NlYWRiYi5naWY_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMzE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDMxOVQxMjE0MDdaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0xNDJmZjYwMDA4Nzk2OGQ4N2VmZmY0YmU5ZjQ3Y2UzYjA3NzMyYjhjZTMxNDYyOWU3YjRhNzcxODA0NjdiNTliJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.G8-KQLcVt0quBXDJSYX06YX4TG_2p7o4GmnCHoHgck0" alt="walletcomponents" content-type-secured-asset="image/gif" style="max-width: 100%;"></a></p>juanfranblancotag:github.com,2008:Repository/46746187/5.0.02025-05-30T16:20:13Z5.0.0<h2>EIP7022</h2>
<p>Model:</p>
<ul>
<li>New Transaction7702</li>
<li>New Transaction7702Encoder (RLP encoding / decoding)</li>
<li>TransactionFactory update to create 7702 transactions directly, from a generic input or rlp</li>
<li>New transaction Type (0x04)</li>
<li>Authorisation7702 and Authorisation7702Signed both supported by Encoders, First one used to sign authorisations<br>
RPC:</li>
<li>New Authorisation RPC object and Model mappers</li>
<li>Changes to TransactionInput and Transaction to include Authorisations</li>
<li>Changes to TransactionManagerBase to include identification of EIP7022 transaction types if included the authorisation list, also include common methods to Add authorisations or remove authorisations to the next request, default gas calculation optimised to add extra 2500 per authorisation if either present on the transaction input or in the next requests to be appended to the transaction</li>
</ul>
<p>Signer:<br>
New: Transaction7702Signer similar generic same as 1059</p>
<ul>
<li>Authorisation7702Signer signer to authorise items requests before including them into the 7022 transaction.</li>
<li>EthECKeyBuilderFromSignedAuthorisation to recover the the signer from Authorisation7702Signed authorisation</li>
<li>DecodeRLPToAuthorisation7702 to validate the rlp that is being signed by the user... (what am I authorising)</li>
</ul>
<p>Updates:</p>
<ul>
<li>EthECKeyBuilderFromSignedTransaction update to recover from Transaction7702 transaction</li>
<li>EthExternalSignerBase generic external signer support of 7702.</li>
<li>Aws, Azure enable generic signing of 7702</li>
<li>Ledger, Trezor, marked as unsupported</li>
</ul>
<p>Accounts:</p>
<ul>
<li>AccountSignerTransactionManager at the time of nonce allocation, does the signing of all the authorisations to ensure correct nonces in sequencing order based on the nonce manager, authorisations are merged from the request queue onto the transaction input.</li>
<li>OfflineTransactionSigner update.</li>
<li>ExternalAccount signing partial support whilst it can sign the 7702 this needs to be implemented to SignAuthorisationAsync and nonce flow</li>
</ul>
<p>Contracts</p>
<ul>
<li>Added AuthorisationList to the common contract object and encoding services</li>
</ul>
<p>Tests</p>
<ul>
<li>Signing Integration tests, included smart contracts examples BatchCall as a contract to be used as 7702 (enabling multiple calls) and delegation.</li>
</ul>
<p>Services</p>
<ul>
<li>7022SponsorAuthorisationService (Sign authorisations for multiple external accounts),</li>
<li>AuthorisationGasCalculator (core gas calculator),</li>
<li>AuthorisationSigner batch key signing support</li>
<li>Tests to batch creation / authorisation</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/906f165d64898a4f6440d7d2d17f96fe62da69d0/hovercard" href="https://github.com/Nethereum/Nethereum/commit/906f165d64898a4f6440d7d2d17f96fe62da69d0"><tt>906f165</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/e88fb133459988fb58e45e0ce0675d87afdee724/hovercard" href="https://github.com/Nethereum/Nethereum/commit/e88fb133459988fb58e45e0ce0675d87afdee724"><tt>e88fb13</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/8a20bce82ff0fa343b48c4c3611b7adf5adf0dbd/hovercard" href="https://github.com/Nethereum/Nethereum/commit/8a20bce82ff0fa343b48c4c3611b7adf5adf0dbd"><tt>8a20bce</tt></a>,<br>
<a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/2343277dbcb748321a1d638a1e3157b9eb9536a4/hovercard" href="https://github.com/Nethereum/Nethereum/commit/2343277dbcb748321a1d638a1e3157b9eb9536a4"><tt>2343277</tt></a></p>
<h2>Muticall RPC batch support improvements</h2>
<ul>
<li>
<p>MulticallInputOuputRpcBatchItem and CreateMulticallInputOutputRpcBatchItems<br>
To be able to send batches of rpc calls and decode them the MultiQueryBatchRpcHandler includes CreateMulticallInputOutputRpcBatchItems. This method using the multicalls creates a set of MulticallInputOutputRpcBatchItems that contains both the multicallinputouput for decoding the call data and the newly created based on the multicallinputoutput rpcRequestResponseBatchItem.<br>
MulticallInputOuputRpcBatchItem implements the interface of IRpcRequestResponseBatchItem by wrapping the rpcRequestResponseBatchItem so it can be used as any other normal batch request</p>
</li>
<li>
<p>Allowing partial success in batch requests. by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/dlebee/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/dlebee">@dlebee</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2937306955" data-permission-text="Title is private" data-url="https://github.com/Nethereum/Nethereum/issues/1070" data-hovercard-type="pull_request" data-hovercard-url="/Nethereum/Nethereum/pull/1070/hovercard" href="https://github.com/Nethereum/Nethereum/pull/1070">#1070</a></p>
</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/633474dd0d9bbb0465824e617cbc87293bbaae74/hovercard" href="https://github.com/Nethereum/Nethereum/commit/633474dd0d9bbb0465824e617cbc87293bbaae74"><tt>633474d</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/11c5945fcddb55a8a495c24210bc8f964dce0878/hovercard" href="https://github.com/Nethereum/Nethereum/commit/11c5945fcddb55a8a495c24210bc8f964dce0878"><tt>11c5945</tt></a></p>
<h2>Utils Random</h2>
<p>New shuffler and bytes shuffler specialised to help when creating random sets of bytes / numbers (or anything), based on the card shuffling strategy, so no consecutive values can be guessed based on a generic set or rng if guessed.</p>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/cfe1ff47ac859649f00e8c5b0d49fd3db05a8c4a/hovercard" href="https://github.com/Nethereum/Nethereum/commit/cfe1ff47ac859649f00e8c5b0d49fd3db05a8c4a"><tt>cfe1ff4</tt></a></p>
<h2>EVM Simulator update</h2>
<ul>
<li>The EVM simulator includes a Gas counter.</li>
<li>New Op codes supported: BASEFEE- BLOBHASH - BLOBBASEFE- TLOAD - TSTORE<br>
Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/ee6b4d723dfa0c2b434b647ac572170338ea8859/hovercard" href="https://github.com/Nethereum/Nethereum/commit/ee6b4d723dfa0c2b434b647ac572170338ea8859"><tt>ee6b4d7</tt></a></li>
</ul>
<h2>Nethereum.Merkles LeanIncrementalMerkleTree</h2>
<ul>
<li>New tree / trie LeanIncrementalMerkleTree to support zk proofs<br>
Commit: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/adb28725ba21c70d0806b90a4534c3c6f8144a12/hovercard" href="https://github.com/Nethereum/Nethereum/commit/adb28725ba21c70d0806b90a4534c3c6f8144a12"><tt>adb2872</tt></a></li>
</ul>
<h2>Nethereum.Geth update</h2>
<ul>
<li>New DTOs for debug and tracer options/responses added and changes to the Debug api services.<br>
Thanks to <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/SolidityNinja/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/SolidityNinja">@SolidityNinja</a> pull: <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2914210430" data-permission-text="Title is private" data-url="https://github.com/Nethereum/Nethereum/issues/1068" data-hovercard-type="pull_request" data-hovercard-url="/Nethereum/Nethereum/pull/1068/hovercard" href="https://github.com/Nethereum/Nethereum/pull/1068">#1068</a></li>
<li>Nethereum.Geth use StateChange from the core RPC project<br>
Commit: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/ec4c916d44a342d8ac6d9c2c91dc481703ed0a10/hovercard" href="https://github.com/Nethereum/Nethereum/commit/ec4c916d44a342d8ac6d9c2c91dc481703ed0a10"><tt>ec4c916</tt></a></li>
</ul>
<h2>Bouncy Castle update</h2>
<ul>
<li>Change of package and version to BouncyCastle.Cryptography 2.5.1, but open to any version up to 3.0.0, targeting frameworks net90, net80, net60 and net472, leaving portable to other versions (previous) due to compatibility issues.</li>
<li>fix issue in ToDER() method, thanks to the pull request by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/tmm360/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/tmm360">@tmm360</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2967862860" data-permission-text="Title is private" data-url="https://github.com/Nethereum/Nethereum/issues/1071" data-hovercard-type="pull_request" data-hovercard-url="/Nethereum/Nethereum/pull/1071/hovercard" href="https://github.com/Nethereum/Nethereum/pull/1071">#1071</a><br>
Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/62affe5edd74057ca9ee5f70f864b488037f395d/hovercard" href="https://github.com/Nethereum/Nethereum/commit/62affe5edd74057ca9ee5f70f864b488037f395d"><tt>62affe5</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/a184667de051281e89546c0e215aa0c8ce4aabaa/hovercard" href="https://github.com/Nethereum/Nethereum/commit/a184667de051281e89546c0e215aa0c8ce4aabaa"><tt>a184667</tt></a></li>
</ul>
<h2>.NET AOT Native support, Nethereum.JsonRpc.SystemTextJsonRpcClient and Example.</h2>
<p>.NET Native (now part of Native AOT in .NET) compiles .NET applications ahead-of-time into platform-specific machine code, eliminating the need for a JIT compiler and reducing startup time, memory usage, and deployment size. To enable this and continue to be backwards compatible requires many changes (at core), mostly caused by JSON encoding and decoding.</p>
<ul>
<li>Nethereum.JsonRpc.SystemTextJsonRpcClient is a brand new project and AOT-friendly JSON-RPC client for Ethereum, using System.Text.Json.</li>
</ul>
<p>This provides new RPC Client component and Simple RPC Client component, including also Nethereum RPC Context for generated serialisation of RPC types to provide the RPC transport with System.Text.Json instead of Newtonsoft making it suitable for AOT Native builds using .net9.</p>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/e99d1746ab920aa13ac5add88254826dbba26e2b/hovercard" href="https://github.com/Nethereum/Nethereum/commit/e99d1746ab920aa13ac5add88254826dbba26e2b"><tt>e99d174</tt></a></p>
<ul>
<li>Update all the Nethereum.RPC DTOs, Nethereum.JsonRpc.RpcClient Messages and Nethereum.Hex HexTypes to dual support Newtonsoft.Json and System.Text.Json</li>
</ul>
<div class="highlight highlight-source-cs notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content=" [JsonProperty(PropertyName = "decimals")]
#if NET6_0_OR_GREATER
[System.Text.Json.Serialization.JsonPropertyName("decimals")]
#endif
public uint Decimals { get; set; }
"><pre> <span class="pl-kos">[</span><span class="pl-c1">JsonProperty</span><span class="pl-kos">(</span><span class="pl-s1">PropertyName</span> <span class="pl-c1">=</span> <span class="pl-s">"decimals"</span><span class="pl-kos">)</span><span class="pl-kos">]</span>
#if <span class="pl-s1">NET6_0_OR_GREATER</span>
<span class="pl-kos">[</span><span class="pl-s1">System</span><span class="pl-kos">.</span><span class="pl-s1">Text</span><span class="pl-kos">.</span><span class="pl-s1">Json</span><span class="pl-kos">.</span><span class="pl-s1">Serialization</span><span class="pl-kos">.</span><span class="pl-s1">JsonPropertyName</span><span class="pl-kos">(</span><span class="pl-s">"decimals"</span><span class="pl-kos">)</span><span class="pl-kos">]</span>
#endif
<span class="pl-k">public</span> <span class="pl-smi">uint</span> <span class="pl-s1">Decimals</span> <span class="pl-kos">{</span> <span class="pl-k">get</span><span class="pl-kos">;</span> <span class="pl-k">set</span><span class="pl-kos">;</span> <span class="pl-kos">}</span></pre></div>
<ul>
<li>
<p>Transaction Receipt does not use JArray that couples it to Newtonsoft, it uses now the typed version, FilterLog, and to avoid migration issues all the extensions from receipt has been upgraded, and in scenarios the type conversion remains the same, but just returns the same object.</p>
</li>
<li>
<p>All Clients now include a DecodeMethod, so any response message can be combined with the client deserialiser and settings (ie System.Text.Json specific).</p>
</li>
<li>
<p>New ContractABI deserialiser ABIJsonDeserialiserSTJ to support System.Text.Json, this is an optin deserialiser, enabling to interact with smart contracts using abi strings in Native mode. Note: To workaround the fact that newtonsoft is more flexible and allows for single quotes when using Json and backwards compatibility, the deserialiser if it finds single quotes it replaces them with double quotes.</p>
</li>
</ul>
<p>To enable it use:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="AbiDeserializationSettings.UseSystemTextJson = true;"><pre class="notranslate"><code>AbiDeserializationSettings.UseSystemTextJson = true;
</code></pre></div>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/8466e44de02c0578fec22dff886bf88548088c7c/hovercard" href="https://github.com/Nethereum/Nethereum/commit/8466e44de02c0578fec22dff886bf88548088c7c"><tt>8466e44</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/5eccd836aa7897410b56a4604729c8d6013a3244/hovercard" href="https://github.com/Nethereum/Nethereum/commit/5eccd836aa7897410b56a4604729c8d6013a3244"><tt>5eccd83</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/2b0407d995b677b77f01e74c543389ad173404f9/hovercard" href="https://github.com/Nethereum/Nethereum/commit/2b0407d995b677b77f01e74c543389ad173404f9"><tt>2b0407d</tt></a></p>
<ul>
<li>Nethereum.ABI.SourceGenerators, (WIP) to avoid ABI decoding using the attributes and reflection when using typed FunctionMessages, Events etc. Nethereum.ABI.SourceGenerators experimental project generates the code to convert set and get the values directly when encoding and decoding at compilation time. This works very well native mode as the code is normally stripped from this scenarios. The current early implementation works on Functions and Structs, but further refining is required to allow for anonymous methods, implementation of other types and most importantly integrate it an option within the deserialising workflow.</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/48a2302565e158810b254c8b75aea4977de8703f/hovercard" href="https://github.com/Nethereum/Nethereum/commit/48a2302565e158810b254c8b75aea4977de8703f"><tt>48a2302</tt></a></p>
<ul>
<li>.NET Native example and test project<br>
The dotnet native example, provides many common scenarios and tests to validate the native support of Nethereum.<br>
Source: <a href="https://github.com/Nethereum/Nethereum/blob/master/consoletests/Nethereum.AOTSigningTest/Program.cs">https://github.com/Nethereum/Nethereum/blob/master/consoletests/Nethereum.AOTSigningTest/Program.cs</a></li>
</ul>
<p>A simple example of usage:</p>
<p>Include the namespace for the SystemTextJsonRpcClient.</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="using Nethereum.JsonRpc.SystemTextJsonRpcClient;"><pre class="notranslate"><code>using Nethereum.JsonRpc.SystemTextJsonRpcClient;
</code></pre></div>
<p>Using the RpcClient from SystemTextJsonRpcClient, and work as usual.</p>
<div class="highlight highlight-source-cs notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="var localClient = new RpcClient("http://localhost:8545");
var account = new Nethereum.Web3.Accounts.Account("0xb5b1870957d373ef0eeffecc6e4812c0fd08f554b37b233526acc331bf1544f7");
var web3Local = new Web3.Web3(account, localClient);
var localBalance = await web3Local
.Eth
.GetBalance.SendRequestAsync("0x12890d2cce102216644c59daE5baed380d84830c");
var ethSenderService = web3Local.Eth.GetEtherTransferService();
var transactionHash = await ethSenderService.TransferEtherAsync("0x12890d2cce102216644c59daE5baed380d84830c", 0.01m);"><pre><span class="pl-k">var</span> <span class="pl-s1">localClient</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">RpcClient</span><span class="pl-kos">(</span><span class="pl-s">"http://localhost:8545"</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">account</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-s1">Nethereum</span><span class="pl-kos">.</span><span class="pl-s1">Web3</span><span class="pl-kos">.</span><span class="pl-s1">Accounts</span><span class="pl-kos">.</span><span class="pl-s1">Account</span><span class="pl-kos">(</span><span class="pl-s">"0xb5b1870957d373ef0eeffecc6e4812c0fd08f554b37b233526acc331bf1544f7"</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">web3Local</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-s1">Web3</span><span class="pl-kos">.</span><span class="pl-s1">Web3</span><span class="pl-kos">(</span><span class="pl-s1">account</span><span class="pl-kos">,</span> <span class="pl-s1">localClient</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">localBalance</span> <span class="pl-c1">=</span> <span class="pl-k">await</span> <span class="pl-s1">web3Local</span>
<span class="pl-kos">.</span><span class="pl-s1">Eth</span>
<span class="pl-kos">.</span><span class="pl-s1">GetBalance</span><span class="pl-kos">.</span><span class="pl-en">SendRequestAsync</span><span class="pl-kos">(</span><span class="pl-s">"0x12890d2cce102216644c59daE5baed380d84830c"</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">ethSenderService</span> <span class="pl-c1">=</span> <span class="pl-s1">web3Local</span><span class="pl-kos">.</span><span class="pl-s1">Eth</span><span class="pl-kos">.</span><span class="pl-en">GetEtherTransferService</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">transactionHash</span> <span class="pl-c1">=</span> <span class="pl-k">await</span> <span class="pl-s1">ethSenderService</span><span class="pl-kos">.</span><span class="pl-en">TransferEtherAsync</span><span class="pl-kos">(</span><span class="pl-s">"0x12890d2cce102216644c59daE5baed380d84830c"</span><span class="pl-kos">,</span> <span class="pl-c1">0.01m</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div>
<p>Note the project settings that do include TrimmerRootAssembly to avoid stripping of attribute based types.</p>
<div class="highlight highlight-text-xml notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<PublishAot>true</PublishAot>
<SelfContained>true</SelfContained>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<InvariantGlobalization>true</InvariantGlobalization>
<PublishTrimmed>true</PublishTrimmed>
</PropertyGroup>
<!-- other settings -->
<ItemGroup>
<TrimmerRootAssembly Include="Nethereum.Contracts" />
<TrimmerRootAssembly Include="Nethereum.ABI" />
<TrimmerRootAssembly Include="Nethereum.Hex" />
<TrimmerRootAssembly Include="Nethereum.AOTSigningTest" />
</ItemGroup>
</Project>"><pre><<span class="pl-ent">Project</span> <span class="pl-e">Sdk</span>=<span class="pl-s"><span class="pl-pds">"</span>Microsoft.NET.Sdk<span class="pl-pds">"</span></span>>
<<span class="pl-ent">PropertyGroup</span>>
<<span class="pl-ent">OutputType</span>>Exe</<span class="pl-ent">OutputType</span>>
<<span class="pl-ent">TargetFramework</span>>net9.0</<span class="pl-ent">TargetFramework</span>>
<<span class="pl-ent">PublishAot</span>>true</<span class="pl-ent">PublishAot</span>>
<<span class="pl-ent">SelfContained</span>>true</<span class="pl-ent">SelfContained</span>>
<<span class="pl-ent">RuntimeIdentifier</span>>win-x64</<span class="pl-ent">RuntimeIdentifier</span>>
<<span class="pl-ent">InvariantGlobalization</span>>true</<span class="pl-ent">InvariantGlobalization</span>>
<<span class="pl-ent">PublishTrimmed</span>>true</<span class="pl-ent">PublishTrimmed</span>>
</<span class="pl-ent">PropertyGroup</span>>
<span class="pl-c"><span class="pl-c"><!--</span> other settings <span class="pl-c">--></span></span>
<<span class="pl-ent">ItemGroup</span>>
<<span class="pl-ent">TrimmerRootAssembly</span> <span class="pl-e">Include</span>=<span class="pl-s"><span class="pl-pds">"</span>Nethereum.Contracts<span class="pl-pds">"</span></span> />
<<span class="pl-ent">TrimmerRootAssembly</span> <span class="pl-e">Include</span>=<span class="pl-s"><span class="pl-pds">"</span>Nethereum.ABI<span class="pl-pds">"</span></span> />
<<span class="pl-ent">TrimmerRootAssembly</span> <span class="pl-e">Include</span>=<span class="pl-s"><span class="pl-pds">"</span>Nethereum.Hex<span class="pl-pds">"</span></span> />
<<span class="pl-ent">TrimmerRootAssembly</span> <span class="pl-e">Include</span>=<span class="pl-s"><span class="pl-pds">"</span>Nethereum.AOTSigningTest<span class="pl-pds">"</span></span> />
</<span class="pl-ent">ItemGroup</span>>
</<span class="pl-ent">Project</span>></pre></div>
<p><a target="_blank" rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/562371/448788345-557ac043-0886-4e08-9ae7-dd5ff6f6bdbf.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzM5MjI3NDcsIm5iZiI6MTc3MzkyMjQ0NywicGF0aCI6Ii81NjIzNzEvNDQ4Nzg4MzQ1LTU1N2FjMDQzLTA4ODYtNGUwOC05YWU3LWRkNWZmNmY2YmRiZi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMzE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDMxOVQxMjE0MDdaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT02YWYzMTkyMGI1ZTg2ZTIwZjE2MWEyZmI0YzhjOGE0NWQ1NGEzMWNlOWFmZWE4ZWYxNDM1M2YwMzg3NDk2MTNiJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.RMkFOuzAu0POhhRy1qNV_1AKzc8Sqg-u-jm3PAqGj5M"><img src="https://private-user-images.githubusercontent.com/562371/448788345-557ac043-0886-4e08-9ae7-dd5ff6f6bdbf.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzM5MjI3NDcsIm5iZiI6MTc3MzkyMjQ0NywicGF0aCI6Ii81NjIzNzEvNDQ4Nzg4MzQ1LTU1N2FjMDQzLTA4ODYtNGUwOC05YWU3LWRkNWZmNmY2YmRiZi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMzE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDMxOVQxMjE0MDdaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT02YWYzMTkyMGI1ZTg2ZTIwZjE2MWEyZmI0YzhjOGE0NWQ1NGEzMWNlOWFmZWE4ZWYxNDM1M2YwMzg3NDk2MTNiJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.RMkFOuzAu0POhhRy1qNV_1AKzc8Sqg-u-jm3PAqGj5M" alt="image" content-type-secured-asset="image/png" style="max-width: 100%;"></a></p>
<h1>Nethereum.MudBlazorComponent</h1>
<p>New project providing different Blazor components in (MudBlazor) to provide simple data input for smart contracts and Mud (Mud.Dev) Tables.</p>
<ul>
<li>
<p>QueryFunctionComponent you can query any smart contract by providing the FunctionMessageType, SmartContractAddress and the Output, or a service type and the query method.</p>
</li>
<li>
<p>TransactionFunctionComponent you can submit any transaction in the same way as the QueryFunctionComponent, the service will be used to decode all the events output after the transaction submission, you can also provide a set of event types for decoding</p>
</li>
<li>
<p>ContractDeploymentComponent as per the Transactions but to deploy smart contracts.</p>
</li>
<li>
<p>MudDevTableComponent using a TableServiceType it can be used to both query by key a table and upsert a value.</p>
</li>
<li>
<p>MudDevTableServicesComponent scans an assembly for all the TableServiceTypes and creates a user interface (collection) of MudTableComponents per each table found.</p>
</li>
</ul>
<div class="highlight highlight-text-xml notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content=" <ContractDeploymentComponent TDeploymentMessage="SoftTokenDeployment"
HostProvider="selectedHostProviderService"
ServiceType="typeof(SoftTokenService)"
ContractAddressChanged="ContractAddressChanged" />
<QueryFunctionComponent TFunctionMessage="AllowanceFunction" TFunctionOutput="BigInteger"
Title="allowance"
ContractAddress="@ContractAddress"
HostProvider="selectedHostProviderService"
ServiceType="typeof(SoftTokenService)"
ServiceMethodName="AllowanceQueryAsync" />
<TransactionFunctionComponent TFunctionMessage="ApproveFunction"
Title="approve"
ContractAddress="@ContractAddress"
HostProvider="selectedHostProviderService"
ServiceType="typeof(SoftTokenService)"
ServiceRequestMethodName="ApproveRequestAsync"
ServiceRequestAndWaitForReceiptMethodName="ApproveRequestAndWaitForReceiptAsync" />
<MudDevTableComponent TService="ItemsTableService"
ContractAddress="@ContractAddress"
HostProvider="HostProvider" />"><pre> <<span class="pl-ent">ContractDeploymentComponent</span> <span class="pl-e">TDeploymentMessage</span>=<span class="pl-s"><span class="pl-pds">"</span>SoftTokenDeployment<span class="pl-pds">"</span></span>
<span class="pl-e">HostProvider</span>=<span class="pl-s"><span class="pl-pds">"</span>selectedHostProviderService<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceType</span>=<span class="pl-s"><span class="pl-pds">"</span>typeof(SoftTokenService)<span class="pl-pds">"</span></span>
<span class="pl-e">ContractAddressChanged</span>=<span class="pl-s"><span class="pl-pds">"</span>ContractAddressChanged<span class="pl-pds">"</span></span> />
<<span class="pl-ent">QueryFunctionComponent</span> <span class="pl-e">TFunctionMessage</span>=<span class="pl-s"><span class="pl-pds">"</span>AllowanceFunction<span class="pl-pds">"</span></span> <span class="pl-e">TFunctionOutput</span>=<span class="pl-s"><span class="pl-pds">"</span>BigInteger<span class="pl-pds">"</span></span>
<span class="pl-e">Title</span>=<span class="pl-s"><span class="pl-pds">"</span>allowance<span class="pl-pds">"</span></span>
<span class="pl-e">ContractAddress</span>=<span class="pl-s"><span class="pl-pds">"</span>@ContractAddress<span class="pl-pds">"</span></span>
<span class="pl-e">HostProvider</span>=<span class="pl-s"><span class="pl-pds">"</span>selectedHostProviderService<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceType</span>=<span class="pl-s"><span class="pl-pds">"</span>typeof(SoftTokenService)<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceMethodName</span>=<span class="pl-s"><span class="pl-pds">"</span>AllowanceQueryAsync<span class="pl-pds">"</span></span> />
<<span class="pl-ent">TransactionFunctionComponent</span> <span class="pl-e">TFunctionMessage</span>=<span class="pl-s"><span class="pl-pds">"</span>ApproveFunction<span class="pl-pds">"</span></span>
<span class="pl-e">Title</span>=<span class="pl-s"><span class="pl-pds">"</span>approve<span class="pl-pds">"</span></span>
<span class="pl-e">ContractAddress</span>=<span class="pl-s"><span class="pl-pds">"</span>@ContractAddress<span class="pl-pds">"</span></span>
<span class="pl-e">HostProvider</span>=<span class="pl-s"><span class="pl-pds">"</span>selectedHostProviderService<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceType</span>=<span class="pl-s"><span class="pl-pds">"</span>typeof(SoftTokenService)<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceRequestMethodName</span>=<span class="pl-s"><span class="pl-pds">"</span>ApproveRequestAsync<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceRequestAndWaitForReceiptMethodName</span>=<span class="pl-s"><span class="pl-pds">"</span>ApproveRequestAndWaitForReceiptAsync<span class="pl-pds">"</span></span> />
<<span class="pl-ent">MudDevTableComponent</span> <span class="pl-e">TService</span>=<span class="pl-s"><span class="pl-pds">"</span>ItemsTableService<span class="pl-pds">"</span></span>
<span class="pl-e">ContractAddress</span>=<span class="pl-s"><span class="pl-pds">"</span>@ContractAddress<span class="pl-pds">"</span></span>
<span class="pl-e">HostProvider</span>=<span class="pl-s"><span class="pl-pds">"</span>HostProvider<span class="pl-pds">"</span></span> /></pre></div>
<p><a target="_blank" rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/562371/448927423-0dd115a9-c3bb-4874-b1c9-a176f1f1eb36.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzM5MjI3NDcsIm5iZiI6MTc3MzkyMjQ0NywicGF0aCI6Ii81NjIzNzEvNDQ4OTI3NDIzLTBkZDExNWE5LWMzYmItNDg3NC1iMWM5LWExNzZmMWYxZWIzNi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMzE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDMxOVQxMjE0MDdaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0xMzM1M2RjY2Y2MDAyOGNlOWUxNmI3YmVkNTUxYTVmZDRjZDJjODg0NmY3YmYwYTE5MGI1MmI1MDVmYjUxZDM0JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.Lde64ryy_nVFGhiyByMO5zkKVkkEGwkp0uexg-gJknc"><img src="https://private-user-images.githubusercontent.com/562371/448927423-0dd115a9-c3bb-4874-b1c9-a176f1f1eb36.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzM5MjI3NDcsIm5iZiI6MTc3MzkyMjQ0NywicGF0aCI6Ii81NjIzNzEvNDQ4OTI3NDIzLTBkZDExNWE5LWMzYmItNDg3NC1iMWM5LWExNzZmMWYxZWIzNi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMzE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDMxOVQxMjE0MDdaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0xMzM1M2RjY2Y2MDAyOGNlOWUxNmI3YmVkNTUxYTVmZDRjZDJjODg0NmY3YmYwYTE5MGI1MmI1MDVmYjUxZDM0JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.Lde64ryy_nVFGhiyByMO5zkKVkkEGwkp0uexg-gJknc" alt="image" content-type-secured-asset="image/png" style="max-width: 100%;"></a></p>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/4433d11caf52feebb727817ebe9819632c65d883/hovercard" href="https://github.com/Nethereum/Nethereum/commit/4433d11caf52feebb727817ebe9819632c65d883"><tt>4433d11</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/d34cd7a89bcf5ce38cd655b3ade38957fc4e73d1/hovercard" href="https://github.com/Nethereum/Nethereum/commit/d34cd7a89bcf5ce38cd655b3ade38957fc4e73d1"><tt>d34cd7a</tt></a></p>
<h2>Code Generator updates (Blazor generation, common types folder) and full Refactoring</h2>
<ul>
<li>Support to have a common folder and shared namespace for shared Structs, Errors, etc across different contracts.</li>
<li>New Blazor Page generator, per generated smart contract service now you have a blazor web page to deploy, query and create transactions for all functions for both Typescript and DotNet versions</li>
<li>Refactoring the code generator to remove generics, Dotnet console, generator and unit test fixes.<br>
The code generator output to Typescript was having errors resolving generics after adding the blazor page, now all the generics have been removed where possible (keeping just a generic class) to avoid errors. (Eventually found the error and long fix)</li>
</ul>
<p>Example of multi-settings support for Blazor:</p>
<div class="highlight highlight-source-json notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="[
{
"paths": ["out/ERC20.sol/Standard_Token.json"],
"generatorConfigs": [
{
"baseNamespace": "MyProject.Contracts",
"basePath": "codeGenNodeTest/GeneratorSets/Example1/MyProject.Contracts",
"codeGenLang": 0,
"sharedTypesNamespace": "SharedTypes",
"sharedTypes": ["events", "errors"],
"generatorType": "ContractDefinition"
},
{
"baseNamespace": "MyProject.Contracts",
"basePath": "codeGenNodeTest/GeneratorSets/Example1/MyProject.Blazor",
"codeGenLang": 0,
"sharedTypesNamespace": "SharedTypes",
"generatorType": "BlazorPageService"
},
{
"baseNamespace": "MyProject.Contracts",
"basePath": "codeGenNodeTest/GeneratorSets/Example1/MyProject.Contracts",
"codeGenLang": 0,
"sharedTypesNamespace": "SharedTypes",
"sharedTypes": ["events", "errors"],
"generatorType": "UnityRequest"
}
]
},"><pre>[
{
<span class="pl-ent">"paths"</span>: [<span class="pl-s"><span class="pl-pds">"</span>out/ERC20.sol/Standard_Token.json<span class="pl-pds">"</span></span>],
<span class="pl-ent">"generatorConfigs"</span>: [
{
<span class="pl-ent">"baseNamespace"</span>: <span class="pl-s"><span class="pl-pds">"</span>MyProject.Contracts<span class="pl-pds">"</span></span>,
<span class="pl-ent">"basePath"</span>: <span class="pl-s"><span class="pl-pds">"</span>codeGenNodeTest/GeneratorSets/Example1/MyProject.Contracts<span class="pl-pds">"</span></span>,
<span class="pl-ent">"codeGenLang"</span>: <span class="pl-c1">0</span>,
<span class="pl-ent">"sharedTypesNamespace"</span>: <span class="pl-s"><span class="pl-pds">"</span>SharedTypes<span class="pl-pds">"</span></span>,
<span class="pl-ent">"sharedTypes"</span>: [<span class="pl-s"><span class="pl-pds">"</span>events<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>errors<span class="pl-pds">"</span></span>],
<span class="pl-ent">"generatorType"</span>: <span class="pl-s"><span class="pl-pds">"</span>ContractDefinition<span class="pl-pds">"</span></span>
},
{
<span class="pl-ent">"baseNamespace"</span>: <span class="pl-s"><span class="pl-pds">"</span>MyProject.Contracts<span class="pl-pds">"</span></span>,
<span class="pl-ent">"basePath"</span>: <span class="pl-s"><span class="pl-pds">"</span>codeGenNodeTest/GeneratorSets/Example1/MyProject.Blazor<span class="pl-pds">"</span></span>,
<span class="pl-ent">"codeGenLang"</span>: <span class="pl-c1">0</span>,
<span class="pl-ent">"sharedTypesNamespace"</span>: <span class="pl-s"><span class="pl-pds">"</span>SharedTypes<span class="pl-pds">"</span></span>,
<span class="pl-ent">"generatorType"</span>: <span class="pl-s"><span class="pl-pds">"</span>BlazorPageService<span class="pl-pds">"</span></span>
},
{
<span class="pl-ent">"baseNamespace"</span>: <span class="pl-s"><span class="pl-pds">"</span>MyProject.Contracts<span class="pl-pds">"</span></span>,
<span class="pl-ent">"basePath"</span>: <span class="pl-s"><span class="pl-pds">"</span>codeGenNodeTest/GeneratorSets/Example1/MyProject.Contracts<span class="pl-pds">"</span></span>,
<span class="pl-ent">"codeGenLang"</span>: <span class="pl-c1">0</span>,
<span class="pl-ent">"sharedTypesNamespace"</span>: <span class="pl-s"><span class="pl-pds">"</span>SharedTypes<span class="pl-pds">"</span></span>,
<span class="pl-ent">"sharedTypes"</span>: [<span class="pl-s"><span class="pl-pds">"</span>events<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>errors<span class="pl-pds">"</span></span>],
<span class="pl-ent">"generatorType"</span>: <span class="pl-s"><span class="pl-pds">"</span>UnityRequest<span class="pl-pds">"</span></span>
}
]
},</pre></div>
<p>and output:</p>
<div class="highlight highlight-text-html-cshtml notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="@using System.Numerics
@using Nethereum.UI
@using MyProject.Contracts.Standard_Token
@using MyProject.Contracts.Standard_Token.ContractDefinition
@page "/standard_token"
@rendermode InteractiveWebAssembly
@inject SelectedEthereumHostProviderService selectedHostProviderService
<MudContainer MaxWidth="MaxWidth.Medium" Class="mt-4">
<MudText Typo="Typo.h5" Class="mb-4">Standard_Token</MudText>
<MudTextField @bind-Value="ContractAddress" Label="Standard_Token Contract Address" Variant="Variant.Outlined" Class="mb-4" />
<ContractDeploymentComponent TDeploymentMessage="StandardTokenDeployment"
HostProvider="selectedHostProviderService"
ServiceType="typeof(StandardTokenPage)"
ContractAddressChanged="ContractAddressChanged" />
<QueryFunctionComponent TFunctionMessage="AllowanceFunction" TFunctionOutput="BigInteger"
Title="allowance"
ContractAddress="@ContractAddress"
HostProvider="selectedHostProviderService"
ServiceType="typeof(StandardTokenService)"
ServiceMethodName="AllowanceQueryAsync" />
<QueryFunctionComponent TFunctionMessage="AllowedFunction" TFunctionOutput="BigInteger"
Title="allowed"
ContractAddress="@ContractAddress"
HostProvider="selectedHostProviderService"
ServiceType="typeof(StandardTokenService)"
ServiceMethodName="AllowedQueryAsync" />
<TransactionFunctionComponent TFunctionMessage="ApproveFunction"
Title="approve"
ContractAddress="@ContractAddress"
HostProvider="selectedHostProviderService"
ServiceType="typeof(StandardTokenService)"
ServiceRequestMethodName="ApproveRequestAsync"
ServiceRequestAndWaitForReceiptMethodName="ApproveRequestAndWaitForReceiptAsync" />
<QueryFunctionComponent TFunctionMessage="BalanceOfFunction" TFunctionOutput="BigInteger"
Title="balanceOf"
ContractAddress="@ContractAddress"
HostProvider="selectedHostProviderService"
ServiceType="typeof(StandardTokenService)"
ServiceMethodName="BalanceOfQueryAsync" />
<QueryFunctionComponent TFunctionMessage="BalancesFunction" TFunctionOutput="BigInteger"
Title="balances"
ContractAddress="@ContractAddress"
HostProvider="selectedHostProviderService"
ServiceType="typeof(StandardTokenService)"
ServiceMethodName="BalancesQueryAsync" />
<QueryFunctionComponent TFunctionMessage="DecimalsFunction" TFunctionOutput="byte"
Title="decimals"
ContractAddress="@ContractAddress"
HostProvider="selectedHostProviderService"
ServiceType="typeof(StandardTokenService)"
ServiceMethodName="DecimalsQueryAsync" />
<QueryFunctionComponent TFunctionMessage="NameFunction" TFunctionOutput="string"
Title="name"
ContractAddress="@ContractAddress"
HostProvider="selectedHostProviderService"
ServiceType="typeof(StandardTokenService)"
ServiceMethodName="NameQueryAsync" />
<QueryFunctionComponent TFunctionMessage="SymbolFunction" TFunctionOutput="string"
Title="symbol"
ContractAddress="@ContractAddress"
HostProvider="selectedHostProviderService"
ServiceType="typeof(StandardTokenService)"
ServiceMethodName="SymbolQueryAsync" />
<QueryFunctionComponent TFunctionMessage="TotalSupplyFunction" TFunctionOutput="BigInteger"
Title="totalSupply"
ContractAddress="@ContractAddress"
HostProvider="selectedHostProviderService"
ServiceType="typeof(StandardTokenService)"
ServiceMethodName="TotalSupplyQueryAsync" />
<TransactionFunctionComponent TFunctionMessage="TransferFunction"
Title="transfer"
ContractAddress="@ContractAddress"
HostProvider="selectedHostProviderService"
ServiceType="typeof(StandardTokenService)"
ServiceRequestMethodName="TransferRequestAsync"
ServiceRequestAndWaitForReceiptMethodName="TransferRequestAndWaitForReceiptAsync" />
<TransactionFunctionComponent TFunctionMessage="TransferFromFunction"
Title="transferFrom"
ContractAddress="@ContractAddress"
HostProvider="selectedHostProviderService"
ServiceType="typeof(StandardTokenService)"
ServiceRequestMethodName="TransferFromRequestAsync"
ServiceRequestAndWaitForReceiptMethodName="TransferFromRequestAndWaitForReceiptAsync" />
</MudContainer>
@code
{
private string ContractAddress;
private void ContractAddressChanged(string address)
{
ContractAddress = address;
}
}
"><pre><span class="pl-k">@<span class="pl-k">using</span> <span class="pl-en">System</span>.<span class="pl-en">Numerics</span></span>
<span class="pl-k">@<span class="pl-k">using</span> <span class="pl-en">Nethereum</span>.<span class="pl-en">UI</span></span>
<span class="pl-k">@<span class="pl-k">using</span> <span class="pl-en">MyProject</span>.<span class="pl-en">Contracts</span>.<span class="pl-en">Standard_Token</span></span>
<span class="pl-k">@<span class="pl-k">using</span> <span class="pl-en">MyProject</span>.<span class="pl-en">Contracts</span>.<span class="pl-en">Standard_Token</span>.<span class="pl-en">ContractDefinition</span></span>
<span class="pl-k">@page </span><span class="pl-s"><span class="pl-pds">"</span>/standard_token<span class="pl-pds">"</span></span>
<span class="pl-k">@rendermode</span> InteractiveWebAssembly
<span class="pl-k">@inject </span><span class="pl-k">SelectedEthereumHostProviderService</span> <span class="pl-k">selectedHostProviderService</span>
<<span class="pl-ent">MudContainer</span> <span class="pl-e">MaxWidth</span>=<span class="pl-s"><span class="pl-pds">"</span>MaxWidth.Medium<span class="pl-pds">"</span></span> <span class="pl-e">Class</span>=<span class="pl-s"><span class="pl-pds">"</span>mt-4<span class="pl-pds">"</span></span>>
<<span class="pl-ent">MudText</span> <span class="pl-e">Typo</span>=<span class="pl-s"><span class="pl-pds">"</span>Typo.h5<span class="pl-pds">"</span></span> <span class="pl-e">Class</span>=<span class="pl-s"><span class="pl-pds">"</span>mb-4<span class="pl-pds">"</span></span>>Standard_Token</<span class="pl-ent">MudText</span>>
<<span class="pl-ent">MudTextField</span> <span class="pl-e">@bind-Value</span>=<span class="pl-s"><span class="pl-pds">"</span>ContractAddress<span class="pl-pds">"</span></span> <span class="pl-e">Label</span>=<span class="pl-s"><span class="pl-pds">"</span>Standard_Token Contract Address<span class="pl-pds">"</span></span> <span class="pl-e">Variant</span>=<span class="pl-s"><span class="pl-pds">"</span>Variant.Outlined<span class="pl-pds">"</span></span> <span class="pl-e">Class</span>=<span class="pl-s"><span class="pl-pds">"</span>mb-4<span class="pl-pds">"</span></span> />
<<span class="pl-ent">ContractDeploymentComponent</span> <span class="pl-e">TDeploymentMessage</span>=<span class="pl-s"><span class="pl-pds">"</span>StandardTokenDeployment<span class="pl-pds">"</span></span>
<span class="pl-e">HostProvider</span>=<span class="pl-s"><span class="pl-pds">"</span>selectedHostProviderService<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceType</span>=<span class="pl-s"><span class="pl-pds">"</span>typeof(StandardTokenPage)<span class="pl-pds">"</span></span>
<span class="pl-e">ContractAddressChanged</span>=<span class="pl-s"><span class="pl-pds">"</span>ContractAddressChanged<span class="pl-pds">"</span></span> />
<<span class="pl-ent">QueryFunctionComponent</span> <span class="pl-e">TFunctionMessage</span>=<span class="pl-s"><span class="pl-pds">"</span>AllowanceFunction<span class="pl-pds">"</span></span> <span class="pl-e">TFunctionOutput</span>=<span class="pl-s"><span class="pl-pds">"</span>BigInteger<span class="pl-pds">"</span></span>
<span class="pl-e">Title</span>=<span class="pl-s"><span class="pl-pds">"</span>allowance<span class="pl-pds">"</span></span>
<span class="pl-e">ContractAddress</span>=<span class="pl-s"><span class="pl-pds">"</span>@ContractAddress<span class="pl-pds">"</span></span>
<span class="pl-e">HostProvider</span>=<span class="pl-s"><span class="pl-pds">"</span>selectedHostProviderService<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceType</span>=<span class="pl-s"><span class="pl-pds">"</span>typeof(StandardTokenService)<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceMethodName</span>=<span class="pl-s"><span class="pl-pds">"</span>AllowanceQueryAsync<span class="pl-pds">"</span></span> />
<<span class="pl-ent">QueryFunctionComponent</span> <span class="pl-e">TFunctionMessage</span>=<span class="pl-s"><span class="pl-pds">"</span>AllowedFunction<span class="pl-pds">"</span></span> <span class="pl-e">TFunctionOutput</span>=<span class="pl-s"><span class="pl-pds">"</span>BigInteger<span class="pl-pds">"</span></span>
<span class="pl-e">Title</span>=<span class="pl-s"><span class="pl-pds">"</span>allowed<span class="pl-pds">"</span></span>
<span class="pl-e">ContractAddress</span>=<span class="pl-s"><span class="pl-pds">"</span>@ContractAddress<span class="pl-pds">"</span></span>
<span class="pl-e">HostProvider</span>=<span class="pl-s"><span class="pl-pds">"</span>selectedHostProviderService<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceType</span>=<span class="pl-s"><span class="pl-pds">"</span>typeof(StandardTokenService)<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceMethodName</span>=<span class="pl-s"><span class="pl-pds">"</span>AllowedQueryAsync<span class="pl-pds">"</span></span> />
<<span class="pl-ent">TransactionFunctionComponent</span> <span class="pl-e">TFunctionMessage</span>=<span class="pl-s"><span class="pl-pds">"</span>ApproveFunction<span class="pl-pds">"</span></span>
<span class="pl-e">Title</span>=<span class="pl-s"><span class="pl-pds">"</span>approve<span class="pl-pds">"</span></span>
<span class="pl-e">ContractAddress</span>=<span class="pl-s"><span class="pl-pds">"</span>@ContractAddress<span class="pl-pds">"</span></span>
<span class="pl-e">HostProvider</span>=<span class="pl-s"><span class="pl-pds">"</span>selectedHostProviderService<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceType</span>=<span class="pl-s"><span class="pl-pds">"</span>typeof(StandardTokenService)<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceRequestMethodName</span>=<span class="pl-s"><span class="pl-pds">"</span>ApproveRequestAsync<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceRequestAndWaitForReceiptMethodName</span>=<span class="pl-s"><span class="pl-pds">"</span>ApproveRequestAndWaitForReceiptAsync<span class="pl-pds">"</span></span> />
<<span class="pl-ent">QueryFunctionComponent</span> <span class="pl-e">TFunctionMessage</span>=<span class="pl-s"><span class="pl-pds">"</span>BalanceOfFunction<span class="pl-pds">"</span></span> <span class="pl-e">TFunctionOutput</span>=<span class="pl-s"><span class="pl-pds">"</span>BigInteger<span class="pl-pds">"</span></span>
<span class="pl-e">Title</span>=<span class="pl-s"><span class="pl-pds">"</span>balanceOf<span class="pl-pds">"</span></span>
<span class="pl-e">ContractAddress</span>=<span class="pl-s"><span class="pl-pds">"</span>@ContractAddress<span class="pl-pds">"</span></span>
<span class="pl-e">HostProvider</span>=<span class="pl-s"><span class="pl-pds">"</span>selectedHostProviderService<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceType</span>=<span class="pl-s"><span class="pl-pds">"</span>typeof(StandardTokenService)<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceMethodName</span>=<span class="pl-s"><span class="pl-pds">"</span>BalanceOfQueryAsync<span class="pl-pds">"</span></span> />
<<span class="pl-ent">QueryFunctionComponent</span> <span class="pl-e">TFunctionMessage</span>=<span class="pl-s"><span class="pl-pds">"</span>BalancesFunction<span class="pl-pds">"</span></span> <span class="pl-e">TFunctionOutput</span>=<span class="pl-s"><span class="pl-pds">"</span>BigInteger<span class="pl-pds">"</span></span>
<span class="pl-e">Title</span>=<span class="pl-s"><span class="pl-pds">"</span>balances<span class="pl-pds">"</span></span>
<span class="pl-e">ContractAddress</span>=<span class="pl-s"><span class="pl-pds">"</span>@ContractAddress<span class="pl-pds">"</span></span>
<span class="pl-e">HostProvider</span>=<span class="pl-s"><span class="pl-pds">"</span>selectedHostProviderService<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceType</span>=<span class="pl-s"><span class="pl-pds">"</span>typeof(StandardTokenService)<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceMethodName</span>=<span class="pl-s"><span class="pl-pds">"</span>BalancesQueryAsync<span class="pl-pds">"</span></span> />
<<span class="pl-ent">QueryFunctionComponent</span> <span class="pl-e">TFunctionMessage</span>=<span class="pl-s"><span class="pl-pds">"</span>DecimalsFunction<span class="pl-pds">"</span></span> <span class="pl-e">TFunctionOutput</span>=<span class="pl-s"><span class="pl-pds">"</span>byte<span class="pl-pds">"</span></span>
<span class="pl-e">Title</span>=<span class="pl-s"><span class="pl-pds">"</span>decimals<span class="pl-pds">"</span></span>
<span class="pl-e">ContractAddress</span>=<span class="pl-s"><span class="pl-pds">"</span>@ContractAddress<span class="pl-pds">"</span></span>
<span class="pl-e">HostProvider</span>=<span class="pl-s"><span class="pl-pds">"</span>selectedHostProviderService<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceType</span>=<span class="pl-s"><span class="pl-pds">"</span>typeof(StandardTokenService)<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceMethodName</span>=<span class="pl-s"><span class="pl-pds">"</span>DecimalsQueryAsync<span class="pl-pds">"</span></span> />
<<span class="pl-ent">QueryFunctionComponent</span> <span class="pl-e">TFunctionMessage</span>=<span class="pl-s"><span class="pl-pds">"</span>NameFunction<span class="pl-pds">"</span></span> <span class="pl-e">TFunctionOutput</span>=<span class="pl-s"><span class="pl-pds">"</span>string<span class="pl-pds">"</span></span>
<span class="pl-e">Title</span>=<span class="pl-s"><span class="pl-pds">"</span>name<span class="pl-pds">"</span></span>
<span class="pl-e">ContractAddress</span>=<span class="pl-s"><span class="pl-pds">"</span>@ContractAddress<span class="pl-pds">"</span></span>
<span class="pl-e">HostProvider</span>=<span class="pl-s"><span class="pl-pds">"</span>selectedHostProviderService<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceType</span>=<span class="pl-s"><span class="pl-pds">"</span>typeof(StandardTokenService)<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceMethodName</span>=<span class="pl-s"><span class="pl-pds">"</span>NameQueryAsync<span class="pl-pds">"</span></span> />
<<span class="pl-ent">QueryFunctionComponent</span> <span class="pl-e">TFunctionMessage</span>=<span class="pl-s"><span class="pl-pds">"</span>SymbolFunction<span class="pl-pds">"</span></span> <span class="pl-e">TFunctionOutput</span>=<span class="pl-s"><span class="pl-pds">"</span>string<span class="pl-pds">"</span></span>
<span class="pl-e">Title</span>=<span class="pl-s"><span class="pl-pds">"</span>symbol<span class="pl-pds">"</span></span>
<span class="pl-e">ContractAddress</span>=<span class="pl-s"><span class="pl-pds">"</span>@ContractAddress<span class="pl-pds">"</span></span>
<span class="pl-e">HostProvider</span>=<span class="pl-s"><span class="pl-pds">"</span>selectedHostProviderService<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceType</span>=<span class="pl-s"><span class="pl-pds">"</span>typeof(StandardTokenService)<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceMethodName</span>=<span class="pl-s"><span class="pl-pds">"</span>SymbolQueryAsync<span class="pl-pds">"</span></span> />
<<span class="pl-ent">QueryFunctionComponent</span> <span class="pl-e">TFunctionMessage</span>=<span class="pl-s"><span class="pl-pds">"</span>TotalSupplyFunction<span class="pl-pds">"</span></span> <span class="pl-e">TFunctionOutput</span>=<span class="pl-s"><span class="pl-pds">"</span>BigInteger<span class="pl-pds">"</span></span>
<span class="pl-e">Title</span>=<span class="pl-s"><span class="pl-pds">"</span>totalSupply<span class="pl-pds">"</span></span>
<span class="pl-e">ContractAddress</span>=<span class="pl-s"><span class="pl-pds">"</span>@ContractAddress<span class="pl-pds">"</span></span>
<span class="pl-e">HostProvider</span>=<span class="pl-s"><span class="pl-pds">"</span>selectedHostProviderService<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceType</span>=<span class="pl-s"><span class="pl-pds">"</span>typeof(StandardTokenService)<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceMethodName</span>=<span class="pl-s"><span class="pl-pds">"</span>TotalSupplyQueryAsync<span class="pl-pds">"</span></span> />
<<span class="pl-ent">TransactionFunctionComponent</span> <span class="pl-e">TFunctionMessage</span>=<span class="pl-s"><span class="pl-pds">"</span>TransferFunction<span class="pl-pds">"</span></span>
<span class="pl-e">Title</span>=<span class="pl-s"><span class="pl-pds">"</span>transfer<span class="pl-pds">"</span></span>
<span class="pl-e">ContractAddress</span>=<span class="pl-s"><span class="pl-pds">"</span>@ContractAddress<span class="pl-pds">"</span></span>
<span class="pl-e">HostProvider</span>=<span class="pl-s"><span class="pl-pds">"</span>selectedHostProviderService<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceType</span>=<span class="pl-s"><span class="pl-pds">"</span>typeof(StandardTokenService)<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceRequestMethodName</span>=<span class="pl-s"><span class="pl-pds">"</span>TransferRequestAsync<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceRequestAndWaitForReceiptMethodName</span>=<span class="pl-s"><span class="pl-pds">"</span>TransferRequestAndWaitForReceiptAsync<span class="pl-pds">"</span></span> />
<<span class="pl-ent">TransactionFunctionComponent</span> <span class="pl-e">TFunctionMessage</span>=<span class="pl-s"><span class="pl-pds">"</span>TransferFromFunction<span class="pl-pds">"</span></span>
<span class="pl-e">Title</span>=<span class="pl-s"><span class="pl-pds">"</span>transferFrom<span class="pl-pds">"</span></span>
<span class="pl-e">ContractAddress</span>=<span class="pl-s"><span class="pl-pds">"</span>@ContractAddress<span class="pl-pds">"</span></span>
<span class="pl-e">HostProvider</span>=<span class="pl-s"><span class="pl-pds">"</span>selectedHostProviderService<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceType</span>=<span class="pl-s"><span class="pl-pds">"</span>typeof(StandardTokenService)<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceRequestMethodName</span>=<span class="pl-s"><span class="pl-pds">"</span>TransferFromRequestAsync<span class="pl-pds">"</span></span>
<span class="pl-e">ServiceRequestAndWaitForReceiptMethodName</span>=<span class="pl-s"><span class="pl-pds">"</span>TransferFromRequestAndWaitForReceiptAsync<span class="pl-pds">"</span></span> />
</<span class="pl-ent">MudContainer</span>>
<span class="pl-k">@code</span>
<span class="pl-k">{</span>
<span class="pl-k">private</span> <span class="pl-k">string</span> <span class="pl-smi">ContractAddress</span>;
<span class="pl-k">private</span> <span class="pl-k">void</span> <span class="pl-en">ContractAddressChanged</span>(<span class="pl-k">string</span> <span class="pl-smi">address</span>)
<span class="pl-k">{</span>
<span class="pl-smi">ContractAddress</span> <span class="pl-k">=</span> <span class="pl-smi">address</span>;
<span class="pl-k">}</span>
<span class="pl-k">}</span>
</pre></div>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/ef74cf6d1dc85dcfb5540fae20fb7756760417a0/hovercard" href="https://github.com/Nethereum/Nethereum/commit/ef74cf6d1dc85dcfb5540fae20fb7756760417a0"><tt>ef74cf6</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/c7f645a9a866832c4c0ac9e1efe7e51b167f9269/hovercard" href="https://github.com/Nethereum/Nethereum/commit/c7f645a9a866832c4c0ac9e1efe7e51b167f9269"><tt>c7f645a</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/0b0d02345337b87eb1f42c69882f79660969b1b6/hovercard" href="https://github.com/Nethereum/Nethereum/commit/0b0d02345337b87eb1f42c69882f79660969b1b6"><tt>0b0d023</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/c4e8e08338f1ac466aa96ee89d2df399d8e2ff8f/hovercard" href="https://github.com/Nethereum/Nethereum/commit/c4e8e08338f1ac466aa96ee89d2df399d8e2ff8f"><tt>c4e8e08</tt></a></p>
<h2>Code Signing of Nugets and dlls</h2>
<ul>
<li>New code signing certificate of Nugets and dlls has been created to the name of ObjectSpaces LTD and verified by Microsoft. Use this to verify dlls are from the correct source. Also all unity dlls are signed the same to avoid any tampering.</li>
</ul>
<h2>General improvements fixes</h2>
<ul>
<li>712 Fix Invalid Type Encoding with complex struct.<br>
Issue: When having multiple structs all referencing the same type, the Distinct usage was not picking up all the Objects when iterating across all the inner objects (ie A-> B, A->B[] -> A->C) (B->C, B-> C[], B->D) (C->D, C-D[]) will cause duplicates. Solution.. Ensure Distinct on return.. Commit: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/730542dab3426b321ec1023c6bdf751832ea32b6/hovercard" href="https://github.com/Nethereum/Nethereum/commit/730542dab3426b321ec1023c6bdf751832ea32b6"><tt>730542d</tt></a></li>
<li>GnosisSafe updates to extend the 712 hash encoding. Commit: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/9e224f9c4137374618f25a185626b1ffd82dc1bd/hovercard" href="https://github.com/Nethereum/Nethereum/commit/9e224f9c4137374618f25a185626b1ffd82dc1bd"><tt>9e224f9</tt></a></li>
</ul>
<h2>Account Abstraction (WIP .. Updates)</h2>
<p>Continue work on AA support, RPC is available, other changes in the code.</p>
<ul>
<li>Account abstraction PackedUserOperation, UserOperation, UserOperationBuilder (packing and 712 hashing) ERC4337Domain</li>
<li>Account Abstraction Simple Account (WIP)</li>
<li>Utils to to validate if the initcode is a 7702, update the InitCode with delegateAddresss, hashing etc, EntryPoint Service enabling to InitialiseUserOperation with different estimates for gas, and handling EIP7702, SignUserOperation including checks for 7702</li>
<li>RPC Account Abstraction changes to support 0.6 and 0.7 (not just 0.7)</li>
<li>Account abstraction BaseAccount as a generic service, AccountAbstractionExecuteBuilder, helper class to create execute calls with Function Messages, both single and batch</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/207ae7059593cbd9657a1bafad01678d0d5d0282/hovercard" href="https://github.com/Nethereum/Nethereum/commit/207ae7059593cbd9657a1bafad01678d0d5d0282"><tt>207ae70</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/cbe118c398124d5dc671d923c88123248ea92bf6/hovercard" href="https://github.com/Nethereum/Nethereum/commit/cbe118c398124d5dc671d923c88123248ea92bf6"><tt>cbe118c</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/96829d51b87cc77b4a5b1cb144721839a9099b19/hovercard" href="https://github.com/Nethereum/Nethereum/commit/96829d51b87cc77b4a5b1cb144721839a9099b19"><tt>96829d5</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/27c63dbdeb5098e3914fdb77c4bd7fa088bdb5cd/hovercard" href="https://github.com/Nethereum/Nethereum/commit/27c63dbdeb5098e3914fdb77c4bd7fa088bdb5cd"><tt>27c63db</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/d6ef243de5bed46df6b7a492f61c035c5f7f189c/hovercard" href="https://github.com/Nethereum/Nethereum/commit/d6ef243de5bed46df6b7a492f61c035c5f7f189c"><tt>d6ef243</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/0c3af2ffe5ad7bb977b9b3fbe0503dde275ab332/hovercard" href="https://github.com/Nethereum/Nethereum/commit/0c3af2ffe5ad7bb977b9b3fbe0503dde275ab332"><tt>0c3af2f</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/e65660cdc5a6fd9e35fc15fb335cfc7b3ac32b5e/hovercard" href="https://github.com/Nethereum/Nethereum/commit/e65660cdc5a6fd9e35fc15fb335cfc7b3ac32b5e"><tt>e65660c</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/d96b617c6c0c512316e18a48d8edf6b8d979cbab/hovercard" href="https://github.com/Nethereum/Nethereum/commit/d96b617c6c0c512316e18a48d8edf6b8d979cbab"><tt>d96b617</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/746c6d0cbc0b059cffed6529b1aeca57a7480856/hovercard" href="https://github.com/Nethereum/Nethereum/commit/746c6d0cbc0b059cffed6529b1aeca57a7480856"><tt>746c6d0</tt></a></p>
<h2>Contributions</h2>
<ul>
<li>Allowing partial success in batch requests. by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/dlebee/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/dlebee">@dlebee</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2937306955" data-permission-text="Title is private" data-url="https://github.com/Nethereum/Nethereum/issues/1070" data-hovercard-type="pull_request" data-hovercard-url="/Nethereum/Nethereum/pull/1070/hovercard" href="https://github.com/Nethereum/Nethereum/pull/1070">#1070</a></li>
<li>fix issue in ToDER() method with latest bouncycastle by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/tmm360/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/tmm360">@tmm360</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2967862860" data-permission-text="Title is private" data-url="https://github.com/Nethereum/Nethereum/issues/1071" data-hovercard-type="pull_request" data-hovercard-url="/Nethereum/Nethereum/pull/1071/hovercard" href="https://github.com/Nethereum/Nethereum/pull/1071">#1071</a></li>
<li>debug_trace... endpoints improved by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/SolidityNinja/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/SolidityNinja">@SolidityNinja</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2914210430" data-permission-text="Title is private" data-url="https://github.com/Nethereum/Nethereum/issues/1068" data-hovercard-type="pull_request" data-hovercard-url="/Nethereum/Nethereum/pull/1068/hovercard" href="https://github.com/Nethereum/Nethereum/pull/1068">#1068</a></li>
</ul>
<h2>Unity release</h2>
<p>The Unity release can be found at <a href="https://github.com/Nethereum/Nethereum.Unity">https://github.com/Nethereum/Nethereum.Unity</a> or installed using OpenUpm <a href="https://openupm.com/packages/?sort=downloads&q=nethereum" rel="nofollow">https://openupm.com/packages/?sort=downloads&q=nethereum</a></p>
<h2>Nuget packages can be found in nuget.org <a href="https://www.nuget.org/profiles/nethereum" rel="nofollow">https://www.nuget.org/profiles/nethereum</a></h2>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/Nethereum/Nethereum/compare/4.29.0...5.0.0"><tt>4.29.0...5.0.0</tt></a></p>juanfranblancotag:github.com,2008:Repository/46746187/4.29.02025-02-10T17:23:05Z4.29.0<h2>Nethereum.Blazor</h2>
<ul>
<li>New project, to be used as the basis for integrating with Blazor.</li>
<li>EIP6963 support, enabling multi wallet browser extension support, like Metamask, Coinbase, Brave, Rabby etc <a href="https://github.com/Nethereum/Nethereum/tree/4.29.0/consoletests/BlazorExampleProject.Wasm">Example of Blazor Project</a></li>
<li>EthereumAuthenticationProvider, common class to provide authentication support, this should work if you use EIP963, Metamask standalone or Reown</li>
<li>SiweAuthenticationServerStateProvider, common class to provide further authentications support if using SIWE, so whilst a user might be connected, it can be authenticated in certain areas of the application.</li>
<li>LocalStorageAccessTokenService and LocalStorageHelper, generic helpers to manage the SIWE access tokens on generic LocalStorage.</li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/b534f8fdb880ffb8f30552c44339e0951def5e3e/hovercard" href="https://github.com/Nethereum/Nethereum/commit/b534f8fdb880ffb8f30552c44339e0951def5e3e"><tt>b534f8f</tt></a></p>
<details>
<summary>
Screenshot of Blazor application
</summary>
</details>
<p><a target="_blank" rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/562371/411669424-048bbee4-421d-4cf4-9b56-520ef0a9fa04.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzM5MjI3NDcsIm5iZiI6MTc3MzkyMjQ0NywicGF0aCI6Ii81NjIzNzEvNDExNjY5NDI0LTA0OGJiZWU0LTQyMWQtNGNmNC05YjU2LTUyMGVmMGE5ZmEwNC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMzE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDMxOVQxMjE0MDdaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1mYjE0Zjc3ODgxN2I2YTNhMjVhODhkOWIwYWRiNjhmNzYxNjM4ZDE0OWJjYzI4NTMwNWE4MDU5YWE1ZTFjZmRiJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.3DrqNiV51fkbCg_-2kHhA9eVdVn4jrjHWb-Vj13qjWk"><img src="https://private-user-images.githubusercontent.com/562371/411669424-048bbee4-421d-4cf4-9b56-520ef0a9fa04.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzM5MjI3NDcsIm5iZiI6MTc3MzkyMjQ0NywicGF0aCI6Ii81NjIzNzEvNDExNjY5NDI0LTA0OGJiZWU0LTQyMWQtNGNmNC05YjU2LTUyMGVmMGE5ZmEwNC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMzE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDMxOVQxMjE0MDdaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1mYjE0Zjc3ODgxN2I2YTNhMjVhODhkOWIwYWRiNjhmNzYxNjM4ZDE0OWJjYzI4NTMwNWE4MDU5YWE1ZTFjZmRiJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.3DrqNiV51fkbCg_-2kHhA9eVdVn4jrjHWb-Vj13qjWk" alt="image" content-type-secured-asset="image/png" style="max-width: 100%;"></a></p>
<h2>Nethereum.Unity.EIP6963</h2>
<ul>
<li>Unity support for EIP6963, including custom WeglHostProvider, Interop, etc.</li>
<li>Full example in the Unity Template <a href="https://github.com/Nethereum/Unity3dSampleTemplate/">https://github.com/Nethereum/Unity3dSampleTemplate/</a></li>
</ul>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/b534f8fdb880ffb8f30552c44339e0951def5e3e/hovercard" href="https://github.com/Nethereum/Nethereum/commit/b534f8fdb880ffb8f30552c44339e0951def5e3e"><tt>b534f8f</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Unity3dSampleTemplate/commit/a3215119bc5a0ef45665b339c121d82b0f63d7e2/hovercard" href="https://github.com/Nethereum/Unity3dSampleTemplate/commit/a3215119bc5a0ef45665b339c121d82b0f63d7e2">Nethereum/Unity3dSampleTemplate@<tt>a321511</tt></a></p>
<details>
<summary>
Screenshot of Unity application
</summary>
</details>
<p><a target="_blank" rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/562371/411669758-97c6d565-9eab-4130-909b-d84baf70c23c.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzM5MjI3NDcsIm5iZiI6MTc3MzkyMjQ0NywicGF0aCI6Ii81NjIzNzEvNDExNjY5NzU4LTk3YzZkNTY1LTllYWItNDEzMC05MDliLWQ4NGJhZjcwYzIzYy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMzE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDMxOVQxMjE0MDdaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT04N2JjOGY5YmRiZTFhZmIzZDNjYTQwZmM2ZWUxN2FkNzVlNGZkNDM5ZGE1NGFiZDZkYzUyMWMxZDk2NzkxYmU2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.G2vk3aA7_NU1eAEu7xixgHzbRoVTl_0JTkOR1B44OK0"><img src="https://private-user-images.githubusercontent.com/562371/411669758-97c6d565-9eab-4130-909b-d84baf70c23c.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzM5MjI3NDcsIm5iZiI6MTc3MzkyMjQ0NywicGF0aCI6Ii81NjIzNzEvNDExNjY5NzU4LTk3YzZkNTY1LTllYWItNDEzMC05MDliLWQ4NGJhZjcwYzIzYy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMzE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDMxOVQxMjE0MDdaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT04N2JjOGY5YmRiZTFhZmIzZDNjYTQwZmM2ZWUxN2FkNzVlNGZkNDM5ZGE1NGFiZDZkYzUyMWMxZDk2NzkxYmU2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.G2vk3aA7_NU1eAEu7xixgHzbRoVTl_0JTkOR1B44OK0" alt="image" content-type-secured-asset="image/png" style="max-width: 100%;"></a></p>
<h2>Account Abstraction RPC Bundler</h2>
<p>Rpc Service and requests to integrate with 4337 Account Abstraction</p>
<p>Commits: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/7116733e8fa81d18b20d5493cd12ddba884f29dd/hovercard" href="https://github.com/Nethereum/Nethereum/commit/7116733e8fa81d18b20d5493cd12ddba884f29dd"><tt>7116733</tt></a></p>
<h2>Other Additions</h2>
<ul>
<li>Add TryParse method to BigDecimal struct by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/AnzeS/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/AnzeS">@AnzeS</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2826772959" data-permission-text="Title is private" data-url="https://github.com/Nethereum/Nethereum/issues/1066" data-hovercard-type="pull_request" data-hovercard-url="/Nethereum/Nethereum/pull/1066/hovercard" href="https://github.com/Nethereum/Nethereum/pull/1066">#1066</a></li>
<li>Support NUGET_PACKAGES environment variable in Nethereum.Autogen.ContractApi by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/zakhard90/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/zakhard90">@zakhard90</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2840270699" data-permission-text="Title is private" data-url="https://github.com/Nethereum/Nethereum/issues/1067" data-hovercard-type="pull_request" data-hovercard-url="/Nethereum/Nethereum/pull/1067/hovercard" href="https://github.com/Nethereum/Nethereum/pull/1067">#1067</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/Nethereum/Nethereum/compare/4.28.0...4.29.0"><tt>4.28.0...4.29.0</tt></a></p>juanfranblancotag:github.com,2008:Repository/46746187/4.28.02025-01-07T17:45:43Z4.28.0<h2>Code generator (.net, typescript, vscode solidity)</h2>
<ul>
<li>Services now inherit from a base class with the core implementation, all methods are virtual, allowing to be overriden on the main class to add custom logic like validation.</li>
<li>Mud Table Service is extended to include Set and Get methods using parameters, so now Keys Values are needed.</li>
<li>Mud Table, includes accessors for both Keys and Value properties at top level, this way it can be easily accessed the data, but also in future<br>
use these properties as entities to get the data from a different storage or Api.<br>
<strong>Commits</strong>: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/1beb31c45debcfefe007ff183ab395ac9fcbd4fe/hovercard" href="https://github.com/Nethereum/Nethereum/commit/1beb31c45debcfefe007ff183ab395ac9fcbd4fe"><tt>1beb31c</tt></a></li>
</ul>
<details>
<summary>
Example of code generated file for both Mud table service and table
</summary>
<div class="highlight highlight-source-cs notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="public partial class ItemTableService : TableService<ItemTableRecord, ItemTableRecord.ItemKey, ItemTableRecord.ItemValue>
{
public ItemTableService(IWeb3 web3, string contractAddress) : base(web3, contractAddress) {}
public virtual Task<ItemTableRecord> GetTableRecordAsync(uint id, BlockParameter blockParameter = null)
{
var _key = new ItemTableRecord.ItemKey();
_key.Id = id;
return GetTableRecordAsync(_key, blockParameter);
}
public virtual Task<string> SetRecordRequestAsync(uint id, uint price, string name, string description, string owner)
{
var _key = new ItemTableRecord.ItemKey();
_key.Id = id;
var _values = new ItemTableRecord.ItemValue();
_values.Price = price;
_values.Name = name;
_values.Description = description;
_values.Owner = owner;
return SetRecordRequestAsync(_key, _values);
}
public virtual Task<TransactionReceipt> SetRecordRequestAndWaitForReceiptAsync(uint id, uint price, string name, string description, string owner)
{
var _key = new ItemTableRecord.ItemKey();
_key.Id = id;
var _values = new ItemTableRecord.ItemValue();
_values.Price = price;
_values.Name = name;
_values.Description = description;
_values.Owner = owner;
return SetRecordRequestAndWaitForReceiptAsync(_key, _values);
}
}
public partial class ItemTableRecord : TableRecord<ItemTableRecord.ItemKey, ItemTableRecord.ItemValue>
{
public ItemTableRecord() : base("MyWorld", "Item")
{
}
/// <summary>
/// Direct access to the key property 'Id'.
/// </summary>
public virtual uint Id => Keys.Id;
/// <summary>
/// Direct access to the value property 'Price'.
/// </summary>
public virtual uint Price => Values.Price;
/// <summary>
/// Direct access to the value property 'Name'.
/// </summary>
public virtual string Name => Values.Name;
/// <summary>
/// Direct access to the value property 'Description'.
/// </summary>
public virtual string Description => Values.Description;
/// <summary>
/// Direct access to the value property 'Owner'.
/// </summary>
public virtual string Owner => Values.Owner;
public partial class ItemKey
{
[Parameter("uint32", "id", 1)]
public virtual uint Id { get; set; }
}
public partial class ItemValue
{
[Parameter("uint32", "price", 1)]
public virtual uint Price { get; set; }
[Parameter("string", "name", 2)]
public virtual string Name { get; set; }
[Parameter("string", "description", 3)]
public virtual string Description { get; set; }
[Parameter("string", "owner", 4)]
public virtual string Owner { get; set; }
}
}
"><pre><span class="pl-k">public</span> <span class="pl-k">partial</span> <span class="pl-k">class</span> <span class="pl-smi">ItemTableService</span> <span class="pl-c1">:</span> <span class="pl-smi">TableService</span><span class="pl-c1"><</span><span class="pl-smi">ItemTableRecord</span><span class="pl-kos">,</span> <span class="pl-s1">ItemTableRecord</span><span class="pl-kos">.</span><span class="pl-s1">ItemKey</span><span class="pl-kos">,</span> <span class="pl-s1">ItemTableRecord</span><span class="pl-kos">.</span><span class="pl-s1">ItemValue</span><span class="pl-c1">></span>
<span class="pl-kos">{</span>
<span class="pl-k">public</span> <span class="pl-v">ItemTableService</span><span class="pl-kos">(</span><span class="pl-smi">IWeb3</span> <span class="pl-s1">web3</span><span class="pl-kos">,</span> <span class="pl-smi">string</span> <span class="pl-s1">contractAddress</span><span class="pl-kos">)</span> <span class="pl-c1">:</span> <span class="pl-k">base</span><span class="pl-kos">(</span><span class="pl-s1">web3</span><span class="pl-kos">,</span> <span class="pl-s1">contractAddress</span><span class="pl-kos">)</span> <span class="pl-kos">{</span><span class="pl-kos">}</span>
<span class="pl-k">public</span> <span class="pl-k">virtual</span> <span class="pl-smi">Task</span><span class="pl-c1"><</span><span class="pl-smi">ItemTableRecord</span><span class="pl-c1">></span> <span class="pl-en">GetTableRecordAsync</span><span class="pl-kos">(</span><span class="pl-smi">uint</span> <span class="pl-s1">id</span><span class="pl-kos">,</span> <span class="pl-smi">BlockParameter</span> <span class="pl-s1">blockParameter</span> <span class="pl-c1">=</span> <span class="pl-c1">null</span><span class="pl-kos">)</span>
<span class="pl-kos">{</span>
<span class="pl-k">var</span> <span class="pl-s1">_key</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-s1">ItemTableRecord</span><span class="pl-kos">.</span><span class="pl-s1">ItemKey</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-s1">_key</span><span class="pl-kos">.</span><span class="pl-s1">Id</span> <span class="pl-c1">=</span> <span class="pl-s1">id</span><span class="pl-kos">;</span>
<span class="pl-k">return</span> <span class="pl-s1">GetTableRecordAsync</span><span class="pl-kos">(</span><span class="pl-s1">_key</span><span class="pl-kos">,</span> <span class="pl-s1">blockParameter</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-kos">}</span>
<span class="pl-k">public</span> <span class="pl-k">virtual</span> <span class="pl-smi">Task</span><span class="pl-c1"><</span><span class="pl-smi">string</span><span class="pl-c1">></span> <span class="pl-en">SetRecordRequestAsync</span><span class="pl-kos">(</span><span class="pl-smi">uint</span> <span class="pl-s1">id</span><span class="pl-kos">,</span> <span class="pl-smi">uint</span> <span class="pl-s1">price</span><span class="pl-kos">,</span> <span class="pl-smi">string</span> <span class="pl-s1">name</span><span class="pl-kos">,</span> <span class="pl-smi">string</span> <span class="pl-s1">description</span><span class="pl-kos">,</span> <span class="pl-smi">string</span> <span class="pl-s1">owner</span><span class="pl-kos">)</span>
<span class="pl-kos">{</span>
<span class="pl-k">var</span> <span class="pl-s1">_key</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-s1">ItemTableRecord</span><span class="pl-kos">.</span><span class="pl-s1">ItemKey</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-s1">_key</span><span class="pl-kos">.</span><span class="pl-s1">Id</span> <span class="pl-c1">=</span> <span class="pl-s1">id</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">_values</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-s1">ItemTableRecord</span><span class="pl-kos">.</span><span class="pl-s1">ItemValue</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-s1">_values</span><span class="pl-kos">.</span><span class="pl-s1">Price</span> <span class="pl-c1">=</span> <span class="pl-s1">price</span><span class="pl-kos">;</span>
<span class="pl-s1">_values</span><span class="pl-kos">.</span><span class="pl-s1">Name</span> <span class="pl-c1">=</span> <span class="pl-s1">name</span><span class="pl-kos">;</span>
<span class="pl-s1">_values</span><span class="pl-kos">.</span><span class="pl-s1">Description</span> <span class="pl-c1">=</span> <span class="pl-s1">description</span><span class="pl-kos">;</span>
<span class="pl-s1">_values</span><span class="pl-kos">.</span><span class="pl-s1">Owner</span> <span class="pl-c1">=</span> <span class="pl-s1">owner</span><span class="pl-kos">;</span>
<span class="pl-k">return</span> <span class="pl-s1">SetRecordRequestAsync</span><span class="pl-kos">(</span><span class="pl-s1">_key</span><span class="pl-kos">,</span> <span class="pl-s1">_values</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-kos">}</span>
<span class="pl-k">public</span> <span class="pl-k">virtual</span> <span class="pl-smi">Task</span><span class="pl-c1"><</span><span class="pl-smi">TransactionReceipt</span><span class="pl-c1">></span> <span class="pl-en">SetRecordRequestAndWaitForReceiptAsync</span><span class="pl-kos">(</span><span class="pl-smi">uint</span> <span class="pl-s1">id</span><span class="pl-kos">,</span> <span class="pl-smi">uint</span> <span class="pl-s1">price</span><span class="pl-kos">,</span> <span class="pl-smi">string</span> <span class="pl-s1">name</span><span class="pl-kos">,</span> <span class="pl-smi">string</span> <span class="pl-s1">description</span><span class="pl-kos">,</span> <span class="pl-smi">string</span> <span class="pl-s1">owner</span><span class="pl-kos">)</span>
<span class="pl-kos">{</span>
<span class="pl-k">var</span> <span class="pl-s1">_key</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-s1">ItemTableRecord</span><span class="pl-kos">.</span><span class="pl-s1">ItemKey</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-s1">_key</span><span class="pl-kos">.</span><span class="pl-s1">Id</span> <span class="pl-c1">=</span> <span class="pl-s1">id</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">_values</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-s1">ItemTableRecord</span><span class="pl-kos">.</span><span class="pl-s1">ItemValue</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-s1">_values</span><span class="pl-kos">.</span><span class="pl-s1">Price</span> <span class="pl-c1">=</span> <span class="pl-s1">price</span><span class="pl-kos">;</span>
<span class="pl-s1">_values</span><span class="pl-kos">.</span><span class="pl-s1">Name</span> <span class="pl-c1">=</span> <span class="pl-s1">name</span><span class="pl-kos">;</span>
<span class="pl-s1">_values</span><span class="pl-kos">.</span><span class="pl-s1">Description</span> <span class="pl-c1">=</span> <span class="pl-s1">description</span><span class="pl-kos">;</span>
<span class="pl-s1">_values</span><span class="pl-kos">.</span><span class="pl-s1">Owner</span> <span class="pl-c1">=</span> <span class="pl-s1">owner</span><span class="pl-kos">;</span>
<span class="pl-k">return</span> <span class="pl-s1">SetRecordRequestAndWaitForReceiptAsync</span><span class="pl-kos">(</span><span class="pl-s1">_key</span><span class="pl-kos">,</span> <span class="pl-s1">_values</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span>
<span class="pl-k">public</span> <span class="pl-k">partial</span> <span class="pl-k">class</span> <span class="pl-smi">ItemTableRecord</span> <span class="pl-c1">:</span> <span class="pl-smi">TableRecord</span><span class="pl-c1"><</span><span class="pl-s1">ItemTableRecord</span><span class="pl-kos">.</span><span class="pl-s1">ItemKey</span><span class="pl-kos">,</span> <span class="pl-s1">ItemTableRecord</span><span class="pl-kos">.</span><span class="pl-s1">ItemValue</span><span class="pl-c1">></span>
<span class="pl-kos">{</span>
<span class="pl-k">public</span> <span class="pl-v">ItemTableRecord</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">:</span> <span class="pl-k">base</span><span class="pl-kos">(</span><span class="pl-s">"MyWorld"</span><span class="pl-kos">,</span> <span class="pl-s">"Item"</span><span class="pl-kos">)</span>
<span class="pl-kos">{</span>
<span class="pl-kos">}</span>
<span class="pl-c">/// <summary></span>
<span class="pl-c">/// Direct access to the key property 'Id'.</span>
<span class="pl-c">/// </summary></span>
<span class="pl-k">public</span> <span class="pl-k">virtual</span> <span class="pl-smi">uint</span> <span class="pl-s1">Id</span> <span class="pl-c1">=></span> <span class="pl-s1">Keys</span><span class="pl-kos">.</span><span class="pl-s1">Id</span><span class="pl-kos">;</span>
<span class="pl-c">/// <summary></span>
<span class="pl-c">/// Direct access to the value property 'Price'.</span>
<span class="pl-c">/// </summary></span>
<span class="pl-k">public</span> <span class="pl-k">virtual</span> <span class="pl-smi">uint</span> <span class="pl-s1">Price</span> <span class="pl-c1">=></span> <span class="pl-s1">Values</span><span class="pl-kos">.</span><span class="pl-s1">Price</span><span class="pl-kos">;</span>
<span class="pl-c">/// <summary></span>
<span class="pl-c">/// Direct access to the value property 'Name'.</span>
<span class="pl-c">/// </summary></span>
<span class="pl-k">public</span> <span class="pl-k">virtual</span> <span class="pl-smi">string</span> <span class="pl-s1">Name</span> <span class="pl-c1">=></span> <span class="pl-s1">Values</span><span class="pl-kos">.</span><span class="pl-s1">Name</span><span class="pl-kos">;</span>
<span class="pl-c">/// <summary></span>
<span class="pl-c">/// Direct access to the value property 'Description'.</span>
<span class="pl-c">/// </summary></span>
<span class="pl-k">public</span> <span class="pl-k">virtual</span> <span class="pl-smi">string</span> <span class="pl-s1">Description</span> <span class="pl-c1">=></span> <span class="pl-s1">Values</span><span class="pl-kos">.</span><span class="pl-s1">Description</span><span class="pl-kos">;</span>
<span class="pl-c">/// <summary></span>
<span class="pl-c">/// Direct access to the value property 'Owner'.</span>
<span class="pl-c">/// </summary></span>
<span class="pl-k">public</span> <span class="pl-k">virtual</span> <span class="pl-smi">string</span> <span class="pl-s1">Owner</span> <span class="pl-c1">=></span> <span class="pl-s1">Values</span><span class="pl-kos">.</span><span class="pl-s1">Owner</span><span class="pl-kos">;</span>
<span class="pl-k">public</span> <span class="pl-k">partial</span> <span class="pl-k">class</span> <span class="pl-smi">ItemKey</span>
<span class="pl-kos">{</span>
<span class="pl-kos">[</span><span class="pl-c1">Parameter</span><span class="pl-kos">(</span><span class="pl-s">"uint32"</span><span class="pl-kos">,</span> <span class="pl-s">"id"</span><span class="pl-kos">,</span> <span class="pl-c1">1</span><span class="pl-kos">)</span><span class="pl-kos">]</span>
<span class="pl-k">public</span> <span class="pl-k">virtual</span> <span class="pl-smi">uint</span> <span class="pl-s1">Id</span> <span class="pl-kos">{</span> <span class="pl-k">get</span><span class="pl-kos">;</span> <span class="pl-k">set</span><span class="pl-kos">;</span> <span class="pl-kos">}</span>
<span class="pl-kos">}</span>
<span class="pl-k">public</span> <span class="pl-k">partial</span> <span class="pl-k">class</span> <span class="pl-smi">ItemValue</span>
<span class="pl-kos">{</span>
<span class="pl-kos">[</span><span class="pl-c1">Parameter</span><span class="pl-kos">(</span><span class="pl-s">"uint32"</span><span class="pl-kos">,</span> <span class="pl-s">"price"</span><span class="pl-kos">,</span> <span class="pl-c1">1</span><span class="pl-kos">)</span><span class="pl-kos">]</span>
<span class="pl-k">public</span> <span class="pl-k">virtual</span> <span class="pl-smi">uint</span> <span class="pl-s1">Price</span> <span class="pl-kos">{</span> <span class="pl-k">get</span><span class="pl-kos">;</span> <span class="pl-k">set</span><span class="pl-kos">;</span> <span class="pl-kos">}</span>
<span class="pl-kos">[</span><span class="pl-c1">Parameter</span><span class="pl-kos">(</span><span class="pl-s">"string"</span><span class="pl-kos">,</span> <span class="pl-s">"name"</span><span class="pl-kos">,</span> <span class="pl-c1">2</span><span class="pl-kos">)</span><span class="pl-kos">]</span>
<span class="pl-k">public</span> <span class="pl-k">virtual</span> <span class="pl-smi">string</span> <span class="pl-s1">Name</span> <span class="pl-kos">{</span> <span class="pl-k">get</span><span class="pl-kos">;</span> <span class="pl-k">set</span><span class="pl-kos">;</span> <span class="pl-kos">}</span>
<span class="pl-kos">[</span><span class="pl-c1">Parameter</span><span class="pl-kos">(</span><span class="pl-s">"string"</span><span class="pl-kos">,</span> <span class="pl-s">"description"</span><span class="pl-kos">,</span> <span class="pl-c1">3</span><span class="pl-kos">)</span><span class="pl-kos">]</span>
<span class="pl-k">public</span> <span class="pl-k">virtual</span> <span class="pl-smi">string</span> <span class="pl-s1">Description</span> <span class="pl-kos">{</span> <span class="pl-k">get</span><span class="pl-kos">;</span> <span class="pl-k">set</span><span class="pl-kos">;</span> <span class="pl-kos">}</span>
<span class="pl-kos">[</span><span class="pl-c1">Parameter</span><span class="pl-kos">(</span><span class="pl-s">"string"</span><span class="pl-kos">,</span> <span class="pl-s">"owner"</span><span class="pl-kos">,</span> <span class="pl-c1">4</span><span class="pl-kos">)</span><span class="pl-kos">]</span>
<span class="pl-k">public</span> <span class="pl-k">virtual</span> <span class="pl-smi">string</span> <span class="pl-s1">Owner</span> <span class="pl-kos">{</span> <span class="pl-k">get</span><span class="pl-kos">;</span> <span class="pl-k">set</span><span class="pl-kos">;</span> <span class="pl-kos">}</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span></pre></div>
</details>
<h2>Code generator .NET</h2>
<p>Now supports GeneratorSets or ".nethereum-gen.multisettings" as a library and console, the same as the typescript and vscode-solidity version.</p>
<p><strong>Commit</strong>: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/a2113874599cb5d8c097e0f085b137d24d315c85/hovercard" href="https://github.com/Nethereum/Nethereum/commit/a2113874599cb5d8c097e0f085b137d24d315c85"><tt>a211387</tt></a></p>
<p>Console usage <code>Nethereum.Generator.Console generate from-config</code> defaults to ".nethereum-gen.multisettings" and current folder.<br>
See --help for more info.</p>
<details>
<summary>
Example of ".nethereum-gen.multisettings"
</summary>
<div class="highlight highlight-source-json notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="[
{
"paths": ["out/ERC20.sol/Standard_Token.json"],
"generatorConfigs": [
{
"baseNamespace": "MyProject.Contracts",
"basePath": "codeGenNodeTest/GeneratorSets/Example2/MyProject.Contracts",
"codeGenLang": 0,
"generatorType": "ContractDefinition"
},
{
"baseNamespace": "MyProject.Contracts",
"basePath": "codeGenNodeTest/GeneratorSets/Example2/MyProject.Contracts",
"codeGenLang": 0,
"generatorType": "UnityRequest"
}
]
},
{
"paths": ["out/IncrementSystem.sol/IncrementSystem.json"],
"generatorConfigs": [
{
"baseNamespace": "MyProject.Contracts.MyWorld1.Systems",
"basePath": "codeGenNodeTest/GeneratorSets/Example2/MyProject.Contracts/MyWorld1/Systems",
"codeGenLang": 0,
"generatorType": "ContractDefinition",
"mudNamespace": "myworld1"
},
{
"baseNamespace": "MyProject.Contracts.MyWorld1.Systems",
"basePath": "codeGenNodeTest/GeneratorSets/Example2/MyProject.Contracts/MyWorld1/Systems",
"codeGenLang": 0,
"generatorType": "MudExtendedService",
"mudNamespace": "myworld1"
}
]
},
{
"paths": ["mudMultipleNamespace/mud.config.ts"],
"generatorConfigs": [
{
"baseNamespace": "MyProject.Contracts.MyWorld1.Tables",
"basePath": "codeGenNodeTest/GeneratorSets/Example2/MyProject.Contracts/MyWorld1/Tables",
"generatorType": "MudTables",
"mudNamespace": "myworld1"
}
]
},
{
"paths": ["mudMultipleNamespace/mud.config.ts"],
"generatorConfigs": [
{
"baseNamespace": "MyProject.Contracts.MyWorld2.Tables",
"basePath": "codeGenNodeTest/GeneratorSets/Example2/MyProject.Contracts/MyWorld2/Tables",
"generatorType": "MudTables",
"mudNamespace": "myworld2"
}
]
}
]"><pre>[
{
<span class="pl-ent">"paths"</span>: [<span class="pl-s"><span class="pl-pds">"</span>out/ERC20.sol/Standard_Token.json<span class="pl-pds">"</span></span>],
<span class="pl-ent">"generatorConfigs"</span>: [
{
<span class="pl-ent">"baseNamespace"</span>: <span class="pl-s"><span class="pl-pds">"</span>MyProject.Contracts<span class="pl-pds">"</span></span>,
<span class="pl-ent">"basePath"</span>: <span class="pl-s"><span class="pl-pds">"</span>codeGenNodeTest/GeneratorSets/Example2/MyProject.Contracts<span class="pl-pds">"</span></span>,
<span class="pl-ent">"codeGenLang"</span>: <span class="pl-c1">0</span>,
<span class="pl-ent">"generatorType"</span>: <span class="pl-s"><span class="pl-pds">"</span>ContractDefinition<span class="pl-pds">"</span></span>
},
{
<span class="pl-ent">"baseNamespace"</span>: <span class="pl-s"><span class="pl-pds">"</span>MyProject.Contracts<span class="pl-pds">"</span></span>,
<span class="pl-ent">"basePath"</span>: <span class="pl-s"><span class="pl-pds">"</span>codeGenNodeTest/GeneratorSets/Example2/MyProject.Contracts<span class="pl-pds">"</span></span>,
<span class="pl-ent">"codeGenLang"</span>: <span class="pl-c1">0</span>,
<span class="pl-ent">"generatorType"</span>: <span class="pl-s"><span class="pl-pds">"</span>UnityRequest<span class="pl-pds">"</span></span>
}
]
},
{
<span class="pl-ent">"paths"</span>: [<span class="pl-s"><span class="pl-pds">"</span>out/IncrementSystem.sol/IncrementSystem.json<span class="pl-pds">"</span></span>],
<span class="pl-ent">"generatorConfigs"</span>: [
{
<span class="pl-ent">"baseNamespace"</span>: <span class="pl-s"><span class="pl-pds">"</span>MyProject.Contracts.MyWorld1.Systems<span class="pl-pds">"</span></span>,
<span class="pl-ent">"basePath"</span>: <span class="pl-s"><span class="pl-pds">"</span>codeGenNodeTest/GeneratorSets/Example2/MyProject.Contracts/MyWorld1/Systems<span class="pl-pds">"</span></span>,
<span class="pl-ent">"codeGenLang"</span>: <span class="pl-c1">0</span>,
<span class="pl-ent">"generatorType"</span>: <span class="pl-s"><span class="pl-pds">"</span>ContractDefinition<span class="pl-pds">"</span></span>,
<span class="pl-ent">"mudNamespace"</span>: <span class="pl-s"><span class="pl-pds">"</span>myworld1<span class="pl-pds">"</span></span>
},
{
<span class="pl-ent">"baseNamespace"</span>: <span class="pl-s"><span class="pl-pds">"</span>MyProject.Contracts.MyWorld1.Systems<span class="pl-pds">"</span></span>,
<span class="pl-ent">"basePath"</span>: <span class="pl-s"><span class="pl-pds">"</span>codeGenNodeTest/GeneratorSets/Example2/MyProject.Contracts/MyWorld1/Systems<span class="pl-pds">"</span></span>,
<span class="pl-ent">"codeGenLang"</span>: <span class="pl-c1">0</span>,
<span class="pl-ent">"generatorType"</span>: <span class="pl-s"><span class="pl-pds">"</span>MudExtendedService<span class="pl-pds">"</span></span>,
<span class="pl-ent">"mudNamespace"</span>: <span class="pl-s"><span class="pl-pds">"</span>myworld1<span class="pl-pds">"</span></span>
}
]
},
{
<span class="pl-ent">"paths"</span>: [<span class="pl-s"><span class="pl-pds">"</span>mudMultipleNamespace/mud.config.ts<span class="pl-pds">"</span></span>],
<span class="pl-ent">"generatorConfigs"</span>: [
{
<span class="pl-ent">"baseNamespace"</span>: <span class="pl-s"><span class="pl-pds">"</span>MyProject.Contracts.MyWorld1.Tables<span class="pl-pds">"</span></span>,
<span class="pl-ent">"basePath"</span>: <span class="pl-s"><span class="pl-pds">"</span>codeGenNodeTest/GeneratorSets/Example2/MyProject.Contracts/MyWorld1/Tables<span class="pl-pds">"</span></span>,
<span class="pl-ent">"generatorType"</span>: <span class="pl-s"><span class="pl-pds">"</span>MudTables<span class="pl-pds">"</span></span>,
<span class="pl-ent">"mudNamespace"</span>: <span class="pl-s"><span class="pl-pds">"</span>myworld1<span class="pl-pds">"</span></span>
}
]
},
{
<span class="pl-ent">"paths"</span>: [<span class="pl-s"><span class="pl-pds">"</span>mudMultipleNamespace/mud.config.ts<span class="pl-pds">"</span></span>],
<span class="pl-ent">"generatorConfigs"</span>: [
{
<span class="pl-ent">"baseNamespace"</span>: <span class="pl-s"><span class="pl-pds">"</span>MyProject.Contracts.MyWorld2.Tables<span class="pl-pds">"</span></span>,
<span class="pl-ent">"basePath"</span>: <span class="pl-s"><span class="pl-pds">"</span>codeGenNodeTest/GeneratorSets/Example2/MyProject.Contracts/MyWorld2/Tables<span class="pl-pds">"</span></span>,
<span class="pl-ent">"generatorType"</span>: <span class="pl-s"><span class="pl-pds">"</span>MudTables<span class="pl-pds">"</span></span>,
<span class="pl-ent">"mudNamespace"</span>: <span class="pl-s"><span class="pl-pds">"</span>myworld2<span class="pl-pds">"</span></span>
}
]
}
]</pre></div>
</details>
<h2>(Gnosis) Safe</h2>
<ul>
<li>Safe smart contract upgrade, signing and new contract handler extension.<br>
The new contract handler extension allows you to convert any smart contract service into a safe request signer using your private key (or keys).</li>
</ul>
<p><strong>Commits:</strong>: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/255b5743ab58abc802c737a5a2e7604c23e92ede/hovercard" href="https://github.com/Nethereum/Nethereum/commit/255b5743ab58abc802c737a5a2e7604c23e92ede"><tt>255b574</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/66da01728d7d188af0a805efbf067ff2275dbda2/hovercard" href="https://github.com/Nethereum/Nethereum/commit/66da01728d7d188af0a805efbf067ff2275dbda2"><tt>66da017</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/dddba5f28ee6064abc3b13f518af80624b003358/hovercard" href="https://github.com/Nethereum/Nethereum/commit/dddba5f28ee6064abc3b13f518af80624b003358"><tt>dddba5f</tt></a>,</p>
<div class="highlight highlight-source-cs notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content=" var privateKeySigner = "";
var privatekeySender = "";
var web3 = new Web3(new Nethereum.Web3.Accounts.Account(privateKey), "https://rpc.aboutcircles.com/");
var hubService = new HubService(web3, v2HubAddress);
hubService.ChangeContractHandlerToSafeExecTransaction(humanAddress1, privateKeySigner);"><pre> <span class="pl-k">var</span> <span class="pl-s1">privateKeySigner</span> <span class="pl-c1">=</span> <span class="pl-s">""</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">privatekeySender</span> <span class="pl-c1">=</span> <span class="pl-s">""</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">web3</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">Web3</span><span class="pl-kos">(</span><span class="pl-k">new</span> <span class="pl-s1">Nethereum</span><span class="pl-kos">.</span><span class="pl-s1">Web3</span><span class="pl-kos">.</span><span class="pl-s1">Accounts</span><span class="pl-kos">.</span><span class="pl-s1">Account</span><span class="pl-kos">(</span><span class="pl-s1">privateKey</span><span class="pl-kos">)</span><span class="pl-kos">,</span> <span class="pl-s">"https://rpc.aboutcircles.com/"</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">hubService</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">HubService</span><span class="pl-kos">(</span><span class="pl-s1">web3</span><span class="pl-kos">,</span> <span class="pl-s1">v2HubAddress</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-s1">hubService</span><span class="pl-kos">.</span><span class="pl-en">ChangeContractHandlerToSafeExecTransaction</span><span class="pl-kos">(</span><span class="pl-s1">humanAddress1</span><span class="pl-kos">,</span> <span class="pl-s1">privateKeySigner</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div>
<h2>Other fixes</h2>
<ul>
<li>Mud Call From and Batching removing the namespace prefixes from the generated function messages, and other general improvements <strong>Commits:</strong> <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/7019a21651c04b94c3b7ed0e577f687054483b25/hovercard" href="https://github.com/Nethereum/Nethereum/commit/7019a21651c04b94c3b7ed0e577f687054483b25"><tt>7019a21</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/0b73515ef1e5c961d502402887e90c967dcdc4f9/hovercard" href="https://github.com/Nethereum/Nethereum/commit/0b73515ef1e5c961d502402887e90c967dcdc4f9"><tt>0b73515</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/3fcd9ae95deb03b2f596efa2c3ad9353e3c41d45/hovercard" href="https://github.com/Nethereum/Nethereum/commit/3fcd9ae95deb03b2f596efa2c3ad9353e3c41d45"><tt>3fcd9ae</tt></a>, <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/69d4fa10af46695a07fb8cfb3fe1fd31fba3cd68/hovercard" href="https://github.com/Nethereum/Nethereum/commit/69d4fa10af46695a07fb8cfb3fe1fd31fba3cd68"><tt>69d4fa1</tt></a>,<br>
<a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/69345dc9261c9d6afd0238042bc48801ff1be448/hovercard" href="https://github.com/Nethereum/Nethereum/commit/69345dc9261c9d6afd0238042bc48801ff1be448"><tt>69345dc</tt></a></li>
</ul>
<h2>Unity Release</h2>
<p>The unity release can be found here, follow the instructions for installation.<br>
<a href="https://github.com/Nethereum/Nethereum.Unity/">https://github.com/Nethereum/Nethereum.Unity/</a></p>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/Nethereum/Nethereum/compare/4.27.1...4.28.0"><tt>4.27.1...4.28.0</tt></a></p>juanfranblancotag:github.com,2008:Repository/46746187/4.27.12024-12-24T12:24:19Z4.27.1<p>Patch to rollback the Bouncy Castle upgrade (Reported Issues)</p>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/Nethereum/Nethereum/compare/4.27.0...4.27.1"><tt>4.27.0...4.27.1</tt></a></p>juanfranblancotag:github.com,2008:Repository/46746187/4.27.02024-12-24T09:58:36Z4.27.0<h2>Reown Appkit Blazor support</h2>
<ul>
<li>Add Reown AppKit library and Blazor example by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Magehernan/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Magehernan">@Magehernan</a> (Many Thanks!!!) in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2684359089" data-permission-text="Title is private" data-url="https://github.com/Nethereum/Nethereum/issues/1056" data-hovercard-type="pull_request" data-hovercard-url="/Nethereum/Nethereum/pull/1056/hovercard" href="https://github.com/Nethereum/Nethereum/pull/1056">#1056</a><br>
This works the same as Metamask Blazor / Wallet Connect Blazor here is the example <a href="https://github.com/Nethereum/Nethereum/blob/master/consoletests/NethereumReownAppKitBlazor/Pages/Index.razor">https://github.com/Nethereum/Nethereum/blob/master/consoletests/NethereumReownAppKitBlazor/Pages/Index.razor</a></li>
</ul>
<h2>Updates</h2>
<ul>
<li>.Net 9 Target, removal of dotnetcore 2 and dotnetcore 3 (this should use netstandard if needed)</li>
<li>Support for Microsoft.Extensions.Logging.Abstractions in .net 9 by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/andresgutierrez/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/andresgutierrez">@andresgutierrez</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2655844393" data-permission-text="Title is private" data-url="https://github.com/Nethereum/Nethereum/issues/1054" data-hovercard-type="pull_request" data-hovercard-url="/Nethereum/Nethereum/pull/1054/hovercard" href="https://github.com/Nethereum/Nethereum/pull/1054">#1054</a></li>
<li>Use BouncyCastle.Cryptography for net6.0 and later by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/raymens/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/raymens">@raymens</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2692635727" data-permission-text="Title is private" data-url="https://github.com/Nethereum/Nethereum/issues/1057" data-hovercard-type="pull_request" data-hovercard-url="/Nethereum/Nethereum/pull/1057/hovercard" href="https://github.com/Nethereum/Nethereum/pull/1057">#1057</a></li>
</ul>
<h2>General changes / Fixes</h2>
<ul>
<li>Custom Error exceptions typed changes / handling and factories to enable casting and straight decoding</li>
<li>BigInteger explicit cast and FloorToBigInteger for BigDecimal by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/ethanrushh/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/ethanrushh">@ethanrushh</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2661033612" data-permission-text="Title is private" data-url="https://github.com/Nethereum/Nethereum/issues/1055" data-hovercard-type="pull_request" data-hovercard-url="/Nethereum/Nethereum/pull/1055/hovercard" href="https://github.com/Nethereum/Nethereum/pull/1055">#1055</a></li>
<li>Mud Normaliser Postgres dbnull fix / support</li>
</ul>
<h2>Unity release</h2>
<p>The unity release can be found here, follow the instructions for installation.<br>
<a href="https://github.com/Nethereum/Nethereum.Unity/">https://github.com/Nethereum/Nethereum.Unity/</a></p>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/Nethereum/Nethereum/compare/4.26.0...4.27.0"><tt>4.26.0...4.27.0</tt></a></p>juanfranblancotag:github.com,2008:Repository/46746187/4.26.02024-10-01T17:30:44Z4.26.0<h3><strong>Mud Postgres Normaliser</strong></h3>
<p>The Mud Postgres Normaliser is a service that processes data from the StoredRecords table, which is populated by Store event logs, and normalizes it in PostgreSQL.</p>
<p><strong>Key Features:</strong></p>
<p><strong><em>Table Creation:</em></strong><br>
For each record, the service ensures that the corresponding table based on the tableId is created. If the table doesn’t exist, it is created using schema information retrieved from the blockchain, including appropriate column types.<br>
Data Decoding and Persistence:</p>
<p>The service decodes and inserts or updates the blockchain event data into the PostgreSQL database.</p>
<p><strong><em>Singleton Tables:</em></strong><br>
Singleton tables are created with a single key of 1, simplifying their structure.</p>
<p><strong><em>Progress Tracking:</em></strong><br>
A Progress table tracks the last processed blockNumber and rowId, allowing the service to pick up from where it left off and process data in batches.</p>
<p><strong><em>Configurable Pagination:</em></strong><br>
The service supports configurable batch sizes, making it flexible for different use cases.</p>
<p><strong><em>Example</em></strong></p>
<div class="highlight highlight-source-cs notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
public class Program
{
public static async Task Main(string[] args)
{
// Set up the necessary services
var connection = new NpgsqlConnection("Host=myserver;Username=mylogin;Password=mypass;Database=mydatabase");
var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole());
var logger = loggerFactory.CreateLogger<MudPostgresNormaliserProcessingService>();
// Create the repository (assuming it's already implemented and registered)
var storeRecordsTableRepository = new MudPostgresStoreRecordsTableRepository(connection, logger);
// Create an instance of the processing service
var processingService = new MudPostgresNormaliserProcessingService(
storeRecordsTableRepository,
connection,
logger
)
{
RpcUrl = "https://localhost:8545",
Address = "0xYourContractAddress",
PageSize = 1000 // Optional: configure the number of records processed per batch
};
// Execute the normalisation process
var cancellationToken = new CancellationTokenSource().Token;
await processingService.ExecuteAsync(cancellationToken);
}
}
"><pre><span class="pl-k">public</span> <span class="pl-k">class</span> <span class="pl-smi">Program</span>
<span class="pl-kos">{</span>
<span class="pl-k">public</span> <span class="pl-k"><span class="pl-k">static</span></span> <span class="pl-k">async</span> <span class="pl-s1">Task</span> <span class="pl-en">Main</span><span class="pl-kos">(</span><span class="pl-smi">string</span><span class="pl-kos">[</span><span class="pl-kos">]</span> <span class="pl-s1">args</span><span class="pl-kos">)</span>
<span class="pl-kos">{</span>
<span class="pl-c">// Set up the necessary services</span>
<span class="pl-k">var</span> <span class="pl-s1">connection</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">NpgsqlConnection</span><span class="pl-kos">(</span><span class="pl-s">"Host=myserver;Username=mylogin;Password=mypass;Database=mydatabase"</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">loggerFactory</span> <span class="pl-c1">=</span> <span class="pl-s1">LoggerFactory</span><span class="pl-kos">.</span><span class="pl-en">Create</span><span class="pl-kos">(</span>builder <span class="pl-c1">=></span> <span class="pl-s1">builder</span><span class="pl-kos">.</span><span class="pl-en">AddConsole</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">logger</span> <span class="pl-c1">=</span> <span class="pl-s1">loggerFactory</span><span class="pl-kos">.</span><span class="pl-smi">CreateLogger</span><span class="pl-c1"><</span><span class="pl-smi">MudPostgresNormaliserProcessingService</span><span class="pl-c1">></span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-c">// Create the repository (assuming it's already implemented and registered)</span>
<span class="pl-k">var</span> <span class="pl-s1">storeRecordsTableRepository</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">MudPostgresStoreRecordsTableRepository</span><span class="pl-kos">(</span><span class="pl-s1">connection</span><span class="pl-kos">,</span> <span class="pl-s1">logger</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-c">// Create an instance of the processing service</span>
<span class="pl-k">var</span> <span class="pl-s1">processingService</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">MudPostgresNormaliserProcessingService</span><span class="pl-kos">(</span>
<span class="pl-s1">storeRecordsTableRepository</span><span class="pl-kos">,</span>
<span class="pl-s1">connection</span><span class="pl-kos">,</span>
<span class="pl-s1">logger</span>
<span class="pl-kos">)</span>
<span class="pl-kos">{</span>
<span class="pl-s1">RpcUrl</span> <span class="pl-c1">=</span> <span class="pl-s">"https://localhost:8545"</span><span class="pl-kos">,</span>
<span class="pl-s1">Address</span> <span class="pl-c1">=</span> <span class="pl-s">"0xYourContractAddress"</span><span class="pl-kos">,</span>
<span class="pl-s1">PageSize</span> <span class="pl-c1">=</span> <span class="pl-c1">1000</span> <span class="pl-c">// Optional: configure the number of records processed per batch</span>
<span class="pl-kos">}</span><span class="pl-kos">;</span>
<span class="pl-c">// Execute the normalisation process</span>
<span class="pl-k">var</span> <span class="pl-s1">cancellationToken</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">CancellationTokenSource</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-s1">Token</span><span class="pl-kos">;</span>
<span class="pl-k">await</span> <span class="pl-s1">processingService</span><span class="pl-kos">.</span><span class="pl-en">ExecuteAsync</span><span class="pl-kos">(</span><span class="pl-s1">cancellationToken</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span></pre></div>
<p><strong>Commits:</strong> <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/99f16f7b1c86dd32c6da089524d88469ac7891d2/hovercard" href="https://github.com/Nethereum/Nethereum/commit/99f16f7b1c86dd32c6da089524d88469ac7891d2"><tt>99f16f7</tt></a></p>
<h3><strong>Mud General</strong></h3>
<ul>
<li>EF Stored records can be retrieved all by BlockNumber and RowId <strong>Commits</strong> <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/6e2ae82346cf8ca1333ef5ec6510d386733bb899/hovercard" href="https://github.com/Nethereum/Nethereum/commit/6e2ae82346cf8ca1333ef5ec6510d386733bb899"><tt>6e2ae82</tt></a></li>
<li>Stored records Key is now a combination of all the keys padded to 32 bytes (for byte or hex storage), this allows to decode the key without knowing the schema before hand. <strong>Commits</strong> <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/f8602913a48cb88dc1dc2b32f01bc12b8bcd4326/hovercard" href="https://github.com/Nethereum/Nethereum/commit/f8602913a48cb88dc1dc2b32f01bc12b8bcd4326"><tt>f860291</tt></a></li>
<li>TableSchema Generic table schema object that can be built from TableTableRecord (by retrieving the schema from the chain <strong>Commit</strong> <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/5b0ab1ca6e06074a26da611a3d52b64fb72781e3/hovercard" href="https://github.com/Nethereum/Nethereum/commit/5b0ab1ca6e06074a26da611a3d52b64fb72781e3"><tt>5b0ab1c</tt></a></li>
<li>Value Decoder defaults to default values for remaining schema fields when there are no more bytes to decode. <strong>Commit</strong> <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/5b0ab1ca6e06074a26da611a3d52b64fb72781e3/hovercard" href="https://github.com/Nethereum/Nethereum/commit/5b0ab1ca6e06074a26da611a3d52b64fb72781e3"><tt>5b0ab1c</tt></a></li>
<li></li>
</ul>
<h3><strong>Blockchain Log Processor</strong></h3>
<ul>
<li>Adding extra logging on the Log Processor to track progress of each internal block range processed. <strong>Commit</strong> <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/a5eb2ea6c410065640cbc54db64d231429acfe4d/hovercard" href="https://github.com/Nethereum/Nethereum/commit/a5eb2ea6c410065640cbc54db64d231429acfe4d"><tt>a5eb2ea</tt></a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/Nethereum/Nethereum/compare/4.25.0...4.26.0"><tt>4.25.0...4.26.0</tt></a></p>
<p>Unity release in openupm.com <a href="https://github.com/Nethereum/Nethereum.Unity">https://github.com/Nethereum/Nethereum.Unity</a></p>juanfranblancotag:github.com,2008:Repository/46746187/4.25.02024-10-01T16:39:18Z4.25.0<h2>4.25.0</h2>
<h3><strong>IRestHttpHelper / RestHttpHelper and UnityTaskRestHttpHelper</strong></h3>
<p>This release introduces a <strong>IRestHttpHelper interface</strong> and a simple implementation of a REST API client for use across both .NET and Unity Nethereum projects. Key features include:</p>
<ul>
<li><strong>Cross-Platform Support</strong>: The utility works in both .NET and Unity, ensuring flexibility across different platforms.</li>
<li><strong>Dynamic JSON Deserialization</strong>:
<ul>
<li>Utilizes <strong>System.Text.Json (STJ)</strong> for .NET 8 and newer versions.</li>
<li>Falls back to <strong>Newtonsoft.Json</strong> for Unity and older .NET versions.</li>
</ul>
</li>
<li><strong>New Dependency</strong>: A new project, <strong>Nethereum.Util.Rest</strong>, has been added to handle REST client operations for DataServices and Contracts</li>
</ul>
<p><strong>Commits</strong> <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/0b4d51bd717338f62c08bed354e3e107e3719c70/hovercard" href="https://github.com/Nethereum/Nethereum/commit/0b4d51bd717338f62c08bed354e3e107e3719c70"><tt>0b4d51b</tt></a></p>
<h3>Upgrade of Nethereum.DataServices and Nethereum.Contracts</h3>
<p>Nethereum.DataServices and Nethereum.Contracts are upgraded to use the new RestHttpHelper by default or any other implementation that implements the interface.</p>
<p>Fixes to Etherscan are also included.<br>
<strong>Commits</strong> <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/aeaa4462dde33215d3d632678050ff834936655b/hovercard" href="https://github.com/Nethereum/Nethereum/commit/aeaa4462dde33215d3d632678050ff834936655b"><tt>aeaa446</tt></a></p>
<h3><strong>TablePredicateBuilder</strong></h3>
<p>The <code>TablePredicateBuilder</code> introduces a <strong>fluent API</strong> to build predicates for querying <code>Mud</code> storage tables that have been synchronized to an external repository (such as a PostgreSQL database). It allows developers to construct complex queries with minimal effort using chainable methods.</p>
<h4><strong>Key Features</strong>:</h4>
<ul>
<li>
<p><strong>Fluent API for Predicate Construction</strong>:</p>
<ul>
<li>Easily create complex queries using chainable <code>.AndEqual()</code>, <code>.OrEqual()</code>, <code>.AndNotEqual()</code>, and other methods.</li>
<li>Supports flexible predicate building that can target specific table fields or conditions.</li>
</ul>
</li>
<li>
<p><strong>Reusable across Storage Types</strong>:</p>
<ul>
<li>Predicates are built on a custom set of objects, enabling them to be reused for different storage backends (e.g., PostgreSQL, SQLite).</li>
</ul>
</li>
<li>
<p><strong>REST API Integration</strong>:</p>
<ul>
<li>Predicates can be serialized into JSON for making REST API calls. The server can then deserialize the predicate and query the internal database storage using the same predicate structure.</li>
</ul>
</li>
</ul>
<h4><strong>Example Usage</strong>:</h4>
<div class="highlight highlight-source-cs notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="var predicateBuilder = new TablePredicateBuilder<ItemTableRecord, ItemTableRecord.ItemKey, ItemTableRecord.ItemValue>("0xABC123");
var predicate = predicateBuilder
.AndEqual(x => x.Id, 1) // AND key0 = '0x1'
.AndEqual(x => x.Id, 2) // AND key0 = '0x2'
.OrEqual(x => x.Id, 3) // OR key0 = '0x3'
.AndNotEqual(x => x.Id, 4) // AND key0 != '0x4'
.Expand(); // Finalize the predicate"><pre><span class="pl-k">var</span> <span class="pl-s1">predicateBuilder</span> <span class="pl-c1">=</span> <span class="pl-k">new</span> <span class="pl-smi">TablePredicateBuilder</span><span class="pl-c1"><</span><span class="pl-smi">ItemTableRecord</span><span class="pl-kos">,</span> <span class="pl-s1">ItemTableRecord</span><span class="pl-kos">.</span><span class="pl-s1">ItemKey</span><span class="pl-kos">,</span> <span class="pl-s1">ItemTableRecord</span><span class="pl-kos">.</span><span class="pl-s1">ItemValue</span><span class="pl-c1">></span><span class="pl-kos">(</span><span class="pl-s">"0xABC123"</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">var</span> <span class="pl-s1">predicate</span> <span class="pl-c1">=</span> <span class="pl-s1">predicateBuilder</span>
<span class="pl-kos">.</span><span class="pl-en">AndEqual</span><span class="pl-kos">(</span>x <span class="pl-c1">=></span> <span class="pl-s1">x</span><span class="pl-kos">.</span><span class="pl-s1">Id</span><span class="pl-kos">,</span> <span class="pl-c1">1</span><span class="pl-kos">)</span> <span class="pl-c">// AND key0 = '0x1'</span>
<span class="pl-kos">.</span><span class="pl-en">AndEqual</span><span class="pl-kos">(</span>x <span class="pl-c1">=></span> <span class="pl-s1">x</span><span class="pl-kos">.</span><span class="pl-s1">Id</span><span class="pl-kos">,</span> <span class="pl-c1">2</span><span class="pl-kos">)</span> <span class="pl-c">// AND key0 = '0x2'</span>
<span class="pl-kos">.</span><span class="pl-en">OrEqual</span><span class="pl-kos">(</span>x <span class="pl-c1">=></span> <span class="pl-s1">x</span><span class="pl-kos">.</span><span class="pl-s1">Id</span><span class="pl-kos">,</span> <span class="pl-c1">3</span><span class="pl-kos">)</span> <span class="pl-c">// OR key0 = '0x3'</span>
<span class="pl-kos">.</span><span class="pl-en">AndNotEqual</span><span class="pl-kos">(</span>x <span class="pl-c1">=></span> <span class="pl-s1">x</span><span class="pl-kos">.</span><span class="pl-s1">Id</span><span class="pl-kos">,</span> <span class="pl-c1">4</span><span class="pl-kos">)</span> <span class="pl-c">// AND key0 != '0x4'</span>
<span class="pl-kos">.</span><span class="pl-en">Expand</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// Finalize the predicate</span></pre></div>
<p>The <code>TablePredicateBuilder</code> simplifies querying complex storage structures and provides flexibility for different storage systems, allowing predicates to be reused and transported as needed for various scenarios such as querying a database or sending queries via REST APIs.</p>
<p><strong>Commits</strong> <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/ad9ac4c96b271747449fb5d3170f31715eb28af0/hovercard" href="https://github.com/Nethereum/Nethereum/commit/ad9ac4c96b271747449fb5d3170f31715eb28af0"><tt>ad9ac4c</tt></a> <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/4ddb6d4e475862f40bd24f8c124a3a01f6c9e27f/hovercard" href="https://github.com/Nethereum/Nethereum/commit/4ddb6d4e475862f40bd24f8c124a3a01f6c9e27f"><tt>4ddb6d4</tt></a> <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/af16f6b19b0dcb0a3fb205f2acbf744ab6f8c652/hovercard" href="https://github.com/Nethereum/Nethereum/commit/af16f6b19b0dcb0a3fb205f2acbf744ab6f8c652"><tt>af16f6b</tt></a></p>
<h3><strong>Mud.Repositories.EntityFramework</strong></h3>
<p>The <strong>Mud.Repositories.EntityFramework</strong> project offers a foundational framework to integrate with a Mud repository using <strong>Entity Framework</strong> (EF). It includes various utilities and features to support efficient querying and storage of blockchain data.</p>
<h4><strong>Key Features</strong>:</h4>
<ul>
<li>
<p><strong>Custom Predicate Builder</strong>:</p>
<ul>
<li>Provides a predicate builder that creates SQL queries using key hex values. The queries are compiled into a <code>SqlPredicateResult</code>, which includes the SQL statement and arguments to safely prevent SQL injection.</li>
</ul>
</li>
<li>
<p><strong>MudEFTableRepository</strong>:</p>
<ul>
<li>A MudTableRepository using keys as hex and EF supporting any context that implements IMudStoreRecordsDbSets, which includes the StoreRecords and BlockProgress entities.</li>
</ul>
</li>
<li>
<p><strong>BlockProgressRepository</strong>:</p>
<ul>
<li>Custom implementation of the BlockProgresRepository for EF Mud</li>
</ul>
</li>
</ul>
<p><strong>Commits</strong> <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/dc4be4cfaf5da3c5fb3f13e312fdf559326a1e64/hovercard" href="https://github.com/Nethereum/Nethereum/commit/dc4be4cfaf5da3c5fb3f13e312fdf559326a1e64"><tt>dc4be4c</tt></a></p>
<h3><strong>Mud Repository Postgres</strong></h3>
<p>Provides an extended <strong>Entity Framework (EF) repository implementation</strong> for PostgreSQL.<br>
Key features include:</p>
<ul>
<li><strong>Log Processing Service</strong>: Synchronizes and processes blockchain logs into a PostgreSQL database.</li>
<li><strong>Custom DbContext and TableRepository</strong>: A custom <code>DbContext</code> and <code>TableRepository</code> are included to manage all fields stored as <code>bytea</code> (PostgreSQL binary format).</li>
<li><strong>PredicateBuilder</strong>: Enables dynamic querying by constructing predicates that can be used to efficiently filter data within the repository.</li>
</ul>
<p><strong>Commits:</strong> <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/13edbfa59e21a13e2addc5e0372904acc1ff36a2/hovercard" href="https://github.com/Nethereum/Nethereum/commit/13edbfa59e21a13e2addc5e0372904acc1ff36a2"><tt>13edbfa</tt></a></p>
<h3>NethereumMudLogProcessing, NethereumMudStoredRecordsRestApi, and NethereumMudStoreRestApiClient Examples</h3>
<p>Source:<br>
<a href="https://github.com/Nethereum/Nethereum/tree/master/consoletests/NethereumMudLogProcessing">https://github.com/Nethereum/Nethereum/tree/master/consoletests/NethereumMudLogProcessing</a><br>
<a href="https://github.com/Nethereum/Nethereum/tree/master/consoletests/NethereumMudStoreRestApiClient">https://github.com/Nethereum/Nethereum/tree/master/consoletests/NethereumMudStoreRestApiClient</a><br>
<a href="https://github.com/Nethereum/Nethereum/tree/master/consoletests/NethereumMudStoredRecordsRestApi">https://github.com/Nethereum/Nethereum/tree/master/consoletests/NethereumMudStoredRecordsRestApi</a></p>
<p>End-to-end examples for processing and querying data from blockchain store records using a PostgreSQL database. The solution includes:</p>
<p>Log Processing: Blockchain store records are processed and stored in a PostgreSQL database using the LogProcessor. The solution leverages Entity Framework (EF) migrations for database schema management.</p>
<p>REST API Integration: A flexible REST API is provided to query the stored records. The API receives requests containing predicates (in JSON format), which are converted into queries for PostgreSQL using the table repository.</p>
<p>Data Transformation: The queried results are transformed into Data Transfer Objects (DTOs) and further converted into table format, which is then outputted to the console.</p>
<p><strong>Commits</strong>: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/73fbd591174ac17e16c6cb37c925df5525ba5cef/hovercard" href="https://github.com/Nethereum/Nethereum/commit/73fbd591174ac17e16c6cb37c925df5525ba5cef"><tt>73fbd59</tt></a></p>
<h2>Extra fetures:</h2>
<ul>
<li>Mud Log processing creation of Log processor: <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/Nethereum/Nethereum/commit/13edbfa59e21a13e2addc5e0372904acc1ff36a2/hovercard" href="https://github.com/Nethereum/Nethereum/commit/13edbfa59e21a13e2addc5e0372904acc1ff36a2"><tt>13edbfa</tt></a></li>
</ul>
<h2>Fixes</h2>
<ul>
<li>712 ToJson - Prefix bytes for 1271 AA Type Messages by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/0xFirekeeper/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/0xFirekeeper">@0xFirekeeper</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2443837587" data-permission-text="Title is private" data-url="https://github.com/Nethereum/Nethereum/issues/1041" data-hovercard-type="pull_request" data-hovercard-url="/Nethereum/Nethereum/pull/1041/hovercard" href="https://github.com/Nethereum/Nethereum/pull/1041">#1041</a></li>
<li>Exceptions when validating v indicate that TransactionChainId should be used by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/psavva/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/psavva">@psavva</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="2474764845" data-permission-text="Title is private" data-url="https://github.com/Nethereum/Nethereum/issues/1043" data-hovercard-type="pull_request" data-hovercard-url="/Nethereum/Nethereum/pull/1043/hovercard" href="https://github.com/Nethereum/Nethereum/pull/1043">#1043</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/Nethereum/Nethereum/compare/4.21.4...4.25.0"><tt>4.21.4...4.25.0</tt></a></p>juanfranblanco