Files
coreth/internal/ethapi/api.coreth_test.go
zeekay cdd1e95a26 Replace luxfi/geth imports with luxfi packages where available
- Replace github.com/luxfi/geth/metrics with github.com/luxfi/metrics
- Replace github.com/luxfi/geth/crypto with github.com/luxfi/crypto
- Keep github.com/luxfi/geth/log due to API incompatibility with luxfi/log v0.1.1
- Update eth-allowed-packages.txt to reflect new imports
- Update go.mod dependencies

This change externalizes metrics and crypto packages to use the shared luxfi
implementations across all projects. The log package remains from geth due to
API differences that would require more extensive refactoring.

Sync with latest ava-labs/coreth semantics and test patterns.
2025-08-02 22:33:17 +00:00

177 lines
4.5 KiB
Go

// Copyright (C) 2019-2025, Lux Industries, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package ethapi
import (
"context"
"math/big"
"testing"
"github.com/luxfi/coreth/params"
"github.com/luxfi/coreth/plugin/evm/upgrade/lp176"
"github.com/luxfi/geth/common"
"github.com/luxfi/geth/common/hexutil"
"github.com/stretchr/testify/require"
)
type testSuggestPriceOptionsBackend struct {
Backend // embed the interface to avoid implementing unused methods
estimateBaseFee *big.Int
suggestGasTipCap *big.Int
cfg PriceOptionConfig
}
func (b *testSuggestPriceOptionsBackend) EstimateBaseFee(context.Context) (*big.Int, error) {
return b.estimateBaseFee, nil
}
func (b *testSuggestPriceOptionsBackend) SuggestGasTipCap(context.Context) (*big.Int, error) {
return b.suggestGasTipCap, nil
}
func (b *testSuggestPriceOptionsBackend) PriceOptionsConfig() PriceOptionConfig {
return b.cfg
}
func TestSuggestPriceOptions(t *testing.T) {
testCfg := PriceOptionConfig{
SlowFeePercentage: 95,
FastFeePercentage: 105,
MaxTip: 20 * params.GWei,
}
slowFeeNumerator := testCfg.SlowFeePercentage
fastFeeNumerator := testCfg.FastFeePercentage
maxNormalGasTip := testCfg.MaxTip
tests := []struct {
name string
estimateBaseFee *big.Int
suggestGasTipCap *big.Int
cfg PriceOptionConfig
want *PriceOptions
}{
{
name: "nil_base_fee",
estimateBaseFee: nil,
suggestGasTipCap: common.Big1,
want: nil,
},
{
name: "nil_tip_cap",
estimateBaseFee: common.Big1,
suggestGasTipCap: nil,
want: nil,
},
{
name: "minimum_values",
estimateBaseFee: big.NewInt(lp176.MinGasPrice),
suggestGasTipCap: bigMinGasTip,
cfg: testCfg,
want: &PriceOptions{
Slow: newPrice(
minGasTip,
2*lp176.MinGasPrice+minGasTip,
),
Normal: newPrice(
minGasTip,
2*lp176.MinGasPrice+minGasTip,
),
Fast: newPrice(
minGasTip,
2*lp176.MinGasPrice+(fastFeeNumerator*minGasTip/feeDenominator),
),
},
},
{
name: "maximum_values_1_slow_2_fast",
estimateBaseFee: big.NewInt(100 * params.GWei),
suggestGasTipCap: new(big.Int).SetUint64(maxNormalGasTip),
cfg: PriceOptionConfig{
SlowFeePercentage: 100,
FastFeePercentage: 200,
MaxTip: 20 * params.GWei,
},
want: &PriceOptions{
Slow: newPrice(
20*params.GWei,
220*params.GWei,
),
Normal: newPrice(
20*params.GWei,
220*params.GWei,
),
Fast: newPrice(
40*params.GWei,
240*params.GWei,
),
},
},
{
name: "maximum_value",
cfg: testCfg,
estimateBaseFee: big.NewInt(100 * params.GWei),
suggestGasTipCap: new(big.Int).SetUint64(maxNormalGasTip),
want: &PriceOptions{
Slow: newPrice(
(slowFeeNumerator*maxNormalGasTip)/feeDenominator,
2*100*params.GWei+(slowFeeNumerator*maxNormalGasTip)/feeDenominator,
),
Normal: newPrice(
maxNormalGasTip,
2*100*params.GWei+maxNormalGasTip,
),
Fast: newPrice(
(fastFeeNumerator*maxNormalGasTip)/feeDenominator,
2*100*params.GWei+(fastFeeNumerator*maxNormalGasTip)/feeDenominator,
),
},
},
{
name: "double_maximum_values",
estimateBaseFee: big.NewInt(100 * params.GWei),
suggestGasTipCap: big.NewInt(2 * int64(maxNormalGasTip)),
cfg: testCfg,
want: &PriceOptions{
Slow: newPrice(
(slowFeeNumerator*maxNormalGasTip)/feeDenominator,
2*100*params.GWei+(slowFeeNumerator*maxNormalGasTip)/feeDenominator,
),
Normal: newPrice(
maxNormalGasTip,
2*100*params.GWei+maxNormalGasTip,
),
Fast: newPrice(
(fastFeeNumerator*2*maxNormalGasTip)/feeDenominator,
2*100*params.GWei+(fastFeeNumerator*2*maxNormalGasTip)/feeDenominator,
),
},
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
require := require.New(t)
backend := &testSuggestPriceOptionsBackend{
estimateBaseFee: test.estimateBaseFee,
suggestGasTipCap: test.suggestGasTipCap,
cfg: test.cfg,
}
api := NewEthereumAPI(backend)
got, err := api.SuggestPriceOptions(context.Background())
require.NoError(err)
require.Equal(test.want, got)
})
}
}
func newPrice(gasTip, gasFee uint64) *Price {
return &Price{
GasTip: (*hexutil.Big)(new(big.Int).SetUint64(gasTip)),
GasFee: (*hexutil.Big)(new(big.Int).SetUint64(gasFee)),
}
}