security-fix: resolve critical network, state, and sandbox vulnerabilities#120
security-fix: resolve critical network, state, and sandbox vulnerabilities#120SIDDHANTCOOKIE wants to merge 2 commits into
Conversation
|
Important Review skippedNo new commits to review since the last review. ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
📝 WalkthroughWalkthroughThis PR replaces the flat transaction ChangesGas fee model and consensus hardening
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant CLI as CLI(main.py)
participant Chain as Chain.state
participant Mempool
participant Network
CLI->>Chain: verify_transaction_logic(tx)
Chain-->>CLI: ValidationStatus
alt VALID
CLI->>Mempool: add_transaction(tx)
CLI->>Network: broadcast(tx)
else INVALID
CLI-->>CLI: reject transaction
end
Possibly related PRs
Suggested labels: Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 5
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
main.py (1)
140-145: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winDo not evict future-nonce transactions as stale.
Line 145 removes any tx that fails current application; a valid nonce-gap transaction (
tx.nonce > expected_nonce) is not stale and should remain queued until earlier nonces arrive.Proposed fix
expected_nonce = temp_state.get_account(tx.sender).get("nonce", 0) if tx.nonce < expected_nonce: stale_txs.append(tx) continue + if tx.nonce > expected_nonce: + continue receipt = temp_state.validate_and_apply(tx)🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@main.py` around lines 140 - 145, The transaction handling in the apply/queue flow is marking every non-applied tx as stale, but future-nonce transactions from validate_and_apply should stay queued instead of being evicted. Update the logic around receipt handling in the tx processing block to distinguish nonce-gap cases (tx.nonce greater than the expected nonce) from truly stale transactions, and only append to stale_txs when the transaction is actually invalid or outdated; keep valid future-nonce txs pending for later processing.minichain/state.py (1)
57-96: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick winRun amount/gas well-formed validation inside
verify_transaction_logic().Line 57 is used by RPC/CLI/P2P before mempool insertion, but only
validate_and_apply_with_status()calls_amounts_well_formed(). A signed tx with negativeamount,gas_limit, ormax_fee_per_gascan pass pre-mempool validation, and non-integer values can raise while handling peer input.Proposed fix
def verify_transaction_logic(self, tx): from .validators import ValidationStatus + if not self._amounts_well_formed(tx): + logger.warning("Malformed tx %s: amount/gas fields must be non-negative integers", getattr(tx, "tx_id", "<unknown>")) + return ValidationStatus.MALFORMED + if not tx.verify(): logger.error("Error: Invalid signature for tx from %s...", tx.sender[:8]) return ValidationStatus.INVALID🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@minichain/state.py` around lines 57 - 96, `verify_transaction_logic()` currently skips the amount/gas semantic guard, so invalid transactions can pass pre-mempool checks or raise on bad peer input. Add the `_amounts_well_formed(tx)` validation at the start of `verify_transaction_logic()` in `State`, and fail fast with `ValidationStatus.FAILED` before any balance or nonce checks if `amount`, `gas_limit`, or `max_fee_per_gas` are not valid non-negative integers.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@main.py`:
- Around line 10-12: Update the top-level help text in HELP_TEXT so it matches
the command handlers’ current signatures. The entries for send, deploy, and call
should include the optional [gas_limit] [max_fee_per_gas] parameters, and you
should adjust the help strings in the help text definition rather than the
handlers themselves.
- Around line 228-229: The transaction validation check in the
`verify_transaction_logic` path is collapsing every non-VALID result into
`ValidationStatus.INVALID`, which loses the distinction between `FAILED` and
`INVALID`. Update the logic around `chain.state.verify_transaction_logic(tx)` to
return the exact status produced by state validation instead of remapping it, so
callers can handle `FAILED` without triggering peer penalties. Use the
`verify_transaction_logic` and `ValidationStatus` symbols to locate and adjust
the return flow.
In `@minichain/block.py`:
- Around line 135-140: The difficulty parsing in block.py only enforces an upper
bound, so negative values can still flow into PoW validation and make
validate_block_link_and_hash in chain.py accept invalid hashes. Update the
raw_diff/parsed_diff handling to reject negative difficulty values as well as
values above 256, ideally by validating parsed_diff immediately after conversion
and raising a ValueError for any value below zero.
In `@minichain/contract.py`:
- Around line 226-228: The operator-ban check in the contract validator only
covers ast.BinOp, so augmented assignments like **=, *=, and @= can still bypass
it. Update the existing guard in the contract-checking logic to also reject
ast.AugAssign when its operator is Mult, Pow, or MatMult, using the same
rejection path and warning message pattern already used in the current operator
check.
- Line 172: Remove the wall-clock timeout from execute() so contract completion
is determined only by gas/VM limits and not by p.join(timeout=1), which can
cause nondeterministic success/failure across nodes. Also tighten
_validate_code_ast() so it rejects augmented operator forms as well as
ast.BinOp, especially ast.AugAssign cases like *=, **=, and @=, to close the
operator bypass.
---
Outside diff comments:
In `@main.py`:
- Around line 140-145: The transaction handling in the apply/queue flow is
marking every non-applied tx as stale, but future-nonce transactions from
validate_and_apply should stay queued instead of being evicted. Update the logic
around receipt handling in the tx processing block to distinguish nonce-gap
cases (tx.nonce greater than the expected nonce) from truly stale transactions,
and only append to stale_txs when the transaction is actually invalid or
outdated; keep valid future-nonce txs pending for later processing.
In `@minichain/state.py`:
- Around line 57-96: `verify_transaction_logic()` currently skips the amount/gas
semantic guard, so invalid transactions can pass pre-mempool checks or raise on
bad peer input. Add the `_amounts_well_formed(tx)` validation at the start of
`verify_transaction_logic()` in `State`, and fail fast with
`ValidationStatus.FAILED` before any balance or nonce checks if `amount`,
`gas_limit`, or `max_fee_per_gas` are not valid non-negative integers.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: 4fa74ca5-ebcc-4dba-9f4d-aeb0f4f43872
📒 Files selected for processing (14)
genesis.jsonmain.pyminichain/block.pyminichain/chain.pyminichain/contract.pyminichain/mempool.pyminichain/rpc.pyminichain/state.pyminichain/transaction.pytests/test_contract.pytests/test_contract_transfers.pytests/test_core.pytests/test_persistence.pytests/test_reorg.py
There was a problem hiding this comment.
Caution
Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.
Actionable comments posted: 5
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
main.py (1)
140-145: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winDo not evict future-nonce transactions as stale.
Line 145 removes any tx that fails current application; a valid nonce-gap transaction (
tx.nonce > expected_nonce) is not stale and should remain queued until earlier nonces arrive.Proposed fix
expected_nonce = temp_state.get_account(tx.sender).get("nonce", 0) if tx.nonce < expected_nonce: stale_txs.append(tx) continue + if tx.nonce > expected_nonce: + continue receipt = temp_state.validate_and_apply(tx)🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@main.py` around lines 140 - 145, The transaction handling in the apply/queue flow is marking every non-applied tx as stale, but future-nonce transactions from validate_and_apply should stay queued instead of being evicted. Update the logic around receipt handling in the tx processing block to distinguish nonce-gap cases (tx.nonce greater than the expected nonce) from truly stale transactions, and only append to stale_txs when the transaction is actually invalid or outdated; keep valid future-nonce txs pending for later processing.minichain/state.py (1)
57-96: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick winRun amount/gas well-formed validation inside
verify_transaction_logic().Line 57 is used by RPC/CLI/P2P before mempool insertion, but only
validate_and_apply_with_status()calls_amounts_well_formed(). A signed tx with negativeamount,gas_limit, ormax_fee_per_gascan pass pre-mempool validation, and non-integer values can raise while handling peer input.Proposed fix
def verify_transaction_logic(self, tx): from .validators import ValidationStatus + if not self._amounts_well_formed(tx): + logger.warning("Malformed tx %s: amount/gas fields must be non-negative integers", getattr(tx, "tx_id", "<unknown>")) + return ValidationStatus.MALFORMED + if not tx.verify(): logger.error("Error: Invalid signature for tx from %s...", tx.sender[:8]) return ValidationStatus.INVALID🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@minichain/state.py` around lines 57 - 96, `verify_transaction_logic()` currently skips the amount/gas semantic guard, so invalid transactions can pass pre-mempool checks or raise on bad peer input. Add the `_amounts_well_formed(tx)` validation at the start of `verify_transaction_logic()` in `State`, and fail fast with `ValidationStatus.FAILED` before any balance or nonce checks if `amount`, `gas_limit`, or `max_fee_per_gas` are not valid non-negative integers.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@main.py`:
- Around line 10-12: Update the top-level help text in HELP_TEXT so it matches
the command handlers’ current signatures. The entries for send, deploy, and call
should include the optional [gas_limit] [max_fee_per_gas] parameters, and you
should adjust the help strings in the help text definition rather than the
handlers themselves.
- Around line 228-229: The transaction validation check in the
`verify_transaction_logic` path is collapsing every non-VALID result into
`ValidationStatus.INVALID`, which loses the distinction between `FAILED` and
`INVALID`. Update the logic around `chain.state.verify_transaction_logic(tx)` to
return the exact status produced by state validation instead of remapping it, so
callers can handle `FAILED` without triggering peer penalties. Use the
`verify_transaction_logic` and `ValidationStatus` symbols to locate and adjust
the return flow.
In `@minichain/block.py`:
- Around line 135-140: The difficulty parsing in block.py only enforces an upper
bound, so negative values can still flow into PoW validation and make
validate_block_link_and_hash in chain.py accept invalid hashes. Update the
raw_diff/parsed_diff handling to reject negative difficulty values as well as
values above 256, ideally by validating parsed_diff immediately after conversion
and raising a ValueError for any value below zero.
In `@minichain/contract.py`:
- Around line 226-228: The operator-ban check in the contract validator only
covers ast.BinOp, so augmented assignments like **=, *=, and @= can still bypass
it. Update the existing guard in the contract-checking logic to also reject
ast.AugAssign when its operator is Mult, Pow, or MatMult, using the same
rejection path and warning message pattern already used in the current operator
check.
- Line 172: Remove the wall-clock timeout from execute() so contract completion
is determined only by gas/VM limits and not by p.join(timeout=1), which can
cause nondeterministic success/failure across nodes. Also tighten
_validate_code_ast() so it rejects augmented operator forms as well as
ast.BinOp, especially ast.AugAssign cases like *=, **=, and @=, to close the
operator bypass.
---
Outside diff comments:
In `@main.py`:
- Around line 140-145: The transaction handling in the apply/queue flow is
marking every non-applied tx as stale, but future-nonce transactions from
validate_and_apply should stay queued instead of being evicted. Update the logic
around receipt handling in the tx processing block to distinguish nonce-gap
cases (tx.nonce greater than the expected nonce) from truly stale transactions,
and only append to stale_txs when the transaction is actually invalid or
outdated; keep valid future-nonce txs pending for later processing.
In `@minichain/state.py`:
- Around line 57-96: `verify_transaction_logic()` currently skips the amount/gas
semantic guard, so invalid transactions can pass pre-mempool checks or raise on
bad peer input. Add the `_amounts_well_formed(tx)` validation at the start of
`verify_transaction_logic()` in `State`, and fail fast with
`ValidationStatus.FAILED` before any balance or nonce checks if `amount`,
`gas_limit`, or `max_fee_per_gas` are not valid non-negative integers.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: 4fa74ca5-ebcc-4dba-9f4d-aeb0f4f43872
📒 Files selected for processing (14)
genesis.jsonmain.pyminichain/block.pyminichain/chain.pyminichain/contract.pyminichain/mempool.pyminichain/rpc.pyminichain/state.pyminichain/transaction.pytests/test_contract.pytests/test_contract_transfers.pytests/test_core.pytests/test_persistence.pytests/test_reorg.py
🛑 Comments failed to post (5)
main.py (2)
10-12: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Update top-level help text to show gas parameters.
The command handlers accept
[gas_limit] [max_fee_per_gas], butHELP_TEXTstill shows only the legacy short forms.Proposed fix
- send <to> <amount> - send coins - deploy <file> - deploy a contract - call <addr> <data> - call a contract + send <to> <amount> [gas_limit] [max_fee_per_gas] - send coins + deploy <file> [amount] [gas_limit] [max_fee_per_gas] - deploy a contract + call <addr> <data> [amount] [gas_limit] [max_fee_per_gas] - call a contract📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.send <to> <amount> [gas_limit] [max_fee_per_gas] - send coins deploy <file> [amount] [gas_limit] [max_fee_per_gas] - deploy a contract call <addr> <data> [amount] [gas_limit] [max_fee_per_gas] - call a contract🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@main.py` around lines 10 - 12, Update the top-level help text in HELP_TEXT so it matches the command handlers’ current signatures. The entries for send, deploy, and call should include the optional [gas_limit] [max_fee_per_gas] parameters, and you should adjust the help strings in the help text definition rather than the handlers themselves.
228-229: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win
Preserve
FAILEDvsINVALIDfrom state validation.The P2P layer bans/disconnects peers on
INVALID; mapping every non-VALID state result toINVALIDcan punish peers for race-prone conditions like insufficient balance or nonce mismatch. Return the actual status.Proposed fix
- if chain.state.verify_transaction_logic(tx) != ValidationStatus.VALID: - return ValidationStatus.INVALID + status = chain.state.verify_transaction_logic(tx) + if status != ValidationStatus.VALID: + return status📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.status = chain.state.verify_transaction_logic(tx) if status != ValidationStatus.VALID: return status🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@main.py` around lines 228 - 229, The transaction validation check in the `verify_transaction_logic` path is collapsing every non-VALID result into `ValidationStatus.INVALID`, which loses the distinction between `FAILED` and `INVALID`. Update the logic around `chain.state.verify_transaction_logic(tx)` to return the exact status produced by state validation instead of remapping it, so callers can handle `FAILED` without triggering peer penalties. Use the `verify_transaction_logic` and `ValidationStatus` symbols to locate and adjust the return flow.minichain/block.py (1)
135-140: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
Add lower-bound validation for negative difficulty values.
The upper-bound check (
> 256) prevents memory overflow, but there is no lower-bound check. A negative difficulty bypasses PoW invalidate_block_link_and_hash(chain.py):target = "0" * (block.difficulty or 1)— since-1is truthy,"0" * -1evaluates to"", andblock.hash.startswith("")is alwaysTrue.This is mitigated by the difficulty-match check in
_apply_block(block.difficulty != difficulty), which would reject a peer-sent block whose difficulty doesn't match the expected value. However, the PoW validation function itself is flawed and should not accept negative difficulties.🔒️ Proposed fix
if raw_diff is not None: parsed_diff = int(raw_diff) - if parsed_diff > 256: - raise ValueError(f"Difficulty too large: {parsed_diff}") + if parsed_diff < 0 or parsed_diff > 256: + raise ValueError(f"Difficulty out of range [0, 256]: {parsed_diff}") else: parsed_diff = None📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.if raw_diff is not None: parsed_diff = int(raw_diff) if parsed_diff < 0 or parsed_diff > 256: raise ValueError(f"Difficulty out of range [0, 256]: {parsed_diff}") else: parsed_diff = None🧰 Tools
🪛 Ruff (0.15.20)
[warning] 138-138: Avoid specifying long messages outside the exception class
(TRY003)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@minichain/block.py` around lines 135 - 140, The difficulty parsing in block.py only enforces an upper bound, so negative values can still flow into PoW validation and make validate_block_link_and_hash in chain.py accept invalid hashes. Update the raw_diff/parsed_diff handling to reject negative difficulty values as well as values above 256, ideally by validating parsed_diff immediately after conversion and raising a ValueError for any value below zero.minichain/contract.py (2)
172-172: 🩺 Stability & Availability | 🟠 Major | 🏗️ Heavy lift
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash # Inspect how execute() outcomes flow into state/receipts and block validation determinism. fd -t f 'state.py' minichain -x sed -n '1,220p' rg -nP 'timed out|Out of gas|execute\(' minichain -C2Repository: StabilityNexus/MiniChain
Length of output: 15783
🏁 Script executed:
#!/bin/bash set -euo pipefail echo "== contract.py around execution and validation ==" sed -n '90,220p' minichain/contract.py echo sed -n '220,320p' minichain/contract.py echo echo "== AST probe: which operators are rejected by _validate_code_ast? ==" python3 - <<'PY' import ast from pathlib import Path src = Path("minichain/contract.py").read_text() mod = ast.parse(src) for node in mod.body: if isinstance(node, ast.ClassDef) and node.name == "ContractMachine": for item in node.body: if isinstance(item, ast.FunctionDef) and item.name == "_validate_code_ast": print(ast.get_source_segment(src, item)) break break samples = { "binop_pow": "x = 2 ** 3", "augassign_pow": "x = 2\nx **= 3", "augassign_mult": "x = 2\nx *= 3", "augassign_matmul": "x = 2\nx @= 3", } class RejectingVisitor(ast.NodeVisitor): def visit_BinOp(self, node): if isinstance(node.op, (ast.Mult, ast.Pow, ast.MatMult)): raise ValueError(f"rejected BinOp {type(node.op).__name__}") self.generic_visit(node) for name, code in samples.items(): tree = ast.parse(code) try: RejectingVisitor().visit(tree) print(f"{name}: accepted") except Exception as e: print(f"{name}: {e}") PYRepository: StabilityNexus/MiniChain
Length of output: 8237
Keep contract execution deterministic and close the operator bypass
- A 1s wall-clock cutoff in
execute()can make the same transaction succeed on one node and fail on another, which can split receipts/state roots. Keep the validity bound tied to gas, not elapsed time._validate_code_ast()only rejectsast.BinOp, soAugAssignforms like*=,**=, and@=still bypass the unbounded-operator guard.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@minichain/contract.py` at line 172, Remove the wall-clock timeout from execute() so contract completion is determined only by gas/VM limits and not by p.join(timeout=1), which can cause nondeterministic success/failure across nodes. Also tighten _validate_code_ast() so it rejects augmented operator forms as well as ast.BinOp, especially ast.AugAssign cases like *=, **=, and @=, to close the operator bypass.
226-228: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash # Confirm no existing AugAssign handling elsewhere in the validator. rg -nP 'AugAssign|ast\.(Mult|Pow|MatMult)' minichain/contract.py -C1Repository: StabilityNexus/MiniChain
Length of output: 422
🏁 Script executed:
#!/bin/bash set -euo pipefail # Inspect the validator around the reported lines and the AST traversal context. ast-grep outline minichain/contract.py --view expanded printf '\n--- lines 180-260 ---\n' sed -n '180,260p' minichain/contract.py printf '\n--- search for generic AST walking / validation logic ---\n' rg -n "ast\.walk|NodeVisitor|visit_|for node in|ast\.BinOp|ast\.AugAssign" minichain/contract.py -C 2Repository: StabilityNexus/MiniChain
Length of output: 4292
Cover
ast.AugAssignin the operator ban.ast.AugAssignisn’t checked here, so**=,*=, and@=still slip through and can trigger the same resource-exhaustion path. Includeast.AugAssignin the guard.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@minichain/contract.py` around lines 226 - 228, The operator-ban check in the contract validator only covers ast.BinOp, so augmented assignments like **=, *=, and @= can still bypass it. Update the existing guard in the contract-checking logic to also reject ast.AugAssign when its operator is Mult, Pow, or MatMult, using the same rejection path and warning message pattern already used in the current operator check.
|
@CodeRabbit review |
✅ Action performedReview finished.
|
Addressed Issues:
This PR addresses 6 major security vulnerabilities identified during a comprehensive defensive security audit of the MiniChain node architecture. These fixes are essential for ensuring network stability, fund safety, and resistance against targeted DoS attacks.
Key Changes
*,**,@) to mitigate CPU and memory exhaustion attacks.resolve_conflictsto validate partial chain responses natively. Nodes will now fetch chain chunks backward from the fork point instead of requesting the entire history from genesis, avoiding libp2p 1MB max frame limits.max_fee_per_gas), eliminating free bandwidth exhaustion attacks.Additional Notes:
AI Usage Disclosure:
We encourage contributors to use AI tools responsibly when creating Pull Requests. While AI can be a valuable aid, it is essential to ensure that your contributions meet the task requirements, build successfully, include relevant tests, and pass all linters. Submissions that do not meet these standards may be closed without warning to maintain the quality and integrity of the project. Please take the time to understand the changes you are proposing and their impact. AI slop is strongly discouraged and may lead to banning and blocking. Do not spam our repos with AI slop.
Check one of the checkboxes below:
I have used the following AI models and tools: TODO
Checklist
Summary by CodeRabbit
New Features
gas_limitandmax_fee_per_gas.Bug Fixes