diff --git a/graft/coreth/plugin/evm/customheader/min_delay_excess.go b/graft/coreth/plugin/evm/customheader/min_delay_excess.go index f7bd3f234d8d..1b0790c931a4 100644 --- a/graft/coreth/plugin/evm/customheader/min_delay_excess.go +++ b/graft/coreth/plugin/evm/customheader/min_delay_excess.go @@ -95,7 +95,7 @@ func minDelayExcess( parent *types.Header, desiredMinDelayExcess *acp226.DelayExcess, ) (acp226.DelayExcess, error) { - minDelayExcess := acp226.DelayExcess(acp226.InitialDelayExcess) + minDelayExcess := acp226.InitialDelayExcess if config.IsGranite(parent.Time) { // If the parent block was running with ACP-226, we start with the // resulting min delay excess from the parent block. diff --git a/graft/coreth/plugin/evm/customheader/min_delay_excess_test.go b/graft/coreth/plugin/evm/customheader/min_delay_excess_test.go index f4a073266c93..44c176af1c53 100644 --- a/graft/coreth/plugin/evm/customheader/min_delay_excess_test.go +++ b/graft/coreth/plugin/evm/customheader/min_delay_excess_test.go @@ -64,7 +64,7 @@ func TestMinDelayExcess(t *testing.T) { Time: activatingGraniteTimestamp + 1, }, desiredMinDelayExcess: nil, - expectedDelayExcess: utils.PointerTo(acp226.DelayExcess(acp226.InitialDelayExcess)), + expectedDelayExcess: utils.PointerTo(acp226.InitialDelayExcess), }, { name: "granite_no_parent_min_delay_error", diff --git a/graft/coreth/plugin/evm/customheader/time_test.go b/graft/coreth/plugin/evm/customheader/time_test.go index 20ff7e2cd663..a45a2e4aad4f 100644 --- a/graft/coreth/plugin/evm/customheader/time_test.go +++ b/graft/coreth/plugin/evm/customheader/time_test.go @@ -140,7 +140,7 @@ func TestVerifyTime(t *testing.T) { header: generateHeaderWithMinDelayExcessAndTime( timeSeconds, utils.PointerTo(timeMillis), - utils.PointerTo(uint64(acp226.InitialDelayExcess)), + utils.PointerTo(acp226.InitialDelayExcess), ), parentHeader: generateHeader(timeSeconds-1, nil), // Pre-Granite parent extraConfig: extras.TestGraniteChainConfig, @@ -150,12 +150,12 @@ func TestVerifyTime(t *testing.T) { header: generateHeaderWithMinDelayExcessAndTime( timeSeconds, utils.PointerTo(timeMillis), - utils.PointerTo(uint64(acp226.InitialDelayExcess)), + utils.PointerTo(acp226.InitialDelayExcess), ), parentHeader: generateHeaderWithMinDelayExcessAndTime( timeSeconds-1, utils.PointerTo(timeMillis-2000), // 2000 ms is the exact initial delay - utils.PointerTo(uint64(acp226.InitialDelayExcess)), + utils.PointerTo(acp226.InitialDelayExcess), ), extraConfig: extras.TestGraniteChainConfig, }, @@ -164,12 +164,12 @@ func TestVerifyTime(t *testing.T) { header: generateHeaderWithMinDelayExcessAndTime( timeSeconds, utils.PointerTo(timeMillis), - utils.PointerTo(uint64(acp226.InitialDelayExcess)), + utils.PointerTo(acp226.InitialDelayExcess), ), parentHeader: generateHeaderWithMinDelayExcessAndTime( timeSeconds-1, utils.PointerTo(timeMillis-1999), // 1 ms less than required - utils.PointerTo(uint64(acp226.InitialDelayExcess)), + utils.PointerTo(acp226.InitialDelayExcess), ), extraConfig: extras.TestGraniteChainConfig, expectedErr: ErrMinDelayNotMet, @@ -179,12 +179,12 @@ func TestVerifyTime(t *testing.T) { header: generateHeaderWithMinDelayExcessAndTime( timeSeconds+5, // 5 seconds in future utils.PointerTo(timeMillis+5000), - utils.PointerTo(uint64(acp226.InitialDelayExcess)), + utils.PointerTo(acp226.InitialDelayExcess), ), parentHeader: generateHeaderWithMinDelayExcessAndTime( timeSeconds-1, utils.PointerTo(timeMillis-2000), - utils.PointerTo(uint64(acp226.InitialDelayExcess)), + utils.PointerTo(acp226.InitialDelayExcess), ), extraConfig: extras.TestGraniteChainConfig, }, @@ -193,12 +193,12 @@ func TestVerifyTime(t *testing.T) { header: generateHeaderWithMinDelayExcessAndTime( timeSeconds+15, // 15 seconds in future, exceeds MaxFutureBlockTime utils.PointerTo(timeMillis+15000), - utils.PointerTo(uint64(acp226.InitialDelayExcess)), + utils.PointerTo(acp226.InitialDelayExcess), ), parentHeader: generateHeaderWithMinDelayExcessAndTime( timeSeconds-1, utils.PointerTo(timeMillis-2000), - utils.PointerTo(uint64(acp226.InitialDelayExcess)), + utils.PointerTo(acp226.InitialDelayExcess), ), extraConfig: extras.TestGraniteChainConfig, expectedErr: ErrBlockTooFarInFuture, @@ -208,12 +208,12 @@ func TestVerifyTime(t *testing.T) { header: generateHeaderWithMinDelayExcessAndTime( timeSeconds, utils.PointerTo(timeMillis), - utils.PointerTo[uint64](0), + utils.PointerTo(acp226.DelayExcess(0)), ), parentHeader: generateHeaderWithMinDelayExcessAndTime( timeSeconds, - utils.PointerTo(timeMillis-1), // 1ms delay, meets zero requirement - utils.PointerTo[uint64](0), // Parent has zero delay excess + utils.PointerTo(timeMillis-1), // 1ms delay, meets zero requirement + utils.PointerTo(acp226.DelayExcess(0)), // Parent has zero delay excess ), extraConfig: extras.TestGraniteChainConfig, }, @@ -222,12 +222,12 @@ func TestVerifyTime(t *testing.T) { header: generateHeaderWithMinDelayExcessAndTime( timeSeconds, utils.PointerTo(timeMillis), - utils.PointerTo[uint64](0), + utils.PointerTo(acp226.DelayExcess(0)), ), parentHeader: generateHeaderWithMinDelayExcessAndTime( timeSeconds, - utils.PointerTo(timeMillis), // Same timestamp, zero delay - utils.PointerTo[uint64](0), // Parent has zero delay excess + utils.PointerTo(timeMillis), // Same timestamp, zero delay + utils.PointerTo(acp226.DelayExcess(0)), // Parent has zero delay excess ), extraConfig: extras.TestGraniteChainConfig, expectedErr: ErrMinDelayNotMet, @@ -338,14 +338,14 @@ func generateHeader(timeSeconds uint64, timeMilliseconds *uint64) *types.Header ) } -func generateHeaderWithMinDelayExcessAndTime(timeSeconds uint64, timeMilliseconds *uint64, minDelayExcess *uint64) *types.Header { +func generateHeaderWithMinDelayExcessAndTime(timeSeconds uint64, timeMilliseconds *uint64, minDelayExcess *acp226.DelayExcess) *types.Header { return customtypes.WithHeaderExtra( &types.Header{ Time: timeSeconds, }, &customtypes.HeaderExtra{ TimeMilliseconds: timeMilliseconds, - MinDelayExcess: (*acp226.DelayExcess)(minDelayExcess), + MinDelayExcess: minDelayExcess, }, ) } diff --git a/graft/coreth/plugin/evm/vm_test.go b/graft/coreth/plugin/evm/vm_test.go index b9d208ca36de..1fd73f8067c7 100644 --- a/graft/coreth/plugin/evm/vm_test.go +++ b/graft/coreth/plugin/evm/vm_test.go @@ -2152,19 +2152,19 @@ func TestMinDelayExcessInHeader(t *testing.T) { name: "granite_first_block_initial_delay_excess", fork: upgradetest.Granite, desiredMinDelay: nil, - expectedMinDelayExcess: utils.PointerTo(acp226.DelayExcess(acp226.InitialDelayExcess)), + expectedMinDelayExcess: utils.PointerTo(acp226.InitialDelayExcess), }, { name: "granite_with_excessive_desired_min_delay_excess", fork: upgradetest.Granite, desiredMinDelay: utils.PointerTo[uint64](4000), - expectedMinDelayExcess: utils.PointerTo(acp226.DelayExcess(acp226.InitialDelayExcess + acp226.MaxDelayExcessDiff)), + expectedMinDelayExcess: utils.PointerTo(acp226.InitialDelayExcess + acp226.MaxDelayExcessDiff), }, { name: "granite_with_zero_desired_min_delay_excess", fork: upgradetest.Granite, desiredMinDelay: utils.PointerTo[uint64](0), - expectedMinDelayExcess: utils.PointerTo(acp226.DelayExcess(acp226.InitialDelayExcess - acp226.MaxDelayExcessDiff)), + expectedMinDelayExcess: utils.PointerTo(acp226.InitialDelayExcess - acp226.MaxDelayExcessDiff), }, } diff --git a/graft/subnet-evm/plugin/evm/customheader/min_delay_excess.go b/graft/subnet-evm/plugin/evm/customheader/min_delay_excess.go index 2e3a50a322b0..bd0de3d54000 100644 --- a/graft/subnet-evm/plugin/evm/customheader/min_delay_excess.go +++ b/graft/subnet-evm/plugin/evm/customheader/min_delay_excess.go @@ -95,7 +95,7 @@ func minDelayExcess( parent *types.Header, desiredMinDelayExcess *acp226.DelayExcess, ) (acp226.DelayExcess, error) { - minDelayExcess := acp226.DelayExcess(acp226.InitialDelayExcess) + minDelayExcess := acp226.InitialDelayExcess if config.IsGranite(parent.Time) { // If the parent block was running with ACP-226, we start with the // resulting min delay excess from the parent block. diff --git a/graft/subnet-evm/plugin/evm/customheader/min_delay_excess_test.go b/graft/subnet-evm/plugin/evm/customheader/min_delay_excess_test.go index 72b454e7a40e..968d429a1dcd 100644 --- a/graft/subnet-evm/plugin/evm/customheader/min_delay_excess_test.go +++ b/graft/subnet-evm/plugin/evm/customheader/min_delay_excess_test.go @@ -64,7 +64,7 @@ func TestMinDelayExcess(t *testing.T) { Time: activatingGraniteTimestamp + 1, }, desiredMinDelayExcess: nil, - expectedDelayExcess: utils.PointerTo(acp226.DelayExcess(acp226.InitialDelayExcess)), + expectedDelayExcess: utils.PointerTo(acp226.InitialDelayExcess), }, { name: "granite_no_parent_min_delay_error", diff --git a/graft/subnet-evm/plugin/evm/customheader/time_test.go b/graft/subnet-evm/plugin/evm/customheader/time_test.go index dd5f33897f6e..f342c486d2a8 100644 --- a/graft/subnet-evm/plugin/evm/customheader/time_test.go +++ b/graft/subnet-evm/plugin/evm/customheader/time_test.go @@ -140,7 +140,7 @@ func TestVerifyTime(t *testing.T) { header: generateHeaderWithMinDelayExcessAndTime( timeSeconds, utils.PointerTo(timeMillis), - utils.PointerTo[uint64](acp226.InitialDelayExcess), + utils.PointerTo(acp226.InitialDelayExcess), ), parentHeader: generateHeader(timeSeconds-1, nil), // Pre-Granite parent extraConfig: extras.TestGraniteChainConfig, @@ -150,12 +150,12 @@ func TestVerifyTime(t *testing.T) { header: generateHeaderWithMinDelayExcessAndTime( timeSeconds, utils.PointerTo(timeMillis), - utils.PointerTo[uint64](acp226.InitialDelayExcess), + utils.PointerTo(acp226.InitialDelayExcess), ), parentHeader: generateHeaderWithMinDelayExcessAndTime( timeSeconds-1, utils.PointerTo(timeMillis-2000), // 2000 ms is the exact initial delay - utils.PointerTo[uint64](acp226.InitialDelayExcess), + utils.PointerTo(acp226.InitialDelayExcess), ), extraConfig: extras.TestGraniteChainConfig, }, @@ -164,12 +164,12 @@ func TestVerifyTime(t *testing.T) { header: generateHeaderWithMinDelayExcessAndTime( timeSeconds, utils.PointerTo(timeMillis), - utils.PointerTo[uint64](acp226.InitialDelayExcess), + utils.PointerTo(acp226.InitialDelayExcess), ), parentHeader: generateHeaderWithMinDelayExcessAndTime( timeSeconds-1, utils.PointerTo(timeMillis-1999), // 1 ms less than required - utils.PointerTo[uint64](acp226.InitialDelayExcess), + utils.PointerTo(acp226.InitialDelayExcess), ), extraConfig: extras.TestGraniteChainConfig, expectedErr: ErrMinDelayNotMet, @@ -179,12 +179,12 @@ func TestVerifyTime(t *testing.T) { header: generateHeaderWithMinDelayExcessAndTime( timeSeconds+5, // 5 seconds in future utils.PointerTo(timeMillis+5000), - utils.PointerTo[uint64](acp226.InitialDelayExcess), + utils.PointerTo(acp226.InitialDelayExcess), ), parentHeader: generateHeaderWithMinDelayExcessAndTime( timeSeconds-1, utils.PointerTo(timeMillis-2000), - utils.PointerTo[uint64](acp226.InitialDelayExcess), + utils.PointerTo(acp226.InitialDelayExcess), ), extraConfig: extras.TestGraniteChainConfig, }, @@ -193,12 +193,12 @@ func TestVerifyTime(t *testing.T) { header: generateHeaderWithMinDelayExcessAndTime( timeSeconds+15, // 15 seconds in future, exceeds MaxFutureBlockTime utils.PointerTo(timeMillis+15000), - utils.PointerTo[uint64](acp226.InitialDelayExcess), + utils.PointerTo(acp226.InitialDelayExcess), ), parentHeader: generateHeaderWithMinDelayExcessAndTime( timeSeconds-1, utils.PointerTo(timeMillis-2000), - utils.PointerTo[uint64](acp226.InitialDelayExcess), + utils.PointerTo(acp226.InitialDelayExcess), ), extraConfig: extras.TestGraniteChainConfig, expectedErr: ErrBlockTooFarInFuture, @@ -208,12 +208,12 @@ func TestVerifyTime(t *testing.T) { header: generateHeaderWithMinDelayExcessAndTime( timeSeconds, utils.PointerTo(timeMillis), - utils.PointerTo[uint64](0), + utils.PointerTo(acp226.DelayExcess(0)), ), parentHeader: generateHeaderWithMinDelayExcessAndTime( timeSeconds, - utils.PointerTo(timeMillis-1), // 1ms delay, meets zero requirement - utils.PointerTo[uint64](0), // Parent has zero delay excess + utils.PointerTo(timeMillis-1), // 1ms delay, meets zero requirement + utils.PointerTo(acp226.DelayExcess(0)), // Parent has zero delay excess ), extraConfig: extras.TestGraniteChainConfig, }, @@ -222,12 +222,12 @@ func TestVerifyTime(t *testing.T) { header: generateHeaderWithMinDelayExcessAndTime( timeSeconds, utils.PointerTo(timeMillis), - utils.PointerTo[uint64](0), + utils.PointerTo(acp226.DelayExcess(0)), ), parentHeader: generateHeaderWithMinDelayExcessAndTime( timeSeconds, - utils.PointerTo(timeMillis), // Same timestamp, zero delay - utils.PointerTo[uint64](0), // Parent has zero delay excess + utils.PointerTo(timeMillis), // Same timestamp, zero delay + utils.PointerTo(acp226.DelayExcess(0)), // Parent has zero delay excess ), extraConfig: extras.TestGraniteChainConfig, expectedErr: ErrMinDelayNotMet, @@ -338,14 +338,14 @@ func generateHeader(timeSeconds uint64, timeMilliseconds *uint64) *types.Header ) } -func generateHeaderWithMinDelayExcessAndTime(timeSeconds uint64, timeMilliseconds *uint64, minDelayExcess *uint64) *types.Header { +func generateHeaderWithMinDelayExcessAndTime(timeSeconds uint64, timeMilliseconds *uint64, minDelayExcess *acp226.DelayExcess) *types.Header { return customtypes.WithHeaderExtra( &types.Header{ Time: timeSeconds, }, &customtypes.HeaderExtra{ TimeMilliseconds: timeMilliseconds, - MinDelayExcess: (*acp226.DelayExcess)(minDelayExcess), + MinDelayExcess: minDelayExcess, }, ) } diff --git a/graft/subnet-evm/plugin/evm/vm_test.go b/graft/subnet-evm/plugin/evm/vm_test.go index 4098f0191f3a..20a94952a2cd 100644 --- a/graft/subnet-evm/plugin/evm/vm_test.go +++ b/graft/subnet-evm/plugin/evm/vm_test.go @@ -3592,19 +3592,19 @@ func TestMinDelayExcessInHeader(t *testing.T) { name: "granite_first_block_initial_delay_excess", fork: upgradetest.Granite, desiredMinDelay: nil, - expectedMinDelayExcess: avalancheutils.PointerTo(acp226.DelayExcess(acp226.InitialDelayExcess)), + expectedMinDelayExcess: avalancheutils.PointerTo(acp226.InitialDelayExcess), }, { name: "granite_with_excessive_desired_min_delay_excess", fork: upgradetest.Granite, desiredMinDelay: avalancheutils.PointerTo[uint64](4000), - expectedMinDelayExcess: avalancheutils.PointerTo(acp226.DelayExcess(acp226.InitialDelayExcess + acp226.MaxDelayExcessDiff)), + expectedMinDelayExcess: avalancheutils.PointerTo(acp226.InitialDelayExcess + acp226.MaxDelayExcessDiff), }, { name: "granite_with_zero_desired_min_delay_excess", fork: upgradetest.Granite, desiredMinDelay: avalancheutils.PointerTo[uint64](0), - expectedMinDelayExcess: avalancheutils.PointerTo(acp226.DelayExcess(acp226.InitialDelayExcess - acp226.MaxDelayExcessDiff)), + expectedMinDelayExcess: avalancheutils.PointerTo(acp226.InitialDelayExcess - acp226.MaxDelayExcessDiff), }, } diff --git a/vms/evm/acp226/acp226.go b/vms/evm/acp226/acp226.go index 96d90c4f4ef7..3d2572165ac1 100644 --- a/vms/evm/acp226/acp226.go +++ b/vms/evm/acp226/acp226.go @@ -23,9 +23,9 @@ const ( // InitialDelayExcess represents the initial (≈2000ms) delay excess. // Formula: ConversionRate (2^20) * ln(2000) + 1 - InitialDelayExcess = 7_970_124 + InitialDelayExcess DelayExcess = 7_970_124 - maxDelayExcess = 46_516_320 // ConversionRate * ln(MaxUint64 / MinDelayMilliseconds) + 1 + maxDelayExcess DelayExcess = 46_516_320 // ConversionRate * ln(MaxUint64 / MinDelayMilliseconds) + 1 ) // DelayExcess represents the excess for delay calculation in the dynamic @@ -55,7 +55,7 @@ func DesiredDelayExcess(desiredDelay uint64) DelayExcess { // This could be solved directly by calculating D * ln(desired / M) // using floating point math. However, it introduces inaccuracies. So, we // use a binary search to find the closest integer solution. - return DelayExcess(sort.Search(maxDelayExcess, func(delayExcessGuess int) bool { + return DelayExcess(sort.Search(int(maxDelayExcess), func(delayExcessGuess int) bool { excess := DelayExcess(delayExcessGuess) return excess.Delay() >= desiredDelay }))