mirror of
https://github.com/luxfi/evmgpu.git
synced 2026-10-30 16:57:11 +00:00
75 lines
2.7 KiB
Go
75 lines
2.7 KiB
Go
// Copyright (C) 2019-2025, Lux Industries, Inc. All rights reserved.
|
|
// See the file LICENSE for licensing terms.
|
|
|
|
package feemanager
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/luxfi/evmgpu/precompile/contract"
|
|
"github.com/luxfi/evmgpu/precompile/modules"
|
|
"github.com/luxfi/evmgpu/precompile/precompileconfig"
|
|
"github.com/luxfi/geth/common"
|
|
)
|
|
|
|
var _ contract.Configurator = (*configurator)(nil)
|
|
|
|
// ConfigKey is the key used in json config files to specify this precompile config.
|
|
// must be unique across all precompiles.
|
|
const ConfigKey = "feeManagerConfig"
|
|
|
|
// LP-aligned address: P=3 (LP-3xxx EVM), C=2 (C-Chain), II=F0 (LP-3511 Fee Manager)
|
|
var ContractAddress = common.HexToAddress("0x13F01")
|
|
|
|
// Module is the precompile module. It is used to register the precompile contract.
|
|
var Module = modules.Module{
|
|
ConfigKey: ConfigKey,
|
|
Address: ContractAddress,
|
|
Contract: FeeManagerPrecompile,
|
|
Configurator: &configurator{},
|
|
}
|
|
|
|
type configurator struct{}
|
|
|
|
func init() {
|
|
// Register the precompile module.
|
|
// Each precompile contract registers itself through [RegisterModule] function.
|
|
if err := modules.RegisterModule(Module); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
// MakeConfig returns a new precompile config instance.
|
|
// This is required to Marshal/Unmarshal the precompile config.
|
|
func (*configurator) MakeConfig() precompileconfig.Config {
|
|
return new(Config)
|
|
}
|
|
|
|
// MakeGenesisConfig returns a precompile config for genesis activation (timestamp = 0).
|
|
func (*configurator) MakeGenesisConfig() precompileconfig.Config {
|
|
var zero uint64
|
|
return NewConfig(&zero, nil, nil, nil, nil)
|
|
}
|
|
|
|
// Configure configures [state] with the given [cfg] precompileconfig.
|
|
// This function is called by the EVM once per precompile contract activation.
|
|
func (*configurator) Configure(chainConfig precompileconfig.ChainConfig, cfg precompileconfig.Config, state contract.StateDB, blockContext contract.ConfigurationBlockContext) error {
|
|
config, ok := cfg.(*Config)
|
|
if !ok {
|
|
return fmt.Errorf("expected config type %T, got %T: %v", &Config{}, cfg, cfg)
|
|
}
|
|
// Store the initial fee config into the state when the fee manager activates.
|
|
if config.InitialFeeConfig != nil {
|
|
if err := StoreFeeConfig(state, *config.InitialFeeConfig, blockContext); err != nil {
|
|
// This should not happen since we already checked this config with Verify()
|
|
return fmt.Errorf("cannot configure given initial fee config: %w", err)
|
|
}
|
|
} else {
|
|
if err := StoreFeeConfig(state, chainConfig.GetFeeConfig(), blockContext); err != nil {
|
|
// This should not happen since we already checked the chain config in the genesis creation.
|
|
return fmt.Errorf("cannot configure fee config in chain config: %w", err)
|
|
}
|
|
}
|
|
return config.Configure(chainConfig, ContractAddress, state, blockContext)
|
|
}
|