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); } }