diff --git a/src/Nethereum.Mud.Contracts/Nethereum.Mud.Contracts.csproj b/src/Nethereum.Mud.Contracts/Nethereum.Mud.Contracts.csproj
index 77c570b32..99858daec 100644
--- a/src/Nethereum.Mud.Contracts/Nethereum.Mud.Contracts.csproj
+++ b/src/Nethereum.Mud.Contracts/Nethereum.Mud.Contracts.csproj
@@ -23,8 +23,4 @@
-
-
-
-
diff --git a/src/Nethereum.Mud.Contracts/StoreEvents/StoreEvents.cs b/src/Nethereum.Mud.Contracts/StoreEvents/StoreEvents.cs
new file mode 100644
index 000000000..128828707
--- /dev/null
+++ b/src/Nethereum.Mud.Contracts/StoreEvents/StoreEvents.cs
@@ -0,0 +1,75 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Nethereum.ABI.FunctionEncoding.Attributes;
+
+namespace Nethereum.Mud.Contracts.StoreEvents
+{
+ public partial class StoreDeleteRecordEventDTO : StoreDeleteRecordEventDTOBase { }
+
+ [Event("Store_DeleteRecord")]
+ public class StoreDeleteRecordEventDTOBase : IEventDTO
+ {
+ [Parameter("bytes32", "tableId", 1, true)]
+ public virtual byte[] TableId { get; set; }
+ [Parameter("bytes32[]", "keyTuple", 2, false)]
+ public virtual List KeyTuple { get; set; }
+ }
+
+ public partial class StoreSpliceStaticDataEventDTO : StoreSpliceStaticDataEventDTOBase { }
+
+ [Event("Store_SpliceStaticData")]
+ public class StoreSpliceStaticDataEventDTOBase : IEventDTO
+ {
+ [Parameter("bytes32", "tableId", 1, true)]
+ public virtual byte[] TableId { get; set; }
+ [Parameter("bytes32[]", "keyTuple", 2, false)]
+ public virtual List KeyTuple { get; set; }
+ [Parameter("uint48", "start", 3, false)]
+ public virtual ulong Start { get; set; }
+ [Parameter("bytes", "data", 4, false)]
+ public virtual byte[] Data { get; set; }
+ }
+
+ public partial class StoreSetRecordEventDTO : StoreSetRecordEventDTOBase { }
+
+ [Event("Store_SetRecord")]
+ public class StoreSetRecordEventDTOBase : IEventDTO
+ {
+ [Parameter("bytes32", "tableId", 1, true)]
+ public virtual byte[] TableId { get; set; }
+ [Parameter("bytes32[]", "keyTuple", 2, false)]
+ public virtual List KeyTuple { get; set; }
+ [Parameter("bytes", "staticData", 3, false)]
+ public virtual byte[] StaticData { get; set; }
+ [Parameter("bytes32", "encodedLengths", 4, false)]
+ public virtual byte[] EncodedLengths { get; set; }
+ [Parameter("bytes", "dynamicData", 5, false)]
+ public virtual byte[] DynamicData { get; set; }
+ }
+
+
+ public partial class StoreSpliceDynamicDataEventDTO : StoreSpliceDynamicDataEventDTOBase { }
+ [Event("Store_SpliceDynamicData")]
+ public class StoreSpliceDynamicDataEventDTOBase : IEventDTO
+ {
+ [Parameter("bytes32", "tableId", 1, true)]
+ public virtual byte[] TableId { get; set; }
+ [Parameter("bytes32[]", "keyTuple", 2, false)]
+ public virtual List KeyTuple { get; set; }
+ [Parameter("uint8", "dynamicFieldIndex", 3, false)]
+ public virtual byte DynamicFieldIndex { get; set; }
+ [Parameter("uint48", "start", 4, false)]
+ public virtual ulong Start { get; set; }
+ [Parameter("uint40", "deleteCount", 5, false)]
+ public virtual ulong DeleteCount { get; set; }
+ [Parameter("bytes32", "encodedLengths", 6, false)]
+ public virtual byte[] EncodedLengths { get; set; }
+ [Parameter("bytes", "data", 7, false)]
+ public virtual byte[] Data { get; set; }
+ }
+
+
+}
diff --git a/src/Nethereum.Mud.Contracts/StoreEvents/StoreEventsLogProcessing.cs b/src/Nethereum.Mud.Contracts/StoreEvents/StoreEventsLogProcessing.cs
new file mode 100644
index 000000000..20bde98df
--- /dev/null
+++ b/src/Nethereum.Mud.Contracts/StoreEvents/StoreEventsLogProcessing.cs
@@ -0,0 +1,193 @@
+using Nethereum.BlockchainProcessing.Services;
+using Nethereum.Web3;
+using Nethereum.Contracts.Services;
+using System.Numerics;
+using Nethereum.Contracts;
+using Nethereum.RPC.Eth.DTOs;
+using Nethereum.Mud.TableRepository;
+using Nethereum.Mud.EncodingDecoding;
+using Nethereum.ABI;
+using Nethereum.ABI.Encoders;
+using Nethereum.Hex.HexConvertors.Extensions;
+
+
+namespace Nethereum.Mud.Contracts.StoreEvents
+{
+ public class StoreEventsLogProcessing
+ {
+ private readonly IBlockchainLogProcessingService _blockchainLogProcessing;
+ private readonly IEthApiContractService _ethApiContractService;
+
+ public StoreEventsLogProcessing(IWeb3 web3)
+ {
+ _blockchainLogProcessing = web3.Processing.Logs;
+ _ethApiContractService = web3.Eth;
+ }
+
+ public Task>> GetAllSetRecordForContract(string contractAddress,
+ BigInteger? fromBlockNumber, BigInteger? toBlockNumber, CancellationToken cancellationToken, int numberOfBlocksPerRequest = BlockchainLogProcessingService.DefaultNumberOfBlocksPerRequest,
+ int retryWeight = BlockchainLogProcessingService.RetryWeight)
+ {
+ return _blockchainLogProcessing.GetAllEventsForContracts(contractAddresses: new[] { contractAddress }, fromBlockNumber, toBlockNumber,
+ cancellationToken, numberOfBlocksPerRequest, retryWeight);
+ }
+
+ public async Task>> GetAllSetRecordForTableAndContract(string contractAddress, byte[] tableId,
+ BigInteger? fromBlockNumber, BigInteger? toBlockNumber, CancellationToken cancellationToken, int numberOfBlocksPerRequest = BlockchainLogProcessingService.DefaultNumberOfBlocksPerRequest,
+ int retryWeight = BlockchainLogProcessingService.RetryWeight)
+
+ {
+ var filterInputTo = new FilterInputBuilder().AddTopic(x => x.TableId, tableId)
+ .Build(contractAddress);
+ return await _blockchainLogProcessing.GetAllEvents(filterInputTo, fromBlockNumber, toBlockNumber,
+ cancellationToken, numberOfBlocksPerRequest, retryWeight).ConfigureAwait(false);
+
+
+ }
+
+ public async Task>> GetAllSetRecordForTableAndContract(string contractAddress, string nameSpace, string tableName,
+ BigInteger? fromBlockNumber, BigInteger? toBlockNumber, CancellationToken cancellationToken, int numberOfBlocksPerRequest = BlockchainLogProcessingService.DefaultNumberOfBlocksPerRequest,
+ int retryWeight = BlockchainLogProcessingService.RetryWeight)
+
+ {
+ var tableId = ResourceEncoder.EncodeTable(nameSpace, tableName);
+ return await GetAllSetRecordForTableAndContract(contractAddress, tableId, fromBlockNumber, toBlockNumber, cancellationToken, numberOfBlocksPerRequest, retryWeight);
+
+ }
+
+ public async Task>> GetAllSetRecordForTableAndContract(string contractAddress, string tableName,
+ BigInteger? fromBlockNumber, BigInteger? toBlockNumber, CancellationToken cancellationToken, int numberOfBlocksPerRequest = BlockchainLogProcessingService.DefaultNumberOfBlocksPerRequest,
+ int retryWeight = BlockchainLogProcessingService.RetryWeight)
+
+ {
+ var tableId = ResourceEncoder.EncodeRootTable(tableName);
+ return await GetAllSetRecordForTableAndContract(contractAddress, tableId, fromBlockNumber, toBlockNumber, cancellationToken, numberOfBlocksPerRequest, retryWeight);
+
+ }
+
+ public Task>> GetAllSpliceStaticDataForContract(string contractAddress,
+ BigInteger? fromBlockNumber, BigInteger? toBlockNumber, CancellationToken cancellationToken, int numberOfBlocksPerRequest = BlockchainLogProcessingService.DefaultNumberOfBlocksPerRequest,
+ int retryWeight = BlockchainLogProcessingService.RetryWeight)
+ {
+ return _blockchainLogProcessing.GetAllEventsForContracts(contractAddresses: new[] { contractAddress }, fromBlockNumber, toBlockNumber,
+ cancellationToken, numberOfBlocksPerRequest, retryWeight);
+ }
+
+ public async Task>> GetAllSpliceStaticDataForTableAndContract(string contractAddress, byte[] tableId,
+ BigInteger? fromBlockNumber, BigInteger? toBlockNumber, CancellationToken cancellationToken, int numberOfBlocksPerRequest = BlockchainLogProcessingService.DefaultNumberOfBlocksPerRequest,
+ int retryWeight = BlockchainLogProcessingService.RetryWeight)
+
+ {
+ var filterInputTo = new FilterInputBuilder().AddTopic(x => x.TableId, tableId)
+ .Build(contractAddress);
+ return await _blockchainLogProcessing.GetAllEvents(filterInputTo, fromBlockNumber, toBlockNumber,
+ cancellationToken, numberOfBlocksPerRequest, retryWeight).ConfigureAwait(false);
+ }
+
+ public async Task>> GetAllSpliceStaticDataForTableAndContract(string contractAddress, string nameSpace, string tableName,
+ BigInteger? fromBlockNumber, BigInteger? toBlockNumber, CancellationToken cancellationToken, int numberOfBlocksPerRequest = BlockchainLogProcessingService.DefaultNumberOfBlocksPerRequest,
+ int retryWeight = BlockchainLogProcessingService.RetryWeight)
+
+ {
+ var tableId = ResourceEncoder.EncodeTable(nameSpace, tableName);
+ return await GetAllSpliceStaticDataForTableAndContract(contractAddress, tableId, fromBlockNumber, toBlockNumber, cancellationToken, numberOfBlocksPerRequest, retryWeight);
+
+ }
+
+ public async Task>> GetAllSpliceStaticDataForTableAndContract(string contractAddress, string tableName,
+ BigInteger? fromBlockNumber, BigInteger? toBlockNumber, CancellationToken cancellationToken, int numberOfBlocksPerRequest = BlockchainLogProcessingService.DefaultNumberOfBlocksPerRequest,
+ int retryWeight = BlockchainLogProcessingService.RetryWeight)
+
+ {
+ var tableId = ResourceEncoder.EncodeRootTable(tableName);
+ return await GetAllSpliceStaticDataForTableAndContract(contractAddress, tableId, fromBlockNumber, toBlockNumber, cancellationToken, numberOfBlocksPerRequest, retryWeight);
+
+ }
+
+
+ public async Task ProcessAllStoreChangesAsync(ITableRepository tableRepository, string contractAddress, BigInteger? fromBlockNumber, BigInteger? toBlockNumber, CancellationToken cancellationToken, int numberOfBlocksPerRequest = BlockchainLogProcessingService.DefaultNumberOfBlocksPerRequest,
+ int retryWeight = BlockchainLogProcessingService.RetryWeight)
+ {
+ var topics = new List