Exemplo n.º 1
0
        public static SearchResult <BlockHeader> SearchForHeader(this IBlockFinder blockFinder, BlockParameter blockParameter, bool allowNulls = false)
        {
            if (blockFinder.Head == null)
            {
                return(new SearchResult <BlockHeader>("Incorrect head block", ErrorCodes.InternalError));
            }

            blockParameter ??= BlockParameter.Latest;

            BlockHeader header;

            if (blockParameter.RequireCanonical)
            {
                header = blockFinder.FindHeader(blockParameter.BlockHash, BlockTreeLookupOptions.RequireCanonical);
                if (header == null && !allowNulls)
                {
                    header = blockFinder.FindHeader(blockParameter.BlockHash);
                    if (header != null)
                    {
                        return(new SearchResult <BlockHeader>($"{blockParameter.BlockHash} block is not canonical", ErrorCodes.InvalidInput));
                    }
                }
            }
            else
            {
                header = blockFinder.FindHeader(blockParameter);
            }

            return(header == null && !allowNulls
                ? new SearchResult <BlockHeader>($"{blockParameter.BlockHash?.ToString() ?? blockParameter.BlockNumber?.ToString() ?? blockParameter.Type.ToString()} could not be found", ErrorCodes.ResourceNotFound)
                : new SearchResult <BlockHeader>(header));
        }
Exemplo n.º 2
0
 public ParityModule(IEcdsa ecdsa, ITxPool txPool, IBlockFinder blockFinder, IReceiptFinder receiptFinder, ILogManager logManager)
 {
     _ecdsa         = ecdsa ?? throw new ArgumentNullException(nameof(ecdsa));
     _txPool        = txPool ?? throw new ArgumentNullException(nameof(txPool));
     _blockFinder   = blockFinder ?? throw new ArgumentNullException(nameof(blockFinder));
     _receiptFinder = receiptFinder ?? throw new ArgumentNullException(nameof(receiptFinder));
 }
Exemplo n.º 3
0
        public static BlockHeader FindParentHeader(this IBlockFinder finder, BlockHeader header, BlockTreeLookupOptions options)
        {
            if (header.MaybeParent == null)
            {
                BlockHeader parent = finder.FindHeader(header.ParentHash, options);
                header.MaybeParent = new WeakReference <BlockHeader>(parent);
                return(parent);
            }

            header.MaybeParent.TryGetTarget(out BlockHeader maybeParent);
            if (maybeParent == null)
            {
                BlockHeader parent = finder.FindHeader(header.ParentHash, options);
                header.MaybeParent.SetTarget(parent);
                return(parent);
            }

            if (maybeParent.TotalDifficulty == null && (options & BlockTreeLookupOptions.TotalDifficultyNotNeeded) == 0)
            {
                BlockHeader fromDb = finder.FindHeader(header.ParentHash, options);
                maybeParent.TotalDifficulty = fromDb.TotalDifficulty;
            }

            return(maybeParent);
        }
Exemplo n.º 4
0
        public static SearchResult <Block> SearchForBlock(this IBlockFinder blockFinder, BlockParameter blockParameter, bool allowNulls = false)
        {
            Block block;

            if (blockParameter.RequireCanonical)
            {
                block = blockFinder.FindBlock(blockParameter.BlockHash, BlockTreeLookupOptions.RequireCanonical);
                if (block == null && !allowNulls)
                {
                    var header = blockFinder.FindHeader(blockParameter.BlockHash);
                    if (header != null)
                    {
                        return(new SearchResult <Block>($"{blockParameter.BlockHash} block is not canonical", ErrorCodes.InvalidInput));
                    }
                }
            }
            else
            {
                block = blockFinder.FindBlock(blockParameter);
            }

            return(block == null && !allowNulls
                ? new SearchResult <Block>($"{blockParameter.BlockHash?.ToString() ?? blockParameter.BlockNumber?.ToString() ?? blockParameter.Type.ToString()} could not be found", ErrorCodes.ResourceNotFound)
                : new SearchResult <Block>(block));
        }
Exemplo n.º 5
0
        public void CheckHealth_returns_expected_results([ValueSource(nameof(CheckHealthTestCases))] CheckHealthTest test)
        {
            IBlockFinder         blockFinder         = Substitute.For <IBlockFinder>();
            ISyncServer          syncServer          = Substitute.For <ISyncServer>();
            IBlockchainProcessor blockchainProcessor = Substitute.For <IBlockchainProcessor>();
            IBlockProducer       blockProducer       = Substitute.For <IBlockProducer>();
            IHealthHintService   healthHintService   = Substitute.For <IHealthHintService>();

            blockchainProcessor.IsProcessingBlocks(Arg.Any <ulong?>()).Returns(test.IsProcessingBlocks);
            blockProducer.IsProducingBlocks(Arg.Any <ulong?>()).Returns(test.IsProducingBlocks);
            syncServer.GetPeerCount().Returns(test.PeerCount);

            BlockHeaderBuilder GetBlockHeader(int blockNumber) => Build.A.BlockHeader.WithNumber(blockNumber);

            blockFinder.Head.Returns(new Block(GetBlockHeader(4).TestObject));
            if (test.IsSyncing)
            {
                blockFinder.FindBestSuggestedHeader().Returns(GetBlockHeader(15).TestObject);
            }
            else
            {
                blockFinder.FindBestSuggestedHeader().Returns(GetBlockHeader(2).TestObject);
            }

            IEthSyncingInfo   ethSyncingInfo    = new EthSyncingInfo(blockFinder);
            NodeHealthService nodeHealthService =
                new(syncServer, blockFinder, blockchainProcessor, blockProducer, new HealthChecksConfig(), healthHintService, ethSyncingInfo, test.IsMining);
            CheckHealthResult result = nodeHealthService.CheckHealth();

            Assert.AreEqual(test.ExpectedHealthy, result.Healthy);
            Assert.AreEqual(test.ExpectedMessage, FormatMessages(result.Messages.Select(x => x.Message)));
            Assert.AreEqual(test.ExpectedLongMessage, FormatMessages(result.Messages.Select(x => x.LongMessage)));
        }
Exemplo n.º 6
0
 public TraceModule(IReceiptFinder receiptFinder, ITracer tracer, IBlockFinder blockFinder, CancellationToken cancellationToken = default(CancellationToken))
 {
     _cancellationToken = cancellationToken;
     _receiptFinder     = receiptFinder ?? throw new ArgumentNullException(nameof(receiptFinder));
     _tracer            = tracer ?? throw new ArgumentNullException(nameof(tracer));
     _blockFinder       = blockFinder ?? throw new ArgumentNullException(nameof(blockFinder));
 }
Exemplo n.º 7
0
    public void Setup()
    {
        IBlockFinder      blockFinder       = Substitute.For <IBlockFinder>();
        BlockCacheService blockCacheService = new();

        _tracker = new(NoPoS.Instance, blockFinder, blockCacheService, new TestLogManager());
    }
Exemplo n.º 8
0
 public BlockchainBridge(
     IStateReader stateReader,
     IStateProvider stateProvider,
     IStorageProvider storageProvider,
     IBlockTree blockTree,
     ITxPool txPool,
     IReceiptStorage receiptStorage,
     IFilterStore filterStore,
     IFilterManager filterManager,
     IWallet wallet,
     ITransactionProcessor transactionProcessor,
     IEthereumEcdsa ecdsa)
 {
     _stateReader          = stateReader ?? throw new ArgumentNullException(nameof(stateReader));
     _stateProvider        = stateProvider ?? throw new ArgumentNullException(nameof(stateProvider));
     _storageProvider      = storageProvider ?? throw new ArgumentNullException(nameof(storageProvider));
     _blockTree            = blockTree ?? throw new ArgumentNullException(nameof(blockTree));
     _txPool               = txPool ?? throw new ArgumentNullException(nameof(_txPool));
     _receiptStorage       = receiptStorage ?? throw new ArgumentNullException(nameof(receiptStorage));
     _filterStore          = filterStore ?? throw new ArgumentException(nameof(filterStore));
     _filterManager        = filterManager ?? throw new ArgumentException(nameof(filterManager));
     _wallet               = wallet ?? throw new ArgumentException(nameof(wallet));
     _transactionProcessor = transactionProcessor ?? throw new ArgumentException(nameof(transactionProcessor));
     _ecdsa       = ecdsa ?? throw new ArgumentNullException(nameof(ecdsa));
     _blockFinder = new BlockFinder(_blockTree);
     _logFinder   = new LogFinder(_blockFinder, _receiptStorage);
 }
Exemplo n.º 9
0
 public EthRpcModule(
     IJsonRpcConfig rpcConfig,
     IBlockchainBridge blockchainBridge,
     IBlockFinder blockFinder,
     IStateReader stateReader,
     ITxPool txPool,
     ITxSender txSender,
     IWallet wallet,
     IReceiptFinder receiptFinder,
     ILogManager logManager,
     ISpecProvider specProvider,
     IGasPriceOracle gasPriceOracle,
     IEthSyncingInfo ethSyncingInfo,
     IFeeHistoryOracle feeHistoryOracle)
 {
     _logger           = logManager.GetClassLogger();
     _rpcConfig        = rpcConfig ?? throw new ArgumentNullException(nameof(rpcConfig));
     _blockchainBridge = blockchainBridge ?? throw new ArgumentNullException(nameof(blockchainBridge));
     _blockFinder      = blockFinder ?? throw new ArgumentNullException(nameof(blockFinder));
     _stateReader      = stateReader ?? throw new ArgumentNullException(nameof(stateReader));
     _txPoolBridge     = txPool ?? throw new ArgumentNullException(nameof(txPool));
     _txSender         = txSender ?? throw new ArgumentNullException(nameof(txSender));
     _wallet           = wallet ?? throw new ArgumentNullException(nameof(wallet));
     _receiptFinder    = receiptFinder ?? throw new ArgumentNullException(nameof(receiptFinder));;
     _specProvider     = specProvider ?? throw new ArgumentNullException(nameof(specProvider));
     _gasPriceOracle   = gasPriceOracle ?? throw new ArgumentNullException(nameof(gasPriceOracle));
     _ethSyncingInfo   = ethSyncingInfo ?? throw new ArgumentNullException(nameof(ethSyncingInfo));
     _feeHistoryOracle = feeHistoryOracle ?? throw new ArgumentNullException(nameof(feeHistoryOracle));
 }
Exemplo n.º 10
0
 public ParityModule(IEcdsa ecdsa, ITxPool txPool, IBlockTree blockTree, IReceiptStorage receiptStorage, ILogManager logManager)
 {
     _ecdsa          = ecdsa ?? throw new ArgumentNullException(nameof(ecdsa));
     _txPool         = txPool ?? throw new ArgumentNullException(nameof(txPool));
     _blockFinder    = new BlockFinder(blockTree ?? throw new ArgumentNullException(nameof(blockTree)));
     _receiptStorage = receiptStorage ?? throw new ArgumentNullException(nameof(receiptStorage));
 }
Exemplo n.º 11
0
        public BaselineModule(
            ITxSender txSender,
            IStateReader stateReader,
            ILogFinder logFinder,
            IBlockFinder blockFinder,
            IAbiEncoder abiEncoder,
            IFileSystem fileSystem,
            IDb baselineDb,
            IDb metadataBaselineDb,
            ILogManager logManager,
            IBlockProcessor blockProcessor,
            DisposableStack disposableStack)
        {
            _abiEncoder         = abiEncoder ?? throw new ArgumentNullException(nameof(abiEncoder));
            _fileSystem         = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem));
            _baselineDb         = baselineDb ?? throw new ArgumentNullException(nameof(baselineDb));
            _metadataBaselineDb = metadataBaselineDb ?? throw new ArgumentNullException(nameof(metadataBaselineDb));
            _logger             = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
            _txSender           = txSender ?? throw new ArgumentNullException(nameof(txSender));
            _stateReader        = stateReader ?? throw new ArgumentNullException(nameof(stateReader));
            _logFinder          = logFinder ?? throw new ArgumentNullException(nameof(logFinder));
            _blockFinder        = blockFinder ?? throw new ArgumentNullException(nameof(blockFinder));
            _blockProcessor     = blockProcessor ?? throw new ArgumentNullException(nameof(blockProcessor));
            _baselineTreeHelper = new BaselineTreeHelper(_logFinder, baselineDb, metadataBaselineDb, _logger);
            _disposableStack    = disposableStack ?? throw new ArgumentNullException(nameof(disposableStack));

            _metadata = LoadMetadata();
            InitTrees();
        }
        public void Can_ask_for_block_signer_when_hash_is_null()
        {
            ISnapshotManager snapshotManager = Substitute.For <ISnapshotManager>();
            IBlockFinder     blockFinder     = Substitute.For <IBlockFinder>();
            CliqueRpcModule  rpcModule       = new(Substitute.For <ICliqueBlockProducer>(), snapshotManager, blockFinder);

            rpcModule.clique_getBlockSigner(null).Result.ResultType.Should().Be(ResultType.Failure);
        }
Exemplo n.º 13
0
 public TraceModule(IReceiptFinder receiptFinder, ITracer tracer, IBlockFinder blockFinder, IJsonRpcConfig jsonRpcConfig)
 {
     _receiptFinder            = receiptFinder ?? throw new ArgumentNullException(nameof(receiptFinder));
     _tracer                   = tracer ?? throw new ArgumentNullException(nameof(tracer));
     _blockFinder              = blockFinder ?? throw new ArgumentNullException(nameof(blockFinder));
     _jsonRpcConfig            = jsonRpcConfig ?? throw new ArgumentNullException(nameof(jsonRpcConfig));
     _cancellationTokenTimeout = TimeSpan.FromMilliseconds(_jsonRpcConfig.TracerTimeout);
 }
Exemplo n.º 14
0
 public LogFinder(IBlockFinder blockFinder, IReceiptStorage receiptStorage, IBloomStorage bloomStorage, IReceiptsRecovery receiptsRecovery, int maxBlockDepth = 1000)
 {
     _blockFinder      = blockFinder ?? throw new ArgumentNullException(nameof(blockFinder));
     _receiptStorage   = receiptStorage ?? throw new ArgumentNullException(nameof(receiptStorage));
     _bloomStorage     = bloomStorage ?? throw new ArgumentNullException(nameof(bloomStorage));
     _receiptsRecovery = receiptsRecovery ?? throw new ArgumentNullException(nameof(receiptsRecovery));
     _maxBlockDepth    = maxBlockDepth;
 }
Exemplo n.º 15
0
        public void Setup()
        {
            _block = Build.A.Block
                     .WithUncles(Build.A.BlockHeader.TestObject, Build.A.BlockHeader.TestObject).TestObject;

            _blockFinder       = Substitute.For <IBlockTree>();
            _witnessRepository = new WitnessCollector(new MemDb(), LimboLogs.Instance);
            _witnessRpcModule  = new WitnessRpcModule(_witnessRepository, _blockFinder);
        }
Exemplo n.º 16
0
        /// <summary>
        /// This class should smoothly react to new blocks and logs
        /// For now it will be very non-optimized just to deliver the basic functionality
        /// </summary>
        /// <param name="address"></param>
        /// <param name="baselineTree"></param>
        /// <param name="logFinder"></param>
        /// <param name="blockFinder"></param>
        public BaselineTreeTracker(Address address, BaselineTree baselineTree, ILogFinder logFinder, IBlockFinder blockFinder)
        {
            _address      = address ?? throw new ArgumentNullException(nameof(address));
            _baselineTree = baselineTree ?? throw new ArgumentNullException(nameof(baselineTree));
            _logFinder    = logFinder ?? throw new ArgumentNullException(nameof(logFinder));
            _blockFinder  = blockFinder ?? throw new ArgumentNullException(nameof(blockFinder));

            _timer = InitTimer();
        }
Exemplo n.º 17
0
 public LogFinder(IBlockFinder blockFinder, IReceiptFinder receiptFinder, IBloomStorage bloomStorage, ILogManager logManager, IReceiptsRecovery receiptsRecovery, int maxBlockDepth = 1000)
 {
     _blockFinder      = blockFinder ?? throw new ArgumentNullException(nameof(blockFinder));
     _receiptFinder    = receiptFinder ?? throw new ArgumentNullException(nameof(receiptFinder));
     _bloomStorage     = bloomStorage ?? throw new ArgumentNullException(nameof(bloomStorage));
     _receiptsRecovery = receiptsRecovery ?? throw new ArgumentNullException(nameof(receiptsRecovery));;
     _logger           = logManager?.GetClassLogger <LogFinder>() ?? throw new ArgumentNullException(nameof(logManager));
     _maxBlockDepth    = maxBlockDepth;
 }
Exemplo n.º 18
0
        public void Setup()
        {
            _blockchainBridge = Substitute.For <IBlockchainBridge>();
            _txPool           = Substitute.For <ITxPool>();
            _blockFinder      = Substitute.For <IBlockFinder>();
            _stateReader      = Substitute.For <IStateReader>();
            _txSender         = Substitute.For <ITxSender>();

            _ndmBridge = new NdmBlockchainBridge(_blockchainBridge, _blockFinder, _stateReader, _txSender);
        }
        public void Can_ask_for_block_signer_when_block_is_unknown()
        {
            ISnapshotManager snapshotManager = Substitute.For <ISnapshotManager>();
            IBlockFinder     blockFinder     = Substitute.For <IBlockFinder>();

            blockFinder.FindHeader(Arg.Any <Keccak>()).Returns((BlockHeader)null);
            CliqueRpcModule rpcModule = new(Substitute.For <ICliqueBlockProducer>(), snapshotManager, blockFinder);

            rpcModule.clique_getBlockSigner(Keccak.Zero).Result.ResultType.Should().Be(ResultType.Failure);
        }
Exemplo n.º 20
0
        public static Block?FindParent(this IBlockFinder finder, BlockHeader blockHeader, BlockTreeLookupOptions options)
        {
            if (blockHeader.ParentHash is null)
            {
                throw new InvalidOperationException(
                          $"Cannot find parent when parent hash is null on block with hash {blockHeader.Hash}.");
            }

            return(finder.FindBlock(blockHeader.ParentHash, options));
        }
Exemplo n.º 21
0
 public NdmBlockchainBridge(
     IBlockchainBridge blockchainBridge,
     IBlockFinder blockTree,
     IStateReader stateReader,
     ITxSender txSender)
 {
     _blockchainBridge = blockchainBridge ?? throw new ArgumentNullException(nameof(blockchainBridge));
     _txSender         = txSender ?? throw new ArgumentNullException(nameof(txSender));
     _blockTree        = blockTree ?? throw new ArgumentNullException(nameof(blockTree));
     _stateReader      = stateReader ?? throw new ArgumentNullException(nameof(stateReader));
 }
Exemplo n.º 22
0
        public void GasPriceEstimate_IfPreviousGasPriceDoesNotExist_ShouldBeEmptyPrice(ulong?gasPrice)
        {
            IBlockFinder   blockFinder        = Substitute.For <IBlockFinder>();
            ISpecProvider  specProvider       = Substitute.For <ISpecProvider>();
            GasPriceOracle testGasPriceOracle = new(blockFinder, specProvider, gasPrice);

            UInt256 estimate         = testGasPriceOracle.GetGasPriceEstimate();
            UInt256 expectedGasPrice = 110 * (gasPrice ?? 1.GWei()) / 100;

            estimate.Should().BeEquivalentTo(expectedGasPrice);
        }
Exemplo n.º 23
0
        public void IsSyncing_ReturnsExpectedResult(long bestHeader, long currentHead, bool expectedResult)
        {
            IBlockFinder blockFinder = Substitute.For <IBlockFinder>();

            blockFinder.FindBestSuggestedHeader().Returns(Build.A.BlockHeader.WithNumber(bestHeader).TestObject);
            blockFinder.Head.Returns(Build.A.Block.WithHeader(Build.A.BlockHeader.WithNumber(currentHead).TestObject).TestObject);
            EthSyncingInfo ethSyncingInfo = new(blockFinder);
            SyncingResult  syncingResult  = ethSyncingInfo.GetFullInfo();

            Assert.AreEqual(expectedResult, syncingResult.IsSyncing);
        }
Exemplo n.º 24
0
 public void Setup()
 {
     _logManager          = LimboLogs.Instance;
     _specProvider        = RopstenSpecProvider.Instance;
     _ethereumEcdsa       = new EthereumEcdsa(_specProvider.ChainId, _logManager);
     _noTxStorage         = NullTxStorage.Instance;
     _inMemoryTxStorage   = new InMemoryTxStorage();
     _persistentTxStorage = new PersistentTxStorage(new MemDb());
     _stateProvider       = new StateProvider(new TrieStore(new MemDb(), _logManager), new MemDb(), _logManager);
     _blockFinder         = Substitute.For <IBlockFinder>();
     _blockFinder.FindBestSuggestedHeader().Returns(Build.A.BlockHeader.WithNumber(10000000).TestObject);
 }
        public void GetFeeHistory_IfRewardPercentilesContainInvalidNumber_ResultsInFailure(double[] rewardPercentiles)
        {
            int          blockCount  = 10;
            IBlockFinder blockFinder = Substitute.For <IBlockFinder>();

            blockFinder.FindBlock(BlockParameter.Latest).Returns(Build.A.Block.TestObject);
            FeeHistoryOracle feeHistoryOracle = GetSubstitutedFeeHistoryOracle(blockFinder: blockFinder);

            ResultWrapper <FeeHistoryResults> resultWrapper = feeHistoryOracle.GetFeeHistory(blockCount, BlockParameter.Latest, rewardPercentiles);

            resultWrapper.Result.Error.Should().Be("rewardPercentiles: Some values are below 0 or greater than 100.");
            resultWrapper.Result.ResultType.Should().Be(ResultType.Failure);
        }
        public void Can_ask_for_block_signer()
        {
            ISnapshotManager snapshotManager = Substitute.For <ISnapshotManager>();
            IBlockFinder     blockFinder     = Substitute.For <IBlockFinder>();
            BlockHeader      header          = Build.A.BlockHeader.TestObject;

            blockFinder.FindHeader(Arg.Any <Keccak>()).Returns(header);
            snapshotManager.GetBlockSealer(header).Returns(TestItem.AddressA);
            CliqueRpcModule rpcModule = new(Substitute.For <ICliqueBlockProducer>(), snapshotManager, blockFinder);

            rpcModule.clique_getBlockSigner(Keccak.Zero).Result.ResultType.Should().Be(ResultType.Success);
            rpcModule.clique_getBlockSigner(Keccak.Zero).Data.Should().Be(TestItem.AddressA);
        }
Exemplo n.º 27
0
 public ProofModule(
     ITracer tracer,
     IBlockFinder blockFinder,
     IReceiptFinder receiptFinder,
     ISpecProvider specProvider,
     ILogManager logManager)
 {
     _tracer        = tracer ?? throw new ArgumentNullException(nameof(tracer));
     _blockFinder   = blockFinder ?? throw new ArgumentNullException(nameof(blockFinder));
     _receiptFinder = receiptFinder ?? throw new ArgumentNullException(nameof(receiptFinder));
     _specProvider  = specProvider ?? throw new ArgumentNullException(nameof(specProvider));
     _logger        = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
 }
Exemplo n.º 28
0
        public void GasPriceEstimate_IfPreviousGasPriceExists_ShouldEqualLastGasPrice(int lastGasPrice)
        {
            IBlockFinder   blockFinder        = Substitute.For <IBlockFinder>();
            ISpecProvider  specProvider       = Substitute.For <ISpecProvider>();
            GasPriceOracle testGasPriceOracle = new(blockFinder, specProvider)
            {
                _gasPriceEstimation = new(null, (UInt256)lastGasPrice)
            };

            UInt256 estimate = testGasPriceOracle.GetGasPriceEstimate();

            estimate.Should().BeEquivalentTo((UInt256?)lastGasPrice);
        }
Exemplo n.º 29
0
        public void GetGasPricesFromRecentBlocks_IfBlockHasMoreThanThreeValidTxs_OnlyAddTxsWithLowestGasPrices()
        {
            Block        testBlock   = Build.A.Block.WithTransactions(GetFiveTransactionsWithDifferentGasPrices()).TestObject;
            IBlockFinder blockFinder = Substitute.For <IBlockFinder>();

            blockFinder.FindBlock(0).Returns(testBlock);
            GasPriceOracle testGasPriceOracle = new(blockFinder, Substitute.For <ISpecProvider>());
            List <UInt256> expected           = new() { 2, 3, 4 };

            IEnumerable <UInt256> results = testGasPriceOracle.GetSortedGasPricesFromRecentBlocks(0);

            results.Should().BeEquivalentTo(expected);
        }
Exemplo n.º 30
0
        public void GasPriceEstimate_NoChangeInHeadBlock_ReturnsPreviousGasPrice()
        {
            IBlockFinder   blockFinder        = Substitute.For <IBlockFinder>();
            ISpecProvider  specProvider       = Substitute.For <ISpecProvider>();
            Block          testHeadBlock      = Build.A.Block.Genesis.TestObject;
            GasPriceOracle testGasPriceOracle = new(blockFinder, specProvider)
            {
                _gasPriceEstimation = new(testHeadBlock.Hash, 7)
            };

            UInt256 result = testGasPriceOracle.GetGasPriceEstimate();

            result.Should().Be((UInt256)7);
        }