Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
9fa2894
refactor: Share EVM Utils
alarso16 Dec 15, 2025
a1d7571
refactor: align PointerTo functions
JonathanOppenheimer Dec 15, 2025
7eb6a03
refactor: remove additional pointer helper
JonathanOppenheimer Dec 15, 2025
dd0c874
chore: lint
JonathanOppenheimer Dec 15, 2025
52f5f65
chore: lint
JonathanOppenheimer Dec 15, 2025
27bd7df
chore: lint
JonathanOppenheimer Dec 15, 2025
b3ca14c
fix: nit
alarso16 Dec 17, 2025
92481c4
Merge remote-tracking branch 'origin/master' into alarso16/shared-utils
alarso16 Dec 17, 2025
8ab7b07
fix: remove other evm helper
JonathanOppenheimer Dec 18, 2025
98337b9
refactor: move pointer function to avalanchego utils
JonathanOppenheimer Dec 18, 2025
8a0b2a9
refactor: move pointer function to avalanchego utils
JonathanOppenheimer Dec 18, 2025
4899b18
refactor: remove avalanche pointer functions
JonathanOppenheimer Dec 18, 2025
3ea19c3
refactor: retype delay excess
JonathanOppenheimer Dec 18, 2025
5b97b5b
Merge branch 'alarso16/shared-utils' into JonathanOppenheimer/cleanup…
JonathanOppenheimer Dec 18, 2025
8d3342a
chore: lint
JonathanOppenheimer Dec 18, 2025
9e161ce
fix: fix precompilebind test
JonathanOppenheimer Dec 18, 2025
9415c2a
Merge remote-tracking branch 'origin/master' into alarso16/shared-utils
alarso16 Dec 19, 2025
d458c28
Merge remote-tracking branch 'origin/alarso16/shared-utils' into Jona…
JonathanOppenheimer Dec 19, 2025
fa38c15
Merge remote-tracking branch 'origin' into JonathanOppenheimer/cleanu…
JonathanOppenheimer Jan 6, 2026
30996ca
fix: imports
JonathanOppenheimer Jan 6, 2026
7f2844b
chore: correct header year
JonathanOppenheimer Jan 6, 2026
0090c2f
Merge remote-tracking branch 'origin' into JonathanOppenheimer/cleanu…
JonathanOppenheimer Jan 8, 2026
17d7a81
style: revert delay excess retype
JonathanOppenheimer Jan 9, 2026
9f24502
Revert "style: revert delay excess retype"
JonathanOppenheimer Jan 9, 2026
b49ca61
style: austin feedback
JonathanOppenheimer Jan 9, 2026
e564de4
Merge branch 'master' into JonathanOppenheimer/cleanup-ptr-to
JonathanOppenheimer Jan 9, 2026
82c6439
Merge branch 'JonathanOppenheimer/cleanup-ptr-to' into JonathanOppenh…
JonathanOppenheimer Jan 9, 2026
3431ce3
fix: revert go mod changes
JonathanOppenheimer Jan 9, 2026
1cbebef
Merge branch 'JonathanOppenheimer/cleanup-ptr-to' into JonathanOppenh…
JonathanOppenheimer Jan 9, 2026
218faef
fix: casts
JonathanOppenheimer Jan 9, 2026
6fc00a8
Merge branch 'master' into JonathanOppenheimer/delay-excess-retype
JonathanOppenheimer Jan 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion graft/coreth/plugin/evm/customheader/min_delay_excess.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
34 changes: 17 additions & 17 deletions graft/coreth/plugin/evm/customheader/time_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
},
Expand All @@ -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,
Expand All @@ -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,
},
Expand All @@ -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,
Expand All @@ -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,
},
Expand All @@ -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,
Expand Down Expand Up @@ -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,
},
)
}
6 changes: 3 additions & 3 deletions graft/coreth/plugin/evm/vm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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),
},
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
34 changes: 17 additions & 17 deletions graft/subnet-evm/plugin/evm/customheader/time_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
},
Expand All @@ -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,
Expand All @@ -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,
},
Expand All @@ -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,
Expand All @@ -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,
},
Expand All @@ -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,
Expand Down Expand Up @@ -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,
},
)
}
6 changes: 3 additions & 3 deletions graft/subnet-evm/plugin/evm/vm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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),
},
}

Expand Down
6 changes: 3 additions & 3 deletions vms/evm/acp226/acp226.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Comment on lines +26 to +28
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here are the important changes.

)

// DelayExcess represents the excess for delay calculation in the dynamic
Expand Down Expand Up @@ -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
}))
Expand Down