Conversation
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>
Re-reviewed after b82492e. All 3 previously flagged issues are now resolved. No new issues found.
Mention @roomote in a comment to request specific changes to this pull request or fix all unresolved issues. |
| if superNodeStateFilter == types.SuperNodeStateUnspecified && | ||
| (stateAtBlock == types.SuperNodeStatePostponed || stateAtBlock == types.SuperNodeStateStorageFull) { | ||
| continue |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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_FULLplus related events, compliance evaluation, and state transitions (including query filtering and staleness handling). - Add
cascade_kademlia_db_bytesmetric and acascade_kademlia_db_max_bytescompliance threshold parameter. - Add new
x/everlightmodule (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.
| 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 | ||
| } |
| // 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 | ||
| } |
| 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 |
| bz := store.Get(types.LastDistributionHeightKey) | ||
| if bz == nil { | ||
| return 0 | ||
| } | ||
| return int64(binary.BigEndian.Uint64(bz)) |
| } | ||
| var coins sdk.Coins | ||
| if err := json.Unmarshal(bz, &coins); err != nil { | ||
| return sdk.Coins{} | ||
| } |
| 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) | ||
| } |
| func SNDistStateKey(valAddr string) []byte { | ||
| return append(SNDistStatePrefix, []byte(valAddr)...) | ||
| } |
There was a problem hiding this comment.
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:
| 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.
There was a problem hiding this comment.
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_bytestoSupernodeMetricsand acascade_kademlia_db_max_bytesparameter to driveSTORAGE_FULLtransitions. - Introduce the
x/everlightmodule (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.
| 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 { |
| // 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) | ||
| } | ||
| } | ||
| } |
| 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 | ||
| } |
Summary
Cascade Everlight Phase 1 chain upgrade (v1.15.0) — adds sustainable SuperNode storage compensation via a new
x/everlightmodule with protocol-native funding streams.STORAGE_FULLenum (=6),cascade_kademlia_db_bytesmetric (field 15),cascade_kademlia_db_max_bytesparam (field 19), fullx/everlightproto definitionsSTORAGE_FULLstate + compliance bifurcation — disk-full SNs stay compute-eligible (Sense/Agents), excluded from Cascade selection onlyx/everlightmodule core — keeper, genesis, params, queries, depinject wiring,Burner-only module accountcascade_kademlia_db_byteswith anti-gaming (EMA smoothing, growth cap, ramp-up)x/action+ block reward share skimmed from fee collector beforex/distributionKey design decisions
AllocateTokensEverlightKeeperdependency in action module (backward compatible)STORAGE_FULLis less restrictive thanPOSTPONED— mixed violations always result inPOSTPONEDTest plan
go test ./x/everlight/v1/... ./x/supernode/v1/keeper/ ./app/upgrades/v1_15_0/ ./app/upgrades/)go test ./tests/integration/everlight/) — full app with real keepersmake buildcleanscripts/run-eval-scenarios.sh)make unit-testsfull suitemake integration-testsfull suite🤖 Generated with Claude Code