diff --git a/core/vm/jump_table_export.go b/core/vm/jump_table_export.go index 89a2ebf6f4..fdf814d64c 100644 --- a/core/vm/jump_table_export.go +++ b/core/vm/jump_table_export.go @@ -28,6 +28,8 @@ func LookupInstructionSet(rules params.Rules) (JumpTable, error) { switch { case rules.IsVerkle: return newCancunInstructionSet(), errors.New("verkle-fork not defined yet") + case rules.IsAmsterdam: + return newAmsterdamInstructionSet(), nil case rules.IsOsaka: return newOsakaInstructionSet(), nil case rules.IsPrague: diff --git a/core/vm/jump_table_test.go b/core/vm/jump_table_test.go index a4f9759ed2..d9ba67c787 100644 --- a/core/vm/jump_table_test.go +++ b/core/vm/jump_table_test.go @@ -19,6 +19,7 @@ package vm import ( "testing" + "github.com/ethereum/go-ethereum/params" "github.com/stretchr/testify/require" ) @@ -33,3 +34,35 @@ func TestJumpTableCopy(t *testing.T) { require.Equal(t, uint64(100), deepCopy[SLOAD].constantGas) require.Equal(t, uint64(0), tbl[SLOAD].constantGas) } + +func TestLookupInstructionSetAmsterdam(t *testing.T) { + jt, err := LookupInstructionSet(params.Rules{ + IsMerge: true, + IsShanghai: true, + IsCancun: true, + IsPrague: true, + IsOsaka: true, + IsAmsterdam: true, + }) + require.NoError(t, err) + + require.True(t, jt[SLOTNUM].HasCost()) + require.True(t, jt[DUPN].HasCost()) + require.True(t, jt[SWAPN].HasCost()) + require.True(t, jt[EXCHANGE].HasCost()) +} + +func TestAmsterdamOpcodeActivation(t *testing.T) { + amsterdam := newAmsterdamInstructionSet() + osaka := newOsakaInstructionSet() + + require.True(t, amsterdam[SLOTNUM].HasCost()) + require.True(t, amsterdam[DUPN].HasCost()) + require.True(t, amsterdam[SWAPN].HasCost()) + require.True(t, amsterdam[EXCHANGE].HasCost()) + + require.False(t, osaka[SLOTNUM].HasCost()) + require.False(t, osaka[DUPN].HasCost()) + require.False(t, osaka[SWAPN].HasCost()) + require.False(t, osaka[EXCHANGE].HasCost()) +}