public void GetGasLimit(bool minimum2MlnGasPerBlockWhenUsingBlockGasLimit, long blockNumber, long?expected)
        {
            IBlockGasLimitContract blockGasLimitContract1 = Substitute.For <IBlockGasLimitContract>();

            blockGasLimitContract1.ActivationBlock.Returns(3);
            blockGasLimitContract1.Activation.Returns(3);
            blockGasLimitContract1.BlockGasLimit(Arg.Any <BlockHeader>()).Returns(1000u);
            IBlockGasLimitContract blockGasLimitContract2 = Substitute.For <IBlockGasLimitContract>();

            blockGasLimitContract2.ActivationBlock.Returns(5);
            blockGasLimitContract2.Activation.Returns(5);
            blockGasLimitContract2.BlockGasLimit(Arg.Any <BlockHeader>()).Returns(3000000u);
            IBlockGasLimitContract blockGasLimitContract3 = Substitute.For <IBlockGasLimitContract>();

            blockGasLimitContract3.ActivationBlock.Returns(10);
            blockGasLimitContract3.Activation.Returns(10);
            blockGasLimitContract3.BlockGasLimit(Arg.Any <BlockHeader>()).Throws(new AbiException(string.Empty));

            MiningConfig config = new() { TargetBlockGasLimit = 4000000 };
            AuRaContractGasLimitOverride gasLimitOverride = new(
                new List <IBlockGasLimitContract> {
                blockGasLimitContract1, blockGasLimitContract2, blockGasLimitContract3
            },
                new AuRaContractGasLimitOverride.Cache(),
                minimum2MlnGasPerBlockWhenUsingBlockGasLimit,
                new TargetAdjustedGasLimitCalculator(MainnetSpecProvider.Instance, config),
                LimboLogs.Instance);

            BlockHeader header = Build.A.BlockHeader.WithGasLimit(3999999).WithNumber(blockNumber - 1).TestObject;

            gasLimitOverride.GetGasLimit(header).Should().Be(expected);
        }
    }
 private UInt256?GetContractGasLimit(BlockHeader parent, IBlockGasLimitContract contract)
 {
     try
     {
         var contractGasLimit = contract.BlockGasLimit(parent);
         return(contractGasLimit.HasValue && _minimum2MlnGasPerBlockWhenUsingBlockGasLimitContract && contractGasLimit < MinimalContractGasLimit
             ? MinimalContractGasLimit
             : contractGasLimit);
     }
     catch (AuRaException e)
     {
         if (_logger.IsError)
         {
             _logger.Error("Contract call failed. Not changing the block gas limit.", e);
         }
         return(null);
     }
 }
 private UInt256?GetContractGasLimit(BlockHeader parent, IBlockGasLimitContract contract)
 {
     try
     {
         var contractGasLimit = contract.BlockGasLimit(parent);
         return(contractGasLimit.HasValue && _minimum2MlnGasPerBlockWhenUsingBlockGasLimitContract && contractGasLimit < MinimalContractGasLimit
             ? MinimalContractGasLimit
             : contractGasLimit);
     }
     catch (AbiException e)
     {
         if (_logger.IsError)
         {
             _logger.Error($"Contract call failed. Not changing the block gas limit on block {parent.ToString(BlockHeader.Format.FullHashAndNumber)} {new StackTrace()}.", e);
         }
         return(null);
     }
 }