diff --git a/core/vm/evm.go b/core/vm/evm.go index 261c62903f..818418c2c8 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -60,6 +60,13 @@ type ( // ActivePrecompiles returns the addresses of the precompiles enabled with the current // configuration func (evm *EVM) ActivePrecompiles() []common.Address { + return append(evm.activePrecompiles(), evm.activeQuorumPrecompiles()...) +} + +// (Quorum) moved upstream ActivePrecompiles() logic to new method activePrecompiles() +// This functionality is part of an experimental feature so may be subject to future changes. Keeping the original code +// untouched in a new method should flag any changes from future merges. +func (evm *EVM) activePrecompiles() []common.Address { switch { case evm.chainRules.IsYoloV2: return PrecompiledAddressesYoloV2 @@ -72,6 +79,14 @@ func (evm *EVM) ActivePrecompiles() []common.Address { } } +func (evm *EVM) activeQuorumPrecompiles() []common.Address { + var p []common.Address + if evm.chainRules.IsPrivacyPrecompile { + p = append(p, common.QuorumPrivacyPrecompileContractAddress()) + } + return p +} + func (evm *EVM) precompile(addr common.Address) (PrecompiledContract, bool) { var precompiles map[common.Address]PrecompiledContract switch { diff --git a/core/vm/evm_test.go b/core/vm/evm_test.go new file mode 100644 index 0000000000..ecef512c11 --- /dev/null +++ b/core/vm/evm_test.go @@ -0,0 +1,97 @@ +package vm + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/params" + "github.com/stretchr/testify/require" +) + +func TestActivePrecompiles(t *testing.T) { + tests := []struct { + name string + evm *EVM + want []common.Address + }{ + { + name: "istanbul-plus-quorum-privacy", + evm: &EVM{ + chainRules: params.Rules{ + IsIstanbul: true, + IsPrivacyPrecompile: true, + }, + }, + want: []common.Address{ + common.BytesToAddress([]byte{1}), + common.BytesToAddress([]byte{2}), + common.BytesToAddress([]byte{3}), + common.BytesToAddress([]byte{4}), + common.BytesToAddress([]byte{5}), + common.BytesToAddress([]byte{6}), + common.BytesToAddress([]byte{7}), + common.BytesToAddress([]byte{8}), + common.BytesToAddress([]byte{9}), + common.QuorumPrivacyPrecompileContractAddress(), + }, + }, + { + name: "homestead-plus-quorum-privacy", + evm: &EVM{ + chainRules: params.Rules{ + IsHomestead: true, + IsPrivacyPrecompile: true, + }, + }, + want: []common.Address{ + common.BytesToAddress([]byte{1}), + common.BytesToAddress([]byte{2}), + common.BytesToAddress([]byte{3}), + common.BytesToAddress([]byte{4}), + common.QuorumPrivacyPrecompileContractAddress(), + }, + }, + { + name: "istanbul", + evm: &EVM{ + chainRules: params.Rules{ + IsIstanbul: true, + IsPrivacyPrecompile: false, + }, + }, + want: []common.Address{ + common.BytesToAddress([]byte{1}), + common.BytesToAddress([]byte{2}), + common.BytesToAddress([]byte{3}), + common.BytesToAddress([]byte{4}), + common.BytesToAddress([]byte{5}), + common.BytesToAddress([]byte{6}), + common.BytesToAddress([]byte{7}), + common.BytesToAddress([]byte{8}), + common.BytesToAddress([]byte{9}), + }, + }, + { + name: "homestead", + evm: &EVM{ + chainRules: params.Rules{ + IsHomestead: true, + IsPrivacyPrecompile: false, + }, + }, + want: []common.Address{ + common.BytesToAddress([]byte{1}), + common.BytesToAddress([]byte{2}), + common.BytesToAddress([]byte{3}), + common.BytesToAddress([]byte{4}), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := tt.evm.ActivePrecompiles() + require.ElementsMatchf(t, tt.want, got, "want: %v, got: %v", tt.want, got) + }) + } +}