2022-12-16 09:48:38 +00:00
|
|
|
// Copyright 2021 Evmos Foundation
|
|
|
|
// This file is part of Evmos' Ethermint library.
|
|
|
|
//
|
|
|
|
// The Ethermint library is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU Lesser General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
//
|
|
|
|
// The Ethermint library is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU Lesser General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
|
|
// along with the Ethermint library. If not, see https://github.com/evmos/ethermint/blob/main/LICENSE
|
2022-10-10 10:38:33 +00:00
|
|
|
package geth
|
|
|
|
|
|
|
|
import (
|
|
|
|
"math/big"
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/common"
|
|
|
|
"github.com/ethereum/go-ethereum/core/vm"
|
|
|
|
"github.com/ethereum/go-ethereum/params"
|
|
|
|
|
|
|
|
evm "github.com/cerc-io/laconicd/x/evm/vm"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
_ evm.EVM = (*EVM)(nil)
|
|
|
|
_ evm.Constructor = NewEVM
|
|
|
|
)
|
|
|
|
|
|
|
|
// EVM is the wrapper for the go-ethereum EVM.
|
|
|
|
type EVM struct {
|
|
|
|
*vm.EVM
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewEVM defines the constructor function for the go-ethereum (geth) EVM. It uses
|
|
|
|
// the default precompiled contracts and the EVM concrete implementation from
|
|
|
|
// geth.
|
|
|
|
func NewEVM(
|
|
|
|
blockCtx vm.BlockContext,
|
|
|
|
txCtx vm.TxContext,
|
|
|
|
stateDB vm.StateDB,
|
|
|
|
chainConfig *params.ChainConfig,
|
|
|
|
config vm.Config,
|
|
|
|
_ evm.PrecompiledContracts, // unused
|
|
|
|
) evm.EVM {
|
|
|
|
return &EVM{
|
|
|
|
EVM: vm.NewEVM(blockCtx, txCtx, stateDB, chainConfig, config),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Context returns the EVM's Block Context
|
|
|
|
func (e EVM) Context() vm.BlockContext {
|
|
|
|
return e.EVM.Context
|
|
|
|
}
|
|
|
|
|
|
|
|
// TxContext returns the EVM's Tx Context
|
|
|
|
func (e EVM) TxContext() vm.TxContext {
|
|
|
|
return e.EVM.TxContext
|
|
|
|
}
|
|
|
|
|
|
|
|
// Config returns the configuration options for the EVM.
|
|
|
|
func (e EVM) Config() vm.Config {
|
|
|
|
return e.EVM.Config
|
|
|
|
}
|
|
|
|
|
|
|
|
// Precompile returns the precompiled contract associated with the given address
|
|
|
|
// and the current chain configuration. If the contract cannot be found it returns
|
|
|
|
// nil.
|
|
|
|
func (e EVM) Precompile(addr common.Address) (p vm.PrecompiledContract, found bool) {
|
|
|
|
precompiles := GetPrecompiles(e.ChainConfig(), e.EVM.Context.BlockNumber)
|
|
|
|
p, found = precompiles[addr]
|
|
|
|
return p, found
|
|
|
|
}
|
|
|
|
|
|
|
|
// ActivePrecompiles returns a list of all the active precompiled contract addresses
|
|
|
|
// for the current chain configuration.
|
|
|
|
func (EVM) ActivePrecompiles(rules params.Rules) []common.Address {
|
|
|
|
return vm.ActivePrecompiles(rules)
|
|
|
|
}
|
|
|
|
|
|
|
|
// RunPrecompiledContract runs a stateless precompiled contract and ignores the address and
|
2022-12-16 09:48:38 +00:00
|
|
|
// value arguments. It uses the RunPrecompiledContract function from the geth vm package
|
2022-10-10 10:38:33 +00:00
|
|
|
func (EVM) RunPrecompiledContract(
|
|
|
|
p evm.StatefulPrecompiledContract,
|
|
|
|
_ common.Address, // address arg is unused
|
|
|
|
input []byte,
|
|
|
|
suppliedGas uint64,
|
|
|
|
_ *big.Int, // value arg is unused
|
|
|
|
) (ret []byte, remainingGas uint64, err error) {
|
|
|
|
return vm.RunPrecompiledContract(p, input, suppliedGas)
|
|
|
|
}
|