Skip to content

Cascade Everlight Phase 1: x/everlight module + STORAGE_FULL state + fee routing#107

Open
a-ok123 wants to merge 10 commits intomasterfrom
everlight
Open

Cascade Everlight Phase 1: x/everlight module + STORAGE_FULL state + fee routing#107
a-ok123 wants to merge 10 commits intomasterfrom
everlight

Conversation

@a-ok123
Copy link
Contributor

@a-ok123 a-ok123 commented Mar 14, 2026

Summary

Cascade Everlight Phase 1 chain upgrade (v1.15.0) — adds sustainable SuperNode storage compensation via a new x/everlight module with protocol-native funding streams.

  • S10: Proto schemas — STORAGE_FULL enum (=6), cascade_kademlia_db_bytes metric (field 15), cascade_kademlia_db_max_bytes param (field 19), full x/everlight proto definitions
  • S11: STORAGE_FULL state + compliance bifurcation — disk-full SNs stay compute-eligible (Sense/Agents), excluded from Cascade selection only
  • S12: x/everlight module core — keeper, genesis, params, queries, depinject wiring, Burner-only module account
  • S13: Periodic distribution — EndBlocker distributes pool proportionally by smoothed cascade_kademlia_db_bytes with anti-gaming (EMA smoothing, growth cap, ramp-up)
  • S14: Fee routing — registration fee share from x/action + block reward share skimmed from fee collector before x/distribution
  • S15: v1.15.0 upgrade handler — adds everlight store key, RunMigrations initializes default params

Key design decisions

  • Block reward share via BeginBlocker skim (everlight runs before x/distribution), not by modifying AllocateTokens
  • Registration fee share via optional EverlightKeeper dependency in action module (backward compatible)
  • STORAGE_FULL is less restrictive than POSTPONED — mixed violations always result in POSTPONED

Test plan

  • 77 unit tests pass (go test ./x/everlight/v1/... ./x/supernode/v1/keeper/ ./app/upgrades/v1_15_0/ ./app/upgrades/)
  • 12 integration tests pass (go test ./tests/integration/everlight/) — full app with real keepers
  • make build clean
  • Gate audit: 0 blocking issues, all 16 ATs (AT30-AT45) have executable evidence
  • Eval: 41/41 automated scenario checks pass (scripts/run-eval-scenarios.sh)
  • make unit-tests full suite
  • make integration-tests full suite
  • Manual review of proto field number coordination (SN params=19, metrics=15, state=6)

🤖 Generated with Claude Code

a-ok123 and others added 8 commits March 10, 2026 13:38
SuperNode proto extensions:
- SUPERNODE_STATE_STORAGE_FULL (=6) enum value
- cascade_kademlia_db_max_bytes (field 19) in SN params
- cascade_kademlia_db_bytes (field 15) in SupernodeMetrics

New x/everlight module protos:
- params.proto: payment period, fee shares, anti-gaming params
- genesis.proto: params + last distribution height
- query.proto: Params, PoolState, SNEligibility queries
- tx.proto: MsgUpdateParams
- module/v1/module.proto: depinject config

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Compliance bifurcation in evaluateCompliance():
- Returns ComplianceResult with separate Issues (non-storage) and StorageFull flag
- Storage-only violation (cascade_kademlia_db_bytes >= threshold) -> STORAGE_FULL
- Other violations -> POSTPONED (most restrictive wins)
- Both storage + other -> POSTPONED

State transitions in ReportSupernodeMetrics:
- ACTIVE -> STORAGE_FULL (storage full only)
- ACTIVE -> POSTPONED (other issues)
- STORAGE_FULL -> ACTIVE (storage freed, no issues)
- STORAGE_FULL -> POSTPONED (other issues added)
- POSTPONED -> STORAGE_FULL (improvement when only storage remains)
- POSTPONED -> ACTIVE (all clear)

Selection filtering (GetTopSuperNodesForBlock):
- STORAGE_FULL excluded from default results (Cascade storage)
- Can be explicitly requested for Sense/Agents

Staleness handler updated to check STORAGE_FULL nodes too.

Tests: 3 new STORAGE_FULL compliance tests added.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ng (F10)

Add the x/everlight module skeleton with:
- Keeper with KVStoreService, params get/set, genesis init/export
- MsgServer (UpdateParams) and QueryServer (Params, PoolState stubs)
- AppModule with HasGenesis, HasBeginBlocker, HasEndBlocker
- depinject wiring (ProvideModule)
- Module account with Burner permission for pool distributions
- App integration: app.go keeper field + app_config.go registration

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…gible SNs (F15)

Add EndBlocker distribution that fires every payment_period_blocks:
- Eligible SNs: ACTIVE or STORAGE_FULL with fresh metrics
- Weight: cascade_kademlia_db_bytes with EMA smoothing, growth cap, ramp-up
- SNs below min_cascade_bytes_for_payment excluded
- Proportional distribution from everlight module account via x/bank
- Per-SN distribution state tracking (smoothed bytes, eligibility start)
- Updated PoolState and SNEligibility queries with real data
- 14 tests covering AT35-AT38, AT44, AT45 acceptance criteria

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…rlight pool (F16, F17)

F16: Registration fee share routing
- Action module's DistributeFees routes registration_fee_share_bps to
  Everlight module account before SN/foundation split
- EverlightKeeper is optional (nil before upgrade) for backward compat
- Added SendCoinsFromModuleToModule to action BankKeeper interface

F17: Block reward share routing
- Everlight BeginBlocker skims validator_reward_share_bps from fee
  collector before x/distribution allocates tokens
- Reordered beginBlockers: everlight runs after mint, before distribution
- Non-fatal on failure to avoid halting chain on routing errors

7 new tests covering AT39 (registration fee routing) and AT40 (block
reward routing) with edge cases for zero BPS, empty balances, truncation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ms (F18)

Add upgrade handler for v1.15.0:
- Adds everlight store key via StoreUpgrades
- RunMigrations triggers Everlight InitGenesis with default params
- Consensus params verification included
- No existing stores deleted (SN states/actions unaffected)

Tests verify store key addition, no deletions, and upgrade name.
Covers AT42 (params initialized) and AT43 (existing state unaffected).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- AT31: STORAGE_FULL SN excluded from Cascade selection, included in
  Sense/Agents (3 sub-tests in supernode keeper)
- AT34: Everlight module account accepts transfers, has correct
  permissions (3 tests verifying deterministic address, SendCoins, Burner)
- AT42/AT43: Upgrade handler tests — semver pattern, only everlight
  added, no existing stores deleted/renamed, handler non-nil
- AT41: MsgUpdateParams test — authority check, validation, round-trip

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Integration tests using app.Setup() covering:
- Params: default, MsgUpdateParams, authority validation
- Module account: existence, funding, balance tracking
- Pool state query with real balances
- Genesis round-trip (export/re-init)
- BeginBlocker fee routing from fee collector (+ zero/edge cases)
- EndBlocker distribution: SN with metrics, pool funded, period elapsed
- EndBlocker edge cases: no eligible SNs, empty pool, period not elapsed

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings March 14, 2026 06:30
@roomote-v0
Copy link

roomote-v0 bot commented Mar 14, 2026

Rooviewer Clock   See task

Re-reviewed after b82492e. All 3 previously flagged issues are now resolved. No new issues found.

  • Missing STORAGE_FULL short-name case in state filter switch (query_get_top_super_nodes_for_block.go): Fixed -- explicit case "SUPERNODE_STATE_STORAGE_FULL", "STORAGE_FULL" added, with test coverage.
  • SNDistStateKey uses append on shared package-level slice (keys.go): Fixed -- now uses make + copy with a regression test confirming prefix immutability.
  • float64 precision loss in distribution share calculation (distribution.go): Fixed -- share weights are now converted to LegacyDec via legacyDecFromFloat64 before division, with NaN/Inf/negative validation.
Previous reviews

Mention @roomote in a comment to request specific changes to this pull request or fix all unresolved issues.

Comment on lines +106 to 108
if superNodeStateFilter == types.SuperNodeStateUnspecified &&
(stateAtBlock == types.SuperNodeStatePostponed || stateAtBlock == types.SuperNodeStateStorageFull) {
continue
Copy link

Choose a reason for hiding this comment

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

This new filter correctly excludes STORAGE_FULL from default Cascade selection, but the switch statement above (lines 39-58) that parses the req.State string filter has no explicit case for STORAGE_FULL. Every other state has both a full name (SUPERNODE_STATE_X) and a short name (X) case, but STORAGE_FULL is missing. When a caller passes "STORAGE_FULL" (following the short-name pattern used for all other states), it falls to the default branch, which looks up SuperNodeState_value["STORAGE_FULL"]. That map only contains full proto names like SUPERNODE_STATE_STORAGE_FULL, so the lookup fails and the filter silently defaults to Unspecified -- returning all non-degraded nodes instead of only STORAGE_FULL ones. Consider adding case "SUPERNODE_STATE_STORAGE_FULL", "STORAGE_FULL": superNodeStateFilter = types.SuperNodeStateStorageFull to the switch.

Fix it with Roo Code or mention @roomote and request a fix.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR introduces Everlight payout infrastructure and extends the Supernode compliance/state machine to support a new STORAGE_FULL degraded-but-compute-eligible state, driven by a new Cascade storage-size metric.

Changes:

  • Add SUPERNODE_STATE_STORAGE_FULL plus related events, compliance evaluation, and state transitions (including query filtering and staleness handling).
  • Add cascade_kademlia_db_bytes metric and a cascade_kademlia_db_max_bytes compliance threshold parameter.
  • Add new x/everlight module (params, state, begin/end blockers, distribution logic, queries/messages) and integrate fee/block-reward routing from existing modules and upgrade wiring.

Reviewed changes

Copilot reviewed 59 out of 62 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
x/supernode/v1/types/supernode_state.pb.go Generated enum update to include STORAGE_FULL.
x/supernode/v1/types/metrics.pb.go Generated metrics update adding cascade_kademlia_db_bytes.
x/supernode/v1/types/events.go Add storage-full and storage-recovered event types.
x/supernode/v1/keeper/query_get_top_super_nodes_for_block.go Exclude STORAGE_FULL from default selection unless explicitly requested.
x/supernode/v1/keeper/query_get_top_super_nodes_for_block_test.go Add tests for STORAGE_FULL default exclusion / explicit inclusion.
x/supernode/v1/keeper/msg_server_report_supernode_metrics.go Split compliance results and update state transitions for STORAGE_FULL.
x/supernode/v1/keeper/metrics_validation.go Introduce ComplianceResult and storage-capacity-only handling.
x/supernode/v1/keeper/metrics_validation_test.go Add coverage for storage-full-only and mixed-issue compliance results.
x/supernode/v1/keeper/metrics_state.go Add markStorageFull / recoverFromStorageFull helpers and events.
x/supernode/v1/keeper/metrics_staleness.go Include STORAGE_FULL in staleness checks.
x/everlight/v1/types/tx.pb.go Generated Msg service/types for Everlight params updates.
x/everlight/v1/types/query.pb.gw.go Generated gRPC-gateway reverse proxy for Everlight queries.
x/everlight/v1/types/params.go Default params and validation logic.
x/everlight/v1/types/keys.go Store keys and per-SN distribution key helpers.
x/everlight/v1/types/genesis.pb.go Generated genesis types for Everlight.
x/everlight/v1/types/genesis.go Default genesis + validation.
x/everlight/v1/types/expected_keepers.go Keeper interfaces required by Everlight module.
x/everlight/v1/types/events.go Everlight distribution event/attributes.
x/everlight/v1/types/errors.go Everlight params error registration.
x/everlight/v1/types/codec.go Interface registration for Msg services.
x/everlight/v1/module/module.pb.go Generated module config proto for depinject/app config.
x/everlight/v1/module/module.go AppModule wiring, genesis, and service registration.
x/everlight/v1/module/depinject.go Depinject provider for Everlight keeper/module.
x/everlight/v1/keeper/state.go Store accessors for params, distribution height, totals, per-SN state.
x/everlight/v1/keeper/query_server.go Query endpoints for params/pool state/eligibility.
x/everlight/v1/keeper/params.go Params get/set in store.
x/everlight/v1/keeper/msg_server.go Governance-controlled params update Msg.
x/everlight/v1/keeper/msg_server_test.go Unit tests for MsgUpdateParams behavior.
x/everlight/v1/keeper/module_account_test.go Module account address/permissions and transfer behavior tests.
x/everlight/v1/keeper/keeper.go Keeper struct and constructor.
x/everlight/v1/keeper/genesis.go Init/Export genesis logic.
x/everlight/v1/keeper/fee_routing_test.go Tests for fee routing math and begin-block behavior.
x/everlight/v1/keeper/distribution.go Core pool distribution logic (EMA, caps, ramp-up).
x/everlight/v1/keeper/distribution_test.go Extensive unit tests for distribution behavior and helpers.
x/everlight/v1/keeper/abci.go BeginBlocker fee-skimming and EndBlocker periodic distribution trigger.
x/action/v1/types/expected_keepers.go Extend bank keeper interface + add Everlight keeper interface.
x/action/v1/module/depinject.go Optionally inject Everlight keeper into action module.
x/action/v1/keeper/keeper.go Store Everlight keeper reference in action keeper.
x/action/v1/keeper/action.go Route registration-fee share to Everlight before other splits.
testutil/keeper/action.go Extend test bank keeper with module-to-module transfers; wire nil Everlight keeper.
tests/integration/everlight/everlight_integration_test.go Integration tests validating Everlight in a full app instance.
proto/lumera/supernode/v1/supernode_state.proto Add SUPERNODE_STATE_STORAGE_FULL.
proto/lumera/supernode/v1/params.proto Add cascade_kademlia_db_max_bytes param.
proto/lumera/supernode/v1/metrics.proto Add cascade_kademlia_db_bytes metric.
proto/lumera/everlight/v1/tx.proto New Everlight Msg service/proto definitions.
proto/lumera/everlight/v1/query.proto New Everlight Query service/proto definitions.
proto/lumera/everlight/v1/params.proto New Everlight params proto.
proto/lumera/everlight/v1/genesis.proto New Everlight genesis proto.
proto/lumera/everlight/module/v1/module.proto New Everlight module config proto.
buf.lock Update buf dependencies/digests.
app/upgrades/v1_15_0/upgrade.go Add upgrade handler for Everlight store addition/migrations.
app/upgrades/v1_15_0/upgrade_test.go Tests for v1.15.0 upgrade wiring/store upgrades.
app/upgrades/v1_15_0/store.go Define store upgrades adding Everlight KV store.
app/upgrades/upgrades.go Register v1.15.0 upgrade.
app/upgrades/upgrades_test.go Extend upgrade registry tests for v1.15.0.
app/app.go Add Everlight keeper to App struct / keeper wiring.
app/app_config.go Register Everlight module, module account perms, and begin/end blocker ordering.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +120 to +124
if lastState == types.SuperNodeStatePostponed {
// Improvement: was POSTPONED, now only storage issue → STORAGE_FULL.
if err := recoverFromPostponed(ctx, m.SupernodeKeeper, &sn, types.SuperNodeStateStorageFull); err != nil {
return nil, err
}
Comment on lines +199 to +203
// This is evaluated separately: if the only violation is storage capacity,
// the node enters STORAGE_FULL instead of POSTPONED.
if params.CascadeKademliaDbMaxBytes > 0 && m.CascadeKademliaDbBytes >= float64(params.CascadeKademliaDbMaxBytes) {
storageFull = true
}
Comment on lines +52 to +56
func evaluateCompliance(ctx sdk.Context, params types.Params, m types.SupernodeMetrics) ComplianceResult {
_ = ctx // ctx reserved for future use (e.g. logging), currently unused.

issues := make([]string, 0)
storageFull := false
Comment on lines +30 to +34
bz := store.Get(types.LastDistributionHeightKey)
if bz == nil {
return 0
}
return int64(binary.BigEndian.Uint64(bz))
Comment on lines +57 to +61
}
var coins sdk.Coins
if err := json.Unmarshal(bz, &coins); err != nil {
return sdk.Coins{}
}
Comment on lines +624 to +628
everlightCoin := sdk.NewCoin(fee.Denom, everlightAmount)
err := k.bankKeeper.SendCoinsFromModuleToModule(ctx, actiontypes.ModuleName, "everlight", sdk.NewCoins(everlightCoin))
if err != nil {
return errors.Wrapf(sdkerrors.ErrInsufficientFunds, "failed to send everlight fee share: %s", err)
}
Comment on lines +26 to +28
func SNDistStateKey(valAddr string) []byte {
return append(SNDistStatePrefix, []byte(valAddr)...)
}
Copy link

Choose a reason for hiding this comment

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

append(SNDistStatePrefix, ...) on a package-level var slice is a known footgun in Go. If the backing array ever has spare capacity (e.g. after a future refactor changes the prefix length or initialization), append will mutate the shared slice rather than allocating a new one, silently corrupting other keys that share the prefix. The safe pattern is to allocate explicitly:

Suggested change
func SNDistStateKey(valAddr string) []byte {
return append(SNDistStatePrefix, []byte(valAddr)...)
}
func SNDistStateKey(valAddr string) []byte {
key := make([]byte, len(SNDistStatePrefix)+len(valAddr))
copy(key, SNDistStatePrefix)
copy(key[len(SNDistStatePrefix):], valAddr)
return key
}

Fix it with Roo Code or mention @roomote and request a fix.

- Replaced float-based weight calculations with sdkmath.Dec for higher precision.
- Added validation for invalid float values in weight and Kademlia DB metrics.
- Enhanced error logging in state decoding functions.
- New tests for invalid encodings and compliance validation edge cases.
- Introduced new STORAGE_FULL-related handlers and test scenarios.
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR introduces Everlight (a new on-chain distribution module) and extends Supernode reporting/state to support Everlight payouts based on reported Cascade Kademlia DB usage, including a new STORAGE_FULL supernode state and associated events.

Changes:

  • Add SUPERNODE_STATE_STORAGE_FULL, new storage-related supernode events, and update supernode selection/compliance logic to treat storage-capacity violations separately from other compliance issues.
  • Add cascade_kademlia_db_bytes to SupernodeMetrics and a cascade_kademlia_db_max_bytes parameter to drive STORAGE_FULL transitions.
  • Introduce the x/everlight module (params, queries, begin/end blockers, distribution logic), wire it into the app + upgrade handler, and integrate Action fee routing into Everlight.

Reviewed changes

Copilot reviewed 61 out of 64 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
x/supernode/v1/types/supernode_state.pb.go Generated update for new STORAGE_FULL enum value.
x/supernode/v1/types/metrics.pb.go Generated update adding cascade_kademlia_db_bytes to metrics.
x/supernode/v1/types/events.go Add supernode storage-related event types.
x/supernode/v1/keeper/query_get_top_super_nodes_for_block.go Allow filtering by STORAGE_FULL; exclude STORAGE_FULL from default selection.
x/supernode/v1/keeper/query_get_top_super_nodes_for_block_test.go Tests for default exclusion / explicit inclusion of STORAGE_FULL.
x/supernode/v1/keeper/msg_server_report_supernode_metrics.go Compliance bifurcation + state transition logic for STORAGE_FULL vs POSTPONED.
x/supernode/v1/keeper/msg_server_report_supernode_metrics_test.go Test for POSTPONED→STORAGE_FULL transition + event emission.
x/supernode/v1/keeper/metrics_validation.go Introduce ComplianceResult, cascade DB capacity check, and lastNonDegradedState.
x/supernode/v1/keeper/metrics_validation_test.go Update existing tests and add coverage for new storage capacity validation paths.
x/supernode/v1/keeper/metrics_state.go Add helpers to mark/recover STORAGE_FULL and emit storage events.
x/supernode/v1/keeper/metrics_staleness.go Extend staleness checks to include STORAGE_FULL nodes.
x/everlight/v1/types/tx.pb.go Generated Msg service/types for Everlight params updates.
x/everlight/v1/types/query.pb.gw.go Generated grpc-gateway handlers for Everlight queries.
x/everlight/v1/types/params.go Default params + params validation.
x/everlight/v1/types/keys.go Store keys/prefixes and helper key builders.
x/everlight/v1/types/keys_test.go Test ensuring SNDistStateKey does not mutate prefix bytes.
x/everlight/v1/types/genesis.pb.go Generated genesis state types for Everlight.
x/everlight/v1/types/genesis.go Default genesis + genesis validation.
x/everlight/v1/types/expected_keepers.go Define expected keeper interfaces for Everlight’s dependencies.
x/everlight/v1/types/events.go Event/attribute keys for distribution events.
x/everlight/v1/types/errors.go Everlight error definitions.
x/everlight/v1/types/codec.go Interface registrations for Everlight msgs.
x/everlight/v1/module/module.pb.go Generated module config proto.
x/everlight/v1/module/module.go Module wiring (genesis, services, begin/end blockers).
x/everlight/v1/module/depinject.go Depinject wiring for keeper/module construction.
x/everlight/v1/keeper/state.go Everlight persistent state helpers + EMA/growth cap/ramp functions.
x/everlight/v1/keeper/query_server.go Everlight query server (params/pool state/eligibility).
x/everlight/v1/keeper/params.go Param storage getters/setters.
x/everlight/v1/keeper/msg_server.go Msg server for params updates with authority check.
x/everlight/v1/keeper/msg_server_test.go Unit tests for MsgUpdateParams validation and persistence.
x/everlight/v1/keeper/module_account_test.go Tests around module account address + transfer behaviors.
x/everlight/v1/keeper/keeper.go Everlight keeper definition + constructor/authority validation.
x/everlight/v1/keeper/genesis.go Init/export genesis for Everlight.
x/everlight/v1/keeper/fee_routing_test.go Tests for reward share bps and begin blocker fee routing behavior.
x/everlight/v1/keeper/distribution.go Core proportional pool distribution logic with smoothing/caps/ramp-up.
x/everlight/v1/keeper/distribution_test.go Extensive unit tests for distribution, smoothing, caps, thresholds, and state persistence.
x/everlight/v1/keeper/abci.go BeginBlocker fee skimming + EndBlocker period-triggered distribution.
x/action/v1/types/expected_keepers.go Extend BankKeeper and add EverlightKeeper interface for fee routing.
x/action/v1/module/depinject.go Optionally inject Everlight keeper into Action module.
x/action/v1/keeper/keeper.go Store injected Everlight keeper and expose getter.
x/action/v1/keeper/action.go Route a share of registration fees to Everlight during fee distribution.
testutil/keeper/action.go Update ActionBankKeeper test helper with module-to-module transfers.
tests/integration/everlight/everlight_integration_test.go Full-app integration tests for Everlight params, genesis, routing, and distribution.
proto/lumera/supernode/v1/supernode_state.proto Add SUPERNODE_STATE_STORAGE_FULL.
proto/lumera/supernode/v1/params.proto Add cascade_kademlia_db_max_bytes param.
proto/lumera/supernode/v1/metrics.proto Add cascade_kademlia_db_bytes metric.
proto/lumera/everlight/v1/tx.proto New Everlight Msg service proto.
proto/lumera/everlight/v1/query.proto New Everlight Query service proto.
proto/lumera/everlight/v1/params.proto New Everlight params proto.
proto/lumera/everlight/v1/genesis.proto New Everlight genesis proto.
proto/lumera/everlight/module/v1/module.proto New Everlight module config proto.
buf.lock Update buf deps lockfile.
app/upgrades/v1_15_0/upgrade.go New upgrade handler for adding Everlight store + migrations.
app/upgrades/v1_15_0/upgrade_test.go Unit tests for v1.15.0 upgrade metadata/store upgrades.
app/upgrades/v1_15_0/store.go Define store upgrades for v1.15.0 (add Everlight store).
app/upgrades/upgrades.go Register new v1.15.0 upgrade.
app/upgrades/upgrades_test.go Extend upgrade registry tests for v1.15.0.
app/app.go Add EverlightKeeper to app struct/wiring.
app/app_config.go Register Everlight module + module account perms + begin/end blocker ordering.
.gitignore Ignore additional local agent/plan artifacts.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +620 to +626
everlightBps := k.everlightKeeper.GetRegistrationFeeShareBps(ctx)
if everlightBps > 0 && fee.Amount.GT(math.ZeroInt()) {
everlightAmount := fee.Amount.MulRaw(int64(everlightBps)).QuoRaw(10000)
if everlightAmount.IsPositive() {
everlightCoin := sdk.NewCoin(fee.Denom, everlightAmount)
err := k.bankKeeper.SendCoinsFromModuleToModule(ctx, actiontypes.ModuleName, "everlight", sdk.NewCoins(everlightCoin))
if err != nil {
Comment on lines +618 to +632
// Route Everlight share if configured
if k.everlightKeeper != nil {
everlightBps := k.everlightKeeper.GetRegistrationFeeShareBps(ctx)
if everlightBps > 0 && fee.Amount.GT(math.ZeroInt()) {
everlightAmount := fee.Amount.MulRaw(int64(everlightBps)).QuoRaw(10000)
if everlightAmount.IsPositive() {
everlightCoin := sdk.NewCoin(fee.Denom, everlightAmount)
err := k.bankKeeper.SendCoinsFromModuleToModule(ctx, actiontypes.ModuleName, "everlight", sdk.NewCoins(everlightCoin))
if err != nil {
return errors.Wrap(err, "failed to send everlight fee share")
}
fee.Amount = fee.Amount.Sub(everlightAmount)
}
}
}
Comment on lines +44 to +52
func (q queryServer) SNEligibility(goCtx context.Context, req *types.QuerySNEligibilityRequest) (*types.QuerySNEligibilityResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)

if req.ValidatorAddress == "" {
return &types.QuerySNEligibilityResponse{
Eligible: false,
Reason: "validator_address is required",
}, nil
}
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.

2 participants