Skip to content

Dynamic EIP-1559 params setup#1989

Merged
lucca30 merged 17 commits intodevelopfrom
lmartins/no-base-fee-validation
Jan 28, 2026
Merged

Dynamic EIP-1559 params setup#1989
lucca30 merged 17 commits intodevelopfrom
lmartins/no-base-fee-validation

Conversation

@lucca30
Copy link
Copy Markdown
Contributor

@lucca30 lucca30 commented Jan 14, 2026

Description

This PR proposes a more flexible validation over EIP-1559 configurable TargetGas and BaseFeeDenominator, in the same way is already done by the gas limit. Which means that consensus will not block changes over this parameters set by the block producer. The goal is to allow more dynamic setups by the block producer whenever necessary.

The only proposed restriction is on the boundary range of 5% of parentBaseFee for increase or decrease. Which is already above the current limit of 1.7% on a scenario of 0% gas usage on parent block.

Changes

  • Bugfix (non-breaking change that solves an issue)
  • Hotfix (change that solves an urgent issue, and requires immediate attention)
  • New feature (non-breaking change that adds functionality)
  • Breaking change (change that is not backwards-compatible and/or changes current functionality)
  • Changes only for a subset of nodes

@codecov
Copy link
Copy Markdown

codecov bot commented Jan 14, 2026

Codecov Report

❌ Patch coverage is 97.67442% with 3 lines in your changes missing coverage. Please review.
✅ Project coverage is 49.07%. Comparing base (8db7315) to head (ddb7557).
⚠️ Report is 4 commits behind head on develop.

Files with missing lines Patch % Lines
params/protocol_params.go 84.21% 2 Missing and 1 partial ⚠️
Additional details and impacted files

Impacted file tree graph

@@             Coverage Diff             @@
##           develop    #1989      +/-   ##
===========================================
+ Coverage    48.25%   49.07%   +0.82%     
===========================================
  Files          843      844       +1     
  Lines       144648   145299     +651     
===========================================
+ Hits         69793    71300    +1507     
+ Misses       70268    69284     -984     
- Partials      4587     4715     +128     
Files with missing lines Coverage Δ
consensus/misc/eip1559/eip1559.go 94.17% <100.00%> (+15.79%) ⬆️
eth/peer.go 88.42% <100.00%> (+13.68%) ⬆️
internal/cli/server/config.go 61.30% <100.00%> (+0.80%) ⬆️
internal/cli/server/flags.go 100.00% <100.00%> (ø)
params/config.go 35.01% <100.00%> (+4.32%) ⬆️
params/protocol_params.go 84.21% <84.21%> (ø)

... and 39 files with indirect coverage changes

Files with missing lines Coverage Δ
consensus/misc/eip1559/eip1559.go 94.17% <100.00%> (+15.79%) ⬆️
eth/peer.go 88.42% <100.00%> (+13.68%) ⬆️
internal/cli/server/config.go 61.30% <100.00%> (+0.80%) ⬆️
internal/cli/server/flags.go 100.00% <100.00%> (ø)
params/config.go 35.01% <100.00%> (+4.32%) ⬆️
params/protocol_params.go 84.21% <84.21%> (ø)

... and 39 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@lucca30 lucca30 force-pushed the lmartins/no-base-fee-validation branch from c27bfe8 to cab29b1 Compare January 15, 2026 11:56
@lucca30 lucca30 marked this pull request as ready for review January 15, 2026 19:59
@adamdossa
Copy link
Copy Markdown
Contributor

@claude Please can you do a thorough review of this change, highlighting any potential safety issues, bugs or edge-cases.

@claude
Copy link
Copy Markdown

claude bot commented Jan 26, 2026

Claude finished @adamdossa's task in 1m 49s —— View job


Reviewing PR #1989: Dynamic EIP-1559 params setup

  • Read repository guidelines (CLAUDE.md)
  • Analyze changed files and understand the changes
  • Review for safety issues, bugs, and edge cases
  • Provide comprehensive review feedback

Summary

This PR introduces dynamic configuration of EIP-1559 parameters (TargetGasPercentage and BaseFeeChangeDenominator) after the Dandeli hard fork, and removes base fee validation from consensus for post-Dandeli blocks. This is a significant change that shifts trust from protocol enforcement to block producer discretion.


Safety Concerns

1. Removal of Base Fee Validation is a Critical Consensus Change ⚠️

File: consensus/misc/eip1559/eip1559.go:47-54

// After Dandeli hard fork, base fee validation is removed to allow dynamic configuration.
if config.Bor != nil && config.Bor.IsDandeli(header.Number) {
    // Post-Dandeli: Skip base fee validation
    return nil
}

Concern: Post-Dandeli, validators can set any arbitrary base fee in their blocks, including:

  • Zero base fee (effectively disabling EIP-1559 fee burning)
  • Extremely high base fees (causing transaction failures)
  • Values that don't follow the EIP-1559 adjustment formula

This is a fundamental change to how the network operates. While the PR description mentions this is intentional for "more dynamic setups," this opens the door to:

  • Economic attacks where validators manipulate base fees
  • Network instability if validators set conflicting base fees
  • Loss of fee burning if validators consistently set low/zero base fees

Recommendation: Consider adding bounds checking even after Dandeli, or document the threat model and governance mechanisms that prevent misuse.


2. No Minimum Base Fee Enforcement ⚠️

File: consensus/misc/eip1559/eip1559.go:105-109 and test at line 643-653

The code accepts a base fee of zero:

t.Run("accepts zero base fee", func(t *testing.T) {
    header := &types.Header{
        BaseFee:  big.NewInt(0), // Zero is valid
    }
    err := VerifyEIP1559Header(testConfig, parent, header)
    require.NoError(t, err, "should accept header with zero base fee")
})

Concern: A zero base fee means:

  • No tokens are burned (breaking EIP-1559's deflationary mechanism)
  • Transactions can be included with zero priority fee
  • Potential for spam attacks with very low cost

3. Node Heterogeneity Risk

File: params/config.go:887-888

// Runtime miner configuration (set via sealer/miner CLI flags, not from genesis JSON)
TargetGasPercentage      *uint64 `json:"-"` // Post-Dandeli: target gas as % of gas limit
BaseFeeChangeDenominator *uint64 `json:"-"` // Post-Dandeli: base fee change rate

These parameters are explicitly excluded from JSON serialization (json:"-"), meaning:

  • Different validators can run with different parameters
  • Non-mining nodes won't know what parameters validators are using
  • This could lead to divergent base fee calculations across the network

Recommendation: Consider whether these parameters should be announced or recorded in block headers for transparency.


Potential Bugs

4. Division by Zero Protection - But Only Logged, Not Propagated

File: params/config.go:1004-1010

if val > 0 {
    return val
}
// Invalid value - log error and fall back to default
log.Error("Invalid BaseFeeChangeDenominator in BorConfig (must be > 0), falling back to default",
    "configured", val)

Observation: While division by zero is prevented by falling back to defaults, the error is only logged. This silent fallback could mask configuration mistakes.

Recommendation: Consider returning an error during startup validation (in buildEth) rather than silently falling back during block production.


5. Missing Validation at Startup

File: internal/cli/server/config.go:1179-1188

// Set runtime miner gas parameters in BorConfig (if not in developer mode and Bor chain)
if !c.Developer.Enabled && n.Genesis != nil && n.Genesis.Config != nil && n.Genesis.Config.Bor != nil {
    if c.Sealer.TargetGasPercentage > 0 {
        n.Genesis.Config.Bor.TargetGasPercentage = &c.Sealer.TargetGasPercentage
    }
    if c.Sealer.BaseFeeChangeDenominator > 0 {
        n.Genesis.Config.Bor.BaseFeeChangeDenominator = &c.Sealer.BaseFeeChangeDenominator
    }
}

Observation: The values are only validated when GetTargetGasPercentage or GetBaseFeeChangeDenominator are called at runtime, not at startup. A user could configure:

  • --miner.targetGasPercentage=150 (invalid, >100%)
  • --miner.baseFeeChangeDenominator=0 (invalid, would cause division by zero)

And only see an error log at block production time.

Recommendation: Add explicit validation during config building:

if c.Sealer.TargetGasPercentage > 100 {
    return nil, fmt.Errorf("miner.targetGasPercentage must be between 1-100, got %d", c.Sealer.TargetGasPercentage)
}

Edge Cases

6. Pre-Dandeli Blocks Not Affected

File: consensus/misc/eip1559/eip1559_test.go:789-831

Good test coverage for pre-Dandeli blocks still requiring correct base fee validation. The backward compatibility is properly maintained.

7. Boundary Block at Dandeli Activation

The code checks IsDandeli(header.Number) for the header being validated, which is correct. However, the tests could benefit from explicit testing of the exact block where Dandeli activates.

8. Integer Overflow in Gas Target Calculation

File: consensus/misc/eip1559/eip1559.go:119-120

targetPercentage := config.Bor.GetTargetGasPercentage(parent.Number)
return parent.GasLimit * targetPercentage / 100

Observation: For very large gas limits (approaching uint64 max), parent.GasLimit * targetPercentage could overflow before the division. While current gas limits are far from this, it's worth noting.


Code Quality

9. Good Validation with Fallbacks

The validation in GetTargetGasPercentage and GetBaseFeeChangeDenominator with appropriate fallbacks to hard-fork defaults is well implemented.

10. Comprehensive Test Coverage

The test file adds 443 lines of tests covering:

  • Dynamic target gas percentage changes
  • Dynamic base fee denominator changes
  • Invalid parameter handling (zero, >100%)
  • Pre/post Dandeli validation behavior
  • Nil config handling

Documentation

The CLI documentation in docs/cli/server.md is updated appropriately with the new flags.


Summary of Recommendations

Priority Issue Recommendation
High Base fee validation removed Document threat model; consider minimum bounds
High Zero base fee allowed Consider enforcing minimum base fee
Medium No startup validation Add validation in buildEth for invalid values
Medium Silent fallbacks Consider failing loudly on misconfiguration
Low Integer overflow potential Add overflow check or document constraints

Overall, the code is well-structured with good test coverage, but the removal of base fee validation is a significant trust shift that should be carefully considered from a network security perspective.

@lucca30 lucca30 requested a review from a team January 26, 2026 21:15
Copy link
Copy Markdown
Contributor

@cffls cffls left a comment

Choose a reason for hiding this comment

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

Looks good overall. If possible, could you add an integration test (tests/bor/bor_test.go) that simulates the scenario where the BP changes these parameters at a certain block and the block still get accepted by a validator?

@sonarqubecloud
Copy link
Copy Markdown

Copy link
Copy Markdown
Contributor

@cffls cffls left a comment

Choose a reason for hiding this comment

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

@claude Can you review this PR, focusing on safety and performance? Provide a summary as a comment highlighting any concerns related to these changes.

@claude
Copy link
Copy Markdown

claude bot commented Jan 28, 2026

Claude finished @lucca30's task in 1m 29s —— View job


Reviewing PR #1989: Dynamic EIP-1559 params setup

  • Analyze changed files focusing on safety and performance
  • Review the EIP-1559 validation logic changes
  • Examine boundary limit implementation
  • Check configuration and startup validation
  • Review test coverage for edge cases
  • Provide summary with safety and performance concerns

Summary

This PR introduces dynamic configuration of EIP-1559 parameters (TargetGasPercentage and BaseFeeChangeDenominator) after the Dandeli hard fork, with a critical 5% boundary limit on base fee changes. This is a well-designed change that addresses the previous review concern about unrestricted base fee changes.


Safety Analysis

Strengths

  1. 5% Boundary Limit is Well-Implemented (consensus/misc/eip1559/eip1559.go:30-36, 72-97)

    • The MaxBaseFeeChangePercent = 5 constant limits base fee volatility
    • Both CalcBaseFee (production) and VerifyEIP1559Header (validation) enforce this limit
    • This is a significant safety improvement from the earlier version that skipped validation entirely
  2. Dual Enforcement - The boundary is enforced in two places:

    • In CalcBaseFee (lines 119-155): Caps the calculated base fee change
    • In verifyBaseFeeWithinBoundaries (lines 75-97): Validates incoming blocks
    • This ensures blocks produced with aggressive parameters are still bounded
  3. Startup Validation for TargetGasPercentage (internal/cli/server/config.go:1216-1218)

    if c.Sealer.TargetGasPercentage > 100 {
        return nil, fmt.Errorf("miner.targetGasPercentage must be between 1-100, got %d", c.Sealer.TargetGasPercentage)
    }
  4. Comprehensive Test Coverage

    • eip1559_basefee_boundary_test.go: Tests boundary enforcement at various percentages
    • TestAggressiveParametersExceedBoundary: Verifies aggressive configs (denominator=4,8,16) are capped
    • TestDefaultParametersWithinBoundary: Documents default behavior (~1.7% max change)
    • Integration test in bor_config_change_test.go: End-to-end validation

Addressing @cffls's Question

Q: Is it possible for a BP to set values resulting in >5% base fee change?

A: No - Even with extreme parameter values, the 5% cap is enforced:

  1. At Block Production (CalcBaseFee, lines 136-138 and 153-155):

    if applyBoundaryCap && num.Cmp(maxAllowedChange) > 0 {
        num.Set(maxAllowedChange)
    }
  2. At Block Validation (verifyBaseFeeWithinBoundaries, lines 90-94):

    if actualChange.Cmp(maxAllowedChange) > 0 {
        return fmt.Errorf("baseFee change exceeds %d%% limit...", MaxBaseFeeChangePercent, ...)
    }

The test TestAggressiveParametersExceedBoundary explicitly verifies this with denominator=4 (extremely aggressive) and confirms the change is capped at 5%.


Potential Concerns

⚠️ Missing Startup Validation for BaseFeeChangeDenominator

File: internal/cli/server/config.go:1221-1223

if c.Sealer.BaseFeeChangeDenominator > 0 {
    n.Genesis.Config.Bor.BaseFeeChangeDenominator = &c.Sealer.BaseFeeChangeDenominator
}

Unlike TargetGasPercentage which validates > 100, BaseFeeChangeDenominator accepts any non-zero value. While runtime validation exists in params/protocol_params.go:254-260 with fallback behavior, there's no minimum denominator validation at startup.

Impact: Low - The boundary cap protects against aggressive values anyway, but it would be cleaner to warn users at startup if they configure something like --miner.base-fee-change-denominator=1.

Recommendation: Consider adding a sanity check:

if c.Sealer.BaseFeeChangeDenominator > 0 && c.Sealer.BaseFeeChangeDenominator < 8 {
    log.Warn("BaseFeeChangeDenominator is very aggressive, changes will be capped at 5%", 
        "configured", c.Sealer.BaseFeeChangeDenominator)
}

Add sanity check →


⚠️ Node Heterogeneity - Different BP Configurations

File: params/config.go:901-902

TargetGasPercentage      *uint64 `json:"-"` // Post-Dandeli: target gas as % of gas limit
BaseFeeChangeDenominator *uint64 `json:"-"` // Post-Dandeli: base fee change rate

These are runtime-only parameters (json:"-") not persisted in genesis or blocks. Different block producers can run with different values, which means:

  • A BP with denominator=8 will calculate higher base fees than one with denominator=64
  • The boundary cap ensures validators still accept these blocks

Impact: Low to Medium - This is by design for operational flexibility, but may cause some unpredictability in base fee behavior depending on which BP produced the block.


Performance Analysis

No Performance Concerns

  1. BigInt Operations: The boundary calculations use standard big.Int operations (Mul, Div, Sub, Cmp) which are already used extensively in the base fee calculation path. No additional allocations beyond what's already there.

  2. Constant-time Checks: The boundary validation is O(1) - just a few big integer operations per block.

  3. No Additional Database/Network Operations: The changes don't add any I/O or network calls.


Test Coverage Assessment

Area Coverage Notes
Boundary enforcement ✅ Excellent Multiple test cases for increase/decrease
Aggressive parameters ✅ Excellent Tests denominator=4,8,16
Pre-Dandeli compatibility ✅ Good Verifies strict validation before fork
Startup validation ✅ Good Tests invalid percentage values
Integration ✅ Good End-to-end test with 2 validators

Conclusion

This PR is well-designed from a safety perspective. The 5% boundary cap is the critical safeguard that addresses the previous concern about unrestricted base fee changes. The implementation enforces this limit both at block production and validation, ensuring network-wide protection regardless of individual node configurations.

The minor suggestions above are improvements rather than blockers.

Copy link
Copy Markdown
Contributor

@cffls cffls left a comment

Choose a reason for hiding this comment

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

Looks like my concern has already been addressed. LGTM!

@lucca30 lucca30 merged commit dacb243 into develop Jan 28, 2026
27 checks passed
marcello33 added a commit that referenced this pull request Feb 18, 2026
* eth/filters: uninstall subscription in filter apis on error (#32894)

Fix ethereum/go-ethereum#32893.

In the previous ethereum/go-ethereum#32794, it
only handles the pending tx filter, while there are also head and log
filters. This PR applies the patch to all filter APIs and uses `defer`
to maintain code consistency.

* triedb, core/rawdb: implement the partial read in freezer (#32132)

This PR implements the partial read functionalities in the freezer, optimizing
the state history reader by resolving less data from freezer.

---------

Signed-off-by: jsvisa <delweng@gmail.com>
Co-authored-by: Gary Rong <garyrong0905@gmail.com>

* p2p/enode: optimize LogDist (#32887)

This speeds up LogDist by 75% using 64-bit operations instead
of byte-wise XOR.

---------

Co-authored-by: Felix Lange <fjl@twurst.com>

* p2p/enode: optimize DistCmp (#32888)

This speeds up DistCmp by 75% through using 64-bit operations instead of
byte-wise XOR.

* core/txpool/legacypool: move queue out of main txpool (#32270)

This PR move the queue out of the main transaction pool.
For now there should be no functional changes.
I see this as a first step to refactor the legacypool and make the queue
a fully separate concept from the main pending pool.

---------

Signed-off-by: Csaba Kiraly <csaba.kiraly@gmail.com>
Co-authored-by: Csaba Kiraly <csaba.kiraly@gmail.com>

* cmd/workload: filter fuzzer test (#31613)

This PR adds a `filterfuzz` subcommand to the workload tester that
generates requests similarly to `filtergen` (though with a much smaller
block length limit) and also verifies the results by retrieving all
block receipts in the range and locally filtering out relevant results.
Unlike `filtergen` that operates on the finalized chain range only,
`filterfuzz` does check the head region, actually it seeds a new query
at every new chain head.

* p2p/discover: wait for bootstrap to be done (#32881)

This ensures the node is ready to accept other nodes into the
table before it is used in a test.

Closes #32863

* triedb/pathdb: catch int conversion overflow in 32-bit (#32899)

The limit check for `MaxUint32` is done after the cast to `int`. On 64
bits machines, that will work without a problem. On 32 bits machines,
that will always fail. The compiler catches it and refuses to build.

Note that this only fixes the compiler build. ~~If the limit is above
`MaxInt32` but strictly below `MaxUint32` then this will fail at runtime
and we have another issue.~~ I checked and this should not happen during
regular execution, although it might happen in tests.

* eth/catalyst: remove useless log on enabling Engine API (#32901)

* eth: do not warn on switching from snap sync to full sync (#32900)

This happens normally after a restart, so it is better to use Info level
here.

Signed-off-by: Csaba Kiraly <csaba.kiraly@gmail.com>

* core/txpool/legacypool: fix pricedList updates (#32906)

This pr addresses a few issues brought by the #32270 

- Add updates to pricedList after dropping transactions.
- Remove redundant deletions in queue.evictList, since
pool.removeTx(hash, true, true) already performs the removal.
- Prevent duplicate addresses during promotion when Reset is not nil.

* accounts/abi: check presence of payable fallback or receive before proceeding with transfer (#32374)

remove todo

* internal/ethapi: convert legacy blobtx proofs in sendRawTransaction (#32849)

This adds a temporary conversion path for blob transactions with legacy
proof sidecar. This feature will activate after Fusaka. We will phase
this out when the fork has sufficiently settled and client side
libraries have been upgraded to send the new proofs.

* rpc: fix flaky test TestServerWebsocketReadLimit (#32889)

* eth/protocols/eth: reject message containing duplicated txs and drop peer (#32728)

Drop peer if sending the same transaction multiple times in a single message.

Fixes ethereum/go-ethereum#32724


---------

Signed-off-by: Csaba Kiraly <csaba.kiraly@gmail.com>
Co-authored-by: Gary Rong <garyrong0905@gmail.com>
Co-authored-by: Csaba Kiraly <csaba.kiraly@gmail.com>

* p2p/discover: remove hot-spin in table refresh trigger (#32912)

This fixes a regression introduced in #32518. In that PR, we removed the
slowdown logic that would throttle lookups when the table runs empty.
Said logic was originally added in #20389.

Usually it's fine, but there exist pathological cases, such as hive
tests, where the node can only discover one other node, so it can only
ever query that node and won't get any results. In cases like these, we
need to throttle the creation of lookups to avoid crazy CPU usage.

* version: release go-ethereum v1.16.5 stable

* version: begin v1.16.6 release cycle

* cmd/geth: log current key in expandVerkle instead of keylist[0] (#32689)

Fix logging in the verkle dump path to report the actual key being
processed.
Previously, the loop always logged keylist[0], which misled users when
expanding multiple keys and made debugging harder. This change aligns
the
log with the key passed to root.Get, improving traceability and
diagnostics.

* ethclient: add support for eth_simulateV1 (#32856)

Adds ethclient support for the eth_simulateV1 RPC method, which allows
simulating transactions on top of a base state without making changes to
the blockchain.

---------

Co-authored-by: Sina Mahmoodi <itz.s1na@gmail.com>

* internal/ethapi: add eth_SendRawTransactionSync (#32830)

New RPC method eth_sendRawTransactionSync(rawTx, timeoutMs?) that
submits a signed tx and blocks until a receipt is available or a timeout
elapses.

Two CLI flags to tune server-side limits:

--rpc.txsync.defaulttimeout (default wait window)

--rpc.txsync.maxtimeout (upper bound; requests are clamped)

closes ethereum/go-ethereum#32094

---------

Co-authored-by: aodhgan <gawnieg@gmail.com>
Co-authored-by: Sina Mahmoodi <itz.s1na@gmail.com>

* core/state: state copy bugfixes with Verkle Trees (#31696)

This change addresses critical issues in the state object duplication
process specific to Verkle trie implementations. Without these
modifications, updates to state objects fail to propagate correctly
through the trie structure after a statedb copy operation, leading to
inaccuracies in the computation of the state root hash.

---------

Co-authored-by: Guillaume Ballet <3272758+gballet@users.noreply.github.com>

* eth/ethconfig : fix eth generate config (#32929)

* eth, internal: add blob conversion for SendRawTransactionSync (#32930)

* solve conflicts

* cmd/utils: use maximum uint64 value for receipt chain insertion (#32934)

* use context for witness and fix its test

* fix witness test due to state type change

* remove geth discarded code / reformat

* fix AnnouncementsOnly tests

* tracers data edits due to tests run

* eth/fetcher: add metrics for tracking slow peers (#32964)

This PR introduces two new metrics to monitor slow peers
- One tracks the number of slow peers.
- The other measures the time it takes for those peers to become
"unfrozen"

These metrics help with monitoring and evaluating the need for future
optimization of the transaction fetcher and peer management, for example i
n peer scoring and prioritization.

Additionally, this PR moves the fetcher metrics into a separate file, 
`eth/fetcher/metrics.go`.

* eth/fetcher: remove dangling peers from alternates (#32947)

This PR removes dangling peers in `alternates` map

In the current code, a dropped peer is removed from alternates for only
the specific transaction hash it was requesting. If that peer is listed
as an alternate for other transaction hashes, those entries still stick
around in alternates/announced even though that peer already got
dropped.

* triedb/pathdb: fix index out of range panic in decodeSingle (#32937)

Fixes TestCorruptedKeySection flaky test failure.
https://github.com/ethereum/go-ethereum/actions/runs/18600235182/job/53037084761?pr=32920

* core/types: prealloc map in HashDifference as in TxDifference (#32946)

* eth/filters: avoid rebuild the hash map multi times (#32965)

* core/vm: don't call SetCode after contract creation if initcode didn't return anything (#32916)

The code change is a noop here, and the tracing hook shouldn't be
invoked if the account code doesn't actually change.

* cmd/keeper: use the ziren keccak precompile (#32816)

Uses the go module's `replace` directive to delegate keccak computation
to precompiles.

This is still in draft because it needs more testing. Also, it relies on
a PR that I created, that hasn't been merged yet.

_Note that this PR doesn't implement the stateful keccak state
structure, and it reverts to the current behavior. This is a bit silly
since this is what is used in the tree root computation. The runtime
doesn't currently export the sponge. I will see if I can fix that in a
further PR, but it is going to take more time. In the meantime, this is
a useful first step_

* params: enable osaka on dev mode (#32917)

enables the osaka fork on dev mode

---------

Co-authored-by: Sina Mahmoodi <itz.s1na@gmail.com>

* core/txpool: Initialize journal writer for tx tracker (#32921)

Previously, the journal writer is nil until the first time rejournal
(default 1h), which means during this period, txs submitted to this node
are not written into journal file (transactions.rlp). If this node is
shutdown before the first time rejournal, then txs in pending or queue
will get lost.

Here, this PR initializes the journal writer soon after launch to solve
this issue.

---------

Co-authored-by: Gary Rong <garyrong0905@gmail.com>

* core/state: prevent SetCode hook if contract code is not changed (#32980)

This PR prevents the SetCode hook from being called when the contract
code
remains unchanged.

This situation can occur in the following cases:
- The deployed runtime code has zero length
- An EIP-7702 authorization attempt tries to unset a non-delegated
account
- An EIP-7702 authorization attempt tries to delegate to the same
account

* triedb/pathdb: make batch with pre-allocated size (#32914)

In this PR, the database batch for writing the history index data is
pre-allocated.

It's observed that database batch repeatedly grows the size of the
mega-batch,
causing significant memory allocation pressure. This approach can
effectively
mitigate the overhead.

* bump codeql versions

* cmd/geth: add flag to set genesis (#32844)

This PR is an alternative to #32556.

Instead of trying to be smart and reuse `geth init`, we can introduce a
new flag `--genesis` that loads the `genesis.json` from file into the
`Genesis` object in the same path that the other network flags currently
work in.

Question: is something like `--genesis` enough to start deprecating
`geth init`?

--

```console
$ geth --datadir data --hoodi
..
INFO [10-06|22:37:11.202]  - BPO2:                        @1762955544
..
$ geth --datadir data --genesis genesis.json
..
INFO [10-06|22:37:27.988]  - BPO2:                       @1862955544
..
```

Pull the genesis [from the
specs](https://raw.githubusercontent.com/eth-clients/hoodi/refs/heads/main/metadata/genesis.json)
and modify one of the BPO timestamps to simulate a shadow fork.

---------

Co-authored-by: rjl493456442 <garyrong0905@gmail.com>

* core/types: remove unused `ErrInvalidTxType` var (#32989)

The var `ErrInvalidTxType` is never used in the code base.

* blockAlloc test

* core/state: fix the flaky TestSizeTracker (#32993)

* cmd/devp2p: distinguish the jwt in devp2p and geth (#32972)

This PR fixes some docs for the devp2p suite and uses the CLI library's required value instead of manually checking if required flags are passed.

* p2p: silence on listener shutdown (#33001)


Co-authored-by: Felix Lange <fjl@twurst.com>

* cmd/utils: use IsHexAddress method (#32997)

Using the `IsHexAddress` method will result in no gaps in the
verification logic, making it simpler.

* crypto: implement ziren keccak state (#32996)

The #32816 was only using the keccak precompile for some minor task.
This PR implements a keccak state, which is what is used for hashing the
tree.

* rpc: fix a flaky test of the websocket (#33002)

Found in
https://github.com/ethereum/go-ethereum/actions/runs/17803828253/job/50611300621?pr=32585

```
--- FAIL: TestClientCancelWebsocket (0.33s)
panic: read tcp 127.0.0.1:36048->127.0.0.1:38643: read: connection reset by peer [recovered, repanicked]

goroutine 15 [running]:
testing.tRunner.func1.2({0x98dd20, 0xc0005b0100})
	/opt/actions-runner/_work/_tool/go/1.25.1/x64/src/testing/testing.go:1872 +0x237
testing.tRunner.func1()
	/opt/actions-runner/_work/_tool/go/1.25.1/x64/src/testing/testing.go:1875 +0x35b
panic({0x98dd20?, 0xc0005b0100?})
	/opt/actions-runner/_work/_tool/go/1.25.1/x64/src/runtime/panic.go:783 +0x132
github.com/ethereum/go-ethereum/rpc.httpTestClient(0xc0001dc1c0?, {0x9d5e40, 0x2}, 0xc0002bc1c0)
	/opt/actions-runner/_work/go-ethereum/go-ethereum/rpc/client_test.go:932 +0x2b1
github.com/ethereum/go-ethereum/rpc.testClientCancel({0x9d5e40, 0x2}, 0xc0001dc1c0)
	/opt/actions-runner/_work/go-ethereum/go-ethereum/rpc/client_test.go:356 +0x15f
github.com/ethereum/go-ethereum/rpc.TestClientCancelWebsocket(0xc0001dc1c0?)
	/opt/actions-runner/_work/go-ethereum/go-ethereum/rpc/client_test.go:319 +0x25
testing.tRunner(0xc0001dc1c0, 0xa07370)
	/opt/actions-runner/_work/_tool/go/1.25.1/x64/src/testing/testing.go:1934 +0xea
created by testing.(*T).Run in goroutine 1
	/opt/actions-runner/_work/_tool/go/1.25.1/x64/src/testing/testing.go:1997 +0x465
FAIL	github.com/ethereum/go-ethereum/rpc	0.371s
```

In `testClientCancel` we wrap the server listener in `flakeyListener`,
which schedules an unconditional close of every accepted connection
after a random delay, if the random delay is zero then the timer fires
immediately, and then the http client paniced of connection reset by
peer.

Here we add a minimum 10ms to ensure the timeout won't fire immediately.

Signed-off-by: jsvisa <delweng@gmail.com>

* remove TODOs

* eth/tracers: fix crasher in TraceCall with BlockOverrides (#33015)

fix ethereum/go-ethereum#33014

---------

Co-authored-by: lightclient <lightclient@protonmail.com>

* .gitea/workflows, build: add release build for keeper (#32632)

* build: fix keeper build (#33018)

At the time keeper support was added into ci.go, we were using a go.work
file to make ./cmd/keeper accessible from within the main go-ethereum
module. The workspace file has since been removed, so we need to build
keeper from within its own module instead.

* core/rawdb, triedb/pathdb: re-structure the trienode history header (#32907)

In this PR, several changes have been made:

(a) restructure the trienode history header section

Previously, the offsets of the key and value sections were recorded before 
encoding data into these sections. As a result, these offsets referred to the
start position of each chunk rather than the end position.

This caused an issue where the end position of the last chunk was
unknown, making it incompatible with the freezer partial-read APIs. 
With this update, all offsets now refer to the end position, and the 
start position of the first chunk is always 0.

(b) Enable partial freezer read for trienode data retrieval

The partial freezer read feature is now utilized in trienode data
retrieval, improving efficiency.

* rpc: remove unused vars (#33012)

* core/state: improve accessList copy (#33024)

* remove validate_pr workflow

* fix lint

* core: don't modify the shared chainId between tests (#33020)

* fix config rpc

* core/types: optimize modernSigner.Equal (#32971)

Equal is called every time the transaction sender is accessed,
even when the sender is cached, so it is worth optimizing.

---------

Co-authored-by: Felix Lange <fjl@twurst.com>

* core: refine condition for using legacy chain freezer directory (#33032)

* internal/jsre: pass correct args to setTimeout/setInterval callbacks (#32936)

## Description
- Summary: Correct the JS timer callback argument forwarding to match
standard JS semantics.
- What changed: In `internal/jsre/jsre.go`, the callback is now invoked
with only the arguments after the callback and delay.
- Why: Previously, the callback received the function and delay as
parameters, causing unexpected behavior and logic bugs for consumers.

* .github: add 32-bit CI targets (#32911)

This adds two new CI targets. One is for building all supported keeper
executables, the other is for running unit tests on 32-bit Linux.

---------

Co-authored-by: Felix Lange <fjl@twurst.com>

* accounts/abi/bind/v2: fix error assertion in test (#33041)

* p2p: cleanup v4 if v5 failed (#33005)

Clean the previous resource (v4) if the latter (v5) failed.

* common: simplify FileExist helper (#32969)

* eth/downloader: fix incorrect waitgroup in test `XTestDelivery` (#33047)

* eth/tracers: fix prestateTracer for EIP-6780 SELFDESTRUCT (#33050)

fix ethereum/go-ethereum#33049

* common: fix duration comparison in PrettyAge (#33064)

This pull request updates `PrettyAge.String` so that the age formatter
now treats exact unit boundaries (like a full day or week) as that unit
instead of spilling into smaller components, keeping duration output
aligned with human expectations.

* core/rawdb: fix db inspector by supporting trienode history (#33087)

* params: set osaka and BPO1 & BPO2 mainnet dates (#33063)

Sets the fusaka, bpo1, bpo2 timestamps for mainnet
see: https://notes.ethereum.org/@bbusa/fusaka-bpo-timeline

* version: release go-ethereum v1.16.6

* version: begin v1.16.7 release cycle

* go.mod: update to c-kzg v2.1.5 (#33093)

We unfortunately missed this update for the Geth v1.16.6 release, but it is critical.

* version: release go-ethereum v1.16.7 stable

* fix lint

* miner: set maxBlockSizeBufferZone to zero

* cmd: go mod tidy

* eth/protocols/wit: made protocol version consistent (#1940)

* chore: fix function name in comment and correct spelling error in config.go (#1956)

Signed-off-by: findfluctuate <findfluctuate@outlook.com>

* chore: remove repetitive word in comment (#1909)

Signed-off-by: liuyueyangxmu <liuyueyangxmu@outlook.com>

* core/txpool: added nil checks to prevent crash in stateless mode (#1961)

* Enforce patch code coverage (#1964)

* Enforce patch code coverage

* Use CODECOV_TOKEN explicitly

* consensus/bor,core,eth,internal/ethapi,tests: regen mocks and fix tests

* eth: fix lint

* internal/ethapi: fix tests

* eth: skip TestBlobTransactionAnnounce

* core, eth: added LRU memory cache to save witnesses in memory (#1962)

* core, eth: added LRU memory cache to save 256 witnesses in memory

* core: added unit test for LRU witness cache

* added a wrapper function to write witness in the db and add cache

* minor check

* added more tests to increase coverage

* fix lint

* update tests

* core: rm redundant updation of queuedEvictionMeter

* internal/cli: port txsync flags to new-cli

* eth, internal: add logquerylimit into internal cli

* chore: fix linter

* consensus/bor: ensure late blocks have sufficient build time (#1963)

* consensus/bor: ensure late blocks have sufficient build time

When a parent block is sealed late (actual seal time exceeds its timestamp), the next block had insufficient time to include transactions, resulting in empty blocks.

Problem:
- Parent block timestamp: T=2s, sealed at T=4s (2s late)
- Next block gets timestamp: parent + period = 4s
- Current time: 4s
- Build time available: 0s → empty block

Solution:
Set header.Time = now + blockPeriod when scheduled time has passed, giving blocks full build time regardless of parent seal latency.

* Address comment

* version: begin v1.16.8 release cycle

* core/txpool: drop peers on invalid KZG proofs

Co-authored-by: Gary Rong <garyrong0905@gmail.com>
Co-authored-by: MariusVanDerWijden <m.vanderwijden@live.de>:

* crypto/ecies: use aes blocksize

Co-authored-by: Gary Rong <garyrong0905@gmail.com>

* version: release go-ethereum v1.16.8 stable

* Return nil from heimdall mock on milestone/checkpoint (#1988)

* fix randomly failing TestCalcBaseFeeDelhi (#1987)

* Increase veblop timeout to 8 seconds (#1986)

* track cache metrics on bps

* track commit time of a block on bp

* finalize and assemble metrics

* intermediate root timer

* tests

* fix integration tests

* simplify test

* lint issue

* blockchain reader tests

* more tests

* more bor tests

* fix lint

* handle duplicate lines

* more improvs on duplicates

* more duplicate handling

* ignore test utils for coverage and more tests

* update code cov

* fix ingore regex

* moving test helpers to test files

* remove unnecessary verkle on beacon and more bor coverage

* fix(rpc): eth_simulateV1 method handler crash (#1955)

* Verify BlobScheduleConfig before calling CalcBlobFee

* set Nil withdrawals for bor simulation

* simChainHeadReader implements core.BorStateSyncer

* simplify fork checking

* lint fixing

* Add non nil chainConfig for testcase

---------

Co-authored-by: Pratik Patil <pratikspatil024@gmail.com>

* txpool: add stuck transaction rebroadcast mechanism (#1992)

* txpool: add stuck transaction rebroadcast mechanism

When transactions are broadcast to peers, they're marked as "known" in each peer's knownTxs cache. If the network send fails or the peer fails to request transaction body, the peer will never receive the transaction but the hash remains in knownTxs, preventing future rebroadcasts and causing transactions to get stuck.

This change adds a periodic rebroadcast mechanism that:
- Identifies immediately executable transactions older than RebroadcastInterval but younger than RebroadcastMaxAge
- Clears their hashes from peers' knownTxs caches
- Rebroadcasts them to the network

* minor fix

* Update default rebroadcast interval to 30s

* add tests

* Address comments

* fix: add bor hfs to description and readheadertimeout in config (#2003)

* init: CLAUDE.md file (#2000)

* init: CLAUDE.md file

* chore: add some core component and maintaining this file section

* chore: add before making changes section

* consensus/eip1559: add bhilai HF tests and minor refactor (#1990)

* Validator Set Overrides on Config (#1958)

* validator set overrides

* including config of mainnet in missing files

* more tests for coverage

* remove duplication

* Add Claude Assistant Workflows (#2006)

* Add workflow fils

* Disallow external contributors

* Use opus

* bind, params: fix bind/v2 tests and warn about invalid config/flag (#2007)

* Switch to GCR

* chore: fix lint and tidy cmd

* params: change forks order

* common: check for err

* eth: fix config test

* fix(ci): use custom kurtosis branch (#2012)

* core, eth, internal: fix tests

* core, internal: defensive unsubscribe on headers chan

* cmd, p2p: fix bug and return on error

* chore: fix lint

* eth: implemented peer consensus based witness verification (#1766)

* eth: implemented peer consensus based witness verification

* eth/fetcher: update peer drop mechanism

* eth: added dynamic page limit for witness based on gas limit

* eth: fix lint

* eth: download witness within limit and block for verificatio

* eth: fix lint

* eth, core: added a check to fix a potential vulnerability and added test case

* eth, core: include the original peer in the consenses to get consenses between 3 peers

* eth: implemented RequestWitnessPageCount

* eth: implemented wit/2 and added new message type to get the witness metadata

* eth: updated mock file

* eth: removed code duplication

* eth: dropping peer immediately when page count verification fails

* eth: added more  comments

* eth/fetcher: removed the witness verification cache

* eth: excluded the original peer from the selection

* eth: using peer jailing

* eth: more jailing when bahaving maliciously

* renamed wit1 to wit0 and wit2 to wit1

* added tests

* added more tests

* fixed code duplication and lint

* eth: added unit tests

* eth: added unit tests for handleGetWitnessMetadata and the GetWitnessMetadataPacket case in Handle

* eth: added unit tests for RequestWitnessMetadata and ReplyWitnessMetadata

* eth/protocols/wit: added unit test for handleGetWitnessMetadata and handleWitnessMetadata

* eth/protocols/wit: fixed panic in TestReplyWitnessMetadata

* eth/protocols/wit: added unit test to verify wit/1 map and switch between protocols

* eth: covered remaining lines in peer.go

* eth: covered remaining lines in handler_eth.go

* eth: smaller test to increase coverage

* eth: test to test the handler's Handle function

* eth: test remaining jail peer function

* eth: fixed panic

* eth: added get the gas limit from parent header, fallback to config if unavailable

* eth/fetcher: updated unit test to test calculatePageThreshold

* eth: added metrics for peer witness verification

* reduced code duplication in unit tests

* eth/protocols/wit: donot update the version number of wit0

* chore: fix lint

* internal/cli: port TrieJournalDirectory and EnableStateSizeTracking

* Various improvements  (#1950)

* consensus: avoid mixed fork root hash (#18)

* consensus, core: state sync txs limits (#20)

* eth/downloader: solve milestones whitelist concurrency bug (#22)

* eth/downloader: fix test (#22)

* eth: fix merkle root reorg on nil chain (#23)

* consensus/bor/heimdallgrpc: fix grpc client (#12)

* Revert "consensus, core: state sync txs limits (#20)"

This reverts commit fdbbccc.

* core: fix stateSync inner mismatch (issue 34)

* miner: fix flaky commitInterrupt tests

* chore: minor fixes on heimdall grpc client

* cmd: tidy on cmd package

* chore: fix lint

* ci: load kurtosis images from gcr instead of docker hub (#2014)

* chore: remove `cd` for `working-directory`

* chore: free disk space directly in the kurtosis pre-run step

* chore: regroup build steps

* chore: use kurtosis-pos pre and post actions

* ci: parallel docker builds

* chore: remove kurtosis-pos path

* ci: fix workflow permissions

* fix: typo

* chore: move permissions at the job level

* test

* fix: job order

* chore: nit

* fix: install polycli

* chore: nit

* chore: log local image info

* Dynamic EIP-1559 params setup (#1989)

* remove base fee validation

* moving flags to miner setup

* set values properly

* proper format

* claude feedback and coverage

* minor missing cover scenario

* lint fix

* remove claude ignore

* remove duplicate and fix tests

* increase coverage

* lint

* Including integration tests for config changes and params divergence

* boundary limits

* race condition fix

* Test validator's ability to rewind upon span rotation (#1960)

* Test validator's ability to rewind upon span rotation

* Add unit tests

* Remove dup code

* Parallelize tests

* eth/protocols/eth: remove todo in p2p handlers

* core: made parallel state processor and state processor consistent, to accept ChainContext

* eth/tracers: include state sync tx in traces post-Madhugiri (#2010)

* chore: fix lint

* eth: fix concurrent map writes panic in witness protocol (#2023)

Protect failedRequests map access with mapsMu lock in receiveWitnessPage and buildWitnessRequests to prevent "concurrent map writes" panic when multiple goroutines update retry counts simultaneously.

* eth/fetcher: skip blob related test

* core: (blockstm) added a check to discard negative tx dependencies

* fix(api): tracers tests for state-sync tx (#2026)

* Updating enodes for mainnet and amoy (#2021)

* Updating enodes for mainnet and amoy

* Fixed formatting

* pruner: covering reorg scenarios (#1916)

* pruning with reorg resistance

* offline reorg logic

* extra test

* cover beyond head test scenario

* consensus/bor: use CodeChangeUnspecified

* Fix race conditions detected in make test-race

Also added a nightly github action that runs race condition check

* Address CR comments

* Enable rebroadcast by default (#2028)

* revert: P256VerifyGas to 3450 (#2030)

* revert: P256VerifyGas to 3450

* fix: testdata

* chore: add eip7951 to p256Verify precompile

* delete: crypto/secp256r1/publickey.go

* fix(ci): use state-sync action

* fix(ci): test-state-sync (#2032)

* fix(ci): test-state-sync

* chore: rename actions

* chore: nits

* Enable rebroadcast by default (#2028) (#2037)

* Install polycli in kurtosis e2e (#2036)

This is required by opcode test in kurtosis_smoke_test.sh

* lisovo: CLZ opcode and P256 gas cost changes (#2040)

* tbdhf: CLZ opcode and P256 gas cost changes

* chore: nits

* revert: state-sync test change

* chore: nit

* chore: final nit

* fix: test

* chore: rename to lisovo

* feat: flexible base fee on lisovo HF (#2041)

* covering super low fee scenario

* moving configurable rules to lisovo

* fix missing tests

* chore: add amoy hf block number

---------

Co-authored-by: Lucca Martins <lucca_martins30@yahoo.com.br>

* chore: bump version

* consensus/misc/eip4844: small update to fix simulatev1 crash (#2054)

* core, internal, params: lisovoPro HF and version bump (#2055)

* core, internal, params: lisovoPro HF and version bump

* core: add lisovoPro instructionset

* core: lisovo-lisovoPro instructionset test

* consensus/bor: fix goroutine leak in runMilestoneFetcher when Heimdall is unreachable (#2056)

FetchMilestone was called with context.Background(), which has no deadline. When Heimdall becomes unreachable, FetchWithRetry enters an infinite retry loop that never returns. Since the ticker fires every second, a new blocked goroutine accumulates each tick — leading to OOM within minutes.

Add a 30s context timeout to bound each call, matching the existing pattern in retryHeimdallHandler (eth/backend.go). This caps in-flight goroutines at ~30 instead of growing unboundedly.

* fix(shutdown): cancel in-flight Heimdall queries on engine shutdown (#2058)

* fix(shutdown): cancel in-flight Heimdall queries on engine shutdown

* chore: nit

* consensus/bor: fix sub-second late block detection producing empty blocks (#2060)

The late-block adjustment in Prepare() uses an integer-second comparison
(header.Time < now.Unix()) to detect when a block is behind schedule and
needs additional build time. Because header.Time is an integer (seconds)
while the actual target time can have sub-second precision, a block can
be up to 999ms late without triggering the adjustment.

Example: with period=1s and parent.Time=T:

  header.Time        = T + 1                     (integer seconds)
  now                = T + 1.820                  (parent block is 820ms late)
  now.Unix()         = T + 1                      (truncated to seconds)
  header.Time < now.Unix() → false                (adjustment skipped!)

This affects both the default path (blockTime=0, where GetActualTime()
falls back to time.Unix(header.Time, 0)) and the custom blockTime path
(where ActualTime has sub-second precision from the parent cache chain).

With no adjustment, GetActualTime() returns a time already in the past.
The interrupt timer in commitWork() expires immediately, which sets the
interruptBlockBuilding flag before fillTransactions() runs. The txpool's
Pending() checks this flag on every address iteration and returns an
empty map, producing a block with 0 transactions even when the pool has
pending transactions.

Fix by replacing the integer comparison with a direct time comparison
against the block's actual target time:

  if now.After(header.GetActualTime()) {

GetActualTime() returns header.ActualTime when set (custom blockTime
with Rio, sub-second precision), or time.Unix(header.Time, 0) as
fallback (default path). This correctly detects lateness in both cases
without over-triggering for on-time blocks, since on-time blocks have
their target time in the future.

* fix(core): cap verifyPendingHeaders to prevent OOM from unbounded header reads (#2057)

* exp: disable verifyPendingHeaders

* fix: cap verify pending headers at default span length + 1

* fix: add reorg metrics in verify pending headers

* chore: add tests

* refactor: use milestone fetcher and milestone's end block as the start block

* fix: tests

* cmd: bump go

* builder, internal, params: pip-82 and lisovo HF in mainnet (#2064)

* builder, internal, params: implement new burnContract in lisovo / define lisovo height for mainnet / bump version

* fix lint

---------

Signed-off-by: jsvisa <delweng@gmail.com>
Signed-off-by: Csaba Kiraly <csaba.kiraly@gmail.com>
Signed-off-by: findfluctuate <findfluctuate@outlook.com>
Signed-off-by: liuyueyangxmu <liuyueyangxmu@outlook.com>
Co-authored-by: Lewis <lewis.kim@kaia.io>
Co-authored-by: Delweng <delweng@gmail.com>
Co-authored-by: Gary Rong <garyrong0905@gmail.com>
Co-authored-by: cui <cuiweixie@gmail.com>
Co-authored-by: Felix Lange <fjl@twurst.com>
Co-authored-by: Marius van der Wijden <m.vanderwijden@live.de>
Co-authored-by: Csaba Kiraly <csaba.kiraly@gmail.com>
Co-authored-by: Felföldi Zsolt <zsfelfoldi@gmail.com>
Co-authored-by: Guillaume Ballet <3272758+gballet@users.noreply.github.com>
Co-authored-by: Csaba Kiraly <cskiraly@users.noreply.github.com>
Co-authored-by: mishraa-G <divyansh.mishra.mec23@itbhu.ac.in>
Co-authored-by: Galoretka <galoretochka@gmail.com>
Co-authored-by: hero5512 <lvshuaino@gmail.com>
Co-authored-by: Sina Mahmoodi <itz.s1na@gmail.com>
Co-authored-by: aodhgan <36907214+aodhgan@users.noreply.github.com>
Co-authored-by: aodhgan <gawnieg@gmail.com>
Co-authored-by: Youssef Azzaoui <y@azzaoui.fr>
Co-authored-by: ucwong <ucwong@126.com>
Co-authored-by: CertiK <138698582+CertiK-Geth@users.noreply.github.com>
Co-authored-by: Bosul Mun <bsbs8645@snu.ac.kr>
Co-authored-by: maskpp <maskpp266@gmail.com>
Co-authored-by: jwasinger <j-wasinger@hotmail.com>
Co-authored-by: Kyrin <kyrincode@gmail.com>
Co-authored-by: lightclient <14004106+lightclient@users.noreply.github.com>
Co-authored-by: lightclient <lightclient@protonmail.com>
Co-authored-by: Rizky Ikwan <rizzikwann@gmail.com>
Co-authored-by: anim001k <140460766+anim001k@users.noreply.github.com>
Co-authored-by: Austin Larson <78000745+alarso16@users.noreply.github.com>
Co-authored-by: Coder <161350311+MamunC0der@users.noreply.github.com>
Co-authored-by: wit liu <wit765765346@gmail.com>
Co-authored-by: maradini77 <140460067+maradini77@users.noreply.github.com>
Co-authored-by: Pratik Patil <pratikspatil024@gmail.com>
Co-authored-by: findfluctuate <findfluctuate@outlook.com>
Co-authored-by: liuyueyangxmu <liuyueyangxmu@outlook.com>
Co-authored-by: Jerry <jerrycgh@gmail.com>
Co-authored-by: Lucca Martins <lucca_martins30@yahoo.com.br>
Co-authored-by: Angel Valkov <avalkov@polygon.technology>
Co-authored-by: Krishang <109511742+kamuikatsurgi@users.noreply.github.com>
Co-authored-by: kamuikatsurgi <shahkrishang11@gmail.com>
Co-authored-by: Raneet Debnath <35629432+Raneet10@users.noreply.github.com>
Co-authored-by: Manav Darji <manavdarji.india@gmail.com>
Co-authored-by: Raneet Debnath <raneetdebnath10@gmail.com>
Co-authored-by: ChanHongMing <91173675+ChanHongMing@users.noreply.github.com>
Co-authored-by: Adam Dossa <adossa@polygon.technology>
Co-authored-by: Adam Dossa <adam.dossa@gmail.com>
Co-authored-by: Léo Vincent <28714795+leovct@users.noreply.github.com>
Co-authored-by: Sanket Saagar Karan <ssaagar@polygon.technology>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants