feat: implement logic to end vaults season one#48
Conversation
WalkthroughThis update introduces the concept of "Vaults Season One" with a configurable end timestamp and a collector for Staked Vault yield during Season Two. It adds new fields to protobuf schemas, Go structs, and configuration files, implements time-based logic for vault operations including a BeginBlocker to end Season One, refactors vault yield handling, extends genesis state handling, and adds comprehensive tests validating the new behaviors. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant MsgServer
participant Keeper
participant Block
participant State
Note over Block: At BeginBlock
Block->>Keeper: BeginBlocker(ctx)
Keeper->>State: Check season one ended flag & timestamp
alt If season ended and not marked
Keeper->>Keeper: endVaultsSeasonOne(ctx)
Keeper->>State: Set season one ended flag
end
User->>MsgServer: Lock/Unlock Flexible Vault
MsgServer->>Keeper: Check block time vs season one end
alt After season one end
MsgServer-->>User: Error: action paused
else Before season one end
MsgServer->>Keeper: Proceed with lock/unlock
end
User->>MsgServer: UpdateIndex
MsgServer->>Keeper: IsVaultsSeasonOneEnded(ctx)
alt If not ended
Keeper->>Keeper: handleVaultsYieldSeasonOne
else If ended
Keeper->>Keeper: handleVaultsYieldSeasonTwo
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Suggested reviewers
Poem
Note ⚡️ Unit Test Generation is now available in beta!Learn more here, or try it out under "Finishing Touches" below. 📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (2)
🚧 Files skipped from review as they are similar to previous changes (2)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
✨ Finishing Touches
🧪 Generate unit tests
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. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Actionable comments posted: 4
♻️ Duplicate comments (8)
keeper/state_vaults.go (1)
86-86: Fix grammatical error in comment.The comment has a grammatical error: "that return" should be "that returns".
simapp/app.yaml (1)
75-75: Address timestamp concern for CI/E2E tests.The timestamp
1752223200(≈ May 11, 2025) could cause E2E tests to fail if CI runs after this date, as the vaults program would be considered ended. Consider using a much further future timestamp or making this configurable per environment to prevent unexpected test failures.#!/bin/bash # Description: Check the current date and verify how close we are to the configured timestamp # Current timestamp current_timestamp=$(date +%s) echo "Current timestamp: $current_timestamp ($(date))" # Configured timestamp config_timestamp=1752223200 echo "Configured timestamp: $config_timestamp ($(date -d @$config_timestamp))" # Calculate difference diff=$((config_timestamp - current_timestamp)) days=$((diff / 86400)) if [ $diff -gt 0 ]; then echo "Time remaining: $days days" else echo "WARNING: Timestamp has already passed! Tests may fail." fikeeper/abci.go (4)
26-29: Fix import ordering per goimports-reviser standard.- "dollar.noble.xyz/v2/types/vaults" - - "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types" + + "dollar.noble.xyz/v2/types/vaults"
35-35: Improve the error message for clarity.- k.logger.Error("recovered from x/dollar BeginBlocker panic handling the program end", r) + k.logger.Error("recovered from x/dollar BeginBlocker panic handling the vaults program end", "err", r)
47-49: Add a blank line before the comment.}() + // Create a cached Context for the execution.
52-52: Improve the error message for clarity.- k.logger.Error("error executing the Vaults end program logic", err) + k.logger.Error("failed to execute vaults end program logic", "err", err)keeper/msg_server_vaults.go (2)
441-441: Apply the suggested comment improvement.
443-443: Apply the suggested comment improvement.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (12)
api/module/v1/module.pulsar.go(16 hunks)keeper/abci.go(1 hunks)keeper/keeper.go(5 hunks)keeper/msg_server.go(2 hunks)keeper/msg_server_vaults.go(2 hunks)keeper/msg_server_vaults_test.go(1 hunks)keeper/state_vaults.go(1 hunks)module.go(2 hunks)proto/noble/dollar/module/v1/module.proto(1 hunks)simapp/app.yaml(2 hunks)types/vaults/keys.go(1 hunks)utils/mocks/dollar.go(1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (2)
keeper/state_vaults.go (1)
keeper/keeper.go (1)
Keeper(50-91)
keeper/keeper.go (1)
types/vaults/keys.go (1)
ProgramEndedKey(44-44)
🔇 Additional comments (14)
keeper/state_vaults.go (1)
87-89: Verify error handling approach is intentional.The method ignores all errors from
VaultsProgramEnded.Get(ctx). While this pattern returnsfalseby default when the state hasn't been set (which seems correct for a boolean flag), verify that ignoring other potential errors (like storage access issues) is the intended behavior.proto/noble/dollar/module/v1/module.proto (1)
24-25: LGTM! Field addition is well-documented.The new timestamp field is properly typed and documented, addressing the previous review feedback.
types/vaults/keys.go (1)
44-44: LGTM! Key constant follows established patterns.The new storage key is properly named and follows the existing conventions for vault-related state keys.
utils/mocks/dollar.go (1)
75-75: Verify timestamp consistency with configuration.The mock uses timestamp
1893499200(≈ December 2029) whilesimapp/app.yamluses1752223200(≈ May 2025). Confirm this difference is intentional - using a far future timestamp in mocks is likely safer for testing, but verify this aligns with the testing strategy.simapp/app.yaml (1)
6-6: LGTM! Enables vaults program end logic.Adding "dollar" to the begin_blockers list correctly enables the new BeginBlock lifecycle method for vaults program management.
module.go (2)
172-174: LGTM!The
BeginBlockmethod correctly delegates to the keeper'sBeginBlockerand properly propagates any errors.
418-418: LGTM!The
VaultsEndProgramTimestampconfiguration parameter is correctly passed to the keeper constructor.keeper/keeper.go (1)
87-87: LGTM!The
VaultsProgramEndedcollection item is correctly initialized with the appropriate key and type.Also applies to: 162-162
keeper/msg_server.go (2)
163-168: LGTM!The conditional check correctly prevents vault yield operations after the program has ended.
425-459: Well-structured refactoring!The
handleVaultsYieldmethod cleanly extracts the vault yield logic while preserving the original functionality and error handling.api/module/v1/module.pulsar.go (1)
17-22: LGTM!The generated protobuf code correctly implements the new
VaultsEndProgramTimestampfield with proper reflection, serialization, and accessor methods.Also applies to: 32-32, 124-129, 153-154, 179-180, 209-211, 240-241, 270-271, 293-294, 378-380, 410-414, 590-608, 672-673, 724-729, 750-754
keeper/msg_server_vaults.go (2)
152-154: Good refactoring to enable code reuse.The delegation pattern allows the internal
unlockmethod to be called both from the public message server interface and internally fromVaultsEndProgram.
493-506: Fix counter increment logic and log message format.Same issue as above - counter incremented on failure and log format reversed.
- }); err != nil { - k.logger.Error(fmt.Sprintf("Failed to unlock flexible vault position for %s: %v", flexibleUserAddr, err)) - continue - } - flexibleUsersProcessed += 1 - } - k.logger.Info(fmt.Sprintf("Unlocked %d/%d flexible vault positions!", len(flexibleUsers), flexibleUsersProcessed)) + }); err != nil { + k.logger.Error(fmt.Sprintf("Failed to unlock flexible vault position for %s: %v", flexibleUserAddr, err)) + continue + } + flexibleUsersProcessed++ + } + k.logger.Info(fmt.Sprintf("Unlocked %d/%d flexible vault positions!", flexibleUsersProcessed, len(flexibleUsers)))Likely an incorrect or invalid review comment.
keeper/msg_server_vaults_test.go (1)
1894-2032: Well-structured and comprehensive test coverage!The test thoroughly validates the vaults program end functionality including:
- Proper unlocking of all positions with correct yield/rewards distribution
- Clearing of position state
- Pausing of vault operations
- Continued functionality of index updates
MalteHerrmann
left a comment
There was a problem hiding this comment.
We probably will not need it, but in case we should ever call InitGenesis after the vaults program has ended and the BeginBlocker is still in place, then the logic would be tried to execute again.
We could add the corresponding VaultsProgramEnded to the genesis state akin to the Vaults setting etc.:
Lines 160 to 170 in 3cbdeeb
As mentioned probably not necessary but could be cleaner 👀
MalteHerrmann
left a comment
There was a problem hiding this comment.
great work @g-luca! nicely done; I left some comments (mostly nits) -- feel free to close them if you don't agree 🙏
Co-authored-by: MalteHerrmann <42640438+MalteHerrmann@users.noreply.github.com>
Co-authored-by: John Letey <john@noble.xyz>
a38e571 to
61be38e
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
🔭 Outside diff range comments (2)
proto/noble/dollar/vaults/v1/tx.proto (1)
64-74: Field number change creates protobuf breaking change.Adding the
vaultfield enables per-vault pause control, which is excellent for granular management. However, moving thepausedfield from number 2 to 3 breaks protobuf wire format compatibility.To maintain compatibility, consider:
message MsgSetPausedState { // ... existing fields ... string signer = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; - vaults.v1.VaultType vault = 2; - vaults.v1.PausedType paused = 3; + vaults.v1.PausedType paused = 2; // Keep original field number + vaults.v1.VaultType vault = 3; // Use next available field number }If this breaking change is intentional for v2.0.0, ensure it's properly documented.
api/vaults/v1/events.pulsar.go (1)
1-1: Revert manual changes to generated code & update the .proto insteadYou’ve directly edited
api/vaults/v1/events.pulsar.go, but that file is auto-generated. Those changes will be lost on the next regeneration. Please:
- Revert any edits in
api/vaults/v1/events.pulsar.go(and any other// Code generated … DO NOT EDITfiles).- Open
proto/noble/dollar/vaults/v1/events.protoand add the newVaultfield (with the correct field number).- Run your protobuf generator (e.g.
protoc --go-pulsar_out=…) to produce updated Go code.
♻️ Duplicate comments (1)
keeper/msg_server_vaults_test.go (1)
1970-1971: Consider using meaningful variable names for dates.
🧹 Nitpick comments (3)
Makefile (1)
41-41: Consider the impact of removing proto-breaking from standard workflow.Removing
proto-breakingfrom theproto-alltarget means breaking change checks won't run automatically. While this may be intentional for v2.0.0 development, consider whether this removes an important safety net for ongoing development.keeper/state_vaults.go (2)
92-99: Consider improving error handling to distinguish between different error types.The current implementation treats all errors the same way by returning
vaults.NONE. While this is appropriate for "key not found" scenarios, other types of errors (like database connection issues) might warrant different handling or at least logging.Consider this approach to distinguish between different error scenarios:
func (k *Keeper) IsVaultPaused(ctx context.Context, vault vaults.VaultType) vaults.PausedType { value, err := k.VaultsPaused.Get(ctx, int32(vault)) - if err != nil { + if err != nil { + // Log non-NotFound errors for debugging + if !collections.IsNotFound(err) { + // Consider logging the error here + } return vaults.NONE } return vaults.PausedType(value) }
101-105: LGTM! Simple and effective implementation.The method correctly implements the program end status check with appropriate default behavior (returning
falsewhen the state is not found). The implementation aligns with the PR objective of adding logic to end the vaults program.Optional improvement: Similar to
IsVaultPaused, consider logging non-NotFound errors for debugging purposes while maintaining the current return behavior:func (k *Keeper) IsVaultsProgramEnded(ctx context.Context) bool { - ended, _ := k.VaultsProgramEnded.Get(ctx) + ended, err := k.VaultsProgramEnded.Get(ctx) + if err != nil && !collections.IsNotFound(err) { + // Consider logging the error here for debugging + } return ended }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (4)
types/vaults/events.pb.gois excluded by!**/*.pb.gotypes/vaults/genesis.pb.gois excluded by!**/*.pb.gotypes/vaults/query.pb.gois excluded by!**/*.pb.gotypes/vaults/tx.pb.gois excluded by!**/*.pb.go
📒 Files selected for processing (17)
Makefile(1 hunks)api/vaults/v1/events.pulsar.go(14 hunks)api/vaults/v1/genesis.pulsar.go(24 hunks)api/vaults/v1/query.pulsar.go(19 hunks)api/vaults/v1/tx.pulsar.go(15 hunks)genesis.go(3 hunks)keeper/abci.go(1 hunks)keeper/keeper.go(5 hunks)keeper/msg_server_vaults.go(5 hunks)keeper/msg_server_vaults_test.go(4 hunks)keeper/query_server_vaults.go(1 hunks)keeper/state_vaults.go(1 hunks)proto/noble/dollar/vaults/v1/events.proto(1 hunks)proto/noble/dollar/vaults/v1/genesis.proto(1 hunks)proto/noble/dollar/vaults/v1/query.proto(1 hunks)proto/noble/dollar/vaults/v1/tx.proto(1 hunks)types/vaults/keys.go(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (6)
- genesis.go
- proto/noble/dollar/vaults/v1/genesis.proto
- types/vaults/keys.go
- keeper/abci.go
- keeper/keeper.go
- keeper/msg_server_vaults.go
🧰 Additional context used
🧬 Code Graph Analysis (1)
api/vaults/v1/events.pulsar.go (1)
types/vaults/events.pb.go (3)
PausedStateUpdated(157-160)PausedStateUpdated(164-164)PausedStateUpdated(165-167)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: prepare
- GitHub Check: build
🔇 Additional comments (18)
proto/noble/dollar/vaults/v1/query.proto (1)
54-56: Approve the architectural improvement to per-vault paused states.The change from a single
pausedfield to amap<string, string>enables granular control over pause states for individual vault types, which is a significant improvement. This breaking change aligns with the broader refactor to support per-vault pause management and program lifecycle controls.Makefile (1)
46-46: LGTM: Version update aligns with v2.0.0 release.The branch reference update from
v1.0.2tov2.0.0correctly aligns with the major version upgrade and breaking changes introduced in this PR.keeper/query_server_vaults.go (1)
44-61: LGTM: Implementation correctly handles per-vault paused states.The refactored
Pausedmethod properly:
- Iterates over the
VaultsPausedcollection usingWalk- Converts enum values to strings for the response
- Maintains proper error handling
- Returns a map structure consistent with the updated protobuf definition
The implementation aligns well with the architectural shift to per-vault pause management.
keeper/state_vaults.go (1)
77-90: LGTM! Clean implementation of the paused state map retrieval.The method correctly iterates over all vault paused states using
Walkand populates a map with proper error handling. The implementation aligns well with the architectural change from single paused state to per-vault paused states.api/vaults/v1/tx.pulsar.go (6)
1798-1798: LGTM: Field descriptor additions are correct.The addition of
fd_MsgSetPausedState_vaultfield descriptor and its initialization in theinit()function follows the standard protobuf code generation pattern and is consistent with other field descriptors in the file.Also applies to: 1806-1806
1881-1886: LGTM: Range method correctly handles the new vault field.The vault field handling in the Range method properly:
- Checks for non-zero enum value (appropriate for proto3)
- Uses correct enum conversion with
protoreflect.ValueOfEnum- Maintains consistent early return pattern
1910-1911: LGTM: All reflection methods correctly handle the vault field.The vault field is properly implemented across all reflection methods:
- Has: Correctly checks
x.Vault != 0for proto3 enum semantics- Clear: Properly resets to zero value
- Get/Set: Correct enum type conversions using
protoreflect.ValueOfEnumandVaultTypecasting- Mutable: Appropriately panics for scalar enum field
- NewField: Returns correct default enum value
Also applies to: 1932-1933, 1955-1957, 1983-1984, 2009-2010, 2028-2029
2105-2107: LGTM: Serialization logic correctly handles field reordering.The marshaling updates properly:
- Add size calculation for the vault field using varint encoding
- Assign correct wire tags: vault gets 0x10 (field 2), paused moves to 0x18 (field 3)
- Maintain efficient reverse-order encoding pattern
Also applies to: 2143-2149
2238-2257: LGTM: Unmarshaling correctly handles the new vault field.The vault field unmarshaling implementation:
- Properly validates wire type for varint encoding
- Uses standard varint decoding loop with bit shifting
- Correctly casts decoded value to
VaultType- Maintains consistent error handling patterns
The field number update (paused moved from case 2 to case 3) is also correct.
2845-2846: LGTM: Message structure and getter method correctly implement field reordering.The
MsgSetPausedStateupdates properly:
- Add
Vaultfield with correct protobuf field number 2- Move
Pausedfield to field number 3- Provide standard
GetVault()getter with appropriate nil checking and default return valueThis correctly implements the per-vault paused state functionality described in the PR objectives.
Also applies to: 2876-2881
keeper/msg_server_vaults_test.go (3)
58-58: LGTM! Consistent with per-vault paused state refactoring.The change from
GetVaultsPausedtoIsVaultPausedwith a specific vault type aligns with the broader refactoring to support per-vault paused states.
66-67: Good simplification of vault type usage.The consistent use of
vaults.STAKEDinstead of the verbosevaults.VaultType(vaultsv1.VaultType_STAKED)improves code readability throughout the test.Also applies to: 74-75, 82-83, 86-86, 93-94, 101-102, 111-112, 115-115, 120-121, 128-129, 138-139, 142-142, 147-148, 155-156
1898-2034: Comprehensive test coverage for vaults program end feature.The test thoroughly validates:
- Automatic unlocking of all positions when the program ends
- Correct distribution of yields and rewards to users
- Proper pausing of flexible vault operations while staked vault remains operational
- Index updates continue to work without errors after program end
The test implementation aligns well with the feature requirements.
api/vaults/v1/genesis.pulsar.go (4)
15-15: LGTM! Map implementation for per-vault paused states.The new
_GenesisState_5_mapwrapper correctly implements the map interface for tracking paused states per vault type, supporting the transition from a global paused state to per-vault paused states.Also applies to: 121-201
203-211: Field descriptors updated correctly for new structure.The addition of
fd_GenesisState_program_endedand proper initialization of field descriptors aligns with the new genesis state structure.Also applies to: 219-222
307-324: Protobuf reflection methods properly updated.All reflection methods (Range, Has, Clear, Get, Set, Mutable, NewField) have been correctly updated to handle:
- The
pausedfield as a map instead of an enum- The new
program_endedboolean fieldThe implementation maintains consistency with protobuf conventions.
Also applies to: 346-351, 374-379, 411-422, 453-460, 493-498, 529-536
1148-1152: Genesis state structure aligns with vaults program lifecycle enhancements.The structural changes to
GenesisState:
Pausedasmap[int32]int32enables per-vault-type paused state trackingProgramEndedboolean field tracks whether the vaults program has terminatedThese changes properly support the new vaults program end feature.
Also applies to: 1196-1201, 1210-1215
api/vaults/v1/query.pulsar.go (1)
1-5445: Auto-generated code changes look correctThis is auto-generated protobuf code that correctly implements the transition from a single paused state to per-vault paused states. The changes include:
- Proper implementation of the map wrapper type for the new
map[string]stringPaused field- Deterministic key sorting during marshaling to ensure consistent serialization
- Correct handling of the map structure in all reflection, marshal, and unmarshal methods
f7f4739 to
61be38e
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
♻️ Duplicate comments (2)
proto/noble/dollar/module/v1/module.proto (1)
24-25: Past review suggestion not fully addressed.The past review comment suggested improving the comment to "vaults_end_program_timestamp defines the timestamp in seconds when the vaults program ends." However, the current comment uses "Vaults Season One ends" which is more specific but inconsistent with the general "vaults program" terminology used elsewhere.
Consider using the suggested wording from the past review for consistency, or ensure the specific "Season One" terminology is used consistently throughout the codebase.
keeper/msg_server.go (1)
430-466: Review the collections usage pattern.The logic for getting total flexible principal uses both
.Has()and.Get()which appears redundant since.Get()would return zero if not set. However, based on past review comments, this pattern is intentionally kept for testing coverage purposes.The collections usage pattern (lines 447-453) was previously flagged as potentially redundant but kept for testing coverage. This is acceptable if it serves the testing strategy.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
types/vaults/genesis.pb.gois excluded by!**/*.pb.go
📒 Files selected for processing (12)
Makefile(1 hunks)api/module/v1/module.pulsar.go(16 hunks)api/vaults/v1/genesis.pulsar.go(16 hunks)keeper/abci.go(1 hunks)keeper/keeper.go(6 hunks)keeper/msg_server.go(2 hunks)keeper/msg_server_vaults.go(4 hunks)keeper/msg_server_vaults_test.go(2 hunks)keeper/state_vaults.go(1 hunks)module.go(3 hunks)proto/noble/dollar/module/v1/module.proto(1 hunks)proto/noble/dollar/vaults/v1/genesis.proto(1 hunks)
✅ Files skipped from review due to trivial changes (1)
- Makefile
🚧 Files skipped from review as they are similar to previous changes (9)
- keeper/keeper.go
- keeper/msg_server_vaults.go
- proto/noble/dollar/vaults/v1/genesis.proto
- keeper/state_vaults.go
- module.go
- keeper/msg_server_vaults_test.go
- api/vaults/v1/genesis.pulsar.go
- keeper/abci.go
- api/module/v1/module.pulsar.go
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: build
🔇 Additional comments (4)
proto/noble/dollar/module/v1/module.proto (1)
27-28: LGTM! Clear and descriptive field definition.The field name and comment clearly describe the purpose of collecting Staked vault yield during the interim period.
keeper/msg_server.go (3)
163-173: Well-structured conditional yield handling logic.The conditional logic properly separates yield handling between Season One and the interim period. The comment clearly explains the behavior, and error handling is consistent.
430-466: Verify error handling in reward record creation.The method properly claims yields from both vault types and creates a reward record. The error handling is consistent throughout the method.
484-488: Potential issue with coin transfer logic.The method transfers coins directly from the Staked vault address to the collector address. However, the yield was already claimed to the Staked vault address in the previous step, so this transfer should work correctly.
boojamya
left a comment
There was a problem hiding this comment.
Great work Luca! Minor comments.
I'm going to wait to approve until after the walk through tomorrow.
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (1)
.changelog/v2.1.0/features/48-season-one.md (1)
1-1: Refine the changelog bullet for clarity & styleThe project’s changelog generally uses imperative mood (“Add”, “Remove”, “Fix”) and captures the key parameters introduced. A small wording tweak makes the entry clearer while staying concise.
- - Implement `BeginBlocker` to end Vaults Season One after a specific timestamp. ([#48](https://github.com/noble-assets/dollar/pull/48)) + - Add `BeginBlocker` that terminates Vaults Season One when block time exceeds the configured `VaultsSeasonOneEndTimestamp`. ([#48](https://github.com/noble-assets/dollar/pull/48))
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (4)
.changelog/v2.1.0/features/48-season-one.md(1 hunks).changelog/v2.1.0/summary.md(1 hunks)CHANGELOG.md(1 hunks)Makefile(1 hunks)
✅ Files skipped from review due to trivial changes (2)
- CHANGELOG.md
- .changelog/v2.1.0/summary.md
🚧 Files skipped from review as they are similar to previous changes (1)
- Makefile
MalteHerrmann
left a comment
There was a problem hiding this comment.
looks good! left a few comments but no vulns noticed :)
0xstepit
left a comment
There was a problem hiding this comment.
Thanks for addressing the review comments so quickly. Great work again! 🙌
Summary by CodeRabbit
New Features
Bug Fixes
Tests
Documentation