Fix GasEstimateGasPremium when there is only one message on chain

Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
This commit is contained in:
Jakub Sztandera 2020-08-31 18:12:06 +02:00
parent 606a58bc6b
commit 56235aee90
No known key found for this signature in database
GPG Key ID: 9A9AF56F8B3879BA

View File

@ -109,27 +109,22 @@ func (a *GasAPI) GasEstimateGasPremium(ctx context.Context, nblocksincl uint64,
return prices[i].price.GreaterThan(prices[j].price) return prices[i].price.GreaterThan(prices[j].price)
}) })
// todo: account for how full blocks are
at := build.BlockGasTarget * int64(blocks) / 2 at := build.BlockGasTarget * int64(blocks) / 2
prev := big.Zero() prev1, prev2 := big.Zero(), big.Zero()
premium := big.Zero()
for _, price := range prices { for _, price := range prices {
prev1, prev2 = price.price, prev1
at -= price.limit at -= price.limit
if at > 0 { if at > 0 {
prev = price.price
continue continue
} }
if prev.Equals(big.Zero()) {
return types.BigAdd(price.price, big.NewInt(1)), nil
}
premium = types.BigAdd(big.Div(types.BigAdd(price.price, prev), types.NewInt(2)), big.NewInt(1))
} }
if types.BigCmp(premium, big.Zero()) == 0 { premium := prev1
if types.BigCmp(prev2, big.Zero()) != 0 {
premium = big.Div(types.BigAdd(prev1, prev2), types.NewInt(2))
}
if types.BigCmp(premium, types.NewInt(MinGasPremium)) < 0 {
switch nblocksincl { switch nblocksincl {
case 1: case 1:
premium = types.NewInt(2 * MinGasPremium) premium = types.NewInt(2 * MinGasPremium)
@ -144,7 +139,7 @@ func (a *GasAPI) GasEstimateGasPremium(ctx context.Context, nblocksincl uint64,
const precision = 32 const precision = 32
// mean 1, stddev 0.005 => 95% within +-1% // mean 1, stddev 0.005 => 95% within +-1%
noise := 1 + rand.NormFloat64()*0.005 noise := 1 + rand.NormFloat64()*0.005
premium = types.BigMul(premium, types.NewInt(uint64(noise*(1<<precision)))) premium = types.BigMul(premium, types.NewInt(uint64(noise*(1<<precision))+1))
premium = types.BigDiv(premium, types.NewInt(1<<precision)) premium = types.BigDiv(premium, types.NewInt(1<<precision))
return premium, nil return premium, nil
} }